diff --git a/bundles/org.eclipse.wst.xsd.ui/.classpath b/bundles/org.eclipse.wst.xsd.ui/.classpath
new file mode 100644
index 0000000..275b34c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/.classpath
@@ -0,0 +1,7 @@
+<?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/bundles/org.eclipse.wst.xsd.ui/.cvsignore b/bundles/org.eclipse.wst.xsd.ui/.cvsignore
new file mode 100644
index 0000000..7ba51e6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/.cvsignore
@@ -0,0 +1,5 @@
+bin
+xsdeditor.jar
+build.xml
+temp.folder
+org.eclipse.wst.xsd.ui_1.0.0.jar
diff --git a/bundles/org.eclipse.wst.xsd.ui/.project b/bundles/org.eclipse.wst.xsd.ui/.project
new file mode 100644
index 0000000..aab3824
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.wst.xsd.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.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/bundles/org.eclipse.wst.xsd.ui/build.properties b/bundles/org.eclipse.wst.xsd.ui/build.properties
new file mode 100644
index 0000000..bb73afb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/build.properties
@@ -0,0 +1,33 @@
+###############################################################################
+# Copyright (c) 2001, 2004 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse 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.xsdeditor.jar = src/
+bin.includes = xsdeditor.jar,\
+               plugin.xml,\
+               icons/,\
+               image/,\
+               doc/,\
+               plugin.properties,\
+               samples/,\
+               w3c/
+src.includes = w3c/,\
+               samples/,\
+               plugin.xml,\
+               plugin.properties,\
+               image/,\
+               icons/,\
+               doc/,\
+               src/,\
+               test/,\
+               build.xml,\
+               build.properties,\
+               .project,\
+               .classpath,\
+               xsdeditor.jar
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/XSDFile.gif b/bundles/org.eclipse.wst.xsd.ui/icons/XSDFile.gif
new file mode 100644
index 0000000..3900f1b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/XSDFile.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/obj16/annotationsheader.gif b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/annotationsheader.gif
new file mode 100644
index 0000000..9bfb682
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/annotationsheader.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/obj16/attributegroupsheader.gif b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/attributegroupsheader.gif
new file mode 100644
index 0000000..e618a25
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/attributegroupsheader.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/obj16/attributesheader.gif b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/attributesheader.gif
new file mode 100644
index 0000000..9254879
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/attributesheader.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/obj16/directivesheader.gif b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/directivesheader.gif
new file mode 100644
index 0000000..6000cb8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/directivesheader.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/obj16/elementsheader.gif b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/elementsheader.gif
new file mode 100644
index 0000000..26f7206
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/elementsheader.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/obj16/groupsheader.gif b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/groupsheader.gif
new file mode 100644
index 0000000..c9745f0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/groupsheader.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/obj16/notationsheader.gif b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/notationsheader.gif
new file mode 100644
index 0000000..e05c645
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/notationsheader.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/obj16/smpl_list_obj.gif b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/smpl_list_obj.gif
new file mode 100644
index 0000000..6e2cd93
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/smpl_list_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/obj16/smpl_restrict_obj.gif b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/smpl_restrict_obj.gif
new file mode 100644
index 0000000..1ebd546
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/smpl_restrict_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/obj16/smpl_union_obj.gif b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/smpl_union_obj.gif
new file mode 100644
index 0000000..0b01f8c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/smpl_union_obj.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/obj16/typesheader.gif b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/typesheader.gif
new file mode 100644
index 0000000..3267542
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/obj16/typesheader.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/ovr16/attributeoverlay.gif b/bundles/org.eclipse.wst.xsd.ui/icons/ovr16/attributeoverlay.gif
new file mode 100644
index 0000000..1931f92
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/ovr16/attributeoverlay.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/icons/ovr16/textoverlay.gif b/bundles/org.eclipse.wst.xsd.ui/icons/ovr16/textoverlay.gif
new file mode 100644
index 0000000..d455c2b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/icons/ovr16/textoverlay.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/plugin.properties b/bundles/org.eclipse.wst.xsd.ui/plugin.properties
new file mode 100644
index 0000000..8bcb7ec
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/plugin.properties
@@ -0,0 +1,1047 @@
+###############################################################################
+# Copyright (c) 2001, 2004 IBM Corporation and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse 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
+###############################################################################
+! Properties file for component: XMSCH - XML Tools -  XML Schema Editor
+! Packaged for translation in:  xml.zip
+
+!
+! Plugin
+!
+_UI_PLUGIN_NAME             = XML Schema Editor
+_UI_EDITOR_NAME             = XML Schema Editor
+
+_UI_ACTION_EXT_GENERATE      = &Generate
+_UI_ACTION_EXT_GENERATE_DDL  = &DDL...
+_UI_ACTION_EXT_GENERATE_DTD  = D&TD...
+_UI_ACTION_EXT_GENERATE_JAVA = &Java Beans...
+
+_UI_ACTION_EXT_GENERATE_XSD = &Generate XML Schema
+_UI_WIZARD_NAME_NEW_XSD     = XML Schema
+
+_UI_XML_TOOLS_PREFERENCE_PAGE  = XML
+_UI_XML_SCHEMA_PREFERENCE      = XML Schema Files
+
+_UI_WIZARD_NEW_XSD             = XML Schema
+_UI_CREATE_A_NEW_SCHEMA        = Create a new XML schema file
+
+! New property tabs
+_UI_LABEL_GENERAL       = General
+_UI_LABEL_OTHER         = Other
+_UI_LABEL_ATTRIBUTES    = Attributes
+_UI_LABEL_DOCUMENTATION = Documentation
+_UI_LABEL_FACETS        = Facets
+_UI_LABEL_ENUMERATIONS  = Enumerations
+_UI_LABEL_NAMESPACE     = Namespace
+
+_UI_LABEL_READ_ONLY     = read-only
+_UI_LABEL_KIND          = Kind:
+_UI_LABEL_VARIETY       = Variety:
+
+!
+! Schema File Window
+!
+_UI_LABEL_FILE_NAME              = File name:
+_UI_LABEL_VERSION                = Version:
+_UI_TOOLTIP_VERSION              = Convenient attribute to store version number
+_UI_LABEL_LANGUAGE               = Language:
+_UI_TOOLTIP_LANGUAGE             = Represents natural language identifiers
+_UI_GROUP_NAMESPACE              = Namespace
+_UI_LABEL_SCHEMA_PREFIX          = Prefix:
+_UI_TOOLTIP_SCHEMA_PREFIX        = The prefix associated with the current namespace.
+_UI_LABEL_TARGET_NAME_SPACE      = Target namespace:
+_UI_TOOLTIP_TARGET_NAME_SPACE    = The namespace for this schema.
+_UI_BUTTON_APPLY                 = Apply
+_UI_LABEL_ATTRIBUTE_FORM_DEFAULT = Attribute form default:
+_UI_TOOLTIP_ATTRIBUTE_FORM       = Indicates if all attributes in a schema must be qualified or not in the instance document
+_UI_LABEL_ELEMENT_FORM_DEFAULT   = Element form default:
+_UI_TOOLTIP_ELEMENT_FORM_DEFAULT = Indicates if all elements in a schema must be qualified or not in the instance document
+_UI_LABEL_BLOCK_DEFAULT          = Block default:
+_UI_TOOLTIP_BLOCK_DEFAULT        = Control derivations for every type and element in the schema
+_UI_LABEL_FINAL_DEFAULT          = Final default:
+_UI_TOOLTIP_FINAL_DEFAULT        = Control derivations for every type and element in the schema
+_UI_ACTION_DELETE_INCLUDE        = Delete
+_UI_ACTION_DELETE_NODES          = Delete Nodes
+! Note to translators: The following is the acronym for Uniform Resource Indicator
+_UI_LABEL_URI                    = URI:
+
+
+_UI_LABEL_ADD              = Add...
+_UI_LABEL_EDIT             = Edit...
+_UI_LABEL_PATTERNS         = Patterns
+_ERROR_FILE_ALREADY_EXISTS = The file name already exists: {0}
+
+!
+! Any Section
+!
+! Note to translators - translate only the word and
+_UI_LABEL_NAMESPACE_AND_PROCESS_CONTENTS = namespace and processContents
+
+!
+! minOccurs and maxOccurs section
+!
+! Note to translators - translate only the word and
+_UI_LABEL_MINOCCURS_AND_MAXOCCURS = minOccurs and maxOccurs
+
+!
+! Value Information Section
+!
+_UI_LABEL_VALUE_INFORMATION   = Value Information
+
+!
+! Notation window
+!
+_UI_NOTATION_NAME                = Name:
+_UI_NOTATION_PUBLIC              = Public:
+_UI_NOTATION_SYSTEM              = System:
+_UI_TOOLTIP_PUBLIC               = An optional public identifier
+_UI_TOOLTIP_SYSTEM               = An optional URI reference
+
+!
+! Complex Type Window
+!
+_UI_NAME                         = Name:
+_UI_ABSTRACT                     = Abstract:
+_UI_MIXED                        = Mixed:
+_UI_BLOCK                        = Block:
+_UI_FINAL                        = Final:
+
+_UI_CT_TOOLTIP_MIXED             = Indicates if type may contain mixed content
+_UI_CT_TOOLTIP_ABSTRACT          = When a complex type is declared abstract, it cannot be used in an instance document
+_UI_CT_TOOLTIP_FINAL             = You can use this to prevent further derivations
+_UI_CT_TOOLTIP_BLOCK             = You can use this to block any derivations
+
+!
+! SimpleContent and ComplexContent Window
+! 
+_UI_LABEL_DERIVED_BY            = Derived by:
+_UI_TOOLTIP_DERIVED_BY          = Derive by extension to inherit from a base type content model and add to it. Derive by restriction to restrict the content model of an existing type.
+
+!
+! Combo box items - no need to translate
+!
+_UI_COMBO_RESTRICTION           = restriction
+_UI_COMBO_EXTENSION             = extension
+
+!
+! Element & Element Ref Window
+!
+_UI_ELEMENT_NAME                 = Name:
+_UI_CHECKBOX_NILLABLE            = Nillable
+_UI_CHECKBOX_ABSTRACT            = Abstract
+_UI_SUBSTITUTION                 = Substitution group:
+_UI_MINIMUM                      = Minimum:
+_UI_MAXIMUM                      = Maximum:
+_UI_REFERENCE_NAME               = Reference name:
+
+_UI_TOOLTIP_ELEMENT_MINIMUM      = A non-negative integer that specifies the minimum number of times an element can occur.
+_UI_TOOLTIP_ELEMENT_MAXIMUM      = A non-negative integer or unbounded if there is no upper limit on the number of times the element can occur.
+_UI_TOOLTIP_ELEMENT_ABSTRACT     = When an element is declared abstract, a member of its equivalent class must appear in the instance document,
+_UI_TOOLTIP_ELEMENT_NIL          = If selected, an attribute can be included in the instance document to indicate that the element has a nil value.
+_UI_TOOLTIP_ELEMENT_SUBSTITUTION = Select the element that can be substituted by this element
+_UI_TOOLTIP_ELEMENT_FORM         = Indicates if the element is qualifed in the instance document
+_UI_TOOLTIP_ELEMENT_VALUE        = Provides a default or fixed value for the element.
+
+
+!
+! Attribute Window
+!    _UI_COMBO_BOX strings are used in code generation. 
+!    Probably don't need to be translated
+!
+_UI_COMBO_BOX_REQUIRED           = required
+_UI_COMBO_BOX_OPTIONAL           = optional
+_UI_COMBO_BOX_PROHIBITED         = prohibited
+
+_UI_FIXED                        = Fixed
+_UI_DEFAULT                      = Default
+_UI_ATTRIBUTE_NAME               = Attribute name:
+_UI_USAGE                        = Usage:
+_UI_FORM                         = Form qualification:
+_UI_VALUE                        = Value
+
+_UI_LABEL_OTHER_ATTRIBUTES       = Other Attributes
+
+_UI_TOOLTIP_ATTRIBUTE_USE        = Indicates if the attribute is required, optional, or prohibited
+_UI_TOOLTIP_ATTRIBUTE_FORM       = Indicates if the attribute is qualifed or not in the instance document
+_UI_TOOLTIP_ATTRIBUTE_VALUE      = Provides default or fixed value for the attribute. Default value only valid if Usage value is set to optional.
+
+_UI_PROCESS_CONTENTS             = Process contents:
+
+!
+! Annotation - Doc & AppInfo Window
+!
+_UI_COMMENT                      = Comment
+_UI_TOOLTIP_COMMENT              = Information useful to the user or application
+_UI_SOURCE                       = Source:
+_UI_TOOLTIP_SOURCE               = An optional URI reference to supplement the local information
+_UI_LANGUAGE                     = Language:
+_UI_TOOLTIP_LANGUAGE_ANNOTATION  = Indicate the language in which the annotation is expressed
+
+!
+! Group
+! 
+_UI_CONTENT_MODEL               = Content model
+_UI_SEQUENCE                    = Sequence
+_UI_CHOICE                      = Choice
+_UI_ALL                         = All
+
+
+!
+! Simple Type Related Facets  - appear as entries in a table - restriction on simple type
+!
+_UI_GROUP_FACETS                = Facets
+_UI_LENGTH                      = Length
+_UI_MINIMUM_LENGTH              = Minimum Length
+_UI_MAXIMUM_LENGTH              = Maximum Length
+_UI_MINIMUM_INCLUSIVE           = Minimum Inclusive
+_UI_MAXIMUM_INCLUSIVE           = Maximum Inclusive
+_UI_MINIMUM_EXCLUSIVE           = Minimum Exclusive
+_UI_MAXIMUM_EXCLUSIVE           = Maximum Exclusive
+_UI_TOTAL_DIGITS                = Total Digits
+_UI_FRACTION_DIGITS             = Fraction Digits
+_UI_WHITE_SPACE                 = White Space
+_UI_FACET_NAME                  = Name
+_UI_FACET_VALUE                 = Value
+_UI_FACET_FIXED                 = Fixed
+
+_UI_TOOLTIP_LENGTH              = The number of units of length. Must be a non-negative integer.
+_UI_TOOLTIP_MIN_LEN             = The minimum number of units of length. Must be a non-negative integer.
+_UI_TOOLTIP_MAX_LEN             = The maximum number of units of length. Must be a non-negative integer.
+_UI_TOOLTIP_MAX_INCLUSIVE       = The upper bound of the value space. The value is itself included.
+_UI_TOOLTIP_MAX_EXCLUSIVE       = The upper bound of the value space. The value is itself excluded.
+_UI_TOOLTIP_MIN_INCLUSIVE       = The lower bound of the value space. The value is itself included.
+_UI_TOOLTIP_MIN_EXCLUSIVE       = The lower bound of the value space. The value is itself excluded.
+_UI_TOOLTIP_TOTAL_DIGITS        = The maximum number of decimal digits. Must be a positive integer.
+_UI_TOOLTIP_FRACTION_DIGITS     = The maximum number of decimal digits in the fractional part. Must be a non-negative integer.
+_UI_TOOLTIP_WHITE_SPACE         = Indicates if white space should be preserved, replaced or collapsed. 
+
+_UI_TOOLTIP_PATTERN             = Constrains the value to match a specific pattern. The pattern must be a regular expression. 
+_UI_TOOLTIP_ENUM                = Constrains the value to a specified set of values. 
+
+!
+! Simple/Complex Type Selection 
+!
+_UI_LABEL_TYPE_INFORMATION          = Type information
+_UI_LABEL_BASE_TYPE                 = Base type
+_UI_LABEL_BASE_TYPE_WITH_COLON      = Base type:
+_UI_LABEL_SET_BASE_TYPE             = Set Base Type
+_UI_ACTION_SET_BASE_TYPE            = Set Base Type...
+_UI_RADIO_NONE                      = None
+_UI_RADIO_BUILT_IN_SIMPLE_TYPE      = Built-in simple type
+_UI_RADIO_USER_DEFINED_SIMPLE_TYPE  = User-defined simple type
+_UI_RADIO_USER_DEFINED_COMPLEX_TYPE = User-defined complex type
+_UI_NO_TYPE                         = **none**
+
+!
+! Combo-box value 
+! NOTE TO TRANSLATOR: Do not translate following line
+_UI_DEFAULT_ANONYMOUS               = **anonymous**
+
+!
+! Unique, Key and KeyRef window
+!
+_UI_REFERENCE_KEY                   = Reference key
+_UI_SELECTOR                        = Selector
+_UI_FIELDS                          = Fields
+
+_UI_TOOLTIP_SELECTOR_TEXT           = Specifies an XPath expression relative to instances of the current element
+_UI_TOOLTIP_FIELD_TEXT              = Specifies an XPath expression relative to each element selected by the selector
+
+_UI_ADD_BUTTON                      = Add>>
+_UI_REMOVE_BUTTON                   = <<Remove
+
+!
+! Include & Imports
+!
+_UI_LABEL_PREFIX                = Prefix:
+_UI_LABEL_NAMESPACE             = Namespace:
+
+_UI_SCHEMA_INCLUDE_DESC         = Select a schema file so that the definitions in the schema file will be available in the current schema. The target namespace of the included schema must be the same as the target namespace of the current schema.
+_UI_LABEL_SCHEMA_IMPORT_DESC    = Select a schema file from a different namespace so that its definitions can be referenced by the current schema. You must associate a prefix with the new namespace for use in the current schema.
+
+_UI_LABEL_SCHEMA_LOCATION        = Schema location:
+_UI_BUTTON_SELECT                = Select
+_UI_FILEDIALOG_SELECT_XML_SCHEMA = Select XML schema file
+_UI_FILEDIALOG_SELECT_XML_DESC   = Select an XML schema file from the Workbench projects
+_UI_FILEDIALOG_SELECT_XML_URL    = Select an XML schema file from HTTP
+
+_UI_LABEL_LOADING_XML_SCHEMA     = Loading XML Schema
+_UI_LABEL_FINISH_LOADING         = Finish Loading
+_UI_LABEL_NO_LOCATION_SPECIFIED  = No Location Specified
+
+!
+! XSD Editor
+!
+_UI_TAB_SOURCE                  = Source
+_UI_TAB_DESIGN                  = Design
+!  Note to translators: Graph is the graphic view of the XML schema
+_UI_TAB_GRAPH                   = Graph
+_UI_MENU_UNDO                   = &Undo @Ctrl+Z
+_UI_MENU_REDO                   = &Redo @Ctrl+Y
+
+!
+! Task List Related Message
+!
+_UI_REF_FILE_ERROR_DESCRIPTION      = The errors below were detected when validating the file '{0}' via the file '{1}'.  In most cases these errors can be detected by validating '{2}' directly.  However it is possible that errors will only occur when {2} is validated in the context of {3}.
+_UI_REF_FILE_ERROR_PUSH_HELP        = Push the help button below to read more.
+_UI_REF_FILE_ERROR_MESSAGE          = Referenced file contains errors ({0}).  For more information, right click on the message and select "Show Details..."
+_UI_REF_FILE_SHOW_DETAILS           = Show Details...
+
+
+!
+! XSDEditor Menu bar contributor
+!
+_UI_MENU_GENERATE_JAVA              = Generate &Java Beans...
+_UI_MENU_GENERATE_DTD               = Generate &DTD...
+_UI_MENU_GENERATE_SAMPLE_XML        = Generate XM&L...
+_UI_MENU_XSD_EDITOR                 = &XSD
+_UI_MENU_VALIDATE_XML               = &Validate XML Schema
+_UI_MENU_VALIDATE_XML_TOOLTIP       = Validate the current state of the XML Schema
+_UI_MENU_GENERATE_JAVA_TOOLTIP      = Generate Java beans for the XML Schema
+_UI_MENU_GENERATE_DTD_TOOLTIP       = Generate a DTD from the XML Schema
+_UI_MENU_GENERATE_SAMPLE_XML_TOOLTIP = Generate an XML from the XML Schema
+_UI_MENU_RELOAD_DEPENDENCIES_TOOLTIP = Reload Dependencies
+_UI_MENU_RELOAD_DEPENDENCIES = &Reload Dependencies
+
+!
+! Preference Page
+!
+_UI_TEXT_INDENT_LABEL                 = Indentation
+_UI_TEXT_INDENT_SPACES_LABEL          = &Number of spaces: 
+_UI_TEXT_XSD_NAMESPACE_PREFIX         = XML schema language
+_UI_TEXT_XSD_DEFAULT_PREFIX           = XML schema language constructs &prefix:
+_UI_QUALIFY_XSD                       = &Qualify XML schema language constructs
+_UI_SEPARATE_DESIGN_AND_SOURCE_VIEW   = Separate Source, Design and Graph view
+_UI_COMBINED_DESIGN_AND_SOURCE_VIEW   = Combined Source or Graph view with Design view 
+_UI_LABEL_EDITOR_LAYOUT               = Editor Layout
+_UI_PREF_DESIGN_VIEW_LAYOUT           = Design View Location
+_UI_PREF_DESIGN_BOTTOM                = Below
+_UI_PREF_DESIGN_RIGHT                 = Right
+_UI_TEXT_XSD_DEFAULT_TARGET_NAMESPACE = Default Target Namespace:
+
+!
+! Content Outline View action
+! NOTE TO TRANSLATOR: Do not translate the word(s) following "Add" on each line in
+!   this section i.e. Annotation, Documentation, AppInfo  These words are XML Schema keywords.
+_UI_ACTION_DELETE                  = D&elete
+_UI_ACTION_ADD_ANNOTATION          = Add &Annotation
+_UI_ACTION_ADD_DOC                 = Add &Documentation
+_UI_ACTION_ADD_APP_INFO            = Add A&ppInfo
+_UI_ACTION_ADD_GLOBAL_ELEMENT      = Add Glob&al Element
+_UI_ACTION_ADD_KEY                 = Add &Key
+_UI_ACTION_ADD_KEY_REF             = Add Key Re&f
+_UI_ACTION_ADD_UNIQUE              = Add Uni&que
+_UI_ACTION_ADD_GROUP               = Add G&roup
+_UI_ADD_GROUP_REF                  = Add Gr&oup Ref
+_UI_ACTION_ADD_CONTENT_MODEL       = Add Content &Model
+_UI_ACTION_ADD_ELEMENT             = Add &Element
+_UI_ACTION_ADD_ELEMENT_REF         = Add E&lement Ref
+_UI_ACTION_ADD_SIMPLE_TYPE         = Add &Simple Type
+_UI_ACTION_ADD_PATTERN             = Add &Pattern
+_UI_ACTION_ADD_ENUM                = Add En&umeration
+_UI_ACTION_ADD_ENUMS               = Add Enu&merations...
+_UI_ACTION_ADD_COMPLEX_TYPE        = Add Complex &Type
+_UI_ACTION_ADD_COMPLEX_CONTENT     = Add Comple&x Content
+_UI_ACTION_ADD_SIMPLE_CONTENT      = Add Simple &Content
+_UI_ACTION_ADD_ATTRIBUTE           = Add Attri&bute
+_UI_ACTION_ADD_ATTRIBUTE_GROUP     = Add Attr&ibute Group
+_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF = Add A&ttribute Group Ref
+_UI_ACTION_ADD_INCLUDE             = Add In&clude
+_UI_ACTION_ADD_IMPORT              = Add &Import
+_UI_ACTION_ADD_REDEFINE            = Add Re&define
+_UI_ACTION_ADD_NOTATION            = Add &Notation
+_UI_ACTION_ADD_ANY_ELEMENT         = Add An&y
+_UI_ACTION_ADD_ANY_ATTRIBUTE       = Add &Any Attribute
+_UI_ACTION_ADD_GLOBAL_ATTRIBUTE    = Add &Global Attribute
+_UI_ACTION_ADD_ATTRIBUTE_REFERENCE = Add Attrib&ute Ref
+_UI_ACTION_ADD_RESTRICTION         = Add Re&striction
+_UI_ACTION_ADD_UNION               = Add U&nion
+_UI_ACTION_ADD_LIST                = Add &List
+_UI_ACTION_DELETE_GROUP_SCOPE      = D&elete
+_UI_ACTION_ADD_CHOICE              = Add &Choice
+_UI_ACTION_ADD_SEQUENCE            = Add Se&quence
+_UI_ACTION_ADD_ALL                 = Add &All
+_UI_ACTION_ADD_EXTENSION           = Add E&xtension
+_UI_ACTION_ADD_SELECTOR            = Add &Selector
+_UI_ACTION_ADD_FIELD               = Add &Field
+! NOTE TO TRANSLATOR: Translate Add and Node
+_UI_ACTION_ADD_SCHEMA_NODE         = Add &Schema Node
+! NOTE TO TRANSLATOR: TRANSLATE Add and Local
+_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE   = Add Local &Simple Type
+_UI_ACTION_ADD_LOCAL_COMPLEX_TYPE  = Add Local &Complex Type
+_UI_ACTION_BACK_TO_SCHEMA_VIEW     = Back To Schema
+_UI_HOVER_BACK_TO_SCHEMA_VIEW     = Back to schema
+
+_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL = Make Anonymous Type Global
+_UI_ACTION_OPEN_SCHEMA                = Open Schema
+
+_UI_ACTION_INSERT_BEFORE           = Insert Before
+_UI_ACTION_INSERT_AFTER            = Insert After
+
+_UI_OUTLINE_SORT                   = Sort alphabetically
+_UI_OUTLINE_DO_NOT_SORT            = Do not sort alphabetically
+
+_UI_OUTLINE_SHOW_COMPLEX_TYPE      = Show Complex Types Only
+_UI_OUTLINE_SHOW_SIMPLE_TYPE       = Show Simple Types Only
+_UI_OUTLINE_SHOW_ATTRIBUTE_GROUP   = Show Attribute Groups Only
+_UI_OUTLINE_SHOW_GROUP             = Show Groups Only
+_UI_OUTLINE_SHOW_GLOBAL_ELEMENT    = Show Global Elements Only
+_UI_OUTLINE_SHOW_REFERENCES        = Show Reference Content
+_UI_OUTLINE_SHOW_INHERITED         = Show Inherited Content
+
+!
+! New XML Schema Wizard
+!
+_UI_WIZARD_CREATE_XSD_MODEL_TITLE    = Create XML Schema
+
+! NOTE TO TRANSLATOR: Do not translate following line
+_UI_CREATEXSD                        = createXSD
+_UI_NEW_XML_SCHEMA_TITLE             = New XML Schema
+_UI_CREATE_A_NEW_XML_SCHEMA_DESC     = Create a new XML schema.
+
+! NOTE TO TRANSLATOR: Do not translate following line
+_UI_NEW_XML_SCHEMA_FILENAME          = NewXMLSchema.xsd
+
+!
+! XSD From RDB Schema Wizard
+!
+_UI_WIZARD_CREATE_XSD_FROM_RDB_TITLE = Create XSD from RDB Table
+
+
+!
+! Regular Expression Wizard
+!
+_UI_REGEX_WIZARD_CREATE_BUTTON = Create Regular Expression...
+_UI_TOOLTIP_REGEX_WIZARD_BUTTON = Launch the Regular Expression Wizard
+_UI_REGEX_WIZARD_TITLE = Regular Expression Wizard
+_UI_REGEX_WIZARD_COMPOSITION_PAGE_TITLE = Compose Regular Expression
+_UI_REGEX_WIZARD_COMPOSITION_PAGE_DESCRIPTION = To add a token, specify its contents and occurrence, then click Add.
+_UI_REGEX_WIZARD_INVALID_REGEX_ERROR_PREFIX = The current regular expression is not valid.  Reason:  
+_UI_REGEX_WIZARD_INVALID_TOKEN_ERROR_PREFIX = The current token is not valid.  Reason:  
+_UI_REGEX_WIZARD_INVALID_REGEX_ERROR = The current regular expression is not valid.
+_UI_REGEX_WIZARD_INVALID_TOKEN_ERROR = The current token is not valid.
+_UI_REGEX_WIZARD_INVALID_MIN_ERROR_SUFFIX = Invalid minimum range value.  The value must be a positive integer less than the maximum value.
+_UI_REGEX_WIZARD_MISSING_MIN_ERROR_SUFFIX = Invalid minimum range value.  A minimum range must be specified if a maximum range is specified.
+_UI_REGEX_WIZARD_INVALID_MAX_ERROR_SUFFIX = Invalid maximum range value.  The value must be a positive integer greater than the minimum value.
+_UI_REGEX_WIZARD_INVALID_REPEAT_ERROR_SUFFIX = Invalid repeat value.  The value must be a positive integer.
+_UI_REGEX_WIZARD_INVALID_SELECTION_ERROR = Nothing is currently selected.  Either make a selection or choose a different token. 
+_UI_REGEX_WIZARD_TOKEN_LABEL = Token contents:
+_UI_REGEX_WIZARD_AUTO_ESCAPE_CHECKBOX_LABEL = Auto escape
+_UI_REGEX_WIZARD_OCCURENCE_LABEL = Occurrence
+! Instructions for translators: The following label is used in a phrase to identify a range of values.
+! For example:  5 to 10.
+! The values are text fields that are initially blank so the user has to enter in values
+! For example:   _______ to ________
+_UI_REGEX_WIZARD_TO_LABEL = to
+_UI_REGEX_WIZARD_ADD_BUTTON_LABEL = Add 
+_UI_REGEX_WIZARD_CURRENT_REGEX_LABEL = Current regular expression:
+_UI_TOOLTIP_REGEX_WIZARD_TERMS = Content of new token
+_UI_TOOLTIP_REGEX_WIZARD_AUTO_ESCAPE_CHECKBOX = Insert escape characters to match metacharacter literals (e.g. converts \"*\" to \"\\*\")
+_UI_TOOLTIP_REGEX_WIZARD_ADD_BUTTON = Add this token to the regular expression
+_UI_TOOLTIP_REGEX_WIZARD_CURRENT_REGEX = The current regular expression
+_UI_TOOLTIP_REGEX_WIZARD_REPEAT = The number of times that the token must occur.
+_UI_TOOLTIP_REGEX_WIZARD_MIN = The minimum number of times that the token can occur.
+_UI_TOOLTIP_REGEX_WIZARD_MAX = The maximum number of times that the token can occur.
+_UI_TOOLTIP_REGEX_WIZARD_CARET_LABEL = The location where the new token will be inserted.
+_UI_REGEX_WIZARD_TESTING_PAGE_TITLE = Test Regular Expression
+_UI_REGEX_WIZARD_TESTING_PAGE_DESCRIPTION = To test the regular expression, enter sample text that you wish to match.  The success of the match will be indicated above.
+_UI_REGEX_WIZARD_REGEX_LABEL = Regular expression: 
+_UI_REGEX_WIZARD_SAMPLE_TEXT =  Sample text: 
+_UI_REGEX_WIZARD_MATCHES = The text matches the regular expression.
+_UI_REGEX_WIZARD_DOES_NOT_MATCH = The text does not match the regular expression.
+_UI_REGEX_WIZARD_TERM_ANY_CHAR = Any character
+_UI_REGEX_WIZARD_TERM_ALPHANUMERIC_CHAR = Alphanumeric character
+_UI_REGEX_WIZARD_TERM_WHITESPACE = Whitespace
+_UI_REGEX_WIZARD_TERM_DIGIT = Digit
+_UI_REGEX_WIZARD_TERM_UPPER = Upper case
+_UI_REGEX_WIZARD_TERM_LOWER = Lower case
+_UI_REGEX_WIZARD_TERM_SELECTION = Current selection
+_UI_REGEX_WIZARD_QUANTIFIER_SINGLE = Just once
+_UI_REGEX_WIZARD_QUANTIFIER_STAR = Zero or more
+_UI_REGEX_WIZARD_QUANTIFIER_PLUS = One or more
+_UI_REGEX_WIZARD_QUANTIFIER_OPTIONAL = Optional
+_UI_REGEX_WIZARD_QUANTIFIER_REPEAT = Repeat
+_UI_REGEX_WIZARD_QUANTIFIER_RANGE = Range
+
+!
+! Select Include File Wizard
+_UI_LABEL_INCLUDE_URL_FILE    = Select schema from:
+_UI_RADIO_URL                 = HTTP
+_UI_RADIO_FILE                = Workbench projects
+_UI_WIZARD_INCLUDE_FILE_TITLE = Include Another Schema
+_UI_WIZARD_INCLUDE_FILE_DESC  = Select another schema from workbench projects or from HTTP.
+_UI_LABEL_URL                 = URL:
+_UI_URL_START_WITH            = The URL must start with http://
+_UI_SPECIFY_URL               = Please specify a URL
+
+!
+! Enumerations Dialog
+_UI_ENUMERATIONS_DIALOG_TITLE = Add Enumerations
+_UI_LABEL_DELIMITER_CHAR      = &Delimiter characters:
+_UI_LABEL_PRESERVE_WHITESPACE = &Preserve leading and trailing whitespace
+
+_UI_ACTION_DELETE_ENUMERATION = Delete Enumeration
+
+!
+! Validate Schema 
+!
+_UI_DIALOG_XML_SCHEMA_INVALID_TITLE  = Validation Failed
+_UI_DIALOG_XML_SCHEMA_VALID_TITLE    = Validation Succeeded
+_UI_DIALOG_XML_SCHEMA_VALID_TEXT     = The XML schema file is valid.
+_UI_DIALOG_XML_SCHEMA_LIMITE_EXCEEDED  = The XML schema file is not valid.  The message limit for the Tasks view has been exceeded.  Please increase the limit and try again.
+
+!
+! Combo-box choices 
+!
+! NOTE TO TRANSLATOR: Do not translate following 10 lines
+_UI_COMBO_QUALIFIED             = qualified
+_UI_COMBO_UNQUALIFIED           = unqualified
+_UI_COMBO_EXTENSION             = extension
+_UI_COMBO_RESTRICTION           = restriction
+_UI_COMBO_ALL                   = all
+_UI_COMBO_TRUE                  = true
+_UI_COMBO_FALSE                 = false
+_UI_COMBO_LAX                   = lax
+_UI_COMBO_SKIP                  = skip
+_UI_COMBO_STRICT                = strict
+
+! Generate DTD - pass as title and description for wizard page
+_UI_GENERATE_DTD_TITLE          = Generate DTD
+_UI_GENERATE_DTD_DESCRIPTION    = Generate a DTD from the selected XML schema file.
+
+! Generate DDL - pass as title and description for wizard page
+_UI_GENERATE_DDL_TITLE          = Generate DDL
+_UI_GENERATE_DDL_DESCRIPTION    = Generate DDL from the selected XML schema file.
+
+_UI_XML_SCHEMA_VALIDATOR            = XML Schema Validator
+
+! Generation from the Schema model - pre-condition check
+_UI_DIALOG_TITLE_GRAMMAR_ERROR      = Invalid Grammar
+_UI_DIALOG_INFO_SCHEMA_INVALID      = The schema file contains errors. Open it in the XML Schema editor and validate it for details.
+_UI_DIALOG_TITLE_NO_GLOBAL_ELEMENTS = No Global Elements
+_UI_DIALOG_INFO_NO_GLOBAL_ELEMENTS  = The selected schema has no global elements. Global elements are required to generate anything from an XML schema.
+
+! Section title for other attributes
+_UI_SECTION_ADVANCED_ATTRIBUTES   = Advanced
+
+! For undo action menus
+! Note to Translators: For the following "Change" phrases,
+! maxOccurs, minOccurs, lang, xpath are keywords so please
+! do no translate them.  These are for the undo action menus.
+! For example, if the user makes a change in the name of an
+! element, then the undo action would be Undo Element Name Change
+_UI_NAMESPACE_CHANGE           = Namespace Change
+_UI_PROCESSCONTENTS_CHANGE     = Process Contents Change
+_UI_MAXOCCURS_CHANGE           = maxOccurs Change
+_UI_MINOCCURS_CHANGE           = minOccurs Change
+_UI_SOURCE_ATTRIBUTE_CHANGE    = Source Change
+_UI_COMMENT_CHANGE             = Comment Change
+_UI_PREFIX_CHANGE              = Prefix Change
+_UI_ATTRIBUTEGROUP_REF_CHANGE  = Attribute Group Reference Change
+_UI_ATTRIBUTEGROUP_NAME_CHANGE = Attribute Group Name Change
+_UI_ATTRIBUTE_FIXED_CHANGE     = Attribute Fixed Change
+_UI_ATTRIBUTE_DEFAULT_CHANGE   = Attribute Default Change
+_UI_ATTRIBUTE_NAME_CHANGE      = Attribute Name Change
+_UI_ATTRIBUTE_VALUE_CHANGE     = Attribute Value Change
+_UI_ATTRIBUTE_USE_CHANGE       = Attribute Use Change
+_UI_ATTRIBUTE_FORM_CHANGE      = Attribute Form Change
+_UI_COMPLEXTYPE_NAME_CHANGE    = Complex Type Name Change
+_UI_COMPLEXTYPE_ABSTRACT_CHANGE = Complex Type Abstract Change
+_UI_COMPLEXTYPE_MIXED_CHANGE   = Complex Type Mixed Change
+_UI_COMPLEXTYPE_BLOCK_CHANGE   = Complex Type Block Change
+_UI_COMPLEXTYPE_FINAL_CHANGE   = Complex Type Final Change
+_UI_DOCUMENTATION_SOURCE_CHANGE = Documentation Source Change
+_UI_DOCUMENTATION_LANG_CHANGE   = Documentation lang Change
+_UI_DOCUMENTATION_COMMENT_CHANGE = Documentation Comment Change
+_UI_ELEMENT_NAME_CHANGE          = Element Name Change
+_UI_ELEMENT_VALUE_CHANGE         = Element Value Change
+_UI_ELEMENT_TYPE_CHANGE          = Element Type Change
+_UI_ENUM_VALUE_CHANGE            = Enum Value Change
+_UI_FIELD_XPATH_CHANGE           = Field xpath Change
+_UI_GROUP_REF_CHANGE             = Group Reference Change
+_UI_GROUP_SCOPE_CHANGE           = Content Model Change
+_UI_GROUP_NAME_CHANGE            = Group Name Change
+_UI_IMPORT_CHANGE                = Import Change
+_UI_KEY_NAME_CHANGE              = Key Name Change
+_UI_KEYREF_NAME_CHANGE           = Key Reference Name Change
+! Note to translators
+! For the following item, Refer is the keyref attribute to refer to some other key
+_UI_KEYREF_REFER_CHANGE          = Key Reference Refer Change
+_UI_NOTATION_NAME_CHANGE         = Notation Name Change
+_UI_NOTATION_PUBLIC_CHANGE       = Notation Public Change
+_UI_NOTATION_SYSTEM_CHANGE       = Notation System Change
+_UI_PATTERN_VALUE_CHANGE         = Pattern Value Change
+_UI_SCHEMA_VERSION_CHANGE        = Schema Version Change
+_UI_SCHEMA_LANG_CHANGE           = Schema lang Change
+_UI_SELECTOR_XPATH_CHANGE        = Selector xpath Change
+_UI_TYPE_CHANGE                  = Type Change
+_UI_DERIVEDBY_CHANGE             = Derivation Change
+_UI_FACET_CHANGE                 = Facet Change
+_UI_SIMPLETYPE_NAME_CHANGE       = SimpleType Name Change
+_UI_UNIQUE_NAME_CHANGE           = Unique Name Change
+_UI_SCHEMA_ATTRIBUTEFORMDEFAULT_CHANGE = Attribute Form Default Change
+_UI_SCHEMA_ELEMENTFORMDEFAULT_CHANGE = Element Form Default Change
+_UI_SCHEMA_BLOCKDEFAULT_CHANGE   = Block Default Change
+_UI_SCHEMA_FINALDEFAULT_CHANGE   = Final Default Change
+_UI_ELEMENT_SUBSTITUTIONGROUP_CHANGE = Substitution Group Change
+_UI_ELEMENT_FORM_CHANGE          = Form Change
+_UI_ELEMENT_BLOCK_CHANGE         = Block Change
+_UI_ELEMENT_FINAL_CHANGE         = Final Change
+_UI_ELEMENT_ABSTRACT_CHANGE      = Abstract Change
+_UI_ELEMENT_NILLABLE_CHANGE      = Nillable Change
+_UI_TARGETNAMESPACE_CHANGE       = Target Namespace Change
+
+! Window Headings for Flat View
+_UI_PAGE_HEADING_ANYATTRIBUTE = Any Attribute
+_UI_PAGE_HEADING_ANYELEMENT   = Any Element
+_UI_PAGE_HEADING_APPINFO            = AppInfo
+_UI_PAGE_HEADING_ATTRIBUTEGROUP_REF = Attribute Group Reference
+_UI_PAGE_HEADING_ATTRIBUTEGROUP     = Attribute Group
+_UI_PAGE_HEADING_ATTRIBUTE_REF      = Attribute Reference
+_UI_PAGE_HEADING_ATTRIBUTE          = Attribute
+_UI_PAGE_HEADING_COMPLEXTYPE        = Complex Type
+_UI_PAGE_HEADING_DOCUMENTATION      = Documentation
+_UI_PAGE_HEADING_ELEMENT     = Element
+_UI_PAGE_HEADING_ELEMENT_REF = Element Reference
+_UI_PAGE_HEADING_ENUM        = Enumeration
+_UI_PAGE_HEADING_FIELD       = Field
+_UI_PAGE_HEADING_GROUP_REF   = Group Reference
+_UI_PAGE_HEADING_CONTENTMODEL  = Content Model
+_UI_PAGE_HEADING_GROUP         = Group
+_UI_PAGE_HEADING_IMPORT        = Import
+_UI_PAGE_HEADING_INCLUDE       = Include
+_UI_PAGE_HEADING_KEYREF        = Key Reference
+_UI_PAGE_HEADING_KEY           = Key
+_UI_PAGE_HEADING_NOTATION      = Notation
+_UI_PAGE_HEADING_PATTERN       = Pattern
+_UI_PAGE_HEADING_REDEFINE      = Redefine
+_UI_PAGE_HEADING_SCHEMA        = Schema
+_UI_PAGE_HEADING_SELECTOR      = Selector
+_UI_PAGE_HEADING_LIST          = List
+_UI_PAGE_HEADING_UNION         = Union
+_UI_PAGE_HEADING_SIMPLECONTENT = Simple Content
+_UI_PAGE_HEADING_COMPLEXCONTENT = Complex Content
+_UI_PAGE_HEADING_RESTRICTION   = Restriction
+_UI_PAGE_HEADING_EXTENSION     = Extension
+_UI_PAGE_HEADING_SIMPLETYPE    = Simple Type
+_UI_PAGE_HEADING_UNIQUE        = Unique
+_UI_PAGE_HEADING_REFERENCE     = reference
+
+!
+! Graph page
+!
+_UI_GRAPH_SIMPLE_TYPES         = Simple Types
+_UI_GRAPH_COMPLEX_TYPES        = Complex Types
+_UI_GRAPH_GROUPS               = Groups
+_UI_GRAPH_GLOBAL_ATTRIBUTES    = Global Attributes
+_UI_GRAPH_GLOBAL_ELEMENTS      = Global Elements
+_UI_GRAPH_XSDSCHEMA            = Schema
+_UI_GRAPH_XSDSCHEMA_NO_NAMESPACE = (no target namespace specified)
+_UI_GRAPH_XSDCOMPLEXTYPEDEFINITION = XSD Complex Type Definition:
+_UI_GRAPH_XSDMODELGROUP        = XSD Model Group
+_UI_GRAPH_XSDPARTICLE          = XSD Particle
+_UI_GRAPH_VIEW_NOT_AVAILABLE   = View is not available for selected object.
+_UI_GRAPH_UNKNOWN_OBJECT       = Unknown object
+
+! Additional Categories
+_UI_GRAPH_TYPES                = Types
+_UI_GRAPH_ELEMENTS             = Elements
+_UI_GRAPH_ATTRIBUTES           = Attributes
+_UI_GRAPH_ATTRIBUTE_GROUPS     = Attribute Groups
+_UI_GRAPH_NOTATIONS            = Notations
+_UI_GRAPH_IDENTITY_CONSTRAINTS = Identity Constraints
+_UI_GRAPH_ANNOTATIONS          = Annotations
+_UI_GRAPH_DIRECTIVES           = Directives
+
+! For Union MemberTypes Dialog
+_UI_LABEL_SELECT_MEMBERTYPES   = Select from the available types and add to the memberTypes list
+_UI_LABEL_MEMBERTYPES_CHANGE   = Member Types Change
+_UI_LABEL_MEMBERTYPES_VALUE    = Member Types Value:
+_UI_LABEL_MEMBERTYPES          = Member types:
+
+_UI_LABEL_VARIETY_CHANGE       = Variety Change
+
+_UI_LABEL_FIXEDORDEFAULT_VALUE = Fixed/Default Value
+
+_UI_LABEL_ITEM_TYPE_CHANGE     = Item Type Change
+
+_UI_LABEL_AVAILABLE_TYPES      = Available Types
+
+_UI_LABEL_INCLUDE_CHANGE       = Include Change
+
+_UI_LABEL_ITEM_TYPE            = Item type:
+_UI_LABEL_BASE_TYPE            = Base Type
+_UI_LABEL_TYPE                 = Type
+_UI_LABEL_MODEL_GROUP          = Model Group
+
+_UI_LABEL_ABSENT               = absent
+
+_UI_WARNING_RESET_ATTRGRP_REF  = Reset attribute group reference <{0}>
+_UI_WARNING_REMOVE_ATTRGRP_REF = Remove attribute group reference <{0}>
+_UI_WARNING_RESET_ATTR_REF     = Reset attribute reference <{0}>
+_UI_WARNING_REMOVE_ATTR_REF    = Remove attribute reference <{0}>
+
+!======================================================================================
+!
+! Here is the list of Error string that have message IDs - make sure they are unique
+!  Range for XSDEditor messageIDs: IWAX1001E - IWAX1200E
+!
+!======================================================================================
+! These three errors appear in the select include wizard
+! The name of the file will be substituted in
+_UI_DIFFERENT_NAME_SPACE  = {0} is in a different namespace 
+_UI_SAME_NAME_SPACE       = {0} is in the same namespace
+_UI_INCORRECT_XML_SCHEMA  = {0} is an invalid XML schema file
+
+_ERROR_SCHEMA_NOT_EXIST         = IWAX1003E does not exist.
+_ERROR_LABEL_INVALID_PREFIX     = IWAX1004E Invalid prefix. A prefix must not be empty or contain any space.
+
+! The name of the file will be substituted in
+_ERROR_SCHEMA_NAME_THE_SAME  = IWAX1005E {0} is the current schema. A schema cannot include itself. Reset to the last valid schema.
+
+_ERROR_XSD_GENERATION                = IWAX1006E Error generating XML schema
+_ERROR_NO_CONTAINER                  = IWAX1007E No folder selected
+_ERROR_NO_FILE_NAME                  = IWAX1008E No file name provided
+_ERROR_FILENAME_MUST_END_XSD         = IWAX1011E The file name must end in .xsd
+
+
+!
+! For schema that has too many errors, an extended message. 
+!
+_ERROR_DIALOG_XML_SCHEMA_INVALID_TEXT  = IWAX100d9E The XML schema file is not valid.  
+_ERROR_MORE_ERRORS                    = There are more errors in the schema than are displayed in the Tasks view.  Correct the first {0} errors and re-validate the schema file.
+
+! DDL Generation Failed Dialog
+_UI_DIALOG_DDL_GEN_FAILED_TITLE     = DDL Generation Failed
+_ERROR_DIALOG_DDL_NOT_GENEREATED    = IWAX1010E DDL has not been generated
+_UI_DIALOG_DDL_GEN_FAILED_REASON    = The selected schema has no global elements
+_UI_DIALOG_DDL_GEN_FAILED_REASON2   = None of the global elements in the schema have a complex type or they reference complex types that cannot be found.
+
+_EXC_OPEN_XSD = IWAX1011E Cannot open XML Schema editor
+
+_ERROR_LABEL_PREFIX_EXISTS     = IWAX1012E Prefix already exists
+
+_ERROR_REMOVE_LOCAL_SIMPLETYPE  = IWAX1013E Remove local simple type from extension
+
+_WARN_INVALID_TARGET_NAMESPACE = IWAX1014E The target namespace is not well-formed
+
+_ERROR_TARGET_NAMESPACE_AND_PREFIX = IWAX1015E A target namespace must be associated with a prefix
+
+
+_UI_CONTAINMENT = Containment
+_UI_INHERITANCE = Inheritance
+_UI_SUBSTITUTION_GROUPS = Substitution Groups
+_UI_ANONYMOUS = **anonymous**
+_UI_VALUE = Value
+_UI_ANY_ELEMENT = Any Element
+_UI_SORT = Sort
+
+_UI_ACTION_EDIT_NAMESPACES = Edit Namespaces...
+
+
+_UI_CreateChild_text = {0}
+_UI_CreateChild_text2 = {1} {0}
+_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_XSDAnnotation_type = Annotation
+_UI_XSDAttributeDeclaration_type = Attribute Declaration
+_UI_XSDAttributeGroupContent_type = Attribute Group Content
+_UI_XSDAttributeGroupDefinition_type = Attribute Group Definition
+_UI_XSDAttributeUse_type = Attribute Use
+_UI_XSDBoundedFacet_type = Bounded Facet
+_UI_XSDCardinalityFacet_type = Cardinality Facet
+_UI_XSDComplexTypeContent_type = Complex Type Content
+_UI_XSDComplexTypeDefinition_type = Complex Type Definition
+_UI_XSDComponent_type = Component
+_UI_XSDConcreteComponent_type = Concrete Component
+_UI_XSDConstrainingFacet_type = Constraining Facet
+_UI_XSDDiagnostic_type = Diagnostic
+_UI_XSDElementDeclaration_type = Element Declaration
+_UI_XSDEnumerationFacet_type = Enumeration Facet
+_UI_XSDFacet_type = Facet
+_UI_XSDFeature_type = Feature
+_UI_XSDFixedFacet_type = Fixed Facet
+_UI_XSDFractionDigitsFacet_type = Fraction Digits Facet
+_UI_XSDFundamentalFacet_type = Fundamental Facet
+_UI_XSDIdentityConstraintDefinition_type = Identity Constraint Definition
+_UI_XSDImport_type = Import
+_UI_XSDInclude_type = Include
+_UI_XSDLengthFacet_type = Length Facet
+_UI_XSDMaxExclusiveFacet_type = Max Exclusive Facet
+_UI_XSDMaxFacet_type = Max Facet
+_UI_XSDMaxInclusiveFacet_type = Max Inclusive Facet
+_UI_XSDMaxLengthFacet_type = Max Length Facet
+_UI_XSDMinExclusiveFacet_type = Min Exclusive Facet
+_UI_XSDMinFacet_type = Min Facet
+_UI_XSDMinInclusiveFacet_type = Min Inclusive Facet
+_UI_XSDMinLengthFacet_type = Min Length Facet
+_UI_XSDModelGroup_type = Model Group
+_UI_XSDModelGroupDefinition_type = Model Group Definition
+_UI_XSDNamedComponent_type = Named Component
+_UI_XSDNotationDeclaration_type = Notation Declaration
+_UI_XSDNumericFacet_type = Numeric Facet
+_UI_XSDOrderedFacet_type = Ordered Facet
+_UI_XSDParticle_type = Particle
+_UI_XSDParticleContent_type = Particle Content
+_UI_XSDPatternFacet_type = Pattern Facet
+_UI_XSDRedefinableComponent_type = Redefinable Component
+_UI_XSDRedefineContent_type = Redefine Content
+_UI_XSDRedefine_type = Redefine
+_UI_XSDRepeatableFacet_type = Repeatable Facet
+_UI_XSDSchema_type = Schema
+_UI_XSDSchemaCompositor_type = Schema Compositor
+_UI_XSDSchemaContent_type = Schema Content
+_UI_XSDSchemaDirective_type = Schema Directive
+_UI_XSDScope_type = Scope
+_UI_XSDSimpleTypeDefinition_type = Simple Type Definition
+_UI_XSDTerm_type = Term
+_UI_XSDTotalDigitsFacet_type = Total Digits Facet
+_UI_XSDTypeDefinition_type = Type Definition
+_UI_XSDWhiteSpaceFacet_type = White Space Facet
+_UI_XSDWildcard_type = Wildcard
+_UI_XSDXPathDefinition_type = XPath Definition
+_UI_Unknown_type = Object
+
+_UI_XSDAnnotation_applicationInformation_feature = Application Information
+_UI_XSDAnnotation_userInformation_feature = User Information
+_UI_XSDAnnotation_attributes_feature = Attributes
+_UI_XSDAttributeDeclaration_attributeDeclarationReference_feature = Attribute Declaration Reference
+_UI_XSDAttributeDeclaration_annotation_feature = Annotation
+_UI_XSDAttributeDeclaration_anonymousTypeDefinition_feature = Anonymous Type Definition
+_UI_XSDAttributeDeclaration_typeDefinition_feature = Type Definition
+_UI_XSDAttributeDeclaration_resolvedAttributeDeclaration_feature = Resolved Attribute Declaration
+_UI_XSDAttributeGroupDefinition_attributeGroupDefinitionReference_feature = Attribute Group Definition Reference
+_UI_XSDAttributeGroupDefinition_annotation_feature = Annotation
+_UI_XSDAttributeGroupDefinition_contents_feature = Contents
+_UI_XSDAttributeGroupDefinition_attributeUses_feature = Attribute Uses
+_UI_XSDAttributeGroupDefinition_attributeWildcardContent_feature = Attribute Wildcard Content
+_UI_XSDAttributeGroupDefinition_attributeWildcard_feature = Attribute Wildcard
+_UI_XSDAttributeGroupDefinition_resolvedAttributeGroupDefinition_feature = Resolved Attribute Group Definition
+_UI_XSDAttributeGroupDefinition_syntheticWildcard_feature = Synthetic Wildcard
+_UI_XSDAttributeUse_required_feature = Required
+_UI_XSDAttributeUse_value_feature = Value
+_UI_XSDAttributeUse_constraint_feature = Constraint
+_UI_XSDAttributeUse_use_feature = Use
+_UI_XSDAttributeUse_lexicalValue_feature = Lexical Value
+_UI_XSDAttributeUse_attributeDeclaration_feature = Attribute Declaration
+_UI_XSDAttributeUse_content_feature = Content
+_UI_XSDBoundedFacet_value_feature = Value
+_UI_XSDCardinalityFacet_value_feature = Value
+_UI_XSDComplexTypeDefinition_derivationMethod_feature = Derivation Method
+_UI_XSDComplexTypeDefinition_final_feature = Final
+_UI_XSDComplexTypeDefinition_abstract_feature = Abstract
+_UI_XSDComplexTypeDefinition_contentTypeCategory_feature = Content Type Category
+_UI_XSDComplexTypeDefinition_prohibitedSubstitutions_feature = Prohibited Substitutions
+_UI_XSDComplexTypeDefinition_lexicalFinal_feature = Lexical Final
+_UI_XSDComplexTypeDefinition_block_feature = Block
+_UI_XSDComplexTypeDefinition_mixed_feature = Mixed
+_UI_XSDComplexTypeDefinition_contentAnnotation_feature = Content Annotation
+_UI_XSDComplexTypeDefinition_baseTypeDefinition_feature = Base Type Definition
+_UI_XSDComplexTypeDefinition_content_feature = Content
+_UI_XSDComplexTypeDefinition_contentType_feature = Content Type
+_UI_XSDComplexTypeDefinition_attributeUses_feature = Attribute Uses
+_UI_XSDComplexTypeDefinition_attributeContents_feature = Attribute Contents
+_UI_XSDComplexTypeDefinition_attributeWildcard_feature = Attribute Wildcard
+_UI_XSDComplexTypeDefinition_attributeWildcardContent_feature = Attribute Wildcard Content
+_UI_XSDComplexTypeDefinition_rootTypeDefinition_feature = Root Type Definition
+_UI_XSDComplexTypeDefinition_syntheticParticle_feature = Synthetic Particle
+_UI_XSDComplexTypeDefinition_syntheticWildcard_feature = Synthetic Wildcard
+_UI_XSDConcreteComponent_element_feature = Element
+_UI_XSDConcreteComponent_container_feature = Container
+_UI_XSDConcreteComponent_rootContainer_feature = Root Container
+_UI_XSDConcreteComponent_schema_feature = Schema
+_UI_XSDConcreteComponent_diagnostics_feature = Diagnostics
+_UI_XSDDiagnostic_severity_feature = Severity
+_UI_XSDDiagnostic_message_feature = Message
+_UI_XSDDiagnostic_locationURI_feature = Location URI
+_UI_XSDDiagnostic_line_feature = Line
+_UI_XSDDiagnostic_column_feature = Column
+_UI_XSDDiagnostic_node_feature = Node
+_UI_XSDDiagnostic_annotationURI_feature = Annotation URI
+_UI_XSDDiagnostic_components_feature = Components
+_UI_XSDDiagnostic_primaryComponent_feature = Primary Component
+_UI_XSDElementDeclaration_nillable_feature = Nillable
+_UI_XSDElementDeclaration_disallowedSubstitutions_feature = Disallowed Substitutions
+_UI_XSDElementDeclaration_substitutionGroupExclusions_feature = Substitution Group Exclusions
+_UI_XSDElementDeclaration_abstract_feature = Abstract
+_UI_XSDElementDeclaration_lexicalFinal_feature = Lexical Final
+_UI_XSDElementDeclaration_block_feature = Block
+_UI_XSDElementDeclaration_elementDeclarationReference_feature = Element Declaration Reference
+_UI_XSDElementDeclaration_circular_feature = Circular
+_UI_XSDElementDeclaration_annotation_feature = Annotation
+_UI_XSDElementDeclaration_anonymousTypeDefinition_feature = Anonymous Type Definition
+_UI_XSDElementDeclaration_typeDefinition_feature = Type Definition
+_UI_XSDElementDeclaration_identityConstraintDefinitions_feature = Identity Constraint Definitions
+_UI_XSDElementDeclaration_resolvedElementDeclaration_feature = Resolved Element Declaration
+_UI_XSDElementDeclaration_substitutionGroupAffiliation_feature = Substitution Group Affiliation
+_UI_XSDElementDeclaration_substitutionGroup_feature = Substitution Group
+_UI_XSDEnumerationFacet_value_feature = Value
+_UI_XSDFacet_lexicalValue_feature = Lexical Value
+_UI_XSDFacet_facetName_feature = Facet Name
+_UI_XSDFacet_effectiveValue_feature = Effective Value
+_UI_XSDFacet_annotation_feature = Annotation
+_UI_XSDFacet_simpleTypeDefinition_feature = Simple Type Definition
+_UI_XSDFeature_value_feature = Value
+_UI_XSDFeature_constraint_feature = Constraint
+_UI_XSDFeature_form_feature = Form
+_UI_XSDFeature_lexicalValue_feature = Lexical Value
+_UI_XSDFeature_global_feature = Global
+_UI_XSDFeature_featureReference_feature = Feature Reference
+_UI_XSDFeature_scope_feature = Scope
+_UI_XSDFeature_resolvedFeature_feature = Resolved Feature
+_UI_XSDFeature_type_feature = Type
+_UI_XSDFixedFacet_fixed_feature = Fixed
+_UI_XSDFractionDigitsFacet_value_feature = Value
+_UI_XSDIdentityConstraintDefinition_identityConstraintCategory_feature = Identity Constraint Category
+_UI_XSDIdentityConstraintDefinition_annotation_feature = Annotation
+_UI_XSDIdentityConstraintDefinition_referencedKey_feature = Referenced Key
+_UI_XSDIdentityConstraintDefinition_selector_feature = Selector
+_UI_XSDIdentityConstraintDefinition_fields_feature = Fields
+_UI_XSDImport_namespace_feature = Namespace
+_UI_XSDImport_annotation_feature = Annotation
+_UI_XSDInclude_annotation_feature = Annotation
+_UI_XSDLengthFacet_value_feature = Value
+_UI_XSDMaxFacet_value_feature = Value
+_UI_XSDMaxFacet_inclusive_feature = Inclusive
+_UI_XSDMaxFacet_exclusive_feature = Exclusive
+_UI_XSDMaxLengthFacet_value_feature = Value
+_UI_XSDMinFacet_value_feature = Value
+_UI_XSDMinFacet_inclusive_feature = Inclusive
+_UI_XSDMinFacet_exclusive_feature = Exclusive
+_UI_XSDMinLengthFacet_value_feature = Value
+_UI_XSDModelGroup_compositor_feature = Compositor
+_UI_XSDModelGroup_annotation_feature = Annotation
+_UI_XSDModelGroup_contents_feature = Contents
+_UI_XSDModelGroup_particles_feature = Particles
+_UI_XSDModelGroupDefinition_modelGroupDefinitionReference_feature = Model Group Definition Reference
+_UI_XSDModelGroupDefinition_annotation_feature = Annotation
+_UI_XSDModelGroupDefinition_modelGroup_feature = Model Group
+_UI_XSDModelGroupDefinition_resolvedModelGroupDefinition_feature = Resolved Model Group Definition
+_UI_XSDNamedComponent_name_feature = Name
+_UI_XSDNamedComponent_targetNamespace_feature = Target Namespace
+_UI_XSDNamedComponent_aliasName_feature = Alias Name
+_UI_XSDNamedComponent_uRI_feature = URI
+_UI_XSDNamedComponent_aliasURI_feature = Alias URI
+_UI_XSDNamedComponent_qName_feature = QName
+_UI_XSDNotationDeclaration_systemIdentifier_feature = System Identifier
+_UI_XSDNotationDeclaration_publicIdentifier_feature = Public Identifier
+_UI_XSDNotationDeclaration_annotation_feature = Annotation
+_UI_XSDNumericFacet_value_feature = Value
+_UI_XSDOrderedFacet_value_feature = Value
+_UI_XSDParticle_minOccurs_feature = Min Occurs
+_UI_XSDParticle_maxOccurs_feature = Max Occurs
+_UI_XSDParticle_content_feature = Content
+_UI_XSDParticle_term_feature = Term
+_UI_XSDPatternFacet_value_feature = Value
+_UI_XSDRedefinableComponent_circular_feature = Circular
+_UI_XSDRedefine_annotations_feature = Annotations
+_UI_XSDRedefine_contents_feature = Contents
+_UI_XSDRepeatableFacet_annotations_feature = Annotations
+_UI_XSDSchema_document_feature = Document
+_UI_XSDSchema_schemaLocation_feature = Schema Location
+_UI_XSDSchema_targetNamespace_feature = Target Namespace
+_UI_XSDSchema_attributeFormDefault_feature = Attribute Form Default
+_UI_XSDSchema_elementFormDefault_feature = Element Form Default
+_UI_XSDSchema_finalDefault_feature = Final Default
+_UI_XSDSchema_blockDefault_feature = Block Default
+_UI_XSDSchema_version_feature = Version
+_UI_XSDSchema_contents_feature = Contents
+_UI_XSDSchema_elementDeclarations_feature = Element Declarations
+_UI_XSDSchema_attributeDeclarations_feature = Attribute Declarations
+_UI_XSDSchema_attributeGroupDefinitions_feature = Attribute Group Definitions
+_UI_XSDSchema_typeDefinitions_feature = Type Definitions
+_UI_XSDSchema_modelGroupDefinitions_feature = Model Group Definitions
+_UI_XSDSchema_identityConstraintDefinitions_feature = Identity Constraint Definitions
+_UI_XSDSchema_notationDeclarations_feature = Notation Declarations
+_UI_XSDSchema_annotations_feature = Annotations
+_UI_XSDSchema_allDiagnostics_feature = All Diagnostics
+_UI_XSDSchema_referencingDirectives_feature = Referencing Directives
+_UI_XSDSchema_rootVersion_feature = Root Version
+_UI_XSDSchema_originalVersion_feature = Original Version
+_UI_XSDSchema_incorporatedVersions_feature = Incorporated Versions
+_UI_XSDSchema_schemaForSchema_feature = Schema For Schema
+_UI_XSDSchemaCompositor_incorporatedSchema_feature = Incorporated Schema
+_UI_XSDSchemaDirective_schemaLocation_feature = Schema Location
+_UI_XSDSchemaDirective_resolvedSchema_feature = Resolved Schema
+_UI_XSDSimpleTypeDefinition_variety_feature = Variety
+_UI_XSDSimpleTypeDefinition_final_feature = Final
+_UI_XSDSimpleTypeDefinition_lexicalFinal_feature = Lexical Final
+_UI_XSDSimpleTypeDefinition_validFacets_feature = Valid Facets
+_UI_XSDSimpleTypeDefinition_contents_feature = Contents
+_UI_XSDSimpleTypeDefinition_facetContents_feature = Facet Contents
+_UI_XSDSimpleTypeDefinition_facets_feature = Facets
+_UI_XSDSimpleTypeDefinition_memberTypeDefinitions_feature = Member Type Definitions
+_UI_XSDSimpleTypeDefinition_fundamentalFacets_feature = Fundamental Facets
+_UI_XSDSimpleTypeDefinition_baseTypeDefinition_feature = Base Type Definition
+_UI_XSDSimpleTypeDefinition_primitiveTypeDefinition_feature = Primitive Type Definition
+_UI_XSDSimpleTypeDefinition_itemTypeDefinition_feature = Item Type Definition
+_UI_XSDSimpleTypeDefinition_rootTypeDefinition_feature = Root Type Definition
+_UI_XSDSimpleTypeDefinition_minFacet_feature = Min Facet
+_UI_XSDSimpleTypeDefinition_maxFacet_feature = Max Facet
+_UI_XSDSimpleTypeDefinition_maxInclusiveFacet_feature = Max Inclusive Facet
+_UI_XSDSimpleTypeDefinition_minInclusiveFacet_feature = Min Inclusive Facet
+_UI_XSDSimpleTypeDefinition_minExclusiveFacet_feature = Min Exclusive Facet
+_UI_XSDSimpleTypeDefinition_maxExclusiveFacet_feature = Max Exclusive Facet
+_UI_XSDSimpleTypeDefinition_lengthFacet_feature = Length Facet
+_UI_XSDSimpleTypeDefinition_whiteSpaceFacet_feature = White Space Facet
+_UI_XSDSimpleTypeDefinition_enumerationFacets_feature = Enumeration Facets
+_UI_XSDSimpleTypeDefinition_patternFacets_feature = Pattern Facets
+_UI_XSDSimpleTypeDefinition_cardinalityFacet_feature = Cardinality Facet
+_UI_XSDSimpleTypeDefinition_numericFacet_feature = Numeric Facet
+_UI_XSDSimpleTypeDefinition_maxLengthFacet_feature = Max Length Facet
+_UI_XSDSimpleTypeDefinition_minLengthFacet_feature = Min Length Facet
+_UI_XSDSimpleTypeDefinition_totalDigitsFacet_feature = Total Digits Facet
+_UI_XSDSimpleTypeDefinition_fractionDigitsFacet_feature = Fraction Digits Facet
+_UI_XSDSimpleTypeDefinition_orderedFacet_feature = Ordered Facet
+_UI_XSDSimpleTypeDefinition_boundedFacet_feature = Bounded Facet
+_UI_XSDSimpleTypeDefinition_effectiveMaxFacet_feature = Effective Max Facet
+_UI_XSDSimpleTypeDefinition_effectiveWhiteSpaceFacet_feature = Effective White Space Facet
+_UI_XSDSimpleTypeDefinition_effectiveMaxLengthFacet_feature = Effective Max Length Facet
+_UI_XSDSimpleTypeDefinition_effectiveFractionDigitsFacet_feature = Effective Fraction Digits Facet
+_UI_XSDSimpleTypeDefinition_effectivePatternFacet_feature = Effective Pattern Facet
+_UI_XSDSimpleTypeDefinition_effectiveEnumerationFacet_feature = Effective Enumeration Facet
+_UI_XSDSimpleTypeDefinition_effectiveTotalDigitsFacet_feature = Effective Total Digits Facet
+_UI_XSDSimpleTypeDefinition_effectiveMinLengthFacet_feature = Effective Min Length Facet
+_UI_XSDSimpleTypeDefinition_effectiveLengthFacet_feature = Effective Length Facet
+_UI_XSDSimpleTypeDefinition_effectiveMinFacet_feature = Effective Min Facet
+_UI_XSDSimpleTypeDefinition_syntheticFacets_feature = Synthetic Facets
+_UI_XSDTotalDigitsFacet_value_feature = Value
+_UI_XSDTypeDefinition_annotation_feature = Annotation
+_UI_XSDTypeDefinition_derivationAnnotation_feature = Derivation Annotation
+_UI_XSDTypeDefinition_annotations_feature = Annotations
+_UI_XSDTypeDefinition_rootType_feature = Root Type
+_UI_XSDTypeDefinition_baseType_feature = Base Type
+_UI_XSDTypeDefinition_simpleType_feature = Simple Type
+_UI_XSDTypeDefinition_complexType_feature = Complex Type
+_UI_XSDWhiteSpaceFacet_value_feature = Value
+_UI_XSDWildcard_namespaceConstraintCategory_feature = Namespace Constraint Category
+_UI_XSDWildcard_namespaceConstraint_feature = Namespace Constraint
+_UI_XSDWildcard_processContents_feature = Process Contents
+_UI_XSDWildcard_lexicalNamespaceConstraint_feature = Lexical Namespace Constraint
+_UI_XSDWildcard_annotation_feature = Annotation
+_UI_XSDWildcard_annotations_feature = Annotations
+_UI_XSDXPathDefinition_variety_feature = Variety
+_UI_XSDXPathDefinition_value_feature = Value
+_UI_XSDXPathDefinition_annotation_feature = Annotation
+_UI_Unknown_feature = Unspecified
+
+!======================================================================================
+!
+! Used by org.eclipse.wst.common.ui.viewers.SelectSingleFileView
+!
+!======================================================================================
+_UI_LABEL_SOURCE_FILES   = Workbench Files
+_UI_LABEL_SELECTED_FILES = Selected Files
+
+_UI_IMPORT_BUTTON          = Import Files...
+_UI_IMPORT_BUTTON_TOOL_TIP = Import files from file system
diff --git a/bundles/org.eclipse.wst.xsd.ui/plugin.xml b/bundles/org.eclipse.wst.xsd.ui/plugin.xml
new file mode 100644
index 0000000..b7aa2e1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/plugin.xml
@@ -0,0 +1,203 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin
+   id="org.eclipse.wst.xsd.ui"
+   name="%_UI_PLUGIN_NAME"
+   version="1.0.0"
+   provider-name="Eclipse.org"
+   class="org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin">
+
+   <runtime>
+      <library name="xsdeditor.jar">
+         <export name="*"/>
+      </library>
+   </runtime>
+   <requires>
+      <import plugin="org.eclipse.core.runtime.compatibility"/>
+      
+      <import plugin="org.eclipse.wst.xml.uriresolver"/>
+      <import plugin="org.eclipse.wst.sse.ui"/>
+      <import plugin="org.eclipse.wst.sse.core"/>
+      <import plugin="org.eclipse.wst.xml.core"/>
+      <import plugin="org.eclipse.wst.xml.ui"/>
+      <import plugin="org.eclipse.wst.common.contentmodel"/>
+      <import plugin="org.eclipse.wst.common.ui"/>
+      
+      <import plugin="org.eclipse.jface.text"/>
+      <import plugin="org.eclipse.xsd"/>
+      <import plugin="org.eclipse.gef"/>
+      <import plugin="org.eclipse.jface"/>
+      <import plugin="org.eclipse.ui.editors"/>
+      <import plugin="org.eclipse.ui.workbench.texteditor"/>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.ui.views"/>
+      <import plugin="org.eclipse.ui.ide"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.wst.common.ui.properties"/>
+      <import plugin="org.eclipse.xsd.edit"/>
+      <import plugin="org.eclipse.emf.edit"/>
+      <import plugin="org.eclipse.emf.edit.ui"/> 
+   </requires>
+
+
+   <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            name="%_UI_EDITOR_NAME"
+            default="true"
+            icon="icons/XSDFile.gif"
+            extensions="xsd"
+            contributorClass="org.eclipse.wst.xsd.ui.internal.XSDActionBarContributor"
+            class="org.eclipse.wst.xsd.ui.internal.XSDEditor"
+            id="org.eclipse.wst.xsd.ui.XSDEditor">
+      </editor>
+   </extension>
+<!-- drop targets for XSDTextEditor-->
+   <extension
+         point="org.eclipse.wst.sse.ui.dropTargetTransfers">
+      <dropTargetContribution
+            targetID="org.eclipse.wst.xsd.ui.internal.XSDTextEditor"
+            id="org.eclipse.wst.xsd.ui.ExtendedTransfers">
+         <transfer
+               priority="mid"
+               singleton="true"
+               class="org.eclipse.swt.dnd.FileTransfer"
+               method="getInstance"
+               id="org.eclipse.swt.dnd.FileTransfer">
+         </transfer>
+         <dropAction
+               class="org.eclipse.wst.sse.ui.extension.FileDropAction"
+               transferID="org.eclipse.swt.dnd.FileTransfer"
+               id="org.eclipse.wst.sse.ui.extension.FileDropAction">
+         </dropAction>
+         <transfer
+               priority="low"
+               singleton="true"
+               class="org.eclipse.swt.dnd.TextTransfer"
+               method="getInstance"
+               id="org.eclipse.swt.dnd.TextTransfer">
+         </transfer>
+         <dropAction
+               class="org.eclipse.wst.sse.ui.extension.TextDropAction"
+               transferID="org.eclipse.swt.dnd.TextTransfer"
+               id="corg.eclipse.wst.sse.ui.extension.TextDropAction">
+         </dropAction>
+      </dropTargetContribution>
+   </extension>
+
+   <extension point="org.eclipse.ui.newWizards">
+     <wizard id = "org.eclipse.wst.xsd.ui.internal.wizards.NewXSDWizard"
+        name = "%_UI_WIZARD_NEW_XSD"
+        class = "org.eclipse.wst.xsd.ui.internal.wizards.NewXSDWizard"
+        category = "org.eclipse.wst.XMLCategory"
+        icon = "icons/XSDFile.gif">
+      <description>%_UI_CREATE_A_NEW_SCHEMA</description>
+      <selection class = "org.eclipse.core.resources.IResource" />
+      </wizard>
+   </extension>
+
+   <extension point="org.eclipse.ui.preferencePages">
+      <page
+            name="%_UI_XML_SCHEMA_PREFERENCE"
+            category="org.eclipse.wst.sse.ui.preferences"
+            class="org.eclipse.wst.xsd.ui.internal.preferences.XSDPreferencePage"
+            id="org.eclipse.wst.xsd.ui.internal.preferences.XSDPreferencePage">
+      </page>
+   </extension>
+   <extension
+         point="org.eclipse.wst.sse.ui.extendedconfiguration">
+      <preferencepages
+            preferenceids="org.eclipse.wst.sse.ui.preferences/org.eclipse.wst.xsd.ui.internal.preferences.XSDPreferencePage"
+            target="org.eclipse.wst.xsd.ui.internal.XSDEditor.source" />
+   </extension>
+   
+   <!-- ==================================================== -->
+<!-- Support help on the tags                             -->
+<!-- ==================================================== -->
+<!--   <extension
+         point="org.eclipse.wst.common.contentmodel.annotationFiles">
+      <annotationFile
+            location="/w3c/schemaForCodeAssist-annotations.xml"
+            publicId="http://www.w3.org/2001/XMLSchema">
+      </annotationFile>
+   </extension>
+-->
+   <extension
+         point="org.eclipse.wst.common.ui.properties.propertyContributor">
+      <propertyContributor
+            contributorId="org.eclipse.wst.xsd.ui.internal.XSDEditor"
+            sectionDescriptorProvider="org.eclipse.wst.xsd.ui.internal.properties.section.XSDSectionDescriptorProvider"
+            labelProvider="org.eclipse.wst.xsd.ui.internal.properties.section.XSDSectionLabelProvider">
+         <propertyCategory
+               category="general">
+         </propertyCategory>
+         <propertyCategory
+               category="namespace">
+         </propertyCategory>
+         <propertyCategory
+               category="other">
+         </propertyCategory>
+         <propertyCategory
+               category="attributes">
+         </propertyCategory>
+         <propertyCategory
+               category="enumerations">
+         </propertyCategory>
+         <propertyCategory
+               category="documentation">
+         </propertyCategory>
+         <propertyCategory
+               category="facets">
+         </propertyCategory>
+      </propertyContributor>
+   </extension>
+   <extension
+         point="org.eclipse.wst.common.ui.properties.propertyTabs">
+      <propertyTabs
+            contributorId="org.eclipse.wst.xsd.ui.internal.XSDEditor">
+         <propertyTab
+               label="%_UI_LABEL_GENERAL"
+               category="general"
+               id="com.ibm.xmlwebservices.general">
+         </propertyTab>
+         <propertyTab
+               label="%_UI_LABEL_NAMESPACE"
+               category="namespace"
+               afterTab="com.ibm.xmlwebservices.general"
+               id="com.ibm.xmlwebservices.namespace">
+         </propertyTab>
+         <propertyTab
+               label="%_UI_LABEL_OTHER"
+               category="other"
+               id="com.ibm.xmlwebservices.other">
+         </propertyTab>
+         <propertyTab
+               label="%_UI_LABEL_ATTRIBUTES"
+               category="attributes"
+               id="com.ibm.xmlwebservices.attributes">
+         </propertyTab>
+         <propertyTab
+               label="%_UI_LABEL_ENUMERATIONS"
+               category="enumerations"
+               id="com.ibm.xmlwebservices.enumerations">
+         </propertyTab>
+         <propertyTab
+               label="%_UI_LABEL_DOCUMENTATION"
+               category="documentation"
+               id="com.ibm.xmlwebservices.documentation">
+         </propertyTab>
+         <propertyTab
+               label="%_UI_SECTION_ADVANCED_ATTRIBUTES"
+               category="facets"
+               id="com.ibm.xmlwebservices.facets">
+         </propertyTab>
+      </propertyTabs>
+   </extension>
+   
+    <extension point="org.eclipse.wst.xml.uriresolver.catalogContributor">
+     <catalogContributor catalogId="default">
+       <mappingInfo key="http://www.w3.org/2001/XMLSchema" uri="w3c/XMLSchema.xsd"/>
+      </catalogContributor>
+  </extension>
+ 
+</plugin>
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDDataTypeValueExtension.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDDataTypeValueExtension.java
new file mode 100644
index 0000000..323cb94
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDDataTypeValueExtension.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+import java.util.Vector;
+
+import org.eclipse.wst.common.contentmodel.CMNode;
+import org.eclipse.wst.common.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.common.contentmodel.modelquery.extension.DataTypeValueExtension;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+  /**
+   * This class is used to extend the ModelQuery behaviour so that we can contribute our own
+   * 'allowed values' for attributes or elements (e.g. the 'type' attribute).
+   */
+  public abstract class AbstractXSDDataTypeValueExtension implements DataTypeValueExtension
+  { 
+    protected ModelQuery modelQuery;
+
+    public int getType()
+    {
+      return DATA_TYPE_VALUE_EXTENSION;
+    }   
+
+    public abstract String getId();
+
+    public AbstractXSDDataTypeValueExtension(ModelQuery modelQuery)
+    {
+      this.modelQuery = modelQuery;
+      if (modelQuery != null && modelQuery.getExtensionManager() != null)
+      {
+        modelQuery.getExtensionManager().addExtension(this);
+      }
+    }  
+
+    public void dispose()
+    {
+      if (modelQuery != null && modelQuery.getExtensionManager() != null)
+      {
+        modelQuery.getExtensionManager().removeExtension(this);
+      }
+    }
+
+    protected abstract XSDSchema getEnclosingXSDSchema(Element element);  
+
+
+	protected TypesHelper createTypesHelper(XSDSchema schema)
+	{ 
+		return new TypesHelper(schema);		
+	}
+	
+    public java.util.List getDataTypeValues(Element element, CMNode cmNode)
+    {
+      java.util.List list = new Vector();
+      if (cmNode.getNodeType() == CMNode.ATTRIBUTE_DECLARATION)
+      {
+        TypesHelper typesHelper = createTypesHelper(getEnclosingXSDSchema(element));
+        String name = cmNode.getNodeName();
+        String currentElementName = element.getLocalName();
+        Node parentNode = element.getParentNode();
+        String parentName = "";
+        if (parentNode != null)
+        {
+          parentName = parentNode.getLocalName();
+        }
+
+        if (checkName(name, "type"))
+        {
+          if (checkName(currentElementName, "attribute"))
+          {
+            list = typesHelper.getBuiltInTypeNamesList();
+            list.addAll(typesHelper.getUserSimpleTypeNamesList());
+          }
+          else if (checkName(currentElementName, "element"))
+          {
+            list = typesHelper.getBuiltInTypeNamesList2();
+            list.addAll(typesHelper.getUserSimpleTypeNamesList());
+            list.addAll(typesHelper.getUserComplexTypeNamesList());
+          }
+        }
+        else if (checkName(name, "itemType"))
+        {
+          if (checkName(currentElementName, "list"))
+          {
+            if (checkName(parentName, "simpleType"))
+            {
+              list = typesHelper.getBuiltInTypeNamesList();
+              list.addAll(typesHelper.getUserSimpleTypeNamesList());
+            }
+          }
+        }
+        else if (checkName(name, "memberTypes"))
+        {
+          if (checkName(currentElementName, "union"))
+          {
+            if (checkName(parentName, "simpleType"))
+            {
+              list = typesHelper.getBuiltInTypeNamesList();
+              list.addAll(typesHelper.getUserSimpleTypeNamesList());
+            }
+          }
+        }
+        else if (checkName(name, "base"))
+        {
+          if (checkName(currentElementName, "restriction"))
+          {
+            if (checkName(parentName, "simpleType"))
+            {
+              list = typesHelper.getBuiltInTypeNamesList();
+              list.addAll(typesHelper.getUserSimpleTypeNamesList());
+            }
+            else if (checkName(parentName, "simpleContent"))
+            {
+              list = typesHelper.getBuiltInTypeNamesList();
+              list.addAll(typesHelper.getUserComplexTypeNamesList());
+            }
+            else if (checkName(parentName, "complexContent"))
+            {
+              list = typesHelper.getBuiltInTypeNamesList();
+              list.addAll(typesHelper.getUserComplexTypeNamesList());
+            }
+          }
+          else if (checkName(currentElementName, "extension"))
+          {
+            if (checkName(parentName, "simpleContent"))
+            {
+              list = typesHelper.getBuiltInTypeNamesList();
+              list.addAll(typesHelper.getUserComplexTypeNamesList());
+            }
+            else if (checkName(parentName, "complexContent"))
+            {
+              list = typesHelper.getBuiltInTypeNamesList();
+              list.addAll(typesHelper.getUserComplexTypeNamesList());
+            }
+          }
+        }
+        else if (checkName(name, "ref"))
+        {
+          if (checkName(currentElementName, "element"))
+          {
+            list = typesHelper.getGlobalElements();
+          }
+          else if (checkName(currentElementName, "attribute"))
+          {
+            list = typesHelper.getGlobalAttributes();
+          }
+          else if (checkName(currentElementName, "attributeGroup"))
+          {
+            list = typesHelper.getGlobalAttributeGroups();
+          }
+          else if (checkName(currentElementName, "group"))
+          {
+            list = typesHelper.getModelGroups();
+          }
+        }
+        else if (checkName(name, "substitutionGroup"))
+        {
+          if (checkName(currentElementName, "element"))
+          {
+            list = typesHelper.getGlobalElements();
+          }
+        }
+/*        else if (checkName(name, "refer"))
+        {
+          if (checkName(currentElementName, "keyref"))
+          {
+            list = typesHelper.getKeys();
+          }
+        } */
+
+
+      }
+      return list;
+    }
+
+    protected boolean checkName(String localName, String token)
+    {
+      if (localName != null && localName.trim().equals(token))
+      {
+        return true;
+      }
+      return false;
+    }
+  }
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDModelQueryContributor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDModelQueryContributor.java
new file mode 100644
index 0000000..717afe0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/AbstractXSDModelQueryContributor.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+import java.net.URL;
+import java.util.Vector;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.common.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.common.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.modelquery.ModelQueryUtil;
+import org.w3c.dom.Document;
+
+public abstract class AbstractXSDModelQueryContributor
+{ 
+  protected AbstractXSDDataTypeValueExtension xsdDataTypeValueExtension;
+
+  public void setModel(XMLModel model)
+  {                    
+    // remove our old DataTypeValueExtension
+    //
+    if (xsdDataTypeValueExtension != null)
+    {
+      xsdDataTypeValueExtension.dispose();
+      xsdDataTypeValueExtension = null;
+    }
+
+    setImplicitGrammar(model.getDocument());
+
+    // add a new DataTypeValueExtension
+    //                                                          
+    ModelQuery modelQuery = ModelQueryUtil.getModelQuery(model.getDocument());
+    xsdDataTypeValueExtension = createXSDDataTypeValueExtension(modelQuery);
+  }
+  
+  protected void setImplicitGrammar(Document document)
+  {
+//    DOMExtension domExtension = DOMExtensionProviderRegistry.getInstance().getDOMExtension(document);
+//    if (domExtension != null)
+//    {
+      String uri = "platform:/plugin/org.eclipse.wst.xsd.ui/w3c/schemaForCodeAssist.xsd";
+      uri = resolvePlatformUrl(uri);
+      if (uri != null)
+      {
+        Vector list = new Vector();
+        NamespaceInfo info = new NamespaceInfo("http://www.w3.org/2001/XMLSchema", "xsd", uri);
+        info.setProperty("isImplied", "true");
+        list.add(info);
+//        domExtension.setImplictNamespaceInfoList(list);
+      }
+//    }
+  } 
+
+  protected static String resolvePlatformUrl(String urlspec)
+  {
+    String result = null;
+    try
+    {
+      urlspec = urlspec.replace('\\', '/');
+      URL url = new URL(urlspec);
+      URL resolvedURL = Platform.resolve(url);
+      result = resolvedURL.toString();
+    }
+    catch (Exception e)
+    {
+    }
+    return result;
+  }
+
+  public abstract AbstractXSDDataTypeValueExtension createXSDDataTypeValueExtension(ModelQuery modelQuery);
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDActionBarContributor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDActionBarContributor.java
new file mode 100644
index 0000000..e227044
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDActionBarContributor.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+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.resource.ImageDescriptor;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.actions.RetargetAction;
+import org.eclipse.ui.part.EditorActionBarContributor;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+import org.eclipse.wst.xsd.ui.internal.actions.ISchemaEditorActionConstants;
+import org.eclipse.wst.xsd.ui.internal.actions.ReloadDependenciesAction;
+
+public class XSDActionBarContributor extends MultiPageEditorActionBarContributor
+{
+  protected XSDEditor xsdEditor;
+  protected XSDTextEditor textEditor;
+
+  protected ReloadDependenciesAction reloadDependenciesAction;
+  
+  protected List fPartListeners= new ArrayList();
+
+  protected RetargetAction retargetReloadDependenciesAction;
+ 
+  /**
+   * Constructor for XSDActionBarContributor.
+   */
+  public XSDActionBarContributor()
+  {
+    super();
+
+    // Reload Dependencies
+    reloadDependenciesAction = new ReloadDependenciesAction(XSDEditorPlugin.getXSDString("_UI_MENU_RELOAD_DEPENDENCIES"));
+    retargetReloadDependenciesAction = new RetargetAction(ISchemaEditorActionConstants.RETARGET_RELOAD_DEPENDENCIES_ACTION_ID, XSDEditorPlugin.getXSDString("_UI_MENU_RELOAD_DEPENDENCIES"));
+    retargetReloadDependenciesAction.setToolTipText(XSDEditorPlugin.getXSDString("_UI_MENU_RELOAD_DEPENDENCIES_TOOLTIP"));
+    retargetReloadDependenciesAction.setImageDescriptor(
+        ImageDescriptor.createFromFile(XSDEditorPlugin.getPlugin().getClass(), "icons/reloadgrammar.gif"));
+    fPartListeners.add(retargetReloadDependenciesAction);
+  }
+
+  protected void updateActions()
+  {
+    if (xsdEditor != null && xsdEditor.getCurrentPageType().equals(XSDEditorPlugin.GRAPH_PAGE))
+    {
+      IAction deleteAction = xsdEditor.getGraphViewer().getComponentViewer().getMenuListener().getDeleteAction();
+      getActionBars().setGlobalActionHandler(ActionFactory.DELETE.getId(), deleteAction);
+
+      IAction printGraphAction = xsdEditor.getGraphViewer().getPrintGraphAction();
+      getActionBars().setGlobalActionHandler(ActionFactory.PRINT.getId(), printGraphAction);
+    }
+    else
+    {
+      getActionBars().setGlobalActionHandler(ActionFactory.DELETE.getId(), null);      
+      // always enable print regardless of whether we are on source or design
+      updateAction(ActionFactory.PRINT.getId(), ITextEditorActionConstants.PRINT, true);
+    }
+  }
+      
+  public void setActivePage(IEditorPart activeEditor)
+  {
+    updateActions();
+    getActionBars().updateActionBars();
+  }
+
+  protected void updateAction(String globalActionId, String textEditorActionId, boolean enable)
+  {
+    getActionBars().setGlobalActionHandler(globalActionId,
+                                      enable ? getAction(textEditor, textEditorActionId) :
+                                               null);
+  }
+
+  /**
+   * Returns the action registed with the given text editor.
+   * @return IAction or null if editor is null.
+   */
+  protected IAction getAction(ITextEditor editor, String actionID)
+  {
+    try
+    {
+      return (editor == null ? null : editor.getAction(actionID));
+    }
+    catch (Exception e)
+    {
+      return null;
+    }
+  }
+
+  private IMenuManager editMenu;
+
+  /*
+   * @see EditorActionBarContributor#contributeToMenu(IMenuManager)
+   */
+  public void addToMenu(IMenuManager menuManager)
+  {
+    editMenu = menuManager.findMenuUsingPath(IWorkbenchActionConstants.M_EDIT);
+
+    MenuManager treeMenu = new MenuManager(XSDEditorPlugin.getXSDString("_UI_MENU_XSD_EDITOR"));
+    menuManager.insertAfter(IWorkbenchActionConstants.MB_ADDITIONS, treeMenu);
+
+    treeMenu.add(new Separator("group1"));
+//  Add retarget actions
+
+    treeMenu.add(retargetReloadDependenciesAction);
+
+    treeMenu.add(new Separator("group2"));
+  }
+
+  /**
+   * @see EditorActionBarContributor#contributeToToolBar(IToolBarManager)
+   */
+  public void addToToolBar(IToolBarManager toolBarManager)
+  {
+    toolBarManager.add(new Separator("XMLSchema.2"));
+//  Add retarget actions
+    toolBarManager.add(retargetReloadDependenciesAction);
+
+    toolBarManager.add(new Separator("XMLSchema.1"));
+
+    toolBarManager.add(new Separator());
+  }
+  
+  public void contributeToToolBar(IToolBarManager toolBarManager)
+  {
+    addToToolBar(toolBarManager);
+  }
+  
+  public void contributeToMenu(IMenuManager menuManager)
+  {
+    addToMenu(menuManager);
+  }
+  
+  /**
+   * @see org.eclipse.ui.IEditorActionBarContributor#setActiveEditor(IEditorPart)
+   */
+  public void setActiveEditor(IEditorPart targetEditor)
+  {
+    super.setActiveEditor(targetEditor);
+
+    if (targetEditor instanceof XSDEditor)
+    {
+      xsdEditor = (XSDEditor) targetEditor;
+      reloadDependenciesAction.setEditor((XSDEditor)targetEditor);
+
+      textEditor = ((XSDEditor)targetEditor).getXSDTextEditor();
+      if (textEditor != null)
+      {      
+        updateActions();  
+        getActionBars().updateActionBars();
+      }
+    }
+  }
+
+  public void init(IActionBars bars, IWorkbenchPage page)
+  {
+    Iterator e = fPartListeners.iterator();
+    while (e.hasNext())
+    {
+      page.addPartListener((RetargetAction) e.next());
+    }
+
+    // register actions that have a dynamic editor. 
+
+    bars.setGlobalActionHandler(ISchemaEditorActionConstants.RETARGET_RELOAD_DEPENDENCIES_ACTION_ID, reloadDependenciesAction);
+
+    super.init(bars, page);
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDContentOutlinePage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDContentOutlinePage.java
new file mode 100644
index 0000000..9821602
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDContentOutlinePage.java
@@ -0,0 +1,375 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+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.jface.viewers.ViewerFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
+import org.eclipse.wst.xsd.ui.internal.actions.OpenSchemaAction;
+import org.eclipse.wst.xsd.ui.internal.provider.CategoryAdapter;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.w3c.dom.Element;
+
+public class XSDContentOutlinePage extends ContentOutlinePage
+{
+  protected XSDEditor xsdEditor;
+  protected int level = 0;
+  protected Object model;
+  protected ITreeContentProvider contentProvider;
+  protected ILabelProvider labelProvider;
+  protected XSDSelectionManager selectionManager;
+  protected SelectionManagerSelectionChangeListener selectionManagerSelectionChangeListener = new SelectionManagerSelectionChangeListener();
+  protected TreeSelectionChangeListener treeSelectionChangeListener = new TreeSelectionChangeListener();
+  XSDTextEditor xsdTextEditor;
+
+  /**
+   *  
+   */
+  public XSDContentOutlinePage(XSDTextEditor xsdTextEditor)
+  {
+    super();
+    this.xsdTextEditor = xsdTextEditor;
+  }
+
+  public void setModel(Object newModel)
+  {
+    model = newModel;
+  }
+
+  public void setContentProvider(ITreeContentProvider contentProvider)
+  {
+    this.contentProvider = contentProvider;
+  }
+
+  public void setLabelProvider(ILabelProvider labelProvider)
+  {
+    this.labelProvider = labelProvider;
+  }
+
+  // expose
+  public TreeViewer getTreeViewer()
+  {
+    return super.getTreeViewer();
+  }
+
+  public void createControl(Composite parent)
+  {
+    super.createControl(parent);
+    getTreeViewer().setContentProvider(contentProvider);
+    getTreeViewer().setLabelProvider(labelProvider);
+    getTreeViewer().setInput(model);
+    getTreeViewer().addSelectionChangedListener(this);
+    MenuManager menuManager = new MenuManager("#popup");//$NON-NLS-1$
+    menuManager.setRemoveAllWhenShown(true);
+    Menu menu = menuManager.createContextMenu(getTreeViewer().getControl());
+    getTreeViewer().getControl().setMenu(menu);
+    XSDMenuListener menuListener = new XSDMenuListener(xsdTextEditor.getXSDEditor().getSelectionManager());
+    menuManager.addMenuListener(menuListener);
+    setSelectionManager(xsdTextEditor.getXSDEditor().getSelectionManager());
+    // cs... why are we doing this from the outline view?
+    //
+    //xsdTextEditor.getXSDEditor().getSelectionManager().setSelection(new
+    // StructuredSelection(xsdTextEditor.getXSDSchema()));
+    XSDKeyListener keyListener = new XSDKeyListener(getTreeViewer(), menuListener);
+    getTreeViewer().getControl().addKeyListener(keyListener);
+    // drill down from outline view
+    getTreeViewer().getControl().addMouseListener(new MouseAdapter()
+    {
+      public void mouseDoubleClick(MouseEvent e)
+      {
+        ISelection iSelection = getTreeViewer().getSelection();
+        if (iSelection instanceof StructuredSelection)
+        {
+          StructuredSelection selection = (StructuredSelection)iSelection;
+          Object obj = selection.getFirstElement();
+          if (obj instanceof XSDConcreteComponent)
+          {
+            XSDConcreteComponent comp = (XSDConcreteComponent)obj;
+            if (comp.getContainer() instanceof XSDSchema)
+            {
+              xsdTextEditor.getXSDEditor().getGraphViewer().setInput(obj);
+            }
+          }
+        }
+
+      }
+    });
+  }
+  class XSDKeyListener extends KeyAdapter
+  {
+    TreeViewer viewer;
+    XSDMenuListener menuListener;
+
+    public XSDKeyListener(TreeViewer viewer, XSDMenuListener menuListener)
+    {
+      super();
+      this.viewer = viewer;
+      this.menuListener = menuListener;
+    }
+
+    /**
+     * @see org.eclipse.swt.events.KeyAdapter#keyReleased(KeyEvent)
+     */
+    public void keyReleased(KeyEvent e)
+    {
+      if (e.character == SWT.DEL)
+      {
+        menuListener.getDeleteAction().run();
+      }
+      else if (e.keyCode == SWT.F3) // open editor on any
+                                    // include/import/redefine
+      {
+        if (e.widget instanceof Tree)
+        {
+          Tree tree = (Tree) e.widget;
+          TreeItem[] selection = tree.getSelection();
+          if (selection.length > 0)
+          {
+            if (selection[0].getData() instanceof XSDSchemaDirective)
+            {
+              XSDSchemaDirective comp = (XSDSchemaDirective) selection[0].getData();
+              OpenSchemaAction openSchema = new OpenSchemaAction(XSDEditorPlugin.getXSDString("_UI_ACTION_OPEN_SCHEMA"), comp);
+              openSchema.run();
+            }
+          }
+        }
+      }
+    }
+  }
+
+  public void setExpandToLevel(int i)
+  {
+    level = i;
+  }
+
+  public void setInput(Object value)
+  {
+    getTreeViewer().setInput(value);
+    getTreeViewer().expandToLevel(level);
+  }
+
+  //	public ISelection getSelection()
+  //	{
+  //		if (getTreeViewer() == null)
+  //			return StructuredSelection.EMPTY;
+  //		return getTreeViewer().getSelection();
+  //	}
+  public void setSelectionManager(XSDSelectionManager newSelectionManager)
+  {
+    TreeViewer treeViewer = getTreeViewer();
+    // disconnect from old one
+    if (selectionManager != null)
+    {
+      selectionManager.removeSelectionChangedListener(selectionManagerSelectionChangeListener);
+      treeViewer.removeSelectionChangedListener(treeSelectionChangeListener);
+    }
+    selectionManager = newSelectionManager;
+    // connect to new one
+    if (selectionManager != null)
+    {
+      selectionManager.addSelectionChangedListener(selectionManagerSelectionChangeListener);
+      treeViewer.addSelectionChangedListener(treeSelectionChangeListener);
+    }
+  }
+  class SelectionManagerSelectionChangeListener implements ISelectionChangedListener
+  {
+    public void selectionChanged(SelectionChangedEvent event)
+    {
+      if (event.getSelectionProvider() != getTreeViewer())
+      {
+        getTreeViewer().setSelection(event.getSelection(), true);
+      }
+    }
+  }
+  class TreeSelectionChangeListener implements ISelectionChangedListener
+  {
+    public void selectionChanged(SelectionChangedEvent event)
+    {
+      if (selectionManager != null)
+      {
+        ISelection selection = event.getSelection();
+        if (selection instanceof IStructuredSelection)
+        {
+          IStructuredSelection structuredSelection = (IStructuredSelection) selection;
+          Object o = structuredSelection.getFirstElement();
+          // TODO ...
+          // we need to implement a selectionManagerMapping extension point
+          // so that extensions can specify how they'd like to map view objects
+          // to selection objects
+          //                                        
+          if (o instanceof Element)
+          {
+            try
+            {
+              Object modelObject = xsdTextEditor.getXSDSchema().getCorrespondingComponent((Element) o);
+              if (modelObject != null)
+              {
+                o = modelObject;
+              }
+            }
+            catch (Exception e)
+            {
+            }
+          }
+          else if (o instanceof CategoryAdapter)
+          {
+            // todo... we need to ensure we eliminate the propagation 
+            // of 'view' specific objects into the SelectionManager.                     
+            // We need to do some work to ensure all views utilize the 'Category' model object  
+            // so we can get rid of this CategoryAdapter class.
+//             CategoryAdapter adapter = (CategoryAdapter) o;
+//             o = adapter.getXSDSchema();
+          }
+          if (o != null)
+          {
+            selectionManager.setSelection(new StructuredSelection(o), getTreeViewer());
+          }
+          else
+          {
+            //            selectionManager.setSelection(new StructuredSelection(),
+            // getTreeViewer());
+          }
+        }
+      }
+    }
+  }
+  FilterAction referenceAction, inheritedAction;
+
+  public void setActionBars(IActionBars actionBars)
+  {
+    super.setActionBars(actionBars);
+    // Uncomment to add sort action
+    //    SortAction sortAction = new SortAction();
+    //
+    //    actionBars.getToolBarManager().add(sortAction);
+    //    sortAction.setChecked(false);
+    referenceAction = new FilterAction(new ReferenceFilter("Reference Content"), XSDEditorPlugin.getXSDString("_UI_OUTLINE_SHOW_REFERENCES"), ImageDescriptor.createFromFile(XSDEditorPlugin
+        .getPlugin().getClass(), "icons/XSDElementRef.gif"));
+    boolean initialRef = xsdTextEditor.getXSDModelAdapterFactory().getShowReferences();
+    referenceAction.setChecked(initialRef);
+    inheritedAction = new FilterAction(new ReferenceFilter("Inherited Content"), XSDEditorPlugin.getXSDString("_UI_OUTLINE_SHOW_INHERITED"), ImageDescriptor.createFromFile(XSDEditorPlugin.getPlugin()
+        .getClass(), "icons/XSDComplexContent.gif"));
+    boolean initialInherited = xsdTextEditor.getXSDModelAdapterFactory().getShowReferences();
+    IMenuManager menu = actionBars.getMenuManager();
+    menu.add(referenceAction);
+    menu.add(inheritedAction);
+  }
+
+  private void updateActions(Action current)
+  {
+    if (referenceAction.isChecked())
+    {
+      xsdTextEditor.getXSDModelAdapterFactory().setShowReferences(true);
+    }
+    else
+    {
+      xsdTextEditor.getXSDModelAdapterFactory().setShowReferences(false);
+    }
+    if (inheritedAction.isChecked())
+    {
+      xsdTextEditor.getXSDModelAdapterFactory().setShowInherited(true);
+    }
+    else
+    {
+      xsdTextEditor.getXSDModelAdapterFactory().setShowInherited(false);
+    }
+  }
+  private Sorter sorter = new Sorter();
+  public class Sorter extends org.eclipse.jface.viewers.ViewerSorter
+  {
+  }
+  public class SortAction extends Action
+  {
+    public SortAction()
+    {
+      super("Sort", ImageDescriptor.createFromFile(XSDEditorPlugin.getPlugin().getClass(), "icons/sort.gif"));
+    }
+
+    public void run()
+    {
+      getTreeViewer().getControl().setVisible(false);
+      Object[] expandedElements = getTreeViewer().getExpandedElements();
+      getTreeViewer().setSorter(isChecked() ? sorter : null);
+      Object input = getTreeViewer().getInput();
+      getTreeViewer().setInput(input);
+      getTreeViewer().setExpandedElements(expandedElements);
+      getTreeViewer().getControl().setVisible(true);
+    }
+
+    public void setChecked(boolean checked)
+    {
+      super.setChecked(checked);
+      setToolTipText(checked ? XSDEditorPlugin.getXSDString("_UI_OUTLINE_DO_NOT_SORT") : XSDEditorPlugin.getXSDString("_UI_OUTLINE_SORT"));
+    }
+  }
+  public class FilterAction extends Action
+  {
+    ViewerFilter filter;
+
+    public FilterAction(ViewerFilter filter, String label, ImageDescriptor image)
+    {
+      super(label, image);
+      this.filter = filter;
+      setChecked(false);
+    }
+
+    public void run()
+    {
+      updateActions(this);
+      if (isChecked())
+      {
+        getTreeViewer().resetFilters();
+        getTreeViewer().addFilter(filter);
+      }
+      else
+      {
+        getTreeViewer().removeFilter(filter);
+      }
+    }
+  }
+  class ReferenceFilter extends ViewerFilter // Dummy filter
+  {
+    public ReferenceFilter(String elementTag)
+    {
+      this.elementTag = elementTag;
+    }
+    protected String elementTag;
+
+    public boolean select(Viewer viewer, Object parentElement, Object element)
+    {
+      return true;
+    }
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditor.java
new file mode 100644
index 0000000..9f436f4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditor.java
@@ -0,0 +1,1140 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+
+import java.util.ArrayList;
+import java.util.EventObject;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+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.URI;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.internal.editors.text.JavaFileEditorInput;
+import org.eclipse.ui.views.properties.PropertySheet;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertySheetPageContributor;
+import org.eclipse.wst.sse.core.INodeAdapter;
+import org.eclipse.wst.sse.core.INodeNotifier;
+import org.eclipse.wst.sse.core.IStructuredModel;
+import org.eclipse.wst.sse.core.exceptions.SourceEditingRuntimeException;
+import org.eclipse.wst.sse.core.internal.nls.ResourceHandler;
+import org.eclipse.wst.sse.core.internal.undo.StructuredTextUndoManager;
+import org.eclipse.wst.sse.core.undo.IStructuredTextUndoManager;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.internal.document.XMLModelImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphViewer;
+import org.eclipse.wst.xsd.ui.internal.util.OpenOnSelectionHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDPackage;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.impl.XSDSchemaImpl;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.ProcessingInstruction;
+
+// public class XSDEditor extends StructuredTextMultiPageEditorPart
+public class XSDEditor extends XSDMultiPageEditorPart implements ITabbedPropertySheetPageContributor
+{
+  protected XSDTextEditor textEditor;
+  IFile resourceFile;
+  XSDSelectionManager xsdSelectionManager;
+
+  private IStructuredModel result;
+  private XMLModelImpl model;
+
+  public XSDEditor()
+  {
+    super();
+    xsdSelectionManager = new XSDSelectionManager();
+  }
+
+  InternalPartListener partListener = new InternalPartListener(this);
+  
+  // show outline view - defect 266116
+  public void init(IEditorSite site, IEditorInput editorInput) throws PartInitException
+  {
+    super.init(site, editorInput);
+    
+    IWorkbenchWindow dw=PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+    IWorkbenchPage page=dw.getActivePage();
+    getSite().getPage().addPartListener(partListener);
+    try
+    {
+      if (page != null)
+      {
+//      page.showView("org.eclipse.ui.views.ContentOutline");
+        page.showView("org.eclipse.ui.views.PropertySheet");
+      }
+    } catch (PartInitException e) 
+    {
+//       e.printStackTrace();
+    }      
+   }
+  
+  // For team support
+  //  protected PropertyDirtyChangeListener propertyChangeListener;
+
+  /**
+   * Creates the pages of this multi-page editor.
+   * <p>
+   * Subclasses of <code>MultiPageEditor</code> must implement this method.
+   * </p>
+   */
+  protected void createPages()
+  {
+    try
+    {
+      if (!loadFile())
+        return;
+
+      // source page MUST be created before design page, now
+      createSourcePage();
+
+      addSourcePage();
+      buildXSDModel();
+
+      // comment this line out to hide the graph page 
+      // 
+      createAndAddGraphPage();
+
+      int pageIndexToShow = getDefaultPageTypeIndex();
+      setActivePage(pageIndexToShow);
+      
+      addCommandStackListener();
+      
+      XSDEditorPlugin.getPlugin().getPreferenceStore().addPropertyChangeListener(preferenceStoreListener);
+    }
+    catch (PartInitException exception)
+    {
+      throw new SourceEditingRuntimeException(ResourceHandler.getString("An_error_has_occurred_when1_ERROR_")); //$NON-NLS-1$ = "An error has occurred when initializing the input for the the editor's source page."
+    }
+  }
+
+  public String[] getPropertyCategories()
+  {
+    return new String[] { "general", "namespace", "other", "attributes", "documentation", "facets" }; //$NON-NLS-1$
+  }
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySheetPageContributor#getContributorId()
+	 */ 
+  public String getContributorId()
+	{
+    return "org.eclipse.wst.xsd.ui.internal.XSDEditor";
+    //return getSite().getId();
+  }
+
+  protected CommandStackListener commandStackListener;
+  protected void addCommandStackListener()
+  {
+    if (commandStackListener == null)
+    {
+      IStructuredTextUndoManager undoManager = getModel().getUndoManager();
+        commandStackListener = new CommandStackListener()
+        {
+          /**
+           * @see org.eclipse.emf.common.command.CommandStackListener#commandStackChanged(EventObject)
+           */
+          public void commandStackChanged(EventObject event)
+          {
+            Object obj = event.getSource();
+            if (obj instanceof BasicCommandStack)
+            {
+              BasicCommandStack stack = (BasicCommandStack) obj;
+              Command recentCommand = stack.getMostRecentCommand();
+              Command redoCommand = stack.getRedoCommand();
+              Command undoCommand = stack.getUndoCommand();
+              if (recentCommand == redoCommand)
+              {
+                // there must have been an undo reset info tasks 
+                resetInformationTasks();
+              }
+            }
+          }
+        };
+
+//TODO WTP Port        undoManager.getCommandStack().addCommandStackListener(commandStackListener);
+      
+    }
+  } 
+
+  protected void pageChange(int arg)
+  {
+    super.pageChange(arg);
+  }
+
+  protected void removeCommandStackListener()
+  {
+    if (commandStackListener != null)
+    {
+      IStructuredTextUndoManager undoManager = getModel().getUndoManager();
+//TODO WTP Port      undoManager.getCommandStack().removeCommandStackListener(commandStackListener);
+    }
+  }
+
+  // This is from the IValidateEditEditor interface
+/*  public void undoChange()
+  {
+    StructuredTextUndoManager undoManager = textEditor.getModel().getUndoManager();   
+    undoManager.undo();
+    // Make the editor clean
+    textEditor.getModel().setDirtyState(false);
+  } */
+
+  private class PreferenceStoreListener implements IPropertyChangeListener
+  {
+    /**
+     * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(PropertyChangeEvent)
+     */
+    public void propertyChange(PropertyChangeEvent event)
+    {
+    }
+  }
+
+  protected IPropertyChangeListener preferenceStoreListener = new PreferenceStoreListener();
+
+  protected int getDefaultPageTypeIndex()
+  {
+    int pageIndex = sourcePageIndex;
+    
+    if (XSDEditorPlugin.getPlugin().getDefaultPage().equals(XSDEditorPlugin.GRAPH_PAGE))
+    {
+      if (graphPageIndex != -1)
+        pageIndex = graphPageIndex;
+    }
+    
+    return pageIndex;
+  }
+      
+	int currentPage = -1;      
+	public String getCurrentPageType()
+	{
+		// should update pref. for valid pages
+		if (getActivePage() != -1)
+		{
+			currentPage = getActivePage();
+		}
+		if (currentPage == graphPageIndex)
+		{
+			return XSDEditorPlugin.GRAPH_PAGE;
+		}
+		else
+		{
+			return XSDEditorPlugin.SOURCE_PAGE;
+    }
+	}
+	
+	public Object getActivePart()
+  {
+		return getSite().getWorkbenchWindow().getActivePage().getActivePart();	
+	}
+
+  public void dispose()
+  {
+//    propertyChangeListener.dispose();
+    removeCommandStackListener();
+    
+    XSDEditorPlugin.getPlugin().setDefaultPage(getCurrentPageType());
+    XSDEditorPlugin.getPlugin().getPreferenceStore().removePropertyChangeListener(preferenceStoreListener);
+    
+    getSite().getPage().removePartListener(partListener);
+
+    super.dispose();
+  }
+
+  protected boolean loadFile()
+  {
+    Object input = getEditorInput();
+
+    if (input instanceof IFileEditorInput)
+    {
+      resourceFile = ((IFileEditorInput) input).getFile();
+    }
+    else if (input instanceof JavaFileEditorInput)
+    {
+      IPath path = ((JavaFileEditorInput)input).getPath(input);
+      String ext = path.getFileExtension();
+      if (ext != null && ext.equals("xsd"))
+      {
+        return true;
+      }
+      return false;
+    }
+    else
+    {
+//      XSDEditorPlugin.getPlugin().getMsgLogger().write("###Error...XSDEditor::createPages() .. Can't find input..Exiting..");
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Method openOnGlobalReference.
+   * The comp argument is a resolved xsd schema object from another file.  This is created and called from another
+   * schema model to allow F3 navigation to open a new editor and choose the referenced object within that editor context
+   * @param comp
+   */
+  public void openOnGlobalReference(XSDConcreteComponent comp)
+  {
+    openOnSelectionHelper.openOnGlobalReference(comp);
+  }
+  
+  protected OpenOnSelectionHelper openOnSelectionHelper;
+
+  public OpenOnSelectionHelper getOpenOnSelectionHelper()
+  {
+    return openOnSelectionHelper;
+  }
+  
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.XSDMultiPageEditorPart#createTextEditor()
+   */
+  protected StructuredTextEditor createTextEditor()
+  {
+    return new XSDTextEditor(this);
+  }
+
+  /*
+   * @see StructuredTextMultiPageEditorPart#createSourcePage()
+   */
+  protected void createSourcePage() throws PartInitException
+  {
+    super.createSourcePage();
+    
+    textEditor = (XSDTextEditor) getTextEditor();
+
+		openOnSelectionHelper = new OpenOnSelectionHelper(textEditor);
+  }
+ 
+  int sourcePageIndex = -1;
+  /**
+   * Adds the source page of the multi-page editor.
+   */
+  protected void addSourcePage() throws PartInitException {
+  
+    sourcePageIndex = addPage(textEditor, getEditorInput());
+    setPageText(sourcePageIndex, XSDEditorPlugin.getXSDString("_UI_TAB_SOURCE"));
+
+    // defect 223043 ... do textEditor.setModel() here instead of in createSourcePage()
+		// the update's critical, to get viewer selection manager and highlighting to work
+    IEditorInput editorInput = getEditorInput();
+    if (editorInput instanceof IFileEditorInput)
+    {
+      textEditor.setModel((IFileEditorInput)getEditorInput());
+    }
+    else
+    {
+//      textEditor.setModel(editorInput);
+    }
+    textEditor.update();
+		firePropertyChange(PROP_TITLE);
+  }                       
+
+  int graphPageIndex = -1;            
+  XSDGraphViewer graphViewer;
+
+  /**
+   * Creates the graph page and adds it to the multi-page editor.
+   */
+  protected void createAndAddGraphPage() throws PartInitException 
+  {                         
+    graphViewer = new XSDGraphViewer(this);                              
+    graphViewer.setSchema(xsdSchema);
+    Control graphControl = graphViewer.createControl(getContainer());
+    graphPageIndex = addPage(graphControl);
+    setPageText(graphPageIndex, XSDEditorPlugin.getXSDString("_UI_TAB_GRAPH"));
+
+    // graphViewer.setViewerSelectionManager(textEditor.getViewerSelectionManager());    
+    graphViewer.setSelectionManager(getSelectionManager());
+    
+    // this forces the editor to initially select the top level schema object
+    //
+    getSelectionManager().setSelection(new StructuredSelection(textEditor.getXSDSchema()));    
+  }
+
+  /*
+   * @see IAdaptable#getAdapter(Class)
+   */
+  public Object getAdapter(Class key)
+  {
+    Object result = null;
+    if (key == ISelectionProvider.class)
+    {
+      result = xsdSelectionManager;
+    }
+    else 
+    {
+      result = textEditor.getAdapter(key);
+    }
+    return result;
+  }
+
+  public XSDSelectionManager getSelectionManager()
+  {
+    return xsdSelectionManager;
+  }
+ 
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.XSDMultiPageEditorPart#doSaveAs()
+   */
+  public void doSaveAs()
+  {
+    super.doSaveAs();
+  }
+
+  public void doSave(org.eclipse.core.runtime.IProgressMonitor monitor)
+  {
+    super.doSave(monitor);
+  }
+
+  protected XSDSchema xsdSchema;
+  protected ResourceSet resourceSet;
+
+  public void reparseSchema()
+  {
+    Document document  = ((XMLModel)getModel()).getDocument();
+    createSchema(document.getDocumentElement());
+  }
+  
+  public XSDSchema createSchema(Node node)
+  {
+    try
+    {
+      EPackage.Registry reg = EPackage.Registry.INSTANCE; 
+      XSDPackage xsdPackage = (XSDPackage)reg.getEPackage(XSDPackage.eNS_URI);
+      xsdSchema = xsdPackage.getXSDFactory().createXSDSchema();
+      
+      // Force the loading of the "meta" schema for schema instance instance.
+      //
+      String schemaForSchemaNamespace = node.getNamespaceURI();
+      XSDSchemaImpl.getSchemaForSchema(schemaForSchemaNamespace);
+
+      resourceSet = XSDSchemaImpl.createResourceSet();
+      resourceSet.setURIConverter(new XSDURIConverter(resourceFile));
+
+      String pathName = "";
+      // If the resource is in the workspace....
+      // otherwise the user is trying to open an external file
+      if (resourceFile != null)
+      {
+        pathName = resourceFile.getFullPath().toString();
+        Resource resource = resourceSet.getResource(URI.createPlatformResourceURI(pathName), true);
+//      resource.getContents().add(xsdSchema);
+        resourceSet.getResources().add(resource);
+      
+        Object obj = resource.getContents().get(0);
+        if (obj instanceof XSDSchema)
+        {
+          xsdSchema = (XSDSchema)obj;
+        }
+
+//      URIConverter uriConverter = resourceSet.getURIConverter();
+//      resourceSet.setURIConverter(new XSDURIConverter(resourceFile));
+ 
+        xsdSchema.setElement((Element)node);
+        resource.setModified(false);
+      }
+      else
+      {
+        xsdSchema.setElement((Element)node);
+      }
+    }
+    catch (StackOverflowError e)
+    {
+//      XSDEditorPlugin.getPlugin().getMsgLogger().write("Stack overflow encountered.  Possibly an invalid recursive circular schema");
+    }
+    catch (Exception ex)
+    {
+//      ex.printStackTrace();
+    }
+    
+    return xsdSchema;
+  }
+
+  class XSDDocumentAdapter extends DocumentAdapter
+  {
+  	INodeNotifier currentNotifier;
+  	int currentEventType;
+  	
+		public XSDDocumentAdapter(Document document)
+		{
+			super(document);
+		}
+
+		boolean handlingNotifyChanged = false;
+
+		public void notifyChanged(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index)
+		{
+			if (eventType == INodeNotifier.REMOVE) // don't handle remove events
+			{
+				return;
+			}
+
+			if (!handlingNotifyChanged)
+			{
+				handlingNotifyChanged = true;
+				try
+				{
+					// delay handle events only in the source view
+					if (getCurrentPageType() == XSDEditorPlugin.SOURCE_PAGE &&
+							!(getActivePart() instanceof PropertySheet) && 
+							!(getActivePart() instanceof org.eclipse.ui.views.contentoutline.ContentOutline)) {
+						startDelayedEvent(notifier, eventType, feature, oldValue, newValue, index);
+				    //handleNotifyChange(notifier, eventType, feature, oldValue, newValue, index);
+					}
+					else // all other views, just handle the events right away
+					{
+						handleNotifyChange(notifier, eventType, feature, oldValue, newValue, index);
+					}
+				}
+				catch (Exception e)
+				{
+//					XSDEditorPlugin.getPlugin().getMsgLogger().write(e);
+				}
+				handlingNotifyChanged = false;
+			}
+		}
+
+		public void handleNotifyChange(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index)
+		{
+//			System.out.println(eventType + " : HandleNotifyChange " + notifier.hashCode() + " notifier " + notifier);
+			switch (eventType)
+			{
+				case INodeNotifier.ADD:
+				{
+					if (newValue instanceof Element)
+					{
+						adapt((Element)newValue);
+//	Add			updateParentForDerivation(node, listener);
+					}
+					break;
+				}
+				case INodeNotifier.CHANGE:
+				{
+					Node node = (Node)notifier;
+			    XSDConcreteComponent listener = xsdSchema.getCorrespondingComponent(node);
+  		    listener.elementAttributesChanged((Element)node);
+    	    listener.elementChanged((Element)node);
+    	    break;
+				}
+				case INodeNotifier.STRUCTURE_CHANGED:
+				case INodeNotifier.CONTENT_CHANGED:
+				{
+					Node node = (Node)notifier;
+					XSDConcreteComponent listener = xsdSchema.getCorrespondingComponent(node);
+					if (node.getNodeType() == Node.ELEMENT_NODE)
+					{
+						listener.elementContentsChanged((Element)node);
+						break;
+					}
+					else if (node.getNodeType() == Node.DOCUMENT_NODE)
+					{
+						Element docElement = ((Document)node).getDocumentElement();
+						// Need to add check if doc element is being edited in the source
+						if (docElement != null)
+					  {
+						  String prefix = docElement.getPrefix();
+						  String xmlnsString = prefix == null? "xmlns" : "xmlns:" + prefix;
+						  Attr attr = docElement.getAttributeNode(xmlnsString);
+						  boolean doParse = false;
+						  if (attr != null)
+						  {
+						    if (attr.getValue().equals("http://www.w3.org/2001/XMLSchema") && docElement.getLocalName().equals("schema"))
+						    {
+						      // We have a viable schema so parse it
+						      doParse = true;
+						    }
+						  }
+						  
+							if (doParse)
+							{
+					      adapt(docElement);
+ 						    xsdSchema.setElement(docElement);
+							}
+					  }
+					}
+					break;
+				}
+			}
+		}
+
+		protected DelayedEvent delayedTask;
+		protected void startDelayedEvent(INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index)
+		{
+//			System.out.println("start delayed event");
+      // check if there is already a delayed task for the same notifier and eventType
+//			if (delayedTask != null)
+//			{
+//  			Notifier aNotifier = delayedTask.getNotifier();
+//	  		int anEventType = delayedTask.getEventType();
+//  			if (notifier == aNotifier && anEventType == eventType)
+//			  {
+//				  // same event, just different data, delay new event
+//				  delayedTask.setCancel(true);
+//			  }
+//			}
+
+			delayedTask = new DelayedEvent();
+
+			delayedTask.setNotifier(notifier);
+			delayedTask.setEventType(eventType);
+			delayedTask.setFeature(feature);
+			delayedTask.setOldValue(oldValue);
+			delayedTask.setNewValue(newValue);
+			delayedTask.setIndex(index);
+
+			Display.getDefault().timerExec(400,delayedTask);
+		}
+
+		class DelayedEvent implements Runnable
+		{
+		  INodeNotifier notifier;
+			int eventType;
+			Object feature;
+			Object oldValue;
+			Object newValue;
+			int index;
+			boolean cancelEvent = false;
+
+			/*
+			 * @see Runnable#run()
+			 */
+			public void run()
+			{
+				if (!cancelEvent)
+				{
+				  handleNotifyChange(notifier, eventType, feature, oldValue, newValue, index);
+				  if (delayedTask == this)
+				  {
+				  	delayedTask = null;
+				  }
+				}
+			}
+			
+			public void setCancel(boolean flag)
+			{
+				cancelEvent = flag;
+			}
+
+			public void setNotifier(INodeNotifier notifier)
+			{
+				this.notifier = notifier;
+			}
+		
+			public void setEventType(int eventType)
+			{
+				this.eventType = eventType;
+			}
+
+			public void setFeature(Object feature)
+			{
+				this.feature = feature;
+			}
+
+			public void setOldValue(Object oldValue)
+			{
+				this.oldValue = oldValue;			
+			}
+
+			public void setNewValue(Object newValue)
+			{
+				this.newValue = newValue;
+			}
+
+			public void setIndex(int index)
+			{
+				this.index = index;			
+			}
+
+			public INodeNotifier getNotifier()
+			{
+				return notifier;
+			}
+
+			public int getEventType()
+			{
+				return eventType;
+			}
+
+			public Object getNewValue()
+			{
+				return newValue;
+			}
+
+			public Object getOldValue()
+			{
+				return oldValue;
+			}
+
+		}
+  }
+
+  abstract class DocumentAdapter implements INodeAdapter
+  {
+    public DocumentAdapter(Document document)
+    {
+      ((INodeNotifier)document).addAdapter(this);
+      adapt(document.getDocumentElement());
+    }
+
+    public void adapt(Element element)
+    {
+      if (((INodeNotifier)element).getExistingAdapter(this) == null)
+      {
+
+        ((INodeNotifier)element).addAdapter(this);
+
+        for (Node child = element.getFirstChild(); child != null; child = child.getNextSibling())
+        {
+          if (child.getNodeType() == Node.ELEMENT_NODE)
+          {
+            adapt((Element)child);
+          }
+        }
+      }
+    }
+
+    public boolean isAdapterForType(Object type)
+    {
+      return type == this;
+    }
+
+    abstract public void notifyChanged
+      (INodeNotifier notifier, int eventType, Object feature, Object oldValue, Object newValue, int index);
+  }
+
+
+  /**
+   * Method createDefaultSchemaNode.  Should only be called to insert a schema node into an empty document
+   */
+  public void createDefaultSchemaNode()
+  {
+    Document document  = ((XMLModel)getModel()).getDocument();
+    if (document.getChildNodes().getLength() == 0)
+    {
+      // if it is a completely empty file, then add the encoding and version processing instruction
+//TODO  String encoding = EncodingHelper.getDefaultEncodingTag();
+      String encoding = "UTF-8";
+      ProcessingInstruction instr = document.createProcessingInstruction("xml", "version=\"1.0\" encoding=\"" + encoding + "\"");
+      document.appendChild(instr);
+    }
+
+    // Create a default schema tag now
+
+    // String defaultPrefixForTargetNamespace = getFileResource().getProjectRelativePath().removeFileExtension().lastSegment();
+    String defaultPrefixForTargetNamespace = "tns";
+    String prefixForSchemaNamespace = "";
+    String schemaNamespaceAttribute = "xmlns";
+    if (XSDEditorPlugin.getPlugin().isQualifyXMLSchemaLanguage())
+    {
+      // Added this if check before disallowing blank prefixes in the preferences...
+      // Can take this out.  See also NewXSDWizard
+      if (XSDEditorPlugin.getPlugin().getXMLSchemaPrefix().trim().length() > 0)
+      {
+        prefixForSchemaNamespace = XSDEditorPlugin.getPlugin().getXMLSchemaPrefix() + ":";
+        schemaNamespaceAttribute += ":" + XSDEditorPlugin.getPlugin().getXMLSchemaPrefix();
+      }
+    }
+    
+    document.appendChild(document.createTextNode("\n"));
+    Element element = document.createElement(prefixForSchemaNamespace + XSDConstants.SCHEMA_ELEMENT_TAG);
+    
+    element.setAttribute(schemaNamespaceAttribute,"http://www.w3.org/2001/XMLSchema");
+    
+    String defaultTargetURI = XSDEditorPlugin.getPlugin().getXMLSchemaTargetNamespace();
+    element.setAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE, defaultTargetURI);
+    element.setAttribute("xmlns:" + defaultPrefixForTargetNamespace, defaultTargetURI);
+    
+    document.appendChild(element);
+  }
+  
+  public void buildXSDModel()
+  {
+    try
+    {
+      Document document  = ((XMLModel)getModel()).getDocument();
+      if (document.getChildNodes().getLength() == 0)
+      {
+        // this is an empty document.  Create a default schema tag now
+        createDefaultSchemaNode();
+      }
+
+      createSchema(document.getDocumentElement());
+
+			XSDDocumentAdapter documentAdapter =
+				new XSDDocumentAdapter(((XMLModel)getModel()).getDocument());
+    }
+    catch (Exception e)
+    {
+//      XSDEditorPlugin.getPlugin().getMsgLogger().write("Failed to create Model");
+//      XSDEditorPlugin.getPlugin().getMsgLogger().write(e);
+//      e.printStackTrace();
+    }
+
+
+
+//      XSDResourceFactoryImpl.validate(xsdSchema, input.getFile().getContents(true));
+  }
+
+//  private void updateParentForDerivation(Node node, XSDConcreteComponent correspondingComponent)
+//  {
+//    if (XSDDOMHelper.inputEquals(node, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false)||
+//        XSDDOMHelper.inputEquals(node,XSDConstants.COMPLEXCONTENT_ELEMENT_TAG,false))
+//    {
+//      XSDComplexTypeDefinition xsdComplexTypeDefinition =
+//        correspondingComponent.getContainer() instanceof XSDComplexTypeDefinition ? 
+//          (XSDComplexTypeDefinition)correspondingComponent.getContainer() :
+//          null;
+//      if (xsdComplexTypeDefinition != null)
+//      {
+//        xsdComplexTypeDefinition.elementContentsChanged(xsdComplexTypeDefinition.getElement());
+//      }
+//    }
+//  }    
+
+//  private void checkUnion(Node node, XSDConcreteComponent correspondingComponent, int i)
+//  {
+//    // bug 219967 - union changes to restriction
+//    if (XSDDOMHelper.inputEquals(node, XSDConstants.UNION_ELEMENT_TAG, false))
+//    {
+////      XSDConcreteComponent comp = correspondingComponent.getContainer();
+////      if (comp != null)
+////      {
+////        switch (i)
+////        {
+////          case 1:
+////            comp.elementAttributesChanged((Element)node);
+////            break;
+////          case 4:
+////            comp.elementContentsChanged((Element)node);
+////            break;
+////        }
+////      }
+//    }
+//    else
+//    {
+//      switch (i)
+//      {
+//        case 1:
+//        case 4:
+//          // do both types of updates since sometimes the attributes have changed indirectly
+//          // because the content has changed
+//          correspondingComponent.elementAttributesChanged((Element)node);
+//          correspondingComponent.elementContentsChanged((Element)node);
+//          break;
+//      }
+//    }
+//  }
+  
+//  private void updateMap(XSDConcreteComponent listener, Element documentElement)
+//  {
+//    boolean handleChangeInSchema = false;
+//    if (listener instanceof XSDSchema)
+//    {
+//      if (!handleChangeInSchema)
+//      {
+//        handleChangeInSchema = true;
+//        XSDSchema xsdSchema = (XSDSchema)listener;
+//        java.util.Map prefixToNameSpaceMap = xsdSchema.getQNamePrefixToNamespaceMap();
+//        String targetNamespace = xsdSchema.getTargetNamespace();
+////        System.out.println("targetNamespace = " + targetNamespace);
+//
+//        NamedNodeMap attributes = documentElement.getAttributes();
+//        int length = attributes.getLength();
+//        
+//        ArrayList keyList = new ArrayList();
+//        keyList.addAll(prefixToNameSpaceMap.keySet());
+//        
+//        String key;
+//
+//
+//        // update the map when the prefix is changed
+//        CHECK: for (int i = 0; i < length; i++)
+//        {
+//          Attr attr = (Attr)attributes.item(i);
+//          String name = attr.getNodeName();
+//          
+//          if (isValidXMLNSAttribute(name))
+////          if (name.startsWith("xmlns"))
+//          {
+//            String value = attr.getNodeValue();
+//            if (value == null)
+//            {
+//              break CHECK;
+//            }
+//            int index = name.indexOf(":");
+//            key  = index == -1 ? null : name.substring(index + 1);
+////            System.out.println(" Attribute key is " + key + " , value = " + value);
+////            System.out.println("   map.get(key) = " + prefixToNameSpaceMap.get(key));
+//            if (!prefixToNameSpaceMap.containsKey(key))
+//            {
+//              for (Iterator iter = keyList.iterator(); iter.hasNext(); )
+//              {
+//                String aPrefix = (String)iter.next();
+////                System.out.println("    --> A Map Prefix is " + aPrefix);
+////                System.out.println("    --> model map.get(prefix) " + prefixToNameSpaceMap.get(aPrefix));
+//                if (prefixToNameSpaceMap.get(aPrefix) != null)
+//                {
+//                  if (prefixToNameSpaceMap.get(aPrefix).equals(value))
+//                  {
+//                    prefixToNameSpaceMap.remove(aPrefix);
+//                  }
+//                }
+//              }
+//            }
+//            else if (prefixToNameSpaceMap.containsKey(key))
+//            {
+//              if (prefixToNameSpaceMap.get(key) != null)
+//              {
+//                if (!prefixToNameSpaceMap.get(key).equals(value))
+//                {
+//                  Set entrySet = prefixToNameSpaceMap.entrySet();
+//                  for (Iterator iter = entrySet.iterator(); iter.hasNext(); )
+//                  {
+//                    Map.Entry aMapEntry = (Map.Entry)iter.next();
+//                    if (  (key != null && (aMapEntry.getKey() != null && aMapEntry.getKey().equals(key)))
+//                           || (key == null && (aMapEntry.getKey() == null)))
+//                    {
+//                      aMapEntry.setValue(value);
+//                    }
+//                  }
+//                }
+//              }
+//              else
+//              {
+//                Set entrySet = prefixToNameSpaceMap.entrySet();
+//                for (Iterator iter = entrySet.iterator(); iter.hasNext(); )
+//                {
+//                  Map.Entry aMapEntry = (Map.Entry)iter.next();
+//                  if (  (key != null && (aMapEntry.getKey() != null && aMapEntry.getKey().equals(key)))
+//                         || (key == null && (aMapEntry.getKey() == null)))
+//                  {
+//                    aMapEntry.setValue(value);
+//                  }
+//                }
+//              }
+//            }
+//          }
+//        }
+//        
+//        boolean modelMapPrefixFound = false;
+//        for (Iterator iter = keyList.iterator(); iter.hasNext(); )
+//        {
+//          String aPrefix = (String)iter.next();
+//          modelMapPrefixFound = false;
+//          attributes = documentElement.getAttributes();
+//          length = attributes.getLength();
+//
+//          for (int i = 0; i < length; i++)
+//          {
+//            Attr attr = (Attr)attributes.item(i);
+//            if (attr != null)
+//            {
+//              String name = attr.getNodeName();
+//            
+//              // if (name.startsWith("xmlns"))
+//              if (isValidXMLNSAttribute(name))
+//              {
+//                String value = attr.getNodeValue();
+//                int index = name.indexOf(":");
+//                key  = index == -1 ? null : name.substring(index + 1);
+//                if (aPrefix == null && key == null)
+//                {
+//                  modelMapPrefixFound = true;
+//                }
+//                else if (aPrefix != null && (aPrefix.equals(key)))
+//                {
+//                  modelMapPrefixFound = true;
+//                  if ((prefixToNameSpaceMap.get(key) != null && !prefixToNameSpaceMap.get(key).equals(value))
+//                       || (prefixToNameSpaceMap.get(key) == null && value != null))
+//                  {
+//                    if (value != null && value.length() > 0)
+//                    {
+//                      prefixToNameSpaceMap.put(aPrefix, value);
+//                    }
+//                  }
+//                }
+//                else if (key != null && (key.equals(aPrefix)))
+//                {
+//                  modelMapPrefixFound = true;
+//                }
+//              }
+//            }
+//          }
+//          if (!modelMapPrefixFound)
+//          {
+//            prefixToNameSpaceMap.remove(aPrefix);
+//          }
+//        }
+//       
+//        // to ensure map is recreated
+////        XSDSchemaHelper.updateElement(xsdSchema);        
+////        reparseSchema();
+//
+//        handleChangeInSchema = false;
+//
+////        System.out.println("XSDeditor Map is " + prefixToNameSpaceMap.values());
+////        System.out.println("XSDeditor Map keys are " + prefixToNameSpaceMap.keySet());
+//        
+//      }
+//    }
+//  }
+
+  /**
+   * Returns the xsdSchema.
+   * @return XSDSchema
+   */
+  public XSDSchema getXSDSchema()
+  {
+    return xsdSchema;
+  }
+
+
+  /**
+   * Returns the resourceFile.
+   * @return IFile
+   */
+  public IFile getFileResource()
+  {
+    return resourceFile;
+  }
+
+  /**
+   * Get the IDocument from the text viewer
+   */
+  public IDocument getEditorIDocument()
+  {
+    IDocument document = textEditor.getTextViewer().getDocument();
+    return document;
+  }
+
+  /**
+   * Create ref integrity tasks in task list
+   */
+  public void createTasksInTaskList(ArrayList messages)
+  {
+//    DisplayErrorInTaskList tasks = new DisplayErrorInTaskList(getEditorIDocument(), getFileResource(), messages);
+//    tasks.run();
+  }
+
+  public void resetInformationTasks()
+  {
+// DisplayErrorInTaskList.removeInfoMarkers(getFileResource());
+  }
+  
+  public XSDGraphViewer getGraphViewer()
+  {
+    return graphViewer;
+  }
+
+//  /**
+//   * @see org.eclipse.ui.part.MultiPageEditorPart#handlePropertyChange(int)
+//   */
+//  protected void handlePropertyChange(int propertyId)
+//  {
+//    super.handlePropertyChange(propertyId);
+//    
+//    if (propertyId == IEditorPart.PROP_INPUT)
+//    {
+//      setInput(textEditor.getEditorInput());
+//      resourceFile = ((IFileEditorInput) getEditorInput()).getFile();
+//      setTitle(resourceFile.getName());
+////      outline.setModel(getModel());
+//
+//      // even though we've set title etc., several times already!
+//      // only now is all prepared for it.
+//      firePropertyChange(IWorkbenchPart.PROP_TITLE);
+//      firePropertyChange(PROP_DIRTY);
+//    }
+//    else if (propertyId == IEditorPart.PROP_TITLE)
+//    {
+//      if (getEditorInput() != textEditor.getEditorInput())
+//      {
+//        setInput(textEditor.getEditorInput());
+//      }
+//    }    
+//  }
+
+  public IEditorPart getActiveEditorPage()
+  {
+    return getActiveEditor();
+  }
+  
+  public XSDTextEditor getXSDTextEditor()
+	{
+    return textEditor;
+  }
+
+	class InternalPartListener implements IPartListener
+	{
+	  XSDEditor editor;
+	  public InternalPartListener(XSDEditor editor)
+	  {
+	    this.editor = editor; 
+	  }
+	  
+		public void partActivated(IWorkbenchPart part)
+		{
+			if (part == editor)
+			{
+        ISelection selection = getSelectionManager().getSelection();
+        if (selection != null)
+        {
+          getSelectionManager().setSelection(selection);
+        }
+			}
+		}
+
+		public void partBroughtToTop(IWorkbenchPart part)
+		{
+		}
+
+		public void partClosed(IWorkbenchPart part)
+		{
+		}
+
+   
+		public void partDeactivated(IWorkbenchPart part)
+		{
+		}
+
+		public void partOpened(IWorkbenchPart part)
+		{
+		}
+	}
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorAdapter.java
new file mode 100644
index 0000000..7591376
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorAdapter.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.IDocument;
+
+public interface XSDEditorAdapter
+{
+  public IFile getFileResource();
+
+  public IDocument getEditorIDocument();
+
+  public void createTasksInTaskList(ArrayList messages);
+
+  public void resetInformationTasks();
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorContextIds.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorContextIds.java
new file mode 100644
index 0000000..8f95f5c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorContextIds.java
@@ -0,0 +1,460 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+
+/**
+ * Context help id constants.
+ */
+public interface XSDEditorContextIds 
+{
+  public static final String PLUGIN_NAME = "org.eclipse.wst.xsd.ui.internal";
+
+  /* CONTEXT_IDs New XSD Wizard uses the WizardNewFileCreationPage from org.eclipse.ui.dialogs */
+ 
+  /* CONTEXT_IDs for XSDEditor follow the xsdexxx context IDs */
+
+  /* CONTEXT_ID xsde0010 for XSD Editor Design View */
+  public static final String XSDE_SCHEMA_DESIGN_VIEW      = PLUGIN_NAME + ".xsde0010";
+  /* no CONTEXT_ID for File Name Text Edit (not editable) */
+  /* CONTEXT_ID xsde0020 for Version Text Edit */
+  public static final String XSDE_SCHEMA_VERSION          = PLUGIN_NAME + ".xsde0020";
+  /* CONTEXT_ID xsde0030 for Language Text Edit */
+  public static final String XSDE_SCHEMA_LANGUAGE         = PLUGIN_NAME + ".xsde0030";
+  /* CONTEXT_ID xsde0040 for Namespace Group */
+  public static final String XSDE_SCHEMA_NAMESPACE_GROUP  = PLUGIN_NAME + ".xsde0040";
+  /* CONTEXT_ID xsde0050 for Prefix Text Edit */
+  public static final String XSDE_SCHEMA_PREFIX           = PLUGIN_NAME + ".xsde0050";
+  /* CONTEXT_ID xsde0060 for Target namespace Text Edit */
+  public static final String XSDE_SCHEMA_TARGET_NAMESPACE = PLUGIN_NAME + ".xsde0060";
+  /* CONTEXT_ID xsde0070 for Apply Push Button */
+  public static final String XSDE_SCHEMA_APPLY            = PLUGIN_NAME + ".xsde0070";
+  /* CONTEXT_ID xsde0080 for Attribute form default Combo Box */
+  public static final String XSDE_SCHEMA_ATTRIBUTE        = PLUGIN_NAME + ".xsde0080";
+  /* CONTEXT_ID xsde0090 for Element form default Combo Box */
+  public static final String XSDE_SCHEMA_ELEMENT          = PLUGIN_NAME + ".xsde0090";
+  /* CONTEXT_ID xsde0100 for Block default Combo Box */
+  public static final String XSDE_SCHEMA_BLOCK            = PLUGIN_NAME + ".xsde0100";
+  /* CONTEXT_ID xsde0110 for Final Default Combo Box */
+  public static final String XSDE_SCHEMA_FINAL            = PLUGIN_NAME + ".xsde0110";
+
+  
+  /* CONTEXT_ID xsde0200 for Annotations Comment Group - only used generically */
+  /* CONTEXT_ID      - used in Documentation Design View */
+  /* CONTEXT_ID      - used in App Info Design View */
+  public static final String XSDE_ANNOTATION_COMMENT_GROUP = PLUGIN_NAME + ".xsde0200";
+  /* CONTEXT_ID xsde0210 for Annotations Comment Group - only used generically */
+  /* CONTEXT_ID      - used in Documentation Design View */
+  /* CONTEXT_ID      - used in App Info Design View */
+  public static final String XSDE_ANNOTATION_COMMENT       = PLUGIN_NAME + ".xsde0210";
+  
+  /* CONTEXT_ID xsde0300 for Documentation Design View */
+  public static final String XSDE_DOCUMENTATION_DESIGN_VIEW   = PLUGIN_NAME + ".xsde0300";
+  /* CONTEXT_ID xsde0310 for Source Text Edit */
+  public static final String XSDE_DOCUMENTATION_SOURCE        = PLUGIN_NAME + ".xsde0310";
+  /* CONTEXT_ID xsde0320 for Language Text Edit */
+  public static final String XSDE_DOCUMENTATION_LANGUAGE      = PLUGIN_NAME + ".xsde0320";
+  /* CONTEXT_ID Comment Group is from Annotations Window xsde0200 */
+  /* CONTEXT_ID Comment Multi-line Edit is from Annotations Window xsd0210 */
+
+  /* CONTEXT_ID xsde0400 for App Info Design View */
+  public static final String XSDE_APP_INFO_DESIGN_VIEW = PLUGIN_NAME + ".xsde0400";
+  /* CONTEXT_ID xsde0410 for App Info Source Text Edit */
+  public static final String XSDE_APP_INFO_SOURCE = PLUGIN_NAME + ".xsde0410";
+  /* CONTEXT_ID Comment Group is from Annotations Window xsde0200 */
+  /* CONTEXT_ID Comment Multi-line Edit is from Annotations Window xsd0210 */
+
+  /* CONTEXT_ID xsde0500 for Complex Type Design View */
+  public static final String XSDE_COMPLEX_DESIGN_VIEW = PLUGIN_NAME + ".xsde0500";
+  /* CONTEXT_ID xsde0510 for Name Text Edit */
+  public static final String XSDE_COMPLEX_NAME        = PLUGIN_NAME + ".xsde0510";
+  /* CONTEXT_ID xsde0520 for Abstract Combo Box */
+  public static final String XSDE_COMPLEX_ABSTRACT    = PLUGIN_NAME + ".xsde0520";
+  /* CONTEXT_ID xsde0530 for Mixed Combo Box */
+  public static final String XSDE_COMPLEX_MIXED       = PLUGIN_NAME + ".xsde0530";
+  /* CONTEXT_ID xsde0540 for Block Combo Box */
+  public static final String XSDE_COMPLEX_BLOCK       = PLUGIN_NAME + ".xsde0540";
+  /* CONTEXT_ID xsde0550 for Final Combo Box */
+  public static final String XSDE_COMPLEX_FINAL       = PLUGIN_NAME + ".xsde0550";
+
+  /* CONTEXT_ID xsde0600 for Simple Type Design View */
+  public static final String XSDE_SIMPLE_DESIGN_VIEW = PLUGIN_NAME + ".xsde0600";
+  /* CONTEXT_ID xsde0610 for Name Text Edit */
+  public static final String XSDE_SIMPLE_NAME        = PLUGIN_NAME + ".xsde0610";
+
+  /* CONTEXT_ID for Global Element and Element Design Views are the same */
+  /* CONTEXT_ID xsde0700 for Element Design View */
+  public static final String XSDE_ELEMENT_DESIGN_VIEW = PLUGIN_NAME + ".xsde0700";
+  /* CONTEXT_ID xsde0710 for Element Name Text Edit */
+  public static final String XSDE_ELEMENT_NAME         = PLUGIN_NAME + ".xsde0710";
+  /* CONTEXT_ID Type Information Group is from Type Helper xsde0900 */
+  /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+  /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+  /* CONTEXT_ID User-defined complex type Radio Button is from Type Helper xsde0940 */
+  /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+  /* CONTEXT_ID xsde0720 for Abstract Check Box */
+  public static final String XSDE_ELEMENT_ABSTRACT     = PLUGIN_NAME + ".xsde0720";
+  /* CONTEXT_ID xsde0730 for Nillable Check Box */
+  public static final String XSDE_ELEMENT_NILLABLE     = PLUGIN_NAME + ".xsde0730";
+  /* CONTEXT_ID xsde0740 for Value Group */
+  public static final String XSDE_ELEMENT_VALUE        = PLUGIN_NAME + ".xsde0740";
+  /* CONTEXT_ID xsde0750 for Fixed Radio Button */
+  public static final String XSDE_ELEMENT_FIXED        = PLUGIN_NAME + ".xsde0750";
+  /* CONTEXT_ID xsde0760 for Default Radio Button */
+  public static final String XSDE_ELEMENT_DEFAULT      = PLUGIN_NAME + ".xsde0760";
+  /* CONTEXT_ID xsde0770 for Value Group */
+  public static final String XSDE_ELEMENT_VALUE_GROUP  = PLUGIN_NAME + ".xsde0770";
+  /* CONTEXT_ID xsde0780 for Minimum Text Edit */
+  public static final String XSDE_ELEMENT_MINIMUM      = PLUGIN_NAME + ".xsde0780";
+  /* CONTEXT_ID xsde0790 for Maximum Text Edit */
+  public static final String XSDE_ELEMENT_MAXIMUM      = PLUGIN_NAME + ".xsde0790";
+  /* CONTEXT_ID xsde0800 for Block Combo Box */
+  public static final String XSDE_ELEMENT_BLOCK        = PLUGIN_NAME + ".xsde0800";
+  /* CONTEXT_ID xsde0810 for Final Combo Box */
+  public static final String XSDE_ELEMENT_FINAL        = PLUGIN_NAME + ".xsde0810";
+  /* CONTEXT_ID xsde0820 for Substitution Group Combo Box */
+  public static final String XSDE_ELEMENT_SUBSTITUTION = PLUGIN_NAME + ".xsde0820";
+  /* CONTEXT_ID xsde0830 for Form Qualification Combo Box */                    
+  public static final String XSDE_ELEMENT_FORM         = PLUGIN_NAME + ".xsde0830";
+
+  /* CONTEXT_ID xsde0900 for Type Helper Group - only used generically */
+  /* CONTEXT_ID      - used in Global Element Design View */
+  /* CONTEXT_ID      - used in Global Attribute Design View */
+  /* CONTEXT_ID      - used in Simple Content Design View */
+  /* CONTEXT_ID      - used in Restriction Design View */
+  /* CONTEXT_ID      - used in List Design View */
+  /* CONTEXT_ID      - used in Union Design View */
+  public static final String XSDE_TYPE_HELPER_GROUP    = PLUGIN_NAME + ".xsde0900";
+  /* CONTEXT_ID xsde0910 for None Radio Button - only used generically */
+  /* CONTEXT_ID      - used in Simple Content Design View */
+  /* CONTEXT_ID      - used in Restriction Design View */
+  /* CONTEXT_ID      - used in List Design View */
+  /* CONTEXT_ID      - used in Union Design View */
+  public static final String XSDE_TYPE_HELPER_NONE     = PLUGIN_NAME + ".xsde0910";
+  /* CONTEXT_ID xsde0920 for Built-in simple type Radio Button - only used generically */
+  /* CONTEXT_ID      - used in Global Element Design View */
+  /* CONTEXT_ID      - used in Global Attribute Design View */
+  /* CONTEXT_ID      - used in Simple Content Design View */
+  /* CONTEXT_ID      - used in Restriction Design View */
+  /* CONTEXT_ID      - used in List Design View */
+  /* CONTEXT_ID      - used in Union Design View */
+  public static final String XSDE_TYPE_HELPER_BUILT_IN = PLUGIN_NAME + ".xsde0920";
+  /* CONTEXT_ID xsde0930 for User-defined simple type Radio Button - only used generically */
+  /* CONTEXT_ID      - used in Global Element Design View */
+  /* CONTEXT_ID      - used in Global Attribute Design View */
+  /* CONTEXT_ID      - used in Simple Content Design View */
+  /* CONTEXT_ID      - used in Restriction Design View */
+  /* CONTEXT_ID      - used in List Design View */
+  /* CONTEXT_ID      - used in Union Design View */
+  public static final String XSDE_TYPE_HELPER_USER_DEFINED_SIMPLE = PLUGIN_NAME + ".xsde0930";
+  /* CONTEXT_ID xsde0940 for User-defined complex type Radio Button - only used generically */
+  /* CONTEXT_ID      - used in Global Element Design View */
+  public static final String XSDE_TYPE_HELPER_USER_DEFINED_COMPLEX = PLUGIN_NAME + ".xsde0940";
+  /* CONTEXT_ID xsde0950 for Type information Combo Box - only used generically */
+  /* CONTEXT_ID      - used in Global Element Design View */
+  /* CONTEXT_ID      - used in Global Attribute Design View */
+  /* CONTEXT_ID      - used in Simple Content Design View */
+  /* CONTEXT_ID      - used in Restriction Design View */
+  /* CONTEXT_ID      - used in List Design View */
+  public static final String XSDE_TYPE_HELPER_TYPE = PLUGIN_NAME + ".xsde0950";
+
+  /* CONTEXT_ID xsde1000 for Attribute Design View */
+  public static final String XSDE_ATTRIBUTE_DESIGN_VIEW = PLUGIN_NAME + ".xsde1000";
+  /* CONTEXT_ID xsde1010 for Attribute Name Text Edit */
+  public static final String XSDE_ATTRIBUTE_NAME        = PLUGIN_NAME + ".xsde1010";
+  /* CONTEXT_ID Type Information Group is from Type Helper xsde0900 */
+  /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+  /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+  /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+  /* CONTEXT_ID xsde1020 for Value Group */
+  public static final String XSDE_ATTRIBUTE_VALUE_GROUP = PLUGIN_NAME + ".xsde1020";
+  /* CONTEXT_ID xsde1030 for Fixed Radio Button */
+  public static final String XSDE_ATTRIBUTE_FIXED       = PLUGIN_NAME + ".xsde1030";
+  /* CONTEXT_ID xsde1040 for Default Radio Button */
+  public static final String XSDE_ATTRIBUTE_DEFAULT     = PLUGIN_NAME + ".xsde1040";
+  /* CONTEXT_ID xsde1050 for Value Text Edit */
+  public static final String XSDE_ATTRIBUTE_VALUE       = PLUGIN_NAME + ".xsde1050";
+  /* CONTEXT_ID xsde1060 for Usage Combo Box */
+  public static final String XSDE_ATTRIBUTE_USAGE       = PLUGIN_NAME + ".xsde1060";
+  /* CONTEXT_ID xsde1070 for Form qualificaiton Combo Box */
+  public static final String XSDE_ATTRIBUTE_FORM        = PLUGIN_NAME + ".xsde1070";
+
+  /* CONTEXT_ID xsde1100 for Element Ref Window Design View */
+  public static final String XSDE_ELEMENT_REF_DESIGN_VIEW = PLUGIN_NAME + ".xsde1100";
+  /* CONTEXT_ID xsde1110 for Reference Name Combo Box */
+  public static final String XSDE_ELEMENT_REF_REFERENCE   = PLUGIN_NAME + ".xsde1110";
+  /* CONTEXT_ID xsde1120 for Minimum Text Edit */
+  public static final String XSDE_ELEMENT_REF_MINIMUM     = PLUGIN_NAME + ".xsde1120";
+  /* CONTEXT_ID xsde1130 for Maximum Text Edit */
+  public static final String XSDE_ELEMENT_REF_MAXIMUM     = PLUGIN_NAME + ".xsde1130";
+  
+  /* CONTEXT_ID xsde1200 for Simple Content Design View - used generically */
+  /* CONTEXT_ID      - used in Simple Content Design View */ 
+  /* CONTEXT_ID      - used in Complex Content Design View */
+    public static final String XSDE_SIMPLE_CONTENT_DESIGN_VIEW = PLUGIN_NAME + ".xsde1200";
+  /* CONTEXT_ID Base Type Group is from Type Helper xsde0900 */
+  /* CONTEXT_ID None Radio Button is from Type Helper xsde0910 */
+  /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+  /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+  /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+  /* CONTEXT_ID xsde1210 for Derived by Combo Box - used generically */
+  /* CONTEXT_ID      - used in Simple Content Design View */ 
+  /* CONTEXT_ID      - used in Complex Content Design View */
+  public static final String XSDE_SIMPLE_CONTENT_DERIVED = PLUGIN_NAME + ".xsde1210";
+
+  /* CONTEXT_ID xsde1300 for Restriction Design View */
+  public static final String XSDE_RESTRICTION_DESIGN_VIEW  = PLUGIN_NAME + ".xsde1300";
+  /* CONTEXT_ID Base Type Group is from Type Helper xsde0900 */
+  /* CONTEXT_ID None Radio Button is from Type Helper xsde0910 */
+  /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+  /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+  /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+  /* CONTEXT_ID xsde1310 for Facets Group */
+  public static final String XSDE_RESTRICTION_FACETS_GROUP = PLUGIN_NAME + ".xsde1310";
+  /* CONTEXT_ID xsde1320 for Facets Table */
+  public static final String XSDE_RESTRICTION_FACETS       = PLUGIN_NAME + ".xsde1320";
+
+  /* CONTEXT_ID xsde1400 for List Design View */
+  public static final String XSDE_LIST_DESIGN_VIEW  = PLUGIN_NAME + ".xsde1400";
+  /* CONTEXT_ID Base Type Group is from Type Helper xsde0900 */
+  /* CONTEXT_ID None Radio Button is from Type Helper xsde0910 */
+  /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+  /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+  /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+
+  /* CONTEXT_ID xsde1500 for Attribute Group Design View */
+  public static final String XSDE_ATTRIBUTE_GROUP_DESIGN_VIEW = PLUGIN_NAME + ".xsde1500";
+  /* CONTEXT_ID xsde1510 for Name Text Edit */
+  public static final String XSDE_ATTRIBUTE_GROUP_NAME = PLUGIN_NAME + ".xsde1510";
+
+  /* CONTEXT_ID for Global Attribute and Attribute Design Views are the same */
+  /* CONTEXT_ID xsde1600 for Attribute Group Reference Design View */
+  public static final String XSDE_ATTRIBUTE_GROUP_REF_DESIGN_VIEW = PLUGIN_NAME + ".xsde1600";
+  /* CONTEXT_ID xsde1610 for Reference Name Combo Box */
+  public static final String XSDE_ATTRIBUTE_GROUP_REF_NAME = PLUGIN_NAME + ".xsde1610";
+
+  /* CONTEXT_ID xsde1700 for Attribute Reference Design View */
+  public static final String XSDE_ATTRIBUTE_REF_DESIGN_VIEW = PLUGIN_NAME + ".xsde1700";
+  /* CONTEXT_ID xsde1710 for Reference Name Combo Box */
+  public static final String XSDE_ATTRIBUTE_REF_NAME = PLUGIN_NAME + ".xsde1710";
+
+  /* CONTEXT_ID xsde1800 for Pattern Design View */
+  public static final String XSDE_PATTERN_DESIGN_VIEW = PLUGIN_NAME + ".xsde1800";
+  /* CONTEXT_ID xsde1810 for Value Text Edit */
+  public static final String XSDE_PATTERN_VALUE   = PLUGIN_NAME + ".xsde1810";
+  /* CONTEXT_ID xsde1820 for Create Regular Expression Push Button */
+  public static final String XSDE_PATTERN_REGULAR = PLUGIN_NAME + ".xsde1820";
+
+  /* CONTEXT_ID xsde1900 for Enum Design View */
+  public static final String XSDE_ENUM_DESIGN_VIEW = PLUGIN_NAME + ".xsde1900";
+  /* CONTEXT_ID xsde1910 for Value Text Edit */
+  public static final String XSDE_ENUM_VALUE       = PLUGIN_NAME + ".xsde1910";
+  
+  /* CONTEXT_ID xsde2000 for Include Design Page */
+  public static final String XSDE_INCLUDE_DESIGN_VIEW = PLUGIN_NAME + ".xsde2000";
+  /* no CONTEXT_ID for Schema Location Text Edit (not editable) */
+  /* CONTEXT_ID Select Push Button is from Include Helper xsde2100 */ 
+  
+  /* CONTEXT_ID xsde2100 for Include Helper Select Push Button - used generically */
+  /* CONTEXT_ID      - used in Include Design View */
+  /* CONTEXT_ID      - used in Import Design View */
+  public static final String XSDE_INCLUDE_HELPER_SELECT = PLUGIN_NAME + ".xsde2100";
+
+  /* CONTEXT_ID xsde2200 for Import Design Page */
+  public static final String XSDE_IMPORT_DESIGN_VIEW = PLUGIN_NAME + ".xsde2200";
+  /* no CONTEXT_ID for Schema Location Text Edit (not editable) */
+  /* CONTEXT_ID Select Push Button is from Include Helper xsde2100 */
+  /* CONTEXT_ID xsde2210 for Prefix Text Edit */
+  public static final String XSDE_IMPORT_PREFIX      = PLUGIN_NAME + ".xsde2210";
+  /* no CONTEXT_ID for Namespace Text Edit (not editable) */
+
+  /* CONTEXT_ID xsde2300 for Redefine Design View */
+  public static final String XSDE_REDEFINE_DESIGN_VIEW = PLUGIN_NAME + ".xsde2300";
+  /* no CONTEXT_ID for Schema Location Text Edit (not editable) */
+  /* CONTEXT_ID Select Push Button is from Include Helper xsde2100 */
+
+  /* CONTEXT_ID xsde2400 for Group Design View */
+  public static final String XSDE_GROUP_DESIGN_VIEW = PLUGIN_NAME + ".xsde2400";
+  /* CONTEXT_ID xsde2410 for Name Text Edit */
+  public static final String XSDE_GROUP_NAME        = PLUGIN_NAME + ".xsde2410";
+
+  /* CONTEXT_ID xsde2500 for Group Scope Design View */
+  public static final String XSDE_GROUP_SCOPE_DESIGN_VIEW   = PLUGIN_NAME + ".xsde2500";
+  /* CONTEXT_ID xsde2510 for Content model Group */
+  public static final String XSDE_GROUP_SCOPE_CONTENT_GROUP = PLUGIN_NAME + ".xsde2510";
+  /* CONTEXT_ID xsde2520 for Sequence Radio Button */
+  public static final String XSDE_GROUP_SCOPE_SEQUENCE = PLUGIN_NAME + ".xsde2520";
+  /* CONTEXT_ID xsde2530 for Choice Radio Button */
+  public static final String XSDE_GROUP_SCOPE_CHOICE   = PLUGIN_NAME + ".xsde2530";
+  /* CONTEXT_ID xsde2540 for All Radio Button */
+  public static final String XSDE_GROUP_SCOPE_ALL      = PLUGIN_NAME + ".xsde2540";
+  /* CONTEXT_ID xsde2550 for Minimum Text Edit */
+  public static final String XSDE_GROUP_SCOPE_MINIMUM  = PLUGIN_NAME + ".xsde2550";
+  /* CONTEXT_ID xsde2560 for Maximum Text Edit*/
+  public static final String XSDE_GROUP_SCOPE_MAXIMUM  = PLUGIN_NAME + ".xsde2560";
+
+  /* CONTEXT_ID xsde2600 for Group Ref Design View */
+  public static final String XSDE_GROUP_REF_DESIGN_VIEW = PLUGIN_NAME + ".xsde2600";
+  /* CONTEXT_ID xsde2610 for Reference name Combo Box */
+  public static final String XSDE_GROUP_REF_REFERENCE   = PLUGIN_NAME + ".xsde2610";
+  /* CONTEXT_ID xsde2620 for Minimum Text Edit */
+  public static final String XSDE_GROUP_REF_MINIMUM     = PLUGIN_NAME + ".xsde2620";
+  /* CONTEXT_ID xsde2630 for Maximum Text Edit */
+  public static final String XSDE_GROUP_REF_MAXIMUM     = PLUGIN_NAME + ".xsde2630";
+
+  /* CONTEXT_ID xsde2700 for Unique Design View */
+  public static final String XSDE_UNIQUE_DESIGN_VIEW = PLUGIN_NAME + ".xsde2700";
+  /* CONTEXT_ID Name Text Edit is from Unique Base xsde2800 */
+  /* CONTEXT_ID Selector Group is from Unique Base xsde2810 */
+  /* CONTEXT_ID Selector Mulit-line Edit is from Unique Base xsde2820 */
+  /* CONTEXT_ID Fields Group is from Unique Base xsde2830 */
+  /* CONTEXT_ID Source Text Edit is from Unique Base xsde2840 */
+  /* CONTEXT_ID Add Push Button is from Unique Base xsde2850 */
+  /* CONTEXT_ID Remove Push Button is from Unique Base xsde2860 */
+  /* CONTEXT_ID Target List Box is from Unique Base xsde2870 */
+  
+  /* CONTEXT_ID xsde2800 for Unique Base Name Text Edit - used generically */
+  /* CONTEXT_ID      - used in Unique Design View */
+  /* CONTEXT_ID      - used in Key Design View */
+  /* CONTEXT_ID      - used in Key Ref Design View */
+  public static final String XSDE_UNIQUE_BASE_NAME = PLUGIN_NAME + ".xsde2800";
+  /* CONTEXT_ID xsde2810 for Selector Group - used generically */
+  /* CONTEXT_ID      - used in Unique Design View */
+  /* CONTEXT_ID      - used in Key Design View */
+  /* CONTEXT_ID      - used in Key Ref Design View */
+  public static final String XSDE_UNIQUE_BASE_SELECTOR_GROUP = PLUGIN_NAME + ".xsde2810";
+  /* CONTEXT_ID xsde2820 for Selector Multi-line Edit - used generically */
+  /* CONTEXT_ID      - used in Unique Design View */
+  /* CONTEXT_ID      - used in Key Design View */
+  /* CONTEXT_ID      - used in Key Ref Design View */
+  public static final String XSDE_UNIQUE_BASE_SELECTOR       = PLUGIN_NAME + ".xsde2820";
+  /* CONTEXT_ID xsde2830 for Fields Group - used generically */
+  /* CONTEXT_ID      - used in Unique Design View */
+  /* CONTEXT_ID      - used in Key Design View */
+  /* CONTEXT_ID      - used in Key Ref Design View */
+  public static final String XSDE_UNIQUE_BASE_FIELDS_GROUP   = PLUGIN_NAME + ".xsde2830";
+  /* CONTEXT_ID xsde2840 for Source Text Edit - used generically */
+  /* CONTEXT_ID      - used in Unique Design View */
+  /* CONTEXT_ID      - used in Key Design View */
+  /* CONTEXT_ID      - used in Key Ref Design View */
+  public static final String XSDE_UNIQUE_BASE_SOURCE         = PLUGIN_NAME + ".xsde2840";
+  /* CONTEXT_ID xsde2850 for Add Push Button - used generically */
+  /* CONTEXT_ID      - used in Unique Design View */
+  /* CONTEXT_ID      - used in Key Design View */
+  /* CONTEXT_ID      - used in Key Ref Design View */
+  public static final String XSDE_UNIQUE_BASE_ADD            = PLUGIN_NAME + ".xsde2850";
+  /* CONTEXT_ID xsde2860 for Remove Push Button - used generically */
+  /* CONTEXT_ID      - used in Unique Design View */
+  /* CONTEXT_ID      - used in Key Design View */
+  /* CONTEXT_ID      - used in Key Ref Design View */
+  public static final String XSDE_UNIQUE_BASE_REMOVE         = PLUGIN_NAME + ".xsde2860";
+  /* CONTEXT_ID xsde2870 for Target List Box - used generically */
+  /* CONTEXT_ID      - used in Unique Design View */
+  /* CONTEXT_ID      - used in Key Design View */
+  /* CONTEXT_ID      - used in Key Ref Design View */
+  public static final String XSDE_UNIQUE_BASE_TARGET         = PLUGIN_NAME + ".xsde2870";
+
+  /* CONTEXT_ID xsde2900 for Key Design View */
+  public static final String XSDE_KEY_DESIGN_VIEW = PLUGIN_NAME + ".xsde2900";
+  /* CONTEXT_ID Name Text Edit is from Unique Base xsde2800 */
+  /* CONTEXT_ID Selector Group is from Unique Base xsde2810 */
+  /* CONTEXT_ID Selector Mulit-line Edit is from Unique Base xsde2820 */
+  /* CONTEXT_ID Fields Group is from Unique Base xsde2830 */
+  /* CONTEXT_ID Source Text Edit is from Unique Base xsde2840 */
+  /* CONTEXT_ID Add Push Button is from Unique Base xsde2850 */
+  /* CONTEXT_ID Remove Push Button is from Unique Base xsde2860 */
+  /* CONTEXT_ID Target List Box is from Unique Base xsde2870 */
+  /* CONTEXT_ID xsde2900 for Key Design View */
+  
+  /* CONTEXT_ID xsde2950 for Key Ref Design View */
+  public static final String XSDE_KEY_REF_DESIGN_VIEW = PLUGIN_NAME + ".xsde2950";
+  /* CONTEXT_ID Name Text Edit is from Unique Base xsde2800 */
+  /* CONTEXT_ID xsde2960 for Reference Key Combo Box */
+  public static final String XSDE_KEY_REF_REFERENCE = PLUGIN_NAME + ".xsde2960";
+  /* CONTEXT_ID Selector Group is from Unique Base xsde2810 */
+  /* CONTEXT_ID Selector Mulit-line Edit is from Unique Base xsde2820 */
+  /* CONTEXT_ID Fields Group is from Unique Base xsde2830 */
+  /* CONTEXT_ID Source Text Edit is from Unique Base xsde2840 */
+  /* CONTEXT_ID Add Push Button is from Unique Base xsde2850 */
+  /* CONTEXT_ID Remove Push Button is from Unique Base xsde2860 */
+  /* CONTEXT_ID Target List Box is from Unique Base xsde2870 */
+
+  /* CONTEXT_ID xsde3000 for Any Element Design View */
+  public static final String XSDE_ANY_ELEMENT_VIEW = PLUGIN_NAME + ".xsde3000";
+  /* CONTEXT_ID xsde3010 for Namespace Text Edit */
+  public static final String XSDE_ANY_ELEMENT_NAMESPACE = PLUGIN_NAME + ".xsde3010";
+  /* CONTEXT_ID xsde3020 for Process Contents Combo Box */
+  public static final String XSDE_ANY_ELEMENT_PROCESS   = PLUGIN_NAME + ".xsde3020";
+  /* CONTEXT_ID xsde3030 for Minimum Text Edit */
+  public static final String XSDE_ANY_ELEMENT_MINIMUM   = PLUGIN_NAME + ".xsde3030";
+  /* CONTEXT_ID xsde3040 for Maximum Text Edit */
+  public static final String XSDE_ANY_ELEMENT_MAXIMUM   = PLUGIN_NAME + ".xsde3040";
+
+  /* CONTEXT_ID xsde3100 for Any Attribute Design View */
+  public static final String XSDE_ANY_ATTRIBUTE_VIEW = PLUGIN_NAME + ".xsde3100";
+  /* CONTEXT_ID xsde3110 for Namespace Text Edit */
+  public static final String XSDE_ANY_ATTRIBUTE_NAMESPACE = PLUGIN_NAME + ".xsde3110";
+  /* CONTEXT_ID xsde3120 for Process Contents Combo Box */
+  public static final String XSDE_ANY_ATTRIBUTE_PROCESS   = PLUGIN_NAME + ".xsde3120";
+
+  /* no CONTEXT_ID for Union Design View - uses a generic interface */
+  /* CONTEXT_ID Type Information Group is from Type Helper xsde0900 */
+  /* CONTEXT_ID Built-in simple type Radio Button is from Type Helper xsde0920 */
+  /* CONTEXT_ID User-defined simple type Radio Button is from Type Helper xsde0930 */
+  /* CONTEXT_ID Type information Combo Box is from Type Helper xsde0950 */
+
+  /* CONTEXT_ID xsde3200 for Notation Design View */
+  public static final String XSDE_NOTATION_VIEW = PLUGIN_NAME + ".xsde3200";
+
+  /* CONTEXT_ID xsde4000 for Source View */
+  public static final String XSDE_SOURCE_VIEW = PLUGIN_NAME + ".xsde4000";
+
+  /* CONTEXT_IDs for Regular Expression Wizard follow the xsdrxxx context IDs */
+  
+  /* CONTEXT_ID xsdr0010 for Compose Regular Expression Page */
+  public static final String XSDR_COMPOSITION_PAGE         = PLUGIN_NAME + ".xsdr0010";
+  /* CONTEXT_ID xsdr0015 for Token Contents Combo Box */
+  public static final String XSDR_COMPOSITION_TOKEN = PLUGIN_NAME + ".xsdr0015";
+  /* CONTEXT_ID xsdr0020 for Occurrece Group */
+  public static final String XSDR_COMPOSITION_OCCURRENCE_GROUP = PLUGIN_NAME + ".xsdr0020";
+  /* CONTEXT_ID xsdr0030 for Just once Radio Button */
+  public static final String XSDR_COMPOSITION_JUST_ONCE    = PLUGIN_NAME + ".xsdr0030";
+  /* CONTEXT_ID xsdr0040 for Zero or more Radio Button */
+  public static final String XSDR_COMPOSITION_ZERO_OR_MORE = PLUGIN_NAME + ".xsdr0040";
+  /* CONTEXT_ID xsdr0050 for One or more Radio Button */
+  public static final String XSDR_COMPOSITION_ONE_OR_MORE  = PLUGIN_NAME + ".xsdr0050";
+  /* CONTEXT_ID xsdr0060 for Optional Radio Button */
+  public static final String XSDR_COMPOSITION_OPTIONAL     = PLUGIN_NAME + ".xsdr0060";
+  /* CONTEXT_ID xsdr0070 for Repeat Radio Button */
+  public static final String XSDR_COMPOSITION_REPEAT       = PLUGIN_NAME + ".xsdr0070";
+  /* CONTEXT_ID xsdr0080 for Range Radio Button */
+  public static final String XSDR_COMPOSITION_RANGE        = PLUGIN_NAME + ".xsdr0080";
+  /* CONTEXT_ID xsdr0090 for Repeat Text Edit */
+  public static final String XSDR_COMPOSITION_REPEAT_TEXT  = PLUGIN_NAME + ".xsdr0090";
+  /* CONTEXT_ID xsdr0100 for Range Minimum Text Edit */
+  public static final String XSDR_COMPOSITION_RANGE_MIN    = PLUGIN_NAME + ".xsdr0100";
+  /* CONTEXT_ID xsdr0110 for Range Maximum Text Edit */
+  public static final String XSDR_COMPOSITION_RANGE_MAX    = PLUGIN_NAME + ".xsdr0110";
+  /* CONTEXT_ID xsdr0120 for Add Push Button */
+  public static final String XSDR_COMPOSITION_ADD          = PLUGIN_NAME + ".xsdr0120";
+  /* CONTEXT_ID xsdr0130 for Current Regular Expression Text Edit */
+  public static final String XSDR_COMPOSITION_CURRENT      = PLUGIN_NAME + ".xsdr0130";
+
+  /* CONTEXT_ID xsdr0200 for Test Regular Expression Page */
+  public static final String XSDR_TEST_PAGE   = PLUGIN_NAME + ".xsdr0200";
+  /* no CONTEXT_ID for Regular Expression Text Edit (not editable) */
+  /* CONTEXT_ID xsdr0210 for Sample Text Text Edit */
+  public static final String XSDR_TEST_SAMPLE = PLUGIN_NAME + ".xsdr0210";
+
+  /* CONTEXT_IDs for Preferences Page follows the xsdpxxx context IDs */
+  
+  /* CONTEXT_ID xsdp0010 for XML Schema Preferences Page */
+  public static final String XSDP_PREFERENCE_PAGE = PLUGIN_NAME + ".xsdp0010";
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorPlugin.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorPlugin.java
new file mode 100644
index 0000000..e1e7e27
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDEditorPlugin.java
@@ -0,0 +1,349 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.text.MessageFormat;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IPluginDescriptor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.sse.core.IModelManager;
+import org.eclipse.wst.sse.core.IModelManagerPlugin;
+
+
+public class XSDEditorPlugin extends AbstractUIPlugin
+{
+  public final static String PLUGIN_ID = "org.eclipse.wst.xsd.ui";
+  public final static String XSD_EDITOR_ID = "org.eclipse.wst.xsd.ui.XSDEditor";
+  
+  public final static String DEFAULT_TARGET_NAMESPACE = "http://tempuri.org";
+  
+  protected static XSDEditorPlugin plugin;
+  //  protected XMLSchemaPackage xmlschemaPackage;
+// KCPort private static MsgLogger myMsgLogger;
+ 
+  public XSDEditorPlugin(IPluginDescriptor descriptor) 
+  {
+    super(descriptor);
+    plugin = this;
+// KCPort    myMsgLogger = getMsgLogger();
+    //myMsgLogger.write(Level.CONFIG, new BuildInfo());
+    //myMsgLogger.write(Level.CONFIG, BuildInfo.getWSABuildLevel());
+  }
+
+  /**
+   * Copy the w3c XMLSchema.dtd and datatypes.dtd into the plugin metadata directory
+   * for validation purposes
+   */
+  public void startup()
+  {
+    modelManager = getModelManager();
+  }
+
+  private static IModelManager modelManager;
+
+  public static IModelManager getModelManager() {
+    IModelManagerPlugin plugin = (IModelManagerPlugin) Platform.getPlugin(IModelManagerPlugin.ID);
+    return plugin.getModelManager();
+  }
+  
+  
+  /**
+   * Get the Install URL
+   */
+  public static URL getInstallURL()
+  {
+    return getPlugin().getDescriptor().getInstallURL();
+  }
+
+  /**
+   * Return the plugin physical directory location
+   */
+  public static IPath getPluginLocation()
+  {
+    try 
+    {
+      IPath installPath = new Path(getInstallURL().toExternalForm()).removeTrailingSeparator();
+      String installStr = Platform.asLocalURL(new URL(installPath.toString())).getFile();
+      return new Path(installStr);
+    } 
+    catch (IOException e) 
+    {
+
+    }
+    return null;
+  }
+
+  /**
+   * Get the metadata directory for this plugin
+   */
+  public static String getMetaDataDirectory()
+  {
+    return getPlugin().getStateLocation().toOSString();
+  }
+
+  /** 
+   *  Get the one xmlschema package.
+   */
+//   public XMLSchemaPackage getXMLSchemaPackage()
+//   {
+//     return xmlschemaPackage;
+//   }
+
+//   /** 
+//    *  Get the one xmlschema factory.
+//    */
+//   public XMLSchemaFactory getXMLSchemaFactory()
+//   {
+//     return (XMLSchemaFactory)xmlschemaPackage.getEFactoryInstance();
+//   }
+
+  /**
+   * Get the singleton instance.
+   */
+  public static XSDEditorPlugin getPlugin()
+  {
+    return plugin;
+  }
+
+  public static Image getXSDImage(String iconName)
+  {
+    return getPlugin().getImage(iconName);
+  }
+
+  public Image getImage(String iconName)
+  {
+    ImageRegistry imageRegistry = getImageRegistry();
+    
+    if (imageRegistry.get(iconName) != null)
+    {
+      return imageRegistry.get(iconName);
+    }
+    else
+    {
+      imageRegistry.put(iconName, ImageDescriptor.createFromFile(getClass(), iconName));
+      return imageRegistry.get(iconName);
+    }
+  }
+  
+  public static String getXSDString(String key)
+  {
+    return Platform.getResourceBundle(plugin.getBundle()).getString(key);
+  }
+
+	/**
+	 * This gets the string resource and does one substitution.
+	 */
+	public String getString(String key, Object s1)
+	{
+	  return MessageFormat.format(Platform.getResourceBundle(getBundle()).getString(key), new Object [] { s1 });
+	}
+
+//  public IWorkspace getWorkspace()
+//  {
+//    return ResourcesPlugin.getWorkspace();
+//  }
+
+  public static Shell getShell() 
+  {	
+    return getPlugin().getWorkbench().getActiveWorkbenchWindow().getShell();
+  }
+
+  /**
+   * Get the xml schema default namespace prefix
+   */
+  public String getXMLSchemaPrefix()
+  {
+    return getPreferenceStore().getString(CONST_XSD_DEFAULT_PREFIX_TEXT);
+  }
+  
+  /**
+   * Get the xml schema default target namespace
+   */
+  public String getXMLSchemaTargetNamespace()
+  {
+    return getPreferenceStore().getString(CONST_DEFAULT_TARGET_NAMESPACE);
+  }
+
+  /**
+   * Get the xml schema language qualification
+   */
+  public boolean isQualifyXMLSchemaLanguage()
+  {
+    return getPreferenceStore().getBoolean(CONST_XSD_LANGUAGE_QUALIFY);
+  }
+  
+  /**
+   * Method isCombinedDesignAndSourceView.
+   * @return boolean if the editor should have a single page that is
+   * a combined design and source page
+   */
+  public boolean isCombinedDesignAndSourceView()
+  {
+    return COMBINED_LAYOUT.equals(getPreferenceStore().getString(EDITOR_LAYOUT));
+  }
+
+  public int getDesignLayout()
+  {
+    if (TOP_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+    {
+       return SWT.VERTICAL;
+    }
+    else if (BOTTOM_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+    {
+      return SWT.VERTICAL;
+    }
+    else if (LEFT_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+    {
+      return SWT.HORIZONTAL;
+    }
+    else if (RIGHT_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+    {
+      return SWT.HORIZONTAL;
+    }
+    return SWT.HORIZONTAL;      
+  }
+
+  public String getDesignLayoutPosition()
+  {
+    if (TOP_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+    {
+       return TOP_LAYOUT;
+    }
+    else if (BOTTOM_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+    {
+      return BOTTOM_LAYOUT;
+    }
+    else if (LEFT_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+    {
+      return LEFT_LAYOUT;
+    }
+    else if (RIGHT_LAYOUT.equals(getPreferenceStore().getString(DESIGN_LAYOUT)))
+    {
+      return RIGHT_LAYOUT;
+    }
+    return RIGHT_LAYOUT;      
+  }
+
+  /*---------------------------------------------------------------------------*/
+  /* the following methods are impls for the IPluginHelper interface           */
+  /*---------------------------------------------------------------------------*/
+//  public void setMsgLoggerConfig(Hashtable msgLoggerConfig)
+//  {
+//    getMsgLogger().setMsgLoggerConfig(msgLoggerConfig);
+//  }
+//
+//  public Hashtable getMsgLoggerConfig(Plugin plugin)
+//  {
+//    return (new PluginHelperImpl().getMsgLoggerConfig(plugin));
+//  }
+//
+//  public Hashtable getMsgLoggerConfig()
+//  {
+//    return (getMsgLoggerConfig(this));
+//  }
+//
+//  /**
+//   * XSDEditor and XSDModel use the same logger.  See plugin.xml
+//   */
+//  public MsgLogger getMsgLogger()
+//  {
+//    if (myMsgLogger == null)
+//    {
+//      myMsgLogger = (MsgLogger) MsgLogger.getFactory().getLogger(new PluginHelperImpl().getMsgLoggerName(this), this);
+//    }
+//    return (myMsgLogger);
+//  }
+  
+  public static final String CONST_XSD_DEFAULT_PREFIX_TEXT = "org.eclipse.wst.xmlschema.xsdDefaultPrefixText";
+  public static final String CONST_XSD_LANGUAGE_QUALIFY = "org.eclipse.wst.xmlschema.xsdQualify";
+  public static final String CONST_DEFAULT_TARGET_NAMESPACE = "org.eclipse.wst.xmlschema.defaultTargetnamespaceText";
+
+  // Preference to store which page should come up as the default page in the editor.  This setting is based
+  // on the page that was left showing the last time the editor was closed.
+  public static String DEFAULT_PAGE = "org.eclipse.wst.xsd.ui.internal.defaultPage";
+  public static String DESIGN_PAGE = "org.eclipse.wst.xsd.ui.internal.designPage";
+  public static String SOURCE_PAGE = "org.eclipse.wst.xsd.ui.internal.sourcePage";
+  public static String GRAPH_PAGE = "org.eclipse.wst.xsd.ui.internal.graphPage";
+  
+  public static String EDITOR_LAYOUT = "org.eclipse.wst.xsd.ui.internal.editorlayout";
+  public static String COMBINED_LAYOUT = "org.eclipse.wst.xsd.ui.internal.combined";
+  public static String SEPARATE_LAYOUT = "org.eclipse.wst.xsd.ui.internal.separate";
+
+  public static String DESIGN_LAYOUT = "org.eclipse.wst.xsd.ui.internal.designlayout";
+  public static String TOP_LAYOUT = "org.eclipse.wst.xsd.ui.internal.top";
+  public static String BOTTOM_LAYOUT = "org.eclipse.wst.xsd.ui.internal.bottom";
+  public static String LEFT_LAYOUT = "org.eclipse.wst.xsd.ui.internal.left";
+  public static String RIGHT_LAYOUT = "org.eclipse.wst.xsd.ui.internal.right";
+  
+  /**
+   * @see org.eclipse.ui.plugin.AbstractUIPlugin#initializeDefaultPreferences(IPreferenceStore)
+   */
+  protected void initializeDefaultPreferences(IPreferenceStore store)
+  {
+    super.initializeDefaultPreferences(store);
+
+    store.setDefault(CONST_XSD_DEFAULT_PREFIX_TEXT, "xsd");
+    store.setDefault(CONST_XSD_LANGUAGE_QUALIFY, false);
+
+    store.setDefault(DEFAULT_PAGE, DESIGN_PAGE);
+    store.setDefault(EDITOR_LAYOUT, COMBINED_LAYOUT);
+    store.setDefault(DESIGN_LAYOUT, RIGHT_LAYOUT);
+    
+    store.setDefault(XSDEditorPlugin.CONST_DEFAULT_TARGET_NAMESPACE, DEFAULT_TARGET_NAMESPACE);
+  }
+  
+  public void setDefaultPage(String page)
+  {
+    getPreferenceStore().setValue(DEFAULT_PAGE, page);
+  }
+  
+  /**
+   * Method getDefaultPage.
+   * @return String value of the string constant that is the default page the editor should turn to when
+   * first opened.  Changes to the last visible page when the editor was closed
+   */
+  public String getDefaultPage()
+  {
+    return getPreferenceStore().getString(DEFAULT_PAGE);
+  }    
+
+  protected URL baseURL;
+  public URL getBaseURL()
+  {
+    return getDescriptor().getInstallURL();
+  }
+
+  public Image getIconImage(String object)
+  {
+    try
+    {
+      return ExtendedImageRegistry.getInstance().getImage(new URL(getBaseURL() + "icons/" + object + ".gif"));
+    }
+    catch (MalformedURLException exception)
+    {
+      System.out.println("Failed to load image for '" + object + "'");
+    }
+    return null;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMenuListener.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMenuListener.java
new file mode 100644
index 0000000..72ce37c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMenuListener.java
@@ -0,0 +1,1975 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.wst.xsd.ui.internal.actions.AddEnumsAction;
+import org.eclipse.wst.xsd.ui.internal.actions.AddModelGroupAction;
+import org.eclipse.wst.xsd.ui.internal.actions.BackAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateAnnotationAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateElementAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateGroupAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateIdentityConstraintsAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateLocalComplexTypeAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateLocalSimpleTypeAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateSimpleContentAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateSimpleTypeAction;
+import org.eclipse.wst.xsd.ui.internal.actions.DOMAttribute;
+import org.eclipse.wst.xsd.ui.internal.actions.DeleteAction;
+import org.eclipse.wst.xsd.ui.internal.actions.MakeAnonymousGlobal;
+import org.eclipse.wst.xsd.ui.internal.actions.OpenSchemaAction;
+import org.eclipse.wst.xsd.ui.internal.actions.SetBaseTypeAction;
+import org.eclipse.wst.xsd.ui.internal.actions.XSDEditNamespacesAction;
+import org.eclipse.wst.xsd.ui.internal.graph.model.Category;
+import org.eclipse.wst.xsd.ui.internal.provider.CategoryAdapter;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDCompositor;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class XSDMenuListener implements IMenuListener
+{
+  protected ISelectionProvider selectionProvider;
+  //protected XSDTextEditor textEditor;
+  protected DeleteAction deleteAction;
+//  protected IAction undoAction, redoAction;
+  protected CreateElementAction addComplexTypeAction;
+  protected XSDSchema xsdSchema;
+  protected boolean isReadOnly;
+  
+  /**
+   * Constructor for XSDMenuListener.
+   */
+  public XSDMenuListener(ISelectionProvider selectionProvider)
+  {
+    super();
+    this.selectionProvider = selectionProvider;
+
+    deleteAction = new DeleteAction(XSDEditorPlugin.getXSDString("_UI_ACTION_DELETE"), null, getXSDSchema());
+    deleteAction.setSelectionProvider(selectionProvider);
+    selectionProvider.addSelectionChangedListener(deleteAction);
+  }
+
+  public void setSelectionProvider(ISelectionProvider selectionProvider)
+  {
+    this.selectionProvider = selectionProvider;
+  }
+
+  protected XSDSchema getXSDSchema()
+  {
+    return xsdSchema;
+  }
+
+  protected Object getSelectedElement()
+  {
+    ISelection selection = selectionProvider.getSelection();
+    if (selection.isEmpty())
+    {
+      return null;
+    }
+    return ((IStructuredSelection) selection).getFirstElement();
+  }
+  
+  protected void updateXSDSchema()
+  {
+    Object object = getSelectedElement();
+    if (object instanceof XSDConcreteComponent)
+    {
+      xsdSchema = ((XSDConcreteComponent)object).getSchema();
+      boolean flag = true;
+      isReadOnly = false;
+      if (xsdSchema == null)
+      {
+        return;
+      }
+      while (flag)
+      {
+        List list = xsdSchema.getReferencingDirectives();
+        if (list.size() > 0)
+        {
+          isReadOnly = true;
+          XSDSchemaDirective xsdSchemaDirective = (XSDSchemaDirective)list.get(0);
+          if (xsdSchemaDirective.getSchema() != null)
+          {
+            xsdSchema = xsdSchemaDirective.getSchema();
+          }
+          else
+          {
+            flag = false;
+          }
+        }
+        else
+        {
+          flag = false;
+        }
+      }
+    }
+    else if (object instanceof Category)
+    {
+      Category cg = (Category)object;
+      xsdSchema = cg.getXSDSchema();
+    }
+    else if (object instanceof CategoryAdapter)
+    {
+      CategoryAdapter category = (CategoryAdapter)object;
+      xsdSchema = category.getXSDSchema();
+    }
+  }
+
+  /*
+   * @see IMenuListener#menuAboutToShow(IMenuManager)
+   */
+  public void menuAboutToShow(IMenuManager manager)
+  {
+    isReadOnly = false;
+    updateXSDSchema();
+    if (xsdSchema == null)
+    {
+      return;
+    }
+    
+    deleteAction.setXSDSchema(xsdSchema);
+    deleteAction.setEnabled(!isReadOnly);
+    
+    BackAction backAction = new BackAction(XSDEditorPlugin.getXSDString("_UI_ACTION_BACK_TO_SCHEMA_VIEW")); //$NON-NLS-1$
+    backAction.setXSDSchema(getXSDSchema());
+    backAction.setSelectionProvider(selectionProvider);
+    
+    Object selectedElementObj = getSelectedElement();
+    
+    if (selectedElementObj instanceof XSDSchema || selectedElementObj instanceof Category || selectedElementObj instanceof CategoryAdapter)
+    {
+      backAction.setEnabled(false);
+    }
+    manager.add(backAction);
+    manager.add(new Separator());
+//    if (undoAction == null && textEditor != null)
+//    {
+//      undoAction = textEditor.getAction(org.eclipse.ui.texteditor.ITextEditorActionConstants.UNDO);
+//      redoAction = textEditor.getAction(org.eclipse.ui.texteditor.ITextEditorActionConstants.REDO);
+//    }
+    //    Element selectedElement = getSelectedElement();
+
+    Element selectedElement = null;
+    
+    if (selectedElementObj instanceof Element)
+    {
+      selectedElement = (Element) selectedElementObj;
+    }
+    else if (selectedElementObj instanceof XSDConcreteComponent)
+    {
+      selectedElement = ((XSDConcreteComponent) selectedElementObj).getElement();
+    }
+    else if (selectedElementObj instanceof Category || selectedElementObj instanceof CategoryAdapter)
+    {
+      int groupType = -1;
+      if (selectedElementObj instanceof Category)
+      {
+        Category category = (Category) selectedElementObj;
+        groupType = category.getGroupType();
+      }
+      // todo... We need to ensure we eliminate the need for
+      // this case. The XSDMenuListener class should not have
+      // view dependant code. We need to do some work to ensure all
+      // views utilize the 'Category' model object
+      else if (selectedElementObj instanceof CategoryAdapter)
+      {
+        CategoryAdapter categoryAdapter = (CategoryAdapter) selectedElementObj;
+        groupType = categoryAdapter.getGroupType();
+      }
+      ArrayList attributes = null;
+      Element parent = getXSDSchema().getElement();
+      Node relativeNode = null;
+      switch (groupType)
+      {
+        case Category.TYPES : {
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("ComplexType")));
+          Action action = addCreateElementAction(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_TYPE"), attributes, parent, relativeNode);
+          ((CreateElementAction) action).setIsGlobal(true);
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("SimpleType")));
+          Action action2 = addCreateSimpleTypeAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_TYPE"), attributes, parent, relativeNode);
+          ((CreateElementAction) action2).setIsGlobal(true);
+          break;
+        }
+        case Category.ELEMENTS : {
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ELEMENT_ELEMENT_TAG, "GlobalElement")));
+          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+          Action action = addCreateElementAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ELEMENT"), attributes, parent, relativeNode);
+          ((CreateElementAction) action).setIsGlobal(true);
+          break;
+        }
+        case Category.GROUPS : {
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.GROUP_ELEMENT_TAG, "Group")));
+          CreateGroupAction groupAction = addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GROUP"), attributes, parent, relativeNode);
+          groupAction.setIsGlobal(true);
+          break;
+        }
+        case Category.ATTRIBUTES : {
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ATTRIBUTE_ELEMENT_TAG, "GlobalAttribute")));
+          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+          Action action = addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GLOBAL_ATTRIBUTE"), attributes, parent, relativeNode);
+          ((CreateElementAction) action).setIsGlobal(true);
+          break;
+        }
+        case Category.ATTRIBUTE_GROUPS : {
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, "AttributeGroup")));
+          Action action = addCreateElementAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP"), attributes, parent, relativeNode);
+          ((CreateElementAction) action).setIsGlobal(true);
+          break;
+        }
+        case Category.NOTATIONS : {
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.NOTATION_ELEMENT_TAG, "Notation")));
+          attributes.add(new DOMAttribute(XSDConstants.PUBLIC_ATTRIBUTE, ""));
+          Action action = addCreateElementAction(manager, XSDConstants.NOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_NOTATION"), attributes, parent, relativeNode);
+          ((CreateElementAction) action).setIsGlobal(true);
+          break;
+        }
+        case Category.DIRECTIVES : {
+          boolean b = true;
+          NodeList children = parent.getChildNodes();
+          int length = children.getLength();
+          Node effectiveRelativeNode = parent.getFirstChild();
+          for (int i = 0; i < length && b; i++)
+          {
+            Node child = children.item(i);
+            if (child != null && child instanceof Element)
+            {
+              if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.INCLUDE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.IMPORT_ELEMENT_TAG, false)
+                  || XSDDOMHelper.inputEquals((Element) child, XSDConstants.REDEFINE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.ANNOTATION_ELEMENT_TAG, false))
+              {
+                effectiveRelativeNode = child;
+              }
+              else
+              {
+                b = false;
+              }
+            }
+          }
+          relativeNode = effectiveRelativeNode != null ? XSDDOMHelper.getNextElementNode(effectiveRelativeNode) : null;
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE, ""));
+          Action action = addCreateElementAction(manager, XSDConstants.INCLUDE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_INCLUDE"), attributes, parent, relativeNode);
+          ((CreateElementAction) action).setIsGlobal(true);
+          action = addCreateElementAction(manager, XSDConstants.IMPORT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_IMPORT"), null, parent, relativeNode);
+          ((CreateElementAction) action).setIsGlobal(true);
+          action = addCreateElementAction(manager, XSDConstants.REDEFINE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_REDEFINE"), attributes, parent, relativeNode);
+          ((CreateElementAction) action).setIsGlobal(true);
+          break;
+        }
+        case Category.ANNOTATIONS : {
+          Action action = addCreateElementAction(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), null, parent, relativeNode);
+          ((CreateElementAction) action).setIsGlobal(true);
+          break;
+        }
+      }
+//      manager.add(new Separator());
+//      if (undoAction != null)
+//      {
+//        manager.add(undoAction);
+//        manager.add(redoAction);
+//      }
+      return;
+    }
+    if (selectedElement != null)
+    {
+      // Add context menu items for selected element
+      addContextItems(manager, selectedElement, null);
+      manager.add(new Separator());
+      //else
+//      if (textEditor != null)
+//      {
+//        Document document = getXSDSchema().getDocument();
+//        if (document != null)
+//        {
+//          Element docElement = getXSDSchema().getDocument().getDocumentElement();
+//          if (!XSDDOMHelper.inputEquals(docElement, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+//          //        if (list.getLength() == 0)
+//          {
+//            // no schema tag. Enable the Add Schema action
+//            AddSchemaNodeAction action = new AddSchemaNodeAction(XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SCHEMA_NODE"));
+//            action.setEditor((XSDEditor) textEditor.getEditorPart());
+//            manager.add(action);
+//          }
+//        }
+//      }
+    }
+//    manager.add(new Separator());
+//    if (undoAction != null)
+//    {
+//      manager.add(undoAction);
+//      manager.add(redoAction);
+//    }
+    
+    manager.add(new Separator());
+    if (deleteAction != null)
+    {
+      manager.add(deleteAction);
+    }
+  }
+
+  protected String getBuiltInStringQName()
+  {
+    String stringName = "string";
+    if (getXSDSchema() != null)
+    {
+      String schemaForSchemaPrefix = getXSDSchema().getSchemaForSchemaQNamePrefix();
+      if (schemaForSchemaPrefix != null && schemaForSchemaPrefix.length() > 0)
+      {
+        String prefix = getXSDSchema().getSchemaForSchemaQNamePrefix();
+        if (prefix != null && prefix.length() > 0)
+        {
+          stringName = prefix + ":" + stringName;
+        }
+      }
+    }
+    return stringName;
+  }
+
+  /**
+   * Method addContextItems.
+   * 
+   * @param manager
+   * @param parent -
+   *          menu items should be context sensitive to this node
+   * @param relativeNode -
+   *          anything inserted, should be inserted before this node (which is a
+   *          child of the parent node. A value of null means add to the end
+   */
+  protected void addContextItems(IMenuManager manager, Element parent, Node relativeNode)
+  {
+    ArrayList attributes = null;
+    if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+    { //
+      addSchemaElementItems(manager, parent, relativeNode);
+      manager.add(new Separator());
+      boolean b = true;
+      NodeList children = parent.getChildNodes();
+      Node effectiveRelativeNode = parent.getFirstChild();
+      for (int i = 0; i < children.getLength() && b; i++)
+      {
+        Node child = children.item(i);
+        if (child != null && child instanceof Element)
+        {
+          if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.INCLUDE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.IMPORT_ELEMENT_TAG, false)
+              || XSDDOMHelper.inputEquals((Element) child, XSDConstants.REDEFINE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.ANNOTATION_ELEMENT_TAG, false))
+          {
+            effectiveRelativeNode = child;
+          }
+          else
+          {
+            b = false;
+          }
+        }
+      }
+      relativeNode = effectiveRelativeNode != null ? effectiveRelativeNode.getNextSibling() : null;
+      attributes = new ArrayList();
+      attributes.add(new DOMAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE, ""));
+      addCreateElementAction(manager, XSDConstants.INCLUDE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_INCLUDE"), attributes, parent, relativeNode);
+      addCreateElementAction(manager, XSDConstants.IMPORT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_IMPORT"), null, parent, relativeNode);
+      addCreateElementAction(manager, XSDConstants.REDEFINE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_REDEFINE"), attributes, parent, relativeNode);
+      attributes = null;
+      addCreateAnnotationAction(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), null, parent, relativeNode);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false))
+    { //
+      addCreateElementAction(manager, XSDConstants.DOCUMENTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_DOC"), attributes, parent, null);
+      addCreateElementAction(manager, XSDConstants.APPINFO_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_APP_INFO"), attributes, parent, null);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+    { //
+      Element parentNode = (Element) parent.getParentNode();
+      boolean isGlobalElement = false;
+      if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+      {
+        isGlobalElement = true;
+      }
+      boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+          parent.getFirstChild());
+      boolean simpleTypeExists = elementExists(XSDConstants.SIMPLETYPE_ELEMENT_TAG, parent);
+      boolean complexTypeExists = elementExists(XSDConstants.COMPLEXTYPE_ELEMENT_TAG, parent);
+      manager.add(new Separator());
+      if (annotationExists)
+      {
+        Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+        if (!(simpleTypeExists || complexTypeExists) && annotationNode != null)
+        {
+          //addCreateLocalSimpleTypeActionIfNotExist(manager,
+          // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+          // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+          // attributes, parent, annotationNode.getNextSibling());
+          //addCreateLocalComplexTypeActionIfNotExist(manager,
+          // XSDConstants.COMPLEXTYPE_ELEMENT_TAG, "Add Local Complex Type",
+          // attributes, parent, annotationNode.getNextSibling());
+          manager.add(new Separator());
+        }
+      }
+      else
+      {
+        // Should still be able to add the content models if the anonymous type
+        // exists,
+        // ie. with attributes
+        //        if (!(simpleTypeExists || complexTypeExists))
+        //        {
+        //addCreateLocalSimpleTypeActionIfNotExist(manager,
+        // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+        // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+        // attributes, parent, parent.getFirstChild());
+        //addCreateLocalComplexTypeActionIfNotExist(manager,
+        // XSDConstants.COMPLEXTYPE_ELEMENT_TAG, "Add Local Complex Type",
+        // attributes, parent, parent.getFirstChild());
+        XSDConcreteComponent concreteComponent = getXSDSchema().getCorrespondingComponent(parent);
+        if (concreteComponent != null)
+        {
+          AddModelGroupAction addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.SEQUENCE_LITERAL);
+          addModelGroupAction.setEnabled(!isReadOnly);
+          manager.add(addModelGroupAction);
+          
+          addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.CHOICE_LITERAL);
+          addModelGroupAction.setEnabled(!isReadOnly);
+          manager.add(addModelGroupAction);
+          
+          addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.ALL_LITERAL);
+          addModelGroupAction.setEnabled(!isReadOnly);
+          manager.add(addModelGroupAction);
+          
+          manager.add(new Separator());
+        }
+        //        }
+      }
+//      attributes = new ArrayList();
+//      attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_Unique"));
+//      addCreateIdentityConstraintsAction(manager, XSDConstants.UNIQUE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_UNIQUE"), attributes, parent, null);
+//      attributes = new ArrayList();
+//      attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_Key"));
+//      addCreateIdentityConstraintsAction(manager, XSDConstants.KEY_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_KEY"), attributes, parent, null);
+//      attributes = new ArrayList();
+//      attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_KeyRef"));
+//      addCreateIdentityConstraintsAction(manager, XSDConstants.KEYREF_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_KEY_REF"), attributes, parent, null);
+      XSDDOMHelper domHelper = new XSDDOMHelper();
+      Element anonymousType = (Element) domHelper.getChildNode(parent, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+      if (anonymousType != null)
+      {
+        manager.add(new Separator());
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("ComplexType")));
+        addMoveAnonymousGlobal(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, anonymousType, null);
+        attributes = null;
+      }
+      anonymousType = (Element) domHelper.getChildNode(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+      if (anonymousType != null)
+      {
+        manager.add(new Separator());
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("SimpleType")));
+        addMoveAnonymousGlobal(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, anonymousType, null);
+        attributes = null;
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.SEQUENCE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals(parent, XSDConstants.CHOICE_ELEMENT_TAG, false))
+    { //
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+      manager.add(new Separator());
+      addCreateElementAction(manager, XSDConstants.CHOICE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CHOICE"), attributes, parent, null);
+      addCreateElementAction(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SEQUENCE"), attributes, parent, null);
+      addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, null);
+      manager.add(new Separator());
+      attributes = new ArrayList();
+      attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ELEMENT_ELEMENT_TAG, "Element", false)));
+      attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+      addCreateElementAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ELEMENT"), attributes, parent, null);
+      addCreateElementRefAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ELEMENT_REF"), parent, null);
+      manager.add(new Separator());
+      attributes = null;
+      addCreateElementAction(manager, XSDConstants.ANY_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ELEMENT"), attributes, parent, null);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ALL_ELEMENT_TAG, false))
+    { //
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+      manager.add(new Separator());
+      attributes = new ArrayList();
+      attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ELEMENT_ELEMENT_TAG, "Element", false)));
+      attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+      addCreateElementAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ELEMENT"), attributes, parent, null);
+      addCreateElementRefAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ELEMENT_REF"), parent, null);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, false))
+    { //
+      boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+          parent.getFirstChild());
+      boolean anyAttributeExists = elementExists(XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, parent);
+      Node anyAttributeNode = null;
+      manager.add(new Separator());
+      if (anyAttributeExists)
+      {
+        anyAttributeNode = getFirstChildNodeIfExists(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false);
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+        attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+        addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+        attributes = null;
+        addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+        addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+      }
+      else
+      {
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+        attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+        addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+        attributes = null;
+        addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+        addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+      }
+      attributes = null;
+      addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, null);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.NOTATION_ELEMENT_TAG, false))
+    { //
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, null);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+    { //
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+      boolean restrictionExists = elementExists(XSDConstants.RESTRICTION_ELEMENT_TAG, parent);
+      boolean unionExists = elementExists(XSDConstants.UNION_ELEMENT_TAG, parent);
+      boolean listExists = elementExists(XSDConstants.LIST_ELEMENT_TAG, parent);
+      if (!(restrictionExists || unionExists || listExists))
+      {
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.BASE_ATTRIBUTE, getBuiltInStringQName()));
+        addCreateElementActionIfNotExist(manager, XSDConstants.RESTRICTION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_RESTRICTION"), attributes, parent, null);
+        attributes = null;
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE, getBuiltInStringQName()));
+        addCreateElementActionIfNotExist(manager, XSDConstants.UNION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_UNION"), attributes, parent, null);
+        attributes = null;
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE, getBuiltInStringQName()));
+        addCreateElementActionIfNotExist(manager, XSDConstants.LIST_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LIST"), attributes, parent, null);
+        attributes = null;
+      }
+      if (XSDDOMHelper.inputEquals(parent.getParentNode(), XSDConstants.ELEMENT_ELEMENT_TAG, false))
+      {
+        manager.add(new Separator());
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("SimpleType")));
+        addMoveAnonymousGlobal(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, parent, null);
+        attributes = null;
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.GROUP_ELEMENT_TAG, false))
+    { //
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+      addCreateElementActionIfNotExist(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, null);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+    { //
+      boolean annotationExists = false;
+      boolean contentExists = false;
+      boolean complexOrSimpleContentExists = false;
+      boolean anyAttributeExists = false;
+      Node annotationNode = null;
+      Node contentNode = null;
+      Node anyAttributeNode = null;
+      NodeList children = parent.getChildNodes();
+      for (int i = 0; i < children.getLength(); i++)
+      {
+        Node child = children.item(i);
+        if (child != null && child instanceof Element)
+        {
+          if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.ANNOTATION_ELEMENT_TAG, false))
+          {
+            annotationNode = child;
+            annotationExists = true;
+          }
+          else if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.SEQUENCE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.ALL_ELEMENT_TAG, false)
+              || XSDDOMHelper.inputEquals((Element) child, XSDConstants.CHOICE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.GROUP_ELEMENT_TAG, true)
+              || XSDDOMHelper.inputEquals((Element) child, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+          {
+            contentExists = true;
+            contentNode = child;
+            if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals((Element) child, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+            {
+              complexOrSimpleContentExists = true;
+            }
+          }
+          else if (XSDDOMHelper.inputEquals((Element) child, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false))
+          {
+            anyAttributeExists = true;
+            anyAttributeNode = child;
+          }
+        }
+      }
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+      manager.add(new Separator());
+      addSetBaseTypeAction(manager, parent);
+      XSDConcreteComponent concreteComponent = getXSDSchema().getCorrespondingComponent(parent);
+      if (annotationExists)
+      {
+        if (!contentExists)
+        {
+          // Add content model
+          // addCreateElementAction(manager, XSDConstants.SEQUENCE_ELEMENT_TAG,
+          // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"),
+          // attributes, parent, annotationNode.getNextSibling());
+          if (concreteComponent != null)
+          {
+            AddModelGroupAction addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.SEQUENCE_LITERAL);
+            addModelGroupAction.setEnabled(!isReadOnly);
+            manager.add(addModelGroupAction);
+            
+            addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.CHOICE_LITERAL);
+            addModelGroupAction.setEnabled(!isReadOnly);
+            manager.add(addModelGroupAction);
+            
+            addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.ALL_LITERAL);
+            addModelGroupAction.setEnabled(!isReadOnly);
+            manager.add(addModelGroupAction);
+
+          }
+          // Temporarily remove this until we provide a graphical rep of these
+          // components
+          //          addCreateSimpleContentAction(manager,
+          // XSDConstants.SIMPLECONTENT_ELEMENT_TAG,
+          // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_CONTENT"),
+          // attributes,
+          // parent, annotationNode.getNextSibling());
+          //          addCreateSimpleContentAction(manager,
+          // XSDConstants.COMPLEXCONTENT_ELEMENT_TAG,
+          // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_CONTENT"),
+          // attributes,
+          // parent, annotationNode.getNextSibling());
+          addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, annotationNode.getNextSibling());
+          attributes = null;
+        }
+      }
+      else
+      {
+        if (!contentExists)
+        {
+          // Add content model
+          // addCreateElementAction(manager, XSDConstants.SEQUENCE_ELEMENT_TAG,
+          // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"),
+          // attributes, parent, parent.getFirstChild());
+          if (concreteComponent != null)
+          {
+            AddModelGroupAction addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.SEQUENCE_LITERAL);
+            addModelGroupAction.setEnabled(!isReadOnly);
+            manager.add(addModelGroupAction);
+            
+            addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.CHOICE_LITERAL);
+            addModelGroupAction.setEnabled(!isReadOnly);
+            manager.add(addModelGroupAction);
+            
+            addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.ALL_LITERAL);
+            addModelGroupAction.setEnabled(!isReadOnly);
+            manager.add(addModelGroupAction);
+
+          }
+          // Temporarily remove this until we provide a graphical rep of these
+          // components
+          //          addCreateSimpleContentAction(manager,
+          // XSDConstants.SIMPLECONTENT_ELEMENT_TAG,
+          // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_CONTENT"),
+          // attributes,
+          // parent, parent.getFirstChild());
+          //          addCreateSimpleContentAction(manager,
+          // XSDConstants.COMPLEXCONTENT_ELEMENT_TAG,
+          // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_CONTENT"),
+          // attributes,
+          // parent, parent.getFirstChild());
+          addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, parent.getFirstChild());
+          attributes = null;
+        }
+      }
+      manager.add(new Separator());
+      if (anyAttributeExists)
+      {
+        if (!complexOrSimpleContentExists)
+        {
+//          attributes = new ArrayList();
+//          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+//          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+//          addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+//          attributes = null;
+//          // ARE ATTRIBUTE GROUPS ALLOWED ?
+//          //          addCreateElementAction(manager,
+//          // XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG,
+//          // "_UI_ACTION_ADD_ATTRIBUTE_GROUP", attributes, parent,
+//          // anyAttributeNode);
+//          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+//          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+        }
+      }
+      else
+      {
+        if (!complexOrSimpleContentExists)
+        {
+//          attributes = new ArrayList();
+//          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+//          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+//          addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+//          attributes = null;
+//          // ARE ATTRIBUTE GROUPS ALLOWED ?
+//          //          addCreateElementAction(manager,
+//          // XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG,
+//          // "_UI_ACTION_ADD_ATTRIBUTE_GROUP", attributes, parent,
+//          // parent.getLastChild());
+//          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+//          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+//          attributes = null;
+//          addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+        }
+      }
+      if (XSDDOMHelper.inputEquals(parent.getParentNode(), XSDConstants.ELEMENT_ELEMENT_TAG, false))
+      {
+        manager.add(new Separator());
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("ComplexType")));
+        addMoveAnonymousGlobal(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, parent, null);
+        attributes = null;
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+    { //
+      XSDDOMHelper xsdDOMHelper = new XSDDOMHelper();
+      Element derivedByNode = xsdDOMHelper.getDerivedByElement(parent);
+      String derivedByName = xsdDOMHelper.getDerivedByName(parent);
+      boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+          parent.getFirstChild());
+      manager.add(new Separator());
+      if (derivedByNode == null)
+      {
+        TypesHelper typesHelper = new TypesHelper(getXSDSchema());
+        String firstType = "";
+        List listOfCT = typesHelper.getUserComplexTypeNamesList();
+        if (listOfCT.size() > 0)
+        {
+          firstType = (String) (listOfCT).get(0);
+        }
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.BASE_ATTRIBUTE, firstType));
+        addCreateElementActionIfNotExist(manager, XSDConstants.RESTRICTION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_RESTRICTION"), attributes, parent, null);
+        addCreateElementActionIfNotExist(manager, XSDConstants.EXTENSION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_EXTENSION"), attributes, parent, null);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+    { //
+      XSDDOMHelper xsdDOMHelper = new XSDDOMHelper();
+      Element derivedByNode = xsdDOMHelper.getDerivedByElement(parent);
+      String derivedByName = xsdDOMHelper.getDerivedByName(parent);
+      boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+          parent.getFirstChild());
+      manager.add(new Separator());
+      if (derivedByNode == null)
+      {
+        TypesHelper typesHelper = new TypesHelper(getXSDSchema());
+        String firstType = "";
+        List listOfCT = typesHelper.getUserComplexTypeNamesList();
+        if (listOfCT.size() > 0)
+        {
+          firstType = (String) (listOfCT).get(0);
+        }
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.BASE_ATTRIBUTE, firstType));
+        addCreateElementActionIfNotExist(manager, XSDConstants.RESTRICTION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_RESTRICTION"), attributes, parent, null);
+        addCreateElementActionIfNotExist(manager, XSDConstants.EXTENSION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_EXTENSION"), attributes, parent, null);
+      }
+      /*
+       * for combined SimpleContent and derivedBy nodes (but without
+       * restrictions) XSDDOMHelper xsdDOMHelper = new XSDDOMHelper(); Element
+       * derivedByNode = xsdDOMHelper.getDerivedByElement(parent); String
+       * derivedByName = xsdDOMHelper.getDerivedByName(parent);
+       * 
+       * if (derivedByNode != null) { if (derivedByName.equals("restriction")) {
+       * addCreateElementActionIfNotExist(manager,
+       * XSDConstants.SIMPLETYPE_ELEMENT_TAG, "_UI_ACTION_ADD_SIMPLE_TYPE",
+       * attributes, derivedByNode, relativeNode); }
+       * addCreateElementActionIfNotExist(manager,
+       * XSDConstants.ANNOTATION_ELEMENT_TAG, "_UI_ACTION_ADD_ANNOTATION",
+       * attributes, derivedByNode, relativeNode);
+       * addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG,
+       * "_UI_ACTION_ADD_ATTRIBUTE", attributes, derivedByNode, relativeNode);
+       * attributes = new ArrayList(); attributes.add(new
+       * DOMAttribute(XSDConstants.REF_ATTRIBUTE, ""));
+       * addCreateElementAction(manager,
+       * XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG,
+       * "_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF", attributes, derivedByNode,
+       * relativeNode); attributes = new ArrayList();
+       * addCreateElementActionIfNotExist(manager,
+       * XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, "_UI_ACTION_ADD_ANY_ATTRIBUTE",
+       * attributes, derivedByNode, relativeNode); } else { TypesHelper
+       * typesHelper = new TypesHelper(getXSDSchema()); String firstType =
+       * (String)(typesHelper.getBuiltInTypeNamesList()).get(0); attributes =
+       * new ArrayList(); attributes.add(new
+       * DOMAttribute(XSDConstants.BASE_ATTRIBUTE, firstType));
+       * 
+       * addCreateElementActionIfNotExist(manager,
+       * XSDConstants.ANNOTATION_ELEMENT_TAG, "_UI_ACTION_ADD_ANNOTATION",
+       * attributes, parent, relativeNode);
+       * addCreateElementActionIfNotExist(manager,
+       * XSDConstants.RESTRICTION_ELEMENT_TAG, "_UI_ACTION_ADD_RESTRICTION",
+       * attributes, parent, relativeNode);
+       * addCreateElementActionIfNotExist(manager,
+       * XSDConstants.EXTENSION_ELEMENT_TAG, "_UI_ACTION_ADD_EXTENSION",
+       * attributes, parent, relativeNode); }
+       */
+      //      addCreateElementActionIfNotExist(manager,
+      // XSDConstants.SEQUENCE_ELEMENT_TAG,
+      // "_UI_ACTION_ADD_CONTENT_MODEL", attributes, parent, relativeNode);
+      //      attributes = new ArrayList();
+      //      attributes.add(new DOMAttribute(XSDConstants.REF_ATTRIBUTE, ""));
+      //      addCreateElementActionIfNotExist(manager,
+      // XSDConstants.GROUP_ELEMENT_TAG,
+      // "_UI_ADD_GROUP_REF", attributes, parent, relativeNode);
+      //      addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG,
+      // "_UI_ACTION_ADD_ATTRIBUTE", attributes, parent, relativeNode);
+      //      attributes = new ArrayList();
+      //      attributes.add(new DOMAttribute(XSDConstants.REF_ATTRIBUTE, ""));
+      //      addCreateElementAction(manager,
+      // XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG,
+      // "_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF", attributes, parent,
+      // relativeNode);
+      //      addCreateElementActionIfNotExist(manager,
+      // XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, "_UI_ACTION_ADD_ANY_ATTRIBUTE",
+      // attributes, parent, relativeNode);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.RESTRICTION_ELEMENT_TAG, false))
+    {
+      Element parentNode = (Element) parent.getParentNode();
+      // <simpleContent>
+      //    <restriction>
+      //      ...
+      if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+      {
+        boolean annotationExists = false;
+        boolean anyAttributeExists = false;
+        Node anyAttributeNode = null;
+        anyAttributeExists = elementExists(XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, parent);
+        annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent
+            .getFirstChild());
+        if (annotationExists)
+        {
+          Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+          //addCreateLocalSimpleTypeActionIfNotExist(manager,
+          // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+          // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+          // attributes, parent, annotationNode.getNextSibling());
+        }
+        else
+        {
+          //addCreateLocalSimpleTypeActionIfNotExist(manager,
+          // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+          // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+          // attributes, parent, parent.getFirstChild());
+        }
+        /*
+         * addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG,
+         * "_UI_ACTION_ADD_ATTRIBUTE", attributes, parent, relativeNode);
+         * attributes = new ArrayList(); attributes.add(new
+         * DOMAttribute(XSDConstants.REF_ATTRIBUTE, ""));
+         * addCreateElementAction(manager,
+         * XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG,
+         * "_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF", attributes, parent,
+         * relativeNode); attributes = new ArrayList();
+         * addCreateElementActionIfNotExist(manager,
+         * XSDConstants.ANYATTRIBUTE_ELEMENT_TAG,
+         * "_UI_ACTION_ADD_ANY_ATTRIBUTE", attributes, parent, relativeNode);
+         */
+        manager.add(new Separator());
+        if (anyAttributeExists)
+        {
+          anyAttributeNode = getFirstChildNodeIfExists(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false);
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+          addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+          attributes = null;
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+        }
+        else
+        {
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+          addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+          attributes = null;
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+        }
+        attributes = null;
+        addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+      }
+      // <simpleType>
+      //    <restriction>
+      //      ...
+      else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+      {
+        boolean annotationExists = false;
+        attributes = null;
+        annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent
+            .getFirstChild());
+        if (annotationExists)
+        {
+          Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+          addCreateLocalSimpleTypeActionIfNotExist(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, annotationNode
+              .getNextSibling());
+        }
+        else
+        {
+          addCreateLocalSimpleTypeActionIfNotExist(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, parent
+              .getFirstChild());
+        }
+        manager.add(new Separator());
+        addCreateElementAction(manager, XSDConstants.PATTERN_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_PATTERN"), attributes, parent, null);
+        addCreateElementAction(manager, XSDConstants.ENUMERATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ENUM"), attributes, parent, null);
+        addEnumsAction(manager, XSDConstants.ENUMERATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ENUMS"), attributes, parent, null);
+      }
+      // <complexContent>
+      //    <restriction>
+      //      ...
+      else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+      {
+        boolean annotationExists = false;
+        boolean anyAttributeExists = false;
+        Node anyAttributeNode = null;
+        boolean sequenceExists = elementExists(XSDConstants.SEQUENCE_ELEMENT_TAG, parent);
+        boolean choiceExists = elementExists(XSDConstants.CHOICE_ELEMENT_TAG, parent);
+        boolean allExists = elementExists(XSDConstants.ALL_ELEMENT_TAG, parent);
+        boolean groupExists = elementExists(XSDConstants.GROUP_ELEMENT_TAG, parent);
+        anyAttributeExists = elementExists(XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, parent);
+        annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent
+            .getFirstChild());
+        manager.add(new Separator());
+        if (annotationExists)
+        {
+          if (!(sequenceExists || choiceExists || allExists || groupExists))
+          {
+            Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+            addCreateElementActionIfNotExist(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, annotationNode
+                .getNextSibling());
+            //            addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG,
+            // "_UI_ACTION_ADD_GROUP", attributes, parent,
+            // annotationNode.getNextSibling());
+            addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, annotationNode.getNextSibling());
+          }
+        }
+        else
+        {
+          if (!(sequenceExists || choiceExists || allExists || groupExists))
+          {
+            addCreateElementActionIfNotExist(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, parent.getFirstChild());
+            //            addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG,
+            // "_UI_ACTION_ADD_GROUP", attributes, parent,
+            // parent.getFirstChild());
+            addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, parent.getFirstChild());
+          }
+        }
+        manager.add(new Separator());
+        if (anyAttributeExists)
+        {
+          anyAttributeNode = getFirstChildNodeIfExists(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false);
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+          addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+          attributes = null;
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+        }
+        else
+        {
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+          addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+          attributes = null;
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+        }
+        attributes = null;
+        addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.EXTENSION_ELEMENT_TAG, false))
+    { //
+      Element parentNode = (Element) parent.getParentNode();
+      // <simpleContent>
+      //    <extension>
+      //      ...
+      if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+      {
+        boolean annotationExists = false;
+        boolean anyAttributeExists = false;
+        Node anyAttributeNode = null;
+        anyAttributeExists = elementExists(XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, parent);
+        annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent
+            .getFirstChild());
+        manager.add(new Separator());
+        if (anyAttributeExists)
+        {
+          anyAttributeNode = getFirstChildNodeIfExists(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false);
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+          addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+          attributes = null;
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+        }
+        else
+        {
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+          addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+          attributes = null;
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+        }
+        attributes = null;
+        addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+      }
+      // <complexContent>
+      //    <extension>
+      //      ...
+      else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+      {
+        boolean annotationExists = false;
+        boolean anyAttributeExists = false;
+        Node anyAttributeNode = null;
+        boolean sequenceExists = elementExists(XSDConstants.SEQUENCE_ELEMENT_TAG, parent);
+        boolean choiceExists = elementExists(XSDConstants.CHOICE_ELEMENT_TAG, parent);
+        boolean allExists = elementExists(XSDConstants.ALL_ELEMENT_TAG, parent);
+        boolean groupExists = elementExists(XSDConstants.GROUP_ELEMENT_TAG, parent);
+        anyAttributeExists = elementExists(XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, parent);
+        annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent
+            .getFirstChild());
+        manager.add(new Separator());
+        if (annotationExists)
+        {
+          if (!(sequenceExists || choiceExists || allExists || groupExists))
+          {
+            Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+            addCreateElementActionIfNotExist(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, annotationNode
+                .getNextSibling());
+            //            addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG,
+            // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GROUP"), attributes,
+            // parent,
+            // annotationNode.getNextSibling());
+            addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, annotationNode.getNextSibling());
+          }
+        }
+        else
+        {
+          if (!(sequenceExists || choiceExists || allExists || groupExists))
+          {
+            addCreateElementActionIfNotExist(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, parent.getFirstChild());
+            //            addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG,
+            // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GROUP"), attributes,
+            // parent,
+            // parent.getFirstChild());
+            addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, parent.getFirstChild());
+          }
+        }
+        manager.add(new Separator());
+        if (anyAttributeExists)
+        {
+          anyAttributeNode = getFirstChildNodeIfExists(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false);
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+          addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+          attributes = null;
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+        }
+        else
+        {
+          attributes = new ArrayList();
+          attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+          attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+          addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+          attributes = null;
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+          addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+        }
+        attributes = null;
+        addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.REDEFINE_ELEMENT_TAG, false))
+    { //
+      addCreateElementAction(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, null);
+      addCreateElementAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_TYPE"), attributes, parent, null);
+      addCreateElementAction(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_TYPE"), attributes, parent, null);
+      addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GROUP"), attributes, parent, null);
+      addCreateElementAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP"), attributes, parent, null);
+      manager.add(new Separator());
+      addOpenSchemaAction(manager, XSDEditorPlugin.getXSDString("_UI_ACTION_OPEN_SCHEMA"), parent);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.LIST_ELEMENT_TAG, false))
+    { //
+      boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+          parent.getFirstChild());
+      manager.add(new Separator());
+      addCreateLocalSimpleTypeActionIfNotExist(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, null);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.UNION_ELEMENT_TAG, false))
+    { //
+      boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+          parent.getFirstChild());
+      manager.add(new Separator());
+      addCreateLocalSimpleTypeAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, null);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.UNIQUE_ELEMENT_TAG, false))
+    { //
+      boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+          parent.getFirstChild());
+      manager.add(new Separator());
+      attributes = new ArrayList();
+      attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+      if (annotationExists)
+      {
+        Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+        addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, annotationNode.getNextSibling());
+      }
+      else
+      {
+        addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, parent.getFirstChild());
+      }
+      attributes = new ArrayList();
+      attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+      addCreateElementAction(manager, XSDConstants.FIELD_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_FIELD"), attributes, parent, null);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.KEYREF_ELEMENT_TAG, false))
+    { //
+      boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+          parent.getFirstChild());
+      manager.add(new Separator());
+      attributes = new ArrayList();
+      attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+      if (annotationExists)
+      {
+        Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+        addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, annotationNode.getNextSibling());
+      }
+      else
+      {
+        addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, parent.getFirstChild());
+      }
+      attributes = new ArrayList();
+      attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+      addCreateElementAction(manager, XSDConstants.FIELD_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_FIELD"), attributes, parent, null);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.KEY_ELEMENT_TAG, false))
+    { //
+      boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+          parent.getFirstChild());
+      manager.add(new Separator());
+      attributes = new ArrayList();
+      attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+      if (annotationExists)
+      {
+        Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+        addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, annotationNode.getNextSibling());
+      }
+      else
+      {
+        addCreateElementActionIfNotExist(manager, XSDConstants.SELECTOR_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SELECTOR"), attributes, parent, parent.getFirstChild());
+      }
+      attributes = new ArrayList();
+      attributes.add(new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, ""));
+      addCreateElementAction(manager, XSDConstants.FIELD_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_FIELD"), attributes, parent, null);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.IMPORT_ELEMENT_TAG, false))
+    {
+      addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+      manager.add(new Separator());
+      addOpenSchemaAction(manager, XSDEditorPlugin.getXSDString("_UI_ACTION_OPEN_SCHEMA"), parent);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.SELECTOR_ELEMENT_TAG, false))
+    {
+      addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.FIELD_ELEMENT_TAG, false))
+    {
+      addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.INCLUDE_ELEMENT_TAG, false))
+    {
+      addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+      manager.add(new Separator());
+      addOpenSchemaAction(manager, XSDEditorPlugin.getXSDString("_UI_ACTION_OPEN_SCHEMA"), parent);
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ANY_ELEMENT_TAG, false))
+    {
+      addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false))
+    {
+      addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+    {
+      addCreateElementActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+      addCreateLocalSimpleTypeActionIfNotExist(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, null);
+    }
+    // Facets all have optional annotation nodes
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MINEXCLUSIVE_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MININCLUSIVE_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MAXEXCLUSIVE_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MAXINCLUSIVE_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.TOTALDIGITS_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.FRACTIONDIGITS_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.LENGTH_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MINLENGTH_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.MAXLENGTH_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ENUMERATION_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.WHITESPACE_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.PATTERN_ELEMENT_TAG, false))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, true))
+    {
+      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+    }
+    else if (XSDDOMHelper.inputEquals(parent, XSDConstants.ELEMENT_ELEMENT_TAG, true))
+    {
+      // TODO common this up with the non-ref case
+//      addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+      XSDConcreteComponent xsdConcreteComponent = (XSDConcreteComponent)getXSDSchema().getCorrespondingComponent(parent);
+      if (xsdConcreteComponent instanceof XSDElementDeclaration)
+      {
+        XSDElementDeclaration xsdElementDeclaration = (XSDElementDeclaration)xsdConcreteComponent;
+        XSDElementDeclaration resolvedElementDeclaration = xsdElementDeclaration.getResolvedElementDeclaration();
+        if (resolvedElementDeclaration.getRootContainer() == xsdSchema)
+        {
+          parent = resolvedElementDeclaration.getElement(); 
+        
+          Element parentNode = (Element) parent.getParentNode();
+
+          boolean isGlobalElement = false;
+          if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+          {
+            isGlobalElement = true;
+          }
+          boolean annotationExists = addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent,
+              parent.getFirstChild());
+          boolean simpleTypeExists = elementExists(XSDConstants.SIMPLETYPE_ELEMENT_TAG, parent);
+          boolean complexTypeExists = elementExists(XSDConstants.COMPLEXTYPE_ELEMENT_TAG, parent);
+          manager.add(new Separator());
+          if (annotationExists)
+          {
+            Node annotationNode = getFirstChildNodeIfExists(parent, XSDConstants.ANNOTATION_ELEMENT_TAG, false);
+            if (!(simpleTypeExists || complexTypeExists) && annotationNode != null)
+            {
+              //addCreateLocalSimpleTypeActionIfNotExist(manager,
+              // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+              // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+              // attributes, parent, annotationNode.getNextSibling());
+              //addCreateLocalComplexTypeActionIfNotExist(manager,
+              // XSDConstants.COMPLEXTYPE_ELEMENT_TAG, "Add Local Complex Type",
+              // attributes, parent, annotationNode.getNextSibling());
+              manager.add(new Separator());
+            }
+          }
+          else
+          {
+            // Should still be able to add the content models if the anonymous type
+            // exists,
+            // ie. with attributes
+            //        if (!(simpleTypeExists || complexTypeExists))
+            //        {
+            //addCreateLocalSimpleTypeActionIfNotExist(manager,
+            // XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+            // XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"),
+            // attributes, parent, parent.getFirstChild());
+            //addCreateLocalComplexTypeActionIfNotExist(manager,
+            // XSDConstants.COMPLEXTYPE_ELEMENT_TAG, "Add Local Complex Type",
+            // attributes, parent, parent.getFirstChild());
+            XSDConcreteComponent concreteComponent = getXSDSchema().getCorrespondingComponent(parent);
+            if (concreteComponent != null)
+            {
+              AddModelGroupAction addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.SEQUENCE_LITERAL);
+              addModelGroupAction.setEnabled(!isReadOnly);
+              manager.add(addModelGroupAction);
+              
+              addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.CHOICE_LITERAL);
+              addModelGroupAction.setEnabled(!isReadOnly);
+              manager.add(addModelGroupAction);
+              
+              addModelGroupAction = new AddModelGroupAction(concreteComponent, XSDCompositor.ALL_LITERAL);
+              addModelGroupAction.setEnabled(!isReadOnly);
+              manager.add(addModelGroupAction);
+              
+              manager.add(new Separator());
+            }
+            //        }
+          }
+    //      attributes = new ArrayList();
+    //      attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_Unique"));
+    //      addCreateIdentityConstraintsAction(manager, XSDConstants.UNIQUE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_UNIQUE"), attributes, parent, null);
+    //      attributes = new ArrayList();
+    //      attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_Key"));
+    //      addCreateIdentityConstraintsAction(manager, XSDConstants.KEY_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_KEY"), attributes, parent, null);
+    //      attributes = new ArrayList();
+    //      attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, "New_KeyRef"));
+    //      addCreateIdentityConstraintsAction(manager, XSDConstants.KEYREF_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_KEY_REF"), attributes, parent, null);
+          XSDDOMHelper domHelper = new XSDDOMHelper();
+          Element anonymousType = (Element) domHelper.getChildNode(parent, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+          if (anonymousType != null)
+          {
+            manager.add(new Separator());
+            attributes = new ArrayList();
+            attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("ComplexType")));
+            addMoveAnonymousGlobal(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, anonymousType, null);
+            attributes = null;
+          }
+          anonymousType = (Element) domHelper.getChildNode(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+          if (anonymousType != null)
+          {
+            manager.add(new Separator());
+            attributes = new ArrayList();
+            attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("SimpleType")));
+            addMoveAnonymousGlobal(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_MAKE_ANONYMOUS_TYPE_GLOBAL"), attributes, anonymousType, null);
+            attributes = null;
+          }
+        }
+      }
+    }
+    /*
+     * These have none else if (XSDDOMHelper.inputEquals(parent,
+     * XSDConstants.DOCUMENTATION_ELEMENT_TAG, false)) { } else if
+     * (XSDDOMHelper.inputEquals(parent, XSDConstants.APPINFO_ELEMENT_TAG,
+     * false)) { }
+     */
+  }
+
+  protected void addContextInsertItems(IMenuManager manager, Element parent, Element currentElement, Node relativeNode)
+  {
+    ArrayList attributes = null;
+    if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.INCLUDE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals(currentElement, XSDConstants.IMPORT_ELEMENT_TAG, false)
+        || XSDDOMHelper.inputEquals(currentElement, XSDConstants.REDEFINE_ELEMENT_TAG, false) || XSDDOMHelper.inputEquals(currentElement, XSDConstants.ANNOTATION_ELEMENT_TAG, false))
+    {
+      if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+      {
+        attributes = new ArrayList();
+        attributes.add(new DOMAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE, ""));
+        addCreateElementAction(manager, XSDConstants.INCLUDE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_INCLUDE"), attributes, parent, relativeNode);
+        addCreateElementAction(manager, XSDConstants.IMPORT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_IMPORT"), null, parent, relativeNode);
+        addCreateElementAction(manager, XSDConstants.REDEFINE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_REDEFINE"), attributes, parent, relativeNode);
+        attributes = null;
+        addCreateElementAction(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), null, parent, relativeNode);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+    {
+      if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+      {
+        addSchemaElementItems(manager, parent, relativeNode);
+      }
+      //      else if (XSDDOMHelper.inputEquals(parent,
+      // XSDConstants.LIST_ELEMENT_TAG,
+      // false))
+      //      {
+      //        addCreateElementAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG,
+      // "_UI_ACTION_ADD_SIMPLE_TYPE", attributes, parent, relativeNode);
+      //      }
+      else if (XSDDOMHelper.inputEquals(parent, XSDConstants.UNION_ELEMENT_TAG, false))
+      {
+        addCreateLocalSimpleTypeAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LOCAL_SIMPLE_TYPE"), attributes, parent, relativeNode);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+    {
+      if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+      {
+        addSchemaElementItems(manager, parent, relativeNode);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.GROUP_ELEMENT_TAG, false))
+    {
+      if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+      {
+        addSchemaElementItems(manager, parent, relativeNode);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, false))
+    {
+      if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+      {
+        addSchemaElementItems(manager, parent, relativeNode);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+    {
+      if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+      {
+        addSchemaElementItems(manager, parent, relativeNode);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+    {
+      if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+      {
+        addSchemaElementItems(manager, parent, relativeNode);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.NOTATION_ELEMENT_TAG, false))
+    {
+      if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+      {
+        addSchemaElementItems(manager, parent, relativeNode);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.DOCUMENTATION_ELEMENT_TAG, false))
+    {
+      addCreateElementAction(manager, XSDConstants.DOCUMENTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_DOC"), attributes, parent, relativeNode);
+      addCreateElementAction(manager, XSDConstants.APPINFO_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_APP_INFO"), attributes, parent, relativeNode);
+    }
+    else if (XSDDOMHelper.inputEquals(currentElement, XSDConstants.APPINFO_ELEMENT_TAG, false))
+    {
+      addCreateElementAction(manager, XSDConstants.DOCUMENTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_DOC"), attributes, parent, relativeNode);
+      addCreateElementAction(manager, XSDConstants.APPINFO_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_APP_INFO"), attributes, parent, relativeNode);
+    }
+  }
+
+  protected String getNewGlobalName(String elementTag, String description)
+  {
+    return getNewGlobalName(elementTag, description, false);
+  }
+
+  protected String getNewGlobalTypeName(String description)
+  {
+    return getNewGlobalName(null, description, true);
+  }
+
+  protected String getNewGlobalName(String elementTag, String description, boolean isSimpleOrComplexType)
+  {  
+     return getNewName(getXSDSchema().getDocument(), elementTag, description, isSimpleOrComplexType);
+  }
+
+  // TODO.. .we need to rewrite this code to me model driven... not document driven
+  //
+  protected String getNewName(Node parentNode, String elementTag, String description, boolean isSimpleOrComplexType)
+  {
+    NodeList list = null;
+    NodeList typeList2 = null;
+    // if the global name is for a simple or complex type, we ignore the
+    // elementTag and populate 2 lists
+    // one to look for all simple types and the other to look for all complex
+    // types
+    if (isSimpleOrComplexType)
+    {
+      if (parentNode instanceof Document)
+      {
+        list = ((Document) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+        typeList2 = ((Document) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+      }
+      else if (parentNode instanceof Element)
+      {
+        list = ((Element) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+        typeList2 = ((Element) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+      }
+    }
+    else
+    {
+      if (parentNode instanceof Document)
+      {
+        list = ((Document) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, elementTag);
+      }
+      else if (parentNode instanceof Element)
+      {
+        list = ((Element) parentNode).getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, elementTag);
+      }
+    }
+    String name = "New" + description;
+    if (list == null || list.getLength() == 0 && (typeList2 != null && typeList2.getLength() == 0))
+    {
+      return name;
+    }
+    for (int i = 1; i < 100; i++)
+    {
+      boolean newName = false;
+      for (int j = 0; j < list.getLength(); j++)
+      {
+        String currName = ((Element) list.item(j)).getAttribute(XSDConstants.NAME_ATTRIBUTE);
+        if (currName == null || currName.length() == 0)
+        {
+          continue;
+        }
+        if (currName.equals(name))
+        {
+          name = "New" + description + String.valueOf(i);
+          newName = true;
+          break;
+        }
+      }
+      // if there is another type list and we haven't created a new name, then
+      // check the type list
+      if (typeList2 != null && !newName)
+      {
+        for (int j = 0; j < typeList2.getLength(); j++)
+        {
+          String currName = ((Element) typeList2.item(j)).getAttribute(XSDConstants.NAME_ATTRIBUTE);
+          if (currName == null || currName.length() == 0)
+          {
+            continue;
+          }
+          if (currName.equals(name))
+          {
+            name = "New" + description + String.valueOf(i);
+            break;
+          }
+        }
+      }
+    }
+    return name;
+  }
+
+  protected String getFirstGlobalElementTagName(String elementTag)
+  {
+    //XMLModel model = getXMLModel();
+    //if (model != null)
+    {
+      String targetNamespace = "";
+      XSDSchema schema = getXSDSchema();
+      TypesHelper helper = new TypesHelper(schema);
+      String prefix = "";
+      if (schema != null)
+      {
+        prefix = helper.getPrefix(schema.getTargetNamespace(), true);
+      }
+      // get the schema node
+      NodeList slist = schema.getDocument().getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, XSDConstants.SCHEMA_ELEMENT_TAG);
+      Node schemaNode = null;
+      if (slist != null && slist.getLength() > 0)
+      {
+        schemaNode = slist.item(0);
+      }
+      NodeList list = null;
+      // get the schema's direct children - hence, globals
+      if (schemaNode != null)
+      {
+        list = schemaNode.getChildNodes();
+      }
+      String name = null;
+      if (list != null)
+      {
+        // Performance issue perhaps?
+        for (int i = 0; i < list.getLength(); i++)
+        {
+          if (list.item(i) instanceof Element)
+          {
+            if (list.item(i).getLocalName().equals(elementTag))
+            {
+              name = ((Element) list.item(i)).getAttribute(XSDConstants.NAME_ATTRIBUTE);
+              if (name != null && name.length() > 0)
+              {
+                return prefix + name;
+              }
+            }
+          }
+        }
+      }
+      if (elementTag.equals(XSDConstants.ELEMENT_ELEMENT_TAG))
+      {
+        return helper.getGlobalElement(schema);
+      }
+      else if (elementTag.equals(XSDConstants.ATTRIBUTE_ELEMENT_TAG))
+      {
+        return helper.getGlobalAttribute(schema);
+      }
+      else if (elementTag.equals(XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG))
+      {
+        return helper.getGlobalAttributeGroup(schema);
+      }
+      else if (elementTag.equals(XSDConstants.GROUP_ELEMENT_TAG))
+      {
+        return helper.getModelGroup(schema);
+      }
+    }
+    return null;
+  }
+
+  protected void addSchemaElementItems(IMenuManager manager, Element parent, Node relativeNode)
+  {
+    ArrayList attributes = null;
+    // Add Edit Namespaces menu action
+    //////////////// Externalize String below!!!!!
+    XSDEditNamespacesAction nsAction = new XSDEditNamespacesAction(XSDEditorPlugin.getXSDString("_UI_ACTION_EDIT_NAMESPACES"), parent, relativeNode, getXSDSchema());
+    manager.add(nsAction);
+    manager.add(new Separator());
+    DOMAttribute nameAttribute = new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("ComplexType"));
+    attributes = new ArrayList();
+    attributes.add(nameAttribute);
+    Action action = addCreateElementAction(manager, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_TYPE"), attributes, parent, relativeNode);
+    ((CreateElementAction) action).setIsGlobal(true);
+    attributes = new ArrayList();
+    attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalTypeName("SimpleType")));
+    action = addCreateElementAction(manager, XSDConstants.SIMPLETYPE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_TYPE"), attributes, parent, relativeNode);
+    ((CreateElementAction) action).setIsGlobal(true);
+    attributes = new ArrayList();
+    attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ELEMENT_ELEMENT_TAG, "GlobalElement")));
+    attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+    action = addCreateElementAction(manager, XSDConstants.ELEMENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GLOBAL_ELEMENT"), attributes, parent, relativeNode);
+    ((CreateElementAction) action).setIsGlobal(true);
+    attributes = new ArrayList();
+    attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ATTRIBUTE_ELEMENT_TAG, "GlobalAttribute")));
+    attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+    action = addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GLOBAL_ATTRIBUTE"), attributes, parent, relativeNode);
+    ((CreateElementAction) action).setIsGlobal(true);
+    attributes = new ArrayList();
+    attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, "AttributeGroup")));
+    action = addCreateElementAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP"), attributes, parent, relativeNode);
+    ((CreateElementAction) action).setIsGlobal(true);
+    attributes = new ArrayList();
+    attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.GROUP_ELEMENT_TAG, "Group")));
+    CreateGroupAction groupAction = addCreateGroupAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_GROUP"), attributes, parent, relativeNode);
+    groupAction.setIsGlobal(true);
+    attributes = new ArrayList();
+    attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE, getNewGlobalName(XSDConstants.NOTATION_ELEMENT_TAG, "Notation")));
+    attributes.add(new DOMAttribute(XSDConstants.PUBLIC_ATTRIBUTE, ""));
+    action = addCreateElementAction(manager, XSDConstants.NOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_NOTATION"), attributes, parent, relativeNode);
+    ((CreateElementAction) action).setIsGlobal(true);
+    action = addCreateElementAction(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), null, parent, relativeNode);
+    ((CreateElementAction) action).setIsGlobal(true);
+  }
+
+  // returns whether element exists already
+  protected boolean addCreateElementActionIfNotExist(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    //    if
+    // (!(parent.getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+    // elementTag).getLength() > 0))
+    //    XSDDOMHelper helper = new XSDDOMHelper();
+    //    if (helper.getChildNode(parent, elementTag) == null)
+    if (getFirstChildNodeIfExists(parent, elementTag, false) == null)
+    {
+      addCreateElementAction(manager, elementTag, label, attributes, parent, relativeNode);
+      return false;
+    }
+    return true;
+  }
+
+  protected Action addCreateElementAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    CreateElementAction action = new CreateElementAction(label);
+    action.setElementTag(elementTag);
+    action.setAttributes(attributes);
+    action.setParentNode(parent);
+    action.setRelativeNode(relativeNode);
+    action.setXSDSchema(getXSDSchema());
+    action.setSelectionProvider(selectionProvider);
+    action.setEnabled(!isReadOnly);
+    manager.add(action);
+    return action;
+  }
+
+  protected void addCreateElementAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode, boolean isEnabled)
+  {
+    Action action = addCreateElementAction(manager, elementTag, label, attributes, parent, relativeNode);
+    action.setEnabled(isEnabled);
+  }
+
+  protected void addCreateElementRefAction(IMenuManager manager, String elementTag, String label, Element parent, Node relativeNode)
+  {
+    ArrayList attributes = new ArrayList();
+    String ref = getFirstGlobalElementTagName(elementTag);
+    attributes.add(new DOMAttribute(XSDConstants.REF_ATTRIBUTE, ref));
+    Action action = addCreateElementAction(manager, elementTag, label, attributes, parent, relativeNode);
+    action.setEnabled(ref != null);
+    if (ref != null)
+    {
+      action.setEnabled(!isReadOnly);
+    }
+  }
+
+  protected void addCreateSimpleContentAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    //    if
+    // (!(parent.getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+    // elementTag).getLength() > 0))
+    if (getFirstChildNodeIfExists(parent, elementTag, false) == null)
+    {
+      CreateSimpleContentAction action = new CreateSimpleContentAction(label, getXSDSchema());
+      action.setElementTag(elementTag);
+      action.setAttributes(attributes);
+      action.setParentNode(parent);
+      action.setRelativeNode(relativeNode);
+      action.setEnabled(!isReadOnly);
+      manager.add(action);
+    }
+  }
+
+  protected CreateGroupAction addCreateGroupAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    CreateGroupAction action = new CreateGroupAction(label, getXSDSchema());
+    action.setElementTag(elementTag);
+    action.setAttributes(attributes);
+    action.setParentNode(parent);
+    action.setRelativeNode(relativeNode);
+    action.setXSDSchema(getXSDSchema());
+    action.setSelectionProvider(selectionProvider);
+    action.setEnabled(!isReadOnly);
+    manager.add(action);
+    return action;
+  }
+
+  protected void addCreateIdentityConstraintsAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    CreateIdentityConstraintsAction action = new CreateIdentityConstraintsAction(label, getXSDSchema());
+    action.setElementTag(elementTag);
+    action.setAttributes(attributes);
+    action.setParentNode(parent);
+    action.setRelativeNode(relativeNode);
+    action.setXSDSchema(getXSDSchema());
+    action.setSelectionProvider(selectionProvider);
+    action.setEnabled(!isReadOnly);
+    manager.add(action);
+  }
+
+  protected void addEnumsAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    AddEnumsAction action = new AddEnumsAction(label);
+    action.setElementTag(elementTag);
+    action.setAttributes(attributes);
+    action.setParentNode(parent);
+    action.setRelativeNode(relativeNode);
+    action.setDescription(XSDEditorPlugin.getXSDString("_UI_ENUMERATIONS_DIALOG_TITLE"));
+    action.setEnabled(!isReadOnly);
+    manager.add(action);
+  }
+
+  protected Action addCreateSimpleTypeAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    CreateSimpleTypeAction action = new CreateSimpleTypeAction(label);
+    action.setElementTag(elementTag);
+    action.setAttributes(attributes);
+    action.setParentNode(parent);
+    action.setRelativeNode(relativeNode);
+    action.setXSDSchema(getXSDSchema());
+    action.setSelectionProvider(selectionProvider);
+    action.setEnabled(!isReadOnly);
+    manager.add(action);
+    return action;
+  }
+
+  protected boolean addCreateLocalSimpleTypeActionIfNotExist(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    //    if
+    // (!(parent.getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+    // elementTag).getLength() > 0))
+    //    XSDDOMHelper helper = new XSDDOMHelper();
+    //    if (helper.getChildNode(parent, elementTag) == null)
+    if (getFirstChildNodeIfExists(parent, elementTag, false) == null)
+    {
+      addCreateLocalSimpleTypeAction(manager, elementTag, label, attributes, parent, relativeNode);
+      return false;
+    }
+    return true;
+  }
+
+  protected void addSetBaseTypeAction(IMenuManager manager, Element element)
+  {
+    SetBaseTypeAction action = new SetBaseTypeAction(XSDEditorPlugin.getXSDString("_UI_ACTION_SET_BASE_TYPE"));// +
+    // "...");
+    action.setComplexTypeElement(element);
+    action.setXSDSchema(getXSDSchema());
+    action.setEnabled(!isReadOnly);
+    manager.add(action);
+  }
+
+  protected void addCreateLocalSimpleTypeAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    CreateLocalSimpleTypeAction action = new CreateLocalSimpleTypeAction(label);
+    action.setElementTag(elementTag);
+    action.setAttributes(attributes);
+    action.setParentNode(parent);
+    action.setRelativeNode(relativeNode);
+    action.setXSDSchema(getXSDSchema());
+    action.setSelectionProvider(selectionProvider);
+    action.setEnabled(!isReadOnly);
+    manager.add(action);
+  }
+
+  protected boolean addCreateLocalComplexTypeActionIfNotExist(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    if (getFirstChildNodeIfExists(parent, elementTag, false) == null)
+    {
+      addCreateLocalComplexTypeAction(manager, elementTag, label, attributes, parent, relativeNode);
+      return false;
+    }
+    return true;
+  }
+
+  protected void addCreateLocalComplexTypeAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    CreateLocalComplexTypeAction action = new CreateLocalComplexTypeAction(label);
+    action.setElementTag(elementTag);
+    action.setAttributes(attributes);
+    action.setParentNode(parent);
+    action.setRelativeNode(relativeNode);
+    action.setXSDSchema(getXSDSchema());
+    action.setSelectionProvider(selectionProvider);
+    action.setEnabled(!isReadOnly);
+    manager.add(action);
+  }
+
+  protected boolean addCreateAnnotationActionIfNotExist(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    //    if
+    // (!(parent.getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+    // elementTag).getLength() > 0))
+    //    XSDDOMHelper helper = new XSDDOMHelper();
+    //    if (helper.getChildNode(parent, elementTag) == null)
+    // CS... I comment the
+    //
+    //if (getFirstChildNodeIfExists(parent, elementTag, false) == null)
+    //{
+    //  addCreateAnnotationAction(manager,elementTag,label,attributes,parent,relativeNode);
+    //  return false;
+    //}
+    //return true;
+    return false;
+  }
+
+  protected void addOpenSchemaAction(IMenuManager manager, String label, Element parent)
+  {
+    OpenSchemaAction openAction = new OpenSchemaAction(label, getXSDSchema().getCorrespondingComponent(parent));
+    manager.add(openAction);
+  }
+
+  protected void addMoveAnonymousGlobal(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    MakeAnonymousGlobal action = new MakeAnonymousGlobal(label, parent, getXSDSchema());
+    action.setElementTag(elementTag);
+    action.setAttributes(attributes);
+    action.setParentNode(getXSDSchema().getElement());
+    action.setRelativeNode(relativeNode);
+    action.setEnabled(!isReadOnly);
+    manager.add(action);
+  }
+
+  protected void addCreateAnnotationAction(IMenuManager manager, String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    CreateAnnotationAction action = new CreateAnnotationAction(label);
+    action.setElementTag(elementTag);
+    action.setAttributes(attributes);
+    action.setParentNode(parent);
+    action.setRelativeNode(relativeNode);
+    action.setEnabled(!isReadOnly);
+    manager.add(action);
+  }
+
+  protected Node getFirstChildNodeIfExists(Node parent, String elementTag, boolean isRef)
+  {
+    if (parent == null)
+      return null;
+    NodeList children = parent.getChildNodes();
+    Node targetNode = null;
+    for (int i = 0; i < children.getLength(); i++)
+    {
+      Node child = children.item(i);
+      if (child != null && child instanceof Element)
+      {
+        if (XSDDOMHelper.inputEquals((Element) child, elementTag, isRef))
+        {
+          targetNode = child;
+          break;
+        }
+      }
+    }
+    return targetNode;
+  }
+
+  protected boolean elementExists(String elementTag, Element parent)
+  {
+    if (!(parent.getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, elementTag).getLength() > 0))
+    {
+      return false;
+    }
+    return true;
+  }
+
+  /**
+   * Returns the deleteAction.
+   * 
+   * @return DeleteAction
+   */
+  public DeleteAction getDeleteAction()
+  {
+    return deleteAction;
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMultiPageEditorPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMultiPageEditorPart.java
new file mode 100644
index 0000000..b11e09a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDMultiPageEditorPart.java
@@ -0,0 +1,726 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+
+import org.eclipse.core.internal.resources.ResourceException;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+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.jface.preference.IPreferenceStore;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.ITextInputListener;
+import org.eclipse.swt.events.ShellAdapter;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorActionBarContributor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPropertyListener;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.IWorkbench;
+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.MultiPageEditorPart;
+import org.eclipse.ui.part.MultiPageEditorSite;
+import org.eclipse.wst.sse.core.IStructuredModel;
+import org.eclipse.wst.sse.core.exceptions.SourceEditingRuntimeException;
+import org.eclipse.wst.sse.ui.StructuredTextEditor;
+import org.eclipse.wst.sse.ui.nls.ResourceHandler;
+import org.eclipse.wst.xml.core.XMLPreferenceNames;
+import org.eclipse.wst.xml.ui.StructuredTextEditorXML;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+public class XSDMultiPageEditorPart extends MultiPageEditorPart implements IPropertyListener
+{
+
+  /**
+   * 
+   */
+  public XSDMultiPageEditorPart()
+  {
+    super();
+  }
+  
+  /**
+   * Internal part activation listener
+   */
+  class PartListener extends ShellAdapter implements IPartListener {
+    private IWorkbenchPart fActivePart;
+    private boolean fIsHandlingActivation = false;
+
+    private void handleActivation() {
+
+      if (fIsHandlingActivation)
+        return;
+
+      if (fActivePart == XSDMultiPageEditorPart.this) {
+        fIsHandlingActivation = true;
+        try {
+          safelySanityCheckState();
+        }
+        finally {
+          fIsHandlingActivation = false;
+        }
+      }
+    }
+
+    /**
+     * @see IPartListener#partActivated(IWorkbenchPart)
+     */
+    public void partActivated(IWorkbenchPart part) {
+      fActivePart = part;
+      handleActivation();
+    }
+
+    /**
+     * @see IPartListener#partBroughtToTop(IWorkbenchPart)
+     */
+    public void partBroughtToTop(IWorkbenchPart part) {
+    }
+
+    /**
+     * @see IPartListener#partClosed(IWorkbenchPart)
+     */
+    public void partClosed(IWorkbenchPart part) {
+    }
+
+    /**
+     * @see IPartListener#partDeactivated(IWorkbenchPart)
+     */
+    public void partDeactivated(IWorkbenchPart part) {
+      fActivePart = null;
+    }
+
+    /**
+     * @see IPartListener#partOpened(IWorkbenchPart)
+     */
+    public void partOpened(IWorkbenchPart part) {
+    }
+
+    /*
+     * @see ShellListener#shellActivated(ShellEvent)
+     */
+    public void shellActivated(ShellEvent e) {
+      handleActivation();
+    }
+  }
+
+  class TextInputListener implements ITextInputListener {
+    public void inputDocumentAboutToBeChanged(IDocument oldInput, IDocument newInput) {
+    }
+
+    public void inputDocumentChanged(IDocument oldInput, IDocument newInput) {
+    }
+  }
+
+  /** The source page index. */
+  private int fSourcePageIndex;
+  /** The text editor. */
+  private StructuredTextEditor fTextEditor;
+
+  private PartListener partListener;
+
+
+  /*
+   * This method is just to make firePropertyChanged accessbible from some
+   * (anonomous) inner classes.
+   */
+  protected void _firePropertyChange(int property) {
+    super.firePropertyChange(property);
+  }
+
+  /**
+   * Adds the source page of the multi-page editor.
+   */
+  protected void addSourcePage() throws PartInitException {
+    try {
+      fSourcePageIndex = addPage(fTextEditor, getEditorInput());
+      setPageText(fSourcePageIndex, XSDEditorPlugin.getXSDString("_UI_TAB_SOURCE")); //$NON-NLS-1$
+      // the update's critical, to get viewer selection manager and
+      // highlighting to work
+      fTextEditor.update();
+  
+      firePropertyChange(PROP_TITLE);
+  
+      // Changes to the Text Viewer's document instance should also force an
+      // input refresh
+      fTextEditor.getTextViewer().addTextInputListener(new TextInputListener());
+    }
+    catch (PartInitException exception) {
+      // dispose editor
+      dispose();
+
+      throw new SourceEditingRuntimeException(ResourceHandler.getString("An_error_has_occurred_when1_ERROR_")); //$NON-NLS-1$
+    }
+  }
+
+
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.part.MultiPageEditorPart#createPages()
+   */
+  protected void createPages()
+  {
+    try
+    {
+      // source page MUST be created before design page, now
+      createSourcePage();
+      addSourcePage();
+      setActivePage();
+
+    // future_TODO: add a catch block here for any exception the design
+    // page throws and convert it into a more informative message.
+    }
+    catch (PartInitException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  /**
+   * @see org.eclipse.ui.part.MultiPageEditorPart#createSite(org.eclipse.ui.IEditorPart)
+   */
+  protected IEditorSite createSite(IEditorPart editor) {
+    IEditorSite site = null;
+    if (editor == fTextEditor) {
+      site = new MultiPageEditorSite(this, editor) {
+        /**
+         * @see org.eclipse.ui.part.MultiPageEditorSite#getActionBarContributor()
+         */
+        public IEditorActionBarContributor getActionBarContributor() {
+          IEditorActionBarContributor contributor = super.getActionBarContributor();
+          IEditorActionBarContributor multiContributor = XSDMultiPageEditorPart.this.getEditorSite().getActionBarContributor();
+//          if (multiContributor instanceof XMLMultiPageEditorActionBarContributor) {
+//            contributor = ((XMLMultiPageEditorActionBarContributor) multiContributor).sourceViewerActionContributor;
+//          }
+          return contributor;
+        }
+      };
+    }
+    else {
+      site = super.createSite(editor);
+    }
+    return site;
+  }
+
+  /**
+   * Creates the source page of the multi-page editor.
+   */
+  protected void createSourcePage() throws PartInitException {
+    fTextEditor = createTextEditor();
+    fTextEditor.setEditorPart(this);
+
+    // Set the SourceViewerConfiguration now so the text editor won't use
+    // the default configuration first
+    // and switch to the StructuredTextViewerConfiguration later.
+    // DMW removed setSourceViewerConfiguration 3/26/2003 since added
+    // createPartControl to our text editor.
+    // fTextEditor.setSourceViewerConfiguration();
+    fTextEditor.addPropertyListener(this);
+  }
+
+  /**
+   * Method createTextEditor.
+   * 
+   * @return StructuredTextEditor
+   */
+  protected StructuredTextEditor createTextEditor() {
+    return new StructuredTextEditorXML();
+  }
+
+  public void dispose()
+  {
+    IWorkbenchWindow window = getSite().getWorkbenchWindow();
+    window.getPartService().removePartListener(partListener);
+    window.getShell().removeShellListener(partListener);
+
+    getSite().getPage().removePartListener(partListener);
+    if (fTextEditor != null) {
+      fTextEditor.removePropertyListener(this);
+    }
+
+    // moved to last when added window ... seems like
+    // we'd be in danger of losing some data, like site,
+    // or something.
+    super.dispose();
+  }
+
+  /*
+   * (non-Javadoc) Saves the contents of this editor. <p> Subclasses must
+   * override this method to implement the open-save-close lifecycle for an
+   * editor. For greater details, see <code> IEditorPart </code></p>
+   * 
+   * @see IEditorPart
+   */
+  public void doSave(IProgressMonitor monitor) {
+    fTextEditor.doSave(monitor);
+    //    // this is a temporary way to force validation.
+    //    // when the validator is a workbench builder, the following lines
+    // can be removed
+    //    if (fDesignViewer != null)
+    //      fDesignViewer.saveOccurred();
+
+  }
+
+  /*
+   * (non-Javadoc) Saves the contents of this editor to another object. <p>
+   * Subclasses must override this method to implement the open-save-close
+   * lifecycle for an editor. For greater details, see <code> IEditorPart
+   * </code></p>
+   * 
+   * @see IEditorPart
+   */
+  public void doSaveAs() {
+    fTextEditor.doSaveAs();
+    // 253619
+    // following used to be executed here, but is
+    // now called "back" from text editor (since
+    // mulitiple paths to the performSaveAs in StructuredTextEditor.
+    //doSaveAsForStructuredTextMulitPagePart();
+  }
+
+  private void editorInputIsAcceptable(IEditorInput input) throws PartInitException {
+    if (input instanceof IFileEditorInput) {
+      // verify that it can be opened
+      CoreException[] coreExceptionArray = new CoreException[1];
+      if (fileDoesNotExist((IFileEditorInput) input, coreExceptionArray)) {
+        // todo use message formatter for {0}
+        Throwable coreException = coreExceptionArray[0];
+        if (coreException instanceof ResourceException) {
+          // I'm assuming this is always 'does not exist'
+          // we'll refresh local go mimic behavior of default
+          // editor, where the
+          // troublesome file is refreshed (and will cause it to
+          // 'disappear' from Navigator.
+          try {
+            ((IFileEditorInput) input).getFile().refreshLocal(IResource.DEPTH_ZERO, new NullProgressMonitor());
+          }
+          catch (CoreException ce) {
+            // very unlikely
+//            Logger.logException(ce);
+          }
+          throw new PartInitException(ResourceHandler.getString("23concat_EXC_", (new Object[]{input.getName()}))); //$NON-NLS-1$
+          //$NON-NLS-1$ = "Resource {0} does not exist."
+        }
+        else {
+          throw new PartInitException(ResourceHandler.getString("32concat_EXC_", (new Object[]{input.getName()}))); //$NON-NLS-1$
+          //$NON-NLS-1$ = "Editor could not be open on {0}"
+        }
+      }
+    }
+    else if (input instanceof IStorageEditorInput) {
+      InputStream contents = null;
+      try {
+        contents = ((IStorageEditorInput) input).getStorage().getContents();
+      }
+      catch (CoreException noStorageExc) {
+      }
+      if (contents == null) {
+        throw new PartInitException(ResourceHandler.getString("32concat_EXC_", (new Object[]{input.getName()}))); //$NON-NLS-1$
+      }
+      else {
+        try {
+          contents.close();
+        }
+        catch (IOException e) {
+        }
+      }
+    }
+  }
+
+  //  void doSaveAsForStructuredTextMulitPagePart() {
+  //    setPageText(getActivePage(), fTextEditor.getTitle());
+  //    setInput(fTextEditor.getEditorInput());
+  //    if (fDesignViewer != null) {
+  //      //fDesignViewer.setEditorInput(fTextEditor.getEditorInput());
+  //      fDesignViewer.setModel(getModel());
+  //      fDesignViewer.saveAsOccurred();
+  //    }
+  //    // even though we've set title etc., several times already!
+  //    // only now is all prepared for it.
+  //    firePropertyChange(IWorkbenchPart.PROP_TITLE);
+  //    firePropertyChange(PROP_DIRTY);
+  //  }
+  /*
+   * (non-Javadoc) Initializes the editor part with a site and input. <p>
+   * Subclasses of <code> EditorPart </code> must implement this method.
+   * Within the implementation subclasses should verify that the input type
+   * is acceptable and then save the site and input. Here is sample code:
+   * </p><pre> if (!(input instanceof IFileEditorInput)) throw new
+   * PartInitException("Invalid Input: Must be IFileEditorInput");
+   * setSite(site); setInput(editorInput); </pre>
+   */
+  protected boolean fileDoesNotExist(IFileEditorInput input, Throwable[] coreException) {
+    boolean result = false;
+    InputStream inStream = null;
+    if ((!(input.exists())) || (!(input.getFile().exists()))) {
+      result = true;
+    }
+    else {
+      try {
+        inStream = input.getFile().getContents(true);
+      }
+      catch (CoreException e) {
+        // very likely to be file not found
+        result = true;
+        coreException[0] = e;
+      }
+      finally {
+        if (input != null) {
+          try {
+            if (inStream != null) {
+              inStream.close();
+            }
+          }
+          catch (IOException e) {
+
+          }
+        }
+      }
+    }
+    return result;
+  }
+
+  public Object getAdapter(Class key) {
+    Object result = null;
+
+      // DMW: I'm bullet-proofing this because
+      // its been reported (on 4.03 version) a null pointer sometimes
+      // happens here on startup, when an editor has been left
+      // open when workbench shutdown.
+      if (fTextEditor != null) {
+        result = fTextEditor.getAdapter(key);
+      }
+    return result;
+  }
+
+  /**
+   * IExtendedMarkupEditor method
+   */
+  public Node getCaretNode() {
+    if (getTextEditor() == null)
+      return null;
+
+    return getTextEditor().getCaretNode();
+  }
+
+  /**
+   * IExtendedSimpleEditor method
+   */
+  public int getCaretPosition() {
+    if (getTextEditor() == null)
+      return -1;
+
+    return getTextEditor().getCaretPosition();
+  }
+
+  /**
+   * IExtendedSimpleEditor method
+   */
+  public IDocument getDocument() {
+    if (getTextEditor() == null)
+      return null;
+
+    return getTextEditor().getDocument();
+  }
+
+  /**
+   * IExtendedMarkupEditor method
+   */
+  public Document getDOMDocument() {
+    if (getTextEditor() == null)
+      return null;
+
+    return getTextEditor().getDOMDocument();
+  }
+
+  /**
+   * IExtendedSimpleEditor method
+   */
+  public IEditorPart getEditorPart() {
+    return this;
+  }
+
+  protected IStructuredModel getModel() {
+    IStructuredModel model = null;
+    if (fTextEditor != null)
+      model = fTextEditor.getModel();
+    return model;
+  }
+
+  protected IPreferenceStore getPreferenceStore() {
+    return XSDEditorPlugin.getPlugin().getPreferenceStore();
+  }
+
+  /**
+   * IExtendedMarkupEditor method
+   */
+  public List getSelectedNodes() {
+    if (getTextEditor() == null)
+      return null;
+    return getTextEditor().getSelectedNodes();
+  }
+
+  /**
+   * IExtendedSimpleEditor method
+   */
+  public Point getSelectionRange() {
+    if (getTextEditor() == null)
+      return new Point(-1, -1);
+
+    return getTextEditor().getSelectionRange();
+  }
+
+  public StructuredTextEditor getTextEditor() {
+    return fTextEditor;
+  }
+
+  /*
+   * (non-Javadoc) Method declared on IWorkbenchPart.
+   */
+  public String getTitle() {
+    String title = null;
+    if (getTextEditor() == null) {
+      if (getEditorInput() != null) {
+        title = getEditorInput().getName();
+      }
+    }
+    else {
+      title = getTextEditor().getTitle();
+    }
+    if (title == null) {
+      title = getPartName();
+    }
+    return title;
+  }
+
+  /*
+   * (non-Javadoc) Sets the cursor and selection state for this editor to
+   * the passage defined by the given marker. <p> Subclasses may override.
+   * For greater details, see <code> IEditorPart </code></p>
+   * 
+   * @see IEditorPart
+   */
+  public void gotoMarker(IMarker marker) {
+    // (pa) 20020217 this was null when opening an editor that was
+    // already open
+    if (fTextEditor != null) {
+      IGotoMarker markerGotoer = (IGotoMarker) fTextEditor.getAdapter(IGotoMarker.class);
+      markerGotoer.gotoMarker(marker);
+    }
+  }
+
+  public void init(IEditorSite site, IEditorInput input) throws PartInitException {
+    editorInputIsAcceptable(input);
+    try {
+      super.init(site, input);
+      if (partListener == null) {
+        partListener = new PartListener();
+      }
+      //getSite().getPage().addPartListener(partListner);
+      // we want to listen for our own activation
+      IWorkbenchWindow window = getSite().getWorkbenchWindow();
+      window.getPartService().addPartListener(partListener);
+      window.getShell().addShellListener(partListener);
+    }
+    catch (Exception e) {
+      if (e instanceof SourceEditingRuntimeException) {
+        Throwable t = ((SourceEditingRuntimeException) e).getOriginalException();
+        if (t instanceof IOException) {
+          System.out.println(t);
+          // file not found
+        }
+      }
+    }
+    setPartName(input.getName());
+  }
+
+  /*
+   * (non-Javadoc) Returns whether the "save as" operation is supported by
+   * this editor. <p> Subclasses must override this method to implement the
+   * open-save-close lifecycle for an editor. For greater details, see
+   * <code> IEditorPart </code></p>
+   * 
+   * @see IEditorPart
+   */
+  public boolean isSaveAsAllowed() {
+    return fTextEditor != null && fTextEditor.isSaveAsAllowed();
+  }
+
+  /*
+   * (non-Javadoc) Returns whether the contents of this editor should be
+   * saved when the editor is closed. <p> This method returns <code> true
+   * </code> if and only if the editor is dirty ( <code> isDirty </code> ).
+   * </p>
+   */
+  public boolean isSaveOnCloseNeeded() {
+    // overriding super class since it does a lowly isDirty!
+    if (fTextEditor != null)
+      return fTextEditor.isSaveOnCloseNeeded();
+    return isDirty();
+  }
+
+  /**
+   * Notifies this multi-page editor that the page with the given id has
+   * been activated. This method is called when the user selects a different
+   * tab.
+   * 
+   * @param newPageIndex
+   *            the index of the activated page
+   */
+  protected void pageChange(int newPageIndex) {
+    super.pageChange(newPageIndex);
+
+    saveLastActivePageIndex(newPageIndex);
+  }
+
+  /**
+   * Posts the update code "behind" the running operation.
+   */
+  protected void postOnDisplayQue(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();
+  }
+
+  /**
+   * Indicates that a property has changed.
+   * 
+   * @param source
+   *            the object whose property has changed
+   * @param propId
+   *            the id of the property which has changed; property ids are
+   *            generally defined as constants on the source class
+   */
+  public void propertyChanged(Object source, int propId) {
+    switch (propId) {
+      // had to implement input changed "listener" so that
+      // strucutedText could tell it containing editor that
+      // the input has change, when a 'resource moved' event is
+      // found.
+      case IEditorPart.PROP_INPUT :
+      case IEditorPart.PROP_DIRTY : {
+        if (source == fTextEditor) {
+          if (fTextEditor.getEditorInput() != getEditorInput()) {
+            setInput(fTextEditor.getEditorInput());
+            // title should always change when input changes.
+            // create runnable for following post call
+            Runnable runnable = new Runnable() {
+              public void run() {
+                _firePropertyChange(IWorkbenchPart.PROP_TITLE);
+              }
+            };
+            // Update is just to post things on the display queue
+            // (thread). We have to do this to get the dirty
+            // property to get updated after other things on the
+            // queue are executed.
+            postOnDisplayQue(runnable);
+          }
+        }
+        break;
+      }
+      case IWorkbenchPart.PROP_TITLE : {
+        // update the input if the title is changed
+        if (source == fTextEditor) {
+          if (fTextEditor.getEditorInput() != getEditorInput()) {
+            setInput(fTextEditor.getEditorInput());
+          }
+        }
+        break;
+      }
+      default : {
+        // propagate changes. Is this needed? Answer: Yes.
+        if (source == fTextEditor) {
+          firePropertyChange(propId);
+        }
+        break;
+      }
+    }
+
+  }
+
+  protected void safelySanityCheckState() {
+    // If we're called before editor is created, simply ignore since we
+    // delegate this function to our embedded TextEditor
+    if (getTextEditor() == null)
+      return;
+
+    getTextEditor().safelySanityCheckState(getEditorInput());
+
+  }
+
+  protected void saveLastActivePageIndex(int newPageIndex) {
+    // save the last active page index to preference manager
+    getPreferenceStore().setValue(XMLPreferenceNames.LAST_ACTIVE_PAGE, newPageIndex);
+  }
+
+  /**
+   * Sets the currently active page.
+   */
+  protected void setActivePage() {
+    // retrieve the last active page index from preference manager
+    int activePageIndex = getPreferenceStore().getInt(XMLPreferenceNames.LAST_ACTIVE_PAGE);
+
+    // We check this range since someone could hand edit the XML
+    // preference file to an invalid value ... which I know from
+    // experience :( ... if they do, we'll reset to default and continue
+    // rather than throw an assertion error in the setActivePage(int)
+    // method.
+    if (activePageIndex < 0 || activePageIndex >= getPageCount()) {
+      activePageIndex = fSourcePageIndex;
+    }
+    setActivePage(activePageIndex);
+  }
+
+  /*
+   * (non-Javadoc)
+   * 
+   * @see org.eclipse.ui.part.EditorPart#setInput(org.eclipse.ui.IEditorInput)
+   */
+  protected void setInput(IEditorInput input) {
+    // If driven from the Source page, it's "model" may not be up to date
+    // with the input just yet. We'll rely on later notification from the
+    // TextViewer to set us straight
+    super.setInput(input);
+    setPartName(input.getName());
+  }
+
+  /**
+   * IExtendedMarkupEditor method
+   */
+  public IStatus validateEdit(Shell context) {
+    if (getTextEditor() == null)
+      return new Status(IStatus.ERROR, XSDEditorPlugin.PLUGIN_ID, IStatus.INFO, "", null); //$NON-NLS-1$
+
+    return getTextEditor().validateEdit(context);
+  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDSelectionManager.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDSelectionManager.java
new file mode 100644
index 0000000..ad2673a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDSelectionManager.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+public class XSDSelectionManager implements ISelectionProvider, ISelectionChangedListener
+{
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+   */
+  public void addSelectionChangedListener(ISelectionChangedListener listener)
+  {
+    listenerList.add(listener);
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
+   */
+  public ISelection getSelection()
+  {
+    return currentSelection;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(org.eclipse.jface.viewers.ISelectionChangedListener)
+   */
+  public void removeSelectionChangedListener(ISelectionChangedListener listener)
+  {
+    listenerList.remove(listener);
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(org.eclipse.jface.viewers.ISelection)
+   */
+  public void setSelection(ISelection selection)
+  {
+    setSelection(selection, this);
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+   */
+  public void selectionChanged(SelectionChangedEvent event)
+  {
+    if (enableNotify)
+    {
+      setSelection(event.getSelection(), event.getSelectionProvider());
+    }
+  }
+
+  
+  protected List listenerList = new ArrayList();
+  protected ISelection currentSelection;
+  protected boolean enableNotify = true;
+
+  public void setSelection(ISelection selection, ISelectionProvider source)
+  {  
+	//System.out.println("SelectionManager.setSelection() " + selection + ", " + source);
+    if (enableNotify)
+    {
+      currentSelection = selection;
+      enableNotify = false;
+      try
+      {
+        SelectionChangedEvent event = new SelectionChangedEvent(source, selection);
+        List copyOfListenerList = new ArrayList(listenerList);
+        for (Iterator i = copyOfListenerList.iterator(); i.hasNext(); )
+        {
+          ISelectionChangedListener listener = (ISelectionChangedListener)i.next();
+          listener.selectionChanged(event);
+        }
+      }
+      finally
+      {
+        enableNotify = true;
+      }
+    }
+  }      
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDTextEditor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDTextEditor.java
new file mode 100644
index 0000000..0c6773f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDTextEditor.java
@@ -0,0 +1,405 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.jface.text.source.IVerticalRuler;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
+import org.eclipse.ui.views.properties.IPropertySheetPage;
+import org.eclipse.wst.common.contentmodel.modelquery.ModelQuery;
+import org.eclipse.wst.sse.ui.StructuredTextViewer;
+import org.eclipse.wst.sse.ui.edit.util.StructuredTextEditorActionConstants;
+import org.eclipse.wst.sse.ui.internal.openon.OpenOnAction;
+import org.eclipse.wst.sse.ui.nls.ResourceHandler;
+import org.eclipse.wst.sse.ui.view.events.INodeSelectionListener;
+import org.eclipse.wst.sse.ui.view.events.NodeSelectionChangedEvent;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.ui.StructuredTextEditorXML;
+import org.eclipse.wst.xsd.ui.internal.properties.section.XSDTabbedPropertySheetPage;
+import org.eclipse.wst.xsd.ui.internal.provider.CategoryAdapter;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDAdapterFactoryLabelProvider;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDContentProvider;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDModelAdapterFactoryImpl;
+import org.eclipse.wst.xsd.ui.internal.util.SelectionAdapter;
+import org.eclipse.xsd.XSDComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class XSDTextEditor extends StructuredTextEditorXML implements INodeSelectionListener, ISelectionChangedListener
+{
+  protected XSDSelectionManager xsdSelectionManager;
+  protected XSDModelAdapterFactoryImpl xsdModelAdapterFactory;
+  protected static XSDAdapterFactoryLabelProvider adapterFactoryLabelProvider;
+  protected InternalSelectionProvider internalSelectionProvider = new InternalSelectionProvider();
+
+  public XSDTextEditor(XSDEditor xsdEditor)
+  {
+    super();
+    xsdSelectionManager = xsdEditor.getSelectionManager();
+    xsdSelectionManager.addSelectionChangedListener(this);
+
+    setHelpContextId(XSDEditorContextIds.XSDE_SOURCE_VIEW);
+    
+    xsdModelAdapterFactory = new XSDModelAdapterFactoryImpl();
+    adapterFactoryLabelProvider = new XSDAdapterFactoryLabelProvider(xsdModelAdapterFactory);
+  }
+  
+  public void dispose()
+  {
+    super.dispose();
+    xsdSelectionManager.removeSelectionChangedListener(this);
+  }
+  
+  public XSDModelAdapterFactoryImpl getXSDModelAdapterFactory()
+  {
+    return xsdModelAdapterFactory;
+  }
+
+  public static XSDAdapterFactoryLabelProvider getLabelProvider()
+  {
+    return adapterFactoryLabelProvider;
+  }
+
+	public Object getAdapter(Class required) {
+	  
+		if (IPropertySheetPage.class.equals(required))
+    {
+	    fPropertySheetPage = new XSDTabbedPropertySheetPage(getXSDEditor());
+      
+	    ((XSDTabbedPropertySheetPage)fPropertySheetPage).setXSDModelAdapterFactory(xsdModelAdapterFactory);
+      ((XSDTabbedPropertySheetPage)fPropertySheetPage).setSelectionManager(getXSDEditor().getSelectionManager());
+	    ((XSDTabbedPropertySheetPage)fPropertySheetPage).setXSDSchema(getXSDSchema());
+
+      return fPropertySheetPage;
+		}
+		else if (IContentOutlinePage.class.equals(required))
+		{
+			if (fOutlinePage == null || fOutlinePage.getControl() == null || fOutlinePage.getControl().isDisposed())
+			{
+				XSDContentOutlinePage outlinePage = new XSDContentOutlinePage(this);
+        XSDContentProvider xsdContentProvider = new XSDContentProvider(xsdModelAdapterFactory);
+        xsdContentProvider.setXSDSchema(getXSDSchema());
+	      outlinePage.setContentProvider(xsdContentProvider);
+	      outlinePage.setLabelProvider(adapterFactoryLabelProvider);
+				outlinePage.setModel(getXSDSchema().getDocument());
+				
+				// Update outline selection from source editor selection:
+	      getViewerSelectionManager().addNodeSelectionListener(this);
+	      internalSelectionProvider.addSelectionChangedListener(getViewerSelectionManager());
+	      internalSelectionProvider.setEventSource(outlinePage);
+
+				fOutlinePage = outlinePage;
+			}
+			return fOutlinePage;
+		}
+	
+		return super.getAdapter(required);
+	}
+  
+  XSDModelQueryContributor xsdModelQueryContributor = new XSDModelQueryContributor();
+
+  protected XSDContentOutlinePage outlinePage;
+
+  /*
+   * @see StructuredTextEditor#getContentOutlinePage()
+   */
+  public IContentOutlinePage getContentOutlinePage()
+  {
+    return fOutlinePage;
+  }
+
+  // used to map selections from the outline view to the source view
+  // this class thinks of selections in terms of DOM element
+  class InternalSelectionProvider extends SelectionAdapter
+  {
+    protected Object getObjectForOtherModel(Object object)
+    {
+      Node node = null;
+
+      if (object instanceof Node)
+      {
+        node = (Node)object;
+      }
+      else if (object instanceof XSDComponent)
+      {
+        node = ((XSDComponent)object).getElement();
+      }
+      else if (object instanceof CategoryAdapter)
+      {
+        node = ((CategoryAdapter)object).getXSDSchema().getElement();
+      }
+
+      // the text editor can only accept sed nodes!
+      //
+      if (!(node instanceof XMLNode))
+      {
+        node = null;
+      }
+      return node;
+    }
+  }
+
+  public void selectionChanged(SelectionChangedEvent event)
+  {
+    // here we convert the model selection to a node selection req'd for the source view
+    //
+    internalSelectionProvider.setSelection(event.getSelection());
+  }
+
+  public void nodeSelectionChanged(NodeSelectionChangedEvent event)
+  {
+    // here we convert an node seleciton to a model selection as req'd by the other views
+    //
+    if (!event.getSource().equals(internalSelectionProvider) && getXSDEditor().getActiveEditorPage() != null)
+    {
+      Element element = null;
+      List list = event.getSelectedNodes();
+      for (Iterator i = list.iterator(); i.hasNext();)
+      {
+        Node node = (Node)i.next();
+        if (node != null)
+        {
+	        if (node.getNodeType() == Node.ELEMENT_NODE)
+	        {
+	          element = (Element)node;
+	          break;
+	        }
+	        else if (node.getNodeType() == Node.ATTRIBUTE_NODE)
+	        {
+	          element = ((Attr)node).getOwnerElement();
+	          break;
+	        }
+        }
+      }
+
+      Object o = element;
+      if (element != null)
+      {
+        Object modelObject = getXSDSchema().getCorrespondingComponent(element);
+        if (modelObject != null)
+        {
+          o = modelObject;
+        }
+      }
+
+      if (o != null)
+      {
+        xsdSelectionManager.setSelection(new StructuredSelection(o), internalSelectionProvider);
+      }
+      else
+      {
+        xsdSelectionManager.setSelection(new StructuredSelection(), internalSelectionProvider);
+      }
+    }
+  }
+
+  
+  /*
+   * @see ITextEditor#doRevertToSaved()
+   */
+  public void doRevertToSaved()
+  {
+    super.doRevertToSaved();
+  }
+
+  /*
+   * @see StructuredTextEditor#update()
+   */
+  public void update()
+  {
+    super.update();
+    if (outlinePage != null)
+     outlinePage.setModel(getModel());
+  }
+
+  protected Composite client;
+  
+  protected void addOpenOnSelectionListener()
+  {
+    getTextViewer().getTextWidget().addKeyListener(new KeyAdapter()
+    {
+      /**
+         * @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
+         */
+      public void keyReleased(KeyEvent arg0)
+      {
+        if (arg0.keyCode == SWT.F3)
+        {
+          getXSDEditor().getOpenOnSelectionHelper().openOnSelection();
+        }
+      }
+
+    });
+  }
+
+ // private static Color dividerColor;
+
+	protected ISourceViewer createSourceViewer(Composite parent, IVerticalRuler verticalRuler, int styles) {
+
+		fAnnotationAccess= createAnnotationAccess();
+		fOverviewRuler= createOverviewRuler(getSharedColors());
+
+		StructuredTextViewer sourceViewer = createStructedTextViewer(parent, verticalRuler, styles);
+		initSourceViewer(sourceViewer);
+
+    // end of super createSourceViewer
+		
+    //StructuredAnnotationAccess annotationAccess = new StructuredAnnotationAccess();
+	 // DefaultMarkerAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess();
+		
+	//  ISharedTextColors sharedColors = getTextColorsCache();
+////  fOverviewRuler = new OverviewRuler(annotationAccess, OVERVIEW_RULER_WIDTH, sharedColors);
+	//  fOverviewRuler = new OverviewRuler(createAnnotationAccess(), 12, sharedColors);
+	  
+//	  fOverviewRuler.addHeaderAnnotationType(StructuredAnnotationType.ERROR);
+//	  fOverviewRuler.addHeaderAnnotationType(StructuredAnnotationType.WARNING);
+	  
+	 // fSourceViewerDecorationSupport = new SourceViewerDecorationSupport(sourceViewer, fOverviewRuler, annotationAccess, sharedColors);
+    //configureSourceViewerDecorationSupport(fSourceViewerDecorationSupport);    
+
+// The following method was removed
+//    sourceViewer.setEditor(this);
+
+		return sourceViewer;
+	}
+
+  /*
+   * @see StructuredTextEditor#setModel(IFileEditorInput)
+   */
+  public void setModel(IFileEditorInput input)
+  {                     
+    super.setModel(input);
+    if (getModel() instanceof XMLModel)
+    {
+      xsdModelQueryContributor.setModel((XMLModel)getModel());
+    }
+    file = input.getFile();
+  }
+
+  protected IFile file;
+
+
+  /**
+   * Gets the xsdSchema.
+   * @return Returns a XSDSchema
+   */
+  public XSDSchema getXSDSchema()
+  {
+    return ((XSDEditor)getEditorPart()).getXSDSchema();
+  }
+  
+  public XSDEditor getXSDEditor()
+  {
+    return (XSDEditor)getEditorPart();
+  }
+ 
+  /**
+   * @see org.eclipse.ui.texteditor.AbstractTextEditor#safelySanityCheckState(IEditorInput)
+   */
+	public void safelySanityCheckState(IEditorInput input)
+  {
+    super.safelySanityCheckState(input);
+  }
+
+  protected class WrappedOpenFileAction extends OpenOnAction
+  {
+    /**
+     * Constructor for WrappedAction.
+     * @param bundle
+     * @param prefix
+     * @param editor
+     */
+    public WrappedOpenFileAction(
+      ResourceBundle bundle,
+      String prefix,
+      ITextEditor editor)
+    {
+      super(bundle, prefix, editor);
+    }
+
+    /**
+     * @see org.eclipse.jface.action.IAction#run()
+     */
+    public void run()
+    {
+      if (!getXSDEditor().getOpenOnSelectionHelper().openOnSelection())
+      {
+        super.run();
+      }
+    }
+  }
+  
+  protected WrappedOpenFileAction wrappedAction;
+  private static final String DOT = "."; //$NON-NLS-1$
+  
+  /**
+   * @see org.eclipse.ui.texteditor.AbstractTextEditor#createActions()
+   */
+  protected void createActions()
+  {
+    super.createActions();
+    addOpenOnSelectionListener();
+    ResourceBundle resourceBundle = ResourceHandler.getResourceBundle(); //ResourceBundle.getBundle(RESOURCE_BUNDLE_NAME);
+    
+    wrappedAction = new WrappedOpenFileAction(resourceBundle, StructuredTextEditorActionConstants.ACTION_NAME_OPEN_FILE + DOT, this);
+    setAction(StructuredTextEditorActionConstants.ACTION_NAME_OPEN_FILE, wrappedAction);
+   
+  }
+    
+
+  class XSDModelQueryContributor extends AbstractXSDModelQueryContributor
+  {
+    public AbstractXSDDataTypeValueExtension createXSDDataTypeValueExtension(ModelQuery modelQuery)
+    {
+      return new XSDDataTypeValueExtension(modelQuery);
+    }
+  }
+ 
+
+  class XSDDataTypeValueExtension extends AbstractXSDDataTypeValueExtension
+  {                             
+    public XSDDataTypeValueExtension(ModelQuery modelQuery)
+    {
+      super(modelQuery);
+    }
+
+    public String getId()
+    {
+      return "XSDDataTypeValueExtension";
+    }
+     
+    protected XSDSchema getEnclosingXSDSchema(Element element)
+    {
+      return getXSDSchema();
+    }   
+  }
+
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDURIConverter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDURIConverter.java
new file mode 100644
index 0000000..58f639b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/XSDURIConverter.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
+import org.eclipse.wst.xml.uriresolver.util.IdResolver;
+import org.eclipse.wst.xml.uriresolver.util.IdResolverImpl;
+
+public class XSDURIConverter extends URIConverterImpl
+{
+  IFile resourceFile;
+  public XSDURIConverter(IFile resourceFile)
+  {
+    super();
+    this.resourceFile = resourceFile;
+  }
+  
+  /**
+   * @see org.eclipse.emf.ecore.resource.URIConverter#createInputStream(URI)
+   */
+  public InputStream createInputStream(URI uri) throws IOException
+  {
+    String scheme = uri.scheme();
+    URI mappedURI = uri;
+    if (scheme != null && !scheme.equals("file") && !scheme.equals("platform"))
+    // if ("http".equals(scheme))
+    {
+      String theURI = uri.toString();
+      IdResolver idResolver = new IdResolverImpl(theURI);
+      String result = idResolver.resolveId("/", null, theURI);
+      if (result != null)
+      {
+        mappedURI = createURI(result);
+      }  
+    }  
+    return super.createURLInputStream(mappedURI);
+  }
+  
+  public static URI createURI(String uriString)
+  {
+    if (hasProtocol(uriString))
+      return URI.createURI(uriString);
+    else
+      return URI.createFileURI(uriString);
+  }
+  
+  private static boolean hasProtocol(String uri)
+  {
+    boolean result = false;     
+    if (uri != null)
+    {
+      int index = uri.indexOf(":");
+      if (index != -1 && index > 2) // assume protocol with be length 3 so that the'C' in 'C:/' is not interpreted as a protocol
+      {
+        result = true;
+      }
+    }
+    return result;
+  }
+
+  private String getRelativePathToSchema(String a, String b)
+  {
+    String result;
+    if (b.startsWith(a))
+    {
+      result = b.substring(a.length() + 1);
+      return result;
+    }
+    else
+    {
+      return b;
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AbstractAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AbstractAction.java
new file mode 100644
index 0000000..b421416
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AbstractAction.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.xsd.XSDConcreteComponent;
+
+public class AbstractAction extends Action
+{
+  XSDConcreteComponent xsdConcreteComponent;
+
+  /**
+   * @param text
+   */
+  public AbstractAction(String text, XSDConcreteComponent xsdConcreteComponent)
+  {
+    super(text);
+    this.xsdConcreteComponent = xsdConcreteComponent;
+  }
+
+  /**
+   * @param text
+   * @param image
+   */
+  public AbstractAction(String text, ImageDescriptor image, XSDConcreteComponent xsdConcreteComponent)
+  {
+    super(text, image);
+    this.xsdConcreteComponent = xsdConcreteComponent;
+  }
+
+  /**
+   * @param text
+   * @param style
+   */
+  public AbstractAction(String text, int style)
+  {
+    super(text, style);
+  }
+  
+  public DocumentImpl getDocument()
+  {
+    return (DocumentImpl) xsdConcreteComponent.getElement().getOwnerDocument();
+  }
+    
+  public void beginRecording(String description)
+  {
+    getDocument().getModel().beginRecording(this, description);
+  }
+  
+  public void endRecording()
+  {
+    DocumentImpl doc = (DocumentImpl) getDocument();
+    
+    doc.getModel().endRecording(this);    
+  }
+
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddAttributeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddAttributeAction.java
new file mode 100644
index 0000000..f1a9f3f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddAttributeAction.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.commands.AddAttributeDeclarationCommand;
+import org.eclipse.xsd.XSDConcreteComponent;
+
+public class AddAttributeAction extends AbstractAction
+{
+  protected AddAttributeDeclarationCommand command;
+  
+  public AddAttributeAction(String text, XSDConcreteComponent parent)
+  {
+    super(text, parent);
+    command = new AddAttributeDeclarationCommand(parent);
+  }
+
+  public AddAttributeAction(String text, ImageDescriptor image, XSDConcreteComponent parent)
+  {
+    super(text, image, parent);
+    command = new AddAttributeDeclarationCommand(parent);
+  }
+
+  public void run()
+  {
+    beginRecording(getText());
+    command.run();
+    
+    endRecording();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddEnumsAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddEnumsAction.java
new file mode 100644
index 0000000..ecc2f4b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddEnumsAction.java
@@ -0,0 +1,92 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.xsd.ui.internal.widgets.EnumerationsDialog;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+/**
+ * Pattern is scoped to Enum Type
+ */
+public class AddEnumsAction extends CreateElementAction
+{
+  public AddEnumsAction(String label)
+  {
+  	super(label);
+  }
+ 
+  public Element createAndAddNewChildElement(String token)
+  {
+    String prefix = parentNode.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+    Element childNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + elementTag);
+    if (getAttributes() != null)
+    {
+      List attributes = getAttributes();
+      for (int i = 0; i < attributes.size(); i++)
+      {
+        DOMAttribute attr = (DOMAttribute) attributes.get(i);
+        childNode.setAttribute(attr.getName(), attr.getValue());
+      }
+    }
+    if (getRelativeNode() == null)
+    {
+      parentNode.appendChild(childNode);
+    }
+    else
+    {
+      ((Element)parentNode).insertBefore(childNode,getRelativeNode());
+    }
+    childNode.setAttribute("value", token);
+    return childNode;
+  }    
+  
+  public void run()
+  {
+    Display display = Display.getCurrent();
+    // if it is null, get the default one
+    display = display == null ? Display.getDefault() : display;
+    Shell parentShell = display.getActiveShell();
+    EnumerationsDialog dialog = new EnumerationsDialog(parentShell);
+    dialog.setBlockOnOpen(true);
+    int result = dialog.open();
+
+    if (result == Window.OK) 
+    {
+      beginRecording(getDescription());
+
+      String text = dialog.getText();
+      String delimiter = dialog.getDelimiter();
+      StringTokenizer tokenizer = new StringTokenizer(text, delimiter);
+      while (tokenizer.hasMoreTokens()) 
+      {
+        String token = tokenizer.nextToken();
+        if (dialog.isPreserveWhitespace() == false) 
+        {
+          token = token.trim();
+        }
+
+        Element child = createAndAddNewChildElement(token);
+        formatChild(child);        
+      }
+      endRecording();
+    }
+  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddModelGroupAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddModelGroupAction.java
new file mode 100644
index 0000000..47773c2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddModelGroupAction.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.wst.xsd.ui.internal.commands.AddModelGroupCommand;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDCompositor;
+import org.eclipse.xsd.XSDConcreteComponent;
+
+
+public class AddModelGroupAction extends Action
+{
+   protected AddModelGroupCommand command;
+  
+   public static String getLabel(XSDCompositor compositor)
+   {
+     String result = XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SEQUENCE"); //$NON-NLS-1$
+     if (compositor != null)
+     {
+       if (compositor == XSDCompositor.CHOICE_LITERAL)
+       {
+         result = XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CHOICE");  //$NON-NLS-1$
+       }
+       else if (compositor == XSDCompositor.ALL_LITERAL)
+       {
+         result = XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ALL");//$NON-NLS-1$
+       }  
+     }
+     return result;
+   }
+  
+   public AddModelGroupAction(XSDConcreteComponent parent, XSDCompositor compositor)
+   {
+     command = new AddModelGroupCommand(parent, compositor);
+     setText(getLabel(compositor));     
+   }   
+   
+   public void run()
+   {
+     command.run();
+   }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddSchemaNodeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddSchemaNodeAction.java
new file mode 100644
index 0000000..31a8950
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/AddSchemaNodeAction.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+
+
+public class AddSchemaNodeAction extends Action
+{
+  /**
+   * Constructor for AddSchemaNodeAction.
+   */
+  public AddSchemaNodeAction()
+  {
+    super();
+  }
+
+  /**
+   * Constructor for AddSchemaNodeAction.
+   * @param text
+   */
+  public AddSchemaNodeAction(String text)
+  {
+    super(text);
+  }
+
+  /**
+   * Constructor for AddSchemaNodeAction.
+   * @param text
+   * @param image
+   */
+  public AddSchemaNodeAction(String text, ImageDescriptor image)
+  {
+    super(text, image);
+  }
+
+  public void setEditor(XSDEditor editor)
+  {
+    this.editor = editor;
+  }
+  
+  protected XSDEditor editor;
+  
+  /**
+   * @see org.eclipse.jface.action.IAction#run()
+   */
+  public void run()
+  {
+    editor.createDefaultSchemaNode();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/BackAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/BackAction.java
new file mode 100644
index 0000000..0ab518d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/BackAction.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphViewer;
+import org.eclipse.xsd.XSDSchema;
+
+/**
+ * @author kchong
+ *
+ * <a href="mailto:kchong@ca.ibm.com">kchong@ca.ibm.com</a>
+ *
+ */
+public class BackAction extends Action
+{
+  ISelectionProvider selectionProvider;
+  XSDGraphViewer xsdGraphViewer;
+  XSDSchema xsdSchema;
+  
+  /**
+   * 
+   */
+  public BackAction()
+  {
+    super();
+  }
+
+  /**
+   * @param text
+   */
+  public BackAction(String text)
+  {
+    super(text);
+  }
+
+  public BackAction(String text, XSDGraphViewer viewer)
+  {
+    super(text);
+    xsdGraphViewer = viewer;
+  }
+  
+  /**
+   * @param text
+   * @param image
+   */
+  public BackAction(String text, ImageDescriptor image)
+  {
+    super(text, image);
+  }
+
+  /**
+   * @param text
+   * @param style
+   */
+  public BackAction(String text, int style)
+  {
+    super(text, style);
+  }
+
+  public void setSelectionProvider(ISelectionProvider selectionProvider)
+  {
+    this.selectionProvider = selectionProvider;
+  }
+
+  public void setXSDSchema(XSDSchema xsdSchema)
+  {
+    this.xsdSchema = xsdSchema;
+  }
+  
+  /*
+   * @see IAction#run()
+   */
+  public void run()
+  {
+    StructuredSelection selection = new StructuredSelection(xsdSchema);
+    selectionProvider.setSelection(selection);
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAnnotationAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAnnotationAction.java
new file mode 100644
index 0000000..698d433
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAnnotationAction.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class CreateAnnotationAction extends CreateElementAction
+{
+  XSDSchema xsdSchema;
+  Element documentationNode;
+
+  public CreateAnnotationAction()
+  {
+    super();
+  }
+
+  public CreateAnnotationAction(String text)
+  {
+    super(text);
+  }
+
+  public CreateAnnotationAction(String text, ImageDescriptor image)
+  {
+    super(text, image);
+  }
+
+  public Element createAndAddNewChildElement()
+  {
+    Element childNode = super.createAndAddNewChildElement();
+
+    String prefix = parentNode.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+    documentationNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.DOCUMENTATION_ELEMENT_TAG);
+    childNode.appendChild(documentationNode);
+
+    formatChild(childNode);
+    formatChild(documentationNode);
+    formatChild(childNode);
+    
+    return childNode;
+  }
+  
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAttributeAndRequired.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAttributeAndRequired.java
new file mode 100644
index 0000000..6a634e2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateAttributeAndRequired.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.wst.sse.core.format.IStructuredFormatProcessor;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.format.FormatProcessorXML;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDSchema;
+import org.w3c.dom.Element;
+
+/*
+ * Class which creates an Attribute and necessary Elements required before
+ * an Attribute can be added.  For example, if we wish to add an Attribute
+ * to a GlobalElement without a ComplexType, a ComplexType will be created.
+ */
+public class CreateAttributeAndRequired extends Action {
+	String elementTag;
+	String label;
+	List attributes;
+	XSDSchema xsdSchema;
+	ISelectionProvider selectionProvider;
+	Object parent;
+	
+	public CreateAttributeAndRequired(String elementTag, String label, List attributes, XSDSchema xsdSchema, ISelectionProvider selProvider, Object parent) {
+		super(label);
+		
+		this.elementTag = elementTag;
+		this.label = label;
+		this.attributes = attributes;
+		this.xsdSchema = xsdSchema;
+		this.selectionProvider = selProvider;
+		this.parent = parent;
+	}
+
+	public void run() {
+		if (parent instanceof XSDElementDeclaration) {
+			XSDElementDeclaration ed = (XSDElementDeclaration) parent;
+			beginRecording(ed.getElement());
+	        ed.setTypeDefinition(null);
+	      	XSDComplexTypeDefinition td = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
+	        ed.setAnonymousTypeDefinition(td);
+			
+		    CreateElementAction action = new CreateElementAction(label);		    
+		    action.setElementTag(elementTag);
+		    action.setAttributes(attributes);
+		    action.setParentNode(td.getElement());
+		    action.setRelativeNode(null);
+		    action.setXSDSchema(xsdSchema);
+		    action.setSelectionProvider(selectionProvider);
+		    action.run();
+		    
+		    formatChild(td.getElement());
+        if (td.getAttributeContents().size() > 0)
+        {
+		      selectObject(td.getAttributeContents().get(0));
+        }
+		    endRecording(ed.getElement());
+		}
+	}
+
+	protected void beginRecording(Element element) {
+		((DocumentImpl) element.getOwnerDocument()).getModel().beginRecording(this, getText());
+	}
+	
+	protected void endRecording(Element element) {
+		((DocumentImpl) element.getOwnerDocument()).getModel().endRecording(this);
+	}
+	
+	public void selectObject(Object object) {
+	    if (selectionProvider != null)
+	    {
+	        selectionProvider.setSelection(new StructuredSelection(object));
+	    }
+	}
+	
+	  protected void formatChild(Element child)
+	  {
+	    if (child instanceof XMLNode)
+	    {
+	      XMLModel model = ((XMLNode)child).getModel();
+	      try
+	      {
+	        // tell the model that we are about to make a big model change
+	        model.aboutToChangeModel();
+	        
+		      IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
+			    formatProcessor.formatNode(child);
+	      }
+	      finally
+	      {
+	        // tell the model that we are done with the big model change
+	        model.changedModel(); 
+	      }
+	    }
+	  }
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateElementAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateElementAction.java
new file mode 100644
index 0000000..b3b34e7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateElementAction.java
@@ -0,0 +1,271 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.sse.core.format.IStructuredFormatProcessor;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.format.FormatProcessorXML;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+public class CreateElementAction extends Action
+{
+  protected String description;
+  protected Element parentNode;
+
+  protected ISelectionProvider selectionProvider;
+  protected XSDSchema xsdSchema;
+  
+  /**
+   * Constructor for CreateElementAction.
+   */
+  public CreateElementAction()
+  {
+    super();
+  }
+  /**
+   * Constructor for CreateElementAction.
+   * @param text
+   */
+  public CreateElementAction(String text)
+  {
+    super(text);
+  }
+  /**
+   * Constructor for CreateElementAction.
+   * @param text
+   * @param image
+   */
+  public CreateElementAction(String text, ImageDescriptor image)
+  {
+    super(text, image);
+  }
+
+  public void setXSDSchema(XSDSchema xsdSchema)
+  {
+    this.xsdSchema = xsdSchema;
+  }
+  
+  public void setSelectionProvider(ISelectionProvider selectionProvider)
+  {
+    this.selectionProvider = selectionProvider;
+  }
+  
+  /**
+   * Gets the parentNode.
+   * @return Returns a Element
+   */
+  public Element getParentNode()
+  {
+    return parentNode;
+  }
+
+  /**
+   * Sets the parentNode.
+   * @param parentNode The parentNode to set
+   */
+  public void setParentNode(Element parentNode)
+  {
+    this.parentNode = parentNode;
+  }
+
+  boolean isGlobal = false;
+  
+  public void setIsGlobal(boolean isGlobal)
+  {
+    this.isGlobal = isGlobal;
+  }
+  
+  public boolean getIsGlobal()
+  {
+    return isGlobal;
+  }
+
+  protected Node relativeNode;
+  protected String elementTag;
+  public void setElementTag(String elementTag)
+  {
+    this.elementTag = elementTag;
+  }
+  
+  public DocumentImpl getDocument()
+  {
+    return (DocumentImpl) getParentNode().getOwnerDocument();
+  }
+    
+  public void beginRecording(String description)
+  {
+    getDocument().getModel().beginRecording(this, description);
+  }
+  
+  public void endRecording()
+  {
+    DocumentImpl doc = (DocumentImpl) getDocument();
+    
+    doc.getModel().endRecording(this);    
+  }
+  
+  public Element createAndAddNewChildElement()
+  {
+    String prefix = parentNode.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+    Element childNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + elementTag);
+    if (getAttributes() != null)
+    {
+      List attributes = getAttributes();
+      for (int i = 0; i < attributes.size(); i++)
+      {
+        DOMAttribute attr = (DOMAttribute) attributes.get(i);
+        childNode.setAttribute(attr.getName(), attr.getValue());
+      }
+    }
+    if (getRelativeNode() == null)
+    {
+      parentNode.appendChild(childNode);
+    }
+    else
+    {
+      ((Element)parentNode).insertBefore(childNode,getRelativeNode());
+    }
+    
+    if (isGlobal && getRelativeNode() == null)
+    {
+      Text textNode = getDocument().createTextNode("\n\n");
+      parentNode.appendChild(textNode);
+    }
+    else if (isGlobal && getRelativeNode() != null)
+    {
+      Text textNode = getDocument().createTextNode("\n\n");
+      parentNode.insertBefore(textNode, getRelativeNode());
+    }
+
+    formatChild(childNode);
+    
+    return childNode;
+  }    
+    
+  protected void formatChild(Element child)
+  {
+    if (child instanceof XMLNode)
+    {
+      XMLModel model = ((XMLNode)child).getModel();
+      try
+      {
+        // tell the model that we are about to make a big model change
+        model.aboutToChangeModel();
+        
+	      IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
+		    formatProcessor.formatNode(child);
+      }
+      finally
+      {
+        // tell the model that we are done with the big model change
+        model.changedModel(); 
+      }
+    }
+  }
+  /*
+   * @see IAction#run()
+   */
+  public void run()
+  {
+    beginRecording(getDescription());
+    Element child = createAndAddNewChildElement();
+    endRecording();
+
+    if (selectionProvider != null)
+    {
+      final XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(child);
+//      selectionProvider.setSelection(new StructuredSelection(comp));
+      
+    Runnable runnable = new Runnable()
+    {
+      public void run()
+      {
+        selectionProvider.setSelection(new StructuredSelection(comp));
+      }
+    };
+    Display.getDefault().timerExec(50,runnable);
+
+    }
+  }
+
+  /**
+   * Gets the relativeNode.
+   * @return Returns a Element
+   */
+  public Node getRelativeNode()
+  {
+    return relativeNode;
+  }
+
+  /**
+   * Sets the relativeNode.
+   * @param relativeNode The relativeNode to set
+   */
+  public void setRelativeNode(Node relativeNode)
+  {
+    this.relativeNode = relativeNode;
+  }
+
+  /**
+   * Gets the description.
+   * @return Returns a String
+   */
+  public String getDescription()
+  {
+    if (description == null)
+    {
+      return getText();
+    }
+    return description;
+  }
+
+  /**
+   * Sets the description.
+   * @param description The description to set
+   */
+  public void setDescription(String description)
+  {
+    this.description = description;
+  }
+
+  protected List attributes;
+  /**
+   * Gets the nameAttribute.
+   * @return Returns a String
+   */
+  public List getAttributes()
+  {
+    return attributes;
+  }
+
+  /**
+   * Sets the attributes.
+   * @param attributes The attributes to set
+   */
+  public void setAttributes(List attributes)
+  {
+    this.attributes = attributes;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateGroupAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateGroupAction.java
new file mode 100644
index 0000000..f9eadae
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateGroupAction.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class CreateGroupAction extends CreateElementAction
+{
+  XSDSchema xsdSchema;
+
+  /**
+   * Constructor for CreateGroupAction.
+   */
+  public CreateGroupAction()
+  {
+    super();
+  }
+  /**
+   * Constructor for CreateGroupAction.
+   * @param text
+   */
+  public CreateGroupAction(String text)
+  {
+    super(text);
+  }
+  /**
+   * Constructor for CreateGroupAction.
+   * @param text
+   * @param XSDSchema
+   */
+  public CreateGroupAction(String text, XSDSchema xsdSchema)
+  {
+    super(text);
+    this.xsdSchema = xsdSchema;
+  }
+  /**
+   * Constructor for CreateGroupAction.
+   * @param text
+   * @param image
+   */
+  public CreateGroupAction(String text, ImageDescriptor image)
+  {
+    super(text, image);
+  }
+
+  public Element createAndAddNewChildElement()
+  {
+    XSDConcreteComponent xsdComp = xsdSchema.getCorrespondingComponent(parentNode);
+    Element childNode = super.createAndAddNewChildElement();
+
+    String prefix = parentNode.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+    Element contentModelNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.SEQUENCE_ELEMENT_TAG);
+    childNode.appendChild(contentModelNode);
+
+    formatChild(childNode);
+    
+    xsdComp.setElement(parentNode);
+    
+    return childNode;
+  }
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateIdentityConstraintsAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateIdentityConstraintsAction.java
new file mode 100644
index 0000000..ca933f3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateIdentityConstraintsAction.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class CreateIdentityConstraintsAction extends CreateElementAction
+{
+  XSDSchema xsdSchema;
+
+  /**
+   * Constructor for CreateIdentityConstraintsAction.
+   */
+  public CreateIdentityConstraintsAction()
+  {
+    super();
+  }
+  /**
+   * Constructor for CreateIdentityConstraintsAction.
+   * @param text
+   */
+  public CreateIdentityConstraintsAction(String text)
+  {
+    super(text);
+  }
+  /**
+   * Constructor for CreateIdentityConstraintsAction.
+   * @param text
+   * @param XSDSchema
+   */
+  public CreateIdentityConstraintsAction(String text, XSDSchema xsdSchema)
+  {
+    super(text);
+    this.xsdSchema = xsdSchema;
+  }
+  /**
+   * Constructor for CreateIdentityConstraintsAction.
+   * @param text
+   * @param image
+   */
+  public CreateIdentityConstraintsAction(String text, ImageDescriptor image)
+  {
+    super(text, image);
+  }
+
+  public Element createAndAddNewChildElement()
+  {
+    Element childNode = super.createAndAddNewChildElement();
+
+    String prefix = parentNode.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+    Element selectorNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.SELECTOR_ELEMENT_TAG);
+
+    DOMAttribute attr = new DOMAttribute(XSDConstants.XPATH_ATTRIBUTE, "");
+    selectorNode.setAttribute(attr.getName(), attr.getValue());
+
+    childNode.appendChild(selectorNode);
+
+    return childNode;
+  }
+	
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalComplexTypeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalComplexTypeAction.java
new file mode 100644
index 0000000..e8b0cd0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalComplexTypeAction.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class CreateLocalComplexTypeAction extends CreateElementAction
+{
+  /**
+   * Constructor for CreateLocalComplexTypeAction.
+   */
+  public CreateLocalComplexTypeAction()
+  {
+    super();
+  }
+  /**
+   * Constructor for CreateLocalComplexTypeAction.
+   * @param text
+   */
+  public CreateLocalComplexTypeAction(String text)
+  {
+    super(text);
+  }
+  /**
+   * Constructor for CreateLocalComplexTypeAction.
+   * @param text
+   * @param image
+   */
+  public CreateLocalComplexTypeAction(String text, ImageDescriptor image)
+  {
+    super(text, image);
+  }
+
+  public Element createAndAddNewChildElement()
+  {  
+    XSDConcreteComponent xsdComp = xsdSchema.getCorrespondingComponent(parentNode);
+    
+    Element childNode = super.createAndAddNewChildElement();
+  
+    if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.ELEMENT_ELEMENT_TAG, false))  
+    {  
+      parentNode.removeAttribute(XSDConstants.TYPE_ATTRIBUTE);  
+    }  
+                                                      
+    String prefix = parentNode.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+    childNode.appendChild(getDocument().createElement(prefix + XSDConstants.SEQUENCE_ELEMENT_TAG));
+    
+    formatChild(childNode);
+    
+    xsdComp.setElement(parentNode);
+
+    return childNode;
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalSimpleTypeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalSimpleTypeAction.java
new file mode 100644
index 0000000..d2e1065
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateLocalSimpleTypeAction.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class CreateLocalSimpleTypeAction extends CreateElementAction
+{
+  XSDSchema xsdSchema;
+
+  /**
+   * Constructor for CreateLocalSimpleTypeAction.
+   */
+  public CreateLocalSimpleTypeAction()
+  {
+    super();
+  }
+  /**
+   * Constructor for CreateLocalSimpleTypeAction.
+   * @param text
+   */
+  public CreateLocalSimpleTypeAction(String text)
+  {
+    super(text);
+  }
+
+  /**
+   * Constructor for CreateLocalSimpleTypeAction.
+   * @param text
+   * @param image
+   */
+  public CreateLocalSimpleTypeAction(String text, ImageDescriptor image)
+  {
+    super(text, image);
+  }
+
+  public Element createAndAddNewChildElement()
+  {
+    Element childNode = super.createAndAddNewChildElement();
+
+    if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.UNION_ELEMENT_TAG, false))
+    {
+//      parentNode.removeAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);
+    }
+    else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.LIST_ELEMENT_TAG, false))
+    {
+      parentNode.removeAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE);
+    }
+    else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+    {
+      parentNode.removeAttribute(XSDConstants.TYPE_ATTRIBUTE);
+    }
+    else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.RESTRICTION_ELEMENT_TAG, false))
+    {
+      Node parent = parentNode.getParentNode();
+      if (XSDDOMHelper.inputEquals(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+      {
+        parentNode.removeAttribute(XSDConstants.BASE_ATTRIBUTE);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+    {
+      parentNode.removeAttribute(XSDConstants.TYPE_ATTRIBUTE);
+    }
+    
+    formatChild(childNode);
+    
+    return childNode;
+  }
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleContentAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleContentAction.java
new file mode 100644
index 0000000..9c49936
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleContentAction.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+/**
+ * @version   1.0
+ * @author
+ */
+public class CreateSimpleContentAction extends CreateElementAction
+{
+  XSDSchema xsdSchema;
+  //IDocument document;
+
+  /**
+   * Constructor for CreateSimpleContentAction.
+   */
+  public CreateSimpleContentAction()
+  {
+    super();
+  }
+  /**
+   * Constructor for CreateSimpleContentAction.
+   * @param text
+   */
+  public CreateSimpleContentAction(String text)
+  {
+    super(text);
+  }
+  /**
+   * Constructor for CreateSimpleContentAction.
+   * @param text
+   * @param XSDSchema
+   */
+  public CreateSimpleContentAction(String text, XSDSchema xsdSchema)
+  {
+    super(text);
+    this.xsdSchema = xsdSchema;
+  }
+  /**
+   * Constructor for CreateSimpleContentAction.
+   * @param text
+   * @param image
+   */
+  public CreateSimpleContentAction(String text, ImageDescriptor image)
+  {
+    super(text, image);
+  }
+
+  public Element createAndAddNewChildElement()
+  {
+    Element childNode = super.createAndAddNewChildElement();
+
+    String prefix = parentNode.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+    Element derivedByNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + "restriction");
+    childNode.appendChild(derivedByNode);
+    Element sequence = null;
+
+    if (XSDDOMHelper.inputEquals(childNode, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+    {
+      sequence = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + "sequence");
+      derivedByNode.appendChild(sequence);
+    }
+
+    // now add the required base attribute for the derived by node
+    TypesHelper typesHelper = new TypesHelper(xsdSchema);
+    List listOfCT = typesHelper.getUserComplexTypeNamesList();
+    String firstType = "";
+    if (listOfCT.size() > 0)
+    {
+      firstType = (String)(listOfCT).get(0);
+    }
+    DOMAttribute attr = new DOMAttribute(XSDConstants.BASE_ATTRIBUTE, firstType);
+    derivedByNode.setAttribute(attr.getName(), attr.getValue());
+
+    formatChild(derivedByNode);
+    if (sequence != null)
+    {
+      formatChild(sequence);
+      formatChild(derivedByNode);
+    }
+    formatChild(childNode);
+
+    
+    return childNode;
+  }
+
+  /*
+   * @see IAction#run()
+   */
+  public void run()
+  {
+    ArrayList message = new ArrayList();
+    beginRecording(getDescription());
+
+    Element child = createAndAddNewChildElement();
+    endRecording();
+
+    NodeList children = parentNode.getChildNodes();
+/*
+    for (int i=0; i < children.getLength(); i++)
+    {
+      Node aChild = children.item(i);
+      if (aChild != null && aChild instanceof Element)
+      {
+        if (XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false) ||
+            XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true))
+        {
+          // REMOVE ATTRIBUTES AND ATTRIBUTE GROUP REFS FROM COMPLEX TYPES LIST OF CHILDREN
+          message.addElement(new ModelMessage
+                                 (XSDPlugin.getSchemaString("_INFO_REMOVE_ATTRIBUTE_FROM") +
+              " <" + parentNode.getAttribute("name") + ">", aChild));
+        }
+      }
+    }
+    domainModel.createMarkers(message);
+*/
+    for (int i=0; i < children.getLength(); i++)
+    {
+      Node aChild = children.item(i);
+      if (aChild != null && aChild instanceof Element)
+      {
+        if (XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false) ||
+            XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ATTRIBUTE_ELEMENT_TAG, true) ||
+            XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false) ||
+            XSDDOMHelper.inputEquals((Element)aChild, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true))
+        {
+          // REMOVE ATTRIBUTES AND ATTRIBUTE GROUP REFS FROM COMPLEX TYPES LIST OF CHILDREN
+// KCPort TODO
+//          ErrorMessage aTask = new ErrorMessage();
+//          Node parent = aChild;
+//          if (parent instanceof NodeImpl)
+//          {
+//            aTask.setModelObject(parent);
+//          }
+//          aTask.setLocalizedMessage(XSDPlugin.getSchemaString("_INFO_REMOVE_ATTRIBUTE_FROM") + " <" + parentNode.getAttribute("name") + ">");
+//          message.add(aTask);
+        }
+      }
+    }    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleTypeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleTypeAction.java
new file mode 100644
index 0000000..5e5c29c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/CreateSimpleTypeAction.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+public class CreateSimpleTypeAction extends CreateElementAction
+{
+  /**
+   * 
+   */
+  public CreateSimpleTypeAction()
+  {
+    super();
+  }
+
+  /**
+   * @param text
+   */
+  public CreateSimpleTypeAction(String text)
+  {
+    super(text);
+  }
+  
+  public CreateSimpleTypeAction(String text, XSDSchema xsdSchema)
+  {
+    super(text);
+    this.xsdSchema = xsdSchema;
+  }
+
+  /**
+   * @param text
+   * @param image
+   */
+  public CreateSimpleTypeAction(String text, ImageDescriptor image)
+  {
+    super(text, image);
+  }
+  
+  public Element createAndAddNewChildElement()
+  {
+    XSDConcreteComponent xsdComp = xsdSchema.getCorrespondingComponent(parentNode);
+    Element childNode = super.createAndAddNewChildElement();
+
+    String prefix = parentNode.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+    Element contentModelNode = getDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.RESTRICTION_ELEMENT_TAG);
+    contentModelNode.setAttribute(XSDConstants.BASE_ATTRIBUTE, prefix + "string");
+    childNode.appendChild(contentModelNode);
+
+    formatChild(childNode);
+    
+    xsdComp.setElement(parentNode);
+    
+    return childNode;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DOMAttribute.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DOMAttribute.java
new file mode 100644
index 0000000..5580b40
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DOMAttribute.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+// TODO Remove this
+
+/**
+ * @version 	1.0
+ * @author
+ */
+public class DOMAttribute
+{
+  /**
+   * Constructor for DOMAttribute.
+   */
+  public DOMAttribute()
+  {
+    super();
+  }
+  
+  /**
+   * Constructor for DOMAttribute.
+   */
+  public DOMAttribute(String name, String value)
+  {
+    super();
+    this.name = name;
+    this.value = value;
+  }
+  
+  protected String name, value;
+  /**
+   * Gets the value.
+   * @return Returns a String
+   */
+  public String getValue()
+  {
+    return value;
+  }
+
+  /**
+   * Sets the value.
+   * @param value The value to set
+   */
+  public void setValue(String value)
+  {
+    this.value = value;
+  }
+
+  /**
+   * Gets the name.
+   * @return Returns a String
+   */
+  public String getName()
+  {
+    return name;
+  }
+
+  /**
+   * Sets the name.
+   * @param name The name to set
+   */
+  public void setName(String name)
+  {
+    this.name = name;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DeleteAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DeleteAction.java
new file mode 100644
index 0000000..097a4a3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/DeleteAction.java
@@ -0,0 +1,237 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import java.util.Iterator;
+
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.actions.SelectionListenerAction;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.BaseGlobalCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.GlobalAttributeCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.GlobalAttributeGroupCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.GlobalElementCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.GlobalGroupCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.GlobalSimpleOrComplexTypeCleanup;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.XSDExternalFileCleanup;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDImport;
+import org.eclipse.xsd.XSDInclude;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDRedefine;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Node;
+
+
+public class DeleteAction extends SelectionListenerAction
+{
+  protected IEditorPart editor;
+  protected XSDSchema xsdSchema;
+  protected ISelectionProvider selectionProvider;
+  protected XSDConcreteComponent parentXSDComponent;
+  
+  /**
+   * Constructor for DeleteAction.
+   * @param text
+   */
+  public DeleteAction(String text, IEditorPart editor, XSDSchema xsdSchema)
+  {
+    super(text);
+    this.editor = editor;
+    this.xsdSchema = xsdSchema;
+  }
+  
+  public void setSelectionProvider(ISelectionProvider selectionProvider)
+  {
+    this.selectionProvider = selectionProvider;
+  }
+  
+  public IEditorPart getEditor()
+  {
+    return editor;
+  }
+  
+  public XSDSchema getSchema()
+  {
+    return xsdSchema;
+  }
+  
+  public void setXSDSchema(XSDSchema xsdSchema)
+  {
+    this.xsdSchema = xsdSchema;
+  }
+  
+  /*
+   * @see IAction#run()
+   */
+  public void run()
+  {
+    IStructuredSelection selection = getStructuredSelection();
+    
+    if (selection.isEmpty())
+    {
+      return;
+    }
+    
+    Iterator iter = selection.iterator();
+    DocumentImpl doc = null;
+    while (iter.hasNext())
+    {
+      Object obj = iter.next();
+      Node node = null;
+      if (obj instanceof Node)
+      {
+        node = (Node)obj;
+      }
+      else if (obj instanceof XSDConcreteComponent)
+      {
+        xsdSchema = ((XSDConcreteComponent)obj).getSchema();
+        
+        node = ((XSDConcreteComponent)obj).getElement();
+        if (node instanceof XMLNode)
+        {
+          parentXSDComponent = ((XSDConcreteComponent)obj).getContainer();
+        
+          if (parentXSDComponent instanceof XSDParticle)
+          {
+            // need to get the modelGroup
+            parentXSDComponent = parentXSDComponent.getContainer();
+          }
+        }
+
+      }
+      if (!XSDDOMHelper.inputEquals(node, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+      {
+        if (node instanceof XMLNode)
+        {
+          if (doc == null)
+          {
+            doc = (DocumentImpl) node.getOwnerDocument();
+            doc.getModel().beginRecording(this, XSDEditorPlugin.getXSDString("_UI_ACTION_DELETE_NODES"));
+          }
+    
+          boolean refresh = cleanupReferences(node);
+          if (node != null)
+          {
+            XSDDOMHelper.removeNodeAndWhitespace(node);
+          }
+          
+          // Workaround to reset included elements in XSD model
+          if (refresh)
+          {
+  //          getEditor().reparseSchema();
+  //          getEditor().getGraphViewer().setSchema(getEditor().getXSDSchema());
+          }
+        }
+      }
+    }
+    
+    if (parentXSDComponent != null && selectionProvider != null)
+    {
+      selectionProvider.setSelection(new StructuredSelection(parentXSDComponent));
+    }
+    
+    if (doc != null)
+    {
+      doc.getModel().endRecording(this);
+    }
+  }
+
+  protected boolean cleanupReferences(Node deletedNode)
+  {
+    boolean refresh = false;
+    XSDConcreteComponent comp = getSchema().getCorrespondingComponent(deletedNode);
+    
+    if (comp instanceof XSDInclude ||
+        comp instanceof XSDImport ||
+        comp instanceof XSDRedefine)
+    {
+      XSDSchema resolvedSchema = ((XSDSchemaDirective)comp).getResolvedSchema();
+      XSDSchema referencedSchema = null;
+      if (comp instanceof XSDInclude)
+      {
+        referencedSchema = ((XSDInclude)comp).getIncorporatedSchema();
+        refresh = true;
+      }
+      else if (comp instanceof XSDRedefine)
+      {
+        referencedSchema = ((XSDRedefine)comp).getIncorporatedSchema();
+        refresh = true;
+      }
+      else if (comp instanceof XSDImport)
+      {
+        XSDImport imp = (XSDImport)comp;
+        referencedSchema = ((XSDImport)comp).getResolvedSchema();
+        refresh = true;
+      }
+
+      if (referencedSchema != null)
+      {
+        XSDExternalFileCleanup cleanHelper = new XSDExternalFileCleanup(referencedSchema);
+        cleanHelper.visitSchema(getSchema());
+        // populate messages
+// TODO        getEditor().createTasksInTaskList(cleanHelper.getMessages());
+      }
+      if (comp instanceof XSDImport)
+      {
+        TypesHelper typesHelper = new TypesHelper(getSchema());
+        typesHelper.updateMapAfterDelete((XSDImport)comp);
+      }
+    }
+    else if (getSchema().equals(comp.getContainer()))
+    {
+      BaseGlobalCleanup cleanHelper = null;
+      // Only need to clean up references if the component being deleted is global scoped
+      if (comp instanceof XSDElementDeclaration)
+      {
+        cleanHelper = new GlobalElementCleanup(comp);
+      }
+      else if (comp instanceof XSDModelGroupDefinition)
+      {
+        cleanHelper = new GlobalGroupCleanup(comp);
+      }
+      else if (comp instanceof XSDTypeDefinition)
+      {
+        cleanHelper = new GlobalSimpleOrComplexTypeCleanup(comp);
+      }
+      else if (comp instanceof XSDAttributeDeclaration)
+      {
+        cleanHelper = new GlobalAttributeCleanup(comp);
+      }
+      else if (comp instanceof XSDAttributeGroupDefinition)
+      {
+        cleanHelper = new GlobalAttributeGroupCleanup(comp);
+      }
+      
+      
+      if (cleanHelper != null)
+      {
+        cleanHelper.visitSchema(getSchema());
+      }
+    }
+    return refresh;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ISchemaEditorActionConstants.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ISchemaEditorActionConstants.java
new file mode 100644
index 0000000..6033b72
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ISchemaEditorActionConstants.java
@@ -0,0 +1,20 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+public interface ISchemaEditorActionConstants
+{
+  public static final String RETARGET_VALIDATE_SCHEMA_ACTION_ID = "retargetValidateSchemaAction"; //$NON-NLS-1$
+  public static final String RETARGET_RELOAD_DEPENDENCIES_ACTION_ID = "retargetReloadDependenciesAction"; //$NON-NLS-1$
+  public static final String RETARGET_GENERATE_JAVA_ACTION_ID = "retargetGenerateJavaAction"; //$NON-NLS-1$
+  public static final String RETARGET_GENERATE_DTD_ACTION_ID = "retargetGenerateDtdAction"; //$NON-NLS-1$
+  public static final String RETARGET_GENERATE_XML_ACTION_ID = "retargetGenerateXMLAction"; //$NON-NLS-1$
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MakeAnonymousGlobal.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MakeAnonymousGlobal.java
new file mode 100644
index 0000000..9a9638a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MakeAnonymousGlobal.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+public class MakeAnonymousGlobal extends CreateElementAction
+{
+	XSDSchema xsdSchema;
+	Element type;
+	
+	public MakeAnonymousGlobal(String text, Element type, XSDSchema xsdSchema)
+	{
+		super(text);
+		this.xsdSchema = xsdSchema;
+		this.type = type;
+		isGlobal = true;
+	}
+
+	public Element createAndAddNewChildElement()
+	{
+		// create the new global type
+		Element childNode = super.createAndAddNewChildElement();
+    // add the anonymous type's children to the new global type
+		if (type.hasChildNodes())
+		{        
+			NodeList nodes = type.getChildNodes();
+			// use clones so we don't have a refresh problem
+			for (int i = 0; i < nodes.getLength(); i++)
+			{
+				Node node = nodes.item(i);       
+				childNode.appendChild(node.cloneNode(true));
+			}
+		}
+
+    // clean up the element whose type was anonymous
+    // and set its type attribute to the new global type
+		TypesHelper helper = new TypesHelper(xsdSchema);
+		String prefix = helper.getPrefix(xsdSchema.getTargetNamespace(), true);
+		helper = null;
+		
+		Element parentElementOfAnonymousType = (Element)type.getParentNode();
+
+		parentElementOfAnonymousType.removeChild(type);
+		parentElementOfAnonymousType.setAttribute(XSDConstants.TYPE_ATTRIBUTE, prefix + childNode.getAttribute(XSDConstants.NAME_ATTRIBUTE));
+
+		formatChild(childNode);
+		
+    return childNode;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ModelMessage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ModelMessage.java
new file mode 100644
index 0000000..aa30618
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ModelMessage.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.w3c.dom.Node;
+
+public class ModelMessage
+{
+  protected String message;
+  protected Node node;
+
+  public ModelMessage(String message, Node node)
+  {
+    this.message = message;
+    this.node = node;
+  }
+
+  public String getMessage()
+  {
+    return message;
+  }
+
+  public Node getNode()
+  {
+    return node;
+  }
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MoveAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MoveAction.java
new file mode 100644
index 0000000..741f7d0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/MoveAction.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+public class MoveAction extends Action
+{
+  protected List selectedNodes;
+  protected Node parentNode;
+  protected Node refChild;
+
+  /**
+   * Constructor for DeleteAction.
+   * @param text
+   */
+  public MoveAction(Node parentNode, List selectedNodes, Node refChild)
+  {
+    this.parentNode = parentNode;
+    this.selectedNodes = selectedNodes;
+    this.refChild = refChild;
+  }    
+
+  public MoveAction(XSDConcreteComponent parentComponent, List selectedComponents, XSDConcreteComponent refChildComponent)
+  {
+    selectedNodes = new ArrayList(selectedComponents.size());
+    for (Iterator i = selectedComponents.iterator(); i.hasNext(); )
+    {
+      XSDConcreteComponent concreteComponent = (XSDConcreteComponent)i.next();
+      selectedNodes.add(concreteComponent.getElement());
+    }
+    parentNode = parentComponent.getElement();
+    refChild = refChildComponent != null ? refChildComponent.getElement() : null;
+  }
+                   
+  public boolean canMove()
+  {                           
+    // TODO... there are likely more restriction to consider here
+    boolean result = true;
+    for (Iterator i = selectedNodes.iterator(); i.hasNext(); )
+    {
+      Node child = (Node)i.next();
+      if (isDecendantOrSelf(child, parentNode)) 
+      {
+        result = false;
+        break;
+      }
+    }   
+    return result;
+  }           
+                  
+  protected boolean isDecendantOrSelf(Node potentialParent, Node node)
+  { 
+    boolean result = false;
+    while (node != null)
+    {
+      if (node == potentialParent)    
+      {
+        result = true;
+        break;
+      }           
+      node = node.getParentNode();
+    }
+    return result;
+  }
+
+
+  protected void beginRecording()
+  {
+    XMLModel model = getModel();      
+    if (model != null)
+    {
+      model.beginRecording(this, "Move");
+    }
+  }
+  
+  protected void endRecording()
+  {
+    XMLModel model = getModel();      
+    if (model != null)
+    {
+      model.endRecording(this);    
+    }
+  }
+
+  protected XMLModel getModel()
+  {
+    XMLModel model = null;
+    if (parentNode instanceof XMLNode)
+    {                            
+      model = ((XMLNode)parentNode).getModel();
+    }
+    return model;
+  }
+  
+
+     
+  /*
+   * @see IAction#run()
+   */
+  public void run()
+  {                            
+    beginRecording();
+    try
+    {
+      for (Iterator i = selectedNodes.iterator(); i.hasNext(); )
+      {
+        Node child = (Node)i.next();
+        repositionBefore(parentNode, child, refChild);
+      }   
+    }
+    catch (Exception e)
+    {         
+      e.printStackTrace();
+    }
+    endRecording();
+  }
+
+
+  public void repositionBefore(Node parent, Node child, Node refChild)
+  {   
+    // TODO... when the refChild (inserting as the last element) we need to
+    // special case the way we preserve indentation 
+    Node oldParent = child.getParentNode();
+    if (oldParent != null && refChild != child)
+    {  
+      // consider any indentation text node that preceeds the child
+      //      
+      Node textNode = isWhitespaceTextNode(child.getPreviousSibling()) ? child.getPreviousSibling() : null;
+
+      // remove the child
+      //
+      oldParent.removeChild(child);
+      
+      // Instead of inserting the child immediatlely infront of the refChild, we first check to see if there
+      // is an indentation text node preceeding the refChild.  If we find such a node, we perform the insertion
+      // so that the child is inserted before the indentation text node.
+      Node adjustedRefChild = refChild;
+      if (refChild != null && isWhitespaceTextNode(refChild.getPreviousSibling()))
+      {
+        adjustedRefChild = refChild.getPreviousSibling();
+      }
+          
+      // reposition the child and any indentation text node 
+      //
+      parent.insertBefore(child, adjustedRefChild);
+      if (textNode != null)
+      {
+        oldParent.removeChild(textNode);
+        parent.insertBefore(textNode, child);
+      }
+    }
+  }     
+    
+
+  protected static boolean isWhitespaceTextNode(Node node)
+  {
+    boolean result = false;
+    if (node != null && node.getNodeType() == Node.TEXT_NODE)
+    {
+      String data = ((Text)node).getData();
+      result = (data == null || data.trim().length() == 0);
+    }   
+    return result;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/OpenSchemaAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/OpenSchemaAction.java
new file mode 100644
index 0000000..6ba1ee9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/OpenSchemaAction.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.wst.xml.uriresolver.util.URIHelper;
+import org.eclipse.wst.xsd.ui.internal.util.OpenOnSelectionHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.impl.XSDImportImpl;
+import org.w3c.dom.Node;
+
+
+public class OpenSchemaAction extends Action
+{
+  XSDConcreteComponent component;
+  public OpenSchemaAction(String label, XSDConcreteComponent component)
+  {
+    super(label);
+    this.component = component;
+  }
+
+  public void run()
+  {
+    if (component != null)
+    {
+      revealObject();
+    }
+  }
+
+  boolean lastResult = false;
+  protected boolean revealObject()
+  {
+    Node element = component.getElement();
+    String schemaLocation = "";
+    XSDSchemaDirective dir;
+    if (component instanceof XSDSchemaDirective)
+    {
+      dir = (XSDSchemaDirective)component;
+      // force load of imported schema
+      if (dir instanceof XSDImportImpl)
+      {
+        ((XSDImportImpl)dir).importSchema();
+      }
+      if (dir.getResolvedSchema() != null)
+      {
+        schemaLocation = URIHelper.removePlatformResourceProtocol(dir.getResolvedSchema().getSchemaLocation());
+        if (schemaLocation != null)
+        {
+          OpenOnSelectionHelper.openXSDEditor(schemaLocation);
+        }
+      }
+    }
+    return lastResult;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ReloadDependenciesAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ReloadDependenciesAction.java
new file mode 100644
index 0000000..73e239f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/ReloadDependenciesAction.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+
+
+public class ReloadDependenciesAction extends Action
+{
+  /**
+   * Constructor for ReloadDependenciesAction.
+   */
+  public ReloadDependenciesAction()
+  {
+    super();
+  }
+
+  /**
+   * Constructor for ReloadDependenciesAction.
+   * @param text
+   */
+  public ReloadDependenciesAction(String text)
+  {
+    super(text);
+  }
+
+  /**
+   * Constructor for ReloadDependenciesAction.
+   * @param text
+   * @param image
+   */
+  public ReloadDependenciesAction(String text, ImageDescriptor image)
+  {
+    super(text, image);
+  }
+
+  public void setEditor(XSDEditor editor)
+  {
+    this.editor = editor;
+  }
+  
+  protected XSDEditor editor;
+  
+  public void run()
+  {
+    editor.reparseSchema();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/SetBaseTypeAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/SetBaseTypeAction.java
new file mode 100644
index 0000000..27bbabb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/SetBaseTypeAction.java
@@ -0,0 +1,384 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.sse.core.format.IStructuredFormatProcessor;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.format.FormatProcessorXML;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.wst.xsd.ui.internal.widgets.SetBaseTypeDialog;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+public class SetBaseTypeAction extends Action
+{
+  XSDSchema xsdSchema;
+  Element element;
+  String type = "";
+  String derivedByString = "";
+  XSDDOMHelper domHelper;
+  
+  /**
+   * Constructor for SetBaseTypeAction.
+   */
+  public SetBaseTypeAction()
+  {
+    super();
+    domHelper = new XSDDOMHelper();
+  }
+  /**
+   * Constructor for SetBaseTypeAction.
+   * @param arg0
+   */
+  public SetBaseTypeAction(String arg0)
+  {
+    super(arg0);
+    domHelper = new XSDDOMHelper();
+  }
+  /**
+   * Constructor for SetBaseTypeAction.
+   * @param arg0
+   * @param arg1
+   */
+  public SetBaseTypeAction(String arg0, ImageDescriptor arg1)
+  {
+    super(arg0, arg1);
+    domHelper = new XSDDOMHelper();
+  }
+  /**
+   * Constructor for SetBaseTypeAction.
+   * @param arg0
+   * @param arg1
+   */
+  public SetBaseTypeAction(String arg0, int arg1)
+  {
+    super(arg0, arg1);
+    domHelper = new XSDDOMHelper();
+  }
+
+  
+  public void setXSDSchema(XSDSchema schema)
+  {
+    this.xsdSchema = schema;    
+  }
+
+  public void setComplexTypeElement(Element element)
+  {
+    this.element = element;
+  }
+  
+  public void setType(String type)
+  {
+    this.type = type; 
+  }
+
+  public void setDerivedBy(String derivedByString)
+  {
+    this.derivedByString = derivedByString;
+  }
+
+  public void run()
+  {
+    Display display = Display.getCurrent();
+    // if it is null, get the default one
+    display = display == null ? Display.getDefault() : display;
+    Shell parentShell = display.getActiveShell();
+
+    SetBaseTypeDialog dialog = new SetBaseTypeDialog(parentShell, xsdSchema, element);
+    dialog.setBlockOnOpen(true);
+
+    Element contentModelElement = domHelper.getContentModelFromParent(element);    
+    if (contentModelElement != null)
+    {
+      // to set the current values to show in the dialog
+      if (XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false) ||
+          XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+      {
+        Element derivedByElement = domHelper.getDerivedByElementFromComplexType(element);
+        if (derivedByElement != null)
+        {
+          String currentBaseType = derivedByElement.getAttribute(XSDConstants.BASE_ATTRIBUTE);
+          dialog.setCurrentBaseType(currentBaseType);
+          dialog.setCurrentDerivedBy(derivedByElement.getLocalName());
+        }
+        else
+        {
+          dialog.setCurrentBaseType("");
+          dialog.setCurrentDerivedBy("");
+        }
+      }
+    }
+
+    int result = dialog.open();
+    
+    if (result == Window.OK) 
+    {
+      type = dialog.getBaseType();
+      derivedByString = dialog.getDerivedBy();
+      performAction();
+    }
+  }
+
+  XSDTypeDefinition newTypeDefinition = null;
+  public XSDTypeDefinition getXSDTypeDefinition()
+  {
+    return newTypeDefinition;
+  }
+
+  public void performAction()
+  {
+    TypesHelper helper = new TypesHelper(xsdSchema);
+
+    XSDConcreteComponent xsdComp = xsdSchema.getCorrespondingComponent(element);
+    
+    Element contentModelElement = domHelper.getContentModelFromParent(element);
+    boolean contentModelExists = true;
+    if (contentModelElement == null)
+    {
+      contentModelExists = false;
+    }
+
+//  get XSD component of the new type chosen
+    newTypeDefinition = null;
+    for (Iterator i = xsdSchema.getTypeDefinitions().iterator(); i.hasNext(); )
+    {
+      XSDTypeDefinition typeDef = (XSDTypeDefinition)i.next();
+      if (typeDef.getQName().equals(type))
+      {
+        newTypeDefinition = typeDef;
+        break;
+      }
+    }
+   
+    boolean needsComplexContent = false;
+    boolean needsSimpleContent = false;
+
+    if (helper.getBuiltInTypeNamesList().contains(type) ||
+       helper.getUserSimpleTypeNamesList().contains(type))
+//    if (newTypeDefinition instanceof XSDSimpleTypeDefinition)
+    {
+      needsSimpleContent = true; 
+    }        
+    else if (newTypeDefinition instanceof XSDComplexTypeDefinition)
+    {
+      needsComplexContent = true;
+//      XSDComplexTypeDefinition newCTObj = (XSDComplexTypeDefinition)newTypeDefinition;
+//      XSDContentTypeCategory category = newCTObj.getContentTypeCategory();
+    }
+    
+    beginRecording(XSDEditorPlugin.getXSDString("_UI_LABEL_SET_BASE_TYPE"), element);
+    String prefix = element.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+
+    DOMAttribute attr = new DOMAttribute(XSDConstants.BASE_ATTRIBUTE, type);
+    boolean hasChildrenElements = domHelper.hasElementChildren(element);
+    if (!contentModelExists) // if no content model exists, then add the new nodes
+    {
+      if (helper.getBuiltInTypeNamesList().contains(type) ||
+          helper.getUserSimpleTypeNamesList().contains(type))
+      {
+        updateModelAndDerivedByKind(prefix + XSDConstants.SIMPLECONTENT_ELEMENT_TAG, prefix + XSDConstants.EXTENSION_ELEMENT_TAG, attr);
+      }
+      else if (helper.getUserComplexTypeNamesList().contains(type))
+      {
+        if (derivedByString.equals("")) // default
+        {
+          derivedByString = XSDConstants.EXTENSION_ELEMENT_TAG;
+        }
+        Element derivedByElement = updateModelAndDerivedByKind(prefix + XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, prefix + derivedByString, attr);
+        Element newModelGroupElement = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.SEQUENCE_ELEMENT_TAG);
+        derivedByElement.appendChild(newModelGroupElement);
+        formatChild(derivedByElement);
+      }
+    }
+    else  // else there is a content model
+    {
+      if (type.equals(""))  // the chosen type is blank, ie. there is no base type
+      {
+        Element derivedByElement = domHelper.getDerivedByElementFromComplexType(element);
+        Element sourceContentModelElement = domHelper.getContentModelFromParent(derivedByElement);
+        // Retain the content model if there is one from the complex or simple content derive by element
+        if (XSDDOMHelper.inputEquals(sourceContentModelElement, XSDConstants.SEQUENCE_ELEMENT_TAG, false) ||
+            XSDDOMHelper.inputEquals(sourceContentModelElement, XSDConstants.CHOICE_ELEMENT_TAG, false) ||
+            XSDDOMHelper.inputEquals(sourceContentModelElement, XSDConstants.ALL_ELEMENT_TAG, false))
+        {      
+          Element newNode = domHelper.cloneElement(element, sourceContentModelElement);
+          element.replaceChild(newNode, contentModelElement);
+          formatChild(element); 
+        }
+        else // otherwise just add the nodes
+        {
+          XSDDOMHelper.removeNodeAndWhitespace(contentModelElement);
+          Element newSequenceElement = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.SEQUENCE_ELEMENT_TAG);
+          element.appendChild(newSequenceElement);
+          formatChild(newSequenceElement);
+        }
+      }           
+      else // a base type is specified
+      {
+        Element sequenceChoiceOrAllElement = null;  // copy the model to reposition it off of the new derived by element
+        if (XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.SEQUENCE_ELEMENT_TAG, false) ||
+            XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.CHOICE_ELEMENT_TAG, false) ||
+            XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.ALL_ELEMENT_TAG, false))
+        {
+           sequenceChoiceOrAllElement = domHelper.cloneElement(element, contentModelElement);
+        }
+
+        if (needsComplexContent)
+        {
+          if (!(XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false)))
+          {
+            domHelper.changeContentModel(element, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, sequenceChoiceOrAllElement);
+            contentModelElement = domHelper.getContentModelFromParent(element);
+          }          
+        }
+        if (needsSimpleContent)
+        {
+          if (!(XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false)))
+          {
+            // we don't want to append the element content to a simple content
+            sequenceChoiceOrAllElement = null;
+            domHelper.changeContentModel(element, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, sequenceChoiceOrAllElement);
+            contentModelElement = domHelper.getContentModelFromParent(element);
+          }
+        }
+
+        Element derivedByElement = domHelper.getDerivedByElementFromComplexType(element);        
+        if (derivedByElement == null)
+        {
+          if (derivedByString == null || (derivedByString != null && derivedByString.equals("")))
+          {
+            derivedByString = XSDConstants.EXTENSION_ELEMENT_TAG;  // since there is no derivedByElement
+          }
+          derivedByElement = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, derivedByString);
+          contentModelElement.appendChild(derivedByElement);
+          formatChild(contentModelElement);
+          if (sequenceChoiceOrAllElement != null)
+          {
+            derivedByElement.appendChild(sequenceChoiceOrAllElement);
+            formatChild(derivedByElement);
+          }
+        }
+        else
+        {
+          if (helper.getBuiltInTypeNamesList().contains(type) ||
+              helper.getUserSimpleTypeNamesList().contains(type))
+          {
+            derivedByString = XSDConstants.EXTENSION_ELEMENT_TAG;
+            Element aContentModelElement = domHelper.getContentModelFromParent(derivedByElement);
+            if (aContentModelElement != null)
+            {
+              XSDDOMHelper.removeNodeAndWhitespace(aContentModelElement);
+            }
+          }
+          domHelper.changeDerivedByType(contentModelElement, derivedByString, type);
+        }
+        derivedByElement.setAttribute(attr.getName(), attr.getValue());
+      }
+    }
+    
+    xsdComp.setElement(element);
+    endRecording(element);
+  }
+
+  private Element updateModelAndDerivedByKind(String modelType, String derivedByKind, DOMAttribute attr)
+  {
+    Element newContentModelElement = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, modelType);
+    element.appendChild(newContentModelElement);
+
+    Element newDerivedByElement = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, derivedByKind);
+    newContentModelElement.appendChild(newDerivedByElement);
+
+    newDerivedByElement.setAttribute(attr.getName(), attr.getValue());
+    
+    NodeList children = element.getChildNodes();
+    int length = children.getLength();
+    ArrayList nodesToRemove = new ArrayList();
+    for (int i = 0; i < length; i++)
+    {
+      Node node = children.item(i);
+      if (XSDDOMHelper.inputEquals(node, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false) ||
+          XSDDOMHelper.inputEquals(node, XSDConstants.ATTRIBUTE_ELEMENT_TAG, true) ||
+          XSDDOMHelper.inputEquals(node, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true) ||
+          XSDDOMHelper.inputEquals(node, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false))
+      {
+        newDerivedByElement.appendChild(node.cloneNode(true));
+        nodesToRemove.add(node);
+      }
+    }
+    for (Iterator i = nodesToRemove.iterator(); i.hasNext(); )
+    {
+      XSDDOMHelper.removeNodeAndWhitespace((Node)i.next());
+    }
+    
+    formatChild(newContentModelElement);
+
+    return newDerivedByElement;
+  }
+
+  protected void formatChild(Element child)
+  {
+    if (child instanceof XMLNode)
+    {
+      XMLModel model = ((XMLNode)child).getModel();
+      try
+      {
+        // tell the model that we are about to make a big model change
+        model.aboutToChangeModel();
+        
+        IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
+        formatProcessor.formatNode(child);
+      }
+      finally
+      {
+        // tell the model that we are done with the big model change
+        model.changedModel(); 
+      }
+    }
+
+  }
+
+  public DocumentImpl getDocument(Element element)
+  {
+    return (DocumentImpl) element.getOwnerDocument();
+  }
+
+  public void beginRecording(String description, Element element)
+  {
+    getDocument(element).getModel().beginRecording(this, description);
+  }
+  
+  public void endRecording(Element element)
+  {
+    DocumentImpl doc = (DocumentImpl) getDocument(element);
+    
+    doc.getModel().endRecording(this);    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/XSDEditNamespacesAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/XSDEditNamespacesAction.java
new file mode 100644
index 0000000..640355b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/actions/XSDEditNamespacesAction.java
@@ -0,0 +1,220 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.actions;
+
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.common.contentmodel.util.DOMNamespaceInfoManager;
+import org.eclipse.wst.common.contentmodel.util.NamespaceInfo;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xml.ui.actions.ReplacePrefixAction;
+import org.eclipse.wst.xml.ui.util.XMLCommonResources;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.SchemaPrefixChangeHandler;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.TargetNamespaceChangeHandler;
+import org.eclipse.wst.xsd.ui.internal.util.XSDSchemaHelper;
+import org.eclipse.wst.xsd.ui.internal.widgets.XSDEditSchemaInfoDialog;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class XSDEditNamespacesAction extends Action {
+	private Element element;
+	private Node node;
+	private String resourceLocation;
+	private XSDSchema xsdSchema;
+    private DOMNamespaceInfoManager namespaceInfoManager = new DOMNamespaceInfoManager();
+	
+	public XSDEditNamespacesAction(String label, Element element, Node node) {
+		super();
+		setText(label);
+		
+		this.element = element;
+		this.node = node;
+		///////////////////// This needs to be changed....
+		this.resourceLocation = "dummy";		
+	}
+	
+	public XSDEditNamespacesAction(String label, Element element, Node node, XSDSchema schema) {
+		this (label, element, node);
+		xsdSchema = schema;
+	}
+	
+	public void run() {
+		if (element != null)
+		{   
+		      Shell shell = XMLCommonResources.getInstance().getWorkbench().getActiveWorkbenchWindow().getShell();
+		      String targetNamespace = null;
+		      if (xsdSchema != null) {
+		      	targetNamespace = xsdSchema.getTargetNamespace();
+		      }
+		      XSDEditSchemaInfoDialog dialog = new XSDEditSchemaInfoDialog(shell, new Path(resourceLocation), targetNamespace); 
+
+		      List namespaceInfoList = namespaceInfoManager.getNamespaceInfoList(element);
+		      List oldNamespaceInfoList = NamespaceInfo.cloneNamespaceInfoList(namespaceInfoList);
+
+		      // here we store a copy of the old info for each NamespaceInfo
+		      // this info will be used in createPrefixMapping() to figure out how to update the document 
+		      // in response to these changes
+		      for (Iterator i = namespaceInfoList.iterator(); i.hasNext(); )
+		      {
+		        NamespaceInfo info = (NamespaceInfo)i.next();
+		        NamespaceInfo oldCopy = new NamespaceInfo(info);
+		        info.setProperty("oldCopy", oldCopy);
+		      }
+		                              
+		      dialog.setNamespaceInfoList(namespaceInfoList);   
+		      dialog.create();      
+		      //dialog.getShell().setSize(500, 300);
+		      dialog.getShell().setText(XMLCommonResources.getInstance().getString("_UI_MENU_EDIT_SCHEMA_INFORMATION_TITLE"));
+		      dialog.setBlockOnOpen(true);                                 
+		      dialog.open();
+          String xsdPrefix = "";    
+
+		      if (dialog.getReturnCode() == Window.OK)
+		      {
+            Element xsdSchemaElement = xsdSchema.getElement();
+            DocumentImpl doc = (DocumentImpl) xsdSchemaElement.getOwnerDocument();
+            
+            List newInfoList = dialog.getNamespaceInfoList();
+
+		        // see if we need to rename any prefixes
+		        Map prefixMapping = createPrefixMapping(oldNamespaceInfoList, namespaceInfoList);
+            
+            Map map2 = new Hashtable();
+            String xsdNS = "";
+            for (Iterator iter = newInfoList.iterator(); iter.hasNext(); )
+            {
+              NamespaceInfo ni = (NamespaceInfo)iter.next();
+              String pref = ni.prefix;
+              String uri = ni.uri;
+              if (pref == null) pref = "";
+              if (uri == null) uri = "";
+              if (XSDConstants.isSchemaForSchemaNamespace(uri))
+              {
+                xsdPrefix = pref;
+              }
+              map2.put(pref, uri);
+            }
+           
+		        if (map2.size() > 0)
+		        {
+		        	try {
+                
+                doc.getModel().beginRecording(this, XSDEditorPlugin.getXSDString("_UI_NAMESPACE_CHANGE"));
+
+                if (xsdPrefix != null && xsdPrefix.length() == 0)
+                {
+                  xsdSchema.setSchemaForSchemaQNamePrefix(null);
+                }
+                else
+                {
+                  xsdSchema.setSchemaForSchemaQNamePrefix(xsdPrefix);
+                }
+                
+                SchemaPrefixChangeHandler spch = new SchemaPrefixChangeHandler(xsdSchema, xsdPrefix);
+                spch.resolve();
+
+                xsdSchema.setTargetNamespace(dialog.getTargetNamespace());
+                
+                namespaceInfoManager.removeNamespaceInfo(element);
+                namespaceInfoManager.addNamespaceInfo(element, newInfoList, false);
+               
+//                manager.getModel().aboutToChangeModel();
+			          ReplacePrefixAction replacePrefixAction = new ReplacePrefixAction(null, element, prefixMapping);
+			          replacePrefixAction.run();
+                
+                TargetNamespaceChangeHandler targetNamespaceChangeHandler = new TargetNamespaceChangeHandler(xsdSchema, targetNamespace, dialog.getTargetNamespace());
+                targetNamespaceChangeHandler.resolve();
+
+				    	} finally {
+//				      manager.getModel().changedModel();
+
+                XSDSchemaHelper.updateElement(xsdSchema);
+                doc.getModel().endRecording(this);
+			     		}
+		        }
+		   }      
+          
+		}
+	}
+	
+	 protected Map createPrefixMapping(List oldList, List newList)
+	  {          
+	    Map map = new Hashtable();
+
+	    Hashtable oldURIToPrefixTable = new Hashtable();
+	    for (Iterator i = oldList.iterator(); i.hasNext(); )
+	    {    
+	      NamespaceInfo oldInfo = (NamespaceInfo)i.next();                    
+	      oldURIToPrefixTable.put(oldInfo.uri, oldInfo);
+	    }
+	    
+	    for (Iterator i = newList.iterator(); i.hasNext(); )
+	    {
+	      NamespaceInfo newInfo = (NamespaceInfo)i.next();
+	      NamespaceInfo oldInfo = (NamespaceInfo)oldURIToPrefixTable.get(newInfo.uri != null ? newInfo.uri : ""); 
+
+
+	      // if oldInfo is non null ... there's a matching URI in the old set
+	      // we can use its prefix to detemine out mapping
+	      //
+	      // if oldInfo is null ...  we use the 'oldCopy' we stashed away 
+	      // assuming that the user changed the URI and the prefix
+	      if (oldInfo == null)                                            
+	      {
+	        oldInfo = (NamespaceInfo)newInfo.getProperty("oldCopy");           
+	      } 
+
+	      if (oldInfo != null)
+	      {
+	        String newPrefix = newInfo.prefix != null ? newInfo.prefix : "";
+	        String oldPrefix = oldInfo.prefix != null ? oldInfo.prefix : "";
+	        if (!oldPrefix.equals(newPrefix))
+	        {
+	          map.put(oldPrefix, newPrefix);    
+	        }
+	      }      
+	    }        
+	    return map;
+	  }
+   
+//    private void updateAllNodes(Element element, String prefix)
+//    {
+//      element.setPrefix(prefix);
+//      NodeList list = element.getChildNodes();
+//      if (list != null)
+//      {
+//        for (int i=0; i < list.getLength(); i++)
+//        {
+//          Node child = list.item(i);
+//          if (child != null && child instanceof Element)
+//          {
+//            child.setPrefix(prefix);
+//            if (child.hasChildNodes())
+//            {
+//              updateAllNodes((Element)child, prefix);
+//            }
+//          }
+//        }
+//      }   
+//    }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AbstractCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AbstractCommand.java
new file mode 100644
index 0000000..9d8c0a1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AbstractCommand.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.commands;
+
+import org.eclipse.wst.sse.core.format.IStructuredFormatProcessor;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.format.FormatProcessorXML;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.w3c.dom.Element;
+
+public abstract class AbstractCommand 
+{
+  private XSDConcreteComponent parent;
+  private XSDConcreteComponent model;
+
+  protected AbstractCommand(XSDConcreteComponent parent)
+  {
+    this.parent = parent;
+  }
+  
+  public abstract void run();
+
+  protected XSDConcreteComponent getParent()
+  {
+    return parent;
+  }
+  
+  public XSDConcreteComponent getModelObject()
+  {
+    return model;
+  }
+  
+  protected void setModelObject(XSDConcreteComponent model)
+  {
+    this.model = model;
+  }
+  
+  // Establish part-whole relationship
+  protected abstract boolean adopt(XSDConcreteComponent model);
+
+  protected void formatChild(Element child)
+  {
+    if (child instanceof XMLNode)
+    {
+      XMLModel model = ((XMLNode)child).getModel();
+      try
+      {
+        // tell the model that we are about to make a big model change
+        model.aboutToChangeModel();
+        
+        IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
+        formatProcessor.formatNode(child);
+      }
+      finally
+      {
+        // tell the model that we are done with the big model change
+        model.changedModel(); 
+      }
+    }
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddAttributeDeclarationCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddAttributeDeclarationCommand.java
new file mode 100644
index 0000000..7be73f0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddAttributeDeclarationCommand.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.commands;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+public class AddAttributeDeclarationCommand extends AbstractCommand
+{
+  XSDAttributeDeclaration refAttribute = null;
+  /**
+   * @param parent
+   */
+  public AddAttributeDeclarationCommand(XSDConcreteComponent parent)
+  {
+    super(parent);
+  }
+
+  public AddAttributeDeclarationCommand(XSDConcreteComponent parent, XSDAttributeDeclaration ref)
+  {
+    super(parent);
+    this.refAttribute = ref;
+  }
+
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.xsd.ui.internal.commands.AbstractCommand#run()
+   */
+  public void run()
+  {
+    XSDConcreteComponent parent = getParent();
+    if (parent instanceof XSDComplexTypeDefinition)
+    {
+      XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)parent;
+
+      XSDAttributeDeclaration attribute = XSDFactory.eINSTANCE.createXSDAttributeDeclaration();
+      attribute.setName(getNewName("Attribute")); //$NON-NLS-1$
+      attribute.setTypeDefinition(ct.getSchema().getSchemaForSchema().resolveSimpleTypeDefinition("string")); //$NON-NLS-1$
+      
+      XSDAttributeUse attributeUse = XSDFactory.eINSTANCE.createXSDAttributeUse();
+      attributeUse.setAttributeDeclaration(attribute);
+      attributeUse.setContent(attribute);
+      
+      if (ct.getAttributeContents() != null)
+      {
+        ct.getAttributeContents().add(attributeUse);
+        formatChild(attribute.getElement());
+      }
+    }
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.xsd.ui.internal.commands.AbstractCommand#adopt(org.eclipse.xsd.XSDConcreteComponent)
+   */
+  protected boolean adopt(XSDConcreteComponent model)
+  {
+    return false;
+  }
+  
+  ArrayList names;
+  
+  protected String getNewName(String description)
+  {
+    String candidateName = "New" + description; //$NON-NLS-1$
+    StringBuffer candidateNameSB = new StringBuffer("New" + description); //$NON-NLS-1$
+    XSDConcreteComponent parent = getParent();
+    names = new ArrayList();
+    int i = 1;
+    if (parent instanceof XSDComplexTypeDefinition)
+    {
+      XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)parent;
+      walkUpInheritance(ct);
+
+      boolean ready = false;
+      while (!ready)
+      {
+        ready = true;
+        for (Iterator iter = names.iterator(); iter.hasNext(); )
+        {
+          String attrName = (String)iter.next();
+          if (candidateName.equals(attrName))
+          {
+            ready = false;
+            candidateName = "New" + description + String.valueOf(i); //$NON-NLS-1$
+            i++;
+          }
+        }
+      }
+    }
+    return candidateName;
+  }
+  
+  private void walkUpInheritance(XSDComplexTypeDefinition ct)
+  {
+    updateNames(ct);
+    XSDTypeDefinition typeDef = ct.getBaseTypeDefinition();
+    if (ct != ct.getRootType())
+    {
+      if (typeDef instanceof XSDComplexTypeDefinition)
+      {
+        XSDComplexTypeDefinition ct2 = (XSDComplexTypeDefinition)typeDef;
+        walkUpInheritance(ct2);
+      }
+    }
+  }
+
+  private void updateNames(XSDComplexTypeDefinition ct)
+  {
+    Iterator iter = ct.getAttributeContents().iterator();
+    while (iter.hasNext())
+    {
+      Object obj = iter.next();
+      if (obj instanceof XSDAttributeUse)
+      {
+        XSDAttributeUse use = (XSDAttributeUse)obj;
+        XSDAttributeDeclaration attr = use.getAttributeDeclaration();
+        String attrName = attr.getName();
+        if (attrName != null)
+        {
+          names.add(attrName);
+        }
+      }
+    }
+
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddComplexTypeDefinitionCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddComplexTypeDefinitionCommand.java
new file mode 100644
index 0000000..72da36a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddComplexTypeDefinitionCommand.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.commands;
+
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDSchema;
+
+public final class AddComplexTypeDefinitionCommand extends AbstractCommand
+{
+  private String name;
+  
+  public AddComplexTypeDefinitionCommand
+    (XSDConcreteComponent parent,
+     String name)
+  {
+    super(parent);
+    this.name = name; // this may be null for anonymous type
+  }
+	  
+  public void run()
+  {
+  	XSDComplexTypeDefinition typeDef = 
+      XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
+    typeDef.setName(name);
+    	
+    if (adopt(typeDef))
+      setModelObject(typeDef);
+  }
+  
+  protected boolean adopt(XSDConcreteComponent model)
+  {
+  	XSDConcreteComponent parent = getParent();
+    if (parent instanceof XSDSchema)
+      ((XSDSchema)parent).getTypeDefinitions().add(model);
+    else if (parent instanceof XSDElementDeclaration)
+      ((XSDElementDeclaration)parent).setAnonymousTypeDefinition((XSDComplexTypeDefinition)model);
+    else
+      return false; // invalid parent
+    
+    return true;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddElementDeclarationCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddElementDeclarationCommand.java
new file mode 100644
index 0000000..cf161ec
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddElementDeclarationCommand.java
@@ -0,0 +1,53 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.commands;
+
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDSchema;
+
+public final class AddElementDeclarationCommand extends AbstractCommand
+{
+  private String name; // element name
+  
+  public AddElementDeclarationCommand
+    (XSDConcreteComponent parent,
+     String name)
+  {
+    super(parent);
+    this.name = name;
+  }
+  
+  public void run()
+  {
+    XSDElementDeclaration elementDecl = 
+      XSDFactory.eINSTANCE.createXSDElementDeclaration();
+    elementDecl.setName(name);
+    
+    if (adopt(elementDecl))
+      setModelObject(elementDecl);
+  }
+
+  protected boolean adopt(XSDConcreteComponent model)
+  {
+  	XSDConcreteComponent parent = getParent();
+    if (parent instanceof XSDSchema)
+      ((XSDSchema)parent).getElementDeclarations().add(model);
+    else if (parent instanceof XSDParticle)
+      ((XSDParticle)parent).setContent((XSDElementDeclaration)model);
+    else
+      return false; // invalid parent
+    
+    return true;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddModelGroupCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddModelGroupCommand.java
new file mode 100644
index 0000000..73428f2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddModelGroupCommand.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.commands;
+
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDCompositor;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDParticle;
+
+public class AddModelGroupCommand extends AbstractCommand
+{
+  protected XSDCompositor compositor;
+
+  public AddModelGroupCommand(XSDConcreteComponent parent, XSDCompositor compositor)
+  {
+    super(parent);
+    this.compositor = compositor;
+  }
+
+  public void run()
+  {
+    XSDConcreteComponent parent = getParent();
+    XSDConcreteComponent owner = null;
+    if (parent instanceof XSDElementDeclaration)
+    {
+      XSDElementDeclaration ed = (XSDElementDeclaration)parent;      
+      if (ed.getTypeDefinition() != null) 
+      {
+        if (ed.getAnonymousTypeDefinition() == null)
+        {
+          ed.setTypeDefinition(null);
+          XSDComplexTypeDefinition td = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
+          ed.setAnonymousTypeDefinition(td);
+        }
+        owner = ed.getTypeDefinition();
+      }        
+      else if (ed.getAnonymousTypeDefinition() == null)
+      {
+        XSDComplexTypeDefinition td = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
+        ed.setAnonymousTypeDefinition(td);
+        owner = td;        
+      }
+      else if (ed.getAnonymousTypeDefinition() instanceof XSDComplexTypeDefinition)
+      {
+        owner = ed.getAnonymousTypeDefinition();
+      }  
+    }
+    else if (parent instanceof XSDModelGroup)
+    {
+      ((XSDModelGroup) parent).getContents().add(createModelGroup());
+    }
+    else if (parent instanceof XSDComplexTypeDefinition)
+    {
+      owner = ((XSDComplexTypeDefinition)parent);
+    }
+    if (owner != null)
+    {
+      XSDParticle particle = XSDFactory.eINSTANCE.createXSDParticle(); 
+      XSDModelGroup modelGroup = createModelGroup();
+      particle.setContent(modelGroup);
+      XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)owner;
+      ctd.setContent(particle);
+      formatChild(parent.getElement());
+    }  
+  }
+
+  protected boolean adopt(XSDConcreteComponent model)
+  {
+    return false;
+  }
+  
+  protected XSDModelGroup createModelGroup()
+  {
+    XSDModelGroup modelGroup = XSDFactory.eINSTANCE.createXSDModelGroup();
+    modelGroup.setCompositor(compositor);
+    return modelGroup;
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddSimpleTypeDefinitionCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddSimpleTypeDefinitionCommand.java
new file mode 100644
index 0000000..b0c347b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/commands/AddSimpleTypeDefinitionCommand.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.commands;
+
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+
+public final class AddSimpleTypeDefinitionCommand extends AbstractCommand
+{
+  private String name;
+  
+  public AddSimpleTypeDefinitionCommand
+    (XSDConcreteComponent parent,
+     String name)
+  {
+    super(parent);
+    this.name = name; // this may be null for anonymous type
+  }
+  
+  public void run()
+  {
+  	XSDSimpleTypeDefinition typeDef = 
+      XSDFactory.eINSTANCE.createXSDSimpleTypeDefinition();
+  	typeDef.setName(name);
+  	
+    if (adopt(typeDef))
+      setModelObject(typeDef);
+  }
+  
+  protected boolean adopt(XSDConcreteComponent model)
+  {
+  	XSDConcreteComponent parent = getParent();
+    if (parent instanceof XSDSchema)
+      ((XSDSchema)parent).getTypeDefinitions().add(model);
+    else if (parent instanceof XSDElementDeclaration)
+      ((XSDElementDeclaration)parent).setAnonymousTypeDefinition((XSDSimpleTypeDefinition)model);
+    else if (parent instanceof XSDAttributeDeclaration)
+      ((XSDAttributeDeclaration)parent).setAnonymousTypeDefinition((XSDSimpleTypeDefinition)model);
+    else
+      return false; // invalid parent
+    
+    return true;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/BaseDragNodesCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/BaseDragNodesCommand.java
new file mode 100644
index 0000000..142d4ed
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/BaseDragNodesCommand.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.dnd;
+
+import java.util.Collection;
+
+import org.eclipse.wst.common.ui.dnd.DefaultDragAndDropCommand;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Node;
+
+
+public abstract class BaseDragNodesCommand extends DefaultDragAndDropCommand
+{
+  /**
+   * Constructor for BaseDragNodesCommand.
+   * @param target
+   * @param location
+   * @param operations
+   * @param operation
+   * @param sources
+   */
+  public BaseDragNodesCommand(
+    Object target,
+    float location,
+    int operations,
+    int operation,
+    Collection sources)
+  {
+    super(target, location, operations, operation, sources);
+  }
+
+  protected boolean isDirectSchemaChild(Node node)
+  {
+    Node parent = node.getParentNode();
+    if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false) &&
+        parent.getParentNode().equals(parent.getOwnerDocument()))
+    {
+      return true;
+    }
+    return false;
+  } 
+  
+  protected boolean isSiblingNodes(Node first, Node second)
+  {
+    if (first.getParentNode() != null)
+    {
+      return first.getParentNode().equals(second.getParentNode());
+    }
+    return false;
+  }
+  
+  protected void beginRecording()
+  {
+    if (target != null)
+    {
+      XMLModel model = getModel((Node)target);
+      
+      if (model != null)
+      {
+        model.beginRecording(this, "Move");
+      }
+    }
+  }
+  
+  protected void endRecording()
+  {
+    if (target != null)
+    {
+      XMLModel model = getModel((Node)target);
+      
+      if (model != null)
+      {
+        model.endRecording(this);
+      }
+    }
+  }
+  protected XMLModel getModel(Node node)
+  {
+    Object object = node.getOwnerDocument();
+    if (object instanceof DocumentImpl)
+    {
+      return ((DocumentImpl) object).getModel();
+    }
+    return null;
+  }
+  
+  protected void moveNode(Node referenceNode, Node nodeToMove, boolean isBefore)
+  {
+    XSDDOMHelper.moveNode(referenceNode, nodeToMove, isBefore);
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/DragNodesCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/DragNodesCommand.java
new file mode 100644
index 0000000..b3692cf
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/DragNodesCommand.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.dnd;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.format.NodeFormatter;
+import org.w3c.dom.Node;
+
+public class DragNodesCommand extends BaseDragNodesCommand
+{
+  /**
+   * Constructor for DragNodesCommand.
+   * @param target
+   * @param location
+   * @param operations
+   * @param operation
+   * @param sources
+   */
+  public DragNodesCommand(
+    Object target,
+    float location,
+    int operations,
+    int operation,
+    Collection sources)
+  {
+    super(target, location, operations, operation, sources);
+  }
+
+  /**
+   * @see org.eclipse.wst.common.ui.dnd.DragAndDropCommand#canExecute()
+   */
+  public boolean canExecute()
+  {
+    if (sources.size() > 0)
+    {
+      Node firstSource = (Node) sources.toArray()[0];
+      return isSiblingNodes((Node) target, firstSource);
+    }
+    return false;
+//    return isDirectSchemaChild((Node)target);
+  }
+
+  
+  /**
+   * @see org.eclipse.wst.common.ui.dnd.DragAndDropCommand#execute()
+   */
+  public void execute()
+  {
+  	NodeFormatter formatProcessor = new NodeFormatter();
+    Node referenceNode = (Node) target;
+    Iterator iter = sources.iterator();
+    beginRecording();
+
+    while (iter.hasNext()) 
+    {
+      Node node = (Node) iter.next();
+      if (isSiblingNodes(referenceNode,node)) 
+      {
+        moveNode(referenceNode, node, !isAfter());
+        formatProcessor.format((XMLNode)node);
+      }
+    }
+//    formatProcessor.format((XMLNode)referenceNode.getParentNode());
+    endRecording();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/XSDDragAndDropManager.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/XSDDragAndDropManager.java
new file mode 100644
index 0000000..b00c642
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/dnd/XSDDragAndDropManager.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.dnd;
+
+import java.util.Collection;
+
+import org.eclipse.wst.common.ui.dnd.DragAndDropCommand;
+import org.eclipse.wst.common.ui.dnd.DragAndDropManager;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Node;
+
+public class XSDDragAndDropManager implements DragAndDropManager
+{
+  /**
+   * Constructor for XSDDragAndDropManager.
+   */
+  public XSDDragAndDropManager()
+  {
+  }
+  
+  protected boolean isDirectSchemaChild(Node node)
+  {
+    Node parent = node.getParentNode();
+    if (XSDDOMHelper.inputEquals(parent, XSDConstants.SCHEMA_ELEMENT_TAG, false) &&
+        parent.getParentNode().equals(parent.getOwnerDocument()))
+    {
+      return true;
+    }
+    return false;
+  } 
+
+  /**
+   * @see org.eclipse.wst.common.ui.dnd.DragAndDropManager#createCommand(Object, float, int, int, Collection)
+   */
+  public DragAndDropCommand createCommand(
+    Object target,
+    float location,
+    int operations,
+    int operation,
+    Collection source)
+  {
+    if (target instanceof Node) 
+    {
+      Node node = (Node) target;
+//      if (isDirectSchemaChild(node))
+//      {
+        return new DragNodesCommand(target, location, operations, operation, source);
+//      }
+    }
+    return null;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/editparts/AbstractComponentViewerRootEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/editparts/AbstractComponentViewerRootEditPart.java
new file mode 100644
index 0000000..caef397
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/editparts/AbstractComponentViewerRootEditPart.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.gef.util.editparts;
+                                      
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Panel;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.ContainerLayout;
+              
+
+public abstract class AbstractComponentViewerRootEditPart extends AbstractGraphicalEditPart 
+{
+  protected final static String MESSAGE_PLACE_HOLDER = "MESSAGE_PLACE_HOLDER";
+  protected Object input;              
+
+  public void setInput(Object input)
+  {
+    this.input = input;
+    refreshChildren();
+  }
+
+  protected IFigure createFigure()
+  {
+    Panel panel = new Panel();
+    ContainerLayout layout = new ContainerLayout();
+    layout.setBorder(60);
+    panel.setLayoutManager(layout);
+    return panel;
+  }   
+           
+
+  protected List getModelChildren() 
+  {               
+    List list = new ArrayList();
+    if (input != null)
+    {
+      list.add(input);
+    }
+    else
+    {
+      list.add(MESSAGE_PLACE_HOLDER);
+    }
+    return list;
+  }         
+
+  protected abstract EditPart createChild(Object model);
+  
+  protected void createEditPolicies()
+  {  
+  }             
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectedEditPartFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectedEditPartFigure.java
new file mode 100644
index 0000000..f25f677
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectedEditPartFigure.java
@@ -0,0 +1,138 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.gef.util.figures;
+           
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+
+              
+public class ConnectedEditPartFigure extends ContainerFigure implements IConnectedEditPartFigure
+{                 
+  protected EditPart editPart;
+  protected boolean childConnectionsEnabled = true;
+  protected List connectedFigures = new ArrayList();
+  protected int connectionType = RIGHT_CONNECTION;
+    
+  public ConnectedEditPartFigure(EditPart editPart)
+  {
+    this.editPart = editPart;    
+  }     
+
+  public void setChildConnectionsEnabled(boolean enabled)
+  {
+    childConnectionsEnabled = enabled;
+  }          
+
+  protected IConnectedEditPartFigure getParentGraphNodeFigure()
+  {
+    IConnectedEditPartFigure result = null;
+    for (EditPart parentEditPart = editPart.getParent(); parentEditPart != null; parentEditPart = parentEditPart.getParent())
+    {                                                              
+      IFigure figure = ((AbstractGraphicalEditPart)parentEditPart).getFigure();    
+      if (figure instanceof IConnectedEditPartFigure)
+      {                                                            
+        IConnectedEditPartFigure graphNodeFigure = (IConnectedEditPartFigure)figure;
+        if (graphNodeFigure.getConnectionFigure() != null)
+        {
+          result = graphNodeFigure;
+          break;
+        }
+      }          
+    }          
+    return result;
+  }
+
+  public void addNotify()                     
+  {           
+    super.addNotify();
+    if (getConnectionFigure() != null)
+    {
+      IConnectedEditPartFigure parentGraphNodeFigure = getParentGraphNodeFigure();
+      if (parentGraphNodeFigure != null)
+      {   
+        parentGraphNodeFigure.addConnectedFigure(this);
+      }   
+    }
+  }   
+
+  public void removeNotify()
+  {
+    super.removeNotify();
+    if (getConnectionFigure() != null)
+    {
+      IConnectedEditPartFigure parentGraphNodeFigure = getParentGraphNodeFigure();
+      if (parentGraphNodeFigure != null)
+      {   
+        parentGraphNodeFigure.removeConnectedFigure(this);
+      }   
+    }
+  }   
+
+  public void addConnectedFigure(IConnectedEditPartFigure figure)
+  {   
+    if (childConnectionsEnabled) 
+    {  
+      // this test is required since we sometimes receive the 'addNotify' call twice
+      //
+      if (!connectedFigures.contains(figure))
+      {
+        connectedFigures.add(figure);
+      }
+    }
+  }
+
+  public void removeConnectedFigure(IConnectedEditPartFigure figure)
+  {
+    if (childConnectionsEnabled) 
+    { 
+      connectedFigures.remove(figure);
+    }
+  }    
+                    
+  public IFigure getSelectionFigure()
+  {
+    return this;
+  }
+
+  public IFigure getConnectionFigure()
+  {
+    return this;
+  }
+
+  public List getConnectedFigures(int type)
+  {
+    List list = new ArrayList();
+    for (Iterator i = connectedFigures.iterator(); i.hasNext(); )
+    {           
+      IConnectedEditPartFigure figure = (IConnectedEditPartFigure)i.next();
+      //if (type == 0 || type == figure.getConnectionType())
+      {
+        list.add(figure);
+      }      
+    }
+    return list;
+  }                               
+
+  public int getConnectionType()
+  {
+    return connectionType;
+  }
+
+  public void setConnectionType(int type)
+  {
+    connectionType = type;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectionRenderingFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectionRenderingFigure.java
new file mode 100644
index 0000000..7192108
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ConnectionRenderingFigure.java
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.gef.util.figures;
+        
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.GraphicalEditPart;
+              
+
+public class ConnectionRenderingFigure extends RectangleFigure
+{               
+  protected boolean isOutlined = true;
+  protected IFigure primaryLayer;
+
+  public ConnectionRenderingFigure(IFigure primaryLayer)
+  {
+    setOpaque(false);                   
+    this.primaryLayer = primaryLayer;
+    //setFocusTraversable(false); 
+    //setEnabled(false); 
+  }
+           
+  protected boolean isMouseEventTarget()
+  {
+    return false;
+  }        
+
+  public boolean containsPoint(int x, int y)
+  {
+    return false;
+  }
+
+  protected void fillShape(Graphics graphics)
+  { 
+    graphics.setForegroundColor(ColorConstants.black);
+    drawLines(graphics, primaryLayer);
+  }
+
+  protected void outlineShape(Graphics graphics)
+  { 
+    if (isOutlined)
+    {
+      super.outlineShape(graphics);
+    }
+  } 
+
+  protected void drawLines(Graphics graphics, IFigure figure)
+  {      
+    if (figure instanceof IConnectedEditPartFigure)
+    {
+      IConnectedEditPartFigure graphNodeFigure = (IConnectedEditPartFigure)figure;         
+      List connectedFigures = graphNodeFigure.getConnectedFigures(IConnectedEditPartFigure.RIGHT_CONNECTION);
+      int connectedFiguresSize = connectedFigures.size();              
+
+      if (connectedFiguresSize > 0) 
+      {                                         
+        IConnectedEditPartFigure firstGraphNodeFigure = (IConnectedEditPartFigure)connectedFigures.get(0);
+        Rectangle r = graphNodeFigure.getConnectionFigure().getBounds();    
+          
+        int x1 = r.x + r.width;
+        int y1 = r.y + r.height/2;
+                                                                                   
+        int startOfChildBox = firstGraphNodeFigure.getConnectionFigure().getBounds().x;
+        int x2 = x1 + (startOfChildBox - x1) / 3;
+        int y2 = y1;
+      
+        if (connectedFiguresSize == 1)
+        {
+          graphics.drawLine(x1, y1, startOfChildBox, y2);   
+        }
+        else // (connectedFigures.length > 1)
+        { 
+          graphics.drawLine(x1, y1, x2, y2);
+
+          int minY = Integer.MAX_VALUE;
+          int maxY = -1;
+
+          for (Iterator i = connectedFigures.iterator(); i.hasNext(); )
+          {                                 
+            IConnectedEditPartFigure connectedFigure = (IConnectedEditPartFigure)i.next();
+            Rectangle childConnectionRectangle = connectedFigure.getConnectionFigure().getBounds();
+            int y = childConnectionRectangle.y + childConnectionRectangle.height / 2;
+            minY = Math.min(minY, y);
+            maxY = Math.max(maxY, y);
+            graphics.drawLine(x2, y, childConnectionRectangle.x, y);
+          }                   
+          graphics.drawLine(x2, minY, x2, maxY);
+        }                          
+      }                             
+    }            
+
+    //boolean visitChildren = true;
+    List children = figure.getChildren();
+    for (Iterator i = children.iterator(); i.hasNext(); )
+    {
+      IFigure child = (IFigure)i.next();
+      drawLines(graphics, child);
+    }
+  }    
+
+  // This method supports the preview connection line function related to drag and drop
+  //     
+  public PointList getConnectionPoints(GraphicalEditPart parentEditPart, GraphicalEditPart childRefEditPart, Rectangle draggedFigureBounds)
+  {           
+    PointList pointList = new PointList();                         
+    int[] data = new int[1];
+    Point a = getConnectionPoint(parentEditPart, childRefEditPart, data);
+    if (a != null)
+    {   
+      int draggedFigureBoundsY = draggedFigureBounds.y + draggedFigureBounds.height/2;
+
+      pointList.addPoint(a); 
+      //pointList.addPoint(new Point(draggedFigureBounds.x, draggedFigureBoundsY));
+      
+      if (data[0] == 0) // insert between 2 items
+      {                                         
+        int x = a.x + (draggedFigureBounds.x - a.x)/2;
+        pointList.addPoint(new Point(x, a.y));
+        pointList.addPoint(new Point(x, draggedFigureBoundsY));        
+        pointList.addPoint(new Point(draggedFigureBounds.x, draggedFigureBoundsY));
+      }
+      else // insert at first or last position
+      {
+        pointList.addPoint(new Point(a.x, draggedFigureBoundsY));   
+        pointList.addPoint(new Point(draggedFigureBounds.x, draggedFigureBoundsY));
+      }
+    }       
+    return pointList;
+  }
+
+         
+  // This method supports the preview connection line function related to drag and drop
+  //     
+  protected Point getConnectionPoint(GraphicalEditPart parentEditPart, GraphicalEditPart childRefEditPart, int[] data)
+  {                      
+    Point point = null;     
+    List childList = parentEditPart.getChildren();         
+                                                                                                                                               
+    if (parentEditPart.getFigure() instanceof IConnectedEditPartFigure && childList.size() > 0)
+    {   
+      point = new Point();
+
+      GraphicalEditPart prev = null;    
+      GraphicalEditPart next = null;
+                               
+      for (Iterator i = childList.iterator(); i.hasNext(); )
+      {             
+        Object o = i.next();    
+        if (o instanceof GraphicalEditPart)
+        {
+          GraphicalEditPart childEditPart = (GraphicalEditPart)o;
+          if (childEditPart.getFigure() instanceof IConnectedEditPartFigure)
+          {
+            if (childEditPart == childRefEditPart)
+            {
+              next = childEditPart;
+              break;
+            }                                           
+            prev = childEditPart;
+          }
+        }
+      }                            
+                          
+
+      if (next != null && prev != null)
+      {                   
+        int ya = getConnectedEditPartConnectionBounds(prev).getCenter().y;
+        int yb = getConnectedEditPartConnectionBounds(next).getCenter().y;
+        point.y = ya + (yb - ya)/2;   
+        data[0] = 0;
+      }                               
+      else if (prev != null) // add it last
+      {
+        point.y = getConnectedEditPartConnectionBounds(prev).getCenter().y;
+        data[0] = 1;
+      }
+      else if (next != null) // add it first!
+      {                           
+        point.y = getConnectedEditPartConnectionBounds(next).getCenter().y;
+        data[0] = -1;
+      }
+          
+      if (next != null || prev != null)
+      {
+        GraphicalEditPart child = prev != null ? prev : next;
+        int startOfChildBox = getConnectedEditPartConnectionBounds(child).x;
+        Rectangle r = getConnectedEditPartConnectionBounds(parentEditPart);  
+        int x1 = r.x + r.width;
+        point.x = x1 + (startOfChildBox - x1) / 3;
+      }
+    }    
+    return point;
+  }
+
+  protected Rectangle getConnectedEditPartConnectionBounds(GraphicalEditPart editPart)
+  {
+    return ((IConnectedEditPartFigure)editPart.getFigure()).getConnectionFigure().getBounds();
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerFigure.java
new file mode 100644
index 0000000..d7a77ac
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerFigure.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.gef.util.figures;
+            
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.RectangleFigure;
+              
+public class ContainerFigure extends RectangleFigure implements IExpandable
+{               
+  protected boolean isOutlined = false;
+  protected boolean isExpanded = true;
+
+  public ContainerFigure()
+  {
+    setLayoutManager(new ContainerLayout());
+    setFill(false);
+  }
+
+  public void doLayout()
+  {
+	  layout();
+	  setValid(true);
+  }  
+          
+  public ContainerLayout getContainerLayout()
+  {
+    return (ContainerLayout)getLayoutManager();
+  }           
+
+  public void setOutlined(boolean isOutlined)
+  {
+    this.isOutlined = isOutlined;
+  }     
+
+  protected void outlineShape(Graphics graphics)
+  { 
+    if (isOutlined)
+    {
+      super.outlineShape(graphics);
+    }
+  }
+
+  public boolean isExpanded()
+  {
+    return isExpanded;
+  }
+  
+  public void setExpanded(boolean isExpanded)
+  {
+    this.isExpanded = isExpanded;
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerLayout.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerLayout.java
new file mode 100644
index 0000000..12f654b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/ContainerLayout.java
@@ -0,0 +1,218 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.gef.util.figures;
+                   
+import java.util.List;
+
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+              
+
+public class ContainerLayout extends AbstractLayout
+{                                         
+  protected boolean isHorizontal;
+  protected int spacing = 0;
+  protected int border = 0; 
+
+  public ContainerLayout()
+  { 
+    this(true, 0); 
+  }             
+
+  public ContainerLayout(boolean isHorizontal, int spacing)
+  {
+    this.isHorizontal = isHorizontal;   
+    this.spacing = spacing;
+  }  
+
+  public void setHorizontal(boolean isHorizontal)
+  {
+    this.isHorizontal = isHorizontal;
+  }  
+
+  public void setSpacing(int spacing)
+  {
+    this.spacing = spacing;
+  }  
+
+  public void setBorder(int border)
+  {
+    this.border = border;
+  }  
+
+  protected int alignFigure(IFigure parent, IFigure child)
+  { 
+    return -1;
+  }
+
+  /**
+   * Calculates and returns the preferred size of the container 
+   * given as input.
+   * 
+   * @param figure  Figure whose preferred size is required.
+   * @return  The preferred size of the passed Figure.
+   * @since 2.0
+   */
+  protected Dimension calculatePreferredSizeHelper(IFigure parent)
+  { 
+    Dimension	preferred = new Dimension();
+  	List children = parent.getChildren();
+		                                        
+	  for (int i=0; i < children.size(); i++)
+    {
+		  IFigure child = (IFigure)children.get(i);      
+    
+      Dimension	childSize = child.getPreferredSize();
+	  
+      if (isHorizontal)
+      {
+		    preferred.width += childSize.width;
+		    preferred.height = Math.max(preferred.height, childSize.height);
+      }
+      else
+      {  
+        preferred.height += childSize.height;
+        preferred.width = Math.max(preferred.width, childSize.width);
+      }
+	  }   
+
+    int childrenSize = children.size();
+    if (childrenSize > 1)
+    {                      
+      if (isHorizontal)    
+      {
+        preferred.width += spacing * (childrenSize - 1);
+      }
+      else
+      {
+		    preferred.height += spacing * (childrenSize - 1);
+      } 
+    }
+                          
+    preferred.width += border * 2;
+    preferred.height += border * 2;
+	  preferred.width += parent.getInsets().getWidth();
+	  preferred.height += parent.getInsets().getHeight();       
+  
+  	return preferred;
+  }
+
+  protected Dimension calculatePreferredSize(IFigure parent, int width, int height)
+  {    
+    Dimension	preferred = null;                                              
+                                  
+    // Here we ensure that an unexpanded container is given a size of (0,0)
+    //
+    if (parent instanceof IExpandable)
+    {
+      IExpandable expandableFigure = (IExpandable)parent;
+      if (!expandableFigure.isExpanded())
+      {
+        preferred = new Dimension(); 
+      }
+    }   
+    
+    if (preferred == null)
+    {
+	    preferred = calculatePreferredSizeHelper(parent);    
+    }
+    
+    return preferred;
+  }
+     
+
+  protected void adjustLayoutLocation(IFigure parent, Dimension dimension)
+  {     
+  }   
+
+  public void layout(IFigure parent)
+  {       
+  	List children = parent.getChildren();
+ 
+    int rx = 0;
+    Dimension	dimension = new Dimension();                                          
+
+
+	  for (int i=0; i < children.size(); i++)
+    {
+		  IFigure child = (IFigure)children.get(i);
+		  Dimension	childSize = child.getPreferredSize();
+      if (isHorizontal)
+      {   
+        dimension.height = Math.max(dimension.height, childSize.height);
+        rx += childSize.width;
+      }
+      else
+      {
+        dimension.width = Math.max(dimension.width, childSize.width);
+      }
+    }
+
+	  //dimension.width += parent.getInsets().left;
+    //dimension.height += parent.getInsets().top;
+
+    if (isHorizontal)
+    {
+      dimension.height += border*2;
+    	dimension.width += border;
+    }
+    else
+    {
+      dimension.width += border*2;
+    	dimension.height += border;
+    }
+    adjustLayoutLocation(parent, dimension);    
+
+    for (int i=0; i < children.size(); i++)
+    {
+      IFigure child = (IFigure)children.get(i);
+	    Dimension	childSize = child.getPreferredSize();
+        
+      if (isHorizontal)
+      {   
+        int y = -1; 
+    
+        y = alignFigure(parent, child);
+    
+        if (y == -1)
+        {
+           y = (dimension.height - childSize.height) / 2;                                      
+        }                      
+                                                   
+        Rectangle rectangle = new Rectangle(dimension.width, y, childSize.width, childSize.height);
+        rectangle.translate(parent.getClientArea().getLocation());                           
+
+
+        child.setBounds(rectangle);                           
+	      dimension.width += childSize.width; 
+        dimension.width += spacing;       
+
+        if (child instanceof SpacingFigure)
+        {          
+          int availableHorizontalSpace = parent.getClientArea().width - rx;
+          dimension.width += availableHorizontalSpace;
+        }           
+      }
+      else
+      {
+        Rectangle rectangle = new Rectangle(0, dimension.height, childSize.width, childSize.height);
+	      rectangle.translate(parent.getClientArea().getLocation());                                  
+        
+
+        child.setBounds(rectangle);  
+        dimension.height += childSize.height;
+        dimension.height += spacing;
+      }
+	  }	      
+  }                                      
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/FillLayout.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/FillLayout.java
new file mode 100644
index 0000000..1b2976b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/FillLayout.java
@@ -0,0 +1,162 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.gef.util.figures;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+
+public class FillLayout extends AbstractLayout
+{         
+  protected boolean isHorizontal = false;                    
+  protected int spacing = 0;
+  public Dimension min;
+
+  public FillLayout(){}     
+  
+  public FillLayout(int spacing)
+  { 
+    this.spacing = spacing; 
+  }
+  
+  public void setHorizontal(boolean isHorizontal)
+  {
+   this.isHorizontal = isHorizontal;
+  }
+  
+  /**
+   * Calculates and returns the preferred size of the input container.
+   * This is the size of the largest child of the container, as all
+   * other children fit into this size.
+   *
+   * @param figure  Container figure for which preferred size is required.
+   * @return  The preferred size of the input figure.
+   * @since 2.0
+   */
+
+  protected Dimension calculatePreferredSize(IFigure figure, int width, int height)
+  {	                 
+    Dimension d = calculatePreferredClientAreaSize(figure);
+  	d.expand(figure.getInsets().getWidth(),
+  	         figure.getInsets().getHeight());
+  	d.union(getBorderPreferredSize(figure));
+  	return d;
+  } 
+  
+  protected Dimension calculatePreferredClientAreaSize(IFigure figure)
+  {
+    Dimension d = new Dimension();
+  	List children = figure.getChildren(); 
+  
+  
+  	for (Iterator i = children.iterator(); i.hasNext(); )
+    {
+  		IFigure child = (IFigure)i.next();
+      Dimension childSize = child.getPreferredSize();
+  
+      if (isHorizontal)
+      {
+        d.width += childSize.width;
+        d.height = Math.max(childSize.height, d.height);
+      }
+      else
+      {
+        d.height += childSize.height;
+        d.width = Math.max(childSize.width, d.width);
+      }
+  	}	 
+  
+                     
+    int childrenSize = children.size();       
+    if (childrenSize > 0)
+    {
+      if (isHorizontal)
+      {
+        d.width += spacing * (childrenSize - 1); 
+      }
+      else
+      {
+        d.height += spacing * (childrenSize - 1);  
+      }
+    }       
+      
+    if (min != null)
+    {
+      d.width = Math.max(d.width, min.width);
+      d.height = Math.max(d.height, min.height);
+    }
+    return d;
+  }
+  
+  /*
+   * Returns the minimum size required by the input container.
+   * This is the size of the largest child of the container, as all
+   * other children fit into this size.
+   */
+  public Dimension getMinimumSize(IFigure figure, int width, int height)
+  {
+  	Dimension d = new Dimension();
+  	List children = figure.getChildren();
+  	IFigure child;
+
+  	for (int i=0; i < children.size(); i++)
+    {
+  		child = (IFigure)children.get(i);
+  		d.union(child.getMinimumSize());
+  	}
+  	d.expand(figure.getInsets().getWidth(),
+  	         figure.getInsets().getHeight());
+  	return d;
+  }
+  
+  public Dimension getPreferredSize(IFigure figure, int width, int height)
+  {
+  	return calculatePreferredSize(figure, width, height);
+  }
+  
+  /*
+   * Lays out the children on top of each other with
+   * their sizes equal to that of the available
+   * paintable area of the input container figure.
+   */
+  public void layout(IFigure figure)
+  {                         
+    Dimension	preferredSize = calculatePreferredClientAreaSize(figure);
+  	Rectangle r = figure.getClientArea().getCopy();
+  	List children = figure.getChildren();
+
+    int nChildren = children.size();                                                          
+    int extraHorizontalSpace = r.width - preferredSize.width;
+
+  	for (Iterator i = children.iterator(); i.hasNext(); )
+    {
+  		IFigure child = (IFigure)i.next();
+      Dimension preferredChildSize = child.getPreferredSize();
+         
+      if (isHorizontal)
+      {                       
+        int w = preferredChildSize.width + (extraHorizontalSpace / nChildren);
+  		  child.setBounds(new Rectangle(r.x, r.y, w, Math.max(preferredSize.height, r.height)));
+        r.x += w + spacing;
+      }
+      else
+      {
+  		  child.setBounds(new Rectangle(r.x, r.y, Math.max(preferredSize.width, r.width), preferredChildSize.height));
+        r.y += preferredChildSize.height + spacing;
+      }
+  	}
+  }   
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedEditPartFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedEditPartFigure.java
new file mode 100644
index 0000000..4c778d7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedEditPartFigure.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.gef.util.figures;
+            
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+
+public interface IConnectedEditPartFigure extends IConnectedFigure
+{                       
+  public static final int UP_CONNECTION = 1; 
+  public static final int DOWN_CONNECTION = 2;
+  public static final int LEFT_CONNECTION = 3;
+  public static final int RIGHT_CONNECTION = 4;
+
+  public IFigure getSelectionFigure();
+  public IFigure getConnectionFigure();
+  public List getConnectedFigures(int type);
+  public int getConnectionType();      
+  public void addConnectedFigure(IConnectedEditPartFigure figure);
+  public void removeConnectedFigure(IConnectedEditPartFigure figure);
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedFigure.java
new file mode 100644
index 0000000..4a6d7de
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectedFigure.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.gef.util.figures;
+            
+import org.eclipse.draw2d.IFigure;
+
+public interface IConnectedFigure extends IFigure
+{                       
+  public IFigure getConnectionFigure();
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectionRenderingViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectionRenderingViewer.java
new file mode 100644
index 0000000..6ed611d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IConnectionRenderingViewer.java
@@ -0,0 +1,16 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.gef.util.figures;
+
+public interface IConnectionRenderingViewer
+{        
+  public ConnectionRenderingFigure getConnectionRenderingFigure();
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IExpandable.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IExpandable.java
new file mode 100644
index 0000000..161581b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/IExpandable.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.gef.util.figures;  
+
+import org.eclipse.draw2d.IFigure;
+
+public interface IExpandable extends IFigure
+{
+  boolean isExpanded(); 
+  void setExpanded(boolean isExpanded);
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/SpacingFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/SpacingFigure.java
new file mode 100644
index 0000000..e245d69
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/gef/util/figures/SpacingFigure.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.gef.util.figures;
+            
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+              
+public class SpacingFigure extends RectangleFigure
+{  
+  public SpacingFigure()
+  {
+    setFill(false);
+    setPreferredSize(new Dimension(0, 0));
+  }
+  
+  //protected void outlineShape(Graphics graphics)
+  //{ 
+  //}                                              
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/BaseGraphicalViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/BaseGraphicalViewer.java
new file mode 100644
index 0000000..63af932
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/BaseGraphicalViewer.java
@@ -0,0 +1,198 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+
+import java.util.Iterator;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.StackLayout;
+import org.eclipse.gef.DefaultEditDomain;
+import org.eclipse.gef.EditDomain;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.KeyHandler;
+import org.eclipse.gef.LayerConstants;
+import org.eclipse.gef.editparts.ScalableRootEditPart;
+import org.eclipse.gef.tools.SelectionTool;
+import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.XSDMenuListener;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.ConnectionRenderingFigure;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.IConnectionRenderingViewer;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.CenterLayout;
+import org.eclipse.xsd.XSDConcreteComponent;
+
+
+/**
+ * @author ernest
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public abstract class BaseGraphicalViewer extends ScrollingGraphicalViewer implements IConnectionRenderingViewer
+{
+  protected FigureCanvasKeyboardHandler figureCanvasKeyboardHandler;
+
+  protected EditDomain editDomain;
+
+  protected boolean isInputEnabled = true;
+
+  protected boolean isSelectionEnabled = true;
+
+  protected ISelectionProvider menuSelectionProvider;
+
+  protected GraphContextMenuProvider menuProvider;
+
+  protected XSDEditor editor;
+
+  protected XSDConcreteComponent input;
+
+  protected ConnectionRenderingFigure connectionRenderingFigure;
+
+  public BaseGraphicalViewer(XSDEditor editor, ISelectionProvider selectionProvider)
+  {
+    super();
+    this.editor = editor;
+    menuSelectionProvider = selectionProvider;
+  }
+  
+  public ConnectionRenderingFigure getConnectionRenderingFigure()
+  {
+    return connectionRenderingFigure;
+  }
+
+  public void setInputEnabled(boolean enabled)
+  {
+    isInputEnabled = enabled;
+  }
+
+  public void setSelectionEnabled(boolean enabled)
+  {
+    isSelectionEnabled = enabled;
+  }
+
+  public XSDMenuListener getMenuListener()
+  {
+    return menuProvider.getMenuListener();
+  }
+
+  protected static Color white = null;
+  protected void hookControl()
+  {                     
+    super.hookControl();
+  
+    if (white == null)
+    {
+      white = new Color(getControl().getDisplay(), 255, 255, 255);
+    }
+    getControl().setBackground(white); 
+  
+    editDomain = new DefaultEditDomain(null);
+    ((DefaultEditDomain)editDomain).setDefaultTool(new SelectionTool());
+    editDomain.loadDefaultTool();
+    editDomain.addViewer(this);
+  
+    //jvh - gef port - moved this from below so it is available when adding context menu below
+    menuProvider = new GraphContextMenuProvider(this, menuSelectionProvider, editor.getXSDTextEditor());
+    setContextMenu(menuProvider);
+  
+    // add context menu to the graph
+    MenuManager manager = new MenuManager();
+    manager.addMenuListener(getMenuListener());  //jvh - gef port
+    manager.setRemoveAllWhenShown(true);
+    Menu menu = manager.createContextMenu(getControl());
+    getControl().setMenu(menu);
+    
+    KeyAdapter keyListener = new KeyAdapter()
+    {
+      /**
+       * @see org.eclipse.swt.events.KeyAdapter#keyReleased(KeyEvent)
+       */
+      public void keyReleased(KeyEvent e)
+      {
+        if (e.character == SWT.DEL)
+        {
+          getMenuListener().getDeleteAction().run();
+        }
+      }
+    };
+  
+    setKeyHandler(new XSDGraphicalViewerKeyHandler(this).setParent(new KeyHandler()));
+    
+//    getControl().addKeyListener(keyListener);
+
+    figureCanvasKeyboardHandler = new FigureCanvasKeyboardHandler();
+    getFigureCanvas().addKeyListener(figureCanvasKeyboardHandler);
+    
+  	getRootEditPart().activate();		
+                       
+  	ScalableRootEditPart graphicalRootEditPart = (ScalableRootEditPart)getRootEditPart();
+     
+    // set the layout for the primary layer so that the children are always centered
+    //
+    graphicalRootEditPart.getLayer(LayerConstants.PRIMARY_LAYER).setLayoutManager(new CenterLayout());
+  
+    // add the ConnectionRenderingFigure which is responsible for drawing all of the lines in the view
+    //                       
+    IFigure figure = graphicalRootEditPart.getLayer(LayerConstants.HANDLE_LAYER);
+    figure.setLayoutManager(new StackLayout());          
+    connectionRenderingFigure = new ConnectionRenderingFigure(graphicalRootEditPart.getLayer(LayerConstants.PRIMARY_LAYER));      
+    figure.add(connectionRenderingFigure);
+  
+    figure.validate();      
+  }
+
+  public XSDConcreteComponent getInput()
+  {
+    return input;
+  }
+
+  protected EditPart getEditPart(EditPart parent, Object object)
+  {
+    EditPart result = null;
+    for (Iterator i = parent.getChildren().iterator(); i.hasNext(); )
+    {
+      EditPart editPart = (EditPart)i.next();
+      if (editPart.getModel() == object)
+      {  
+        result = editPart;
+        break;
+      }
+    }             
+  
+    if (result == null)
+    { 
+      for (Iterator i = parent.getChildren().iterator(); i.hasNext(); )
+      {
+        EditPart editPart = getEditPart((EditPart)i.next(), object);
+        if (editPart != null)
+        {
+          result = editPart;
+          break;
+        }
+      }            
+    }
+  
+    return result;
+  }
+  
+  public abstract void setInput(XSDConcreteComponent comp);
+  
+  public abstract void setSelection(XSDConcreteComponent comp);
+  
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/FigureCanvasKeyboardHandler.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/FigureCanvasKeyboardHandler.java
new file mode 100644
index 0000000..158648d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/FigureCanvasKeyboardHandler.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.RangeModel;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Widget;
+
+public class FigureCanvasKeyboardHandler extends KeyAdapter
+{
+  public static final int H_SCROLL_INCREMENT = 5;
+  public static final int V_SCROLL_INCREMENT = 30;
+
+  /**
+   * Constructor for FigureCanvasKeyboardHandler.
+   */
+  public FigureCanvasKeyboardHandler()
+  {
+    super();
+  }
+
+  public void keyPressed(KeyEvent e)
+  {
+    Widget w = e.widget;
+    if (w instanceof FigureCanvas)
+    {
+      processKey(e.keyCode, (FigureCanvas)w);
+    }
+  }
+
+  private void processKey(int keyCode, FigureCanvas figureCanvas)
+  {
+    switch (keyCode)
+    {
+      case SWT.ARROW_DOWN :
+        scrollVertical(figureCanvas, false);
+        break;
+      case SWT.ARROW_UP :
+        scrollVertical(figureCanvas, true);
+        break;
+      case SWT.ARROW_LEFT :
+        scrollHorizontal(figureCanvas, true);
+        break;
+      case SWT.ARROW_RIGHT :
+        scrollHorizontal(figureCanvas, false);
+        break;
+      case SWT.PAGE_UP :
+        scrollPage(figureCanvas, true);
+        break;
+      case SWT.PAGE_DOWN :
+        scrollPage(figureCanvas, false);
+        break;
+    }
+  }
+
+  private int verifyScrollBarOffset(RangeModel model, int value)
+  {
+    value = Math.max(model.getMinimum(), value);
+    return Math.min(model.getMaximum() - model.getExtent(), value);
+  }
+
+  private void scrollVertical(FigureCanvas figureCanvas, boolean up)
+  {
+    Point location = figureCanvas.getViewport().getViewLocation();
+    int vOffset = up ? -V_SCROLL_INCREMENT : V_SCROLL_INCREMENT;
+    int x = verifyScrollBarOffset(figureCanvas.getViewport().getHorizontalRangeModel(), location.x);
+    int y = verifyScrollBarOffset(figureCanvas.getViewport().getVerticalRangeModel(), location.y + vOffset);
+    figureCanvas.scrollSmoothTo(x, y);
+  }
+
+  private void scrollHorizontal(FigureCanvas figureCanvas, boolean left)
+  {
+    Point location = figureCanvas.getViewport().getViewLocation();
+    int hOffset = left ? -H_SCROLL_INCREMENT : H_SCROLL_INCREMENT;
+    int x = verifyScrollBarOffset(figureCanvas.getViewport().getHorizontalRangeModel(), location.x + hOffset);
+    int y = verifyScrollBarOffset(figureCanvas.getViewport().getVerticalRangeModel(), location.y);
+    figureCanvas.scrollSmoothTo(x, y);
+  }
+
+  private void scrollPage(FigureCanvas figureCanvas, boolean up)
+  {
+    Rectangle clientArea = figureCanvas.getClientArea();
+    int increment = up ? -clientArea.height : clientArea.height;
+    Point location = figureCanvas.getViewport().getViewLocation();
+    int x = verifyScrollBarOffset(figureCanvas.getViewport().getHorizontalRangeModel(), location.x);
+    int y = verifyScrollBarOffset(figureCanvas.getViewport().getVerticalRangeModel(), location.y + increment);
+    figureCanvas.scrollSmoothTo(x, y);
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphContextMenuProvider.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphContextMenuProvider.java
new file mode 100644
index 0000000..cc092cf
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphContextMenuProvider.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+
+import org.eclipse.gef.ContextMenuProvider;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.wst.xsd.ui.internal.XSDMenuListener;
+import org.eclipse.wst.xsd.ui.internal.XSDTextEditor;
+
+
+public class GraphContextMenuProvider extends ContextMenuProvider
+{
+
+  XSDMenuListener xsdMenuListener;
+  
+  /**
+   * Constructor for GraphContextMenuProvider.
+   * @param selectionProvider
+   * @param editor
+   */
+  public GraphContextMenuProvider(
+    EditPartViewer viewer,
+    ISelectionProvider selectionProvider,
+    XSDTextEditor editor)
+  {
+    super(viewer);
+    this.viewer = viewer;
+    xsdMenuListener = new XSDMenuListener(selectionProvider);
+  }
+
+  public XSDMenuListener getMenuListener()
+  {
+      return xsdMenuListener;
+  }
+
+  
+  /**
+   * @see org.eclipse.gef.ui.parts.ContextMenuProvider#buildContextMenu(org.eclipse.jface.action.IMenuManager, org.eclipse.gef.EditPartViewer)
+   */
+  public void buildContextMenu(IMenuManager arg0)
+  {
+    xsdMenuListener.menuAboutToShow(arg0);
+  }
+  
+  protected EditPartViewer viewer;
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphicsConstants.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphicsConstants.java
new file mode 100644
index 0000000..691996d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/GraphicsConstants.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * A collection of color-related constants.
+ */
+public interface GraphicsConstants 
+{                          
+  public final static Display display = Display.getDefault();
+  public final static Color categoryBorderColor     = new Color(null, 118, 134, 164);
+  public final static Color elementBorderColor      = new Color(null, 138, 154, 184);
+  public final static Color elementBackgroundColor  = new Color(null, 236, 242, 252);  
+  public final static Color elementLabelColor       = new Color(null,  80,  96, 144);
+  public final static Color readOnlyBorderColor     = new Color(null, 164, 164, 164); 
+
+  public final static Color readOnlyBackgroundColor = ColorConstants.white;
+
+  public final static Font  smallFont               = new Font(Display.getCurrent(), "Small Fonts", 6, SWT.NONE); 
+  public final static Font  medium                  = new Font(Display.getCurrent(), "Tahoma", 8, SWT.NONE); 
+  public final static Font  mediumBoldFont          = new Font(Display.getCurrent(), "Tahoma", 8, SWT.BOLD); 
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/LinkedGraphViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/LinkedGraphViewer.java
new file mode 100644
index 0000000..09645a1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/LinkedGraphViewer.java
@@ -0,0 +1,163 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.gef.EditPart;
+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.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.w3c.dom.Element;
+
+
+
+public class LinkedGraphViewer
+{
+  
+  protected ISelectionProvider menuSelectionProvider;
+  protected XSDEditor editor;
+  protected BaseGraphicalViewer majorViewer, minorViewer;
+  
+  /**
+   * 
+   */
+  public LinkedGraphViewer(XSDEditor editor, ISelectionProvider selectionProvider)
+  {
+    menuSelectionProvider = selectionProvider;
+    this.editor = editor;
+  }
+
+  public void setMajorViewer(BaseGraphicalViewer majorViewer)
+  {
+    this.majorViewer = majorViewer;
+  }
+
+  public void setMinorViewer(BaseGraphicalViewer minorViewer)
+  {
+    this.minorViewer = minorViewer;
+  }
+  
+  protected Composite control;
+  protected SashForm sashForm;
+  
+  public Control createControl(Composite parent)
+  {
+    //control = new Composite(parent, SWT.DEFAULT);
+   
+    control = sashForm = new SashForm(parent, SWT.VERTICAL | SWT.BORDER);
+    sashForm.setLayoutData(ViewUtility.createFill());
+    
+    majorViewer.createControl(sashForm);
+    minorViewer.createControl(sashForm);
+//    control.setLayout(new GridLayout());
+//    control.setLayoutData(ViewUtility.createFill());
+    return control;
+  }
+  
+  public void addSelectionChangedListener(ISelectionChangedListener selectionListener)
+  {
+    if (majorViewer != null)
+    {
+      majorViewer.addSelectionChangedListener(selectionListener);
+      majorViewer.addSelectionChangedListener(majorViewerListener);
+    }
+    if (minorViewer != null)
+    {
+      minorViewer.addSelectionChangedListener(selectionListener);
+    }
+  }
+  
+  /**
+   * @return Composite
+   */
+  public Composite getControl()
+  {
+    return control;
+  }
+
+  /**
+   * 
+   */
+  protected XSDConcreteComponent getInput()
+  {
+    return majorViewer.getInput();
+  }
+
+  /**
+   * @param schema
+   */
+  protected void setInput(XSDConcreteComponent input)
+  {
+    majorViewer.setInput(input);
+    minorViewer.setInput(input);
+  }
+
+  /**
+   * @param component
+   */
+  public void setSelection(XSDConcreteComponent component)
+  {
+    majorViewer.setSelection(component);
+  }
+
+  protected MajorViewerSelectionChangedListener majorViewerListener = new MajorViewerSelectionChangedListener();
+  
+  private class MajorViewerSelectionChangedListener implements ISelectionChangedListener
+  {
+    /* (non-Javadoc)
+     * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+     */
+    public void selectionChanged(SelectionChangedEvent event)
+    {
+      ISelection editPartSelection = event.getSelection();
+      List nodeList = new ArrayList();
+      if (editPartSelection instanceof IStructuredSelection)
+      {
+        for (Iterator i = ((IStructuredSelection)editPartSelection).iterator(); i.hasNext(); )
+        {
+          EditPart editPart = (EditPart)i.next();
+          if (editPart != null)
+          {
+            Object model = editPart.getModel();
+            if (model instanceof XSDConcreteComponent)
+            {
+              Element element = ((XSDConcreteComponent)model).getElement();
+
+              // this test ensures that we don't attempt to select an element for an external schema
+              //
+              if (element instanceof XMLNode)
+              {
+                // now update the minor viewer based on the selected component in the major viewer
+                minorViewer.setInput((XSDConcreteComponent)model);
+                minorViewer.setSelection((XSDConcreteComponent)model);
+              }
+            }
+          }
+        }
+      }                
+    }
+
+  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/PrintGraphAction.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/PrintGraphAction.java
new file mode 100644
index 0000000..53df913
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/PrintGraphAction.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+             
+import org.eclipse.jface.action.Action;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.ImageData;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.printing.PrintDialog;
+import org.eclipse.swt.printing.Printer;
+import org.eclipse.swt.printing.PrinterData;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+
+
+public class PrintGraphAction extends Action
+{ 
+  protected XSDComponentViewer componentViewer;
+
+  public PrintGraphAction(XSDComponentViewer componentViewer)
+  {
+    super("Print");
+    this.componentViewer = componentViewer;
+  } 
+
+  public void run()
+  {
+    try
+    {
+      PrintDialog dialog = new PrintDialog(Display.getCurrent().getActiveShell());
+      PrinterData data = dialog.open();
+      Printer printer = new Printer(data);
+                                                   
+      Control control = componentViewer.getControl();
+      Display display = Display.getCurrent();
+      Image graphImage = new Image(display, control.getSize().x, control.getSize().y);
+      GC graphGC = new GC(control);
+      graphGC.copyArea(graphImage, 0, 0);
+        
+      ImageData graphImageData = graphImage.getImageData();
+      graphImageData.transparentPixel = -1;
+        
+      Point screenDPI = display.getDPI();
+      Point printerDPI = printer.getDPI();
+      int scaleFactor = printerDPI.x / screenDPI.x;
+      Rectangle trim = printer.computeTrim(0, 0, 0, 0);
+      if (printer.startJob("Print XML Schema Graph")) 
+      {
+        GC gc = new GC(printer);
+        if (printer.startPage()) 
+        {
+          gc.drawImage(
+            graphImage,
+            0,
+            0,
+            graphImageData.width,
+            graphImageData.height,
+            -trim.x,
+            -trim.y,
+            scaleFactor * graphImageData.width,
+            scaleFactor * graphImageData.height);
+          printer.endPage();
+        }
+        printer.endJob();
+      }
+      printer.dispose();
+      graphGC.dispose();
+    }    
+    catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDChildUtility.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDChildUtility.java
new file mode 100644
index 0000000..887889c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDChildUtility.java
@@ -0,0 +1,285 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.XSDWildcard;
+import org.eclipse.xsd.util.XSDSwitch;
+              
+
+public class XSDChildUtility
+{              
+  static public List getModelChildren(Object model)
+  {                     
+    XSDChildVisitor visitor = new XSDChildVisitor(model);
+    visitor.visitXSDObject(model); 
+    return visitor.list;
+  }    
+   
+  static public List getImmediateDerivedTypes(XSDComplexTypeDefinition complexType)
+  {
+    ArrayList typesDerivedFrom = new ArrayList();
+
+    // A handy convenience method quickly gets all 
+    // typeDefinitions within our schema; note that 
+    // whether or not this returns types in included, 
+    // imported, or redefined schemas is subject to change
+    List typedefs = complexType.getSchema().getTypeDefinitions();
+
+    for (Iterator iter = typedefs.iterator(); iter.hasNext(); )
+    {
+      XSDTypeDefinition typedef = (XSDTypeDefinition)iter.next();
+      // Walk the baseTypes from this typedef seeing if any 
+      // of them match the requested one
+      if (complexType.equals(typedef.getBaseType()))
+      {
+        // We found it, return the original one and continue
+        typesDerivedFrom.add(typedef);
+      }
+    }
+    return typesDerivedFrom;
+  }
+  // TODO... use the XSDVisitor defined in xsdeditor.util instead
+  //          
+  public static class XSDChildVisitor extends XSDVisitor
+  {
+    Object root;
+    List list = new ArrayList();
+
+    public XSDChildVisitor(Object root)
+    {
+      this.root = root;
+    }                  
+
+    public void visitXSDModelGroup(XSDModelGroup xsdModelGroup)
+    {
+      if (xsdModelGroup != root)
+      {
+        list.add(xsdModelGroup);
+      }                         
+      else
+      {
+        super.visitXSDModelGroup(xsdModelGroup);
+      }
+    }
+
+    public void visitXSDModelGroupDefinition(XSDModelGroupDefinition xsdModelGroupDefinition)
+    {
+      if (xsdModelGroupDefinition != root)
+      {
+        list.add(xsdModelGroupDefinition);
+      }                         
+      else
+      {
+        super.visitXSDModelGroupDefinition(xsdModelGroupDefinition);
+      }
+    }
+
+    public void visitXSDElementDeclaration(XSDElementDeclaration xsdElementDeclaration)
+    {
+      if (xsdElementDeclaration != root)
+      {
+        list.add(xsdElementDeclaration);
+      }                         
+      else
+      {
+        super.visitXSDElementDeclaration(xsdElementDeclaration);
+      }
+    }
+
+    public void visitXSDComplexTypeDefinition(XSDComplexTypeDefinition xsdComplexTypeDefinition)
+    {
+      if (xsdComplexTypeDefinition != root)
+      {                                    
+        if (xsdComplexTypeDefinition.getName() != null || getModelChildren(xsdComplexTypeDefinition).size() > 0)
+        {
+          list.add(xsdComplexTypeDefinition);
+        }
+      }                         
+      else
+      {
+        super.visitXSDComplexTypeDefinition(xsdComplexTypeDefinition);
+      }
+    }    
+
+    public void visitXSDWildcard(XSDWildcard xsdWildCard)
+    {
+      if (xsdWildCard != root)
+      {                                    
+        list.add(xsdWildCard);        
+      }                         
+      else
+      {
+        super.visitXSDWildcard(xsdWildCard);
+      }
+    }
+  }
+               
+
+  public static class XSDVisitor
+  { 
+    int indent = 0;
+                 
+    public void visitXSDObject(Object object)
+    {           
+      if (object == null)
+        return;
+
+      XSDSwitch theSwitch = new XSDSwitch()
+      {   
+        public Object caseXSDComplexTypeDefinition(XSDComplexTypeDefinition object)
+        {
+          visitXSDComplexTypeDefinition(object);
+          return null;
+        } 
+
+        public Object caseXSDAttributeUse(XSDAttributeUse object)
+        {
+          visitXSDAttributeUse(object);
+          return null;
+        }
+
+        public Object caseXSDElementDeclaration(XSDElementDeclaration object)
+        {
+          visitXSDElementDeclaration(object);
+          return null;
+        }
+
+        public Object caseXSDModelGroupDefinition(XSDModelGroupDefinition object)
+        {
+          visitXSDModelGroupDefinition(object);
+          return super.caseXSDModelGroupDefinition(object);
+        }
+
+        public Object caseXSDModelGroup(XSDModelGroup object)
+        {
+          visitXSDModelGroup(object);
+          return super.caseXSDModelGroup(object);
+        }
+
+        public Object caseXSDParticle(XSDParticle object)
+        { 
+          visitXSDParticle(object);
+          return null;
+        } 
+
+        public Object caseXSDSchema(XSDSchema object)
+        { 
+          visitXSDSchema(object);
+          return null;
+        } 
+
+        public Object caseXSDWildcard(XSDWildcard object)
+        { 
+          visitXSDWildcard(object);
+          return null;
+        } 
+      };
+      theSwitch.doSwitch((EObject)object);
+    }
+         
+    public void visitXSDAttributeUse(XSDAttributeUse xsdAttributeUse)
+    {  
+//      printIndented("@" + xsdAttributeUse.getAttributeDeclaration().getName());
+    }
+
+    public void visitXSDSchema(XSDSchema xsdSchema)
+    {         
+//      printIndented("XSDSchema");
+      indent += 2;
+      for (Iterator iterator = xsdSchema.getElementDeclarations().iterator(); iterator.hasNext(); )
+      {
+        visitXSDObject(iterator.next());
+      }
+      indent -= 2;
+    }
+
+    public void visitXSDElementDeclaration(XSDElementDeclaration xsdElementDeclaration)
+    {      
+//      printIndented(xsdElementDeclaration.getName());
+      indent += 2;         
+      XSDTypeDefinition td = xsdElementDeclaration.getTypeDefinition();
+      if (td == null)
+      {
+        td = xsdElementDeclaration.getAnonymousTypeDefinition();
+      }                       
+      visitXSDObject(td);
+      indent -= 2;
+    }
+   
+    public void visitXSDComplexTypeDefinition(XSDComplexTypeDefinition xsdComplexTypeDefinition)
+    {
+//      printIndented("XSDComplexTypeDefinition : " + xsdComplexTypeDefinition.getContent());
+      indent += 2;
+      for (Iterator i = xsdComplexTypeDefinition.getAttributeUses().iterator(); i.hasNext(); )
+      {        
+        visitXSDObject((XSDAttributeUse)i.next());
+      }
+      visitXSDObject(xsdComplexTypeDefinition.getContent());
+      indent -= 2;
+    }
+
+    public void visitXSDModelGroup(XSDModelGroup xsdModelGroup)
+    {
+//      printIndented("XSDModelGroup");
+      indent += 2;
+      for (Iterator iterator = xsdModelGroup.getContents().iterator(); iterator.hasNext(); )
+      {
+        visitXSDObject(iterator.next());
+      } 
+      indent -= 2;
+    }     
+
+    public void visitXSDModelGroupDefinition(XSDModelGroupDefinition xsdModelGroupDefinition)
+    {
+//      printIndented("XSDModelGroupDefinition");
+      indent += 2;
+      visitXSDObject(xsdModelGroupDefinition.getResolvedModelGroupDefinition().getModelGroup());
+      indent -= 2;
+    }
+
+    public void visitXSDParticle(XSDParticle xsdParticle)
+    {
+//      printIndented("XSDParticle");
+      indent += 2;                 
+      if (xsdParticle.getContent() != null)
+        visitXSDObject(xsdParticle.getContent());
+      indent -= 2;
+    } 
+
+    public void visitXSDWildcard(XSDWildcard object)
+    { 
+//      printIndented("XSDWildcard");
+    }
+
+    public void printIndented(String string)
+    { 
+      //String spaces = "";
+      //for (int i = 0; i < indent; i++)
+      //{
+      //  spaces += " ";
+      //}               
+      //System.out.println(spaces + string);      
+    }
+  } 
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDComponentViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDComponentViewer.java
new file mode 100644
index 0000000..c5aa0b2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDComponentViewer.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+             
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.ComponentViewerRootEditPart;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDSchema;
+
+
+public class XSDComponentViewer extends BaseGraphicalViewer
+{               
+  protected ComponentViewerRootEditPart componentViewerRootEditPart;
+  public XSDComponentViewer(XSDEditor editor, ISelectionProvider menuSelectionProvider)
+  {
+    super(editor, menuSelectionProvider);       
+  }        
+
+  public void setInput(XSDConcreteComponent component)
+  {               
+    if (isInputEnabled)
+    {
+      input = null;         
+
+      if (component instanceof XSDElementDeclaration || 
+          component instanceof XSDSchema ||
+          component instanceof XSDModelGroup ||   
+          component instanceof XSDModelGroupDefinition ||
+          component instanceof XSDComplexTypeDefinition)
+      {            
+        input = component;
+      }
+      
+      componentViewerRootEditPart.setInput(input);
+      if (!(input instanceof XSDSchema))
+      {
+        editor.getGraphViewer().backButton.setEnabled(true);
+      }
+    }
+  }     
+
+  public void setSelection(XSDConcreteComponent component)
+  {                    
+    if (isSelectionEnabled)
+    {                      
+      //System.out.println("XSDComponentViewer.setSelection(" + component + ")");
+      List editPartList = new ArrayList();    
+      StructuredSelection selection = new StructuredSelection();
+      if (component instanceof XSDElementDeclaration || 
+          component instanceof XSDSchema ||
+          component instanceof XSDModelGroup ||        
+          component instanceof XSDModelGroupDefinition ||
+          component instanceof XSDComplexTypeDefinition)
+      {                     
+        if (component != null)
+        {
+          EditPart editPart = getEditPart(componentViewerRootEditPart, component);    
+          if (editPart != null)
+          { 
+            // TODO ... take a look at this to figure our why a newly added component
+            // seems to have the wrong bounds at this point... is this a layout issue?           
+            // As a temp hack I'm ignoring the selection of component with bounds (x, y) == (0, 0)
+            // Perhaps a delayed selection is required?
+            Rectangle bounds = ((GraphicalEditPart)editPart).getFigure().getBounds();
+            if (bounds.x > 0 || bounds.y > 0)
+            {
+              editPartList.add(editPart); 
+            }
+          } 
+        }    
+      }              
+      setSelection(new StructuredSelection(editPartList));
+    }
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#hookControl()
+   */
+  protected void hookControl()
+  {
+    super.hookControl();
+    componentViewerRootEditPart = new ComponentViewerRootEditPart();
+    setContents(componentViewerRootEditPart);
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphUtil.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphUtil.java
new file mode 100644
index 0000000..a19f20b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphUtil.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.w3c.dom.Element;
+              
+
+public class XSDGraphUtil
+{                        
+  public static boolean isEditable(Object model)
+  {                    
+    boolean result = false;
+    if (model instanceof XSDConcreteComponent)
+    {
+      Element element = ((XSDConcreteComponent)model).getElement();
+      // this test ensures that we don't attempt to select an element for an external schema
+      //
+      if (element instanceof XMLNode)
+      {
+         result = true;
+      }
+    }                      
+    return result;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphViewer.java
new file mode 100644
index 0000000..cec0d4f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphViewer.java
@@ -0,0 +1,574 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.jface.action.Action;
+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.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.custom.ViewForm;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.part.PageBook;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.XSDSelectionManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.CategoryEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.TopLevelComponentEditPart;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDNotationDeclaration;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+public class XSDGraphViewer implements ISelectionChangedListener
+{
+  protected PageBook pageBook;
+  protected Control componentViewerControl;
+  protected Control inheritanceViewerControl;
+  protected Control subGroupsViewerControl;
+  protected XSDComponentViewer componentViewer;
+  protected XSDInheritanceViewer inheritanceViewer;
+  protected XSDSubstitutionGroupsViewer subGroupsViewer;
+  protected XSDSelectionManager xsdSelectionManager;
+  protected XSDSchema schema;
+  protected InternalSelectionProvider internalSelectionProvider = new InternalSelectionProvider();
+  protected XSDEditor editor;
+  protected PrintGraphAction printGraphAction;
+  protected SashForm sashForm;
+  protected ToolItem backButton;
+
+  public XSDGraphViewer(XSDEditor editor)
+  {
+    super();
+    this.editor = editor;
+  }
+
+  public void setSchema(XSDSchema schema)
+  {
+    this.schema = schema;
+  }
+  ToolBar graphToolBar; // the toolbar at the top of the graph view
+  ToolItem toolItem; // the view tool item
+  ViewForm form; // view form for holding all the views
+  Composite frameBar; // The composite that contains the toolbar
+  Composite c; // temporary blank page. Clean this up when all views completed
+  LinkedGraphViewer linkInheritanceViewer;
+
+  protected void createInheritanceViewer(Composite parent)
+  {
+    linkInheritanceViewer = new LinkedGraphViewer(editor, internalSelectionProvider);
+    BaseGraphicalViewer graphViewer = new XSDInheritanceViewer(editor, internalSelectionProvider);
+    linkInheritanceViewer.setMajorViewer(graphViewer);
+    graphViewer = new XSDComponentViewer(editor, editor.getSelectionManager());
+    linkInheritanceViewer.setMinorViewer(graphViewer);
+    linkInheritanceViewer.createControl(parent);
+  }
+  LinkedGraphViewer linkSubstitutionGroupViewer;
+
+  protected void createSubstitutionGroupViewer(Composite parent)
+  {
+    linkSubstitutionGroupViewer = new LinkedGraphViewer(editor, internalSelectionProvider);
+    BaseGraphicalViewer graphViewer = new XSDSubstitutionGroupsViewer(editor, internalSelectionProvider);
+    linkSubstitutionGroupViewer.setMajorViewer(graphViewer);
+    graphViewer = new XSDComponentViewer(editor, internalSelectionProvider);
+    linkSubstitutionGroupViewer.setMinorViewer(graphViewer);
+    linkSubstitutionGroupViewer.createControl(parent);
+  }
+  static private Color dividerColor;
+
+  public Control createControl(Composite parent)
+  {
+    pageBook = new PageBook(parent, 0);
+    
+    //componentViewer = new XSDComponentViewer(editor, internalSelectionProvider);
+    componentViewer = new XSDComponentViewer(editor, editor.getSelectionManager());
+    ViewUtility util = new ViewUtility();
+    final Composite client;
+    String designLayoutPosition = XSDEditorPlugin.getPlugin().getDesignLayoutPosition();
+    form = new ViewForm(pageBook, SWT.NONE);
+    frameBar = new Composite(form, SWT.NONE);
+    org.eclipse.swt.layout.GridLayout frameLayout = new org.eclipse.swt.layout.GridLayout();
+    frameLayout.marginWidth = 0;
+    frameLayout.marginHeight = 0;
+    frameBar.setLayout(frameLayout);
+    graphToolBar = new ToolBar(frameBar, SWT.FLAT);
+    graphToolBar.addTraverseListener(new TraverseListener()
+    {
+      public void keyTraversed(TraverseEvent e)
+      {
+        if (e.detail == SWT.TRAVERSE_MNEMONIC)
+          e.doit = false;
+      }
+    });
+    backButton = new ToolItem(graphToolBar, SWT.PUSH);
+    backButton.setImage(XSDEditorPlugin.getXSDImage("icons/back.gif")); //$NON-NLS-1$
+    backButton.setToolTipText(XSDEditorPlugin.getXSDString("_UI_HOVER_BACK_TO_SCHEMA_VIEW")); //$NON-NLS-1$
+    backButton.setEnabled(false);
+    backButton.addSelectionListener(new SelectionAdapter()
+    {
+      public void widgetSelected(SelectionEvent e)
+      {
+        editor.getGraphViewer().setInput(editor.getXSDSchema());
+        // internalSelectionProvider.setSelection(new StructuredSelection(editor.getXSDSchema()));
+        editor.getSelectionManager().setSelection(new StructuredSelection(editor.getXSDSchema()));
+      }
+    });
+    // TEMPORARILY REMOVE DIFFERENT VIEWS
+    //    toolItem = new ToolItem(graphToolBar, SWT.DROP_DOWN);
+    //
+    //    // set default to containment
+    //// toolItem.setText(XSDEditorPlugin.getXSDString("_UI_CONTAINMENT"));
+    //    toolItem.addSelectionListener(new SelectionAdapter()
+    //    {
+    //      public void widgetSelected(SelectionEvent e)
+    //      {
+    //        Menu menu = new Menu(graphToolBar);
+    //        if (menu != null)
+    //        {
+    //          if (!showGraphMenu(menu))
+    //          {
+    //            frameBar.setVisible(false);
+    //            return;
+    //          }
+    //          Rectangle b = toolItem.getBounds();
+    //          org.eclipse.swt.graphics.Point p = toolItem.getParent().toDisplay(new
+    // org.eclipse.swt.graphics.Point(b.x, b.y + b.height));
+    //          menu.setLocation(p.x, p.y);
+    //          menu.setVisible(true);
+    //        }
+    //      }
+    //    });
+    form.setTopLeft(frameBar);
+    //    createInheritanceViewer(form);
+    //    createSubstitutionGroupViewer(form);
+    componentViewerControl = componentViewer.createControl(form);
+    //inheritanceViewerControl = inheritanceViewer.createControl(form);
+    //subGroupsViewerControl = subGroupsViewer.createControl(form);
+    c = ViewUtility.createComposite(form, 1);
+    form.setContent(componentViewerControl);
+    // componentViewerControl.setData("layout ratio", new Float(0.65));
+    form.setData("layout ratio", new Float(0.65));
+    if (dividerColor == null)
+    {
+      dividerColor = new Color(componentViewerControl.getDisplay(), 143, 141, 138);
+    }
+    //KCPort
+    //    client.addPaintListener(new PaintListener()
+    //    {
+    //      /**
+    //       * @see org.eclipse.swt.events.PaintListener#paintControl(PaintEvent)
+    //       */
+    //      public void paintControl(PaintEvent e)
+    //      {
+    //        Object source = e.getSource();
+    //        if (source instanceof Composite)
+    //        {
+    //          Composite comp = (Composite)source;
+    //          Rectangle boundary = comp.getClientArea();
+    //          e.gc.setForeground(dividerColor);
+    //          e.gc.drawLine(boundary.x, boundary.y, boundary.x + boundary.width,
+    // boundary.y);
+    //          editor.setDesignWeights(sashForm.getWeights(), true);
+    //        }
+    //      }
+    //    });
+    // KCPort
+    //    designView = new DesignViewer(editor);
+    //    final Control design = designView.createControl(client);
+    //    design.setLayoutData(ViewUtility.createFill());
+    //    client.setData("layout ratio", new Float(0.35));
+    //    enableDesignView(editor.isCombinedDesignAndSourceView());
+    //    pageBook.showPage(sashForm);
+    pageBook.showPage(form);
+    componentViewer.addSelectionChangedListener(internalSelectionProvider);
+    //inheritanceViewer.addSelectionChangedListener(this);
+    // Temporarily remove graph tool bar
+    //    linkInheritanceViewer.addSelectionChangedListener(this);
+    //    linkSubstitutionGroupViewer.addSelectionChangedListener(this);
+    printGraphAction = new PrintGraphAction(componentViewer);
+    return pageBook;
+    //    return form;
+  }
+
+  private boolean showGraphMenu(Menu menu)
+  {
+    MenuItem containmentMenuItem = new MenuItem(menu, SWT.RADIO);
+    containmentMenuItem.setText(XSDEditorPlugin.getXSDString("_UI_CONTAINMENT"));
+    containmentMenuItem.addSelectionListener(new SelectionAdapter()
+    {
+      public void widgetSelected(SelectionEvent e)
+      {
+        toolItem.setText(XSDEditorPlugin.getXSDString("_UI_CONTAINMENT"));
+        frameBar.layout(true);
+        graphToolBar.layout(true);
+        form.setContent(componentViewerControl);
+        // retrieve latest input which could have changed...from designView ??
+        // get it directly?
+        // KCPort
+        //        setInput(designView.getInput());
+      }
+    });
+    MenuItem inheritanceMenuItem = new MenuItem(menu, SWT.RADIO);
+    inheritanceMenuItem.setText(XSDEditorPlugin.getXSDString("_UI_INHERITANCE"));
+    inheritanceMenuItem.addSelectionListener(new SelectionAdapter()
+    {
+      public void widgetSelected(SelectionEvent e)
+      {
+        toolItem.setText(XSDEditorPlugin.getXSDString("_UI_INHERITANCE"));
+        frameBar.layout(true);
+        graphToolBar.layout(true);
+        //        form.setContent(inheritanceViewerControl);
+        form.setContent(linkInheritanceViewer.getControl());
+        if (linkInheritanceViewer.getInput() == null)
+        {
+          linkInheritanceViewer.setInput(schema);
+        }
+      }
+    });
+    MenuItem subGroupsMenuItem = new MenuItem(menu, SWT.RADIO);
+    subGroupsMenuItem.setText(XSDEditorPlugin.getXSDString("_UI_SUBSTITUTION_GROUPS"));
+    subGroupsMenuItem.addSelectionListener(new SelectionAdapter()
+    {
+      public void widgetSelected(SelectionEvent e)
+      {
+        toolItem.setText(XSDEditorPlugin.getXSDString("_UI_SUBSTITUTION_GROUPS"));
+        frameBar.layout(true);
+        graphToolBar.layout(true);
+        form.setContent(linkSubstitutionGroupViewer.getControl());
+        // retrieve latest input which could have changed...from designView ??
+        // get it directly?
+        //        setInput(designView.getInput());
+        if (linkSubstitutionGroupViewer.getInput() == null)
+        {
+          linkSubstitutionGroupViewer.setInput(schema);
+        }
+      }
+    });
+    if (toolItem.getText().equals(XSDEditorPlugin.getXSDString("_UI_CONTAINMENT")))
+    {
+      containmentMenuItem.setSelection(true);
+    }
+    else if (toolItem.getText().equals(XSDEditorPlugin.getXSDString("_UI_INHERITANCE")))
+    {
+      inheritanceMenuItem.setSelection(true);
+    }
+    else if (toolItem.getText().equals(XSDEditorPlugin.getXSDString("_UI_SUBSTITUTION_GROUPS")))
+    {
+      subGroupsMenuItem.setSelection(true);
+    }
+    return true;
+  }
+
+  public Action getPrintGraphAction()
+  {
+    return printGraphAction;
+  }
+
+  public void updateDesignLayout(int newLayout)
+  {
+    sashForm.setOrientation(newLayout);
+    sashForm.layout();
+  }
+
+  public SashForm getSashForm()
+  {
+    return sashForm;
+  }
+
+  public void enableDesignView(boolean enable)
+  {
+  }
+
+  public XSDComponentViewer getComponentViewer()
+  {
+    return componentViewer;
+  }
+  
+  public void setBackButtonEnabled(boolean state)
+  {
+    backButton.setEnabled(state);
+  }
+
+  public void setInput(Object object)
+  {
+    if (object instanceof XSDConcreteComponent)
+    {
+      XSDConcreteComponent xsdComp = (XSDConcreteComponent) object;
+      if (xsdComp instanceof XSDSchema)
+      {
+        setBackButtonEnabled(false);
+      }
+      else
+      {
+        setBackButtonEnabled(true);
+      }
+      componentViewer.setInput(xsdComp);
+      componentViewer.setSelection(xsdComp);
+    }   
+  }
+
+  protected boolean isDeleted(XSDConcreteComponent component)
+  {
+    boolean result = false;
+    if (component != null && component.getElement() != null)
+    {
+      result = component.getElement().getParentNode() == null;
+    }
+    return result;
+  }
+
+  public void setSelectionManager(XSDSelectionManager newSelectionManager)
+  {
+    // disconnect from old one
+    if (xsdSelectionManager != null)
+    {
+      xsdSelectionManager.removeSelectionChangedListener(this);
+      internalSelectionProvider.removeSelectionChangedListener(xsdSelectionManager);
+    }
+    xsdSelectionManager = newSelectionManager;
+    // connect to new one
+    if (xsdSelectionManager != null)
+    {
+      xsdSelectionManager.addSelectionChangedListener(this);
+      internalSelectionProvider.addSelectionChangedListener(xsdSelectionManager);
+    }
+  }
+
+  // this method is called by the SelectionManager to notify the graph view
+  // that the editor selection has changed
+  //
+  public void selectionChanged(SelectionChangedEvent event)
+  {
+    // here we check the selection source to ensure that this selection came
+    // from a different view (not from the graph view)
+    if (event.getSource() != getComponentViewer())
+    { 
+      handleSelection(event.getSelection(), true);
+    }
+  }
+
+  protected XSDConcreteComponent getTopLevelComponent(XSDConcreteComponent component)
+  {
+    XSDConcreteComponent prev = component;
+    XSDConcreteComponent container = component;
+    while ( container != null && !(container instanceof XSDSchema))
+    {
+      prev = container;     
+      container = container.getContainer();
+    }
+    return container != null ? prev : null;
+  }
+  
+  // TODO.. we need to clean this method up and add comments to clarify what's going on
+  //
+  protected void handleSelection(ISelection selection, boolean isSelectionRequired)
+  {
+    StructuredSelection s = (StructuredSelection)selection;
+    Object obj = s.getFirstElement();
+    if (obj instanceof XSDConcreteComponent)
+    {
+      XSDConcreteComponent selectedComponent = (XSDConcreteComponent)obj;
+      Object currentInput = getComponentViewer().getInput();
+      
+      // in this case we're looking at a top level view
+      // so if the selection is a 'non-top-level' component we need to do a set input
+      XSDSchema topLevelSchema = null;
+      if (currentInput instanceof XSDSchema)
+      {
+        if (selectedComponent instanceof XSDSchema || 
+            selectedComponent.getContainer() instanceof XSDSchema)
+        {
+          topLevelSchema = (XSDSchema)currentInput;
+        }                 
+      }
+      else if (selectedComponent instanceof XSDSchemaDirective || selectedComponent instanceof XSDSimpleTypeDefinition || selectedComponent instanceof XSDNotationDeclaration)          
+      {
+        topLevelSchema = selectedComponent.getSchema();
+      }
+      
+      if (topLevelSchema != null)
+      {
+        setInput(topLevelSchema);
+        // TODO... this is not 'quite' right
+        // it should be possible to view in
+      }  
+      else
+      { 
+        EditPart editPart = getComponentViewer().getEditPart(getComponentViewer().getRootEditPart(), obj);
+        if (editPart == null)
+        {  
+          XSDConcreteComponent topLevelComponent = getTopLevelComponent(selectedComponent);
+          if (topLevelComponent != null)
+          {
+            setInput(topLevelComponent);  
+          }
+        }  
+      }  
+      
+      // now we handle the selection
+      //
+      if (isSelectionRequired)
+      {  
+        EditPart editPart = getComponentViewer().getRootEditPart();        
+        EditPart newSelectedEditPart = getComponentViewer().getEditPart(editPart, obj);
+        if (newSelectedEditPart != null)
+        {
+          if (newSelectedEditPart instanceof TopLevelComponentEditPart)
+          {
+            TopLevelComponentEditPart topLevel = (TopLevelComponentEditPart) newSelectedEditPart;
+            CategoryEditPart categoryEP = (CategoryEditPart) topLevel.getParent();
+            categoryEP.scrollTo(topLevel);
+            getComponentViewer().reveal(newSelectedEditPart);          
+          }                           
+          getComponentViewer().setSelection(new StructuredSelection(newSelectedEditPart));
+        }
+      }      
+    }   
+  }
+
+  protected Element getElementNode(Node node)
+  {
+    while (!(node instanceof Element))
+    {
+      if (node instanceof Attr)
+      {
+        node = ((Attr) node).getOwnerElement();
+      }
+      else if (node instanceof Text)
+      {
+        Node sibling = node.getNextSibling();
+        if (sibling == null)
+        {
+          break;
+        }
+        node = sibling;
+      }
+      else
+      {
+        Node parent = node.getParentNode();
+        if (parent == null)
+        {
+          break;
+        }
+        node = node.getParentNode();
+      }
+    }
+    return node instanceof Element ? (Element) node : null;
+  }
+
+
+
+  // This class listens to the graph view and converts edit part selection
+  // events
+  // into XSD component selection events that can be 'fired' to the
+  // selectionManager
+  //
+  class InternalSelectionProvider implements ISelectionProvider, ISelectionChangedListener
+  {
+    protected List listenerList = new ArrayList();
+    protected ISelection selection = new StructuredSelection();
+
+    public void addSelectionChangedListener(ISelectionChangedListener listener)
+    {
+      listenerList.add(listener);
+    }
+
+    public void removeSelectionChangedListener(ISelectionChangedListener listener)
+    {
+      listenerList.remove(listener);
+    }
+
+    public ISelection getSelection()
+    {
+      return selection;
+    }
+
+    protected void notifyListeners(SelectionChangedEvent event)
+    {
+      for (Iterator i = listenerList.iterator(); i.hasNext();)
+      {
+        ISelectionChangedListener listener = (ISelectionChangedListener) i.next();
+        listener.selectionChanged(event);
+      }
+    }
+
+    public StructuredSelection convertSelectionFromEditPartToModel(ISelection editPartSelection)
+    {
+      List selectedModelObjectList = new ArrayList();
+      if (editPartSelection instanceof IStructuredSelection)
+      {
+        for (Iterator i = ((IStructuredSelection) editPartSelection).iterator(); i.hasNext();)
+        {
+          Object obj = i.next();
+          Object model = null;
+          if (obj instanceof EditPart)
+          {
+            EditPart editPart = (EditPart) obj;
+            model = editPart.getModel();
+            // Convert category to XSDSchema
+            // if (editPart instanceof CategoryEditPart)
+            // {
+            //   model = ((Category)((CategoryEditPart)editPart).getModel()).getXSDSchema();
+            // }
+          }
+          else if (obj instanceof XSDConcreteComponent)
+          {
+            //cs .. not sure why would we'd ever hit this case?
+            model = obj;
+          }
+          if (model != null)//&& model instanceof XSDConcreteComponent)
+          {
+            selectedModelObjectList.add(model);
+          }
+        }
+      }
+      return new StructuredSelection(selectedModelObjectList);
+    }
+
+    public void setSelection(ISelection selection)
+    {
+      this.selection = selection;
+    }
+
+    // This method gets called when an edit part in the graph view is selected
+    //
+    public void selectionChanged(SelectionChangedEvent event)
+    {
+      ISelection newSelection = convertSelectionFromEditPartToModel(event.getSelection());
+      this.selection = newSelection;
+      SelectionChangedEvent newEvent = new SelectionChangedEvent(getComponentViewer(), newSelection);
+      notifyListeners(newEvent);
+    }
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphicalViewerKeyHandler.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphicalViewerKeyHandler.java
new file mode 100644
index 0000000..b6c8026
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDGraphicalViewerKeyHandler.java
@@ -0,0 +1,352 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+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.gef.ConnectionEditPart;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gef.KeyHandler;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.ExpandableGraphNodeEditPart;
+
+
+public class XSDGraphicalViewerKeyHandler extends KeyHandler
+{
+    public XSDGraphicalViewerKeyHandler(GraphicalViewer viewer)
+    {
+      this.viewer = viewer;
+    }
+    
+    private WeakReference cachedNode;
+    int counter;
+    private GraphicalViewer viewer;
+
+    private boolean acceptConnection(KeyEvent event)
+    {
+      return event.character == '/'
+        || event.character == '?'
+        || event.character == '\\'
+        || event.character == '|';
+    }
+    private boolean acceptIntoContainer(KeyEvent event)
+    {
+      return (((event.stateMask & SWT.ALT) != 0)
+        && (event.keyCode == SWT.ARROW_RIGHT)) || (event.keyCode == SWT.ARROW_RIGHT);
+//      return (event.keyCode == SWT.ARROW_RIGHT);
+    }
+    private boolean acceptLeaveConnection(KeyEvent event)
+    {
+      int key = event.keyCode;
+      if (getFocus() instanceof ConnectionEditPart)
+        if ((key == SWT.ARROW_UP)
+          || (key == SWT.ARROW_RIGHT)
+          || (key == SWT.ARROW_DOWN)
+          || (key == SWT.ARROW_LEFT))
+          return true;
+      return false;
+    }
+    private boolean acceptLeaveContents(KeyEvent event)
+    {
+      int key = event.keyCode;
+      return getFocus() == getViewer().getContents()
+        && ((key == SWT.ARROW_UP)
+          || (key == SWT.ARROW_RIGHT)
+          || (key == SWT.ARROW_DOWN)
+          || (key == SWT.ARROW_LEFT));
+    }
+    private boolean acceptOutOf(KeyEvent event)
+    {
+      return (((event.stateMask & SWT.ALT) != 0) && (event.keyCode == SWT.ARROW_LEFT)) || (event.keyCode == SWT.ARROW_LEFT);
+//      return (event.keyCode == SWT.ARROW_LEFT);
+    }
+    private ConnectionEditPart findConnection(
+      GraphicalEditPart node,
+      ConnectionEditPart current,
+      boolean forward)
+    {
+      List connections = new ArrayList(node.getSourceConnections());
+      connections.addAll(node.getTargetConnections());
+      if (connections.isEmpty())
+        return null;
+      if (forward)
+        counter++;
+      else
+        counter--;
+      while (counter < 0)
+        counter += connections.size();
+      counter %= connections.size();
+      return (ConnectionEditPart) connections.get(counter % connections.size());
+    }
+    /*
+     * pStart is a point in absolute coordinates.
+     */
+    private GraphicalEditPart findSibling(
+      List siblings,
+      Point pStart,
+      int direction,
+      EditPart exclude)
+    {
+      GraphicalEditPart epCurrent;
+      GraphicalEditPart epFinal = null;
+      IFigure figure;
+      Point pCurrent;
+      int distance = Integer.MAX_VALUE;
+      Iterator iter = siblings.iterator();
+      while (iter.hasNext())
+      {
+        epCurrent = (GraphicalEditPart) iter.next();
+        if (epCurrent == exclude)
+          continue;
+        figure = epCurrent.getFigure();
+        pCurrent = getInterestingPoint(figure);
+        figure.translateToAbsolute(pCurrent);
+        if (pStart.getPosition(pCurrent) != direction)
+          continue;
+        int d = pCurrent.getDistanceOrthogonal(pStart);
+        if (d < distance)
+        {
+          distance = d;
+          epFinal = epCurrent;
+        }
+      }
+      return epFinal;
+    }
+    Point getInterestingPoint(IFigure figure)
+    {
+//      return figure.getBounds().getCenter();
+      return figure.getBounds().getTopLeft();
+    }
+    /**
+     * Returns the cached node.  It is possible that the node is not longer in the viewer but has
+     * not been garbage collected yet.
+     */
+    private GraphicalEditPart getCachedNode()
+    {
+      if (cachedNode == null)
+        return null;
+      if (cachedNode.isEnqueued())
+        return null;
+      return (GraphicalEditPart) cachedNode.get();
+    }
+    GraphicalEditPart getFocus()
+    {
+      return (GraphicalEditPart) getViewer().getFocusEditPart();
+    }
+    List getNavigationSiblings()
+    {
+      return getFocus().getParent().getChildren();
+    }
+    protected GraphicalViewer getViewer()
+    {
+      return viewer;
+    }
+    public boolean keyPressed(KeyEvent event)
+    {
+      if (event.character == ' ')
+      {
+        processSelect(event);
+        return true;
+      }
+      else if (acceptIntoContainer(event))
+      {
+        navigateIntoContainer(event);
+        return true;
+      }
+      else if (acceptOutOf(event))
+      {
+        navigateOut(event);
+        return true;
+      }
+      else if (acceptConnection(event))
+      {
+        navigateConnections(event);
+        return true;
+      }
+      else if (acceptLeaveConnection(event))
+      {
+        navigateOutOfConnection(event);
+        return true;
+      }
+      else if (acceptLeaveContents(event))
+      {
+        navigateIntoContainer(event);
+        return true;
+      }
+      switch (event.keyCode)
+      {
+        case SWT.ARROW_LEFT :
+          return navigateNextSibling(event, PositionConstants.WEST);
+        case SWT.ARROW_RIGHT :
+          return navigateNextSibling(event, PositionConstants.EAST);
+        case SWT.ARROW_UP :
+          return navigateNextSibling(event, PositionConstants.NORTH);
+        case SWT.ARROW_DOWN :
+          return navigateNextSibling(event, PositionConstants.SOUTH);
+        case SWT.HOME :
+          return navigateJumpSibling(event, PositionConstants.WEST);
+        case SWT.END :
+          return navigateJumpSibling(event, PositionConstants.EAST);
+        case SWT.PAGE_DOWN :
+          return navigateJumpSibling(event, PositionConstants.SOUTH);
+        case SWT.PAGE_UP :
+          return navigateJumpSibling(event, PositionConstants.NORTH);
+      }
+      return super.keyPressed(event);
+    }
+    private void navigateConnections(KeyEvent event)
+    {
+      GraphicalEditPart focus = getFocus();
+      ConnectionEditPart current = null;
+      GraphicalEditPart node = getCachedNode();
+      if (focus instanceof ConnectionEditPart)
+      {
+        current = (ConnectionEditPart) focus;
+        if (node == null
+          || (node != current.getSource() && node != current.getTarget()))
+        {
+          node = (GraphicalEditPart) current.getSource();
+          counter = 0;
+        }
+      }
+      else
+      {
+        node = focus;
+      }
+      setCachedNode(node);
+      boolean forward = event.character == '/' || event.character == '?';
+      ConnectionEditPart next = findConnection(node, current, forward);
+      navigateTo(next, event);
+    }
+    private void navigateIntoContainer(KeyEvent event)
+    {
+      GraphicalEditPart focus = getFocus();
+      List childList = focus.getChildren();
+
+      if (focus instanceof ExpandableGraphNodeEditPart)
+      {
+        if (!((ExpandableGraphNodeEditPart)focus).isExpanded())
+        {
+          ((ExpandableGraphNodeEditPart)focus).doPerformExpandOrCollapse();
+        }
+      }
+
+      Point tl = focus.getContentPane().getBounds().getTopLeft();
+      int minimum = Integer.MAX_VALUE;
+      int current;
+      GraphicalEditPart closestPart = null;
+      for (int i = 0; i < childList.size(); i++)
+      {
+        GraphicalEditPart ged = (GraphicalEditPart) childList.get(i);
+        Rectangle childBounds = ged.getFigure().getBounds();
+        current = (childBounds.x - tl.x) + (childBounds.y - tl.y);
+        if (current < minimum)
+        {
+          minimum = current;
+          closestPart = ged;
+        }
+      }
+      if (closestPart != null)
+        navigateTo(closestPart, event);
+    }
+    private boolean navigateJumpSibling(KeyEvent event, int direction)
+    {
+      return false;
+    }
+    private boolean navigateNextSibling(KeyEvent event, int direction)
+    {
+      GraphicalEditPart epStart = getFocus();
+      IFigure figure = epStart.getFigure();
+      Point pStart = getInterestingPoint(figure);
+      figure.translateToAbsolute(pStart);
+      EditPart next =
+        findSibling(getNavigationSiblings(), pStart, direction, epStart);
+      if (next == null)
+        return false;
+      navigateTo(next, event);
+      return true;
+    }
+    private void navigateOut(KeyEvent event)
+    {
+      if (getFocus() == null
+        || getFocus() == getViewer().getContents()
+        || getFocus().getParent() == getViewer().getContents())
+        return;
+
+      EditPart parent = getFocus().getParent();
+      if (((event.stateMask & SWT.ALT) != 0) && (event.keyCode == SWT.ARROW_LEFT))
+      {
+        if ((parent != null) && (parent instanceof ExpandableGraphNodeEditPart))
+        {
+          if (((ExpandableGraphNodeEditPart)parent).isExpanded())
+          {
+            ((ExpandableGraphNodeEditPart)parent).doPerformExpandOrCollapse();
+          }
+        }
+      }
+      navigateTo(parent, event);
+//      navigateTo(getFocus().getParent(), event);
+    }
+    private void navigateOutOfConnection(KeyEvent event)
+    {
+      GraphicalEditPart cached = getCachedNode();
+      ConnectionEditPart conn = (ConnectionEditPart) getFocus();
+      if (cached != null
+        && (cached == conn.getSource() || cached == conn.getTarget()))
+        navigateTo(cached, event);
+      else
+        navigateTo(conn.getSource(), event);
+    }
+    void navigateTo(EditPart part, KeyEvent event)
+    {
+      if (part == null)
+        return;
+      if ((event.stateMask & SWT.SHIFT) != 0)
+      {
+        getViewer().appendSelection(part);
+        getViewer().setFocus(part);
+      }
+      else if ((event.stateMask & SWT.CONTROL) != 0)
+        getViewer().setFocus(part);
+      else
+        getViewer().select(part);
+    }
+    private void processSelect(KeyEvent event)
+    {
+      EditPart part = getViewer().getFocusEditPart();
+      if ((event.stateMask & SWT.CONTROL) != 0
+        && part.getSelected() != EditPart.SELECTED_NONE)
+      {
+        getViewer().deselect(part);
+      }
+      else
+      {
+        getViewer().appendSelection(part);
+      }
+      getViewer().setFocus(part);
+    }
+    private void setCachedNode(GraphicalEditPart node)
+    {
+      if (node == null)
+        cachedNode = null;
+      else
+        cachedNode = new WeakReference(node);
+    }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDInheritanceViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDInheritanceViewer.java
new file mode 100644
index 0000000..71a8205
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDInheritanceViewer.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+             
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.SubstitutionGroupViewerRootEditPart;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDSchema;
+
+
+public class XSDInheritanceViewer extends BaseGraphicalViewer
+{               
+  protected SubstitutionGroupViewerRootEditPart inheritanceViewerRootEditPart;
+  public XSDInheritanceViewer(XSDEditor editor, ISelectionProvider menuSelectionProvider)
+  {
+    super(editor, menuSelectionProvider);       
+  }        
+
+  public void setInput(XSDConcreteComponent component)
+  {               
+    if (isInputEnabled)
+    {
+      input = null;         
+
+      if (component instanceof XSDSchema ||
+          component instanceof XSDComplexTypeDefinition)
+      {            
+        input = component;
+      }
+      
+      inheritanceViewerRootEditPart.setInput(input);       
+    }
+  }     
+
+  public void setSelection(XSDConcreteComponent component)
+  {                    
+    if (isSelectionEnabled)
+    {                      
+      //System.out.println("XSDComponentViewer.setSelection(" + component + ")");
+      List editPartList = new ArrayList();    
+      StructuredSelection selection = new StructuredSelection();
+      if (component instanceof XSDElementDeclaration || 
+          component instanceof XSDSchema ||
+          component instanceof XSDModelGroup ||        
+          component instanceof XSDModelGroupDefinition ||
+          component instanceof XSDComplexTypeDefinition)
+      {                     
+        if (component != null)
+        {
+          EditPart editPart = getEditPart(inheritanceViewerRootEditPart, component);    
+          if (editPart != null)
+          { 
+            // TODO ... take a look at this to figure our why a newly added component
+            // seems to have the wrong bounds at this point... is this a layout issue?           
+            // As a temp hack I'm ignoring the selection of component with bounds (x, y) == (0, 0)
+            // Perhaps a delayed selection is required?
+            Rectangle bounds = ((GraphicalEditPart)editPart).getFigure().getBounds();
+            if (bounds.x > 0 || bounds.y > 0)
+            {
+              editPartList.add(editPart); 
+            }
+          } 
+        }    
+      }              
+      setSelection(new StructuredSelection(editPartList));
+    }
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#hookControl()
+   */
+  protected void hookControl()
+  {
+    super.hookControl();
+    inheritanceViewerRootEditPart = new SubstitutionGroupViewerRootEditPart();
+    setContents(inheritanceViewerRootEditPart);
+  }
+
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupChildUtility.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupChildUtility.java
new file mode 100644
index 0000000..9fa84bd
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupChildUtility.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.xsd.XSDElementDeclaration;
+
+/**
+ * @author ernest
+ *
+ * To change this generated comment go to 
+ * Window>Preferences>Java>Code Generation>Code and Comments
+ */
+public class XSDSubstitutionGroupChildUtility
+{
+
+  /**
+   * @param declaration
+   * @return List
+   */
+  public static List getModelChildren(XSDElementDeclaration declaration)
+  {
+    ArrayList children = new ArrayList();
+    List substitutionGroup = declaration.getSubstitutionGroup();
+    for (int i = 0, size = substitutionGroup.size(); i < size; i++)
+    {
+      XSDElementDeclaration element = (XSDElementDeclaration) substitutionGroup.get(i);
+      if (declaration.equals(element.getSubstitutionGroupAffiliation()))
+      {
+        children.add(element);
+      }
+    }
+    return children;
+    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupsViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupsViewer.java
new file mode 100644
index 0000000..5598fdf
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/XSDSubstitutionGroupsViewer.java
@@ -0,0 +1,99 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph;
+             
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.SubstitutionGroupViewerRootEditPart;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDSchema;
+
+
+public class XSDSubstitutionGroupsViewer extends BaseGraphicalViewer
+{               
+  protected SubstitutionGroupViewerRootEditPart subGroupViewerRootEditPart;
+  public XSDSubstitutionGroupsViewer(XSDEditor editor, ISelectionProvider menuSelectionProvider)
+  {
+    super(editor, menuSelectionProvider);       
+  }        
+
+  public void setInput(XSDConcreteComponent component)
+  {               
+    if (isInputEnabled)
+    {
+      input = null;         
+
+      if (component instanceof XSDElementDeclaration || 
+          component instanceof XSDSchema)
+      {            
+        input = component;
+      }
+      
+      subGroupViewerRootEditPart.setInput(input);       
+    }
+  }     
+
+  public void setSelection(XSDConcreteComponent component)
+  {                    
+    if (isSelectionEnabled)
+    {                      
+      //System.out.println("XSDComponentViewer.setSelection(" + component + ")");
+      List editPartList = new ArrayList();    
+      StructuredSelection selection = new StructuredSelection();
+      if (component instanceof XSDElementDeclaration || 
+          component instanceof XSDSchema ||
+          component instanceof XSDModelGroup ||        
+          component instanceof XSDModelGroupDefinition ||
+          component instanceof XSDComplexTypeDefinition)
+      {                     
+        if (component != null)
+        {
+          EditPart editPart = getEditPart(subGroupViewerRootEditPart, component);    
+          if (editPart != null)
+          { 
+            // TODO ... take a look at this to figure our why a newly added component
+            // seems to have the wrong bounds at this point... is this a layout issue?           
+            // As a temp hack I'm ignoring the selection of component with bounds (x, y) == (0, 0)
+            // Perhaps a delayed selection is required?
+            Rectangle bounds = ((GraphicalEditPart)editPart).getFigure().getBounds();
+            if (bounds.x > 0 || bounds.y > 0)
+            {
+              editPartList.add(editPart); 
+            }
+          } 
+        }    
+      }              
+      setSelection(new StructuredSelection(editPartList));
+    }
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#hookControl()
+   */
+  protected void hookControl()
+  {
+    super.hookControl();
+    subGroupViewerRootEditPart = new SubstitutionGroupViewerRootEditPart();
+    setContents(subGroupViewerRootEditPart);
+  }
+
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/BaseEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/BaseEditPart.java
new file mode 100644
index 0000000..f98da1a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/BaseEditPart.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                                 
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.GraphicsConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.model.ModelAdapterListener;
+import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
+
+
+public abstract class BaseEditPart extends AbstractGraphicalEditPart implements ModelAdapterListener, GraphicsConstants, IFeedbackHandler
+{
+	protected boolean isSelected = false;
+	/**
+	 * Activates the <code>EditPart</code> by setting the
+	 * appropriate flags, and activating its children.
+	 * activation signals to the EditPart that is should start observing
+	 * it's model, and that is should support editing at this time.
+	 * An EditPart will have a parent prior to activiation.
+	 * @see #deactivate()
+	 */
+	public void activate() 
+  {
+		super.activate();         
+    XSDModelAdapterFactory.addModelAdapterListener(getModel(), this);  
+	}
+	/** 
+	 * Apart from the deactivation done in super, the source
+	 * and target connections are deactivated, and the visual
+	 * part of the this is removed.
+	 *
+	 * @see #activate() 
+	 */
+	public void deactivate() 
+  {
+    XSDModelAdapterFactory.removeModelAdapterListener(getModel(), this);  
+		super.deactivate();
+	}   
+    
+  protected void createEditPolicies() 
+  {
+  }  
+
+  protected EditPart createChild(Object model) 
+  {
+    return XSDEditPartFactory.getInstance().createEditPart(this, model);
+  } 
+
+  public void propertyChanged(Object object, String property)
+  {                                                                                                  
+    refresh(); 
+  }    
+
+  //public BaseGraphicalViewer getBaseGraphicalViewer()
+  //{
+  //  return (BaseGraphicalViewer)getViewer();
+  //}
+
+  public IFigure getSelectionFigure()
+  {
+    return getFigure();
+  }
+  
+  
+  public void addFeedback()
+  {
+    isSelected = true;
+    refreshVisuals();
+  }
+
+  public void removeFeedback()
+  {
+    isSelected = false;
+    refreshVisuals();
+  }  
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/CategoryEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/CategoryEditPart.java
new file mode 100644
index 0000000..ae8540c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/CategoryEditPart.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                           
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.ScrollPane;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.ViewportLayout;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.GraphicsConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.wst.xsd.ui.internal.graph.model.Category;
+
+
+public class CategoryEditPart extends BaseEditPart
+{
+  protected ScrollPane scrollpane;
+  protected Label label;
+
+
+  public int getType()
+  {
+    return ((Category)getModel()).getGroupType();
+  }
+
+  protected IFigure createFigure()
+  {           
+    ContainerFigure outerPane = new ContainerFigure();    
+    outerPane.setBorder(new RoundedLineBorder(1, 6));
+    outerPane.setForegroundColor(categoryBorderColor);
+
+    ContainerFigure r = new ContainerFigure();  
+    r.setOutline(false);
+    r.setMinimumSize(new Dimension(0, 0));
+    r.setFill(true);
+    r.setBackgroundColor(GraphicsConstants.elementBackgroundColor);
+    outerPane.add(r);
+    
+    int minHeight = 250;
+    switch (getType())
+    {
+    	case Category.DIRECTIVES :
+		case Category.NOTATIONS :
+		{
+			minHeight = 50;
+			break;	
+		}
+		case Category.ATTRIBUTES :
+		case Category.GROUPS :		  
+		{
+			minHeight = 100;
+			break;
+		}
+    }
+    
+	final int theMinHeight = minHeight;
+    FillLayout outerLayout = new FillLayout()
+    {
+      protected Dimension calculatePreferredSize(IFigure parent, int width, int height)
+      {
+        Dimension d = super.calculatePreferredSize(parent, width, height);
+        d.union(new Dimension(100, theMinHeight));
+        return d;
+      }
+    };
+    //outerLayout.setHorizontal(false);
+    outerPane.setLayoutManager(outerLayout);
+    
+   
+    label = new Label();
+    label.setForegroundColor(ColorConstants.black);
+    label.setBorder(new MarginBorder(2, 4, 2, 4));
+    r.add(label); //Holder);
+
+    RectangleFigure line = new RectangleFigure();
+    line.setPreferredSize(20, 1);
+    outerPane.add(line);
+
+
+    scrollpane = new ScrollPane();
+    scrollpane.setForegroundColor(ColorConstants.black);
+    scrollpane.setVerticalScrollBarVisibility(ScrollPane.AUTOMATIC); //ScrollPane.ALWAYS);
+    outerPane.add(scrollpane);
+
+    ContainerFigure pane = new ContainerFigure();
+    pane.setBorder(new MarginBorder(5, 8, 5, 8));
+    ContainerLayout layout = new ContainerLayout();
+    layout.setHorizontal(false);
+    layout.setSpacing(0);
+    pane.setLayoutManager(layout);
+
+    Viewport viewport = new Viewport();
+    viewport.setContentsTracksHeight(true);
+    ViewportLayout viewportLayout = new ViewportLayout()
+    {
+      protected Dimension calculatePreferredSize(IFigure parent, int width, int height)
+      {
+        Dimension d = super.calculatePreferredSize(parent, width, height);
+        d.height = Math.min(d.height, theMinHeight - 25); //getViewer().getControl().getBounds().height);
+        return d;
+      }
+    };
+    viewport.setLayoutManager(viewportLayout);
+
+    scrollpane.setViewport(viewport);
+    scrollpane.setContents(pane);
+
+    return outerPane;
+  }  
+
+  protected List getModelChildren() 
+  {            
+    return ((Category)getModel()).getChildren();
+  }  
+        
+  public void refreshVisuals()
+  {
+    Category category = (Category)getModel();
+    // temp hack --- added empty space to make the min width of groups bigger  
+    label.setText("  " + category.getName() + "                                                    ");
+  } 
+  
+  public IFigure getContentPane()
+  {
+    return scrollpane.getContents();
+  }  
+
+  public void scrollTo(AbstractGraphicalEditPart topLevel)
+  {
+    Rectangle topLevelBounds = topLevel.getFigure().getBounds();
+    Rectangle categoryBounds = getFigure().getBounds();
+    int scrollValue = scrollpane.getVerticalScrollBar().getValue();
+    int location = topLevelBounds.y + scrollValue - categoryBounds.y;
+    scrollpane.scrollVerticalTo(location - categoryBounds.height/2);
+  }
+
+  protected EditPart createChild(Object model)
+  {
+    EditPart editPart = new TopLevelComponentEditPart();
+    editPart.setModel(model);
+    editPart.setParent(this);
+    return editPart;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeDefinitionEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeDefinitionEditPart.java
new file mode 100644
index 0000000..b0c1825
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeDefinitionEditPart.java
@@ -0,0 +1,210 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                                      
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.requests.LocationRequest;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.CenteredIconFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+
+              
+
+public class ComplexTypeDefinitionEditPart extends GraphNodeEditPart
+{
+  protected ContainerFigure contentFigure;   
+  protected Label label;     
+  protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+  protected CenteredIconFigure centeredIconFigure;  
+  protected RectangleFigure preceedingSpace;  
+  protected ContainerFigure contentPane;
+
+  public XSDComplexTypeDefinition getXSDComplexTypeDefinition()
+  {         
+    return (XSDComplexTypeDefinition)getModel();
+  }  
+
+  protected boolean isConnectedEditPart()
+  {
+    return false;
+  } 
+
+  protected GraphNodeFigure createGraphNodeFigure()  
+  {
+    XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)getModel();
+    GraphNodeFigure figure = new GraphNodeFigure();
+
+    figure.getOutlinedArea().setBorder(new RoundedLineBorder(1, 6));
+    figure.getOutlinedArea().setFill(true);
+    figure.getOutlinedArea().setLayoutManager(new FillLayout(true));
+
+    figure.getInnerContentArea().getContainerLayout().setHorizontal(true);
+
+    preceedingSpace = new RectangleFigure();
+    preceedingSpace.setVisible(false);
+    figure.getInnerContentArea().add(preceedingSpace, 0);
+
+    contentPane = new ContainerFigure();
+    contentPane.getContainerLayout().setHorizontal(false); 
+    contentPane.getContainerLayout().setSpacing(5);   
+    contentPane.setBorder(new MarginBorder(5, 5, 5, 5));
+    figure.getInnerContentArea().add(contentPane);
+    
+    label = new Label();    
+    label.setBorder(new MarginBorder(0, 5, 5, 5));
+    figure.getIconArea().add(label);     
+    label.setFont(mediumBoldFont);
+ 
+    figure.getInnerContentArea().getContainerLayout().setSpacing(5);   
+    figure.getInnerContentArea().setBorder(new MarginBorder(5, 5, 5, 5));
+    
+    return figure;
+  }      
+                                                                    
+  protected EditPart createChild(Object model) 
+  {   
+    EditPart editPart = null;                                     
+    if (model == getModel())
+    {
+      editPart = new ComplexTypeInheritedContentEditPart();
+      editPart.setModel(model);
+      editPart.setParent(this);
+    }
+    else
+    {
+      editPart = super.createChild(model);
+    }            
+    return editPart;
+  } 
+
+  protected List getModelChildren() 
+  {                           
+    List list = new ArrayList();
+
+    XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)getModel();
+
+    if (ct.getDerivationMethod().getName().equals("extension"))
+    {
+      list.add(getModel());
+    }  
+
+    list.addAll(XSDChildUtility.getModelChildren(getModel()));
+    return list;
+  }
+
+  public IFigure getContentPane()  
+  {
+    return contentPane;
+  }
+                        
+  protected void refreshVisuals()
+  { 
+    XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)getModel();                   
+
+    String name = ctd.getName();
+    if (name == null)
+    {
+      try
+      {
+        if (label != null)
+        {
+          graphNodeFigure.getIconArea().remove(label);
+        }
+        label = null;
+      }
+      catch (Exception e)
+      {
+      }
+    }
+    else
+    {
+      if (label == null)
+      {
+        label = new Label();    
+        label.setBorder(new MarginBorder(0, 5, 5, 5));
+        ((GraphNodeFigure)getFigure()).getIconArea().add(label);     
+        label.setFont(mediumBoldFont);
+      }
+      graphNodeFigure.getIconArea().add(label);
+      label.setText(name);
+    }
+
+    // provides some room if we need to draw lines for the inherited
+    boolean includesInheritedContent = getModelChildren().contains(getModel());
+    preceedingSpace.setPreferredSize(includesInheritedContent ? new Dimension(10, 1) : new Dimension(0, 0));
+
+    if (XSDGraphUtil.isEditable(getModel()))
+    { 
+      graphNodeFigure.setForegroundColor(isSelected ? ColorConstants.black : elementBorderColor);
+      if (label != null)
+      label.setForegroundColor(elementBorderColor);
+    }
+    else
+    {
+      graphNodeFigure.setForegroundColor(isSelected ? ColorConstants.black : readOnlyBorderColor);
+      if (label != null)
+      label.setForegroundColor(readOnlyBorderColor);
+    }
+  }
+             
+  protected void performDirectEdit()
+  {  
+    ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, (XSDComplexTypeDefinition)getModel());   
+    simpleDirectEditPolicy.setDelegate(manager);
+    manager.show();
+  }    
+            
+
+  protected void createEditPolicies()
+  {  
+    super.createEditPolicies();
+  	installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+  } 
+       
+
+  public void performRequest(Request request)
+  {
+  	if (request.getType() == RequestConstants.REQ_DIRECT_EDIT ||
+        request.getType() == RequestConstants.REQ_OPEN)
+    {     
+      if (XSDGraphUtil.isEditable(getModel()))
+      {                 
+        LocationRequest locationRequest = (LocationRequest)request;
+        Point p = locationRequest.getLocation();
+        
+        if (label != null && hitTest(label, p))
+        {
+  		    performDirectEdit();
+        }
+      }
+    }
+  } 
+} 
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeInheritedContentEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeInheritedContentEditPart.java
new file mode 100644
index 0000000..afeebc1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComplexTypeInheritedContentEditPart.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+
+// This is a dashed box that displays the inherited content of a complex type
+//
+public class ComplexTypeInheritedContentEditPart extends BaseEditPart
+{
+  protected Label label;     
+  protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+  protected boolean isParentExpanded;
+               
+  public ComplexTypeInheritedContentEditPart()
+  {
+    super();
+  }   
+                 
+  public XSDComplexTypeDefinition getXSDComplexTypeDefinition()
+  {         
+    return (XSDComplexTypeDefinition)getModel();
+  }
+                  
+  protected IFigure createFigure()
+  {                            
+    ContainerFigure figure = new ContainerFigure();
+    figure.getContainerLayout().setHorizontal(false);
+    figure.getContainerLayout().setBorder(5);
+    figure.getContainerLayout().setSpacing(5);
+    figure.setBorder(new RoundedLineBorder(ColorConstants.gray, 1, 6, Graphics.LINE_DASH));
+    return figure;
+  }    
+           
+  protected List getModelChildren() 
+  {                                              
+    XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)getModel();
+
+    List list = new ArrayList();
+
+    if (ct.getDerivationMethod().getName().equals("extension") && !isParentExpanded)
+    {
+      XSDTypeDefinition type = ct.getBaseTypeDefinition();
+      Iterator iter = XSDChildUtility.getModelChildren(type).iterator();
+      boolean cont = true;
+      while (cont)
+      {
+        while (iter.hasNext())
+        {
+          list.add(0, iter.next());
+        }
+        
+        if (type instanceof XSDComplexTypeDefinition)
+        {
+          XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)type;
+          type = ctd.getBaseTypeDefinition();
+                    
+					// defect 264957 - workbench hangs when modifying complex content
+					// Since we don't filter out the current complexType from
+					// the combobox, we can potentially have an endless loop
+					if (ctd == type)
+					{
+						cont = false;
+						break;
+					}
+
+          if (ctd.getDerivationMethod().getName().equals("extension"))
+          {
+            iter = XSDChildUtility.getModelChildren(type).iterator();
+          }
+          else
+          {
+            cont = false;
+          }
+        }
+        else
+        {
+          cont = false;
+        }
+      }
+    }
+    return list;
+  }
+
+  protected void refreshVisuals()
+  { 
+    XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)getModel();
+    List children = getModelChildren();
+    figure.setVisible(children.size() > 0);   
+    // todo set preferredSize to 0 ?
+  }
+
+  protected void performDirectEdit()
+  {  
+    ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, (XSDComplexTypeDefinition)getModel());   
+    simpleDirectEditPolicy.setDelegate(manager);
+    manager.show();
+  }    
+            
+
+  protected void createEditPolicies()
+  {  
+    super.createEditPolicies();
+    installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+  } 
+       
+
+  public void performRequest(Request request)
+  {
+    if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
+    {     
+      if (XSDGraphUtil.isEditable(getModel()))
+      {
+        performDirectEdit();
+      }
+    }
+  } 
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComponentViewerRootEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComponentViewerRootEditPart.java
new file mode 100644
index 0000000..fa8d191
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ComponentViewerRootEditPart.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                                      
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Panel;
+import org.eclipse.gef.EditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerLayout;
+
+              
+
+public class ComponentViewerRootEditPart extends BaseEditPart
+{
+  protected final static String MESSAGE_PLACE_HOLDER = "MESSAGE_PLACE_HOLDER";
+  protected Object input;              
+
+  public void setInput(Object input)
+  {
+    this.input = input;
+    refreshChildren();
+  }
+
+  protected IFigure createFigure()
+  {
+    Panel panel = new Panel();
+    ContainerLayout layout = new ContainerLayout();
+    layout.setBorder(60);
+    panel.setLayoutManager(layout);
+    return panel;
+  }   
+           
+
+  protected List getModelChildren() 
+  {               
+    List list = new ArrayList();
+    if (input != null)
+    {
+      list.add(input);
+    }
+    else
+    {
+      list.add(MESSAGE_PLACE_HOLDER);
+    }
+    return list;
+  }         
+
+  protected EditPart createChild(Object model) 
+  { 
+    EditPart editPart = null;
+    if (model == MESSAGE_PLACE_HOLDER)
+    {
+      editPart = new MessageEditPart();
+      editPart.setModel(model);
+    }
+    else
+    {
+      editPart = super.createChild(model);
+    }
+    return editPart;
+  } 
+
+  protected void createEditPolicies()
+  {  
+  }             
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ElementDeclarationEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ElementDeclarationEditPart.java
new file mode 100644
index 0000000..b52d893
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ElementDeclarationEditPart.java
@@ -0,0 +1,379 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                                   
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.requests.LocationRequest;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.SpacingFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDSubstitutionGroupChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDSubstitutionGroupsViewer;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComboBoxCellEditorManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.TypeReferenceDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ExpandableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+              
+
+public class ElementDeclarationEditPart extends ExpandableGraphNodeEditPart
+{
+  public Label label;  
+  protected Label contentIconLabel;
+  protected Label typeValueLabel;
+  protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+  protected boolean isContentIconLabelSelected = false;
+
+  protected final static String ELEMENT_TYPE_PLACE_HOLDER = "ELEMENT_TYPE_PLACE_HOLDER";
+
+  public XSDParticle getXSDParticle()
+  {
+    Object o = getXSDElementDeclaration().getContainer(); 
+    return (o instanceof XSDParticle) ? (XSDParticle)o : null;
+  }        
+
+  public XSDElementDeclaration getXSDElementDeclaration()
+  {         
+    return (XSDElementDeclaration)getModel();
+  }
+     
+  protected boolean isDefaultExpanded()
+  {
+    // hack to expand up to its content.  The previous test didn't appear to work
+    int depth = 0;
+    for (EditPart part = this; part != null; part = part.getParent())
+    {
+      depth++;
+    }      
+    return depth <= 3;
+  }
+                      
+  protected GraphNodeFigure createGraphNodeFigure()
+  {
+    ExpandableGraphNodeFigure figure = new ExpandableGraphNodeFigure();
+
+    figure.getOutlinedArea().setFill(true);
+    figure.getOutlinedArea().setLayoutManager(new FillLayout());
+
+    label = new Label();    
+    figure.getIconArea().add(label);     
+    label.setFont(mediumBoldFont);
+    
+    SpacingFigure spacingFigure = new SpacingFigure();
+    figure.getIconArea().add(spacingFigure);
+    
+    contentIconLabel = new Label();
+    //contentIcon.setBorder(new MarginBorder(2, 2, 2, 10));
+    figure.getIconArea().add(contentIconLabel);
+
+    // A sneaky null check.... getViewer() does a getRoot(), but getRoot() might be null
+    // same with getParent()
+    if (getParent() != null && getRoot() != null && getViewer() instanceof XSDSubstitutionGroupsViewer)
+    {
+      figure.getOuterContentArea().getContainerLayout().setSpacing(5);
+    }
+    else
+    {  
+      RectangleFigure line = new RectangleFigure();
+      line.setPreferredSize(20, 1);   
+      figure.getOutlinedArea().add(line, 1);
+
+      figure.getInnerContentArea().setLayoutManager(new FillLayout(2));
+      figure.getInnerContentArea().setBorder(new MarginBorder(2,2,2,1));
+
+      ContainerFigure labelGroup = new ContainerFigure();   
+      Label typeLabel = new Label("type");
+      labelGroup.add(typeLabel);
+      labelGroup.setBorder(new MarginBorder(0, 4, 0, 4));      
+
+      Label equalsLabel = new Label(" = ");
+      labelGroup.add(equalsLabel);
+
+      typeValueLabel = new Label();                         
+      labelGroup.add(typeValueLabel);
+      figure.getOutlinedArea().add(labelGroup, 2);
+    }
+    return figure;
+  }          
+
+  protected ExpandableGraphNodeFigure getExpandableGraphNodeFigure()
+  {
+    return (ExpandableGraphNodeFigure)graphNodeFigure;
+  }                                            
+                    
+  protected List getModelChildren() 
+  {                                                                    
+    return getExpandableGraphNodeFigure().isExpanded() ? getModelChildrenHelper() : Collections.EMPTY_LIST;
+  }  
+                       
+  protected List getModelChildrenHelper()
+  {
+    if (getViewer() instanceof XSDSubstitutionGroupsViewer)
+    {
+      return XSDSubstitutionGroupChildUtility.getModelChildren(getXSDElementDeclaration().getResolvedElementDeclaration());
+    }
+    else
+    {
+      return XSDChildUtility.getModelChildren(getXSDElementDeclaration().getResolvedElementDeclaration());
+    }
+  }           
+                
+  protected void refreshContentIcon()
+  {
+    String iconName = null;
+    XSDTypeDefinition td = getXSDElementDeclaration().getResolvedElementDeclaration().getTypeDefinition();
+    if (td instanceof XSDSimpleTypeDefinition)
+    {      
+      // TODO... we should probably show the overlay form of this icon in the case that its a
+      // restriction, list or union
+      iconName = "icons/XSDSimpleType.gif";
+    }  
+    else if (td instanceof XSDComplexTypeDefinition)
+    {
+      XSDComplexTypeDefinition complexTypeDefinition = (XSDComplexTypeDefinition)td;
+      if (complexTypeDefinition.getAttributeUses().size() > 0)
+      {
+        iconName = "icons/XSDAttribute.gif";  
+      }  
+    }  
+    Image image = iconName != null ? XSDEditorPlugin.getXSDImage(iconName) : null;
+    contentIconLabel.setIcon(image);    
+  }
+
+  protected void refreshVisuals()
+  { 
+    String text = getXSDElementDeclaration().isElementDeclarationReference() ?
+                  getXSDElementDeclaration().getResolvedElementDeclaration().getQName(getXSDElementDeclaration().getSchema()) :
+                  getXSDElementDeclaration().getName();
+
+    label.setText(text);
+
+                                                            
+    ContainerFigure rectangle = graphNodeFigure.getOutlinedArea();
+    if (XSDGraphUtil.isEditable(getXSDElementDeclaration()))
+    {
+      rectangle.setBorder(new LineBorder(isSelected ? ColorConstants.black : elementBorderColor, 2));
+      rectangle.setBackgroundColor(elementBackgroundColor);
+      rectangle.setForegroundColor(elementBorderColor);
+      graphNodeFigure.getInnerContentArea().setForegroundColor(ColorConstants.black);
+      if (XSDGraphUtil.isEditable(getXSDElementDeclaration().getResolvedElementDeclaration()))
+      { 
+        // give label 'editable' colour
+        graphNodeFigure.getInnerContentArea().setForegroundColor(elementLabelColor);    
+      }
+      else
+      {   
+        // give label 'read only' colour
+        graphNodeFigure.getInnerContentArea().setForegroundColor(elementBorderColor);
+      }
+      label.setBackgroundColor(elementBackgroundColor);
+      label.setForegroundColor(elementLabelColor);
+    }
+    else
+    {
+      rectangle.setBorder(new LineBorder(isSelected ? ColorConstants.black : readOnlyBorderColor, 2));
+      rectangle.setBackgroundColor(readOnlyBackgroundColor);
+      rectangle.setForegroundColor(readOnlyBorderColor);
+      graphNodeFigure.getInnerContentArea().setForegroundColor(readOnlyBorderColor);     
+      label.setBackgroundColor(readOnlyBackgroundColor);
+    }
+                                                                                   
+    if (getXSDElementDeclaration().isElementDeclarationReference())
+    {
+      label.setIcon(XSDEditorPlugin.getXSDImage("icons/GraphViewElementRef.gif"));
+      label.setBorder(new MarginBorder(0, 0, 0, 4)); 
+    }
+    else
+    {                     
+      label.setIcon(null);
+      label.setBorder(new MarginBorder(0, 6, 0, 4));
+    }
+    
+    if (getXSDParticle() != null)
+    { 
+      refreshOccurenceLabel(getXSDParticle().getMinOccurs(), getXSDParticle().getMaxOccurs());
+    }                      
+     
+   
+    if (typeValueLabel != null)
+    {
+      XSDElementDeclaration ed = getXSDElementDeclaration();
+      if (ed.getElement() != null)
+      {
+        String type = ed.getElement().getAttribute("type");
+        if (type == null)
+        {
+          type = "";
+        }
+        if (!getXSDElementDeclaration().isElementDeclarationReference())
+				{   
+          typeValueLabel.setText(type.equals("") ? "<anonymous>" : type);
+				}
+        else // if it is a ref, we show the resolved type
+        {
+        	String resolvedType = "";
+        	if (ed.getResolvedElementDeclaration() != null)
+        	{
+        		if (ed.getResolvedElementDeclaration().getTypeDefinition() != null)
+        	  {
+        	    resolvedType = ed.getResolvedElementDeclaration().getTypeDefinition().getQName(ed.getSchema());
+              
+              // if null, it has an anonymous type that has no resolved type
+              if (resolvedType == null)
+              {
+                resolvedType = "<anonymous>";
+              }
+        	  }
+        	}
+          typeValueLabel.setText(resolvedType);
+				}
+      }
+    }
+    refreshContentIcon();
+  } 
+ 
+                                                                        
+  public void performRequest(Request request)
+  {  
+  	if (request.getType() == RequestConstants.REQ_DIRECT_EDIT ||
+        request.getType() == RequestConstants.REQ_OPEN)
+    {                                        
+      if (XSDGraphUtil.isEditable(getXSDElementDeclaration()))
+      {
+        if (request instanceof LocationRequest)
+        {
+          LocationRequest locationRequest = (LocationRequest)request;
+          Point p = locationRequest.getLocation();
+          isContentIconLabelSelected = false;
+          
+          if (hitTest(label, p))
+          {
+  		      performDirectEditForLabel();
+          }
+          else if (hitTest(typeValueLabel, p))
+          {                             
+   		      performDirectEditForTypeValueLabel();
+          } 
+        }
+      }
+    }
+  }   
+         
+  private void performDirectEditForTypeValueLabel()
+  {
+		if (!getXSDElementDeclaration().isElementDeclarationReference())
+		{    
+      TypeReferenceDirectEditManager manager = new TypeReferenceDirectEditManager(this, getXSDElementDeclaration(), typeValueLabel);   
+      simpleDirectEditPolicy.setDelegate(manager);
+      manager.show();
+		}
+		// just ignore type edit for element ref's
+  }                                                                
+
+                                                       
+  private void performDirectEditForLabel()
+  {    
+    if (getXSDElementDeclaration().isElementDeclarationReference())   
+    {
+      ComboBoxCellEditorManager manager = new ComboBoxCellEditorManager(this, label)
+      {
+         protected List computeComboContent()
+         {             
+           XSDSchema schema = getXSDElementDeclaration().getSchema();
+           List globalElementNameList = new ArrayList();
+           if (schema != null)
+           {
+             TypesHelper typesHelper = new TypesHelper(schema);
+             globalElementNameList = typesHelper.getGlobalElements();
+           }                                           
+           return globalElementNameList;
+         }
+
+         public void performModify(String value)
+         { 
+           getXSDElementDeclaration().getElement().setAttribute("ref", value);
+         }
+      };
+      simpleDirectEditPolicy.setDelegate(manager);
+      manager.show();
+    }
+    else
+    {
+      ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, getXSDElementDeclaration());   
+      simpleDirectEditPolicy.setDelegate(manager);
+      manager.show();
+    }
+  }                                
+  
+
+  protected void createEditPolicies()
+  {  
+    super.createEditPolicies();
+  	installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+  }
+  
+  
+  public void activate() 
+  {
+    super.activate();
+    if (getXSDParticle() != null)
+    {
+      XSDModelAdapterFactory.addModelAdapterListener(getXSDParticle(), this);
+    }
+  }
+  /** 
+   * Apart from the deactivation done in super, the source
+   * and target connections are deactivated, and the visual
+   * part of the this is removed.
+   *
+   * @see #activate() 
+   */
+  public void deactivate() 
+  {
+    if (getXSDParticle() != null)
+    {
+      XSDModelAdapterFactory.removeModelAdapterListener(getXSDParticle(), this);
+    }
+    super.deactivate();
+  }   
+
+  public boolean isContentIconLabelSelected()
+  {
+    return isContentIconLabelSelected;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ExpandableGraphNodeEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ExpandableGraphNodeEditPart.java
new file mode 100644
index 0000000..1ad4057
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ExpandableGraphNodeEditPart.java
@@ -0,0 +1,189 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                                        
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.ActionEvent;
+import org.eclipse.draw2d.ActionListener;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.LayoutManager;
+import org.eclipse.draw2d.MouseEvent;
+import org.eclipse.draw2d.MouseListener;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ExpandableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+
+                  
+
+public abstract class ExpandableGraphNodeEditPart extends RepeatableGraphNodeEditPart implements MouseListener, ActionListener
+{
+  protected boolean needToPerformDefaultExpansion = true;
+   
+  protected GraphNodeFigure createGraphNodeFigure()
+  {
+    return new ExpandableGraphNodeFigure();     
+  }
+
+  protected void addGraphNodeFigureListeners()
+  {                                                                    
+    getExpandableGraphNodeFigure().getInteractor().addMouseListener(this); 
+  }  
+            
+  protected ExpandableGraphNodeFigure getExpandableGraphNodeFigure()
+  {
+    return (ExpandableGraphNodeFigure)graphNodeFigure;
+  } 
+
+  public IFigure getContentPane()  
+  {
+    return getExpandableGraphNodeFigure().getOuterContentArea();
+  }
+    
+  protected boolean isDefaultExpanded()
+  {
+    return false;
+  }
+
+  protected boolean hasChildren()
+  {
+    return getModelChildrenHelper().size() > 0;
+  }         
+
+  protected abstract List getModelChildrenHelper();
+      
+
+  protected List getModelChildren() 
+  {                                                                             
+    return getExpandableGraphNodeFigure().isExpanded() ? getModelChildrenHelper() : Collections.EMPTY_LIST;
+  }  
+
+  protected void refreshChildren()
+  {    
+    if (needToPerformDefaultExpansion && isDefaultExpanded())
+    {
+      needToPerformDefaultExpansion = false;   
+      performExpandOrCollapseHelper();
+
+      super.refreshChildren();
+
+      EditPart root = getRoot();
+      if (root instanceof AbstractGraphicalEditPart)
+      {         
+        getContentPane().setVisible(true); 
+                    
+        IFigure rootFigure = ((AbstractGraphicalEditPart)root).getFigure();
+        invalidateAll(rootFigure);
+        rootFigure.validate();
+        rootFigure.repaint();
+      }     
+      getExpandableGraphNodeFigure().getInteractor().repaint();
+    } 
+    else
+    {
+      super.refreshChildren(); 
+    }   
+    getExpandableGraphNodeFigure().getInteractor().setVisible(hasChildren());
+  }
+
+
+  protected void performExpandOrCollapseHelper()
+  {
+    boolean isButtonExpanded = !getExpandableGraphNodeFigure().isExpanded();
+    getExpandableGraphNodeFigure().setExpanded(isButtonExpanded);
+  }
+
+  public void doPerformExpandOrCollapse()
+  {
+    performExpandOrCollapse();
+  }  
+  
+  public boolean isExpanded()
+  {
+    return getExpandableGraphNodeFigure().isExpanded();
+  }
+
+  protected void performExpandOrCollapse()
+  {
+    performExpandOrCollapseHelper();                              
+
+    boolean isButtonExpanded = getExpandableGraphNodeFigure().isExpanded();
+
+    refreshChildren();
+
+    EditPart root = getRoot();
+    if (root instanceof AbstractGraphicalEditPart)
+    {         
+      getContentPane().setVisible(isButtonExpanded); 
+                       
+      IFigure rootFigure = ((AbstractGraphicalEditPart)root).getFigure();
+      invalidateAll(rootFigure);
+      rootFigure.validate();
+      rootFigure.repaint();
+    }      
+    getExpandableGraphNodeFigure().getInteractor().repaint();
+  }
+
+  
+  protected void refreshOccurenceLabel(int min, int max)
+  {
+    super.refreshOccurenceLabel(min, max);
+
+    // TODO: revisit the 'hack' to understand why we need to do this 
+    // in order to get the view to layout propetly
+    //
+    IFigure thisFigure = getFigure();
+    invalidateAll(thisFigure);
+    thisFigure.validate();
+    thisFigure.repaint();
+  }
+
+  protected void invalidateAll(IFigure figure)
+  {
+    figure.invalidate();   
+    LayoutManager manager = figure.getLayoutManager();
+    if (manager != null)
+    {
+      manager.invalidate();
+    }
+    for (Iterator i = figure.getChildren().iterator(); i.hasNext(); )
+    {
+      IFigure child = (IFigure)i.next();
+      invalidateAll(child);
+    }
+  } 
+
+  
+  // implements MouseListener
+  // 
+  public void mouseDoubleClicked(MouseEvent me) 
+  {
+  }
+
+  public void mousePressed(MouseEvent me) 
+  {                             
+    me.consume();
+    needToPerformDefaultExpansion = false;
+    performExpandOrCollapse();  
+  }
+
+  public void mouseReleased(MouseEvent me) 
+  {
+  } 
+
+  public void actionPerformed(ActionEvent event) 
+  {                      
+    performExpandOrCollapse();
+  }   
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/GraphNodeEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/GraphNodeEditPart.java
new file mode 100644
index 0000000..ce6ad0a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/GraphNodeEditPart.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                                        
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.DragTracker;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.requests.LocationRequest;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.ConnectedEditPartFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.GraphNodeDragTracker;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SelectionHandlesEditPolicyImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+
+              
+
+public abstract class GraphNodeEditPart extends BaseEditPart
+{
+  protected GraphNodeFigure graphNodeFigure;
+  protected SelectionHandlesEditPolicyImpl selectionHandlesEditPolicy;
+                                 
+  protected boolean isConnectedEditPart()
+  {
+    return true;
+  }
+
+  protected IFigure createFigure()
+  {                           
+    IFigure result = graphNodeFigure = createGraphNodeFigure();    
+    addGraphNodeFigureListeners();
+
+    if (isConnectedEditPart())
+    {
+      ConnectedEditPartFigure connectedEditPartFigure = createConnectedEditPartFigure();                                    
+      connectedEditPartFigure.add(graphNodeFigure);
+      result = connectedEditPartFigure;
+    }
+    return result;
+  }       
+           
+  protected ConnectedEditPartFigure createConnectedEditPartFigure()
+  {
+    ConnectedEditPartFigure connectedEditPartFigure = new ConnectedEditPartFigure(this)
+    {
+      public IFigure getSelectionFigure()
+      {
+        return graphNodeFigure.getOutlinedArea();
+      }
+
+      public IFigure getConnectionFigure()
+      {
+        return graphNodeFigure.getConnectionFigure();
+      }
+    };
+    return connectedEditPartFigure;
+  }                                
+
+  protected abstract GraphNodeFigure createGraphNodeFigure();           
+  
+  protected void addGraphNodeFigureListeners()
+  {
+  }
+ 
+  public IFigure getSelectionFigure()
+  {
+    return graphNodeFigure.getOutlinedArea();
+  }
+
+  public Rectangle getConnectionRectangle()
+  {
+    return graphNodeFigure.getConnectionRectangle();
+  }
+
+  protected void createEditPolicies()
+  { 
+    //installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new NonResizableEditPolicy());    
+    selectionHandlesEditPolicy = new SelectionHandlesEditPolicyImpl();
+    installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, selectionHandlesEditPolicy);   
+  }  
+
+  public DragTracker getDragTracker(Request request)
+  {
+    return new GraphNodeDragTracker((EditPart)this);
+  }   
+
+ protected EditPart getApplicableEditPart(EditPart editPart, Point p)
+  {        
+    while (true)
+    {    
+      EditPart parent = null;
+      if (editPart instanceof GraphNodeEditPart)
+      {                                  
+        IFigure f = ((GraphNodeEditPart)editPart).getSelectionFigure();
+        if (!hitTest(f, p))
+        {                                 
+          parent = editPart.getParent();        
+        }             
+      }   
+
+      if (parent != null)
+      {
+        editPart = parent;
+      }                   
+      else
+      {
+        break;
+      }
+    }         
+    return editPart;
+  }
+
+  public EditPart getTargetEditPart(Request request)   
+  { 
+    EditPart editPart = null;
+    if (request.getType() == REQ_SELECTION)
+    {                                                                       
+      if (request instanceof LocationRequest)
+      {
+        LocationRequest locationRequest = (LocationRequest)request;
+        Point p = locationRequest.getLocation();
+        editPart = getApplicableEditPart(this, p);
+      }
+    }
+    return (editPart != null) ? editPart : super.getTargetEditPart(request);
+  }   
+
+  public boolean hitTest(IFigure target, Point location)
+  {
+    Rectangle b = target.getBounds().getCopy();
+    target.translateToAbsolute(b);  
+    return b.contains(location);
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/IFeedbackHandler.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/IFeedbackHandler.java
new file mode 100644
index 0000000..24a0537
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/IFeedbackHandler.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+
+public interface IFeedbackHandler
+{
+  public void addFeedback();
+  public void removeFeedback();
+}              
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/MessageEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/MessageEditPart.java
new file mode 100644
index 0000000..bbb7f92
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/MessageEditPart.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                          
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+
+              
+
+public class MessageEditPart extends BaseEditPart
+{
+  public MessageEditPart()
+  {
+  }   
+  
+  protected IFigure createFigure()
+  {                            
+    Label label = new Label(XSDEditorPlugin.getXSDString("_UI_GRAPH_VIEW_NOT_AVAILABLE"));         
+    return label;
+  }    
+
+  protected List getModelChildren() 
+  {                  
+    return Collections.EMPTY_LIST;
+  }   
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupDefinitionEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupDefinitionEditPart.java
new file mode 100644
index 0000000..8ccdfec
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupDefinitionEditPart.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                                      
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComboBoxCellEditorManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RepeatableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDSchema;
+
+              
+public class ModelGroupDefinitionEditPart extends RepeatableGraphNodeEditPart
+{
+  protected Label label;     
+  protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+
+  public XSDModelGroupDefinition getXSDModelGroupDefinition()
+  {
+    return (XSDModelGroupDefinition)getModel();
+  } 
+
+  protected boolean isConnectedEditPart()
+  {
+    return false;
+  }          
+
+  public XSDParticle getXSDParticle()
+  {                    
+    Object o = getXSDModelGroupDefinition().getContainer();
+    return (o instanceof XSDParticle) ? (XSDParticle)o : null;
+  }
+             
+  protected GraphNodeFigure createGraphNodeFigure()
+  {
+    RepeatableGraphNodeFigure figure = new RepeatableGraphNodeFigure();                                                        
+    figure.getOutlinedArea().setBorder(new RoundedLineBorder(1, 6));
+    figure.getInnerContentArea().setBorder(new MarginBorder(10, 0, 10, 0));
+
+    label = new Label();    
+    label.setFont(mediumBoldFont); 
+    figure.getIconArea().add(label);     
+
+
+    return figure;
+  }  
+ 
+  public IFigure getContentPane()  
+  {
+    return graphNodeFigure.getInnerContentArea();
+  }
+           
+  protected List getModelChildren() 
+  {                                             
+    return XSDChildUtility.getModelChildren(getModel());  
+  }
+
+  protected void createEditPolicies()
+  {     
+    super.createEditPolicies();
+  	installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+  }             
+             
+  protected void refreshVisuals()
+  { 
+    super.refreshVisuals();                                                                
+  
+    if (getXSDModelGroupDefinition().isModelGroupDefinitionReference())
+    {
+      label.setText(getXSDModelGroupDefinition().getResolvedModelGroupDefinition().getQName());
+      label.setIcon(XSDEditorPlugin.getXSDImage("icons/GraphViewElementRef.gif"));
+      label.setBorder(new MarginBorder(0, 0, 0, 4)); 
+
+      // todo update occurence label
+      //
+    }
+    else
+    {               
+      label.setText(getXSDModelGroupDefinition().getName());      
+      label.setIcon(null);
+      label.setBorder(new MarginBorder(0, 6, 0, 4));
+    }
+                       
+    if (XSDGraphUtil.isEditable(getModel()))
+    { 
+      graphNodeFigure.getOutlinedArea().setForegroundColor(isSelected ? ColorConstants.black : elementBorderColor);
+      label.setForegroundColor(elementLabelColor);
+    }
+    else
+    {
+      graphNodeFigure.getOutlinedArea().setForegroundColor(readOnlyBackgroundColor);
+      label.setForegroundColor(readOnlyBackgroundColor);
+    }   
+
+    refreshOccurenceLabel(getXSDParticle());
+  }
+ 
+
+  protected void performDirectEdit()
+  {              
+    if (getXSDModelGroupDefinition().isModelGroupDefinitionReference())
+    {
+      ComboBoxCellEditorManager manager = new ComboBoxCellEditorManager(this, label)
+      {
+         protected List computeComboContent()
+         {             
+           XSDSchema schema = getXSDModelGroupDefinition().getSchema();
+           List nameList = new ArrayList();
+           if (schema != null)
+           {
+             TypesHelper typesHelper = new TypesHelper(schema);
+             nameList = typesHelper.getModelGroups();
+           }                                           
+           return nameList;
+         }
+
+         public void performModify(String value)
+         {  
+           Display.getCurrent().asyncExec(new DelayedModelGroupRenameAction(getXSDModelGroupDefinition(), value));
+         }
+      };                                          
+      simpleDirectEditPolicy.setDelegate(manager);
+      manager.show();
+    }
+    else 
+    {
+      ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, getXSDModelGroupDefinition());           
+      simpleDirectEditPolicy.setDelegate(manager);
+      manager.show();
+    }
+  }  
+       
+
+  protected class DelayedModelGroupRenameAction implements Runnable
+  {
+     XSDModelGroupDefinition modelGroupDefinition;                                     
+     String value;
+
+     DelayedModelGroupRenameAction(XSDModelGroupDefinition modelGroupDefinition, String value)
+     {
+       this.modelGroupDefinition = modelGroupDefinition;
+       this.value = value;
+     }
+
+     public void run()
+     {
+       modelGroupDefinition.getElement().setAttribute("ref", value);
+     }
+  }
+    
+
+  public void performRequest(Request request)
+  {
+  	if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
+    {     
+      if (XSDGraphUtil.isEditable(getModel()))
+      {
+  		  performDirectEdit();
+      }
+    }
+  }    
+ 
+  // TODO... I added this as a quick fix to makesure the title gets redrawn when the groupRef is changed
+  // we should probably fix the ModelListenerUtil to fire both call both 'change' methods for the ref property
+  //public void modelChildrenChanged()
+  //{   
+  //  super.modelChildrenChanged();                                              
+  //  refreshVisuals(); 
+  //} 
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupEditPart.java
new file mode 100644
index 0000000..b793eba
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/ModelGroupEditPart.java
@@ -0,0 +1,187 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                          
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.DragAndDropEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.CenteredIconFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ExpandableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
+import org.eclipse.xsd.XSDCompositor;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDParticle;
+
+              
+
+public class ModelGroupEditPart extends ExpandableGraphNodeEditPart
+{
+  protected CenteredIconFigure centeredIconFigure;
+ 
+  protected static Color editableBackgroundColor = null;
+  protected static Color editableForegroundColor = null;
+  protected static Color nonEditableForegroundColor = null;
+
+  public XSDParticle getXSDParticle()
+  {                    
+    Object o = getXSDModelGroup().getContainer();
+    return (o instanceof XSDParticle) ? (XSDParticle)o : null;
+  }
+
+  public XSDModelGroup getXSDModelGroup()
+  {
+    return (XSDModelGroup)getModel();
+  }           
+
+  protected GraphNodeFigure createGraphNodeFigure()
+  {
+    ExpandableGraphNodeFigure figure = new ExpandableGraphNodeFigure();      
+
+    centeredIconFigure = new CenteredIconFigure();
+    centeredIconFigure.setPreferredSize(new Dimension(32, 20)); 
+    //centeredIconFigure.setBackgroundColor(new Color(Display.getCurrent(), 255, 0, 0)); 
+    figure.getIconArea().add(centeredIconFigure);   
+    //figure.getIconArea().setLayout(new CenterLayout());
+
+    ContainerFigure outlinedArea = figure.getOutlinedArea();                        
+    outlinedArea.setBorder(new RoundedLineBorder(1, 10));   
+    //outlinedArea.setPreferredSize(new Dimension(32, 20)); 
+                         
+    // set layout so that children are aligned vertically with some spacing
+    //
+    figure.getOuterContentArea().getContainerLayout().setHorizontal(false);  
+    figure.getOuterContentArea().getContainerLayout().setSpacing(10);
+
+    return figure;
+  }    
+
+  protected List getModelChildrenHelper()
+  {
+    return XSDChildUtility.getModelChildren(getXSDModelGroup());
+  }  
+ 
+  protected void refreshVisuals()
+  {         
+    String iconName = "icons/XSDSequence.gif";    
+    switch (getXSDModelGroup().getCompositor().getValue())
+    {
+      case XSDCompositor.ALL   : { iconName = "icons/XSDAll.gif"; break; }
+      case XSDCompositor.CHOICE   : { iconName = "icons/XSDChoice.gif"; break; }
+      case XSDCompositor.SEQUENCE : { iconName = "icons/XSDSequence.gif"; break; }
+    }
+    centeredIconFigure.image = XSDEditorPlugin.getXSDImage(iconName);
+    centeredIconFigure.repaint();
+                                                          
+
+    ContainerFigure outlinedArea = graphNodeFigure.getOutlinedArea() ;    
+    if (XSDGraphUtil.isEditable(getXSDModelGroup()))
+    {
+      if (editableForegroundColor == null) 
+        editableForegroundColor = new Color(Display.getCurrent(), 120, 152, 184);
+
+      if (editableBackgroundColor == null) 
+        editableBackgroundColor = new Color(Display.getCurrent(), 232, 240, 248);
+       
+      outlinedArea.setForegroundColor(isSelected ? ColorConstants.black : editableForegroundColor);
+      outlinedArea.setBackgroundColor(editableBackgroundColor);
+    }
+    else
+    {                                          
+      if (nonEditableForegroundColor == null) 
+        nonEditableForegroundColor = new Color(Display.getCurrent(), 164, 164, 164);    
+        
+      outlinedArea.setForegroundColor(isSelected ? ColorConstants.black : nonEditableForegroundColor);
+      outlinedArea.setBackgroundColor(ColorConstants.white);
+    }  
+
+    refreshOccurenceLabel(getXSDParticle());
+  }        
+
+  protected boolean isChildLayoutHorizontal()
+  {
+    return false;
+  } 
+
+  protected boolean isDefaultExpanded()
+  {        
+    return isPossibleCycle() ? false : true;
+  }  
+                                                                                         
+  // This test ensures that we don't end up with an infinite default expansion (e.g. when a group contains a cyclic group ref)
+  // TODO... we probably need some more extensible 'OO' way of computing this information
+  protected boolean isPossibleCycle()
+  {        
+    boolean result = false;
+    if (getParent() instanceof ModelGroupDefinitionEditPart)
+    {                                                      
+      ModelGroupDefinitionEditPart group = (ModelGroupDefinitionEditPart)getParent();
+      for (EditPart parent = group.getParent(); parent != null; parent = parent.getParent())
+      {
+        if (parent.getModel() instanceof ElementDeclarationEditPart)
+        {
+          break;
+        }       
+        else 
+        {
+          if (parent.getModel() == group.getModel())
+          {
+            result = true;
+            break;
+          }
+        }
+      }      
+    }      
+    return result;
+  } 
+       
+  protected void createEditPolicies()
+  { 
+    super.createEditPolicies();
+    installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new DragAndDropEditPolicy(getViewer(), selectionHandlesEditPolicy));      
+  }
+  
+  public void activate() 
+  {
+    super.activate();
+    if (getXSDParticle() != null)
+    {
+      XSDModelAdapterFactory.addModelAdapterListener(getXSDParticle(), this);
+    }
+  }
+  /** 
+   * Apart from the deactivation done in super, the source
+   * and target connections are deactivated, and the visual
+   * part of the this is removed.
+   *
+   * @see #activate() 
+   */
+  public void deactivate() 
+  {
+    if (getXSDParticle() != null)
+    {
+      XSDModelAdapterFactory.removeModelAdapterListener(getXSDParticle(), this);
+    }
+    super.deactivate();
+  }   
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RepeatableGraphNodeEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RepeatableGraphNodeEditPart.java
new file mode 100644
index 0000000..6fdf7d6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RepeatableGraphNodeEditPart.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                                        
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.DragAndDropEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RepeatableGraphNodeFigure;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDSchema;
+
+                  
+
+public class RepeatableGraphNodeEditPart extends GraphNodeEditPart
+{
+  protected RepeatableGraphNodeFigure getRepeatableGraphNodeFigure()
+  {
+    return (RepeatableGraphNodeFigure)graphNodeFigure;
+  }
+  
+  protected GraphNodeFigure createGraphNodeFigure()
+  {
+    return new RepeatableGraphNodeFigure();                                                        
+  }   
+      
+  protected void refreshOccurenceLabel(XSDParticle particle)
+  {  
+    if (particle != null)
+    { 
+      refreshOccurenceLabel(particle.getMinOccurs(), particle.getMaxOccurs());
+    }
+  }
+
+  protected void refreshOccurenceLabel(int min, int max)
+  {                     
+    if (min == 1 && max == 1)
+    {
+      getRepeatableGraphNodeFigure().getOccurenceLabel().setText("");
+    }
+    else
+    {
+      String maxString = max == -1 ? "*" : "" + max;
+      getRepeatableGraphNodeFigure().getOccurenceLabel().setText(min + ".." + maxString);
+    }
+    getRepeatableGraphNodeFigure().getOccurenceLabel().repaint();
+  }
+
+  protected void createEditPolicies()
+  { 
+    super.createEditPolicies();
+    
+    if (getModel() instanceof XSDElementDeclaration) {
+    	Object parent = ((XSDElementDeclaration) getModel()).eContainer();
+    	
+    	if (!(parent instanceof XSDSchema)) {
+    		installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new DragAndDropEditPolicy(getViewer(), selectionHandlesEditPolicy));      
+    	}
+    }
+    else {
+    	installEditPolicy(EditPolicy.PRIMARY_DRAG_ROLE, new DragAndDropEditPolicy(getViewer(), selectionHandlesEditPolicy));
+    }
+  }  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootComplexTypeDefinitionEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootComplexTypeDefinitionEditPart.java
new file mode 100644
index 0000000..853a2df
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootComplexTypeDefinitionEditPart.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                                   
+import java.util.List;
+
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDInheritanceViewer;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SelectionHandlesEditPolicyImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ExpandableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+
+              
+
+public class RootComplexTypeDefinitionEditPart extends ExpandableGraphNodeEditPart
+{                      
+  public Label label;  
+  protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();                              
+        
+
+  protected GraphNodeFigure createGraphNodeFigure()
+  {
+    ExpandableGraphNodeFigure figure = new ExpandableGraphNodeFigure();
+    figure.getOutlinedArea().setBorder(new RoundedLineBorder(1, 6));
+    figure.getOutlinedArea().setLayoutManager(new FillLayout());
+    figure.getOutlinedArea().setFill(true);
+    
+    if (getViewer() instanceof XSDInheritanceViewer)
+    {
+      figure.getOuterContentArea().getContainerLayout().setSpacing(10);
+    }
+
+    label = new Label();       
+    label.setFont(mediumBoldFont);
+    label.setBorder(new MarginBorder(5, 8, 5, 8));  
+    figure.getIconArea().add(label);  
+
+    return figure;
+  }          
+   
+                                                                                   
+  protected void refreshVisuals()
+  { 
+    super.refreshVisuals();                                                                
+
+    XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)getModel();                   
+    label.setText(ctd.getName() != null ? ctd.getName(): "");
+
+    if (XSDGraphUtil.isEditable(ctd))
+    { 
+      figure.setForegroundColor(elementBorderColor);
+      label.setForegroundColor(elementBorderColor);
+    }
+    else
+    {
+      figure.setForegroundColor(readOnlyBorderColor);
+      label.setForegroundColor(readOnlyBorderColor);
+    }
+  }
+
+
+  protected List getModelChildrenHelper()
+  {
+    XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)getModel();
+    if (getViewer() instanceof XSDInheritanceViewer)
+    {
+      return XSDChildUtility.getImmediateDerivedTypes(ct);
+    }
+    else
+    {
+      return XSDChildUtility.getModelChildren(getModel());
+    }
+  }     
+
+
+  protected void createEditPolicies()
+  {  
+    SelectionHandlesEditPolicyImpl policy = new SelectionHandlesEditPolicyImpl();
+    installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, policy);     
+  	installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+  }  
+        
+
+  protected void performDirectEdit()
+  {                                  
+    ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, (XSDComplexTypeDefinition)getModel());     
+    simpleDirectEditPolicy.setDelegate(manager);
+    manager.show();
+  }    
+
+
+  public void performRequest(Request request)
+  {
+  	if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
+    {
+      if (XSDGraphUtil.isEditable(getModel()))
+      {
+  		  performDirectEdit();
+      }
+    }
+  } 
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootModelGroupDefinitionEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootModelGroupDefinitionEditPart.java
new file mode 100644
index 0000000..35f4486
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/RootModelGroupDefinitionEditPart.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                                   
+import java.util.List;
+
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.ComponentNameDirectEditManager;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SelectionHandlesEditPolicyImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ExpandableGraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+
+              
+public class RootModelGroupDefinitionEditPart extends ExpandableGraphNodeEditPart
+{                      
+  public Label label;  
+  protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();                              
+                     
+
+  protected GraphNodeFigure createGraphNodeFigure()
+  {
+    ExpandableGraphNodeFigure figure = new ExpandableGraphNodeFigure();
+    figure.getOutlinedArea().setBorder(new RoundedLineBorder(1, 6));
+    figure.getOutlinedArea().setLayoutManager(new FillLayout());
+    figure.getOutlinedArea().setFill(true);
+
+    label = new Label();       
+    label.setFont(mediumBoldFont);
+    label.setBorder(new MarginBorder(5, 8, 5, 8));  
+    figure.getIconArea().add(label);  
+
+    return figure;
+  }  
+                                                                          
+  protected void refreshVisuals()
+  { 
+    super.refreshVisuals();                                                                
+
+    XSDModelGroupDefinition mgd = (XSDModelGroupDefinition)getModel();                      
+    String name = mgd.getResolvedModelGroupDefinition().getName();                  
+    label.setText(name);
+
+    if (XSDGraphUtil.isEditable(getModel()))
+    { 
+      figure.setForegroundColor(elementBorderColor);
+      label.setForegroundColor(elementBorderColor);
+    }
+    else
+    {
+      figure.setForegroundColor(readOnlyBorderColor);
+      label.setForegroundColor(readOnlyBorderColor);
+    }
+  }  
+
+  protected List getModelChildrenHelper()
+  {
+    return XSDChildUtility.getModelChildren(getModel());
+  }   
+
+
+  protected void createEditPolicies()
+  {  
+    SelectionHandlesEditPolicyImpl policy = new SelectionHandlesEditPolicyImpl();
+    installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, policy);     
+  	installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, simpleDirectEditPolicy);
+  }  
+        
+
+  protected void performDirectEdit()
+  {                                  
+    ComponentNameDirectEditManager manager = new ComponentNameDirectEditManager(this, label, ((XSDModelGroupDefinition)getModel()).getResolvedModelGroupDefinition());           
+    simpleDirectEditPolicy.setDelegate(manager);
+    manager.show();
+  }    
+
+
+  public void performRequest(Request request)
+  {
+  	if (request.getType() == RequestConstants.REQ_DIRECT_EDIT)
+    {
+      if (XSDGraphUtil.isEditable(getModel()))
+      {
+  		  performDirectEdit();
+      }
+    }
+  } 
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaDirectiveEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaDirectiveEditPart.java
new file mode 100644
index 0000000..c0697d5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaDirectiveEditPart.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.CenteredIconFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.xsd.XSDSchemaDirective;
+
+
+public class SchemaDirectiveEditPart extends BaseEditPart
+{
+  protected CenteredIconFigure centeredIconFigure;
+  protected Label label;
+  /**
+   * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
+   */
+  protected IFigure createFigure()
+  {
+ 
+    ContainerFigure figure = new ContainerFigure();
+
+    figure.setLayoutManager(new FillLayout());
+    figure.setBorder(new RoundedLineBorder(1, 8));
+
+    ContainerFigure fig = new ContainerFigure();
+    fig.setLayoutManager(new FillLayout());
+    fig.setBorder(new MarginBorder(10, 0, 10, 0));
+    figure.add(fig);
+
+
+    label = new Label();    
+    label.setBorder(new MarginBorder(4, 2, 2, 10));
+    fig.add(label);        
+
+    return figure;
+  }  
+ 
+  public void refreshVisuals()
+  {
+    XSDSchemaDirective directive = (XSDSchemaDirective)getModel();
+    String schemaLocation = directive.getSchemaLocation();
+    if (schemaLocation == null) schemaLocation = "(" + XSDEditorPlugin.getXSDString("_UI_LABEL_NO_LOCATION_SPECIFIED") + ")";
+    if (schemaLocation.equals("")) schemaLocation = "(" + XSDEditorPlugin.getXSDString("_UI_LABEL_NO_LOCATION_SPECIFIED") + ")";
+    label.setText("  " + directive.getElement().getLocalName() + " " + schemaLocation);
+  } 
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaEditPart.java
new file mode 100644
index 0000000..b23821c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SchemaEditPart.java
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.gef.EditPart;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.GraphicsConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RoundedLineBorder;
+import org.eclipse.wst.xsd.ui.internal.graph.model.Category;
+import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
+import org.eclipse.xsd.XSDSchema;
+
+public class SchemaEditPart extends BaseEditPart
+{
+  protected ContainerFigure containerFigure;
+  protected Label label;
+
+  //protected ContainerFigure childExpansionContainer;
+  public IFigure getContentPane()
+  {
+    return containerFigure;
+  }
+
+  protected IFigure createFigure()
+  {
+    ContainerFigure outer = new ContainerFigure();
+    outer.setBorder(new RoundedLineBorder(1, 6));
+    outer.setForegroundColor(categoryBorderColor);
+    FillLayout fillLayout = new FillLayout(4);
+    outer.setLayoutManager(fillLayout); 
+    //outer.getContainerLayout().setHorizontal(false);
+    
+    ContainerFigure r = new ContainerFigure();  
+    r.setOutline(false);
+    r.setMinimumSize(new Dimension(0, 0));
+    r.setFill(true);
+    r.setBackgroundColor(GraphicsConstants.elementBackgroundColor);
+    outer.add(r);
+    
+	final int theMinHeight = 200;
+    FillLayout outerLayout = new FillLayout()
+    {
+      protected Dimension calculatePreferredSize(IFigure parent, int width, int height)
+      {
+        Dimension d = super.calculatePreferredSize(parent, width, height);
+        d.union(new Dimension(100, theMinHeight));
+        return d;
+      }
+    };
+    outerLayout.setHorizontal(false);
+    outer.setLayoutManager(outerLayout);
+    
+    label = new Label();
+    label.setForegroundColor(ColorConstants.black);
+    label.setBorder(new MarginBorder(2, 4, 2, 4));    
+    r.add(label);
+    
+    RectangleFigure line = new RectangleFigure();
+    line.setPreferredSize(20, 1);
+    outer.add(line);
+    
+    containerFigure = new ContainerFigure();
+    //containerFigure.setBackgroundColor(ColorConstants.red);
+    containerFigure.setBorder(new MarginBorder(4, 4, 4, 4));
+    fillLayout = new FillLayout(4);
+    containerFigure.setLayoutManager(fillLayout);
+    //containerFigure.setLayoutManager(new FillLayout(false));
+    /*
+     * FlowLayout layout1 = new FlowLayout(false); layout1.setMajorSpacing(0);
+     * layout1.setMinorSpacing(0); layout1.setStretchMinorAxis(true);
+     * containerFigure.setLayoutManager(layout1);
+     */
+    outer.add(containerFigure);
+    //childExpansionContainer = new ContainerFigure();
+    //childExpansionContainer.getContainerLayout().setHorizontal(false);
+    //childExpansionContainer.setOutlined(true);
+    return outer;
+  }
+
+  protected List getModelChildren()
+  {
+    XSDSchema schema = (XSDSchema) getModel();
+    List list = new ArrayList();
+    list.add(CategoryRowEditPart.DIRECTIVES_AND_NOTATIONS);
+    list.add(CategoryRowEditPart.ELEMENTS_AND_TYPES);
+    list.add(CategoryRowEditPart.MODEL_GROUPS_AND_ATTRIBUTES);      
+    return list;
+  }
+
+  protected EditPart createChild(Object model)
+  {
+    CategoryRowEditPart result = new CategoryRowEditPart();
+    result.setModel(model);
+    result.setParent(this);
+    result.setSchema((XSDSchema)getModel());
+    return result;
+  }
+  
+
+  protected void refreshVisuals()
+  {
+    super.refreshVisuals();
+    String targetNamespaceValue = ((XSDSchema)getModel()).getTargetNamespace();
+    if (targetNamespaceValue == null || targetNamespaceValue.length() == 0)
+    {
+      targetNamespaceValue = XSDEditorPlugin.getXSDString("_UI_GRAPH_XSDSCHEMA_NO_NAMESPACE");
+    }     
+    label.setText(XSDEditorPlugin.getXSDString("_UI_GRAPH_XSDSCHEMA") + " : " + targetNamespaceValue);
+  }
+}
+
+class CategoryRowEditPart extends BaseEditPart
+{  
+  public static final int[] ELEMENTS_AND_TYPES = {Category.ELEMENTS, Category.TYPES };
+  public static final int[] DIRECTIVES_AND_NOTATIONS =  {Category.DIRECTIVES, Category.NOTATIONS };
+  public static final int[] MODEL_GROUPS_AND_ATTRIBUTES = {Category.GROUPS, Category.ATTRIBUTES};//, Category.COMPLEX_TYPES };
+  
+  protected XSDSchema schema;
+  protected Figure contentPane;
+  
+  protected IFigure createFigure()
+  {
+    ContainerFigure containerFigure = new ContainerFigure();
+    //containerFigure.setBackgroundColor(ColorConstants.red);
+    containerFigure.setFill(true);
+    containerFigure.setBorder(new MarginBorder(4, 4, 4, 4));
+    org.eclipse.wst.xsd.ui.internal.gef.util.figures.FillLayout fillLayout = new org.eclipse.wst.xsd.ui.internal.gef.util.figures.FillLayout(4);
+    fillLayout.setHorizontal(true);
+    containerFigure.setLayoutManager(fillLayout);
+    //containerFigure.setLayoutManager(new FillLayout(4));
+    return containerFigure;
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#getContentPane()
+   */
+  public IFigure getContentPane()
+  {
+    return super.getContentPane();
+  }
+
+  public XSDSchema getSchema()
+  {
+    return schema;
+  }
+
+  public void setSchema(XSDSchema schema)
+  {
+    this.schema = schema;
+  }
+  
+
+  protected List getModelChildren()
+  {
+    List categoryList = (List) XSDModelAdapterFactory.getAdapter(schema).getProperty(schema, "groups");
+    return filterCategoryList(categoryList);
+  }
+  
+  protected List filterCategoryList(List list)
+  {
+    List result = new ArrayList();
+    int[] categoryTypes = (int[])getModel();
+    for (Iterator i = list.iterator(); i.hasNext(); )
+    {
+      Category category = (Category)i.next();
+      if (isMatching(categoryTypes, category))
+      {
+        result.add(category);
+      }
+    }
+    return result;
+  }
+  
+  private boolean isMatching(int[] categoryTypes, Category category)
+  {
+    boolean result = false;
+    for (int i = 0; i < categoryTypes.length; i++)
+    {
+      if (categoryTypes[i] == category.getGroupType())
+      {
+        result = true;
+        break;
+      }
+    }
+    return result;
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SubstitutionGroupViewerRootEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SubstitutionGroupViewerRootEditPart.java
new file mode 100644
index 0000000..3899e8e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/SubstitutionGroupViewerRootEditPart.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                                      
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Panel;
+import org.eclipse.gef.EditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerLayout;
+
+              
+
+public class SubstitutionGroupViewerRootEditPart extends BaseEditPart
+{
+  protected final static String MESSAGE_PLACE_HOLDER = "MESSAGE_PLACE_HOLDER";
+  protected Object input;              
+
+  public void setInput(Object input)
+  {
+    this.input = input;
+    refreshChildren();
+  }
+
+  protected IFigure createFigure()
+  {
+    Panel panel = new Panel();
+    ContainerLayout layout = new ContainerLayout();
+    layout.setBorder(60);
+    panel.setLayoutManager(layout);
+    return panel;
+  }   
+           
+
+  protected List getModelChildren() 
+  {               
+    List list = new ArrayList();
+    if (input != null)
+    {
+      list.add(input);
+    }
+    else
+    {
+      list.add(MESSAGE_PLACE_HOLDER);
+    }
+    return list;
+  }         
+
+  protected EditPart createChild(Object model) 
+  { 
+    EditPart editPart = null;
+    if (model == MESSAGE_PLACE_HOLDER)
+    {
+      editPart = new MessageEditPart();
+      editPart.setModel(model);
+    }
+    else
+    {
+      editPart = super.createChild(model);
+    }
+    return editPart;
+  } 
+
+  protected void createEditPolicies()
+  {  
+  }             
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TopLevelComponentEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TopLevelComponentEditPart.java
new file mode 100644
index 0000000..f34fb33
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TopLevelComponentEditPart.java
@@ -0,0 +1,273 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.editpolicies.SelectionEditPolicy;
+import org.eclipse.gef.requests.LocationRequest;
+import org.eclipse.gef.ui.parts.AbstractEditPartViewer;
+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.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.xsd.ui.internal.gef.util.editparts.AbstractComponentViewerRootEditPart;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.FillLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.GraphicsConstants;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDComponentViewer;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SelectionHandlesEditPolicyImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.model.ModelAdapter;
+import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNamedComponent;
+
+
+public class TopLevelComponentEditPart extends BaseEditPart implements IFeedbackHandler
+{
+  protected Label label;
+  //protected Label arrowLabel;
+  protected ContainerFigure labelHolder = new ContainerFigure();
+  protected SelectionHandlesEditPolicyImpl selectionHandlesEditPolicy;
+  protected boolean isReadOnly;
+  protected boolean isSelected;
+  
+  protected IFigure createFigure()
+  {
+    ContainerFigure typeGroup = new ContainerFigure();
+    typeGroup.getContainerLayout().setHorizontal(true);
+
+    //arrowLabel = new Label();
+    //arrowLabel.setIcon(XSDEditorPlugin.getPlugin().getImage("icons/forward.gif"));
+    //typeGroup.add(arrowLabel);
+
+    labelHolder = new ContainerFigure();
+    FillLayout fillLayout = new FillLayout();
+    labelHolder.setLayoutManager(fillLayout);
+    labelHolder.setFill(true);
+    typeGroup.add(labelHolder);
+
+    label = new Label();
+    label.setBorder(new MarginBorder(0, 2, 2, 1));
+    label.setForegroundColor(ColorConstants.black);
+    labelHolder.add(label);
+    
+    try
+	  {
+      // evil hack to provide underlines
+      Object model = getModel();
+      
+      boolean isLinux = java.io.File.separator.equals("/");
+      if (model instanceof XSDComplexTypeDefinition ||
+          model instanceof XSDElementDeclaration ||
+          model instanceof XSDModelGroupDefinition)
+      {
+        if (!isLinux)
+        {
+          FontData oldData = GraphicsConstants.medium.getFontData()[0];
+          FontData fontData = new FontData(oldData.getName(), oldData.getHeight(), SWT.NONE);
+
+            // TODO... clean this awful code up... we seem to be leaking here too
+            // we can't call this directly since the methods are OS dependant
+            // fontData.data.lfUnderline = 1
+            // so instead we use reflection
+            Object data = fontData.getClass().getField("data").get(fontData);
+            System.out.println("data" + data.getClass());
+            data.getClass().getField("lfUnderline").setByte(data, (byte)1);
+            Font font = new Font(Display.getCurrent(), fontData);
+            label.setFont(font);        
+
+        }
+      }
+	  }
+    catch (Exception e)
+	  {
+
+	  }
+    //FontData data = label.getFont().getFontData()[0];
+    //data.data.lfUnderline = 1;
+    
+    //RectangleFigure line = new RectangleFigure();    
+    //line.setPreferredSize(2, 1);   
+    //labelHolder.add(line, 1);    
+    
+    //label.getFont().getFontData()[0].setStyle()
+    
+    return typeGroup;
+  }
+  
+  public void refreshVisuals()
+  {
+    ModelAdapter adapter = XSDModelAdapterFactory.getAdapter(getModel());
+    if (adapter != null)
+    {
+      // isReadOnly = Boolean.TRUE.equals(adapter.getProperty(getModel(), "isReadOnly"));
+      isReadOnly = !XSDGraphUtil.isEditable(getModel());
+      label.setForegroundColor(computeLabelColor());
+      label.setText((String)adapter.getProperty(getModel(), ModelAdapter.LABEL_PROPERTY));
+      Image image = (Image)adapter.getProperty(getModel(), ModelAdapter.IMAGE_PROPERTY);
+      if (image != null) label.setIcon(image);
+      //arrowLabel.setVisible(Boolean.TRUE.equals(adapter.getProperty(getModel(), "drillDown")));
+    }
+    else
+    {
+      label.setText("unknown object" + getModel().getClass().getName());
+      //arrowLabel.setVisible(false);
+    }
+  }
+
+
+  public XSDNamedComponent getXSDNamedComponent()
+  {
+    return (XSDNamedComponent) getModel();
+  }
+
+  public List getModelChildren()
+  {
+    return Collections.EMPTY_LIST;
+  }
+  
+  protected void createEditPolicies()
+  { 
+    //installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new NonResizableEditPolicy());    
+    //selectionHandlesEditPolicy = new SelectionHandlesEditPolicyImpl();
+    //installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, selectionHandlesEditPolicy);  
+  	
+    SelectionHandlesEditPolicyImpl policy = new SelectionHandlesEditPolicyImpl();
+    installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, policy);
+
+    SelectionEditPolicy feedBackSelectionEditPolicy = new SelectionEditPolicy()
+    {
+      protected void hideSelection()
+      {
+        EditPart editPart = getHost();
+        if (editPart instanceof IFeedbackHandler)
+        {
+          ((IFeedbackHandler)editPart).removeFeedback();
+        }
+      }
+
+      protected void showSelection()
+      {
+        EditPart editPart = getHost();
+        if (editPart instanceof IFeedbackHandler)
+        {
+          ((IFeedbackHandler)editPart).addFeedback();
+        }
+      }
+    };
+    installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, feedBackSelectionEditPolicy);  	
+  }  
+  
+  public Color computeLabelColor()
+  {
+    Color color = ColorConstants.black;
+    if (isSelected)
+    {
+      color = ColorConstants.white;
+    }
+    else if (isReadOnly)
+    {
+      color = ColorConstants.gray;
+    }
+    return color;
+  }
+
+
+  public void addFeedback()
+  {
+    isSelected = true;
+    
+    labelHolder.setBackgroundColor(ColorConstants.black);
+    label.setForegroundColor(computeLabelColor());
+    labelHolder.setFill(true);
+  }
+
+  public void removeFeedback()
+  {
+    isSelected = false;
+    labelHolder.setBackgroundColor(null);
+    label.setForegroundColor(computeLabelColor());
+    labelHolder.setFill(false);
+  }
+
+  public void performRequest(Request request)
+  {  
+    if (request.getType() == RequestConstants.REQ_DIRECT_EDIT ||
+        request.getType() == RequestConstants.REQ_OPEN)
+    {
+      
+      Object model = getModel();
+      if (model instanceof XSDComplexTypeDefinition ||
+          model instanceof XSDElementDeclaration ||
+          model instanceof XSDModelGroupDefinition)
+      {
+        if (request instanceof LocationRequest)
+        {
+          LocationRequest locationRequest = (LocationRequest)request;
+          Point p = locationRequest.getLocation();
+        
+          if (hitTest(labelHolder, p))
+          {
+            performDrillDownAction();
+          }              
+        }
+      }
+    }
+  }  
+
+  public boolean hitTest(IFigure target, Point location)
+  {
+    Rectangle b = target.getBounds().getCopy();
+    target.translateToAbsolute(b);  
+    return b.contains(location);
+  }  
+
+  protected void performDrillDownAction()
+  {                                                                                    
+    Runnable runnable = new Runnable()
+    {
+      public void run()
+      {
+        //((XSDComponentViewer)getViewer()).setInput((XSDConcreteComponent)getModel());
+        
+        EditPart editPart = ((AbstractEditPartViewer)getViewer()).getRootEditPart().getContents();
+        if (editPart instanceof AbstractComponentViewerRootEditPart)
+        {
+          AbstractComponentViewerRootEditPart rootEditPart = (AbstractComponentViewerRootEditPart)editPart;
+          rootEditPart.setInput((XSDConcreteComponent)getModel());
+        }
+        else if (editPart instanceof BaseEditPart)
+        {
+          ((XSDComponentViewer)getViewer()).setInput((XSDConcreteComponent)getModel());
+        }
+      }
+    };
+    Display.getCurrent().asyncExec(runnable);
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TypeEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TypeEditPart.java
new file mode 100644
index 0000000..37a83e1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/TypeEditPart.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SelectionHandlesEditPolicyImpl;
+import org.eclipse.wst.xsd.ui.internal.graph.editpolicies.SimpleDirectEditPolicy;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+
+public class TypeEditPart extends BaseEditPart
+{
+  protected SimpleDirectEditPolicy simpleDirectEditPolicy = new SimpleDirectEditPolicy();
+
+  protected IFigure createFigure()
+  {
+    ContainerFigure typeGroup = new ContainerFigure();
+//    typeGroup.setBorder(new SimpleRaisedBorder(1));
+//    typeGroup.setBorder(new LineBorder(1));
+//    typeGroup.setBorder(new RoundedLineBorder(1,5));
+
+    Label typeLabel = new Label("type");
+    typeLabel.setBorder(new MarginBorder(0,2,2,1));
+    typeGroup.add(typeLabel);
+
+    return typeGroup;
+  }    
+
+  protected void refreshVisuals()
+  {                 
+    super.refreshVisuals();
+  }
+
+  public XSDTypeDefinition getXSDTypeDefinition()
+  {         
+    return (XSDTypeDefinition)getModel();
+  }
+
+                    
+  public List getModelChildren() 
+  {                   
+    return Collections.EMPTY_LIST;
+  }  
+
+  protected void createEditPolicies()
+  {        
+    SelectionHandlesEditPolicyImpl policy = new SelectionHandlesEditPolicyImpl();
+    installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, policy);      
+  } 
+  
+               
+  public void performRequest(Request request)
+  {
+    super.performRequest(request);
+  }  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/WildcardEditPart.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/WildcardEditPart.java
new file mode 100644
index 0000000..53a86a1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/WildcardEditPart.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                          
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.MarginBorder;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDGraphUtil;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.GraphNodeFigure;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.RepeatableGraphNodeFigure;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDWildcard;
+              
+
+public class WildcardEditPart extends RepeatableGraphNodeEditPart
+{
+  protected Label label;
+
+                             
+  public XSDParticle getXSDParticle()
+  {                    
+    Object o = getXSDWildcard().getContainer();
+    return (o instanceof XSDParticle) ? (XSDParticle)o : null;
+  }
+
+
+  public XSDWildcard getXSDWildcard()
+  {
+    return (XSDWildcard)getModel();
+  }
+
+   
+  protected GraphNodeFigure createGraphNodeFigure()
+  {
+    RepeatableGraphNodeFigure figure = new RepeatableGraphNodeFigure();                                                        
+    figure.setConnected(true);
+    figure.getOutlinedArea().setFill(true);
+
+    label = new Label();    
+    label.setText(XSDEditorPlugin.getXSDString("_UI_ANY_ELEMENT")); 
+    label.setBorder(new MarginBorder(0, 6, 0, 4));
+    label.setFont(mediumBoldFont);        
+
+    figure.getIconArea().add(label);     
+
+    return figure;
+  }  
+ 
+      
+  protected void refreshVisuals()
+  {     
+    ContainerFigure rectangle = graphNodeFigure.getOutlinedArea();
+    if (XSDGraphUtil.isEditable(getModel()))
+    {
+      rectangle.setBorder(new LineBorder(2));
+      rectangle.setBackgroundColor(elementBackgroundColor);
+      rectangle.setForegroundColor(isSelected ? ColorConstants.black : elementBorderColor);
+
+      label.setBackgroundColor(elementBackgroundColor);
+      label.setForegroundColor(elementLabelColor);
+    }
+    else
+    {            
+      rectangle.setBorder(new LineBorder(readOnlyBorderColor, 2));
+      rectangle.setBackgroundColor(readOnlyBackgroundColor);
+      rectangle.setForegroundColor(isSelected ? ColorConstants.black : readOnlyBorderColor);
+   
+      label.setBackgroundColor(readOnlyBackgroundColor);
+      label.setForegroundColor(readOnlyBorderColor);
+    } 
+
+    refreshOccurenceLabel(getXSDParticle());
+  }      
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/XSDEditPartFactory.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/XSDEditPartFactory.java
new file mode 100644
index 0000000..f6c5de3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editparts/XSDEditPartFactory.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editparts;
+                              
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartFactory;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDInheritanceViewer;
+import org.eclipse.wst.xsd.ui.internal.graph.model.Category;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDWildcard;
+
+
+
+public class XSDEditPartFactory implements EditPartFactory
+{   
+  protected static XSDEditPartFactory instance;
+                      
+  public static XSDEditPartFactory getInstance()
+  {
+    if (instance == null)
+    {               
+      instance = new XSDEditPartFactory();
+    }
+    return instance;
+  }
+  
+  public EditPart createEditPart(EditPart parent, Object model)
+  {
+    EditPart editPart = null;
+           
+    if (model instanceof Category)
+    {                                  
+      editPart = new CategoryEditPart();
+    }
+    else if (model instanceof XSDElementDeclaration)
+    {       
+      editPart = new ElementDeclarationEditPart();
+    }    
+    else if (model instanceof XSDComplexTypeDefinition)
+    {
+      if (parent.getViewer() instanceof XSDInheritanceViewer)
+      {
+        editPart = new RootComplexTypeDefinitionEditPart();
+      }
+      else
+      {
+        if (parent instanceof CategoryEditPart)
+          editPart = new RootComplexTypeDefinitionEditPart();
+        else
+          editPart = new ComplexTypeDefinitionEditPart();             
+      }
+    }      
+    else if (model instanceof XSDModelGroup)
+    {       
+      editPart = new ModelGroupEditPart();
+    }      
+    else if (model instanceof XSDModelGroupDefinition)
+    {       
+      if (parent instanceof CategoryEditPart)
+        editPart = new RootModelGroupDefinitionEditPart();
+      else
+        editPart = new ModelGroupDefinitionEditPart();
+    }  
+    else if (model instanceof XSDSchema)
+    {                                  
+      editPart = new SchemaEditPart();
+    }
+    else if (model instanceof XSDWildcard)
+    {                                  
+      editPart = new WildcardEditPart();
+    }
+
+    if (editPart != null)   
+    {
+      editPart.setModel(model);
+      editPart.setParent(parent);
+    }
+    else
+    {      
+//      System.out.println("can't create editPart for " + model);
+//      Thread.dumpStack();
+    }
+    return editPart;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/ComboBoxCellEditorManager.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/ComboBoxCellEditorManager.java
new file mode 100644
index 0000000..bf58f17
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/ComboBoxCellEditorManager.java
@@ -0,0 +1,205 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editpolicies;
+                                                  
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.geometry.Rectangle;
+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.ComboBoxCellEditor;
+import org.eclipse.jface.viewers.ICellEditorListener;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+
+public abstract class ComboBoxCellEditorManager extends DirectEditManager implements DirectEditPolicyDelegate
+{
+  protected Label label;                                 
+
+  public ComboBoxCellEditorManager(GraphicalEditPart source,	Label label)
+  {
+	  super(source, ComboBoxCellEditor.class, new InternalCellEditorLocator(label));
+    this.label = label;                        
+  }
+
+  protected void initCellEditor() 
+  {                                             
+  	String initialLabelText = label.getText();   
+
+    CCombo combo = (CCombo)getCellEditor().getControl();
+   	combo.setFont(label.getFont());
+    combo.setForeground(label.getForegroundColor());
+    combo.setBackground(label.getBackgroundColor());
+    /*
+	combo.addKeyListener(new KeyAdapter() {
+			// hook key pressed - see PR 14201  
+			public void keyPressed(KeyEvent keyEvent) {
+				if (keyEvent.character == 'z') { 
+					getCellEditor().applyEditorValue();
+				}
+			}
+		});
+*/
+  ICellEditorListener cellEditorListener = new ICellEditorListener()
+  {
+    public void cancelEditor()
+    {
+//      System.out.println("cancelEditor");
+    }
+    public void applyEditorValue()
+    {
+//      System.out.println("applyEditorValue");
+    }
+    public void editorValueChanged(boolean old, boolean newState)
+    {
+//      System.out.println("editorValueChanged");
+    }
+  };
+  getCellEditor().addListener(cellEditorListener);
+
+    String[] item = combo.getItems();
+    int index = 0;
+    for (int i = 0; i < item.length; i++)
+    {
+      if (item[i].equals(initialLabelText))
+      {
+	      getCellEditor().setValue(new Integer(i));
+        break;
+      }
+    } 	
+  }	 
+         
+  // hack... for some reason the ComboBoxCellEditor does't fire an editorValueChanged to set the dirty flag
+  // unless we overide this method to return true, the manager is not notified of changes made in the cell editor
+  protected boolean isDirty()
+  {
+	  return true;
+  }
+
+  protected CellEditor createCellEditorOn(Composite composite)
+  { 
+    boolean isLabelTextInList = false;                                       
+    List list = computeComboContent();
+    for (Iterator i = list.iterator(); i.hasNext(); )
+    {
+      String string = (String)i.next();
+      if (string.equals(label.getText()))
+      {                               
+         isLabelTextInList = true;
+         break;
+      }
+    } 
+         
+    if (!isLabelTextInList)
+    {
+      list.add(label.getText());
+    }
+                                               
+    List sortedList = computeSortedList(list);
+    String[] stringArray = new String[sortedList.size()];
+    for (int i = 0; i < stringArray.length; i++)
+    {
+      stringArray[i] = (String)sortedList.get(i);
+    }
+    return new ComboBoxCellEditor(composite, stringArray);
+	}                                                                 
+
+  protected List computeSortedList(List list)
+  {
+    return list;
+  }
+
+  protected abstract List computeComboContent(); 
+
+  protected abstract void performModify(String value);
+
+  public static class InternalCellEditorLocator implements CellEditorLocator
+  {
+    protected Label label;
+
+    public InternalCellEditorLocator(Label label)
+    {
+      this.label = label;
+    }                   
+
+    public void relocate(CellEditor celleditor) 
+    {
+      CCombo combo = (CCombo)celleditor.getControl();  
+	    Point pref = combo.computeSize(-1, -1);
+	    Rectangle rect = label.getTextBounds().getCopy();
+	    label.translateToAbsolute(rect);
+	    combo.setBounds(rect.x-4, rect.y-1, pref.x+1, pref.y+1);
+    }
+  } 
+   
+  // implements DirectEditPolicyDelegate
+  // 
+  public void performEdit(CellEditor cellEditor)
+  {   
+    CCombo combo = (CCombo)getCellEditor().getControl();
+    int index = combo.getSelectionIndex();              
+    if (index != -1)
+    {      
+      String value = combo.getItem(index);
+      performModify(combo.getItem(index));
+    }  
+    else
+    {
+      String typedValue = combo.getText();	
+      if (combo.indexOf(typedValue) != -1)
+      {	      
+	    performModify(typedValue);
+      }      	
+      else
+      {
+      	String closeMatch = getCloseMatch(typedValue, combo.getItems());
+      	if (closeMatch != null)
+      	{
+		  performModify(closeMatch);      	
+      	}
+      	else
+      	{      	
+      	  Display.getCurrent().beep();
+      	}
+      }
+    }    	                                                
+  }
+  
+  protected String getCloseMatch(String value, String[] items)
+  {
+    int matchIndex = -1;
+
+    for (int i = 0; i < items.length; i++)
+    {
+    	String item = items[i];
+    	String a = getLocalName(value);
+    	String b = getLocalName(item);
+		  if (a.equalsIgnoreCase(b))
+		  { 
+			  matchIndex = i;
+			  break;				
+		  }	    	     
+    }  
+    return matchIndex != -1 ? items[matchIndex] : null;
+  }
+  
+  protected String getLocalName(String string)
+  {
+		int index = string.indexOf(":");
+	  return (index != -1) ? string.substring(index + 1) : string;  
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/ComponentNameDirectEditManager.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/ComponentNameDirectEditManager.java
new file mode 100644
index 0000000..afea789
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/ComponentNameDirectEditManager.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editpolicies;
+                                                  
+import org.eclipse.draw2d.Label;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalElementRenamer;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalGroupRenamer;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalSimpleOrComplexTypeRenamer;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDSwitch;
+
+
+
+public class ComponentNameDirectEditManager extends TextCellEditorManager
+{
+  protected XSDNamedComponent component;
+
+  public ComponentNameDirectEditManager(GraphicalEditPart source,	Label label, XSDNamedComponent component)
+  {
+    super(source, label);  
+    this.component = component;
+  }
+
+  public void performModify(final String value)
+  {                     
+    DelayedRenameRunnable runnable = new DelayedRenameRunnable(component, value);
+    Display.getCurrent().asyncExec(runnable);  
+  }      
+
+  protected static class DelayedRenameRunnable implements Runnable
+  {
+    protected XSDNamedComponent component;
+    protected String name;
+
+    public DelayedRenameRunnable(XSDNamedComponent component, String name)
+    {                                                               
+      this.component = component;
+      this.name = name;
+    }                                                              
+
+    public void run()
+    {                             
+      XSDSwitch xsdSwitch = new XSDSwitch()
+      {                   
+        public Object caseXSDTypeDefinition(XSDTypeDefinition object)
+        {
+          new GlobalSimpleOrComplexTypeRenamer(object, name).visitSchema(object.getSchema());
+          return null;
+        } 
+      
+        public Object caseXSDElementDeclaration(XSDElementDeclaration object)
+        {           
+          if (object.isGlobal())
+          {
+            new GlobalElementRenamer(object, name).visitSchema(object.getSchema());
+          }
+          return null;
+        }
+      
+        public Object caseXSDModelGroupDefinition(XSDModelGroupDefinition object)
+        {
+          new GlobalGroupRenamer(object, name).visitSchema(object.getSchema());
+          return null;
+        }
+      };
+      xsdSwitch.doSwitch(component); 
+      component.setName(name);
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DirectEditPolicyDelegate.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DirectEditPolicyDelegate.java
new file mode 100644
index 0000000..b5cce8b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DirectEditPolicyDelegate.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editpolicies;
+   
+import org.eclipse.jface.viewers.CellEditor;
+
+public interface DirectEditPolicyDelegate
+{       
+  public void performEdit(CellEditor cellEditor);  
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DragAndDropCommand.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DragAndDropCommand.java
new file mode 100644
index 0000000..e84f7e3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DragAndDropCommand.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editpolicies;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.requests.ChangeBoundsRequest;
+import org.eclipse.wst.xsd.ui.internal.actions.MoveAction;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.IConnectionRenderingViewer;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.ComplexTypeDefinitionEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.GraphNodeEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.ModelGroupDefinitionEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.ModelGroupEditPart;
+import org.eclipse.xsd.XSDConcreteComponent;
+
+
+public class DragAndDropCommand extends Command //AbstractCommand
+{ 
+  protected EditPartViewer viewer;    
+  protected ChangeBoundsRequest request;
+  protected GraphNodeEditPart childRefEditPart;    
+  public GraphNodeEditPart parentEditPart; 
+  public Point location;
+  protected MoveAction action;    
+  protected boolean canExecute;
+
+  public DragAndDropCommand(EditPartViewer viewer, ChangeBoundsRequest request)
+  {
+    this.viewer = viewer;                    
+    this.request = request;
+
+    location = request.getLocation();   
+    EditPart target = viewer.findObjectAt(location); 
+  	((GraphicalEditPart)viewer.getRootEditPart()).getFigure().translateToRelative(location);
+     
+    List list = request.getEditParts();
+    if (list.size() > 0)
+    {           
+      parentEditPart = getParentEditPart(target);
+      if (parentEditPart != null)
+      {                                          
+        for (Iterator i = parentEditPart.getChildren().iterator(); i.hasNext(); )
+        {
+          EditPart child = (EditPart)i.next();
+          if (child instanceof GraphNodeEditPart)
+          {
+            GraphNodeEditPart childGraphNodeEditPart = (GraphNodeEditPart)child;
+            Rectangle rectangle = childGraphNodeEditPart.getSelectionFigure().getBounds();
+     
+            if (location.y < rectangle.getCenter().y)
+            {                                    
+              childRefEditPart = childGraphNodeEditPart;   
+              break;
+            }
+          }
+        } 
+            
+        List editPartsList = request.getEditParts();
+        List concreteComponentList = new ArrayList(editPartsList.size());
+        for (Iterator i = editPartsList.iterator(); i.hasNext(); )
+        {                                                       
+          EditPart editPart = (EditPart)i.next();
+          concreteComponentList.add((XSDConcreteComponent)editPart.getModel());
+        } 
+        XSDConcreteComponent refComponent = childRefEditPart != null ? (XSDConcreteComponent)childRefEditPart.getModel() : null;
+
+        action = new MoveAction((XSDConcreteComponent)parentEditPart.getModel(), concreteComponentList, refComponent);
+        canExecute = action.canMove();                                            
+      }            
+    }     
+  }
+             
+  protected GraphNodeEditPart getParentEditPart(EditPart target)
+  {
+    GraphNodeEditPart result = null;    
+    while (target != null)
+    {                     
+      if (target instanceof ModelGroupEditPart)
+      {
+        result = (GraphNodeEditPart)target;
+        break;
+      }
+      else if (target instanceof ComplexTypeDefinitionEditPart ||
+               target instanceof ModelGroupDefinitionEditPart)
+      {
+        List list = target.getChildren();
+        for (Iterator i = list.iterator(); i.hasNext(); )
+        {
+          Object child = i.next();
+          if (child instanceof ModelGroupEditPart)
+          {
+            result = (GraphNodeEditPart)child;
+            break;
+          }
+        }   
+        if (result != null)
+        {
+          break;
+        }
+      }
+      target = target.getParent();
+    }
+    return result;
+  }
+
+  public void execute()
+  {           
+    if (canExecute)
+    { 
+      action.run(); 
+    }
+  }     
+  
+  public void redo()
+  {
+
+  }  
+  
+  public void undo()
+  {
+  }     
+  
+  public boolean canExecute()
+  { 
+    return canExecute;
+  } 
+
+  public PointList getConnectionPoints(Rectangle draggedFigureBounds)
+  {             
+    PointList pointList = null;      
+    if (parentEditPart != null && childRefEditPart != null && viewer instanceof IConnectionRenderingViewer)
+    {                                
+      pointList = ((IConnectionRenderingViewer)viewer).getConnectionRenderingFigure().getConnectionPoints(parentEditPart, childRefEditPart, draggedFigureBounds);      
+    }               
+    return pointList != null ? pointList : new PointList();
+  }                                                                  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DragAndDropEditPolicy.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DragAndDropEditPolicy.java
new file mode 100644
index 0000000..18468c8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/DragAndDropEditPolicy.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editpolicies;
+
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.requests.ChangeBoundsRequest;
+
+public class DragAndDropEditPolicy extends org.eclipse.gef.editpolicies.GraphicalEditPolicy
+{ 
+  protected EditPartViewer viewer;    
+  protected SelectionHandlesEditPolicyImpl selectionHandlesEditPolicy;
+
+  public DragAndDropEditPolicy(EditPartViewer viewer, SelectionHandlesEditPolicyImpl selectionHandlesEditPolicy)
+  {
+    this.viewer = viewer;
+    this.selectionHandlesEditPolicy = selectionHandlesEditPolicy;
+  }
+
+  public boolean understandsRequest(Request req)
+  {
+	  return true;
+  }                           
+    
+  static int count2 = 0;
+  boolean theCommandResult = true;   
+  
+  public org.eclipse.gef.commands.Command getCommand(Request request)
+  {             
+    // this block is commented out to disable move for now
+    DragAndDropCommand command = null;                            
+    if (request instanceof ChangeBoundsRequest)
+    {
+      command = new DragAndDropCommand(viewer, (ChangeBoundsRequest)request);  
+      selectionHandlesEditPolicy.setDragAndDropCommand(command);
+    } 
+    return command;             
+  }                                                     
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/GraphNodeDragTracker.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/GraphNodeDragTracker.java
new file mode 100644
index 0000000..58fbaac
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/GraphNodeDragTracker.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editpolicies;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.tools.DragEditPartsTracker;
+
+                                   
+public class GraphNodeDragTracker extends DragEditPartsTracker 
+{                                     
+  protected EditPart editPart; 
+           
+  public GraphNodeDragTracker(EditPart editPart)
+  {
+    super(editPart);
+    this.editPart = editPart;
+  } 
+                                              
+  protected Command getCommand() 
+  { 
+	  Request request = getTargetRequest();
+    return editPart.getCommand(request); 
+  }
+} 
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/SelectionHandlesEditPolicyImpl.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/SelectionHandlesEditPolicyImpl.java
new file mode 100644
index 0000000..d09b53a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/SelectionHandlesEditPolicyImpl.java
@@ -0,0 +1,257 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editpolicies;
+                                 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.FigureUtilities;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Polyline;
+import org.eclipse.draw2d.RectangleFigure;
+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.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.editpolicies.SelectionHandlesEditPolicy;
+import org.eclipse.gef.handles.MoveHandle;
+import org.eclipse.gef.handles.MoveHandleLocator;
+import org.eclipse.gef.requests.ChangeBoundsRequest;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.BaseEditPart;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.IFeedbackHandler;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.BogusLayout;
+import org.eclipse.wst.xsd.ui.internal.graph.figures.ContainerFigure;
+
+
+
+
+
+public class SelectionHandlesEditPolicyImpl	extends SelectionHandlesEditPolicy
+{
+  protected IFigure feedback;
+  protected Rectangle originalLocation;
+  protected DragAndDropCommand dragAndDropCommand;
+
+  protected List createSelectionHandles()
+  {              
+    List list = new ArrayList();
+    EditPart editPart = getHost();
+     
+    if (editPart instanceof GraphicalEditPart)
+    {
+      GraphicalEditPart graphicalEditPart = (GraphicalEditPart)editPart;
+      IFigure figure = (graphicalEditPart instanceof BaseEditPart) ? 
+                          ((BaseEditPart)graphicalEditPart).getSelectionFigure() :
+                          graphicalEditPart.getFigure();
+   
+      Cursor cursorFigure = figure.getCursor();
+      MoveHandleLocator loc = new MoveHandleLocator(figure);    
+      MoveHandle moveHandle = new MoveHandle(graphicalEditPart, loc);     
+      moveHandle.setCursor(cursorFigure);
+      list.add(moveHandle);
+    }
+
+    return list;
+  }   
+  
+
+  public boolean understandsRequest(Request request)
+  {    
+    boolean result = false;
+
+	  if (REQ_MOVE.equals(request.getType()))
+    {  
+		  result = false; // return false to disable move for now 
+    }
+    else
+    {
+	    result = super.understandsRequest(request);
+    }
+    return result;
+  }
+  
+
+  public org.eclipse.gef.commands.Command getCommand(Request request) 
+  {                                          
+    return null;  
+  }   
+
+  public void setDragAndDropCommand(DragAndDropCommand dragAndDropCommand)
+  {
+    this.dragAndDropCommand = dragAndDropCommand;
+  }
+
+  protected org.eclipse.gef.commands.Command getMoveCommand(ChangeBoundsRequest request) 
+  {
+	  ChangeBoundsRequest req = new ChangeBoundsRequest(REQ_MOVE_CHILDREN);
+	  req.setEditParts(getHost());
+	
+	  req.setMoveDelta(request.getMoveDelta());
+	  req.setSizeDelta(request.getSizeDelta());
+	  req.setLocation(request.getLocation());
+
+	  return getHost().getParent().getCommand(req);
+  } 
+
+  public void showSourceFeedback(Request request)
+  {  	
+	  if (REQ_MOVE.equals(request.getType()) ||
+		  REQ_ADD.equals(request.getType()))
+		  showChangeBoundsFeedback((ChangeBoundsRequest)request);
+  }
+
+  protected void showChangeBoundsFeedback(ChangeBoundsRequest request)
+  {
+  	IFigure p = getDragSourceFeedbackFigure();
+  	Rectangle r = originalLocation.getTranslated(request.getMoveDelta());
+  	Dimension resize = request.getSizeDelta();
+  	r.width += resize.width;
+  	r.height+= resize.height;
+  
+  	((GraphicalEditPart)getHost()).getFigure().translateToAbsolute(r);
+  	p.translateToRelative(r);
+                
+    Rectangle pBounds = r.getCopy();                            
+
+    if (dragAndDropCommand != null && dragAndDropCommand.canExecute())
+    {                     
+      int size = request.getEditParts().size();
+      if (size > 0 && request.getEditParts().get(size - 1) == getHost())
+      {         
+        PointList pointList = dragAndDropCommand.getConnectionPoints(r);
+        if (pointList != null && pointList.size() > 0)
+        {
+          polyLine.setPoints(pointList);
+          
+          Point firstPoint = pointList.getFirstPoint();
+          if (firstPoint != null)
+          {
+            pBounds = pBounds.getUnion(new Rectangle(firstPoint.x, firstPoint.y, 1, 1));
+          }
+        }
+      }
+    }
+    p.setBounds(pBounds);
+    ghostShape.setBounds(r);
+  	p.validate();
+  }        
+
+
+
+
+  protected IFigure getDragSourceFeedbackFigure() 
+  {
+    EditPart editPart = getHost(); 
+    if (feedback == null && editPart instanceof BaseEditPart)
+    {                                       
+      BaseEditPart baseEditPart = (BaseEditPart)editPart;
+		  originalLocation = new Rectangle(baseEditPart.getSelectionFigure().getBounds());
+		  feedback = createDragSourceFeedbackFigure(baseEditPart.getSelectionFigure());
+	  }
+	  return feedback;
+  }  
+    
+  Polyline polyLine;
+  RectangleFigure ghostShape;
+
+  protected IFigure createDragSourceFeedbackFigure(IFigure draggedFigure)
+  {
+		// Use a ghost rectangle for feedback  
+    ContainerFigure panel = new ContainerFigure(); 
+    panel.setLayoutManager(new BogusLayout());//new FreeformLayout());
+
+		ghostShape = new RectangleFigure();
+		FigureUtilities.makeGhostShape(ghostShape);
+		ghostShape.setLineStyle(Graphics.LINE_DASHDOT);
+		ghostShape.setForegroundColor(ColorConstants.white);
+    
+    Rectangle r = draggedFigure.getBounds();
+    panel.setOpaque(false);
+    panel.add(ghostShape);                 
+
+    polyLine = new Polyline();                         
+    //polyLine.setLineStyle(Graphics.LINE_DASHDOT);      
+    polyLine.setLineWidth(3);
+    panel.add(polyLine);
+
+    panel.setBounds(r);
+		ghostShape.setBounds(r);
+
+		addFeedback(panel);
+
+		return panel;
+	} 
+
+  public void deactivate()
+  {
+	  if (feedback != null)
+    {
+		  removeFeedback(feedback);
+		  feedback = null;
+	  }
+	  hideFocus();
+	  super.deactivate();
+  }
+
+  /**
+   * Erase feedback indicating that the receiver object is 
+   * being dragged.  This method is called when a drag is
+   * completed or cancelled on the receiver object.
+   * @param dragTracker org.eclipse.gef.tools.DragTracker The drag tracker of the tool performing the drag.
+   */
+  protected void eraseChangeBoundsFeedback(ChangeBoundsRequest request) 
+  {
+	  if (feedback != null) 
+    {		      
+		  removeFeedback(feedback);
+	  }
+	  feedback = null;
+	  originalLocation = null;
+  }
+
+  /**
+   * Erase feedback indicating that the receiver object is 
+   * being dragged.  This method is called when a drag is
+   * completed or cancelled on the receiver object.
+   * @param dragTracker org.eclipse.gef.tools.DragTracker The drag tracker of the tool performing the drag.
+   */
+  public void eraseSourceFeedback(Request request) 
+  {
+    if (REQ_MOVE.equals(request.getType()) ||  REQ_ADD.equals(request.getType()))
+    {
+		  eraseChangeBoundsFeedback((ChangeBoundsRequest)request);
+    }
+  }
+  
+  protected void hideSelection()
+  {
+    EditPart editPart = getHost();
+    if (editPart instanceof IFeedbackHandler)
+    {
+      ((IFeedbackHandler)editPart).removeFeedback();
+    }
+  }
+
+  protected void showSelection()
+  {
+    EditPart editPart = getHost();
+    if (editPart instanceof IFeedbackHandler)
+    {
+      ((IFeedbackHandler)editPart).addFeedback();
+    }
+  }  
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/SimpleDirectEditPolicy.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/SimpleDirectEditPolicy.java
new file mode 100644
index 0000000..531eef2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/SimpleDirectEditPolicy.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editpolicies;
+
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.DirectEditPolicy;
+import org.eclipse.gef.requests.DirectEditRequest;
+                                   
+public class SimpleDirectEditPolicy extends DirectEditPolicy 
+{
+  protected DirectEditPolicyDelegate delegate;
+
+  public void setDelegate(DirectEditPolicyDelegate delegate)
+  {                                           
+    this.delegate = delegate;
+  }
+
+  protected org.eclipse.gef.commands.Command getDirectEditCommand(final DirectEditRequest request) 
+  { 
+  	return new Command() //AbstractCommand()
+    {
+      public void execute()
+      {                       
+        if (delegate != null)
+        {
+          delegate.performEdit(request.getCellEditor());
+        }  
+      }     
+  
+      public void redo()
+      {
+      }  
+  
+      public void undo()
+      {
+      }     
+  
+      public boolean canExecute()
+      {
+        return true;
+      }
+    };
+  }
+  
+  protected void showCurrentEditValue(DirectEditRequest request) 
+  {      
+  	//hack to prevent async layout from placing the cell editor twice.
+  	getHostFigure().getUpdateManager().performUpdate();
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/TextCellEditorManager.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/TextCellEditorManager.java
new file mode 100644
index 0000000..6409937
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/TextCellEditorManager.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editpolicies;
+                                                  
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.geometry.Rectangle;
+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.graphics.Point;
+import org.eclipse.swt.widgets.Text;
+
+public abstract class TextCellEditorManager extends DirectEditManager implements DirectEditPolicyDelegate
+{
+  protected Label label;                                 
+
+  public TextCellEditorManager(GraphicalEditPart source,	Label label)
+  {
+	  super(source, TextCellEditor.class, new InternalCellEditorLocator(label));
+    this.label = label;     
+  }
+
+  protected void initCellEditor() 
+  {                                             
+  	String initialLabelText = label.getText();
+  	getCellEditor().setValue(initialLabelText);
+  	Text text = (Text)getCellEditor().getControl();
+  	text.setFont(label.getFont());
+    text.setForeground(label.getForegroundColor());
+    text.setBackground(label.getBackgroundColor());
+  	text.selectAll();
+  }	          
+
+  protected abstract void performModify(String value);
+    
+  public static class InternalCellEditorLocator implements CellEditorLocator
+  {
+    protected Label label;
+
+    public InternalCellEditorLocator(Label label)
+    {
+      this.label = label;
+    }                   
+
+    public void relocate(CellEditor celleditor) 
+    {
+      Text text = (Text)celleditor.getControl();  
+	    Point sel = text.getSelection();
+	    Point pref = text.computeSize(-1, -1);
+	    Rectangle rect = label.getTextBounds().getCopy();
+	    label.translateToAbsolute(rect);
+	    text.setBounds(rect.x-4, rect.y-1, pref.x+1, pref.y+1);	
+	    text.setSelection(0);
+	    text.setSelection(sel); 
+    }
+  }    
+
+  // implements DirectEditPolicyDelegate
+  // 
+  public void performEdit(CellEditor cellEditor)
+  {
+    performModify((String)cellEditor.getValue());
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/TypeReferenceDirectEditManager.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/TypeReferenceDirectEditManager.java
new file mode 100644
index 0000000..c62d1e9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/editpolicies/TypeReferenceDirectEditManager.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.editpolicies;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.Label;
+import org.eclipse.gef.EditPart;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.BaseEditPart;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDSchema;
+
+
+
+public class TypeReferenceDirectEditManager extends ComboBoxCellEditorManager
+{
+  protected BaseEditPart editPart;                                                
+  protected XSDElementDeclaration ed;
+
+  
+  public TypeReferenceDirectEditManager(BaseEditPart source,	XSDElementDeclaration ed, Label label)
+  {
+    super(source, label);  
+    editPart = source;               
+    this.ed = ed;
+  }
+
+  protected List computeComboContent()
+  {             
+    XSDSchema schema = ed.getSchema();
+    List typeNameList = new ArrayList();
+    if (schema != null)
+    {         
+      TypesHelper typesHelper = new TypesHelper(schema);
+      typeNameList.addAll(typesHelper.getUserSimpleTypeNamesList());
+      typeNameList.addAll(typesHelper.getUserComplexTypeNamesList());               
+      typeNameList.addAll(typesHelper.getBuiltInTypeNamesList());
+    }                        
+    return typeNameList;
+  }
+    
+  public void performModify(String value)
+  {                                               
+    // we need to perform an asyncExec here since the 'host' editpart may be removed
+    // as a side effect of performing the action
+    DelayedRenameRunnable runnable = new DelayedRenameRunnable(editPart, ed, value);
+    Display.getCurrent().asyncExec(runnable);   
+  }  
+   
+
+  protected List computeSortedList(List list)
+  {
+    return TypesHelper.sortList(list);
+  }
+
+  protected static class DelayedRenameRunnable implements Runnable
+  {
+    protected BaseEditPart editPart;                                                
+    protected EditPart editPartParent;
+    protected XSDElementDeclaration ed;
+    protected String name;
+
+    public DelayedRenameRunnable(BaseEditPart editPart, XSDElementDeclaration ed, String name)
+    {                                                               
+      this.editPart = editPart;
+      editPartParent = editPart.getParent();
+      this.ed = ed;
+      this.name = name;
+    }                                                              
+
+    public void run()
+    {                             
+      //BaseGraphicalViewer viewer = editPart.getBaseGraphicalViewer();
+      //viewer.setInputEnabled(false);
+      //viewer.setSelectionEnabled(false);      
+      if (name.equals("<anonymous>"))
+      {          
+        try
+        {
+          ed.getResolvedElementDeclaration().getElement().removeAttribute("type");
+        }
+        catch (Exception e)
+        {
+        }
+      }
+      else
+      {
+        if (ed.getResolvedElementDeclaration().getAnonymousTypeDefinition() != null) // isSetAnonymousTypeDefinition())
+        {
+          if (!(name.equals("<anonymous>")))
+          {
+            ed.getResolvedElementDeclaration().getElement().setAttribute("type", name);
+            XSDDOMHelper.updateElementToNotAnonymous(ed.getResolvedElementDeclaration().getElement());
+//            ed.getResolvedElementDeclaration().setAnonymousTypeDefinition(null);
+            return;
+          }
+        }
+        ed.getResolvedElementDeclaration().getElement().setAttribute("type", name);
+      }
+      //viewer.setInputEnabled(true);
+      //viewer.setSelectionEnabled(true);
+      //viewer.setSelection(new StructuredSelection(editPartParent));
+    }
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/BogusLayout.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/BogusLayout.java
new file mode 100644
index 0000000..cfa8c75
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/BogusLayout.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+
+
+/**
+ * Figures using the StackLayout as their layout manager have
+ * their children placed on top of one another. Order of 
+ * placement is determined by the order in which the children
+ * were added, first child added placed on the bottom.
+ */
+public class BogusLayout
+	extends AbstractLayout
+{
+                             
+protected int spacing;
+
+public BogusLayout(){}
+
+protected Dimension calculatePreferredSize(IFigure figure, int w, int h)
+{	                 
+  Dimension d = new Dimension();
+  return d;
+} 
+
+/*
+ * Returns the minimum size required by the input container.
+ * This is the size of the largest child of the container, as all
+ * other children fit into this size.
+ */
+/*jvh - final
+public Dimension getMinimumSize(IFigure figure){
+	return new Dimension();
+}
+
+public Dimension getPreferredSize(IFigure figure){
+	return new Dimension();
+}            */
+
+/*
+ * Lays out the children on top of each other with
+ * their sizes equal to that of the available
+ * paintable area of the input container figure.
+ */
+public void layout(IFigure figure){   
+ 
+} 
+ 
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/CenterLayout.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/CenterLayout.java
new file mode 100644
index 0000000..2932e6d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/CenterLayout.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+
+/**
+ * Figures using the StackLayout as their layout manager have
+ * their children placed on top of one another. Order of 
+ * placement is determined by the order in which the children
+ * were added, first child added placed on the bottom.
+ */
+public class CenterLayout
+	extends AbstractLayout
+{
+                             
+protected int spacing;
+
+public CenterLayout(){}
+public CenterLayout(int spacing){ this.spacing = spacing; }
+
+/**
+ * Calculates and returns the preferred size of the input container.
+ * This is the size of the largest child of the container, as all
+ * other children fit into this size.
+ *
+ * @param figure  Container figure for which preferred size is required.
+ * @return  The preferred size of the input figure.
+ * @since 2.0
+ */
+protected Dimension calculatePreferredSize(IFigure figure, int w, int h){
+	Dimension d = calculatePreferredClientAreaSize(figure);
+	/*d.expand(figure.getInsets().getWidth(),
+	         figure.getInsets().getHeight()); */
+        d.expand(w,
+	         h);
+	d.union(getBorderPreferredSize(figure));
+	return d;
+}
+
+protected Dimension calculatePreferredClientAreaSize(IFigure figure){
+	Dimension d = new Dimension();
+	List children = figure.getChildren();
+	for (Iterator i = children.iterator(); i.hasNext(); )
+  {
+		IFigure child = (IFigure)i.next();
+    Dimension childSize = child.getPreferredSize();
+    d.height += childSize.height;
+    d.width = Math.max(childSize.width, d.width);
+	}	                    
+  int childrenSize = children.size();       
+  if (childrenSize > 0)
+  {
+    d.height += spacing * children.size() - 1;
+  }
+	return d;
+}
+
+/*
+ * Returns the minimum size required by the input container.
+ * This is the size of the largest child of the container, as all
+ * other children fit into this size.
+ */
+public Dimension getMinimumSize(IFigure figure, int wHint, int hHint){
+	Dimension d = new Dimension();
+	List children = figure.getChildren();
+	IFigure child;
+	for (int i=0; i < children.size(); i++){
+		child = (IFigure)children.get(i);
+		d.union(child.getMinimumSize());
+	}
+	d.expand(figure.getInsets().getWidth(),
+	         figure.getInsets().getHeight());
+	return d;
+}
+
+public Dimension getPreferredSize(IFigure figure, int wHint, int hHint){
+	return calculatePreferredSize(figure, wHint, hHint);
+}
+
+
+/*
+ * Lays out the children on top of each other with
+ * their sizes equal to that of the available
+ * paintable area of the input container figure.
+ */
+public void layout(IFigure figure){
+	Rectangle r = figure.getClientArea();
+	List children = figure.getChildren();
+  
+  Dimension preferredClientAreaSize = calculatePreferredClientAreaSize(figure);
+  int x = r.x + (r.width - preferredClientAreaSize.width) / 2;
+  int y = r.y + (r.height - preferredClientAreaSize.height) / 2;
+
+	for (Iterator i = children.iterator(); i.hasNext(); )
+  {
+		IFigure child = (IFigure)i.next();
+    Dimension childSize = child.getPreferredSize();
+		child.setBounds(new Rectangle(x, y, childSize.width, childSize.height));
+    y += childSize.height + spacing;
+	}
+}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/CenteredIconFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/CenteredIconFigure.java
new file mode 100644
index 0000000..3426bb0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/CenteredIconFigure.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+            
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.swt.graphics.Image;
+              
+
+public class CenteredIconFigure extends ContainerFigure
+{                                                
+  public Image image;  
+                               
+  public CenteredIconFigure()
+  {
+    super();
+    setFill(true);   
+  }
+
+  protected void fillShape(Graphics g)
+  {    
+    super.fillShape(g);    
+    if (image != null)
+    {                         
+      Rectangle r = getBounds();                                                         
+      Dimension imageSize = new Dimension(16, 16);
+      g.drawImage(image, r.x + (r.width - imageSize.width)/2, r.y + (r.height - imageSize.height)/2);
+    }
+  }          
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ConnectionFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ConnectionFigure.java
new file mode 100644
index 0000000..aaa05f1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ConnectionFigure.java
@@ -0,0 +1,210 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+       
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.PointList;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.wst.xsd.ui.internal.graph.editparts.GraphNodeEditPart;
+
+              
+
+public class ConnectionFigure extends RectangleFigure
+{               
+  protected boolean isOutlined = true;
+  protected IFigure xsdFigure;
+
+  public ConnectionFigure(IFigure xsdFigure)
+  {
+    setOpaque(false);                   
+    this.xsdFigure = xsdFigure;
+    //setFocusTraversable(false); 
+    //setEnabled(false); 
+  }
+           
+  protected boolean isMouseEventTarget()
+  {
+    return false;
+  }        
+
+  public boolean containsPoint(int x, int y){return false;}
+
+  protected void fillShape(Graphics graphics)
+  { 
+    graphics.setForegroundColor(ColorConstants.black);
+    drawLines(graphics, xsdFigure);
+  }
+
+  protected void drawLines(Graphics graphics, IFigure figure)
+  {
+    if (figure instanceof GraphNodeFigure)
+    {
+      GraphNodeFigure graphNodeFigure = (GraphNodeFigure)figure;         
+      if (graphNodeFigure.isConnected() && graphNodeFigure.isExpanded())
+      {
+        List childList = graphNodeFigure.getChildGraphNodeFigures();
+        if (childList.size() > 0)
+        {                                         
+          Rectangle r = graphNodeFigure.getConnectionRectangle();    
+          
+          int x1 = r.x + r.width;
+          int y1 = r.y + r.height/2;
+          
+          int startOfChildBox = ((GraphNodeFigure)childList.get(0)).getConnectionRectangle().x;
+
+          int x2 = x1 + (startOfChildBox - x1) / 3;
+          int y2 = y1;
+                    
+          if (childList.size() > 1)
+          {                                 
+            graphics.drawLine(x1, y1, x2, y2);
+          
+            int minY = Integer.MAX_VALUE;
+            int maxY = -1;
+          
+            for (Iterator i = childList.iterator(); i.hasNext(); )
+            {
+              GraphNodeFigure childGraphNodeFigure = (GraphNodeFigure)i.next();
+              Rectangle childConnectionRectangle = childGraphNodeFigure.getConnectionRectangle();
+              int y = childConnectionRectangle.y + childConnectionRectangle.height / 2;
+             
+              minY = Math.min(minY, y);
+              maxY = Math.max(maxY, y);             
+              graphics.drawLine(x2, y, childConnectionRectangle.x, y);            
+            }                   
+            graphics.drawLine(x2, minY, x2, maxY);
+          }
+          else
+          {
+            graphics.drawLine(x1, y1, startOfChildBox, y2);
+          }
+        }                            
+      }                             
+    }
+
+    //boolean visitChildren = true;
+    List children = figure.getChildren();
+    for (Iterator i = children.iterator(); i.hasNext(); )
+    {
+      IFigure child = (IFigure)i.next();
+      drawLines(graphics, child);
+    }
+  }    
+
+
+  // This method supports the preview connection line function related to drag and drop
+  //     
+  public PointList getConnectionPoints(GraphNodeEditPart parentEditPart, GraphNodeEditPart childRefEditPart, Rectangle draggedFigureBounds)
+  {           
+    PointList pointList = new PointList();                         
+    int[] data = new int[1];
+    Point a = getConnectionPoint(parentEditPart, childRefEditPart, data);
+    if (a != null)
+    {   
+      int draggedFigureBoundsY = draggedFigureBounds.y + draggedFigureBounds.height/2;
+
+      pointList.addPoint(a); 
+      //pointList.addPoint(new Point(draggedFigureBounds.x, draggedFigureBoundsY));
+      
+      if (data[0] == 0) // insert between 2 items
+      {                                         
+        int x = a.x + (draggedFigureBounds.x - a.x)/2;
+        pointList.addPoint(new Point(x, a.y));
+        pointList.addPoint(new Point(x, draggedFigureBoundsY));        
+        pointList.addPoint(new Point(draggedFigureBounds.x, draggedFigureBoundsY));
+      }
+      else // insert at first or last position
+      {
+        pointList.addPoint(new Point(a.x, draggedFigureBoundsY));   
+        pointList.addPoint(new Point(draggedFigureBounds.x, draggedFigureBoundsY));
+      }
+    }       
+    return pointList;
+  }
+
+         
+  // This method supports the preview connection line function related to drag and drop
+  //     
+  protected Point getConnectionPoint(GraphNodeEditPart parentEditPart, GraphNodeEditPart childRefEditPart, int[] data)
+  {                      
+    Point point = null;     
+    List childList = parentEditPart.getChildren();         
+
+    //TreeNodeIconFigure icon = ((TreeNodeFigure)parent.getFigure()).treeNodeIconFigure;
+                                                                                                                                               
+    if (childList.size() > 0)
+    {   
+      point = new Point();
+
+      GraphNodeEditPart prev = null;    
+      GraphNodeEditPart next = null;
+                               
+      for (Iterator i = childList.iterator(); i.hasNext(); )
+      {             
+        Object o = i.next();    
+        if (o instanceof GraphNodeEditPart)
+        {
+          GraphNodeEditPart childEditPart = (GraphNodeEditPart)o;        
+          if (childEditPart == childRefEditPart)
+          {
+            next = childEditPart;
+            break;
+          }                                           
+          prev = childEditPart;
+        }
+      }                            
+
+      if (next != null && prev != null)
+      { 
+        int ya = prev.getConnectionRectangle().getCenter().y;
+        int yb = next.getConnectionRectangle().getCenter().y;
+        point.y = ya + (yb - ya)/2;   
+        data[0] = 0;
+      }                               
+      else if (prev != null) // add it last
+      {
+        point.y = prev.getConnectionRectangle().getCenter().y;
+        data[0] = 1;
+      }
+      else if (next != null) // add it first!
+      {                           
+        point.y = next.getConnectionRectangle().getCenter().y;
+        data[0] = -1;
+      }
+          
+      if (next != null || prev != null)
+      {
+        GraphNodeEditPart child = prev != null ? prev : next;
+        int startOfChildBox = child.getConnectionRectangle().x;
+        Rectangle r = parentEditPart.getConnectionRectangle();  
+        int x1 = r.x + r.width;
+        point.x = x1 + (startOfChildBox - x1) / 3;
+      }
+    }    
+    return point;
+  }
+         
+
+  protected void outlineShape(Graphics graphics)
+  { 
+    if (isOutlined)
+    {
+      super.outlineShape(graphics);
+    }
+  } 
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ContainerFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ContainerFigure.java
new file mode 100644
index 0000000..8594005
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ContainerFigure.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+            
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.LayoutManager;
+import org.eclipse.draw2d.RectangleFigure;
+              
+public class ContainerFigure extends RectangleFigure
+{               
+  protected boolean isOutlined = false;
+
+  public ContainerFigure()
+  {
+    setLayoutManager(new ContainerLayout());
+    setFill(false);
+  }
+
+  public void doLayout()
+  {
+	  layout();
+	  setValid(true);
+  }  
+          
+  public ContainerLayout getContainerLayout()
+  {
+    return (ContainerLayout)getLayoutManager();
+  }           
+
+  public void setOutlined(boolean isOutlined)
+  {
+    this.isOutlined = isOutlined;
+  }     
+
+  protected void outlineShape(Graphics graphics)
+  { 
+    if (isOutlined)
+    {
+      super.outlineShape(graphics);
+    }
+  }
+  
+  
+  public void validate() 
+  {
+    if (isValid())
+    {
+      return;
+    }
+    super.validate();	
+    postLayout();
+  }
+
+
+  protected void postLayout()
+  {
+    LayoutManager layoutManager = getLayoutManager();
+    if (layoutManager instanceof PostLayoutManager)
+    {
+      ((PostLayoutManager)layoutManager).postLayout(this);    
+    }  
+  }  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ContainerLayout.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ContainerLayout.java
new file mode 100644
index 0000000..0a13f10
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ContainerLayout.java
@@ -0,0 +1,249 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.wst.xsd.ui.internal.gef.util.figures.SpacingFigure;
+
+public class ContainerLayout extends AbstractLayout implements PostLayoutManager
+{                                         
+  protected boolean isHorizontal;
+  protected int spacing = 0;
+  protected int border = 0;
+ 
+  public ContainerLayout()
+  { 
+    this(true, 0); 
+  }             
+
+  public ContainerLayout(boolean isHorizontal, int spacing)
+  {
+    this.isHorizontal = isHorizontal;   
+    this.spacing = spacing;
+  }  
+
+  public void setHorizontal(boolean isHorizontal)
+  {
+    this.isHorizontal = isHorizontal;
+  }  
+
+  public void setSpacing(int spacing)
+  {
+    this.spacing = spacing;
+  }  
+
+  public void setBorder(int border)
+  {
+    this.border = border;
+  }   
+
+  /**
+   * Calculates and returns the preferred size of the container 
+   * given as input.
+   * 
+   * @param figure  Figure whose preferred size is required.
+   * @return  The preferred size of the passed Figure.
+   * @since 2.0
+   */
+  protected Dimension calculatePreferredSize(IFigure parent, int w, int h)
+  { 
+    Dimension preferred = null;                                              
+                                  
+    // Here we ensure that an unexpanded container is given a size of (0,0)
+    //
+    if (parent instanceof GraphNodeContainerFigure)
+    {
+      GraphNodeContainerFigure graphNodeContainerFigure = (GraphNodeContainerFigure)parent;
+      if (!graphNodeContainerFigure.isExpanded())
+      {
+        preferred = new Dimension(); 
+      }
+    }   
+    
+    if (preferred == null)
+    {
+      preferred = new Dimension();
+      List children = parent.getChildren();
+                                            
+      for (int i=0; i < children.size(); i++)
+      {
+        IFigure child = (IFigure)children.get(i);      
+    
+        Dimension childSize = child.getPreferredSize();
+        /*
+        if (child instanceof Interactor)
+        {          
+          childSize.width = 9;
+          childSize.height = 9;
+        }*/  
+    
+        if (isHorizontal)
+        {
+          preferred.width += childSize.width;
+          preferred.height = Math.max(preferred.height, childSize.height);
+        }
+        else
+        {  
+          preferred.height += childSize.height;
+          preferred.width = Math.max(preferred.width, childSize.width);
+        }
+      }                                                 
+
+      int childrenSize = children.size();
+      if (childrenSize > 1)
+      {                      
+        if (isHorizontal)    
+        {
+          preferred.width += spacing * (childrenSize - 1);
+        }
+        else
+        {
+          preferred.height += spacing * (childrenSize - 1);
+        } 
+      }
+                            
+      preferred.width += border * 2;
+      preferred.height += border * 2;
+      preferred.width += parent.getInsets().getWidth();
+      preferred.height += parent.getInsets().getHeight();      
+    }
+    return preferred;
+  }
+
+                
+  protected int alignFigure(IFigure parent, IFigure child)
+  {         
+    int y = -1;                                                            
+    return y;
+  }
+
+  public void layout(IFigure parent)
+  {                        
+    List children = parent.getChildren();
+    Dimension preferred = new Dimension();
+
+    int rx = 0;
+    for (int i=0; i < children.size(); i++)
+    {
+      IFigure child = (IFigure)children.get(i);
+      Dimension childSize = child.getPreferredSize();
+      if (isHorizontal)
+      {   
+        preferred.height = Math.max(preferred.height, childSize.height);
+        rx += childSize.width;
+      }
+      else
+      {
+        preferred.width = Math.max(preferred.width, childSize.width);
+      }
+    }
+
+    if (isHorizontal)
+    {
+      preferred.height += border*2;
+      preferred.width += border;
+    }
+    else
+    {
+      preferred.width += border*2;
+      preferred.height += border;
+    }
+
+    int childrenSize = children.size(); 
+    for (int i=0; i < childrenSize; i++)
+    {
+      IFigure child = (IFigure)children.get(i);
+      Dimension childSize = child.getPreferredSize();
+      
+      if (isHorizontal)
+      {   
+        int y = alignFigure(parent, child);             
+
+      
+        if (y == -1)
+        {
+           y = (preferred.height - childSize.height) / 2;                                      
+        }      
+
+        Rectangle rectangle = new Rectangle(preferred.width, y, childSize.width, childSize.height);   
+        rectangle.translate(parent.getClientArea().getLocation());
+
+        child.setBounds(rectangle);         
+        preferred.width += childSize.width; 
+        preferred.width += spacing;   
+        
+        if (child instanceof SpacingFigure)
+        {          
+          int availableHorizontalSpace = parent.getClientArea().width - rx;
+          preferred.width += availableHorizontalSpace;
+        } 
+      }
+      else
+      {
+        Rectangle rectangle = new Rectangle(0, preferred.height, childSize.width, childSize.height);
+        rectangle.translate(parent.getClientArea().getLocation());
+        child.setBounds(rectangle);  
+        preferred.height += childSize.height;
+        preferred.height += spacing;
+      }
+    }     
+  }      
+  
+  public void postLayout(IFigure figure)
+  {       
+    // This method attempts to align a 'FloatableFigure' (e.g. an Element node) 
+    // with any content that it is connected to.  This way a chain of connected figures
+    // will be vertically aligned (e.g. element -> modelgroup -> element).  Any visible clipping of the
+    // figures in the graph is probably a result of a bug in this code that results in a 'FloatableFigure' being
+    // repositioned beyond the bounds of its parent.
+    //     
+    for (Iterator i = figure.getChildren().iterator(); i.hasNext();)
+    {
+      IFigure child = (IFigure)i.next();
+      if (child instanceof FloatableFigure)       
+      {        
+        FloatableFigure floatableFigure = (FloatableFigure)child;
+        GraphNodeFigure graphNodeFigure = floatableFigure.getGraphNodeFigure(); 
+        if (graphNodeFigure.isExpanded() && graphNodeFigure.getChildGraphNodeFigures().size() == 1)
+        {
+          GraphNodeFigure alignedChild = (GraphNodeFigure)graphNodeFigure.getChildGraphNodeFigures().get(0);      
+          Rectangle alignedChildBounds = alignedChild.getConnectionRectangle();                            
+          Rectangle childBounds = child.getBounds();
+        
+          int l = childBounds.y + childBounds.height/2;
+          int r = alignedChildBounds.y + alignedChildBounds.height/2;       
+          int delta = r - l;
+
+          fixUp(child, delta);
+        }          
+      }
+    }      
+  }      
+  
+  protected void fixUp(IFigure figure, int delta)
+  { 
+    Rectangle bounds = figure.getBounds();
+    bounds.y += delta;
+    figure.setBounds(bounds);
+      
+    for (Iterator i = figure.getChildren().iterator(); i.hasNext(); )
+    {
+      IFigure child = (IFigure)i.next();
+      fixUp(child, delta);
+    }                       
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ExpandableGraphNodeFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ExpandableGraphNodeFigure.java
new file mode 100644
index 0000000..e339103
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/ExpandableGraphNodeFigure.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+            
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+              
+
+//  ------------------------------------------------------------
+//  | ExpandableGraphNodeFigure                                |
+//  |                                                          |
+//  |   ----------------------------------   ---------------   |
+//  |   | verticalGroup                  |   |             |   |
+//  |   |                                |   |             |   |
+//  |   | -----------------------------  |   |             |   |
+//  |   | | horizontalGroup           |  |   |             |   |
+//  |   | |                           |  |   |             |   |
+//  |   | | ---------------------     |  |   |             |   |
+//  |   | | | outlinedArea      |     |  |   |             |   |
+//  |   | | | ----------------- |     |  |   |  outer      |   |
+//  |   | | | | iconArea      | |     |  |   |  Content    |   |
+//  |   | | | ----------------- | [+] |  |   |  Area       |   |
+//  |   | | | ----------------- |     |  |   |             |   |
+//  |   | | | | innerContent  | |     |  |   |             |   |
+//  |   | | | ----------------- |     |  |   |             |   |
+//  |   | | ---------------------     |  |   |             |   |
+//  |   | -----------------------------  |   |             |   |
+//  |   |                                |   |             |   |
+//  |   |   ------------------           |   |             |   |
+//  |   |   | occurenceArea  |           |   |             |   |
+//  |   |   ------------------           |   |             |   |
+//  |   ----------------------------------   ---------------   |
+//  ------------------------------------------------------------
+
+public class ExpandableGraphNodeFigure extends RepeatableGraphNodeFigure
+{                        
+  protected ContainerFigure horizontalGroup;
+  protected Interactor interactor; 
+  protected ContainerFigure outerContentArea;
+
+  public boolean isExpanded()
+  {
+    return interactor.isExpanded();
+  }   
+
+  public void setExpanded(boolean isExpanded)
+  {
+    interactor.setExpanded(isExpanded);
+  }
+  
+  public ExpandableGraphNodeFigure()
+  {
+    super();    
+    isConnected = true;
+  }      
+
+  protected void createFigure()
+  {   
+    createPreceedingSpace(this);           
+    createVerticalGroup(this);
+    createHorizontalGroup(verticalGroup);
+    createOutlinedArea(horizontalGroup);   
+    createInteractor(horizontalGroup);
+    createOccurenceArea(verticalGroup);   
+    createOuterContentArea(this);
+  }
+  
+  protected void createVerticalGroup(IFigure parent)
+  {
+    verticalGroup = new FloatableFigure(this);
+    verticalGroup.getContainerLayout().setHorizontal(false);
+    parent.add(verticalGroup);
+  }
+
+  protected void createHorizontalGroup(IFigure parent)
+  {
+    horizontalGroup = new ContainerFigure();
+    parent.add(horizontalGroup);
+  }                 
+
+  protected void createInteractor(IFigure parent)
+  {
+    interactor = new Interactor();
+    interactor.setForegroundColor(ColorConstants.black);
+    interactor.setBackgroundColor(ColorConstants.white); 
+    parent.add(interactor);
+  } 
+
+  protected void createOuterContentArea(IFigure parent)
+  {
+    // create a small space between the interactor and the contentArea
+    //
+    RectangleFigure space = new RectangleFigure();
+    space.setVisible(false);
+    space.setPreferredSize(new Dimension(5, 10));
+    parent.add(space);   
+      
+    outerContentArea = new GraphNodeContainerFigure(this);
+    outerContentArea.getContainerLayout().setHorizontal(false);
+    parent.add(outerContentArea);
+  }
+
+  public Interactor getInteractor()
+  {
+    return interactor;
+  } 
+
+  public ContainerFigure getOuterContentArea()
+  {
+    return outerContentArea;
+  }
+     
+  public IFigure getConnectionFigure()
+  {
+    return horizontalGroup;
+  }
+
+  public Rectangle getConnectionRectangle()
+  {
+    return horizontalGroup.getBounds();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/FillLayout.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/FillLayout.java
new file mode 100644
index 0000000..e358c0c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/FillLayout.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.draw2d.AbstractLayout;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+
+/**
+ * Figures using the StackLayout as their layout manager have
+ * their children placed on top of one another. Order of 
+ * placement is determined by the order in which the children
+ * were added, first child added placed on the bottom.
+ */
+public class FillLayout extends AbstractLayout
+{
+         
+protected boolean isHorizontal = false;                    
+protected int spacing = 0;
+public Dimension min;  
+
+public FillLayout(){}     
+public FillLayout(boolean dummy){} 
+
+public FillLayout(int spacing)
+{ 
+  this.spacing = spacing; 
+}
+
+public void setHorizontal(boolean isHorizontal)
+{
+ this.isHorizontal = isHorizontal;
+}
+
+/**
+ * Calculates and returns the preferred size of the input container.
+ * This is the size of the largest child of the container, as all
+ * other children fit into this size.
+ *
+ * @param figure  Container figure for which preferred size is required.
+ * @return  The preferred size of the input figure.
+ * @since 2.0
+ */
+protected Dimension calculatePreferredSize(IFigure figure, int w, int h)
+{	                 
+  Dimension d = calculatePreferredClientAreaSize(figure);
+	d.expand(figure.getInsets().getWidth(),
+	         figure.getInsets().getHeight());
+	//d.union(getBorderPreferredSize(figure));
+	return d;
+} 
+
+protected Dimension calculatePreferredClientAreaSize(IFigure figure)
+{
+  Dimension d = new Dimension();
+	List children = figure.getChildren(); 
+
+
+	for (Iterator i = children.iterator(); i.hasNext(); )
+  {
+		IFigure child = (IFigure)i.next();
+    Dimension childSize = child.getPreferredSize();
+
+    if (isHorizontal)
+    {
+      d.width += childSize.width;
+      d.height = Math.max(childSize.height, d.height);
+    }
+    else
+    {
+      d.height += childSize.height;
+      d.width = Math.max(childSize.width, d.width);
+    }
+	}	 
+
+                   
+  int childrenSize = children.size();       
+  if (childrenSize > 0)
+  {
+    if (isHorizontal)
+      d.width += spacing * (childrenSize - 1); 
+    else
+      d.height += spacing * (childrenSize - 1);
+  }       
+    
+  if (min != null)
+  {
+    d.width = Math.max(d.width, min.width);
+    d.height = Math.max(d.height, min.height);
+  }
+  return d;
+}
+
+/*
+ * Returns the minimum size required by the input container.
+ * This is the size of the largest child of the container, as all
+ * other children fit into this size.
+ */
+public Dimension getMinimumSize(IFigure figure, int w, int h)
+{
+	Dimension d = new Dimension();
+	List children = figure.getChildren();
+	IFigure child;
+	for (int i=0; i < children.size(); i++){
+		child = (IFigure)children.get(i);
+		d.union(child.getMinimumSize());
+	}
+	d.expand(figure.getInsets().getWidth(),
+	         figure.getInsets().getHeight());
+	return d;
+}
+
+public Dimension getPreferredSize(IFigure figure, int w, int h)
+{
+	return calculatePreferredSize(figure, w, h);
+}
+
+/*
+ * Lays out the children on top of each other with
+ * their sizes equal to that of the available
+ * paintable area of the input container figure.
+ */
+public void layout(IFigure figure){   
+                     
+  Dimension	preferredSize = calculatePreferredClientAreaSize(figure);
+	Rectangle r = figure.getClientArea().getCopy(); 
+
+	List children = figure.getChildren();
+                                        
+	for (Iterator i = children.iterator(); i.hasNext(); )
+  {
+		IFigure child = (IFigure)i.next();
+    Dimension childSize = child.getPreferredSize();
+
+    if (isHorizontal)
+    {
+		  child.setBounds(new Rectangle(r.x, r.y, childSize.width, Math.max(preferredSize.height, r.height)));
+      r.x += childSize.width + spacing;
+    }
+    else
+    {            
+		  child.setBounds(new Rectangle(r.x, r.y, Math.max(preferredSize.width, r.width), childSize.height));
+      r.y += childSize.height + spacing;
+    }
+	}
+}
+} 
+ 
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/FloatableFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/FloatableFigure.java
new file mode 100644
index 0000000..c224145
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/FloatableFigure.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+            
+              
+
+public class FloatableFigure extends ContainerFigure
+{               
+  public GraphNodeFigure graphNodeFigure;  
+
+  public FloatableFigure(GraphNodeFigure graphNodeFigure)
+  {                  
+    super();
+    this.graphNodeFigure = graphNodeFigure;
+  }   
+
+  public GraphNodeFigure getGraphNodeFigure()
+  {
+    return graphNodeFigure;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/GraphNodeContainerFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/GraphNodeContainerFigure.java
new file mode 100644
index 0000000..c06a655
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/GraphNodeContainerFigure.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+            
+              
+
+public class GraphNodeContainerFigure extends ContainerFigure
+{               
+  public ExpandableGraphNodeFigure expandableGraphNodeFigure;  
+
+  public GraphNodeContainerFigure(ExpandableGraphNodeFigure expandableGraphNodeFigure)
+  {                  
+    super();
+    this.expandableGraphNodeFigure = expandableGraphNodeFigure;
+  }     
+
+  public boolean isExpanded()
+  {
+    return expandableGraphNodeFigure.isExpanded();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/GraphNodeFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/GraphNodeFigure.java
new file mode 100644
index 0000000..3d9706d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/GraphNodeFigure.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+            
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.geometry.Rectangle;
+              
+
+//  ------------------------------
+//  | GraphNodeFigure            |
+//  |                            |
+//  | -------------------------  |
+//  | | vertical group        |  |
+//  | | --------------------- |  |
+//  | | | outlined area     | |  |
+//  | | | ----------------- | |  |
+//  | | | | icon area     | | |  |
+//  | | | ----------------- | |  |
+//  | | | ----------------- | |  |
+//  | | | | inner content | | |  |
+//  | | | ----------------- | |  |
+//  | | --------------------- |  |
+//  | -------------------------  |
+//  ------------------------------
+
+public class GraphNodeFigure extends ContainerFigure
+{                        
+  protected ContainerFigure verticalGroup; 
+  protected ContainerFigure outlinedArea;
+  protected ContainerFigure iconArea;
+  protected ContainerFigure innerContentArea; 
+         
+  protected boolean isConnected;
+  protected boolean isIsolated;
+
+  protected List childGraphNodeFigures = new ArrayList();
+  protected GraphNodeFigure parentGraphNodeFigure; 
+
+  public GraphNodeFigure()
+  { 
+    isIsolated = false;
+    createFigure();
+  }      
+
+  public boolean isExpanded()
+  {
+    return true;
+  }    
+
+  public boolean isConnected()
+  {
+    return isConnected;
+  }                    
+
+  public void setConnected(boolean isConnected)
+  {
+    this.isConnected = isConnected;
+  }
+
+  public void setIsIsolated(boolean isIsolated)
+  {
+    this.isIsolated = isIsolated; 
+  }
+
+  public boolean getIsIsolated()
+  {
+    return isIsolated; 
+  }
+
+  protected void createFigure()
+  {
+    createVerticalGroup(this);
+    createOutlinedArea(verticalGroup); 
+  }
+
+  protected void createVerticalGroup(IFigure parent)
+  {
+    verticalGroup = new ContainerFigure();
+    verticalGroup.getContainerLayout().setHorizontal(false);
+    parent.add(verticalGroup);
+  }
+
+  protected void createOutlinedArea(IFigure parent)
+  { 
+    outlinedArea = new ContainerFigure();
+    outlinedArea.getContainerLayout().setHorizontal(false);
+    parent.add(outlinedArea);      
+     
+    iconArea = new ContainerFigure();
+    outlinedArea.add(iconArea);
+
+    innerContentArea = new ContainerFigure();
+    innerContentArea.getContainerLayout().setHorizontal(false);
+    outlinedArea.add(innerContentArea);  
+  }   
+
+  public ContainerFigure getIconArea()
+  {
+    return iconArea;
+  }
+
+  public ContainerFigure getOutlinedArea()
+  {
+    return outlinedArea;
+  }
+
+  public ContainerFigure getInnerContentArea()
+  {
+    return innerContentArea;
+  } 
+
+  public IFigure getConnectionFigure()
+  {
+    return outlinedArea;
+  }
+
+  public Rectangle getConnectionRectangle()
+  {
+    return outlinedArea.getBounds();
+  }
+
+  public List getChildGraphNodeFigures()
+  {
+    return childGraphNodeFigures;
+  }
+
+  public void addNotify()                     
+  {
+    super.addNotify();                 
+    if (isConnected())
+    {
+      parentGraphNodeFigure = computeParentGraphNodeFigure(this);
+      if (parentGraphNodeFigure != null)
+      {   
+        parentGraphNodeFigure.getChildGraphNodeFigures().add(this);
+      }   
+    }
+  } 
+
+  public void removeNotify()
+  {     
+    super.removeNotify();
+    if (parentGraphNodeFigure != null)
+    {   
+      parentGraphNodeFigure.getChildGraphNodeFigures().remove(this);
+    }  
+  }
+
+  public GraphNodeFigure getParentGraphNodeFigure()
+  {
+    return parentGraphNodeFigure;
+  }  
+
+  public GraphNodeFigure computeParentGraphNodeFigure(IFigure figure)
+  {                   
+    GraphNodeFigure result = null;
+    IFigure parent = figure != null ? figure.getParent() : null;
+    while (parent != null)
+    {
+      if (parent instanceof GraphNodeFigure)
+      {    
+        GraphNodeFigure parentGraphNodeFigure = (GraphNodeFigure)parent;
+        if (parentGraphNodeFigure.isConnected())
+        {
+          result = (GraphNodeFigure)parent;
+          break;
+        }
+      }
+      parent = parent.getParent();
+    }   
+    return result;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/Interactor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/Interactor.java
new file mode 100644
index 0000000..7a64b8f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/Interactor.java
@@ -0,0 +1,54 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+            
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+
+/**
+ * Interactor the +/- control commonly found in trees
+ */
+public class Interactor extends RectangleFigure
+{
+  protected boolean isExpanded;
+
+  public Interactor()
+  {
+    super(); 
+    setPreferredSize(new Dimension(9, 9));               
+  }  
+
+  public void setExpanded(boolean isExpanded)
+  {                                         
+    this.isExpanded = isExpanded;
+  }
+
+  public boolean isExpanded()
+  {
+    return isExpanded;
+  }
+    
+  protected void fillShape(Graphics g)
+  {
+    super.fillShape(g);
+    Rectangle r = getBounds();                          
+    int mx = r.x + r.width / 2;
+    int my = r.y + r.height / 2;    
+    int s = 2;       
+    g.drawLine(r.x + s, my, r.x + r.width - s - 1, my); 
+    if (!isExpanded)
+    {
+      g.drawLine(mx, r.y + s, mx, r.y + r.height - s -1);
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/LabelFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/LabelFigure.java
new file mode 100644
index 0000000..04c82b8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/LabelFigure.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+            
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.FigureUtilities;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.draw2d.geometry.Rectangle;
+              
+
+public class LabelFigure extends Figure
+{                                                
+  protected String text = "";  
+  protected boolean isShowEmptyLabel = true;
+  protected int left = 4; 
+  protected int right = 4; 
+  protected int textHeight;
+  protected int textWidth;
+                       
+  public LabelFigure()
+  {
+    setPreferredSize(new Dimension());
+  }  
+
+  protected void setLeft(int left)
+  {
+    this.left = left;
+  }
+
+  protected void setRight(int right)
+  {
+    this.right = right;
+  }
+
+  public void setShowEmptyLabel(boolean isShowEmptyLabel)
+  {
+    this.isShowEmptyLabel = isShowEmptyLabel;
+  }     
+       
+
+  public void setText(String s)
+  { 
+	  if (s == null)
+		  s = "";
+
+    if (!text.equals(s))
+    {
+	    text = s;
+      if (text.length() > 0 || isShowEmptyLabel)
+      {
+        textHeight = FigureUtilities.getFontMetrics(getFont()).getHeight();
+        textWidth = FigureUtilities.getTextWidth(text, getFont());
+        textWidth = Math.max(textWidth, FigureUtilities.getTextWidth("abcdefg", getFont()));
+        setPreferredSize(new Dimension(textWidth + left + right, textHeight));
+      } 
+      else
+      {
+        setPreferredSize(new Dimension());
+      } 
+    }   
+    //revalidate(); 
+    //repaint();
+  }
+
+
+  
+  protected void paintFigure(Graphics graphics)
+  //protected void fillShape(Graphics graphics)
+  {  
+    super.paintFigure(graphics);
+    //super.fillShape(graphics);
+    if (text.length() > 0)
+    {
+      Rectangle r = getBounds();
+		  graphics.setForegroundColor(getForegroundColor());
+      graphics.drawString(text, left + r.x, r.y);// + (r.width - textWidth)/2, r.y + (r.height - textHeight)/2);           
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/PostLayoutManager.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/PostLayoutManager.java
new file mode 100644
index 0000000..21a1f54
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/PostLayoutManager.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+
+import org.eclipse.draw2d.IFigure;
+
+
+public interface PostLayoutManager
+{
+  public void postLayout(IFigure figure);                    
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/RepeatableGraphNodeFigure.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/RepeatableGraphNodeFigure.java
new file mode 100644
index 0000000..fd8d249
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/RepeatableGraphNodeFigure.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.RectangleFigure;
+import org.eclipse.draw2d.geometry.Dimension;
+import org.eclipse.wst.xsd.ui.internal.graph.GraphicsConstants;
+
+
+              
+
+//  ------------------------------
+//  | RepeatableGraphNodeFigure  |
+//  |                            |
+//  | -------------------------  |
+//  | | vertical group        |  |
+//  | | --------------------- |  |
+//  | | | outlined area     | |  |
+//  | | | ----------------- | |  |
+//  | | | | icon area     | | |  |
+//  | | | ----------------- | |  |
+//  | | | ----------------- | |  |
+//  | | | | inner content | | |  |
+//  | | | ----------------- | |  |
+//  | | --------------------- |  |
+//  | |                       |  |
+//  | | ------------------    |  |
+//  | | | occurence area |    |  |
+//  | | ------------------    |  |
+//  | -------------------------  |
+//  ------------------------------
+
+public class RepeatableGraphNodeFigure extends GraphNodeFigure
+{                            
+  protected ContainerFigure occurenceArea;  
+  protected LabelFigure occurenceLabel; 
+
+  public RepeatableGraphNodeFigure()
+  {    
+    super();          
+  }     
+
+  protected void createFigure()
+  {                  
+    createPreceedingSpace(this);
+    createVerticalGroup(this);
+    createOutlinedArea(verticalGroup); 
+    createOccurenceArea(verticalGroup);
+  }
+
+  protected void createOccurenceArea(IFigure parent)
+  {
+    occurenceArea = new ContainerFigure();   
+    occurenceLabel = new LabelFigure();
+    occurenceLabel.setForegroundColor(ColorConstants.black);
+    occurenceLabel.setShowEmptyLabel(false);
+    occurenceLabel.setFont(GraphicsConstants.medium); 
+    occurenceArea.add(occurenceLabel);               
+    parent.add(occurenceArea);
+  }
+                                 
+  protected void createPreceedingSpace(IFigure parent)
+  {
+    // create a small space
+    RectangleFigure space = new RectangleFigure();
+    space.setVisible(false);
+    space.setPreferredSize(new Dimension(10, 10));
+    parent.add(space);  
+  } 
+
+  public LabelFigure getOccurenceLabel()
+  {
+    return occurenceLabel;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/RoundedLineBorder.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/RoundedLineBorder.java
new file mode 100644
index 0000000..75dbff7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/figures/RoundedLineBorder.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.figures;
+            
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.LineBorder;
+import org.eclipse.draw2d.geometry.Insets;
+import org.eclipse.swt.graphics.Color;
+              
+
+public class RoundedLineBorder extends LineBorder
+{               
+  protected int arcLength;   
+  protected int lineStyle = Graphics.LINE_SOLID;
+
+  public RoundedLineBorder(Color c, int width, int arcLength)
+  {
+	  super(c, width);     
+    this.arcLength = arcLength;
+  }
+
+  public RoundedLineBorder(int width, int arcLength)
+  {
+	  super(width);     
+    this.arcLength = arcLength;
+  }
+  
+  public RoundedLineBorder(Color c, int width, int arcLength, int lineStyle)
+  {
+    super(c, width);
+    this.arcLength = arcLength;
+    this.lineStyle = lineStyle;
+  }
+
+  public RoundedLineBorder(int width, int arcLength, int lineStyle)
+  {
+    super(width);
+    this.arcLength = arcLength;
+    this.lineStyle = lineStyle;
+  }
+
+  public void paint(IFigure figure, Graphics graphics, Insets insets)
+  {
+      int rlbWidth = getWidth();
+	  tempRect.setBounds(getPaintRectangle(figure, insets));
+  	if (rlbWidth%2 == 1)
+    {
+		  tempRect.width--;
+		  tempRect.height--;
+	  }
+	  tempRect.shrink(rlbWidth/2,rlbWidth/2);
+	  graphics.setLineWidth(rlbWidth);
+    graphics.setLineStyle(lineStyle);
+	  if (getColor() != null)
+		  graphics.setForegroundColor(getColor());
+	  graphics.drawRoundRectangle(tempRect, arcLength, arcLength);
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/Category.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/Category.java
new file mode 100644
index 0000000..bd99148
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/Category.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.model;
+                                   
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNotationDeclaration;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+
+public class Category implements ModelAdapter
+{
+  public final static int ATTRIBUTES = 1;
+  public final static int ELEMENTS = 2;
+  public final static int TYPES = 3;
+  public final static int GROUPS = 5;
+  public final static int DIRECTIVES = 6;
+  public final static int NOTATIONS = 7;
+  public final static int ATTRIBUTE_GROUPS = 8;
+  public final static int IDENTITY_CONSTRAINTS = 9;
+  public final static int ANNOTATIONS = 10;
+
+  
+  protected XSDSchema schema;
+  protected int groupType;
+
+  //public void modelNameChanged();
+  public Category(XSDSchema schema, int groupType)
+  {
+    this.schema = schema;
+    this.groupType = groupType;
+  }       
+
+  public int getGroupType()
+  {
+    return groupType;
+  }   
+
+  public XSDSchema getXSDSchema()
+  {
+    return schema;
+  }
+
+  public String getName()
+  {
+    String name = "";
+    switch (groupType)
+    {
+      case ATTRIBUTES       : { name = XSDEditorPlugin.getXSDString("_UI_GRAPH_ATTRIBUTES"); break; }
+      case NOTATIONS        : { name = XSDEditorPlugin.getXSDString("_UI_GRAPH_NOTATIONS"); break; }
+      case ELEMENTS         : { name = XSDEditorPlugin.getXSDString("_UI_GRAPH_ELEMENTS"); break; }
+      case TYPES             : { name = XSDEditorPlugin.getXSDString("_UI_GRAPH_TYPES"); break; }    
+      case GROUPS           : { name = XSDEditorPlugin.getXSDString("_UI_GRAPH_GROUPS"); break; }      
+      case DIRECTIVES       : { name = XSDEditorPlugin.getXSDString("_UI_GRAPH_DIRECTIVES"); break; }
+    }      
+    return name;
+  }
+              
+  public List getChildren()
+  {                      
+    List list = Collections.EMPTY_LIST;
+    switch (groupType)
+    {
+      case ATTRIBUTES       : { list = getAttributeList(); break; }
+      case NOTATIONS        : { list = getNotations(); break; }
+      case ELEMENTS         : { list = getGlobalElements(); break; }
+      case TYPES            : { list = getTypes();  break; }
+      case GROUPS           : { list = getGroups(); break; }
+      case DIRECTIVES       : { list = getDirectives(); break; }
+    }      
+    return list;
+  }
+  
+  private boolean isSameNamespace(String ns1, String ns2)
+  {
+    if (ns1 == null) ns1 = "";
+    if (ns2 == null) ns2 = "";
+    
+    if (ns1.equals(ns2))
+    {
+      return true;
+    }
+    return false;
+  }
+  
+  protected List getGlobalElements()
+  {
+    List elements = schema.getElementDeclarations();
+    List list = new ArrayList();
+    for (Iterator i = elements.iterator(); i.hasNext(); )
+    {
+      XSDElementDeclaration elem = (XSDElementDeclaration)i.next();
+      String targetNamespace = elem.getTargetNamespace();
+      if (isSameNamespace(elem.getTargetNamespace(),schema.getTargetNamespace()))
+      {
+        list.add(elem);
+      }
+    }                
+    return list;
+  }
+
+  protected List getTypes()
+  {
+    List allTypes = schema.getTypeDefinitions();
+    List list = new ArrayList();
+    for (Iterator i = allTypes.iterator(); i.hasNext(); )
+    {
+      XSDTypeDefinition td = (XSDTypeDefinition)i.next();
+      if (td instanceof XSDComplexTypeDefinition)
+      {
+        XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)td;
+        if (isSameNamespace(ct.getTargetNamespace(),schema.getTargetNamespace()))
+        {
+          list.add(ct);
+        }
+      }
+    }                
+
+//    List simpleTypes = schema.getTypeDefinitions();
+    for (Iterator i = allTypes.iterator(); i.hasNext(); )
+    {
+      XSDTypeDefinition td = (XSDTypeDefinition)i.next();
+      if (td instanceof XSDSimpleTypeDefinition)
+      {
+        XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)td;
+        if (isSameNamespace(st.getTargetNamespace(),schema.getTargetNamespace()))
+        {
+          list.add(st);
+        }
+      }
+    }                
+    return list;
+  }
+  
+  protected List getGroups()
+  {
+    List groups = schema.getModelGroupDefinitions();
+    List list = new ArrayList();
+    for (Iterator i = groups.iterator(); i.hasNext(); )
+    {
+      XSDModelGroupDefinition group = (XSDModelGroupDefinition)i.next();
+      if (isSameNamespace(group.getTargetNamespace(),schema.getTargetNamespace()))
+      {
+        list.add(group);
+      }
+    }                
+    return list;
+  }
+  
+  protected List getDirectives()
+  {                 
+    List list = new ArrayList();
+    for (Iterator i = schema.getContents().iterator(); i.hasNext(); )
+    {
+      Object o = i.next();
+      if (o instanceof XSDSchemaDirective)
+      {
+        list.add(o);
+      }
+    } 
+    return list;
+  }
+
+  protected List getAttributeList()
+  {
+    List attributesList = new ArrayList();
+    for (Iterator iter = schema.getAttributeDeclarations().iterator(); iter.hasNext(); )
+    {
+      Object o = iter.next();
+      if (o instanceof XSDAttributeDeclaration)
+      {
+        XSDAttributeDeclaration attr = (XSDAttributeDeclaration)o;
+        if (attr != null)
+        {
+          if (attr.getTargetNamespace() != null)
+          {
+            if (!(attr.getTargetNamespace().equals("http://www.w3.org/2001/XMLSchema-instance")))
+            {
+              if (isSameNamespace(attr.getTargetNamespace(), schema.getTargetNamespace()))
+              {
+                attributesList.add(attr);
+              }
+            }
+          }
+          else
+          {
+            if (isSameNamespace(attr.getTargetNamespace(),schema.getTargetNamespace()))
+            {
+              attributesList.add(attr);
+            }
+          }
+        }
+      }
+    }
+    return attributesList;
+  }
+
+  protected List getNotations()
+  {
+    List notations = schema.getNotationDeclarations();
+    List list = new ArrayList();
+    for (Iterator i = notations.iterator(); i.hasNext(); )
+    {
+      XSDNotationDeclaration notation = (XSDNotationDeclaration)i.next();
+      if (isSameNamespace(notation.getTargetNamespace(),schema.getTargetNamespace()))
+      {
+        list.add(notation);
+      }
+    }                
+    return list;
+  }
+  
+  //
+  protected List listenerList = new ArrayList();
+                                                                                           
+  public void addListener(ModelAdapterListener l)
+  {
+    listenerList.add(l);
+  }  
+
+  public void removeListener(ModelAdapterListener l)
+  {
+    listenerList.remove(l);
+  } 
+
+  public Object getProperty(Object modelObject, String propertyName)
+  {
+    return null;
+  }
+
+  public void firePropertyChanged(Object modelObject, String propertyName)
+  {
+    List newList = new ArrayList();
+    newList.addAll(listenerList);
+    for (Iterator i = newList.iterator(); i.hasNext(); )
+    {
+      ModelAdapterListener l = (ModelAdapterListener)i.next();                  
+      try
+      {
+        l.propertyChanged(modelObject, propertyName);
+      }
+      catch (Exception e)
+      {
+      }
+    }
+  }  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/ModelAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/ModelAdapter.java
new file mode 100644
index 0000000..3066987
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/ModelAdapter.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.model;
+
+
+
+public interface ModelAdapter
+{               
+  public static final String CHILDREN_PROPERTY = "CHILDREN_PROPERTY";
+  public static final String LABEL_PROPERTY = "LABEL_PROPERTY";
+  public static final String IMAGE_PROPERTY = "IMAGE_PROPERTY";
+  public static final String DETAIL_PROPERTY = "DETAIL_PROPERTY";
+                                       
+  public void addListener(ModelAdapterListener l);
+  public void removeListener(ModelAdapterListener l);
+  public Object getProperty(Object modelObject, String propertyName); 
+  public void firePropertyChanged(Object modelObject, String propertyName);
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/ModelAdapterListener.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/ModelAdapterListener.java
new file mode 100644
index 0000000..ff6e4db
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/ModelAdapterListener.java
@@ -0,0 +1,18 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.model;
+
+
+
+public interface ModelAdapterListener
+{                             
+  public void propertyChanged(Object object, String property);
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/XSDModelAdapterFactory.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/XSDModelAdapterFactory.java
new file mode 100644
index 0000000..471aebb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/graph/model/XSDModelAdapterFactory.java
@@ -0,0 +1,511 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.graph.model;
+
+import java.util.ArrayList;
+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.Notifier;
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDAbstractAdapter;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDModelAdapterFactoryImpl;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDSwitch;
+
+
+
+
+public class XSDModelAdapterFactory
+{  
+  protected static XSDModelAdapterFactory instance;
+  protected static XSDAdapterFactoryImpl xsdAdapterFactoryImpl = new XSDAdapterFactoryImpl();
+                                              
+  public static XSDModelAdapterFactory getInstance()
+  {
+    if (instance == null)
+    {
+      instance = new XSDModelAdapterFactory();
+    }                                         
+    return instance;
+  }
+
+
+  public static ModelAdapter getAdapter(Object o)
+  {                             
+    ModelAdapter result = null;
+    if (o instanceof Notifier)
+    {                                
+      Notifier target = (Notifier)o;
+		  Adapter adapter = xsdAdapterFactoryImpl.adapt(target);
+      if (adapter instanceof XSDObjectAdapter)
+      {
+        result = (XSDObjectAdapter)adapter;
+      }
+    }                              
+    else if (o instanceof ModelAdapter)
+    {
+      result = (ModelAdapter)o;
+    }
+    return result;
+  }             
+    
+
+  public static XSDObjectAdapter getExisitingAdapter(Object xsdObject)
+  {  
+    XSDObjectAdapter result = null;
+    if (xsdObject instanceof Notifier)
+    {                                
+      Notifier target = (Notifier)xsdObject;
+		  Adapter adapter = EcoreUtil.getExistingAdapter(target,xsdAdapterFactoryImpl);
+      if (adapter instanceof XSDObjectAdapter)
+      {
+        result = (XSDObjectAdapter)adapter;
+      }
+    }
+    return result;
+  }
+   
+  //
+  //
+  //
+  public static class XSDAdapterFactoryImpl extends AdapterFactoryImpl
+  {
+    public Adapter createAdapter(Notifier target)
+    {
+      XSDSwitch xsdSwitch = new XSDSwitch()
+      {                   
+        public Object caseXSDElementDeclaration(XSDElementDeclaration object)
+        {
+          return new XSDElementDeclarationAdapter(object);
+        }
+
+        public Object caseXSDSchema(XSDSchema object) 
+        {
+          return new XSDSchemaAdapter(object);
+        }
+
+        public Object defaultCase(EObject object) 
+        {
+          return new XSDObjectAdapter();
+        }         
+      };
+      Object o = xsdSwitch.doSwitch((EObject)target);
+
+      Adapter result = null;
+      if (o instanceof Adapter)
+      {
+        result  = (Adapter)o;
+      }
+      else
+      {          
+//        System.out.println("did not create adapter for target : " + target);
+//        Thread.dumpStack();
+      }
+      return result;
+    }      
+                               
+
+    public Adapter adapt(Notifier target)
+    {
+      return adapt(target, this);
+    }
+  }
+    
+
+ 
+  //
+  //
+  //
+  protected static class XSDObjectAdapter extends AdapterImpl implements ModelAdapter
+  {   
+    protected List listenerList = new ArrayList();
+    protected boolean isUpdating = false;
+                                  
+    public boolean isAdapterForType(Object type)
+    {
+      return type == xsdAdapterFactoryImpl;
+    }                                             
+                
+    public void addListener(ModelAdapterListener l)
+    {
+      listenerList.add(l);
+    }  
+
+    public void removeListener(ModelAdapterListener l)
+    {
+      listenerList.remove(l);
+    } 
+                
+    public Object getProperty(Object modelObject, String propertyName)
+    {
+      Object result = null;
+      if (ModelAdapter.LABEL_PROPERTY.equals(propertyName))
+      {
+      	result = "";
+      	// TODO... move this logic into each adapter
+      	//
+        if (modelObject instanceof XSDNamedComponent)
+        {
+      	  result = ((XSDNamedComponent)modelObject).getName();
+        }
+        else if (modelObject instanceof XSDSchemaDirective)
+        {
+       	  result = ((XSDSchemaDirective)modelObject).getSchemaLocation();
+          if (result == null) result = "(" + XSDEditorPlugin.getXSDString("_UI_LABEL_NO_LOCATION_SPECIFIED") + ")";
+          if (result.equals("")) result = "(" + XSDEditorPlugin.getXSDString("_UI_LABEL_NO_LOCATION_SPECIFIED") + ")";
+          return result;
+        }
+      }
+      else if ("drillDown".equals(propertyName))
+      {
+      	// TODO... move this logic into each adapter
+      	//   
+      	List list = XSDChildUtility.getModelChildren(modelObject);	
+      	result = list.size() > 0 ? Boolean.TRUE : Boolean.FALSE;      	   
+      }      
+      else if (ModelAdapter.IMAGE_PROPERTY.equals(propertyName))
+      {
+      	// result = XSDEditorPlugin.getDefault().getImage("icons/XSDElement.gif");
+        XSDModelAdapterFactoryImpl factory = new XSDModelAdapterFactoryImpl();
+        Adapter adapter = factory.createAdapter((Notifier)modelObject);
+        result = ((XSDAbstractAdapter)adapter).getImage(modelObject);
+      }	
+      return result;
+    }
+
+    public void firePropertyChanged(Object modelObject, String propertyName)
+    {
+      List newList = new ArrayList();
+      newList.addAll(listenerList);
+      for (Iterator i = newList.iterator(); i.hasNext(); )
+      {
+        ModelAdapterListener l = (ModelAdapterListener)i.next();                  
+        try
+        {
+          l.propertyChanged(modelObject, propertyName);
+        }
+        catch (Exception e)
+        {
+        }
+      }
+    }  
+
+    public void notifyChanged(Notification msg)
+    {        
+      firePropertyChanged(msg.getNotifier(), null);
+    }     
+  }
+       
+
+     
+  //
+  //
+  //
+  protected static class XSDElementDeclarationAdapter extends XSDObjectAdapter implements ModelAdapterListener
+  {
+    protected XSDElementDeclaration ed;
+    protected XSDTypeDefinition typeDefinition;          
+
+    public XSDElementDeclarationAdapter(XSDElementDeclaration ed)
+    {
+      this.ed = ed;
+      updateTypeDefinition();
+    } 
+    
+    protected void updateTypeDefinition()
+    {
+      XSDTypeDefinition td = ed.getTypeDefinition();
+      td = (td instanceof XSDComplexTypeDefinition) ? td : null;
+      if (td != typeDefinition)
+      {                     
+        if (typeDefinition != null)
+        {
+          XSDObjectAdapter adapter = (XSDObjectAdapter)xsdAdapterFactoryImpl.adapt(typeDefinition);
+          adapter.removeListener(this);
+        }
+        typeDefinition = td;
+        if (typeDefinition != null)
+        {
+          XSDObjectAdapter adapter = (XSDObjectAdapter)xsdAdapterFactoryImpl.adapt(typeDefinition);
+          adapter.addListener(this);
+        }
+      }
+    } 
+
+
+    public void notifyChanged(Notification msg)
+    {
+      updateTypeDefinition();    
+      firePropertyChanged(msg.getNotifier(), null);                                                                          
+    } 
+
+
+    public void propertyChanged(Object object, String property)
+    {                         
+      // here we propagate typeDefinition changes to our listeners
+      firePropertyChanged(object, property);
+    }
+  }                         
+  
+
+  //
+  //
+  protected static class XSDSchemaAdapter extends XSDObjectAdapter
+  { 
+    protected XSDSchema schema;
+    protected List groups;            
+
+    public XSDSchemaAdapter(XSDSchema schema)
+    {
+      this.schema = schema;                         
+      groups = new ArrayList();                                       
+      groups.add(new Category(schema, Category.DIRECTIVES));
+      groups.add(new Category(schema, Category.ATTRIBUTES)); 
+      //groups.add(new Category(schema, Category.ATTRIBUTE_GROUPS));
+      groups.add(new Category(schema, Category.ELEMENTS));
+      groups.add(new Category(schema, Category.TYPES));
+      //groups.add(new Category(schema, Category.SIMPLE_TYPES));
+      groups.add(new Category(schema, Category.GROUPS));
+    }
+
+    public void notifyChanged(Notification msg)
+    {
+      super.notifyChanged(msg);
+      for (Iterator i = groups.iterator(); i.hasNext(); )
+      {
+        ModelAdapter group = (ModelAdapter)i.next();
+        group.firePropertyChanged(group, null);
+      }
+    }
+
+    public Object getProperty(Object modelObject, String propertyName)
+    {
+      Object result = null;
+      if ("groups".equals(propertyName))
+      { 
+        /*
+        List list = new ArrayList();
+        for (Iterator i = groups.iterator(); i.hasNext(); )
+        {
+          Category group = (Category)i.next();
+          if (group.getChildren().size() > 0)
+          {
+            list.add(group);
+          }
+        }
+        result = list;*/
+        result = groups;
+      }      
+      if (result == null)
+      {
+        result = super.getProperty(modelObject, propertyName);
+      }
+      return result;
+    }
+  }
+
+
+  public static void addModelAdapterListener(Object modelObject, ModelAdapterListener listener)
+  {                                                            
+    ModelAdapter modelAdapter = getModelAdapter(modelObject);
+    if (modelAdapter != null)
+    {
+      modelAdapter.addListener(listener);
+    }
+  }    
+
+
+  public static void removeModelAdapterListener(Object modelObject, ModelAdapterListener listener)
+  {                               
+    ModelAdapter modelAdapter = getModelAdapter(modelObject);
+    if (modelAdapter != null)
+    {
+      modelAdapter.removeListener(listener);
+    }
+  }   
+
+  protected static ModelAdapter getModelAdapter(Object modelObject)
+  {
+    ModelAdapter modelAdapter = null;                         
+    if (modelObject instanceof Notifier)
+    {
+      modelAdapter = (ModelAdapter)xsdAdapterFactoryImpl.adapt((Notifier)modelObject);
+    } 
+    else if (modelObject instanceof ModelAdapter)
+    {
+      modelAdapter = (ModelAdapter)modelObject;
+    } 
+    return modelAdapter;
+  }      
+}
+    
+
+
+// --------------------------------------------------------------------------------------------
+// todo... revist this stuff
+// --------------------------------------------------------------------------------------------
+
+  /*                   
+  public static void handleTypeChange(XSDTypeDefinition td, XSDSchema schema, int change)
+  {                                    
+    try
+    {
+      TypeFindingSchemaVisitor visitor = new TypeFindingSchemaVisitor(schema, td, change == Notification.ADD);
+      List list = visitor.findElementsUsingType(schema);          
+      
+      if (change == Notification.REMOVE)          
+      {
+        visitor.removeMatchingReferences();
+      }
+      else if (change == Notification.ADD)          
+      {
+        visitor.setMatchingReferences();
+      }
+      else
+      {
+        visitor.cleanUpTypeMismatches();        
+      }
+      
+      for (Iterator i = list.iterator(); i.hasNext(); )
+      {
+        Object o = i.next();  
+        XSDObjectAdapter adapter = getExisitingAdapter(o);
+        if (adapter != null)
+        { 
+          adapter.fireChildrenChangedNotification();
+        }
+      }          
+    }
+    catch (Exception e)
+    {
+      e.printStackTrace();
+    }
+  }
+          
+
+  protected static class TypeFindingSchemaVisitor extends org.eclipse.wst.xsd.utility.XSDVisitor
+  {                           
+    protected XSDTypeDefinition td;
+    protected List list = new ArrayList();   
+    protected XSDSchema schema;                            
+    protected boolean matchByName;
+
+    public TypeFindingSchemaVisitor(XSDSchema schema, XSDTypeDefinition td, boolean matchByName)
+    {
+      this.td = td;                                 
+      this.schema = schema;
+      this.matchByName = matchByName;
+    }
+
+    public void visitElementDeclaration(XSDElementDeclaration ed)
+    {                                  
+      if (ed.getTypeDefinition() == td)
+      {                
+        list.add(ed);        
+      }  
+      else if (matchByName)
+      {          
+        String[] name = getDOMName(ed);
+        if (name[0].equals(td.getTargetNamespace()) && name[1].equals(td.getName()))
+        {
+          list.add(ed);
+        }
+      }
+    } 
+
+    public List findElementsUsingType(XSDSchema schema)
+    {
+      if (td != null)
+      {
+        visitSchema(schema);
+      }    
+      return list;
+    }   
+
+    public List getMatchingTypeList()
+    {
+      return list;
+    } 
+
+    public String[] getDOMName(XSDElementDeclaration ed)
+    {      
+      String[] result = new String[2];
+      org.w3c.dom.Element domElement = ed.getElement();
+      String typeName = domElement.getAttribute("type");
+      if (typeName != null && !typeName.endsWith(td.getName()))
+      {             
+        int index = typeName.indexOf(":");                                      
+        String prefix = index == -1 ? "" : typeName.substring(0, index);   
+        result[0] = (String)schema.getQNamePrefixToNamespaceMap().get(prefix);
+        if (result[0] == null) result[0] = "";
+        if (result[1] == null) result[1] = "";
+        result[1] = index == -1 ? typeName : typeName.substring(index + 1);
+      }  
+      else
+      {
+        result[0] = "";
+        result[1] = "";
+      }
+      return result;
+    }
+    
+    
+    public void cleanUpTypeMismatches()
+    {
+      for (Iterator i = list.iterator(); i.hasNext(); )
+      {
+        XSDElementDeclaration ed = (XSDElementDeclaration)i.next();
+        XSDTypeDefinition candidateTd = ed.getTypeDefinition();
+        if (candidateTd != null && candidateTd.getName() != null)
+        {
+          String[] result = getDOMName(ed);
+          ed.setTypeDefinition((XSDTypeDefinition)schema.resolveComplexTypeDefinition(result[0], result[1]));         
+        }
+      }
+    }
+    
+    public void removeMatchingReferences()
+    {
+      for (Iterator i = list.iterator(); i.hasNext(); )
+      {
+        XSDElementDeclaration ed = (XSDElementDeclaration)i.next();
+        String[] result = getDOMName(ed);          
+        if (ed.getElement() != null)
+        {
+          // NOTE ... this forces the model to reset the ed's XSDTypeDefinition without causing the
+          // DOM element's 'type' attribute to be set to null
+          ed.elementAttributesChanged(ed.getElement());
+        }
+      }
+    }
+    
+    public void setMatchingReferences()
+    {
+      for (Iterator i = list.iterator(); i.hasNext(); )
+      {
+        XSDElementDeclaration ed = (XSDElementDeclaration)i.next();
+        ed.setTypeDefinition(td);
+      }
+    }    
+  } */   
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GenerateDtd.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GenerateDtd.gif
new file mode 100644
index 0000000..ac58c1e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GenerateDtd.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GenerateJava.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GenerateJava.gif
new file mode 100644
index 0000000..2375c65
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GenerateJava.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GraphViewElementRef.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GraphViewElementRef.gif
new file mode 100644
index 0000000..d535dac
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/GraphViewElementRef.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/NewXSD.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/NewXSD.gif
new file mode 100644
index 0000000..47f6730
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/NewXSD.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/RegexWizardArrow.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/RegexWizardArrow.gif
new file mode 100644
index 0000000..3d550a3
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/RegexWizardArrow.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/ValidateXSD.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/ValidateXSD.gif
new file mode 100644
index 0000000..2b347ac
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/ValidateXSD.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAll.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAll.gif
new file mode 100644
index 0000000..6d74e80
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAll.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAnnotate.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAnnotate.gif
new file mode 100644
index 0000000..d2108c0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAnnotate.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAny.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAny.gif
new file mode 100644
index 0000000..a39f93c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAny.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAnyAttribute.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAnyAttribute.gif
new file mode 100644
index 0000000..5280cc2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAnyAttribute.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAppInfo.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAppInfo.gif
new file mode 100644
index 0000000..2da001e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAppInfo.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttribute.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttribute.gif
new file mode 100644
index 0000000..79d49d0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttribute.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeGroup.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeGroup.gif
new file mode 100644
index 0000000..648462f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeGroup.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeGroupRef.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeGroupRef.gif
new file mode 100644
index 0000000..a89fa8f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeGroupRef.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeRef.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeRef.gif
new file mode 100644
index 0000000..8365af2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDAttributeRef.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDChoice.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDChoice.gif
new file mode 100644
index 0000000..89ba825
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDChoice.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDComplexContent.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDComplexContent.gif
new file mode 100644
index 0000000..41c68dd
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDComplexContent.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDComplexType.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDComplexType.gif
new file mode 100644
index 0000000..007f852
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDComplexType.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDDoc.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDDoc.gif
new file mode 100644
index 0000000..d349a05
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDDoc.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDElement.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDElement.gif
new file mode 100644
index 0000000..dd45f08
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDElement.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDElementRef.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDElementRef.gif
new file mode 100644
index 0000000..749acfc
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDElementRef.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDExtension.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDExtension.gif
new file mode 100644
index 0000000..0cfb807
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDExtension.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDField.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDField.gif
new file mode 100644
index 0000000..378e43e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDField.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDFile.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDFile.gif
new file mode 100644
index 0000000..3900f1b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDFile.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGlobalAttribute.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGlobalAttribute.gif
new file mode 100644
index 0000000..79d49d0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGlobalAttribute.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGlobalElement.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGlobalElement.gif
new file mode 100644
index 0000000..dd45f08
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGlobalElement.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGroup.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGroup.gif
new file mode 100644
index 0000000..555ef53
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGroup.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGroupRef.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGroupRef.gif
new file mode 100644
index 0000000..3621342
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDGroupRef.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDImport.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDImport.gif
new file mode 100644
index 0000000..9e44ce5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDImport.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDInclude.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDInclude.gif
new file mode 100644
index 0000000..b26c527
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDInclude.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDKey.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDKey.gif
new file mode 100644
index 0000000..04032a9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDKey.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDKeyRef.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDKeyRef.gif
new file mode 100644
index 0000000..ee5829d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDKeyRef.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDNotation.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDNotation.gif
new file mode 100644
index 0000000..ce9df98
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDNotation.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDRedefine.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDRedefine.gif
new file mode 100644
index 0000000..56964c1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDRedefine.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSelector.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSelector.gif
new file mode 100644
index 0000000..2399a58
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSelector.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSequence.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSequence.gif
new file mode 100644
index 0000000..8bf3f97
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSequence.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleContent.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleContent.gif
new file mode 100644
index 0000000..7ef38df
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleContent.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleEnum.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleEnum.gif
new file mode 100644
index 0000000..11d7958
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleEnum.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleList.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleList.gif
new file mode 100644
index 0000000..d08e78f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleList.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimplePattern.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimplePattern.gif
new file mode 100644
index 0000000..a113cf4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimplePattern.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleRestrict.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleRestrict.gif
new file mode 100644
index 0000000..38bc12e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleRestrict.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleType.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleType.gif
new file mode 100644
index 0000000..75f33c2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleType.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleUnion.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleUnion.gif
new file mode 100644
index 0000000..292adaf
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDSimpleUnion.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDUnique.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDUnique.gif
new file mode 100644
index 0000000..5a8a650
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/XSDUnique.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/back.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/back.gif
new file mode 100644
index 0000000..24d1a27
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/back.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/browsebutton.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/browsebutton.gif
new file mode 100644
index 0000000..13dae59
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/browsebutton.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/forward.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/forward.gif
new file mode 100644
index 0000000..eab699e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/forward.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/generate_xml.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/generate_xml.gif
new file mode 100644
index 0000000..f2e3635
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/generate_xml.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/regx_wiz.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/regx_wiz.gif
new file mode 100644
index 0000000..789d137
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/regx_wiz.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/reloadgrammar.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/reloadgrammar.gif
new file mode 100644
index 0000000..c705db0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/reloadgrammar.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/sort.gif b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/sort.gif
new file mode 100644
index 0000000..3c65dc4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/icons/sort.gif
Binary files differ
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/preferences/XSDPreferencePage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/preferences/XSDPreferencePage.java
new file mode 100644
index 0000000..dafb31e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/preferences/XSDPreferencePage.java
@@ -0,0 +1,259 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.preferences;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.jface.preference.PreferencePage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+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.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.help.WorkbenchHelp;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorContextIds;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+
+public class XSDPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, Listener 
+{
+  Text indentTextField;
+  String indentString;
+  Text schemaNsPrefixField;
+  Text defaultTargetNamespaceText;
+  Button qualifyXSDLanguage;
+
+  /**
+   * Creates preference page controls on demand.
+   *   @param parent  the parent for the preference page
+   */
+  protected Control createContents(Composite parent)
+  {
+    WorkbenchHelp.setHelp(parent, XSDEditorContextIds.XSDP_PREFERENCE_PAGE);
+
+    Group group = createGroup(parent, 2);   
+    group.setText(XSDEditorPlugin.getXSDString("_UI_TEXT_XSD_NAMESPACE_PREFIX"));
+
+    qualifyXSDLanguage = ViewUtility.createCheckBox(group, XSDEditorPlugin.getXSDString("_UI_QUALIFY_XSD"));
+    ViewUtility.createLabel(group, " ");
+
+    createLabel(group, XSDEditorPlugin.getXSDString("_UI_TEXT_XSD_DEFAULT_PREFIX"));
+    schemaNsPrefixField = createTextField(group);
+    schemaNsPrefixField.addKeyListener(new KeyAdapter()
+    {
+      public void keyPressed(KeyEvent e)
+      {
+        setValid(true);
+      }      
+    });
+    
+    createLabel(group, XSDEditorPlugin.getXSDString("_UI_TEXT_XSD_DEFAULT_TARGET_NAMESPACE"));
+    defaultTargetNamespaceText = createTextField(group);
+
+    initializeValues();
+
+    return new Composite(parent, SWT.NULL);
+  }
+
+  private Group createGroup(Composite parent, int numColumns) 
+  {
+    Group group = new Group(parent, SWT.NULL);
+
+    GridLayout layout = new GridLayout();
+    layout.numColumns = numColumns;
+    group.setLayout(layout);
+
+    GridData data = new GridData();
+    data.verticalAlignment = GridData.FILL;
+    data.horizontalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    group.setLayoutData(data);
+    
+    return group;
+  }
+
+  private Text createTextField(Composite parent) 
+  {
+     Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
+     GridData data = new GridData();
+     data.verticalAlignment = GridData.FILL;
+     data.horizontalAlignment = GridData.FILL;
+     data.grabExcessHorizontalSpace = true;
+     text.setLayoutData(data);
+
+     return text;
+  }
+
+  private Label createLabel(Composite parent, String text) 
+  {
+    Label label = new Label(parent, SWT.LEFT);
+    label.setText(text);
+    
+    GridData data = new GridData();
+    data.verticalAlignment = GridData.CENTER;
+    data.horizontalAlignment = GridData.FILL;
+    label.setLayoutData(data);
+    
+    return label;
+  }
+  
+  /**
+   * Does anything necessary because the default button has been pressed.
+   */
+  protected void performDefaults() 
+  {
+    super.performDefaults();
+    initializeDefaults();
+    checkValues();
+  }
+
+  /**
+   * Do anything necessary because the OK button has been pressed.
+   *  @return whether it is okay to close the preference page
+   */
+  public boolean performOk() 
+  {
+    if (checkValues())
+    {
+      storeValues();    
+      return true;
+    }
+    return false;
+  }
+
+  protected void performApply()
+  {
+    if (checkValues())
+    {
+      storeValues();    
+    }
+  }
+
+  /**
+   * Handles events generated by controls on this page.
+   *   @param e  the event to handle
+   */
+  public void handleEvent(Event e) 
+  {
+    Widget source = e.widget;
+  }
+
+  /**
+   * @see IWorkbenchPreferencePage
+   */
+  public void init(IWorkbench workbench)
+  { 
+  }
+
+  /** 
+   * The indent is stored in the preference store associated with the XML Schema Model
+   */
+  public IPreferenceStore getPreferenceStore()
+  {
+    return XSDEditorPlugin.getPlugin().getPreferenceStore();
+  }
+
+  /**
+   * Initializes states of the controls using default values
+   * in the preference store.
+   */
+  private void initializeDefaults() 
+  {
+    schemaNsPrefixField.setText(getPreferenceStore().getDefaultString(XSDEditorPlugin.CONST_XSD_DEFAULT_PREFIX_TEXT));
+    qualifyXSDLanguage.setSelection(getPreferenceStore().getDefaultBoolean(XSDEditorPlugin.CONST_XSD_LANGUAGE_QUALIFY));
+    defaultTargetNamespaceText.setText(getPreferenceStore().getString(XSDEditorPlugin.CONST_DEFAULT_TARGET_NAMESPACE));
+  }
+
+  /**
+   * Initializes states of the controls from the preference store.
+   */
+  private void initializeValues() 
+  {
+    IPreferenceStore store = getPreferenceStore();
+    schemaNsPrefixField.setText(store.getString(XSDEditorPlugin.CONST_XSD_DEFAULT_PREFIX_TEXT));
+    qualifyXSDLanguage.setSelection(store.getBoolean(XSDEditorPlugin.CONST_XSD_LANGUAGE_QUALIFY));
+    defaultTargetNamespaceText.setText(store.getString(XSDEditorPlugin.CONST_DEFAULT_TARGET_NAMESPACE));
+  }
+
+  /**
+   * Stores the values of the controls back to the preference store.
+   */
+  private void storeValues() 
+  {
+    IPreferenceStore store = getPreferenceStore();
+
+    store.setValue(XSDEditorPlugin.CONST_XSD_DEFAULT_PREFIX_TEXT, getXMLSchemaPrefix());
+    store.setValue(XSDEditorPlugin.CONST_XSD_LANGUAGE_QUALIFY, getQualify());
+    store.setValue(XSDEditorPlugin.CONST_DEFAULT_TARGET_NAMESPACE, getXMLSchemaTargetNamespace());
+
+    XSDEditorPlugin.getPlugin().savePluginPreferences();
+  }
+
+  public String getXMLSchemaPrefix()
+  {
+    String prefix = schemaNsPrefixField.getText();
+    if (prefix == null || prefix.equals("")) 
+    {
+      return "xsd";
+    }
+    return prefix;
+  }
+
+  public boolean getQualify()
+  {
+    return qualifyXSDLanguage.getSelection();
+  }
+  
+  /**
+   * Get the xml schema default target namespace
+   */
+  public String getXMLSchemaTargetNamespace()
+  {
+  	String targetNamespace = defaultTargetNamespaceText.getText();
+    if (targetNamespace == null || targetNamespace.equals("")) 
+    {
+      return XSDEditorPlugin.DEFAULT_TARGET_NAMESPACE;
+    }
+    else if(!targetNamespace.endsWith("/")){
+    	targetNamespace = targetNamespace + "/";
+    }
+    return targetNamespace;
+  }
+  
+  public boolean checkValues()
+  {
+// KCPort TODO    String errorMessage = ValidateHelper.checkXMLName(schemaNsPrefixField.getText());
+	 String errorMessage = null;
+
+    if (errorMessage == null || errorMessage.length() == 0)
+    {
+      setErrorMessage(null);
+      setValid(true);
+      return true;
+    }
+    else
+    {
+      setErrorMessage(XSDEditorPlugin.getXSDString("_ERROR_LABEL_INVALID_PREFIX"));
+      setValid(false);
+      return false;
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyAttributePropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyAttributePropertySource.java
new file mode 100644
index 0000000..0f4e7e7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyAttributePropertySource.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+
+
+public class AnyAttributePropertySource extends BasePropertySource implements IPropertySource
+{
+  private String[] namespaceComboValues = {
+              "",
+              "##any",
+              "##other",
+              "##targetNamespace",
+              "##local"
+  };
+  
+  private String[] processContentsComboValues = {
+              "",
+              XSDEditorPlugin.getXSDString("_UI_COMBO_LAX"),
+              XSDEditorPlugin.getXSDString("_UI_COMBO_SKIP"),
+              XSDEditorPlugin.getXSDString("_UI_COMBO_STRICT")
+  };
+  public AnyAttributePropertySource()
+  {
+  }
+
+  public AnyAttributePropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+    
+  public AnyAttributePropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+
+    XSDComboBoxPropertyDescriptor namespaceDescriptor = new XSDComboBoxPropertyDescriptor(
+        XSDConstants.NAMESPACE_ATTRIBUTE,
+        XSDConstants.NAMESPACE_ATTRIBUTE,
+        namespaceComboValues);
+    list.add(namespaceDescriptor);
+    
+    XSDComboBoxPropertyDescriptor processContentsDescriptor = new XSDComboBoxPropertyDescriptor(
+        XSDConstants.PROCESSCONTENTS_ATTRIBUTE,
+        XSDConstants.PROCESSCONTENTS_ATTRIBUTE,
+        processContentsComboValues);
+    list.add(processContentsDescriptor);
+    
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+      if (result == null)
+      {
+        result = "";
+      }
+      return result;
+    }
+    return "";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      if (((String) id).equals(XSDConstants.NAMESPACE_ATTRIBUTE))
+      {
+        String namespace = (String)value;
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_NAMESPACE_CHANGE"), element);
+        if (namespace != null && namespace.length() > 0)
+        {
+          element.setAttribute(XSDConstants.NAMESPACE_ATTRIBUTE, namespace);
+        }
+        else
+        {
+          element.removeAttribute(XSDConstants.NAMESPACE_ATTRIBUTE);
+        }
+        endRecording(element);
+      }
+      else if (((String) id).equals(XSDConstants.PROCESSCONTENTS_ATTRIBUTE))
+      {
+        String processContents = (String)value;
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_PROCESSCONTENTS_CHANGE"), element);
+        if (processContents != null && processContents.length() > 0)
+        {
+          element.setAttribute(XSDConstants.PROCESSCONTENTS_ATTRIBUTE, processContents);
+        }
+        else
+        {
+          element.removeAttribute(XSDConstants.PROCESSCONTENTS_ATTRIBUTE);
+        }
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+
+  }
+
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyContentPropertyDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyContentPropertyDescriptor.java
new file mode 100644
index 0000000..b11ef1e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyContentPropertyDescriptor.java
@@ -0,0 +1,155 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.help.WorkbenchHelp;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorContextIds;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class AnyContentPropertyDescriptor extends PropertyDescriptor
+{
+  Element element;
+  /**
+   * @param id
+   * @param displayName
+   */
+  public AnyContentPropertyDescriptor(Object id, String displayName, Element element)
+  {
+    super(id, displayName);
+    this.element = element;
+  }
+  
+  public CellEditor createPropertyEditor(Composite parent)
+  {
+    CellEditor editor = new AnyContentDialogCellEditor(parent);
+    if (getValidator() != null)
+      editor.setValidator(getValidator());
+    return editor;
+  }
+
+  public class AnyContentDialogCellEditor extends DialogCellEditor {
+
+    /**
+     * Creates a new Font dialog cell editor parented under the given control.
+     * The cell editor value is <code>null</code> initially, and has no 
+     * validator.
+     *
+     * @param parent the parent control
+     */
+    protected AnyContentDialogCellEditor(Composite parent) {
+      super(parent);
+    }
+
+    /**
+     * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(Control)
+     */
+    protected Object openDialogBox(Control cellEditorWindow)
+    {
+      Shell shell = Display.getCurrent().getActiveShell();
+      
+      AnyContentDialog dialog = new AnyContentDialog(shell);
+      dialog.setBlockOnOpen(true);
+      dialog.create();
+      
+      String value = (String)getValue();
+
+      int result = dialog.open();
+
+      if (result == Window.OK)
+      {
+        return dialog.getComment();
+      }
+      return value;
+    }
+
+  }
+
+  public class AnyContentDialog extends org.eclipse.jface.dialogs.Dialog
+  {
+    protected Text commentField;
+    protected Button okButton, cancelButton;
+    private String comment;
+    
+    public AnyContentDialog(Shell shell)
+    {
+      super(shell);
+    }
+
+    protected void configureShell(Shell shell)
+    {
+      super.configureShell(shell);
+    }
+
+    protected void buttonPressed(int buttonId)
+    {
+      if (buttonId == Dialog.OK)
+      {
+        comment = commentField.getText();
+      }
+      super.buttonPressed(buttonId);
+    }
+
+    public String getComment() { return comment; }
+
+    //
+    // Create the controls
+    //
+    public Control createDialogArea(Composite parent)
+    {
+      int tabIndex = 0;
+      Composite client = (Composite)super.createDialogArea(parent);
+      getShell().setText("Content for " + element.getLocalName());
+      
+      commentField = ViewUtility.createMultiTextField(client, 400, 200, true);
+      
+      WorkbenchHelp.setHelp(commentField, XSDEditorContextIds.XSDE_ANNOTATION_COMMENT);
+      commentField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_COMMENT"));
+
+      String initialString = (String)getInitialContent();
+      commentField.setText(initialString);
+      return client;
+    }
+
+    private Object getInitialContent()
+    {
+      Object result = null;
+      if (element.hasChildNodes())
+       {
+        // if the element is Text
+        Node node = element.getFirstChild();
+        if (node instanceof CharacterData)
+         {
+          result = ((CharacterData)node).getData();
+        }
+      }
+      else
+       {
+        result = "";
+      }
+      return result;
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyElementPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyElementPropertySource.java
new file mode 100644
index 0000000..df43637
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AnyElementPropertySource.java
@@ -0,0 +1,228 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+
+
+public class AnyElementPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+
+  private String[] namespaceComboValues = {
+        "",
+        "##any",
+        "##other",
+        "##targetNamespace",
+        "##local"
+  };
+  
+  private String[] processContentsComboValues = {
+     "",
+     XSDEditorPlugin.getXSDString("_UI_COMBO_LAX"),
+     XSDEditorPlugin.getXSDString("_UI_COMBO_SKIP"),
+     XSDEditorPlugin.getXSDString("_UI_COMBO_STRICT")
+  };
+  
+  /**
+   * 
+   */
+  public AnyElementPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public AnyElementPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public AnyElementPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+
+    XSDComboBoxPropertyDescriptor namespaceDescriptor = new XSDComboBoxPropertyDescriptor(
+        XSDConstants.NAMESPACE_ATTRIBUTE,
+        XSDConstants.NAMESPACE_ATTRIBUTE,
+        namespaceComboValues);
+    list.add(namespaceDescriptor);
+    
+    XSDComboBoxPropertyDescriptor processContentsDescriptor = new XSDComboBoxPropertyDescriptor(
+        XSDConstants.PROCESSCONTENTS_ATTRIBUTE,
+        XSDConstants.PROCESSCONTENTS_ATTRIBUTE,
+        processContentsComboValues);
+    list.add(processContentsDescriptor);
+
+// These are moved to the tabbed properties general section     
+//    PropertyDescriptor minOccursDescriptor =
+//    new TextPropertyDescriptor(
+//        XSDConstants.MINOCCURS_ATTRIBUTE,
+//        XSDConstants.MINOCCURS_ATTRIBUTE);
+//    list.add(minOccursDescriptor);
+//    PropertyDescriptor maxOccursDescriptor =
+//    new TextPropertyDescriptor(
+//        XSDConstants.MAXOCCURS_ATTRIBUTE,
+//        XSDConstants.MAXOCCURS_ATTRIBUTE);
+//    list.add(maxOccursDescriptor);
+    
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+      if (result == null)
+      {
+        result = "";
+      }
+      return result;
+
+//      if (((String) id).equals(XSDConstants.NAMESPACE_ATTRIBUTE))
+//       {
+//      }
+//      else if (((String) id).equals(XSDConstants.PROCESSCONTENTS_ATTRIBUTE))
+//       {
+//      }      
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+     {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      if (((String) id).equals(XSDConstants.MAXOCCURS_ATTRIBUTE))
+      {
+        String max = (String)value;
+        String min = element.getAttribute(XSDConstants.MINOCCURS_ATTRIBUTE);
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_MAXOCCURS_CHANGE"), element);
+        if (max.length() > 0)
+        {
+          element.setAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE, max);
+        }
+        else
+        {
+          element.removeAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE);
+        }
+        endRecording(element);
+      }
+      else if (((String) id).equals(XSDConstants.MINOCCURS_ATTRIBUTE))
+      {
+        String min = (String)value;
+        String max = element.getAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE);
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_MINOCCURS_CHANGE"), element);
+        if (min.length() > 0)
+        {
+          element.setAttribute(XSDConstants.MINOCCURS_ATTRIBUTE, min);
+        }
+        else
+        {
+          element.removeAttribute(XSDConstants.MINOCCURS_ATTRIBUTE);
+        }
+        endRecording(element);
+      }
+      else if (((String) id).equals(XSDConstants.NAMESPACE_ATTRIBUTE))
+      {
+        String namespace = (String)value;
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_NAMESPACE_CHANGE"), element);
+        if (namespace.length() > 0)
+        {
+          element.setAttribute(XSDConstants.NAMESPACE_ATTRIBUTE, namespace);
+        }
+        else
+        {
+          element.removeAttribute(XSDConstants.NAMESPACE_ATTRIBUTE);
+        }
+        endRecording(element);
+      }
+      else if (((String) id).equals(XSDConstants.PROCESSCONTENTS_ATTRIBUTE))
+      {
+        String processContents = (String)value;
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_PROCESSCONTENTS_CHANGE"), element);
+        if (processContents.length() > 0)
+        {
+          element.setAttribute(XSDConstants.PROCESSCONTENTS_ATTRIBUTE, processContents);
+        }
+        else
+        {
+          element.removeAttribute(XSDConstants.PROCESSCONTENTS_ATTRIBUTE);
+        }
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AppInfoPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AppInfoPropertySource.java
new file mode 100644
index 0000000..b99c768
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AppInfoPropertySource.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Node;
+
+public class AppInfoPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  public static String CONTENT = "Content";
+
+  /**
+   * 
+   */
+  public AppInfoPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public AppInfoPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public AppInfoPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    PropertyDescriptor sourceDescriptor =
+      new TextPropertyDescriptor(
+        XSDConstants.SOURCE_ATTRIBUTE,
+        XSDConstants.SOURCE_ATTRIBUTE);
+    list.add(sourceDescriptor);
+    AnyContentPropertyDescriptor contentDescriptor =
+      new AnyContentPropertyDescriptor(
+        CONTENT,
+        CONTENT,
+        element);
+    list.add(contentDescriptor);
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      if (((String) id).equals(CONTENT))
+      {
+        try
+        {
+          if (element.hasChildNodes())
+          {
+            // if the element is Text
+            Node node = element.getFirstChild();
+            if (node instanceof CharacterData)
+            {
+              return ((CharacterData)node).getData();
+            }
+          }
+          else
+          {
+            return "";
+          }
+        }
+        catch (Exception e)
+        {
+            
+        }
+
+      }
+      else
+      {
+        result = element.getAttribute((String) id);
+      }
+    }
+    if (result == null)
+    {
+      result = "";
+    }
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value != null)
+    {
+      if (value instanceof String)
+      {
+        if (((String)id).equals(XSDConstants.SOURCE_ATTRIBUTE))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_SOURCE_ATTRIBUTE_CHANGE"), element);
+          if (((String)value).length() > 0)
+          {
+            element.setAttribute(XSDConstants.SOURCE_ATTRIBUTE, (String)value);
+          }
+          else
+          {
+            element.removeAttribute(XSDConstants.SOURCE_ATTRIBUTE);
+          }
+          endRecording(element);
+        }
+        else if (((String)id).equals(CONTENT))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_COMMENT_CHANGE"), element);
+          try
+          {
+            if (element.hasChildNodes())
+            {
+              // if the element is Text
+              Node node = element.getFirstChild();
+              if (node instanceof CharacterData)
+              {
+                ((CharacterData)node).setData((String)value);
+              }
+            }
+            else
+            {
+              if (((String)value).length() > 0)
+              {
+                Node childNode = element.getOwnerDocument().createTextNode((String)value);
+                element.appendChild(childNode);
+              }
+            }
+            endRecording(element);
+          }
+          catch (Exception e)
+          {
+            
+          }
+        }
+        else  // shouldn't be here
+        {
+          element.setAttribute((String) id, (String) value);
+        }
+      }
+      else if (value instanceof Integer)
+      {
+      }
+    }
+    else
+    {
+      element.removeAttribute((String) id);
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributeGroupRefPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributeGroupRefPropertySource.java
new file mode 100644
index 0000000..74ca702
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributeGroupRefPropertySource.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class AttributeGroupRefPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  private String[] refComboValues = { "" };
+  /**
+   * 
+   */
+  public AttributeGroupRefPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public AttributeGroupRefPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public AttributeGroupRefPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  
+  public void setInput(Element element)
+  {
+    this.element = element;
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    java.util.List items = helper.getGlobalAttributes();
+      
+    if (XSDDOMHelper.inputEquals(element, XSDConstants.ATTRIBUTE_ELEMENT_TAG, true))
+    {
+      items = helper.getGlobalAttributes();
+//      WorkbenchHelp.setHelp(client, XSDEditorContextIds.XSDE_ATTRIBUTE_REF_DESIGN_VIEW);
+//      WorkbenchHelp.setHelp(refCombo, XSDEditorContextIds.XSDE_ATTRIBUTE_REF_NAME);      
+    }
+    else if (XSDDOMHelper.inputEquals(element, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true))
+    {
+      items = helper.getGlobalAttributeGroups();
+//      WorkbenchHelp.setHelp(client, XSDEditorContextIds.XSDE_ATTRIBUTE_GROUP_REF_DESIGN_VIEW);
+//      WorkbenchHelp.setHelp(refCombo, XSDEditorContextIds.XSDE_ATTRIBUTE_GROUP_REF_NAME);
+    }
+    int size = items.size() + 1;
+    refComboValues = new String[size];
+    refComboValues[0] = "";
+    if (items != null)
+    {
+      for (int i = 0; i < items.size(); i++)
+      {
+        refComboValues[i + 1] = (String) items.get(i);
+      }
+    }
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    XSDComboBoxPropertyDescriptor refDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        XSDConstants.REF_ATTRIBUTE,
+        XSDConstants.REF_ATTRIBUTE,
+        refComboValues);
+    list.add(refDescriptor);
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+      if (result == null)
+      {
+        result = "";
+      }
+//      if (((String) id).equals(XSDConstants.REF_ATTRIBUTE))
+//      {
+//      }
+      return result;
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+     {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      if (((String) id).equals(XSDConstants.REF_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ATTRIBUTEGROUP_REF_CHANGE"), element);
+        element.setAttribute(XSDConstants.REF_ATTRIBUTE, (String) value);
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributePropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributePropertySource.java
new file mode 100644
index 0000000..f89b2f0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributePropertySource.java
@@ -0,0 +1,294 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalAttributeRenamer;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+public class AttributePropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  private String[] useComboValues =
+  {
+        "",
+        "prohibited",   // XSDEditorPlugin.getXSDString("_UI_COMBO_BOX_PROHIBITED"),
+        "optional",   // XSDEditorPlugin.getXSDString("_UI_COMBO_BOX_OPTIONAL"),
+        "required"  // XSDEditorPlugin.getXSDString("_UI_COMBO_BOX_REQUIRED")
+  };
+
+  protected String formComboValues[] =
+  {
+        "",
+        XSDEditorPlugin.getXSDString("_UI_COMBO_UNQUALIFIED"),
+        XSDEditorPlugin.getXSDString("_UI_COMBO_QUALIFIED")
+  };
+  
+  
+  /**
+   * 
+   */
+  public AttributePropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public AttributePropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public AttributePropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    PropertyDescriptor nameDescriptor = new TextPropertyDescriptor(XSDConstants.NAME_ATTRIBUTE, XSDConstants.NAME_ATTRIBUTE);
+    list.add(nameDescriptor);
+//    nameDescriptor.setCategory(XSDEditorPlugin.getXSDString("_UI_LABEL_GENERAL"));
+    TypesPropertyDescriptor typeDescriptor = new TypesPropertyDescriptor(
+      XSDConstants.TYPE_ATTRIBUTE,
+      XSDConstants.TYPE_ATTRIBUTE,
+      element, xsdSchema);
+    list.add(typeDescriptor);
+//    typeDescriptor.setCategory(XSDEditorPlugin.getXSDString("_UI_LABEL_GENERAL"));
+
+    Attr fixedAttr = element.getAttributeNode(XSDConstants.FIXED_ATTRIBUTE);
+    Attr defaultAttr = element.getAttributeNode(XSDConstants.DEFAULT_ATTRIBUTE);
+    String str;
+    if (fixedAttr != null)
+     {
+      str = XSDConstants.FIXED_ATTRIBUTE;
+    }
+    else if (defaultAttr != null)
+     {
+      str = XSDConstants.DEFAULT_ATTRIBUTE;
+    }
+    else
+     {
+      str = XSDConstants.FIXED_ATTRIBUTE + "/" + XSDConstants.DEFAULT_ATTRIBUTE;
+    }
+    
+    FixedOrDefaultTextPropertyDescriptor fixedOrDefaultDescriptor =
+    new FixedOrDefaultTextPropertyDescriptor(
+        str, 
+        str,
+        element);
+    list.add(fixedOrDefaultDescriptor);
+//    fixedOrDefaultDescriptor.setCategory(XSDEditorPlugin.getXSDString("_UI_LABEL_OTHER"));
+    
+    Object parentNode = element.getParentNode();
+    if (XSDDOMHelper.inputEquals(parentNode, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+    {
+    }
+    else
+    {
+      XSDComboBoxPropertyDescriptor useDescriptor =
+      new XSDComboBoxPropertyDescriptor(
+          XSDConstants.USE_ATTRIBUTE,
+          XSDConstants.USE_ATTRIBUTE,
+          useComboValues);
+      list.add(useDescriptor);
+//      useDescriptor.setCategory(XSDEditorPlugin.getXSDString("_UI_LABEL_OTHER"));
+      XSDComboBoxPropertyDescriptor formDescriptor =
+      new XSDComboBoxPropertyDescriptor(
+          XSDConstants.FORM_ATTRIBUTE,
+          XSDConstants.FORM_ATTRIBUTE,
+          formComboValues);
+      list.add(formDescriptor);
+//      formDescriptor.setCategory(XSDEditorPlugin.getXSDString("_UI_LABEL_OTHER"));
+    }
+    
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+      if (result == null)
+      {
+        result = "";
+      }
+      if (((String) id).equals(XSDConstants.TYPE_ATTRIBUTE))
+      {
+        if (result.equals(""))
+        {
+          if (checkForAnonymousType(element))
+          {
+            return "**anonymous**";
+          }
+          else
+          {
+            return XSDEditorPlugin.getXSDString("_UI_NO_TYPE"); 
+          }
+        }
+        else
+         {
+          return result;
+        }
+      }
+      return result;
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      if (((String) id).equals(XSDConstants.TYPE_ATTRIBUTE))
+      {
+//        beginRecording(XSDEditorPlugin.getXSDString("_UI_TYPE_CHANGE"), element);
+//        element.setAttribute(XSDConstants.TYPE_ATTRIBUTE, (String)value);
+//        updateElementToNotAnonymous(element);
+//        endRecording(element);
+      }
+      else if (((String) id).equals(XSDConstants.NAME_ATTRIBUTE))
+      { 
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ATTRIBUTE_NAME_CHANGE"), element);
+        // now rename any references to this element
+        if (xsdSchema != null)
+         {
+          XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+          if (comp != null && comp instanceof XSDAttributeDeclaration && comp.getRootContainer().equals(xsdSchema))
+          {
+            XSDAttributeDeclaration xsdAttributeDeclaration = (XSDAttributeDeclaration)comp;
+            xsdAttributeDeclaration.setName((String)value);
+            GlobalAttributeRenamer renamer = new GlobalAttributeRenamer(xsdAttributeDeclaration, (String)value);
+            renamer.visitSchema(xsdSchema);
+          }
+        }
+        element.setAttribute(XSDConstants.NAME_ATTRIBUTE, (String)value);
+        endRecording(element);
+      }
+      else if (((String) id).equals(XSDConstants.FIXED_ATTRIBUTE) || ((String) id).equals(XSDConstants.DEFAULT_ATTRIBUTE))
+      {            
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ATTRIBUTE_VALUE_CHANGE"), element);
+        if (((String)value).equals(""))
+         {
+          element.removeAttribute((String)id);
+        }
+        else
+        {  
+          element.setAttribute((String) id, (String) value);
+        }
+        endRecording(element);
+      }
+      else if (((String) id).equals(XSDConstants.USE_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ATTRIBUTE_USE_CHANGE"), element);
+        if (((String)value).equals(""))
+        {
+          element.removeAttribute(XSDConstants.USE_ATTRIBUTE);
+        }
+        else
+        {  
+          element.setAttribute((String) id, (String)value);
+        }
+        endRecording(element);
+      }
+      else if (((String) id).equals(XSDConstants.FORM_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ATTRIBUTE_FORM_CHANGE"), element);
+        if (((String)value).equals(""))
+        {
+          element.removeAttribute(XSDConstants.FORM_ATTRIBUTE);
+        }
+        else
+        {
+          element.setAttribute(XSDConstants.FORM_ATTRIBUTE, (String)value);
+        }
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+  
+  boolean checkForAnonymousType(Element element)
+  {
+    NodeList list = element.getElementsByTagNameNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+    if (list.getLength() > 0)
+     {
+      return true;
+    }
+    return false;
+  }  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributesTable.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributesTable.java
new file mode 100644
index 0000000..f80e72e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/AttributesTable.java
@@ -0,0 +1,331 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+//import java.text.Collator;
+//import java.util.Comparator;
+//import java.util.List;
+//
+//import org.eclipse.jface.viewers.CellEditor;
+//import org.eclipse.jface.viewers.ColumnPixelData;
+//import org.eclipse.jface.viewers.ICellModifier;
+//import org.eclipse.jface.viewers.ILabelProvider;
+//import org.eclipse.jface.viewers.IStructuredContentProvider;
+//import org.eclipse.jface.viewers.ITableLabelProvider;
+//import org.eclipse.jface.viewers.LabelProvider;
+//import org.eclipse.jface.viewers.TableLayout;
+//import org.eclipse.jface.viewers.TableViewer;
+//import org.eclipse.jface.viewers.TextCellEditor;
+//import org.eclipse.jface.viewers.Viewer;
+//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.widgets.Composite;
+//import org.eclipse.swt.widgets.Control;
+//import org.eclipse.swt.widgets.Table;
+//import org.eclipse.swt.widgets.TableColumn;
+//import org.eclipse.swt.widgets.TableItem;
+//import org.eclipse.ui.IEditorPart;
+//import org.eclipse.ui.views.properties.ComboBoxPropertyDescriptor;
+//import org.eclipse.ui.views.properties.IPropertyDescriptor;
+//import org.eclipse.ui.views.properties.IPropertySource;
+//import org.w3c.dom.Element;
+
+public class AttributesTable // extends TableViewer implements ICellModifier
+{
+//	protected static final String PROPERTY = "property"; //$NON-NLS-1$
+//	protected static final String VALUE = "value"; //$NON-NLS-1$
+//
+//	protected IEditorPart editorPart;
+//	protected String[] columnProperties = {PROPERTY, VALUE};
+//	protected PropertyTableProvider tableProvider = new PropertyTableProvider(this);
+//	protected CellEditor cellEditor;
+//	//protected StringComboBoxCellEditor comboCellEditor;
+//	protected IPropertySource propertySource;
+//
+//	public AttributesTable(IEditorPart editorPart, Composite parent)
+//	{
+//		super(new Table(parent, SWT.FULL_SELECTION | SWT.MULTI | SWT.FLAT | SWT.H_SCROLL | SWT.V_SCROLL));   
+//				 this.editorPart = editorPart;               
+//		getTable().setLinesVisible(true);
+//		getTable().setHeaderVisible(true);  
+//    
+//		setContentProvider(tableProvider);
+//		setLabelProvider(tableProvider);
+//		setColumnProperties(columnProperties);
+//
+//		for (int i = 0; i < columnProperties.length; i++)
+//		{
+//			TableColumn column = new TableColumn(getTable(), SWT.NONE, i);
+//			column.setText(columnProperties[i]);
+//			column.setAlignment(SWT.LEFT);
+//		}      
+//
+////		TableLayout layout = new TableLayout(); 
+////		ColumnWeightData data = new ColumnWeightData(40, 40, true);
+////		layout.addColumnData(data);
+////    
+////		ColumnWeightData data2 = new ColumnWeightData(80, 80, true);
+////		layout.addColumnData(data2);                       
+//
+//		TableLayout layout = new TableLayout();
+//		layout.addColumnData(new ColumnPixelData(130,true));
+//		layout.addColumnData(new ColumnPixelData(130,true));
+//		getTable().setLayout(layout);
+//		
+//         
+//		cellEditor = new TextCellEditor(getTable());                            
+//		resetCellEditors();           
+//
+//		setCellModifier(this);    
+//	}  
+//
+//	public void setPropertySource(IPropertySource propertySource)
+//	{
+//		this.propertySource = propertySource;
+//	}
+//
+//  /* (non-Javadoc)
+//   * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
+//   */
+//  public boolean canModify(Object element, String property)
+//  {
+//		return property.equals(VALUE);
+//  }
+//  
+//  /* (non-Javadoc)
+//   * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
+//   */
+//  public Object getValue(Object element, String property)
+//  {
+//		int column = 0;
+//		if (property.equals(columnProperties[0]))
+//		{
+//			column = 0;
+//		}
+//		else if (property.equals(columnProperties[1]))
+//		{
+//			column = 1;
+//		}    
+//		return tableProvider.getColumnValue(element, column);
+// }
+//
+//  /* (non-Javadoc)
+//   * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
+//   */
+//  public void modify(Object element, String property, Object value)
+//  {
+//		TableItem item = (TableItem)element;
+//  	IPropertyDescriptor propertyDescriptor = (IPropertyDescriptor)item.getData();
+//              
+//	// if the new value is the same as the old value, the user has only clicked
+//	// on the cell in the course of 'browsing' ... so don't edit the value
+//	  Object oldValue = getValue(propertyDescriptor, property);       
+//	  if (value != null && !value.equals(oldValue)) 
+//	  {      
+//				 // we assume the value is empty that the attribute should be removed
+//				 // todo... we probably need to look at this in more detail
+//				 if (value instanceof String && ((String)value).length() == 0)
+//				 {
+//								value = null;
+//				 }
+//				 propertySource.setPropertyValue(propertyDescriptor.getId(), value);    
+//	  }                       
+//  }
+//
+//      
+//	protected void hookControl(Control control) {
+//	  // we need to hook up our own mouse listener first
+//				 // so that we can update the cellEditors before
+//				 // the 'internal' listener tries to get hold of them
+//			 Table tableControl = (Table)control;
+//				 tableControl.addMouseListener(new MouseAdapter() {
+//								public void mouseDown(MouseEvent e) {
+//								  System.out.println("Mouse down");
+//										   updateCellEditors();
+//								}
+//				 });
+//		  super.hookControl(control);
+//	}                                
+//
+//	protected void updateCellEditors()
+//	{
+//		CellEditor[] cellEditors = new CellEditor[2];
+//		cellEditors[0] = cellEditor;
+//		cellEditors[1] = cellEditor;
+//
+//		Element element = (Element)getInput();
+//              
+//		IPropertyDescriptor[] propertyDescriptors = propertySource.getPropertyDescriptors();
+//		int index = getTable().getSelectionIndex();
+//		if (index >= 0 && index < propertyDescriptors.length)
+//		{
+//			CellEditor[] oldCellEditors = getCellEditors();
+//			CellEditor oldCellEditor = (oldCellEditors.length > 1) ? oldCellEditors[1] : null;
+//			if (oldCellEditor != null && oldCellEditor != cellEditor)
+//			{
+//			 oldCellEditor.deactivate();
+//			 oldCellEditor.dispose();
+//			}
+//			cellEditors[1] = propertyDescriptors[index].createPropertyEditor(getTable());     
+//		}  
+//		setCellEditors(cellEditors);     
+//
+////		IPropertyDescriptor[] propertyDescriptors = propertySource.getPropertyDescriptors();
+////
+//// 		int index = getTable().getSelectionIndex();
+//// 		//cellEditor.dispose();
+////
+////		if (index >= 0 && index < propertyDescriptors.length)
+////		{
+////      cellEditor = propertyDescriptors[index].createPropertyEditor(getTable());
+////			Control control = cellEditor.getControl();
+////			if (control == null) {
+////				cellEditor.deactivate();
+////				cellEditor = null;
+////				return;
+////			}
+////			setCellEditors(new CellEditor[] {null, cellEditor});
+////			cellEditor.activate();
+////			cellEditor.setFocus();
+////		}
+//	}
+//                 
+//
+//	public String[] getStringArray(List list)
+//	{
+//		String[] result = new String[list.size()];
+//		for (int i = 0; i < result.length; i++)
+//		{
+//			result[i] = (String)list.get(i);
+//		}
+//		return result;
+//	}
+//                                   
+//	protected void resetCellEditors()
+//	{
+//			 CellEditor[] cellEditors = new CellEditor[2];
+//			 cellEditors[0] = null;
+//			 cellEditors[1] = cellEditor;
+//			 setCellEditors(cellEditors);  
+//	}
+//
+//
+//	class PropertyTableProvider extends LabelProvider implements ITableLabelProvider, IStructuredContentProvider
+//	{                  
+//		protected TableViewer viewer;
+//
+//		PropertyTableProvider(TableViewer viewer)
+//		{
+//			this.viewer = viewer;
+//		}
+//		
+//		public void inputChanged(Viewer viewer, Object oldInput, Object newInput)  
+//		{
+////		 resetCellEditors();                         
+////			if (newInput instanceof XMLElement)
+////			{      
+////					 propertySource = new ExtensiblePropertySource(editorPart, (XMLElement)newInput);
+////			} 
+////			if (newInput instanceof Element)
+////			{
+////				if (XSDDOMHelper.inputEquals(newInput, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+////				{  
+////				  propertySource = new ElementPropertySource((Element)newInput, viewer);
+////				}
+////				else
+////				{  
+////  				 propertySource = new ReadOnlyPropertySource(editorPart, (Element)newInput);
+////				}
+////			}
+////			else
+////			{
+////						 propertySource = null;
+////			}          
+//		}
+//
+//		public Image getColumnImage(Object element, int columnIndex)
+//		{  
+//			return null;
+//		}      
+//
+//		public Object getColumnValue(Object o, int columnIndex)  
+//		{ 
+//			IPropertyDescriptor propertyDescriptor = (IPropertyDescriptor)o;
+//			if (columnIndex == 0)
+//			{
+//			  return propertyDescriptor.getId();
+//			}
+//			else
+//			{  
+//			  return propertySource.getPropertyValue(propertyDescriptor.getId());
+//			}
+//		}
+//		  
+//		public String getColumnText(Object o, int columnIndex)  
+//		{ 
+//			IPropertyDescriptor propertyDescriptor = (IPropertyDescriptor)o;
+//			// (columnIndex == 1 && propertyDescriptor instanceof XSDComboBoxPropertyDescriptor)
+//			if ((columnIndex == 1 && propertyDescriptor instanceof OptionsComboBoxPropertyDescriptor) ||
+//			   (columnIndex == 1 && propertyDescriptor instanceof ComboBoxPropertyDescriptor))
+//			{
+//			  ILabelProvider lp = propertyDescriptor.getLabelProvider();
+//			  if (lp != null)
+//		  	{
+//			    return lp.getText(propertyDescriptor.getId());
+//		  	}
+//			}
+//			
+//			Object id = propertyDescriptor.getId();
+//      String attribute = "";
+//		  if (id != null && attribute instanceof String)
+//      {
+//        attribute = (String)id;
+//      }
+//      Object value = propertySource.getPropertyValue(attribute);
+//      String attributeValue = "";
+//      if (value != null)
+//      {
+//        attributeValue = (String)value;
+//      }
+//
+//      return (columnIndex == 0) ? attribute : attributeValue;
+//			
+////			  return (columnIndex == 0) ? propertyDescriptor.getId().toString() : propertySource.getPropertyValue(propertyDescriptor.getId()).toString();
+//		}  
+//
+//		public Object[] getElements(Object o)
+//		{         
+//						Object[] result = propertySource.getPropertyDescriptors();
+//						// For some strange reson the ViewerSorter doesn't seem to be working for this table
+//						// As a workaround we sort them in this method before returning them to the viewer
+////						if (result.length > 0)
+////						{
+////									 Arrays.sort(result, new InternalComparator());
+////						}
+//						return result;
+//		}
+//	}
+//
+//	class InternalComparator implements Comparator
+//	{
+//			 public int compare(Object e1, Object e2) 
+//			 {
+//							IPropertyDescriptor p1 = (IPropertyDescriptor)e1;
+//							IPropertyDescriptor p2 = (IPropertyDescriptor)e2;
+//							String p1Name = p1.getDisplayName();
+//							String p2Name = p2.getDisplayName();
+//							return Collator.getInstance().compare(p1.getDisplayName(), p2.getDisplayName());
+//			 }         
+//	}
+//
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/BasePropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/BasePropertySource.java
new file mode 100644
index 0000000..9d92d18
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/BasePropertySource.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.wst.xml.core.NameValidator;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+public abstract class BasePropertySource implements IPropertySource
+{
+	protected Element element;
+	protected Viewer viewer;
+	protected IPropertyDescriptor[] propertyDescriptors;
+	protected XSDSchema xsdSchema;
+	protected String [] trueFalseComboValues = {
+		"",
+		"false",
+		"true"
+	};
+
+  public BasePropertySource()
+  {
+    
+  }
+
+  public DocumentImpl getDocument(Element element)
+  {
+    return (DocumentImpl) element.getOwnerDocument();
+  }
+  
+  public void beginRecording(String description, Element element)
+  {
+    getDocument(element).getModel().beginRecording(this, description);
+  }
+  
+  public void endRecording(Element element)
+  {
+    DocumentImpl doc = (DocumentImpl) getDocument(element);
+    
+    doc.getModel().endRecording(this);    
+  }
+  
+  
+  public BasePropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    this.viewer = viewer;
+    this.xsdSchema = xsdSchema;
+  }
+  
+  public BasePropertySource(XSDSchema xsdSchema)
+  {
+    this.xsdSchema = xsdSchema;
+  }
+  
+  public void setViewer(Viewer viewer)
+  {
+    this.viewer = viewer;
+  }
+
+  public void setInput(Element element)
+  {
+    this.element = element;
+  }
+
+  protected XSDDOMHelper domHelper = new XSDDOMHelper();
+  /**
+   * Gets the domHelper.
+   * @return Returns a XSDDomHelper
+   */
+  public XSDDOMHelper getDomHelper()
+  {
+    return domHelper;
+  }
+  
+	protected boolean hasElementChildren(Node parentNode)
+	{
+		boolean hasChildrenElements = false;
+		if (parentNode != null && parentNode.hasChildNodes())
+		{
+			NodeList nodes = parentNode.getChildNodes();
+			for (int i = 0; i < nodes.getLength(); i++)
+			{
+				if (nodes.item(i) instanceof Element)
+				{
+					hasChildrenElements = true;
+					break;
+				}
+			}
+		}
+		return hasChildrenElements;
+	}
+  
+  protected boolean validateName(String name)
+  {
+    return NameValidator.isValid(name);
+  }
+
+  // TODO
+  protected boolean validateLanguage(String lang)
+  {
+    return true;
+  }
+  
+  // TODO  
+  protected boolean validatePrefix(String prefix)
+  {
+    return true;
+  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ComplexTypePropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ComplexTypePropertySource.java
new file mode 100644
index 0000000..7cb09e9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ComplexTypePropertySource.java
@@ -0,0 +1,380 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.actions.SetBaseTypeAction;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalSimpleOrComplexTypeRenamer;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class ComplexTypePropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  private String DERIVED_BY_ID = "derived by"; // XSDEditorPlugin.getXSDString("_UI_LABEL_DERIVED_BY"); 
+  private String BASE_TYPE_ID = "base type"; //  XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE");
+  
+  private String[] blockOrFinalComboValues = 
+  {
+    "",
+    "#all",
+    "extension",
+    "restriction"
+  };
+  
+  private String derivedByChoicesComboValues[] =
+  {
+        "",
+        XSDConstants.RESTRICTION_ELEMENT_TAG,
+        XSDConstants.EXTENSION_ELEMENT_TAG
+  };
+  
+  /**
+   * 
+   */
+  public ComplexTypePropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public ComplexTypePropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public ComplexTypePropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    boolean isAnonymousType = checkForAnonymousType(element);
+// The three properties name, base type and derived by have been moved to the general tab
+//    if (isAnonymousType)
+//    {
+//      PropertyDescriptor nameDescriptor =
+//      new PropertyDescriptor(
+//          XSDConstants.NAME_ATTRIBUTE,
+//          XSDConstants.NAME_ATTRIBUTE);
+//      list.add(nameDescriptor);
+//    }
+//    else
+//    {
+//      PropertyDescriptor nameDescriptor =
+//      new TextPropertyDescriptor(
+//          XSDConstants.NAME_ATTRIBUTE,
+//          XSDConstants.NAME_ATTRIBUTE);
+//      list.add(nameDescriptor);
+//    }
+
+    Element contentModelElement = getDomHelper().getContentModelFromParent(element);
+//    SimpleContentPropertyDescriptor typeDescriptor = new SimpleContentPropertyDescriptor(
+//        BASE_TYPE_ID,
+//        BASE_TYPE_ID,
+//        contentModelElement, xsdSchema);
+//    list.add(typeDescriptor);
+//    XSDComboBoxPropertyDescriptor derivedByDescriptor =
+//    new XSDComboBoxPropertyDescriptor(
+//        DERIVED_BY_ID,
+//        DERIVED_BY_ID,
+//        derivedByChoicesComboValues);
+//    list.add(derivedByDescriptor);
+    
+    XSDComboBoxPropertyDescriptor abstractDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        XSDConstants.ABSTRACT_ATTRIBUTE,
+        XSDConstants.ABSTRACT_ATTRIBUTE,
+        trueFalseComboValues);
+    list.add(abstractDescriptor);
+
+    XSDComboBoxPropertyDescriptor mixedDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        XSDConstants.MIXED_ATTRIBUTE,
+        XSDConstants.MIXED_ATTRIBUTE,
+        trueFalseComboValues);
+    list.add(mixedDescriptor);
+        
+    XSDComboBoxPropertyDescriptor blockDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        XSDConstants.BLOCK_ATTRIBUTE,
+        XSDConstants.BLOCK_ATTRIBUTE,
+        blockOrFinalComboValues);
+    list.add(blockDescriptor);
+    XSDComboBoxPropertyDescriptor finalDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        XSDConstants.FINAL_ATTRIBUTE,
+        XSDConstants.FINAL_ATTRIBUTE,
+        blockOrFinalComboValues);
+    list.add(finalDescriptor);
+    
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+
+  public void setInput(Element element)
+  {
+    this.element = element;
+    
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      String attributeName = (String)id;
+      result = element.getAttribute((String) id);
+      Element contentModelElement = getDomHelper().getContentModelFromParent(element);    
+      String baseType = getDomHelper().getBaseType(contentModelElement);
+      
+      if (result == null)
+      {
+        result = "";
+      }
+      
+      if (attributeName.equals(DERIVED_BY_ID))
+      {
+        return getDomHelper().getDerivedByName(contentModelElement);
+      }
+      else if (attributeName.equals(BASE_TYPE_ID))
+      {
+        if (baseType != null)
+        {
+          return baseType;
+        }
+        else
+        {
+          return "";
+        }
+      }
+      else if (attributeName.equals(XSDConstants.NAME_ATTRIBUTE))
+      {
+        String name = element.getAttribute(XSDConstants.NAME_ATTRIBUTE);
+        
+        boolean isAnonymousType = checkForAnonymousType(element);
+        if (isAnonymousType)
+        {
+          return "**anonymous**";
+        }
+        else
+        {
+          return name;
+        }
+      }
+        
+      return result;
+//      if (((String) id).equals(XSDConstants.ABSTRACT_ATTRIBUTE)
+//          || ((String) id).equals(XSDConstants.MIXED_ATTRIBUTE))
+//      {
+//      }
+//      else if (((String) id).equals(XSDConstants.BLOCK_ATTRIBUTE))
+//       {
+//      }
+//      else if (((String) id).equals(XSDConstants.FINAL_ATTRIBUTE))
+//      {
+//      }
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      String newValue = (String)value;
+      String attributeName = (String)id;
+      
+      if (attributeName.equals(XSDConstants.NAME_ATTRIBUTE))
+      {
+        if (validateName(newValue))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_COMPLEXTYPE_NAME_CHANGE"), element);
+          if (newValue.length() > 0)
+          {
+            // now rename any references to this type
+            if (xsdSchema != null)
+            {
+              XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+              if (comp != null && comp instanceof XSDComplexTypeDefinition && comp.getContainer().equals(xsdSchema))
+              {
+//                XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)comp;
+//                ct.setName(newValue);
+                GlobalSimpleOrComplexTypeRenamer renamer = new GlobalSimpleOrComplexTypeRenamer((XSDNamedComponent)comp, newValue);
+                renamer.visitSchema(xsdSchema);
+              }
+            }
+            element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+          }
+          else
+          {
+            element.removeAttribute(XSDConstants.NAME_ATTRIBUTE);
+          }
+          endRecording(element);
+        }
+      }
+      else if (attributeName.equals(DERIVED_BY_ID))
+      {
+        Element contentModelElement = getDomHelper().getContentModelFromParent(element);
+        String baseType = getDomHelper().getBaseType(contentModelElement);
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_DERIVEDBY_CHANGE"), element);
+        Element derivedByElem = getDomHelper().getDerivedByElement(element);
+        getDomHelper().changeDerivedByType(contentModelElement, newValue, baseType);
+        endRecording(element);
+      }
+      else if (attributeName.equals(BASE_TYPE_ID))
+      {
+        String derivedBy = getDomHelper().getDerivedByName(element);
+        
+        SetBaseTypeAction setBaseTypeAction = new SetBaseTypeAction(XSDEditorPlugin.getXSDString("_UI_LABEL_SET_BASE_TYPE"));
+        setBaseTypeAction.setXSDSchema(xsdSchema);
+        setBaseTypeAction.setComplexTypeElement(element);
+        setBaseTypeAction.setType(newValue);
+        setBaseTypeAction.setDerivedBy(derivedBy);
+        setBaseTypeAction.performAction();
+
+//        handleBaseTypeComboChange(newValue);
+        
+      }
+      else
+      {
+        if (attributeName.equals(XSDConstants.ABSTRACT_ATTRIBUTE))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_COMPLEXTYPE_ABSTRACT_CHANGE"), element);
+        }
+        else if (attributeName.equals(XSDConstants.MIXED_ATTRIBUTE))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_COMPLEXTYPE_MIXED_CHANGE"), element);
+        }
+        else if (attributeName.equals(XSDConstants.BLOCK_ATTRIBUTE))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_COMPLEXTYPE_BLOCK_CHANGE"), element);
+        }
+        else if (attributeName.equals(XSDConstants.FINAL_ATTRIBUTE))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_COMPLEXTYPE_FINAL_CHANGE"), element);
+        }
+        
+        if (newValue.length() > 0)
+        {
+          element.setAttribute((String) id,  (String)value);
+        }
+        else
+        {
+          element.removeAttribute((String) id);
+        }
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+
+  boolean checkForAnonymousType(Element element)
+  {
+    Object parentElement = (Object)element.getParentNode();
+    boolean isAnonymous = false;
+    if (parentElement != null)
+    {
+      if (XSDDOMHelper.inputEquals(parentElement, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+      {
+        isAnonymous = true; 
+      }
+    }
+    return isAnonymous;
+  }
+  
+  
+//  private void handleBaseTypeComboChange(String newType)
+//  {
+//    String tempChoice = newType;
+//    TypesHelper helper = new TypesHelper(xsdSchema);
+//    if (helper.getBuiltInTypeNamesList().contains(tempChoice) ||
+//        helper.getUserSimpleTypeNamesList().contains(tempChoice))
+//    {
+//      derivedByCombo.setText(XSDConstants.EXTENSION_ELEMENT_TAG);
+//      derivedByCombo.setEnabled(false);
+//    }
+//    else if (helper.getUserComplexTypeNamesList().contains(tempChoice))
+//     {
+//      Element contentModelElement = getDomHelper().getContentModelFromParent(element);    
+//      String derivedByString = getDomHelper().getDerivedByName(contentModelElement);
+//      derivedByCombo.setText(derivedByString);
+//      derivedByCombo.setEnabled(true); 
+//    }
+//    else
+//     {
+//      derivedByCombo.setText("");
+//      derivedByCombo.setEnabled(false); 
+//    }
+//  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/DocumentationPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/DocumentationPropertySource.java
new file mode 100644
index 0000000..06e9ef7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/DocumentationPropertySource.java
@@ -0,0 +1,243 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Node;
+
+
+public class DocumentationPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  public static String CONTENT = "Content";
+  
+  /**
+   * 
+   */
+  public DocumentationPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public DocumentationPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+
+  }
+  /**
+   * @param xsdSchema
+   */
+  public DocumentationPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    PropertyDescriptor languageDescriptor =
+    new TextPropertyDescriptor(
+        "xml:lang",
+        "xml:lang"
+        );
+    list.add(languageDescriptor);
+    PropertyDescriptor sourceDescriptor =
+    new TextPropertyDescriptor(
+        XSDConstants.SOURCE_ATTRIBUTE,
+        XSDConstants.SOURCE_ATTRIBUTE);
+    list.add(sourceDescriptor);
+    AnyContentPropertyDescriptor contentDescriptor =
+    new AnyContentPropertyDescriptor(
+        CONTENT,
+        CONTENT,
+        element);
+    list.add(contentDescriptor);
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+     {
+      if (((String) id).equals(CONTENT))
+       {
+        try
+        {
+          if (element.hasChildNodes())
+           {
+            // if the element is Text
+            Node node = element.getFirstChild();
+            if (node instanceof CharacterData)
+             {
+              return ((CharacterData)node).getData();
+            }
+          }
+          else
+           {
+            return "";
+          }
+        }
+        catch (Exception e)
+        {
+          
+        }
+
+      }
+      else
+       {
+        result = element.getAttribute((String) id);
+      }
+    }
+    if (result == null)
+     {
+      result = "";
+    }
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value != null)
+    {
+      if (value instanceof String)
+      {
+        String newValue = (String)value;
+        if (((String)id).equals("xml:lang"))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_DOCUMENTATION_LANG_CHANGE"), element);
+          if (newValue.length() > 0)
+          {
+            if (validateLanguage(newValue))
+            {
+              element.setAttribute("xml:lang", newValue);
+            }
+          }
+          else
+          {
+            // clearErrorMessage();
+            element.removeAttribute("xml:lang");
+          }
+          endRecording(element);
+        }
+        else if (((String)id).equals(XSDConstants.SOURCE_ATTRIBUTE))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_DOCUMENTATION_SOURCE_CHANGE"), element);
+          if (newValue.length() > 0)
+          {
+            element.setAttribute(XSDConstants.SOURCE_ATTRIBUTE, newValue);
+          }
+          else
+          {
+            element.removeAttribute(XSDConstants.SOURCE_ATTRIBUTE);
+          }
+          endRecording(element);
+        }
+        else if (((String)id).equals(CONTENT))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_DOCUMENTATION_COMMENT_CHANGE"), element);
+          try
+          {
+            if (element.hasChildNodes())
+            {
+              // if the element is Text
+              Node node = element.getFirstChild();
+              if (node instanceof CharacterData)
+              {
+                ((CharacterData)node).setData(newValue);
+              }
+            }
+            else
+            {
+              if (newValue.length() > 0)
+              {
+                Node childNode = element.getOwnerDocument().createTextNode(newValue);
+                element.appendChild(childNode);
+              }
+            }
+            endRecording(element);
+          }
+          catch (Exception e)
+          {
+            
+          }
+        }
+        else  // shouldn't be here
+        {
+          element.setAttribute((String) id, newValue);
+        }
+      }
+      else if (value instanceof Integer)
+      {
+      }
+    }
+    else
+    {
+      element.removeAttribute((String) id);
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+ 
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/DynamicCellEditor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/DynamicCellEditor.java
new file mode 100644
index 0000000..131f0f0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/DynamicCellEditor.java
@@ -0,0 +1,1175 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTError;
+import org.eclipse.swt.accessibility.ACC;
+import org.eclipse.swt.accessibility.AccessibleAdapter;
+import org.eclipse.swt.accessibility.AccessibleControlAdapter;
+import org.eclipse.swt.accessibility.AccessibleControlEvent;
+import org.eclipse.swt.accessibility.AccessibleEvent;
+import org.eclipse.swt.accessibility.AccessibleTextAdapter;
+import org.eclipse.swt.accessibility.AccessibleTextEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+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.List;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.TypedListener;
+
+public class DynamicCellEditor extends Composite
+{
+	Text text;
+	List list;
+	int maxItemCount = 5;
+	Shell popup;
+	Button arrow;
+	boolean hasFocus;
+	
+  public DynamicCellEditor(Composite parent, int style) {
+	super (parent, checkStyle (style));
+	
+	style = getStyle();
+	
+	int textStyle = SWT.SINGLE;
+	if ((style & SWT.READ_ONLY) != 0) textStyle |= SWT.READ_ONLY;
+	if ((style & SWT.FLAT) != 0) textStyle |= SWT.FLAT;
+	text = new Text (this, textStyle);
+	
+	popup = new Shell (getShell (), SWT.NO_TRIM);
+	
+	int listStyle = SWT.SINGLE | SWT.V_SCROLL;
+	if ((style & SWT.FLAT) != 0) listStyle |= SWT.FLAT;
+	if ((style & SWT.RIGHT_TO_LEFT) != 0) listStyle |= SWT.RIGHT_TO_LEFT;
+	if ((style & SWT.LEFT_TO_RIGHT) != 0) listStyle |= SWT.LEFT_TO_RIGHT;
+	list = new List (popup, listStyle);
+	
+	int arrowStyle = SWT.ARROW | SWT.DOWN;
+	if ((style & SWT.FLAT) != 0) arrowStyle |= SWT.FLAT;
+	arrow = new Button (this, arrowStyle);
+
+	Listener listener = new Listener () {
+		public void handleEvent (Event event) {
+			if (popup == event.widget) {
+				popupEvent (event);
+				return;
+			}
+			if (text == event.widget) {
+				textEvent (event);
+				return;
+			}
+			if (list == event.widget) {
+				listEvent (event);
+				return;
+			}
+			if (arrow == event.widget) {
+				arrowEvent (event);
+				return;
+			}
+			if (DynamicCellEditor.this == event.widget) {
+				comboEvent (event);
+				return;
+			}
+
+		}
+	};
+	
+	int [] comboEvents = {SWT.Dispose, SWT.Move, SWT.Resize};
+	for (int i=0; i<comboEvents.length; i++) this.addListener (comboEvents [i], listener);
+	
+	int [] popupEvents = {SWT.Close, SWT.Paint, SWT.Deactivate};
+	for (int i=0; i<popupEvents.length; i++) popup.addListener (popupEvents [i], listener);
+	
+	int [] textEvents = {SWT.KeyDown, SWT.KeyUp, SWT.Modify, SWT.MouseDown, SWT.MouseUp, SWT.Traverse, SWT.FocusIn, SWT.FocusOut};
+	for (int i=0; i<textEvents.length; i++) text.addListener (textEvents [i], listener);
+	
+	int [] listEvents = {SWT.MouseUp, SWT.Selection, SWT.Traverse, SWT.KeyDown, SWT.KeyUp, SWT.FocusIn, SWT.FocusOut};
+	for (int i=0; i<listEvents.length; i++) list.addListener (listEvents [i], listener);
+	
+	int [] arrowEvents = {SWT.Selection, SWT.FocusIn, SWT.FocusOut};
+	for (int i=0; i<arrowEvents.length; i++) arrow.addListener (arrowEvents [i], listener);
+	
+	initAccessible();
+}
+static int checkStyle (int style) {
+	int mask = SWT.BORDER | SWT.READ_ONLY | SWT.FLAT | SWT.LEFT_TO_RIGHT | SWT.RIGHT_TO_LEFT;
+	return style & mask;
+}
+/**
+* Adds an item.
+* <p>
+* The item is placed at the end of the list.
+* Indexing is zero based.
+*
+* @param string the new item
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when the string is null
+* @exception SWTError(ERROR_ITEM_NOT_ADDED)
+*	when the item cannot be added
+*/
+public void add (String string) {
+	checkWidget();
+	if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	list.add (string);
+}
+/**
+* Adds an item at an index.
+* <p>
+* The item is placed at an index in the list.
+* Indexing is zero based.
+*
+* This operation will fail when the index is
+* out of range.
+*
+* @param string the new item
+* @param index the index for the item
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when the string is null
+* @exception SWTError(ERROR_ITEM_NOT_ADDED)
+*	when the item cannot be added
+*/
+public void add (String string, int index) {
+	checkWidget();
+	if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	list.add (string, index);
+}
+/**	 
+* Adds the listener to receive events.
+* <p>
+*
+* @param listener the listener
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when listener is null
+*/
+public void addModifyListener (ModifyListener listener) {;
+	checkWidget();
+	if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	TypedListener typedListener = new TypedListener (listener);
+	addListener (SWT.Modify, typedListener);
+}
+/**	 
+* Adds the listener to receive events.
+* <p>
+*
+* @param listener the listener
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when listener is null
+*/
+public void addSelectionListener(SelectionListener listener) {
+	checkWidget();
+	if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	TypedListener typedListener = new TypedListener (listener);
+	addListener (SWT.Selection,typedListener);
+	addListener (SWT.DefaultSelection,typedListener);
+}
+void arrowEvent (Event event) {
+	switch (event.type) {
+		case SWT.FocusIn: {
+			if (hasFocus) return;
+			hasFocus = true;
+			if (getEditable ()) text.selectAll ();
+			Event e = new Event();
+			e.time = event.time;
+			notifyListeners(SWT.FocusIn, e);
+			break;
+		}
+		case SWT.FocusOut: {
+			event.display.asyncExec(new Runnable() {
+				public void run() {
+					if (DynamicCellEditor.this.isDisposed()) return;
+					Control focusControl = getDisplay().getFocusControl();
+					if (focusControl == list || focusControl == text) return;
+					hasFocus = false;
+					Event e = new Event();
+					notifyListeners(SWT.FocusOut, e);
+				}
+			});
+			break;
+		}
+		case SWT.Selection: {
+			dropDown (!isDropped ());
+			break;
+		}
+	}
+}
+/**
+* Clears the current selection.
+* <p>
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+*/
+public void clearSelection () {
+	checkWidget();
+	text.clearSelection ();
+	list.deselectAll ();
+}
+void comboEvent (Event event) {
+	switch (event.type) {
+		case SWT.Dispose:
+			if (popup != null && !popup.isDisposed ()) popup.dispose ();
+			popup = null;  
+			text = null;  
+			list = null;  
+			arrow = null;
+			break;
+		case SWT.Move:
+			dropDown(false);
+			break;
+		case SWT.Resize:
+			internalLayout();
+			break;
+	}
+}
+
+public Point computeSize (int wHint, int hHint, boolean changed) {
+	checkWidget();
+	int width = 0, height = 0;
+	Point textSize = text.computeSize (wHint, SWT.DEFAULT, changed);
+	Point arrowSize = arrow.computeSize(SWT.DEFAULT, SWT.DEFAULT, changed);
+	Point listSize = list.computeSize (wHint, SWT.DEFAULT, changed);
+	int borderWidth = getBorderWidth();
+	
+	height = Math.max (hHint, Math.max(textSize.y, arrowSize.y)  + 2*borderWidth);
+	width = Math.max (wHint, Math.max(textSize.x + arrowSize.x + 2*borderWidth, listSize.x + 2)  );
+	return new Point (width, height);
+}
+/**
+* Deselects an item.
+* <p>
+* If the item at an index is selected, it is
+* deselected.  If the item at an index is not
+* selected, it remains deselected.  Indices
+* that are out of range are ignored.  Indexing
+* is zero based.
+*
+* @param index the index of the item
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+*/
+public void deselect (int index) {
+	checkWidget();
+	list.deselect (index);
+}
+/**
+* Deselects all items.
+* <p>
+*
+* If an item is selected, it is deselected.
+* If an item is not selected, it remains unselected.
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+*/
+public void deselectAll () {
+	checkWidget();
+	list.deselectAll ();
+}
+void dropDown (boolean drop) {
+	if (drop == isDropped ()) return;
+	if (!drop) {
+		popup.setVisible (false);
+		text.setFocus();
+		return;
+	}
+
+	int index = list.getSelectionIndex ();
+	if (index != -1) list.setTopIndex (index);
+	Display display = getDisplay ();
+	Rectangle listRect = list.getBounds ();
+	Rectangle parentRect = display.map (getParent (), null, getBounds());
+	Point comboSize = getSize ();
+	Rectangle displayRect = getMonitor().getClientArea();
+	int width = Math.max (comboSize.x, listRect.width + 2);
+	int height = listRect.height + 2;
+	int x = parentRect.x;
+	int y = parentRect.y + comboSize.y;
+	if (y + height > displayRect.y + displayRect.height) y = parentRect.y - height;
+	popup.setBounds (x, y, width, height);
+	popup.setVisible (true);
+	list.setFocus();
+}
+public Control [] getChildren () {
+	checkWidget();
+	return new Control [0];
+}
+boolean getEditable () {
+	return text.getEditable ();
+}
+/**
+* Gets an item at an index.
+* <p>
+* Indexing is zero based.
+*
+* This operation will fail when the index is out
+* of range or an item could not be queried from
+* the OS.
+*
+* @param index the index of the item
+* @return the item
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_CANNOT_GET_ITEM)
+*	when the operation fails
+*/
+public String getItem (int index) {
+	checkWidget();
+	return list.getItem (index);
+}
+/**
+* Gets the number of items.
+* <p>
+* This operation will fail if the number of
+* items could not be queried from the OS.
+*
+* @return the number of items in the widget
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_CANNOT_GET_COUNT)
+*	when the operation fails
+*/
+public int getItemCount () {
+	checkWidget();
+	return list.getItemCount ();
+}
+/**
+* Gets the height of one item.
+* <p>
+* This operation will fail if the height of
+* one item could not be queried from the OS.
+*
+* @return the height of one item in the widget
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_CANNOT_GET_ITEM_HEIGHT)
+*	when the operation fails
+*/
+public int getItemHeight () {
+	checkWidget();
+	return list.getItemHeight ();
+}
+/**
+* Gets the items.
+* <p>
+* This operation will fail if the items cannot
+* be queried from the OS.
+*
+* @return the items in the widget
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_CANNOT_GET_ITEM)
+*	when the operation fails
+*/
+public String [] getItems () {
+	checkWidget();
+	return list.getItems ();
+}
+/**
+* Gets the selection.
+* <p>
+* @return a point representing the selection start and end
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+*/
+public Point getSelection () {
+	checkWidget();
+	return text.getSelection ();
+}
+/**
+* Gets the index of the selected item.
+* <p>
+* Indexing is zero based.
+* If no item is selected -1 is returned.
+*
+* @return the index of the selected item.
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+*/
+public int getSelectionIndex () {
+	checkWidget();
+	return list.getSelectionIndex ();
+}
+/**
+* Gets the widget text.
+* <p>
+* If the widget has no text, an empty string is returned.
+*
+* @return the widget text
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+*/
+public String getText () {
+	checkWidget();
+	return text.getText ();
+}
+/**
+* Gets the height of the combo's text field.
+* <p>
+* The operation will fail if the height cannot 
+* be queried from the OS.
+
+* @return the height of the combo's text field.
+* 
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_ERROR_CANNOT_GET_ITEM_HEIGHT)
+*	when the operation fails
+*/
+public int getTextHeight () {
+	checkWidget();
+	return text.getLineHeight();
+}
+/**
+* Gets the text limit.
+* <p>
+* @return the text limit
+* 
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+*/
+public int getTextLimit () {
+	checkWidget();
+	return text.getTextLimit ();
+}
+/**
+* Gets the index of an item.
+* <p>
+* The list is searched starting at 0 until an
+* item is found that is equal to the search item.
+* If no item is found, -1 is returned.  Indexing
+* is zero based.
+*
+* @param string the search item
+* @return the index of the item
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when string is null
+*/
+public int indexOf (String string) {
+	checkWidget();
+	if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	return list.indexOf (string);
+}
+/**
+* Gets the index of an item.
+* <p>
+* The widget is searched starting at start including
+* the end position until an item is found that
+* is equal to the search itenm.  If no item is
+* found, -1 is returned.  Indexing is zero based.
+*
+* @param string the search item
+* @param index the starting position
+* @return the index of the item
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when string is null
+*/
+public int indexOf (String string, int start) {
+	checkWidget();
+	if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	return list.indexOf (string, start);
+}
+
+void initAccessible() {
+	getAccessible().addAccessibleListener(new AccessibleAdapter() {
+		public void getHelp(AccessibleEvent e) {
+			e.result = getToolTipText();
+		}
+	});
+	
+	getAccessible().addAccessibleTextListener(new AccessibleTextAdapter() {
+		public void getCaretOffset(AccessibleTextEvent e) {
+			e.offset = text.getCaretPosition();
+		}
+	});
+	
+	getAccessible().addAccessibleControlListener(new AccessibleControlAdapter() {
+		public void getChildAtPoint(AccessibleControlEvent e) {
+			Point testPoint = toControl(new Point(e.x, e.y));
+			if (getBounds().contains(testPoint)) {
+				e.childID = ACC.CHILDID_SELF;
+			}
+		}
+		
+		public void getLocation(AccessibleControlEvent e) {
+			Rectangle location = getBounds();
+			Point pt = toDisplay(new Point(location.x, location.y));
+			e.x = pt.x;
+			e.y = pt.y;
+			e.width = location.width;
+			e.height = location.height;
+		}
+		
+		public void getChildCount(AccessibleControlEvent e) {
+			e.detail = 0;
+		}
+		
+		public void getRole(AccessibleControlEvent e) {
+			e.detail = ACC.ROLE_COMBOBOX;
+		}
+		
+		public void getState(AccessibleControlEvent e) {
+			e.detail = ACC.STATE_NORMAL;
+		}
+
+		public void getValue(AccessibleControlEvent e) {
+			e.result = getText();
+		}
+	});
+}
+boolean isDropped () {
+	return popup.getVisible ();
+}
+public boolean isFocusControl () {
+	checkWidget();
+	if (text.isFocusControl() || arrow.isFocusControl() || list.isFocusControl() || popup.isFocusControl()) {
+		return true;
+	} else {
+		return super.isFocusControl();
+	}
+}
+
+//public boolean isListVisible()
+//{
+//  checkWidget();
+//  return list.isVisible();
+//}
+
+void internalLayout () {
+	if (isDropped ()) dropDown (false);
+	
+	Rectangle rect = getClientArea();
+	int width = rect.width;
+	int height = rect.height;
+	Point arrowSize = arrow.computeSize(SWT.DEFAULT, height);
+	text.setBounds (0, 0, width - arrowSize.x, height);
+	arrow.setBounds (width - arrowSize.x, 0, arrowSize.x, arrowSize.y);
+	
+	Point size = getSize();
+	int itemCount = list.getItemCount();
+	itemCount = (itemCount == 0) ? maxItemCount : Math.min(maxItemCount, itemCount);
+	int itemHeight = list.getItemHeight () * itemCount;
+	Point listSize = list.computeSize (SWT.DEFAULT, itemHeight);
+	list.setBounds (1, 1, Math.max (size.x - 2, listSize.x), listSize.y);
+}
+void listEvent (Event event) {
+	switch (event.type) {
+		case SWT.FocusIn: {
+			if (hasFocus) return;
+			hasFocus = true;
+			if (getEditable ()) text.selectAll ();
+			Event e = new Event();
+			e.time = event.time;
+			notifyListeners(SWT.FocusIn, e);
+			break;
+		}
+		case SWT.FocusOut: {
+			event.display.asyncExec(new Runnable() {
+				public void run() {
+					if (DynamicCellEditor.this.isDisposed()) return;
+					Control focusControl = getDisplay().getFocusControl();
+					if (focusControl == text || focusControl == arrow || focusControl == list) return;
+					hasFocus = false;
+					Event e = new Event();
+					notifyListeners(SWT.FocusOut, e);
+				}
+			});
+			break;
+		}
+		case SWT.MouseUp: {
+			if (event.button != 1) return;
+			dropDown (false);
+			break;
+		}
+		case SWT.Selection: {
+			int index = list.getSelectionIndex ();
+			if (index == -1) return;
+			text.setText (list.getItem (index));
+			text.selectAll ();
+			list.setSelection(index);
+			Event e = new Event();
+			e.time = event.time;
+			e.stateMask = event.stateMask;
+			e.doit = event.doit;
+			notifyListeners(SWT.Selection, e);
+			event.doit = e.doit;
+			break;
+		}
+		case SWT.Traverse: {
+			switch (event.detail) {
+				case SWT.TRAVERSE_TAB_NEXT:
+				case SWT.TRAVERSE_RETURN:
+				case SWT.TRAVERSE_ESCAPE:
+				case SWT.TRAVERSE_ARROW_PREVIOUS:
+				case SWT.TRAVERSE_ARROW_NEXT:
+					event.doit = false;
+					break;
+			}
+			Event e = new Event();
+			e.time = event.time;
+			e.detail = event.detail;
+			e.doit = event.doit;
+			e.keyCode = event.keyCode;
+			notifyListeners(SWT.Traverse, e);
+			event.doit = e.doit;
+			break;
+		}
+		case SWT.KeyUp: {		
+			Event e = new Event();
+			e.time = event.time;
+			e.character = event.character;
+			e.keyCode = event.keyCode;
+			e.stateMask = event.stateMask;
+			notifyListeners(SWT.KeyUp, e);
+			break;
+		}
+		case SWT.KeyDown: {
+			if (event.character == SWT.ESC) { 
+				// escape key cancels popup list
+				dropDown (false);
+			}
+			if (event.character == SWT.CR || event.character == '\t') {
+				// Enter and Tab cause default selection
+				dropDown (false);
+				Event e = new Event();
+				e.time = event.time;
+				e.stateMask = event.stateMask;
+				notifyListeners(SWT.DefaultSelection, e);
+			}
+			//At this point the widget may have been disposed.
+			// If so, do not continue.
+			if (isDisposed()) break;
+			Event e = new Event();
+			e.time = event.time;
+			e.character = event.character;
+			e.keyCode = event.keyCode;
+			e.stateMask = event.stateMask;
+			notifyListeners(SWT.KeyDown, e);
+			break;
+			
+		}
+	}
+}
+void popupEvent(Event event) {
+	switch (event.type) {
+		case SWT.Paint:
+			// draw black rectangle around list
+			Rectangle listRect = list.getBounds();
+			Color black = getDisplay().getSystemColor(SWT.COLOR_BLACK);
+			event.gc.setForeground(black);
+			event.gc.drawRectangle(0, 0, listRect.width + 1, listRect.height + 1);
+			break;
+		case SWT.Close:
+			event.doit = false;
+			dropDown (false);
+			break;
+		case SWT.Deactivate:
+			dropDown (false);
+			break;
+	}
+}
+public void redraw () {
+	super.redraw();
+	text.redraw();
+	arrow.redraw();
+	if (popup.isVisible()) list.redraw();
+}
+public void redraw (int x, int y, int width, int height, boolean all) {
+	super.redraw(x, y, width, height, true);
+}
+
+/**
+* Removes an item at an index.
+* <p>
+* Indexing is zero based.
+*
+* This operation will fail when the index is out
+* of range or an item could not be removed from
+* the OS.
+*
+* @param index the index of the item
+* @return the selection state
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_ITEM_NOT_REMOVED)
+*	when the operation fails
+*/
+public void remove (int index) {
+	checkWidget();
+	list.remove (index);
+}
+/**
+* Removes a range of items.
+* <p>
+* Indexing is zero based.  The range of items
+* is from the start index up to and including
+* the end index.
+*
+* This operation will fail when the index is out
+* of range or an item could not be removed from
+* the OS.
+*
+* @param start the start of the range
+* @param end the end of the range
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_ITEM_NOT_REMOVED)
+*	when the operation fails
+*/
+public void remove (int start, int end) {
+	checkWidget();
+	list.remove (start, end);
+}
+/**
+* Removes an item.
+* <p>
+* This operation will fail when the item
+* could not be removed from the OS.
+*
+* @param string the search item
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when string is null
+* @exception SWTError(ERROR_ITEM_NOT_REMOVED)
+*	when the operation fails
+*/
+public void remove (String string) {
+	checkWidget();
+	if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	list.remove (string);
+}
+/**
+* Removes all items.
+* <p>
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+*/
+public void removeAll () {
+	checkWidget();
+	text.setText (""); //$NON-NLS-1$
+	list.removeAll ();
+}
+/**	 
+* Removes the listener.
+* <p>
+*
+* @param listener the listener
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when listener is null
+*/
+public void removeModifyListener (ModifyListener listener) {
+	checkWidget();
+	if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	removeListener(SWT.Modify, listener);	
+}
+/**	 
+* Removes the listener.
+* <p>
+*
+* @param listener the listener
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when listener is null
+*/
+public void removeSelectionListener (SelectionListener listener) {
+	checkWidget();
+	if (listener == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	removeListener(SWT.Selection, listener);
+	removeListener(SWT.DefaultSelection,listener);	
+}
+/**
+* Selects an item.
+* <p>
+* If the item at an index is not selected, it is
+* selected. Indices that are out of
+* range are ignored.  Indexing is zero based.
+*
+* @param index the index of the item
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+*/
+public void select (int index) {
+	checkWidget();
+	if (index == -1) {
+		list.deselectAll ();
+		text.setText (""); //$NON-NLS-1$
+		return;
+	}
+	if (0 <= index && index < list.getItemCount()) {
+		if (index != getSelectionIndex()) {
+			text.setText (list.getItem (index));
+			text.selectAll ();
+			list.select (index);
+			list.showSelection ();
+		}
+	}
+}
+public void setBackground (Color color) {
+	super.setBackground(color);
+	if (text != null) text.setBackground(color);
+	if (list != null) list.setBackground(color);
+	if (arrow != null) arrow.setBackground(color);
+}
+public boolean setFocus () {
+	checkWidget();
+	return text.setFocus ();
+}
+public void setFont (Font font) {
+	super.setFont (font);
+	text.setFont (font);
+	list.setFont (font);
+	internalLayout ();
+}
+public void setForeground (Color color) {
+	super.setForeground(color);
+	if (text != null) text.setForeground(color);
+	if (list != null) list.setForeground(color);
+	if (arrow != null) arrow.setForeground(color);
+}
+/**
+* Sets the text of an item; indexing is zero based.
+*
+* This operation will fail when the index is out
+* of range or an item could not be changed in
+* the OS.
+*
+* @param index the index for the item
+* @param string the item
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when items is null
+* @exception SWTError(ERROR_ITEM_NOT_MODIFIED)
+*	when the operation fails
+*/
+public void setItem (int index, String string) {
+	checkWidget();
+	if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	list.setItem (index, string);
+}
+/**
+* Sets all items.
+*
+* @param items the array of items
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when items is null
+* @exception SWTError(ERROR_ITEM_NOT_ADDED)
+*	when the operation fails
+*/
+public void setItems (String [] items) {
+	checkWidget();
+	if (items == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	int style = getStyle();
+	if ((style & SWT.READ_ONLY) != 0) text.setText (""); //$NON-NLS-1$
+	list.setItems (items);
+}
+/**
+* Sets the new selection.
+*
+* @param selection point representing the start and the end of the new selection
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when selection is null
+*/
+public void setSelection (Point selection) {
+	checkWidget();
+	if (selection == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	text.setSelection (selection.x, selection.y);
+}
+
+/**
+* Sets the widget text.
+*
+* @param string the widget text
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_NULL_ARGUMENT)
+*	when string is null
+*/
+public void setText (String string) {
+	checkWidget();
+	if (string == null) SWT.error (SWT.ERROR_NULL_ARGUMENT);
+	int index = list.indexOf (string);
+	if (index == -1) {
+		list.deselectAll ();
+		text.setText (string);
+		return;
+	}
+	text.setText (string);
+	text.selectAll ();
+	list.setSelection (index);
+	list.showSelection ();
+}
+/**
+* Sets the text limit.
+* 
+* @param limit new text limit
+*
+* @exception SWTError(ERROR_THREAD_INVALID_ACCESS)
+*	when called from the wrong thread
+* @exception SWTError(ERROR_WIDGET_DISPOSED)
+*	when the widget has been disposed
+* @exception SWTError(ERROR_CANNOT_BE_ZERO)
+*	when limit is 0
+*/
+public void setTextLimit (int limit) {
+	checkWidget();
+	text.setTextLimit (limit);
+}
+
+public void setToolTipText (String string) {
+	checkWidget();
+	super.setToolTipText(string);
+	arrow.setToolTipText (string);
+	text.setToolTipText (string);		
+}
+
+public void setVisible (boolean visible) {
+	super.setVisible(visible);
+	if (!visible) popup.setVisible(false);
+}
+
+void textEvent (Event event) {
+	switch (event.type) {
+		case SWT.FocusIn: {
+			if (hasFocus) return;
+			hasFocus = true;
+			if (getEditable ()) text.selectAll ();
+			Event e = new Event();
+			e.time = event.time;
+			notifyListeners(SWT.FocusIn, e);
+			break;
+		}
+		case SWT.FocusOut: {
+			event.display.asyncExec(new Runnable() {
+				public void run() {
+					if (DynamicCellEditor.this.isDisposed()) return;
+					Control focusControl = getDisplay().getFocusControl();
+					if (focusControl == list || focusControl == arrow) return;
+					hasFocus = false;
+					Event e = new Event();
+					notifyListeners(SWT.FocusOut, e);
+				}
+			});
+			break;
+		}
+		case SWT.KeyDown: {
+			
+			if (event.character == SWT.ESC) { // escape key cancels popup list
+				dropDown (false);
+			}
+			if (event.character == SWT.CR) {
+				dropDown (false);
+				Event e = new Event();
+				e.time = event.time;
+				e.stateMask = event.stateMask;
+				notifyListeners(SWT.DefaultSelection, e);
+			}
+			//At this point the widget may have been disposed.
+			// If so, do not continue.
+			if (isDisposed()) break;
+			
+			if (event.keyCode == SWT.ARROW_UP || event.keyCode == SWT.ARROW_DOWN) {
+				int oldIndex = getSelectionIndex ();
+				if (event.keyCode == SWT.ARROW_UP) {
+					select (Math.max (oldIndex - 1, 0));
+				} else {
+					select (Math.min (oldIndex + 1, getItemCount () - 1));
+				}
+		
+				if (oldIndex != getSelectionIndex ()) {
+					Event e = new Event();
+					e.time = event.time;
+					e.stateMask = event.stateMask;
+					notifyListeners(SWT.Selection, e);
+				}
+				//At this point the widget may have been disposed.
+				// If so, do not continue.
+				if (isDisposed()) break;
+			}
+			
+			// Further work : Need to add support for incremental search in 
+			// pop up list as characters typed in text widget
+						
+			Event e = new Event();
+			e.time = event.time;
+			e.character = event.character;
+			e.keyCode = event.keyCode;
+			e.stateMask = event.stateMask;
+			notifyListeners(SWT.KeyDown, e);
+			break;
+		}
+		case SWT.KeyUp: {
+			Event e = new Event();
+			e.time = event.time;
+			e.character = event.character;
+			e.keyCode = event.keyCode;
+			e.stateMask = event.stateMask;
+			notifyListeners(SWT.KeyUp, e);
+			break;
+		}
+		case SWT.Modify: {
+			list.deselectAll ();
+			Event e = new Event();
+			e.time = event.time;
+			notifyListeners(SWT.Modify, e);
+			break;
+		}
+		case SWT.MouseDown: {
+			if (event.button != 1) return;
+			if (text.getEditable ()) return;
+			boolean dropped = isDropped ();
+			text.selectAll ();
+			if (!dropped) setFocus ();
+			dropDown (!dropped);
+			break;
+		}
+		case SWT.MouseUp: {
+			if (event.button != 1) return;
+			if (text.getEditable ()) return;
+			text.selectAll ();
+			break;
+		}
+		case SWT.Traverse: {		
+			switch (event.detail) {
+				case SWT.TRAVERSE_RETURN:
+				case SWT.TRAVERSE_ARROW_PREVIOUS:
+				case SWT.TRAVERSE_ARROW_NEXT:
+					// The enter causes default selection and
+					// the arrow keys are used to manipulate the list contents so
+					// do not use them for traversal.
+					event.doit = false;
+					break;
+			}
+			
+			Event e = new Event();
+			e.time = event.time;
+			e.detail = event.detail;
+			e.doit = event.doit;
+			e.keyCode = event.keyCode;
+			notifyListeners(SWT.Traverse, e);
+			event.doit = e.doit;
+			break;
+		}
+	}
+}
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ElementPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ElementPropertySource.java
new file mode 100644
index 0000000..1eba5d9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ElementPropertySource.java
@@ -0,0 +1,546 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalElementRenamer;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class ElementPropertySource extends BasePropertySource implements IPropertySource
+{
+  private static final String PROPERTY_NAME = "org.eclipse.wst.xsd.ui.internal.name";
+  private String[] blockComboValues =
+    { "", "#all", "extension", "restriction", "substitution" };
+  private String[] finalComboValues =
+    { "", "#all", "extension", "restriction" };
+  private String[] substitutionGroupComboValues = { "" };
+  private String[] formComboValues =
+  {
+      "",
+      XSDEditorPlugin.getXSDString("_UI_COMBO_UNQUALIFIED"),
+      XSDEditorPlugin.getXSDString("_UI_COMBO_QUALIFIED")
+  };
+
+  public ElementPropertySource()
+  {
+    super();
+  }
+
+  public ElementPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  
+  public ElementPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+
+  public void setInput(Element element)
+  {
+    this.element = element;
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    List globals = helper.getGlobalElements();
+    int size = globals.size() + 1;
+    substitutionGroupComboValues = new String[size];
+    substitutionGroupComboValues[0] = "";
+    if (globals != null)
+    {
+      for (int k = 0; k < globals.size(); k++)
+      {
+        substitutionGroupComboValues[k + 1] = (String) globals.get(k);
+      }
+    }
+  }
+
+  /*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+	 */
+  public Object getEditableValue()
+  {
+//    return element.getNodeName();
+    return null;
+  }
+
+  /*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+	 */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    Object parentNode = element.getParentNode();
+    boolean isGlobalElement = XSDDOMHelper.inputEquals(parentNode, XSDConstants.SCHEMA_ELEMENT_TAG, false);
+    
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+//  These have been moved to the general tab
+//    PropertyDescriptor nameDescriptor =
+//      new TextPropertyDescriptor(
+//        XSDConstants.NAME_ATTRIBUTE,
+//        XSDConstants.NAME_ATTRIBUTE);
+//    list.add(nameDescriptor);
+//    TypesPropertyDescriptor typeDescriptor = new TypesPropertyDescriptor(
+//        XSDConstants.TYPE_ATTRIBUTE,
+//        XSDConstants.TYPE_ATTRIBUTE,
+//        element, xsdSchema);
+//    list.add(typeDescriptor);
+    if (isGlobalElement)
+    {
+      XSDComboBoxPropertyDescriptor abstractDescriptor =
+        new XSDComboBoxPropertyDescriptor(
+          XSDConstants.ABSTRACT_ATTRIBUTE,
+          XSDConstants.ABSTRACT_ATTRIBUTE,
+          trueFalseComboValues);
+      list.add(abstractDescriptor);
+    }
+    if (!isGlobalElement)
+    {
+      PropertyDescriptor minOccursDescriptor =
+        new TextPropertyDescriptor(
+          XSDConstants.MINOCCURS_ATTRIBUTE,
+          XSDConstants.MINOCCURS_ATTRIBUTE);
+      list.add(minOccursDescriptor);
+    
+      PropertyDescriptor maxOccursDescriptor =
+        new TextPropertyDescriptor(
+          XSDConstants.MAXOCCURS_ATTRIBUTE,
+          XSDConstants.MAXOCCURS_ATTRIBUTE);
+      list.add(maxOccursDescriptor);
+    }
+    XSDComboBoxPropertyDescriptor nillableDescriptor =
+      new XSDComboBoxPropertyDescriptor(
+        XSDConstants.NILLABLE_ATTRIBUTE,
+        XSDConstants.NILLABLE_ATTRIBUTE,
+        trueFalseComboValues);
+    list.add(nillableDescriptor);
+    XSDComboBoxPropertyDescriptor blockDescriptor =
+      new XSDComboBoxPropertyDescriptor(
+        XSDConstants.BLOCK_ATTRIBUTE,
+        XSDConstants.BLOCK_ATTRIBUTE,
+        blockComboValues);
+    list.add(blockDescriptor);
+    if (isGlobalElement)
+    {      
+      XSDComboBoxPropertyDescriptor finalDescriptor =
+        new XSDComboBoxPropertyDescriptor(
+          XSDConstants.FINAL_ATTRIBUTE,
+          XSDConstants.FINAL_ATTRIBUTE,
+          finalComboValues);
+      list.add(finalDescriptor);
+      XSDComboBoxPropertyDescriptor substitutionGroupDescriptor =
+        new XSDComboBoxPropertyDescriptor(
+          XSDConstants.SUBSTITUTIONGROUP_ATTRIBUTE,
+          XSDConstants.SUBSTITUTIONGROUP_ATTRIBUTE,
+          substitutionGroupComboValues);
+      list.add(substitutionGroupDescriptor);
+    }
+    if (!isGlobalElement)
+    {
+      XSDComboBoxPropertyDescriptor formDescriptor =
+        new XSDComboBoxPropertyDescriptor(
+          XSDConstants.FORM_ATTRIBUTE,
+          XSDConstants.FORM_ATTRIBUTE,
+          formComboValues);
+      list.add(formDescriptor);
+    }
+
+    Attr fixedAttr = element.getAttributeNode(XSDConstants.FIXED_ATTRIBUTE);
+    Attr defaultAttr = element.getAttributeNode(XSDConstants.DEFAULT_ATTRIBUTE);
+    String str;
+    if (fixedAttr != null)
+    {
+      str = XSDConstants.FIXED_ATTRIBUTE;
+    }
+    else if (defaultAttr != null)
+    {
+      str = XSDConstants.DEFAULT_ATTRIBUTE;
+    }
+    else
+    {
+      str = XSDConstants.FIXED_ATTRIBUTE + "/" + XSDConstants.DEFAULT_ATTRIBUTE;
+    }
+    
+    FixedOrDefaultTextPropertyDescriptor fixedOrDefaultDescriptor =
+      new FixedOrDefaultTextPropertyDescriptor(
+        str, 
+        str,
+        element);
+    list.add(fixedOrDefaultDescriptor);
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+    //    return propertyDescriptors;
+  }
+
+  /*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+	 */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      String attributeName = (String)id;
+      result = element.getAttribute(attributeName);
+      if (result == null)
+      {
+        result = "";
+      }
+      if (attributeName.equals(XSDConstants.TYPE_ATTRIBUTE))
+      {
+        boolean isAnonymous = checkForAnonymousType(element);
+        if (isAnonymous)
+        {
+          return "**anonymous**";
+        }
+        if (result.equals(""))
+        {
+          result = XSDEditorPlugin.getXSDString("_UI_NO_TYPE");
+        }
+        return result;
+      }
+      else if (attributeName.equals(XSDConstants.MAXOCCURS_ATTRIBUTE) 
+        || attributeName.equals(XSDConstants.MINOCCURS_ATTRIBUTE)
+        || attributeName.equals(XSDConstants.SUBSTITUTIONGROUP_ATTRIBUTE)
+        || attributeName.equals(XSDConstants.FORM_ATTRIBUTE)
+        || attributeName.equals(XSDConstants.ABSTRACT_ATTRIBUTE)
+        || attributeName.equals(XSDConstants.NILLABLE_ATTRIBUTE)
+        || attributeName.equals(XSDConstants.BLOCK_ATTRIBUTE)
+        || attributeName.equals(XSDConstants.FINAL_ATTRIBUTE)
+        || attributeName.equals(XSDConstants.FIXED_ATTRIBUTE) 
+        || attributeName.equals(XSDConstants.DEFAULT_ATTRIBUTE)
+        || attributeName.equals(XSDConstants.NAME_ATTRIBUTE))
+      {
+        return result;
+      }
+    }
+    return "";
+  }
+
+  /*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+	 */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+
+  /*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+	 */
+  public void resetPropertyValue(Object id)
+  {
+  }
+
+  /*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object,
+	 *      java.lang.Object)
+	 */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      String newValue = (String)value;
+      String attributeName = (String)id;
+      
+      if (attributeName.equals(XSDConstants.MAXOCCURS_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_MAXOCCURS_CHANGE"), element);
+      }
+      else if (attributeName.equals(XSDConstants.MINOCCURS_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_MINOCCURS_CHANGE"), element);      
+      }
+      else if (attributeName.equals(XSDConstants.SUBSTITUTIONGROUP_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_SUBSTITUTIONGROUP_CHANGE"), element);
+      }
+      else if (attributeName.equals(XSDConstants.FORM_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_FORM_CHANGE"), element);
+      }
+      else if (attributeName.equals(XSDConstants.ABSTRACT_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_ABSTRACT_CHANGE"), element);
+      }
+      else if (attributeName.equals(XSDConstants.NILLABLE_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_NILLABLE_CHANGE"), element);
+      }
+      else if (attributeName.equals(XSDConstants.BLOCK_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_BLOCK_CHANGE"), element);
+      }
+      else if (attributeName.equals(XSDConstants.FINAL_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_FINAL_CHANGE"), element);
+      }
+      else if (attributeName.equals(XSDConstants.FIXED_ATTRIBUTE) || attributeName.equals(XSDConstants.DEFAULT_ATTRIBUTE))
+      {  
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_VALUE_CHANGE"), element);
+      }
+      else if (attributeName.equals(XSDConstants.NAME_ATTRIBUTE))
+      {
+        if (validateName(newValue))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_NAME_CHANGE"), element);
+          // now rename any references to this element
+          if (xsdSchema != null)
+          {
+            XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+            if (comp != null && comp instanceof XSDElementDeclaration && comp.getContainer().equals(xsdSchema))
+            {
+              GlobalElementRenamer renamer = new GlobalElementRenamer((XSDNamedComponent)comp, newValue);
+              renamer.visitSchema(xsdSchema);
+            }
+          }
+        }
+      }
+      else if (attributeName.equals(XSDConstants.TYPE_ATTRIBUTE))
+      {
+        // put logic in descriptor/cell editor
+//          beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_TYPE_CHANGE"), element);
+      }
+    
+      if (newValue.length() > 0)
+      {
+        element.setAttribute((String) id, (String) value);
+      }
+      else
+      {
+        if (!attributeName.equals(XSDConstants.NAME_ATTRIBUTE))
+        {
+          element.removeAttribute((String) id);
+        }
+      }
+      endRecording(element);
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+
+  }
+
+  boolean checkForAnonymousType(Element element)
+  {
+    /* Using Ed's model to check
+     boolean isAnonymous = false;
+
+     XSDConcreteComponent component = getXSDSchema().getCorrespondingComponent(element);
+     if (component instanceof XSDElementDeclaration)
+     {
+     XSDElementDeclaration xsdElem = (XSDElementDeclaration)component;
+     isAnonymous = xsdElem.isSetAnonymousTypeDefinition();
+     }
+     return isAnonymous;
+     */
+
+    boolean isAnonymous = false;
+
+    Node aNode = getDomHelper().getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+    if (aNode != null)
+     {
+      return true;
+    }
+    aNode = getDomHelper().getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+    if (aNode != null)
+     {
+      isAnonymous = true;
+    }
+    return isAnonymous;
+  }
+  
+  
+//  void updateElementToAnonymous(Element element, String xsdType)
+//  {
+//    String prefix = element.getPrefix();
+//    prefix = (prefix == null) ? "" : (prefix + ":");
+//
+//    updateElementToNotAnonymous(element);
+//    boolean hasChildrenElements = hasElementChildren(element);
+//
+//    Element childNode = null;
+//    if (xsdType.equals(XSDConstants.COMPLEXTYPE_ELEMENT_TAG))
+//     {
+//      childNode = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+//    }
+//    else if (xsdType.equals(XSDConstants.SIMPLETYPE_ELEMENT_TAG))
+//     {
+//      childNode = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+//    }
+//
+//    element.appendChild(childNode);
+//    formatChild(childNode, hasChildrenElements);    
+//
+//
+//    /* Using Ed's model to do the above
+//     XSDConcreteComponent component = getXSDSchema().getCorrespondingComponent(element);
+//     if (component instanceof XSDElementDeclaration)
+//     {
+//     XSDElementDeclaration xsdElem = (XSDElementDeclaration)component;
+//     XSDFactoryImpl factory = new XSDFactoryImpl();
+//     XSDComplexTypeDefinition complex = factory.createXSDComplexTypeDefinition();
+//     XSDSimpleTypeDefinition simple = factory.createXSDSimpleTypeDefinition();
+//
+//     Node child = element.getFirstChild();
+//     if (XSDDOMHelper.inputEquals(child, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false) ||
+//     XSDDOMHelper.inputEquals(child, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+//     {
+//     element.removeChild(child);
+//     }
+//     
+//     FormatProcessor formatProcessor = new FormatProcessor();
+//     if (xsdType.equals(XSDConstants.COMPLEXTYPE_ELEMENT_TAG))
+//     {
+//     xsdElem.setAnonymousTypeDefinition(complex);
+//     Element elem = complex.getElement();
+//     formatProcessor.formatWithSiblingIndent((XMLNode)elem);
+//     }
+//     else if (xsdType.equals(XSDConstants.SIMPLETYPE_ELEMENT_TAG))
+//     {
+//     xsdElem.setAnonymousTypeDefinition(simple);
+//     Element elem = simple.getElement();  
+//     formatProcessor.formatWithSiblingIndent((XMLNode)elem);
+//     }
+//     }
+//     component.updateElement();
+//     */
+//  }
+//
+//  boolean isSTAnonymous(Element element)
+//  {
+//    Node aNode = getDomHelper().getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+//    if (aNode != null)
+//     {
+//      if (XSDDOMHelper.inputEquals(aNode, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+//       {
+//        return true;
+//      }
+//    }
+//    return false;
+//  }  
+//
+//  boolean isCTAnonymous(Element element)
+//  {
+//    Node aNode = getDomHelper().getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+//    if (aNode != null)
+//     {
+//      if (XSDDOMHelper.inputEquals(aNode, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+//       {
+//        return true;
+//      }
+//    }
+//    return false;
+//  }  
+//
+//  XSDTypeDefinition getAnonymousTypeDefinition(Element element)
+//  {
+//    Node typeDefinitionNode = getDomHelper().getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+//    if (typeDefinitionNode == null)
+//     {
+//      typeDefinitionNode = getDomHelper().getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+//    }
+//    if (typeDefinitionNode != null)
+//     {
+//      XSDConcreteComponent component = getXSDSchema().getCorrespondingComponent(typeDefinitionNode);
+//      if (component instanceof XSDTypeDefinition)
+//       {
+//        return (XSDTypeDefinition)component;
+//      }
+//    }
+//    return null;    
+//
+//    /*    XSDConcreteComponent component = getXSDSchema().getCorrespondingComponent(element);
+//     if (component instanceof XSDElementDeclaration)
+//     {
+//     XSDElementDeclaration xsdElem = (XSDElementDeclaration)component;
+//
+//     return xsdElem.getAnonymousTypeDefinition();
+//     }
+//     return null;
+//     */
+//  }
+//
+//  void updateElementToNotAnonymous(Element element)
+//  {
+//    NodeList children = element.getChildNodes();
+//    if (children != null)
+//     {
+//      for (int i = 0; i < children.getLength(); i++)
+//       {
+//        Node node = (Node)children.item(i);
+//        if (node instanceof Element)
+//         {
+//          if (node.getLocalName().equals(XSDConstants.SIMPLETYPE_ELEMENT_TAG) ||
+//              node.getLocalName().equals(XSDConstants.COMPLEXTYPE_ELEMENT_TAG))
+//           {
+//            XSDDOMHelper.removeNodeAndWhitespace(node);
+//            i=0;
+//          }
+//        }
+//      }
+//    }
+//    /*    XSDConcreteComponent component = getXSDSchema().getCorrespondingComponent(element);
+//     if (component instanceof XSDElementDeclaration)
+//     {
+//     XSDElementDeclaration xsdElem = (XSDElementDeclaration)component;
+//     if (xsdElem.isSetAnonymousTypeDefinition())
+//     {
+//     xsdElem.unsetAnonymousTypeDefinition();
+//     xsdElem.setAnonymousTypeDefinition(null);
+//     }
+//     }
+//     component.updateElement();
+//     */
+//  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/EnumerationPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/EnumerationPropertySource.java
new file mode 100644
index 0000000..65124f7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/EnumerationPropertySource.java
@@ -0,0 +1,131 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+
+
+public class EnumerationPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  /**
+   * 
+   */
+  public EnumerationPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public EnumerationPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public EnumerationPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    PropertyDescriptor nameDescriptor =
+    new TextPropertyDescriptor(
+        XSDConstants.VALUE_ATTRIBUTE,
+        XSDConstants.VALUE_ATTRIBUTE);
+    list.add(nameDescriptor);
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+     {
+      result = element.getAttribute((String) id);
+    }
+    if (result == null)
+     {
+      result = "";
+    }
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value != null)
+    {
+      if (value instanceof String)
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ENUM_VALUE_CHANGE"), element);
+        element.setAttribute(XSDConstants.VALUE_ATTRIBUTE, (String)value);
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/FixedOrDefaultTextPropertyDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/FixedOrDefaultTextPropertyDescriptor.java
new file mode 100644
index 0000000..21e09aa
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/FixedOrDefaultTextPropertyDescriptor.java
@@ -0,0 +1,307 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.jface.window.Window;
+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.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.help.WorkbenchHelp;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorContextIds;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+
+
+public class FixedOrDefaultTextPropertyDescriptor extends PropertyDescriptor
+{
+  protected static String choice = "";
+  Element element;
+  /**
+   * @param id
+   * @param displayName
+   */
+  public FixedOrDefaultTextPropertyDescriptor(Object id, String displayName, Element element)
+  {
+    super(id, displayName);
+    this.element = element;
+  }
+  
+  public CellEditor createPropertyEditor(Composite parent)
+  {
+    CellEditor editor = new FixedOrDefaultTextCellEditor(parent);
+    if (getValidator() != null)
+      editor.setValidator(getValidator());
+    return editor;
+  }
+
+//    public void setChoice(String newChoice)
+//    {
+//      choice = newChoice;
+//    }
+
+  public Object getId()
+  {
+    Attr fixedAttr = element.getAttributeNode(XSDConstants.FIXED_ATTRIBUTE);
+    Attr defaultAttr = element.getAttributeNode(XSDConstants.DEFAULT_ATTRIBUTE);
+    if (fixedAttr != null)
+    {
+      choice = "fixed";
+    }
+    else if (defaultAttr != null) // what if both attributes were specified?  Use default...
+    {
+      choice = "default";
+    }
+    else
+    {
+      choice = "";
+    }
+
+    if (choice.equals("fixed"))
+     {
+      return "fixed";
+    }
+    else if (choice.equals("default"))
+     {
+      return "default";
+    }
+    else
+     {
+      return super.getId();
+    }
+  }
+  
+  public String getDisplayName()
+  {
+    Attr fixedAttr = element.getAttributeNode(XSDConstants.FIXED_ATTRIBUTE);
+    Attr defaultAttr = element.getAttributeNode(XSDConstants.DEFAULT_ATTRIBUTE);
+    if (fixedAttr != null)
+    {
+      choice = "fixed";
+    }
+    else if (defaultAttr != null) // what if both attributes were specified?  Use default...
+     {
+      choice = "default";
+    }
+    else
+    {
+      choice = "fixed/default";
+    }
+
+    if (choice.equals("fixed"))
+     {
+      return "fixed";
+    }
+    else if (choice.equals("default"))
+     {
+      return "default";
+    }
+    else
+     {
+      return super.getDisplayName();
+    }
+  }
+
+  class FixedOrDefaultTextCellEditor extends DialogCellEditor
+  {
+    public FixedOrDefaultTextCellEditor(Composite parent)
+    {
+      super(parent);
+    }
+
+    protected Object openDialogBox(Control cellEditorWindow)
+    {
+	    Shell shell = Display.getCurrent().getActiveShell();
+	    
+	    FixedOrDefaultDialog dialog = new FixedOrDefaultDialog(shell);
+
+	    dialog.setBlockOnOpen(true);
+	    dialog.create();
+	    
+	    String value = (String)getValue();
+	
+	    int result = dialog.open();
+	    
+	    if (result == Window.OK)
+	    {
+	      String newValue = dialog.getValue();
+        fireApplyEditorValue();
+	    }
+	    deactivate();
+      return null;
+	  }
+  }
+  
+  class FixedOrDefaultDialog extends Dialog implements SelectionListener
+  {
+    private int FIXED = 0;
+    private int DEFAULT = 1;
+    private int type;
+    private int value;
+    protected Button fixedButton, defaultButton;
+    protected Text valueField;
+    protected String valueString = "";
+    
+    public FixedOrDefaultDialog(Shell shell)
+    {
+      super(shell);
+    }
+
+    protected void configureShell(Shell shell)
+    {
+      super.configureShell(shell);
+    }
+
+    protected void buttonPressed(int buttonId)
+    {
+      if (buttonId == Dialog.OK)
+      {
+        valueString = valueField.getText();
+        applyEditorValueAndDeactivate();
+      }
+      super.buttonPressed(buttonId);
+    }
+
+    public String getValue() { return valueString; }
+    public String getType() { return type == FIXED? "fixed" : "default"; }
+
+    //
+    // Create the controls
+    //
+    public Control createDialogArea(Composite parent)
+    {
+      Composite client = (Composite)super.createDialogArea(parent);
+      getShell().setText("Fixed/Default Value");
+
+      GridLayout gl = new GridLayout(1, true);
+//      gl.marginHeight = 0;
+//      gl.marginWidth = 0;
+//      gl.horizontalSpacing = 0;
+//      gl.verticalSpacing = 0;
+      client.setLayout(gl);
+
+      GridData gd = new GridData();
+      gd.grabExcessHorizontalSpace = true;
+      gd.grabExcessVerticalSpace = true;
+      gd.horizontalAlignment = GridData.FILL;
+      gd.verticalAlignment = GridData.FILL;
+      gd.horizontalIndent = 0;
+      client.setLayoutData(gd);
+      
+//      isTextReadOnly = false;
+
+      fixedButton = ViewUtility.createRadioButton(client, XSDEditorPlugin.getXSDString("_UI_FIXED"));
+//    WorkbenchHelp.setHelp(fixedButton, XSDEditorContextIds.XSDE_ELEMENT_FIXED);
+      
+      defaultButton = ViewUtility.createRadioButton(client, XSDEditorPlugin.getXSDString("_UI_DEFAULT"));
+//    WorkbenchHelp.setHelp(defaultButton, XSDEditorContextIds.XSDE_ELEMENT_DEFAULT);
+
+      valueField = ViewUtility.createTextField(client, 30);
+      
+//    WorkbenchHelp.setHelp(valueField, XSDEditorContextIds.XSDE_ELEMENT_VALUE);
+//    valueField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_ELEMENT_VALUE"));
+
+      WorkbenchHelp.setHelp(fixedButton, XSDEditorContextIds.XSDE_ATTRIBUTE_FIXED);
+      WorkbenchHelp.setHelp(defaultButton, XSDEditorContextIds.XSDE_ATTRIBUTE_DEFAULT);
+      // WorkbenchHelp.setHelp(valueField, XSDEditorContextIds.XSDE_ATTRIBUTE_VALUE);
+      
+      Attr fixedAttr = element.getAttributeNode(XSDConstants.FIXED_ATTRIBUTE);
+      Attr defaultAttr = element.getAttributeNode(XSDConstants.DEFAULT_ATTRIBUTE);
+
+      if (fixedAttr != null)
+      {
+        fixedButton.setSelection(true);
+        defaultButton.setSelection(false);
+        choice = "fixed";
+        type = FIXED;
+        valueField.setText(element.getAttribute("fixed"));
+        valueField.setFocus();
+        valueField.selectAll();
+      }
+      if (defaultAttr != null) // what if both attributes were specified?  Use default...
+       {
+        fixedButton.setSelection(false);
+        defaultButton.setSelection(true);
+        choice = "default";
+        type = DEFAULT;
+        valueField.setText(element.getAttribute("default"));
+        valueField.setFocus();
+        valueField.selectAll();
+      }
+
+      fixedButton.addSelectionListener(this);
+      defaultButton.addSelectionListener(this);
+      return client;
+    }
+
+    void applyEditorValueAndDeactivate()
+    {
+      String value = valueField.getText();
+      if (value != null && value.length() > 0)
+      {
+        choice = type == FIXED? "fixed" : "default";
+      }
+      if (value != null && value.length() > 0)
+      {
+        if (choice.equals("fixed"))
+        {
+          element.removeAttribute(XSDConstants.DEFAULT_ATTRIBUTE);
+          element.setAttribute(XSDConstants.FIXED_ATTRIBUTE, value);
+        }
+        else if (choice.equals("default"))
+        {
+          element.removeAttribute(XSDConstants.FIXED_ATTRIBUTE);
+          element.setAttribute(XSDConstants.DEFAULT_ATTRIBUTE, value);
+        }
+      }
+      if (value.equals(""))
+      {
+        choice = "";
+        element.removeAttribute(XSDConstants.DEFAULT_ATTRIBUTE);
+        element.removeAttribute(XSDConstants.FIXED_ATTRIBUTE);
+      }
+    }
+
+    public void widgetSelected(SelectionEvent e)
+    {
+      if (e.widget == fixedButton && fixedButton.getSelection())
+      {
+        type = FIXED;
+        choice = "fixed";
+      }
+      else if (e.widget == defaultButton && defaultButton.getSelection())
+      {
+        type = DEFAULT;
+        choice = "default";
+      }
+    }
+
+  	public void widgetDefaultSelected(SelectionEvent e)
+    {
+    }
+
+  }
+  
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/GroupRefPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/GroupRefPropertySource.java
new file mode 100644
index 0000000..7f10f66
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/GroupRefPropertySource.java
@@ -0,0 +1,229 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class GroupRefPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  private String[] refComboValues = { "" };
+  /**
+   * 
+   */
+  public GroupRefPropertySource()
+  {
+    super();
+  }
+  
+//  public void setReferenceComboContextHelp(String contextId)
+//  {
+//    WorkbenchHelp.setHelp(refCombo, contextId);
+//  }
+  
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public GroupRefPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public GroupRefPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  
+  public void setInput(Element element)
+  {
+    this.element = element;
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    java.util.List items = helper.getGlobalElements();
+    if (XSDDOMHelper.inputEquals(element, XSDConstants.GROUP_ELEMENT_TAG, true))
+    {
+      items = helper.getModelGroups();
+      // Need tooltip for Group Ref
+//        minimumField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_ELEMENT_MINIMUM"));
+//        WorkbenchHelp.setHelp(minimumField, XSDEditorContextIds.XSDE_GROUP_REF_MINIMUM);
+//        maximumField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_ELEMENT_MAXIMUM"));
+//        WorkbenchHelp.setHelp(maximumField, XSDEditorContextIds.XSDE_GROUP_REF_MAXIMUM);
+    }
+    else if (XSDDOMHelper.inputEquals(element, XSDConstants.ELEMENT_ELEMENT_TAG, true))
+    {
+      items = helper.getGlobalElements();
+//        minimumField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_ELEMENT_MINIMUM"));
+//        WorkbenchHelp.setHelp(minimumField, XSDEditorContextIds.XSDE_ELEMENT_REF_MINIMUM);
+//        maximumField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_ELEMENT_MAXIMUM"));
+//        WorkbenchHelp.setHelp(maximumField, XSDEditorContextIds.XSDE_ELEMENT_REF_MAXIMUM);
+    }
+    
+    int size = items.size() + 1;
+    refComboValues = new String[size];
+    refComboValues[0] = "";
+    if (items != null)
+     {
+      for (int i = 0; i < items.size(); i++)
+       {
+        refComboValues[i + 1] = (String) items.get(i);
+      }
+    }
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    XSDComboBoxPropertyDescriptor refDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        XSDConstants.REF_ATTRIBUTE,
+        XSDConstants.REF_ATTRIBUTE,
+        refComboValues);
+    list.add(refDescriptor);
+    
+    PropertyDescriptor minOccursDescriptor =
+    new TextPropertyDescriptor(
+        XSDConstants.MINOCCURS_ATTRIBUTE,
+        XSDConstants.MINOCCURS_ATTRIBUTE);
+    list.add(minOccursDescriptor);
+    PropertyDescriptor maxOccursDescriptor =
+    new TextPropertyDescriptor(
+        XSDConstants.MAXOCCURS_ATTRIBUTE,
+        XSDConstants.MAXOCCURS_ATTRIBUTE);
+    list.add(maxOccursDescriptor);
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+      if (result == null)
+      {
+        result = "";
+      }
+      return result;
+      
+//      if (((String) id).equals(XSDConstants.REF_ATTRIBUTE))
+//      {
+//        return result;
+//      }
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      String newValue = (String)value;
+      String attributeName = (String)id;
+      if (((String) id).equals(XSDConstants.MAXOCCURS_ATTRIBUTE))
+      {
+        String max = (String)value;
+        String min = element.getAttribute(XSDConstants.MINOCCURS_ATTRIBUTE);
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_MAXOCCURS_CHANGE"), element);
+        if (max.length() > 0)
+        {
+          element.setAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE, max);
+        }
+        else
+        {
+          element.removeAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE);
+        }
+        endRecording(element);
+      }
+      else if (((String) id).equals(XSDConstants.MINOCCURS_ATTRIBUTE))
+      {
+        String min = (String)value;
+        String max = element.getAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE);
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_MINOCCURS_CHANGE"), element);
+        if (min.length() > 0)
+        {
+          element.setAttribute(XSDConstants.MINOCCURS_ATTRIBUTE, min);
+        }
+        else
+        {
+          element.removeAttribute(XSDConstants.MINOCCURS_ATTRIBUTE);
+        }
+        endRecording(element);
+      }
+      else if (((String) id).equals(XSDConstants.REF_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_GROUP_REF_CHANGE"), element);
+        element.setAttribute((String) id, newValue);
+        endRecording(element);
+      }
+    }
+//    Runnable delayedUpdate = new Runnable()
+//    {
+//      public void run()
+//      {
+        if (viewer != null)
+          viewer.refresh();
+//      }
+//    };
+//    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ImportPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ImportPropertySource.java
new file mode 100644
index 0000000..896c922
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ImportPropertySource.java
@@ -0,0 +1,335 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorContextIds;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.XSDExternalFileCleanup;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDSchemaHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDImport;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class ImportPropertySource
+  extends SchemaDirectiveHelperPropertySource
+  implements IPropertySource
+{
+  boolean isSetNamespace = false;
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public ImportPropertySource(Viewer viewer, XSDSchema xsdSchema, IFile currentIFile)
+  {
+    super(viewer, xsdSchema, false);
+    this.currentIFile = currentIFile;
+//     WorkbenchHelp.setHelp(controlsContainer, XSDEditorContextIds.XSDE_IMPORT_DESIGN_VIEW);
+//WorkbenchHelp.setHelp(selectButton, XSDEditorContextIds.XSDE_INCLUDE_HELPER_SELECT);
+//WorkbenchHelp.setHelp(prefixField, XSDEditorContextIds.XSDE_IMPORT_PREFIX);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public ImportPropertySource(XSDSchema xsdSchema, IFile currentIFile)
+  {
+    super(xsdSchema, false);
+    this.currentIFile = currentIFile;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    
+    SchemaLocationPropertyDescriptor schemaLocationDescriptor =
+    new SchemaLocationPropertyDescriptor(
+      XSDConstants.SCHEMALOCATION_ATTRIBUTE,
+      XSDConstants.SCHEMALOCATION_ATTRIBUTE
+      );
+    schemaLocationDescriptor.setHelpContextIds(XSDEditorContextIds.XSDE_INCLUDE_HELPER_SELECT);
+    list.add(schemaLocationDescriptor);
+    
+    if (isSetNamespace)
+    {
+      PropertyDescriptor prefixDescriptor = 
+      new TextPropertyDescriptor(
+        "Prefix",
+        "Prefix");
+      prefixDescriptor.setHelpContextIds(XSDEditorContextIds.XSDE_IMPORT_PREFIX);
+      list.add(prefixDescriptor);
+    }
+    else
+    {
+      PropertyDescriptor prefixDescriptor = 
+      new PropertyDescriptor(
+        "Prefix",
+        "Prefix");
+      prefixDescriptor.setHelpContextIds(XSDEditorContextIds.XSDE_IMPORT_PREFIX);
+      list.add(prefixDescriptor);
+    }
+
+    PropertyDescriptor namespaceDescriptor = 
+    new PropertyDescriptor(
+        XSDConstants.NAMESPACE_ATTRIBUTE,
+        XSDConstants.NAMESPACE_ATTRIBUTE);
+    list.add(namespaceDescriptor);  
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+      String attributeName = (String)id;
+      if (result == null)
+       {
+        result = "";
+      }
+
+      if (attributeName.equals("Prefix"))
+       {
+        TypesHelper helper = new TypesHelper(xsdSchema);
+        String aPrefix = helper.getPrefix(element.getAttribute(XSDConstants.NAMESPACE_ATTRIBUTE), false);
+        if (aPrefix != null && aPrefix.length() > 0)
+        {
+          return aPrefix;
+        }
+        return "";        
+      }
+      else
+       {
+        return result;
+      }
+    }
+    return "";
+    
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+     {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      String newValue = (String)value;
+      TypesHelper typesHelper = new TypesHelper(xsdSchema);
+      String namespace = element.getAttribute(XSDConstants.NAMESPACE_ATTRIBUTE);
+      String oldPrefixValue = typesHelper.getPrefix(namespace, false);
+      
+      String schemaLocation = element.getAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE);
+      if (((String) id).equals("Prefix"))
+      {
+        if (validatePrefix(newValue) &&  schemaLocation.length() > 0)
+        {
+          Map map = xsdSchema.getQNamePrefixToNamespaceMap();
+
+          if (map.containsKey(newValue))
+          {
+//          setErrorMessage(XSDEditorPlugin.getXSDString("_ERROR_LABEL_PREFIX_EXISTS"));
+          }
+          else
+          {
+            beginRecording(XSDEditorPlugin.getXSDString("_UI_PREFIX_CHANGE"), element);
+            
+            Element schemaElement = xsdSchema.getElement();
+            map.remove(oldPrefixValue);
+            map.put(newValue, namespace);
+            XSDSchemaHelper.updateElement(xsdSchema);
+
+            endRecording(element);  
+          }
+        }
+      }
+      else if (((String) id).equals(XSDConstants.SCHEMALOCATION_ATTRIBUTE))
+      { 
+        updateExternalModel((String)value, selectedIFile, selectedNamespace, selectedXSDSchema);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+  
+  public void setInput(Element element)
+  {
+    this.element = element;
+    String namespace = element.getAttribute(XSDConstants.NAMESPACE_ATTRIBUTE);
+    if (namespace != null && namespace.trim().length() > 0)
+    {
+      isSetNamespace = true;
+    }    
+    
+  }
+
+  protected void updateExternalModel(String newLocation, IFile newFile, String namespace, XSDSchema externalSchema)
+  {
+    if (xsdSchema == null) // in case we have a bad schema
+     {
+      return;
+    }
+    Element importElement = element;
+    if (namespace == null)
+    {
+      namespace = "";
+    }        
+    
+    XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+    if (comp instanceof XSDImport)
+    {
+      beginRecording(XSDEditorPlugin.getXSDString("_UI_IMPORT_CHANGE"), importElement);
+      java.util.Map map = xsdSchema.getQNamePrefixToNamespaceMap();
+      
+      // Referential integrity on old import
+      // How can we be sure that if the newlocation is the same as the oldlocation
+      // the file hasn't changed
+      
+      XSDSchema referencedSchema = ((XSDSchemaDirective)comp).getResolvedSchema();
+      if (referencedSchema != null)
+      {
+        XSDExternalFileCleanup cleanHelper = new XSDExternalFileCleanup(referencedSchema);
+        cleanHelper.visitSchema(xsdSchema);
+      }
+
+      Element schemaElement = xsdSchema.getElement();
+     
+//      String oldPrefix = prefixField.getText();
+//
+//      // Use the existing xmlns if available
+//      if (!map.containsValue(namespace))
+//      {
+//        if (oldPrefix.length() > 0)
+//        {
+//          schemaElement.removeAttribute("xmlns:"+oldPrefix);
+//          map.remove(oldPrefix);
+//        }
+//      }
+
+      XSDImport xsdImport = (XSDImport)comp;
+//      xsdImport.setSchemaLocation(null);
+//      xsdImport.setResolvedSchema(externalSchema);
+
+      // update the xmlns in the schema element first, and then update the import element next
+      // so that the last change will be in the import element.  This keeps the selection
+      // on the import element
+      TypesHelper helper = new TypesHelper(externalSchema);
+      String prefix = helper.getPrefix(namespace, false);
+      
+      boolean prefixAlreadyExists = false;
+      if (map.containsKey(prefix))
+      {
+        prefixAlreadyExists = true;
+      }
+      
+      if (prefix == null || (prefix !=null && prefix.length() == 0) || prefixAlreadyExists)
+      {
+        prefix = "pref";
+
+        int prefixExtension = 1;
+        while (map.containsKey(prefix) && prefixExtension < 100)
+         {
+          prefix = prefix + String.valueOf(prefixExtension);
+          prefixExtension++;
+        }
+      }
+
+      if (namespace.length() > 0)
+       {
+        // if ns already in map, use its corresponding prefix
+        if (map.containsValue(namespace))
+         {
+          TypesHelper typesHelper = new TypesHelper(xsdSchema);
+          prefix = typesHelper.getPrefix(namespace, false);
+        }
+        else // otherwise add to the map
+        {
+//          prefixMap.put(prefix, newLocation);
+          schemaElement.setAttribute("xmlns:"+prefix, namespace);
+        }
+      }
+
+      // Now update the import element's attributes
+      importElement.setAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE, newLocation);
+      
+      if (!namespace.equals(""))
+       {
+        importElement.setAttribute(XSDConstants.NAMESPACE_ATTRIBUTE, namespace);
+      }
+      else
+       {
+        importElement.removeAttribute(XSDConstants.NAMESPACE_ATTRIBUTE);
+      }
+      
+//      if (getEditor() != null)
+//       {
+//        getEditor().reparseSchema();
+//        getEditor().getGraphViewer().setSchema(getXSDSchema());
+//      }
+
+      endRecording(importElement);
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/IncludePropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/IncludePropertySource.java
new file mode 100644
index 0000000..bbc15e8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/IncludePropertySource.java
@@ -0,0 +1,238 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.XSDExternalFileCleanup;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDInclude;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class IncludePropertySource
+  extends SchemaDirectiveHelperPropertySource
+  implements IPropertySource
+{
+  /**
+   * 
+   */
+  public IncludePropertySource(IFile currentIFile)
+  {
+    super(true);
+    this.currentIFile = currentIFile;
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public IncludePropertySource(Viewer viewer, XSDSchema xsdSchema, IFile currentIFile)
+  {
+    super(viewer, xsdSchema, true);
+    this.currentIFile = currentIFile;
+  }
+  /**
+   * @param xsdSchema
+   */
+  public IncludePropertySource(XSDSchema xsdSchema, IFile currentIFile)
+  {
+    super(xsdSchema, true);
+    this.currentIFile = currentIFile;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    
+    SchemaLocationPropertyDescriptor schemaLocationDescriptor =
+    new SchemaLocationPropertyDescriptor(
+        XSDConstants.SCHEMALOCATION_ATTRIBUTE,
+        XSDConstants.SCHEMALOCATION_ATTRIBUTE);
+  
+    list.add(schemaLocationDescriptor);
+    
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+     {
+      result = element.getAttribute((String) id);
+      String attributeName = (String)id;
+      if (result == null)
+       {
+        result = "";
+      }
+      return result;
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      if (((String) id).equals(XSDConstants.SCHEMALOCATION_ATTRIBUTE))
+      { 
+        //element.setAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE, (String)value);
+        updateExternalModel((String)value, selectedIFile, selectedNamespace, selectedXSDSchema);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+  }
+
+  protected void updateExternalModel(String newLocation, IFile newFile, String namespace, XSDSchema externalSchema)
+  {
+    Element includeElement = element;
+
+    String existingSchemaLocation = includeElement.getAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE);
+
+//  beginRecording(XSDEditorPlugin.getXSDString("_UI_INCLUDE_CHANGE"), includeElement);
+    beginRecording("Include Change", includeElement);
+    includeElement.setAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE, newLocation);
+    
+    // If there is no existing schemaLocation, then just set it
+    if (existingSchemaLocation == null)
+    {
+      return;
+    }
+
+    XSDConcreteComponent includeComponent = xsdSchema.getCorrespondingComponent(includeElement);
+    if (includeComponent instanceof XSDInclude)
+     {
+      XSDInclude include = (XSDInclude) includeComponent;
+
+      XSDSchema referencedSchema = include.getResolvedSchema();
+      if (referencedSchema != null)
+      {
+        XSDExternalFileCleanup cleanHelper = new XSDExternalFileCleanup(referencedSchema);
+        cleanHelper.visitSchema(xsdSchema);
+        
+        xsdSchema.update();
+        include.updateElement();
+      }
+      
+    }
+    endRecording(includeElement);    
+  }
+
+  
+// Redefine's version
+//  protected void updateExternalModel(IFile newFile, String namespace, XSDSchema externalSchema)
+//  {
+//    Element redefineElement = (Element) getNode();
+//
+//    redefineElement.setAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE, locationField.getText());
+//
+//    String existingSchemaLocation = redefineElement.getAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE);
+//
+//    // If there is no existing schemaLocation, then just set it and return
+//    if (existingSchemaLocation == null)
+//     {
+//      return;
+//    }
+//
+//    XSDConcreteComponent redefineComponent = getXSDSchema().getCorrespondingComponent(redefineElement);
+//    if (redefineComponent instanceof XSDRedefine)
+//     {
+//      XSDRedefine redefine = (XSDRedefine) redefineComponent;
+//      XSDExternalFileCleanup cleanup = new XSDExternalFileCleanup(redefine.getIncorporatedSchema());
+//      
+//      cleanup.visitSchema(getXSDSchema());
+//      if (getEditor() != null)
+//       {
+//// DisplayErrorInTaskList task = new DisplayErrorInTaskList(getEditor().getEditorIDocument(), getEditor().getFileResource(), cleanup.getMessages());
+//// task.run();
+//        
+//        // Workaround to reset included elements in XSD model
+//        getEditor().reparseSchema();
+//        getEditor().getGraphViewer().setSchema(getXSDSchema());
+//      }
+//    }
+//
+//    /* since we are reparsing, we don't need this
+//
+//     Iterator contents = getXSDSchema().getContents().iterator();
+//     while (contents.hasNext())
+//     {
+//     XSDSchemaContent content = (XSDSchemaContent)contents.next();
+//     if (content instanceof XSDSchemaDirective)
+//     {
+//     XSDSchemaDirective directive = (XSDSchemaDirective)content;
+//
+//     if (directive.getSchemaLocation().equals(oldSchemaLocation) && directive instanceof XSDRedefine)
+//     {
+//     directive.unsetSchemaLocation();
+//     directive.setSchemaLocation(locationField.getText());
+//     directive.unsetResolvedSchema();
+//     redefineElement.setAttribute(XSDConstants.SCHEMALOCATION_ATTRIBUTE, locationField.getText());
+//     getXSDSchema().updateDocument();
+//     XSDSchemaHelper.updateElement(directive);
+////          directive.updateElement();
+//     break;
+//     }
+//     }
+//     }
+//     */
+//  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/KeyrefPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/KeyrefPropertySource.java
new file mode 100644
index 0000000..c3b4a4f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/KeyrefPropertySource.java
@@ -0,0 +1,210 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDIdentityConstraintDefinition;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class KeyrefPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  private String[] refComboValues = { "" };
+  /**
+   * 
+   */
+  public KeyrefPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public KeyrefPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public KeyrefPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  
+  public void setInput(Element element)
+  {
+    this.element = element;
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    java.util.List items = new ArrayList();
+
+    
+    if (xsdSchema != null)
+    {
+      Iterator iter = xsdSchema.getIdentityConstraintDefinitions().iterator();
+      String name = element.getAttribute(XSDConstants.NAME_ATTRIBUTE);
+      while (iter.hasNext())
+      {
+        XSDIdentityConstraintDefinition constraint = (XSDIdentityConstraintDefinition)iter.next();
+        if (name != null && !name.equals(""))
+         {
+          if (constraint.getName() != null)
+           {
+            if (!name.equals(constraint.getQName(xsdSchema)))
+            {
+              items.add(constraint.getQName(xsdSchema));
+            }
+          }
+        }
+        else
+         {
+          if (constraint.getName() != null)
+          {
+            items.add(constraint.getQName(xsdSchema));
+          }
+        }
+      }
+    }   
+    
+    int size = items.size() + 1;
+    refComboValues = new String[size];
+    refComboValues[0] = "";
+    if (items != null)
+     {
+      for (int i = 0; i < items.size(); i++)
+       {
+        refComboValues[i + 1] = (String) items.get(i);
+      }
+    }
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+// This property is moved to the General Tab
+//    PropertyDescriptor nameDescriptor =
+//    new TextPropertyDescriptor(
+//        XSDConstants.NAME_ATTRIBUTE,
+//        XSDConstants.NAME_ATTRIBUTE);
+//    list.add(nameDescriptor);
+    
+    XSDComboBoxPropertyDescriptor refDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        XSDConstants.REFER_ATTRIBUTE,
+        XSDConstants.REFER_ATTRIBUTE,
+        refComboValues);
+    list.add(refDescriptor);
+    
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+
+    if (id instanceof String)
+     {
+      result = element.getAttribute((String) id);
+      if (result == null)
+       {
+        result = "";
+      }
+      return result;
+//      if (((String) id).equals(XSDConstants.REFER_ATTRIBUTE))
+//      {
+//        return result;
+//      }
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      String newValue = (String)value;
+      if (((String) id).equals(XSDConstants.NAME_ATTRIBUTE))
+      {  
+        if (validateName(newValue))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_KEYREF_NAME_CHANGE"), element);
+          element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+          endRecording(element);
+        }         
+      }
+      else if (((String) id).equals(XSDConstants.REFER_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_KEYREF_REFER_CHANGE"), element);
+        element.setAttribute((String) id, newValue);
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ModelGroupPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ModelGroupPropertySource.java
new file mode 100644
index 0000000..750b81d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ModelGroupPropertySource.java
@@ -0,0 +1,266 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+public class ModelGroupPropertySource  // all or sequence or choice
+  extends BasePropertySource
+  implements IPropertySource
+{
+  private String[] modelGroupComboValues = { "sequence", "choice", "all" };
+  /**
+   * 
+   */
+  public ModelGroupPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public ModelGroupPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public ModelGroupPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+
+    XSDComboBoxPropertyDescriptor modelGroupDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        "model group",
+        "model group",
+        modelGroupComboValues);
+    list.add(modelGroupDescriptor);
+    
+    PropertyDescriptor minOccursDescriptor =
+    new TextPropertyDescriptor(
+        XSDConstants.MINOCCURS_ATTRIBUTE,
+        XSDConstants.MINOCCURS_ATTRIBUTE);
+    list.add(minOccursDescriptor);
+    PropertyDescriptor maxOccursDescriptor =
+    new TextPropertyDescriptor(
+        XSDConstants.MAXOCCURS_ATTRIBUTE,
+        XSDConstants.MAXOCCURS_ATTRIBUTE);
+    list.add(maxOccursDescriptor);
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+      String attributeName = (String)id;
+      if (result == null)
+       {
+        result = "";
+      }
+      if (attributeName.equals("model group"))
+      {
+        result = element.getLocalName();
+        return result;
+      }
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    String property = (String)id;
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      String newValue = (String)value;
+      if (property.equals("model group"))
+       {
+        Document doc = element.getOwnerDocument();
+        Element parent = (Element)element.getParentNode();
+        String prefix = element.getPrefix();
+        prefix = prefix == null ? "" : prefix + ":";
+        Element newNode = null;
+        // int compositor = XSDCompositor.SEQUENCE;
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_GROUP_SCOPE_CHANGE"), parent);
+        changeContentModel(parent, newValue);
+        endRecording(parent);
+        XSDDOMHelper domHelper = new XSDDOMHelper();
+        setInput(domHelper.getContentModelFromParent(parent));
+      }
+      else if (property.equals(XSDConstants.MAXOCCURS_ATTRIBUTE))
+      {
+        String max = (String)value;
+        String min = element.getAttribute(XSDConstants.MINOCCURS_ATTRIBUTE);
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_MAXOCCURS_CHANGE"), element);
+        if (max.length() > 0)
+        {
+          element.setAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE, max);
+        }
+        else
+         {
+          element.removeAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE);
+        }
+        endRecording(element);
+      }
+      else if (((String) id).equals(XSDConstants.MINOCCURS_ATTRIBUTE))
+       {
+        String min = (String)value;
+        String max = element.getAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE);
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_MINOCCURS_CHANGE"), element);
+        if (min.length() > 0)
+        {
+          element.setAttribute(XSDConstants.MINOCCURS_ATTRIBUTE, min);
+        }
+        else
+        {
+          element.removeAttribute(XSDConstants.MINOCCURS_ATTRIBUTE);
+        }
+        endRecording(element);
+      }
+    }
+
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+
+  public void setInput(Element element)
+  {
+    super.setInput(element);
+    
+    if (element != null)
+    {
+      boolean parentIsSequence = false;
+      boolean parentIsChoice = false;
+     
+      Object parent = element.getParentNode();
+      
+      if (XSDDOMHelper.inputEquals(parent, XSDConstants.SEQUENCE_ELEMENT_TAG, false))
+       {
+        parentIsSequence = true;
+      }
+      else if (XSDDOMHelper.inputEquals(parent, XSDConstants.CHOICE_ELEMENT_TAG, false))
+       {
+        parentIsChoice = true;
+      }
+      
+      if (parentIsChoice || parentIsSequence)
+      {
+        modelGroupComboValues = new String[2];
+        modelGroupComboValues[0] = XSDConstants.SEQUENCE_ELEMENT_TAG;
+        modelGroupComboValues[1] = XSDConstants.CHOICE_ELEMENT_TAG;
+      }
+      else
+      {
+        modelGroupComboValues = new String[3];
+        modelGroupComboValues[0] = XSDConstants.SEQUENCE_ELEMENT_TAG;
+        modelGroupComboValues[1] = XSDConstants.CHOICE_ELEMENT_TAG;
+        modelGroupComboValues[2] = XSDConstants.ALL_ELEMENT_TAG;
+      }
+    }      
+  }
+  
+  private void changeContentModel(Element parent, String contentModel)
+  {
+    Document doc = parent.getOwnerDocument();
+    XSDDOMHelper domHelper = new XSDDOMHelper();
+  
+    String prefix = parent.getPrefix();
+    prefix = prefix == null ? "" : prefix + ":";
+    
+    Element contentModelElement = domHelper.getContentModelFromParent(parent);
+  
+    if (contentModelElement.getLocalName().equals(contentModel))
+    {
+      return; // it's already the content model 
+    }
+  
+    Element newNode = doc.createElementNS(XSDDOMHelper.XMLSchemaURI, prefix + contentModel);
+  
+    if (contentModelElement.hasChildNodes())
+    {        
+      NodeList nodes = contentModelElement.getChildNodes();
+      // use clones so we don't have a refresh problem
+      for (int i = 0; i < nodes.getLength(); i++)
+      {
+        Node node = nodes.item(i);
+        newNode.appendChild(node.cloneNode(true)); 
+      }
+    }
+    parent.replaceChild(newNode, contentModelElement);
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/NamePropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/NamePropertySource.java
new file mode 100644
index 0000000..bbfb786
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/NamePropertySource.java
@@ -0,0 +1,219 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalAttributeGroupRenamer;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalGroupRenamer;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+
+public class NamePropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  /**
+   * 
+   */
+  public NamePropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public NamePropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public NamePropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+
+// From attribute group    
+//    WorkbenchHelp.setHelp(client, XSDEditorContextIds.XSDE_ATTRIBUTE_GROUP_DESIGN_VIEW);
+//    WorkbenchHelp.setHelp(nameField, XSDEditorContextIds.XSDE_ATTRIBUTE_GROUP_NAME);
+
+// From unique
+//    WorkbenchHelp.setHelp(nameField, XSDEditorContextIds.XSDE_UNIQUE_BASE_NAME);
+
+// From key
+//    WorkbenchHelp.setHelp(nameField, XSDEditorContextIds.XSDE_UNIQUE_BASE_NAME);
+    
+// From group
+//     WorkbenchHelp.setHelp(controlsContainer, XSDEditorContextIds.XSDE_GROUP_DESIGN_VIEW);
+//     WorkbenchHelp.setHelp(nameField, XSDEditorContextIds.XSDE_GROUP_NAME);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    PropertyDescriptor nameDescriptor =
+    new TextPropertyDescriptor(
+        XSDConstants.NAME_ATTRIBUTE,
+        XSDConstants.NAME_ATTRIBUTE);
+    list.add(nameDescriptor);
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+    }
+    if (result == null)
+    {
+      result = "";
+    }
+    return result;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value != null)
+    {
+      if (value instanceof String)
+      {
+        String newValue = (String)value;
+        if (XSDDOMHelper.inputEquals(element, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, false))
+        {  
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_ATTRIBUTEGROUP_NAME_CHANGE"), element);
+
+          // now rename any references to this element
+          if (xsdSchema != null)
+          {
+            XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+            if (comp != null && comp instanceof XSDAttributeGroupDefinition && comp.getContainer().equals(xsdSchema))
+            {
+              GlobalAttributeGroupRenamer renamer = new GlobalAttributeGroupRenamer((XSDNamedComponent)comp, (String)value);
+              renamer.visitSchema(xsdSchema);
+            }
+          }
+          element.setAttribute(XSDConstants.NAME_ATTRIBUTE, (String)value);
+          endRecording(element);
+        }
+        else if (XSDDOMHelper.inputEquals(element, XSDConstants.UNIQUE_ELEMENT_TAG, false))
+        {
+          if (validateName(newValue))
+           {
+            beginRecording(XSDEditorPlugin.getXSDString("_UI_UNIQUE_NAME_CHANGE"), element);
+            if (newValue.length() > 0)
+            {
+              element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+            }
+            else
+            {
+              element.setAttribute(XSDConstants.NAME_ATTRIBUTE, "");
+            }
+            endRecording(element);
+          }
+        }
+        else if (XSDDOMHelper.inputEquals(element, XSDConstants.KEY_ELEMENT_TAG, false))
+        {
+          if (validateName(newValue))
+          {
+            beginRecording(XSDEditorPlugin.getXSDString("_UI_KEY_NAME_CHANGE"), element);
+            if (newValue.length() > 0)
+            {
+              element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+            }
+            else
+            {
+              element.setAttribute(XSDConstants.NAME_ATTRIBUTE, "");
+            }
+            endRecording(element);
+          }
+        }
+        else if (XSDDOMHelper.inputEquals(element, XSDConstants.GROUP_ELEMENT_TAG, false))
+        {
+          if (validateName(newValue))
+           {
+            beginRecording(XSDEditorPlugin.getXSDString("_UI_GROUP_NAME_CHANGE"), element);
+            // now rename any references to this element
+            if (xsdSchema != null)
+             {
+              XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+              if (comp != null && comp instanceof XSDModelGroupDefinition && comp.getContainer().equals(xsdSchema))
+              {
+                GlobalGroupRenamer renamer = new GlobalGroupRenamer((XSDNamedComponent)comp, newValue);
+                renamer.visitSchema(xsdSchema);
+              }
+            }
+            element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+            endRecording(element);
+          }
+          
+        }
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/NotationPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/NotationPropertySource.java
new file mode 100644
index 0000000..573d83d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/NotationPropertySource.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+
+
+public class NotationPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  /**
+   * 
+   */
+  public NotationPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public NotationPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public NotationPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+// Removed for tabbed properties
+//    PropertyDescriptor nameDescriptor =
+//    new TextPropertyDescriptor(
+//        XSDConstants.NAME_ATTRIBUTE,
+//        XSDConstants.NAME_ATTRIBUTE);
+//    list.add(nameDescriptor);
+
+    PropertyDescriptor publicDescriptor =
+    new TextPropertyDescriptor(
+        XSDConstants.PUBLIC_ATTRIBUTE,
+        XSDConstants.PUBLIC_ATTRIBUTE);
+    list.add(publicDescriptor);
+    
+    PropertyDescriptor systemDescriptor =
+    new TextPropertyDescriptor(
+        XSDConstants.SYSTEM_ATTRIBUTE,
+        XSDConstants.SYSTEM_ATTRIBUTE);
+    list.add(systemDescriptor);
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+    
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+    }
+    if (result == null)
+    {
+      result = "";
+    }
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      String newValue = (String)value;
+      if (((String)id).equals(XSDConstants.NAME_ATTRIBUTE))
+      {
+        if (validateName(newValue))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_NOTATION_NAME_CHANGE"), element);
+          if (newValue.length() > 0)
+          {
+            element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+          }
+          else
+          {
+            element.setAttribute(XSDConstants.NAME_ATTRIBUTE, "");
+          }
+          endRecording(element);
+        }
+      }
+      else if (((String)id).equals(XSDConstants.PUBLIC_ATTRIBUTE))
+       {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_NOTATION_PUBLIC_CHANGE"), element);
+        if (newValue.length() > 0)
+        {
+          element.setAttribute(XSDConstants.PUBLIC_ATTRIBUTE, newValue);
+        }
+        else
+        {
+          element.setAttribute(XSDConstants.PUBLIC_ATTRIBUTE, "");
+        }
+        endRecording(element);
+      }
+      else if (((String)id).equals(XSDConstants.SYSTEM_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_NOTATION_SYSTEM_CHANGE"), element);
+        if (newValue.length() > 0)
+        {
+          element.setAttribute(XSDConstants.SYSTEM_ATTRIBUTE, newValue);
+        }
+        else
+        {
+          element.removeAttribute(XSDConstants.SYSTEM_ATTRIBUTE);
+        }
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/OptionsTextCellEditor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/OptionsTextCellEditor.java
new file mode 100644
index 0000000..3f0e591
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/OptionsTextCellEditor.java
@@ -0,0 +1,241 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+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.graphics.Rectangle;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+
+
+public abstract class OptionsTextCellEditor extends CellEditor implements SelectionListener, KeyListener
+{
+	private Composite fEditor;
+	protected Text fText;
+  protected boolean isTextReadOnly;
+	Button moreButton;
+	Shell dialog;
+
+	private String fSelection;
+	protected Object fValue;
+	int selection;
+	Object typeObject;
+		
+	private class ComboCellLayout extends Layout 
+	{
+		public void layout(Composite editor, boolean force)
+		{
+			Rectangle bounds= editor.getClientArea();
+			Point size= moreButton.computeSize(SWT.DEFAULT, bounds.height, force);
+			fText.setBounds(0, 0, bounds.width - size.x, bounds.height);
+			moreButton.setBounds(bounds.width - size.x, 0, size.x, size.y);
+		}
+		
+		public Point computeSize(Composite editor, int wHint, int hHint, boolean force)
+		{
+			if (wHint != SWT.DEFAULT && hHint != SWT.DEFAULT)
+			{
+				return new Point(wHint, hHint);
+			}
+			Point size= fText.computeSize(SWT.DEFAULT, SWT.DEFAULT, force);
+//			size.x += moreButton.computeSize(SWT.DEFAULT, SWT.DEFAULT, force).x;
+			return size;
+		}
+	}
+
+/**
+ * Creates a new combo box cell editor with the given choices.
+ */
+	 public OptionsTextCellEditor(Composite parent)
+	 {
+		 super(parent);
+		 fSelection = "";
+	 }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.CellEditor#createControl(org.eclipse.swt.widgets.Composite)
+   */
+	protected Control createControl(Composite parent)
+	{
+		fEditor = ViewUtility.createComposite(parent, 2);
+		fEditor.setLayout(new ComboCellLayout());
+ 
+    if (isTextReadOnly)
+    {
+		  fText = new Text(fEditor, SWT.LEFT | SWT.READ_ONLY);
+    }
+    else
+    {
+      fText = new Text(fEditor, SWT.LEFT);
+    }
+//    fText.setEnabled(false);
+
+		fText.setBackground(parent.getBackground());
+		fText.setText("");
+    fText.addKeyListener(this);
+		fText.addFocusListener(new FocusAdapter()
+    {
+			public void focusLost(FocusEvent e)
+      {
+				if (!moreButton.isFocusControl())
+				{
+					OptionsTextCellEditor.this.focusLost();
+				}
+			}
+		});
+			
+		moreButton = ViewUtility.createPushButton(fEditor, "...");
+		moreButton.addSelectionListener(new SelectionAdapter()
+		{
+			public void widgetSelected(SelectionEvent e)
+			{
+				// System.out.println("More Button Clicked");
+				openDialog();
+			}
+		});
+    moreButton.addKeyListener(this);
+		moreButton.addFocusListener(new FocusAdapter() {
+			public void focusLost(FocusEvent e) {
+				if (!fText.isFocusControl() && (dialog==null || 
+								dialog.isDisposed() || 
+								(dialog!=null && !dialog.isFocusControl())))
+				{
+          // System.out.println("MoreButton focusLost");
+					OptionsTextCellEditor.this.focusLost();
+				}
+			}
+		});
+
+
+		setValueValid(true);
+
+		return fEditor;
+	}
+  
+  public void activate()
+  {
+    // System.out.println("Cell editor activated");
+    fText.setText(fValue == null ? "" : fValue.toString());
+  }
+
+	protected void focusLost() {
+		// System.out.println("CELLEDITOR FOCUS LOST");
+		if (isActivated()) {
+			applyEditorValueAndDeactivate();
+		}
+	}
+
+	void applyEditorValueAndDeactivate() {
+		//	must set the selection before getting value
+//		if (dialog != null  && !dialog.isDisposed())
+//		{
+//			dialog.close();
+//			dialog.dispose();
+//		}
+		fireApplyEditorValue();
+		deactivate();
+	}
+
+  public void keyPressed(KeyEvent e)
+  {
+    if (e.character == SWT.ESC)
+     { // Escape character
+      fireCancelEditor();
+    }
+    else if ((e.character == SWT.CR) || (e.character == SWT.LF))
+     { // Return key
+      applyEditorValueAndDeactivate();
+    }
+  }
+  
+  public void keyReleased(KeyEvent e)
+  {
+    
+  }
+  
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.CellEditor#doGetValue()
+   * Returns the cell editor's value.
+	 */
+	protected Object doGetValue() 
+	{
+		return fValue;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.CellEditor#doSetFocus()
+   * Set the focus to the cell editor's UI representation.
+   */
+	protected void doSetFocus()
+	{
+//		fButton.setFocus();
+//		System.out.println("doSetFocus() " + moreButton.setFocus());
+		fText.setFocus();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.viewers.CellEditor#doSetValue(java.lang.Object)
+	 * Sets the value of the cell editor to the given value.
+   */
+	protected void doSetValue(Object value)
+	{
+		fValue = value;
+	}
+
+  protected Point getButtonAbsoluteLocation()
+  {
+    Rectangle buttonBounds = moreButton.getBounds();
+    int x = buttonBounds.x;
+    int y = buttonBounds.y;
+    Control c = moreButton;
+    while (c != null)
+     {
+      c = c.getParent();
+      if (c == null)
+        break;
+      x += c.getBounds().x;
+      y += c.getBounds().y;
+    }
+    x += buttonBounds.width + 5;
+    y += buttonBounds.height;
+    Point p = new Point(x,y);
+    return p;
+  }
+  
+  protected void cancel()
+  {
+    dialog.close();
+    dialog.dispose();
+  }
+
+	protected abstract void openDialog();	
+  
+	public void widgetSelected(SelectionEvent e)
+	{
+	}
+	public void widgetDefaultSelected(SelectionEvent e)
+  {
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/PatternPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/PatternPropertySource.java
new file mode 100644
index 0000000..38f166a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/PatternPropertySource.java
@@ -0,0 +1,272 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.wizards.RegexWizard;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+
+
+public class PatternPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  /**
+   * 
+   */
+  public PatternPropertySource()
+  {
+    super();
+//    expressionField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_PATTERN"));    
+//    WorkbenchHelp.setHelp(expressionField, XSDEditorContextIds.XSDE_PATTERN_VALUE);
+//    WorkbenchHelp.setHelp(activateWizardButton, XSDEditorContextIds.XSDE_PATTERN_REGULAR);
+//    activateWizardButton.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_REGEX_WIZARD_BUTTON"));
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public PatternPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public PatternPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+
+    PatternTextPropertyDescriptor patternDescriptor =
+    new PatternTextPropertyDescriptor(
+        XSDConstants.VALUE_ATTRIBUTE, 
+        XSDConstants.VALUE_ATTRIBUTE);
+    list.add(patternDescriptor);
+    
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+    }
+    if (result == null)
+    {
+      result = "";
+    }
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      if (((String) id).equals(XSDConstants.VALUE_ATTRIBUTE))
+      { 
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_PATTERN_VALUE_CHANGE"), element);
+        element.setAttribute(XSDConstants.VALUE_ATTRIBUTE, (String)value);
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+
+  public class PatternTextPropertyDescriptor extends PropertyDescriptor
+  {
+    /**
+     * @param id
+     * @param displayName
+     */
+    public PatternTextPropertyDescriptor(Object id, String displayName)
+    {
+      super(id, displayName);
+    }
+    
+    public CellEditor createPropertyEditor(Composite parent)
+    {
+      // CellEditor editor = new PatternTextCellEditor(parent);
+      CellEditor editor = new PatternDialogCellEditor(parent);
+      if (getValidator() != null)
+        editor.setValidator(getValidator());
+      return editor;
+    }
+  }   
+
+  public class PatternDialogCellEditor extends DialogCellEditor {
+
+    /**
+     * Creates a new Font dialog cell editor parented under the given control.
+     * The cell editor value is <code>null</code> initially, and has no 
+     * validator.
+     *
+     * @param parent the parent control
+     */
+    protected PatternDialogCellEditor(Composite parent) {
+      super(parent);
+    }
+
+    /**
+     * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(Control)
+     */
+    protected Object openDialogBox(Control cellEditorWindow)
+    {
+      String initialValue = element.getAttribute(XSDConstants.VALUE_ATTRIBUTE);
+      if (initialValue == null)
+      {
+        initialValue = "";
+      }
+      RegexWizard wizard = new RegexWizard(initialValue);
+      Shell shell = Display.getCurrent().getActiveShell();
+      WizardDialog wizardDialog = new WizardDialog(shell, wizard);
+      wizardDialog.create();
+      
+      String value = (String)getValue();
+
+      int result = wizardDialog.open();
+
+      if (result == Window.OK)
+      {
+        return wizard.getPattern();
+      }
+      return value;
+    }
+
+  }
+  
+//  class PatternTextCellEditor extends OptionsTextCellEditor
+//  {
+//    protected Button fixedButton, defaultButton;
+//    
+//    public PatternTextCellEditor(Composite parent)
+//    {
+//      super(parent);
+//    }
+//
+//    protected Control createControl(Composite parent)
+//    {
+//      isTextReadOnly = false;
+//      return super.createControl(parent);
+//    }
+//
+//    protected void openDialog()
+//    {
+//      RegexWizard wizard = new RegexWizard(element.getAttribute(XSDConstants.VALUE_ATTRIBUTE));
+//      Shell shell = Display.getCurrent().getActiveShell();
+//      WizardDialog wizardDialog = new WizardDialog(shell, wizard);
+//      wizardDialog.create();
+//      
+//      dialog = wizardDialog.getShell();
+//      Display display = dialog.getDisplay();
+//      dialog.addShellListener(new ShellAdapter()
+//      {
+//        public void shellDeactivated(ShellEvent e)
+//        {
+//          cancel();
+//        }
+//      });
+//
+//      int result = wizardDialog.open();
+//
+//      if (result == Window.OK)
+//      {
+//        fText.setText(wizard.getPattern());
+//        applyEditorValueAndDeactivate();
+//      }
+//      
+//    }
+//
+//    protected void cancel()
+//    {
+//      super.cancel();
+//    }
+//
+//    void applyEditorValueAndDeactivate()
+//    {
+//      String value = fText.getText();
+//      doSetValue(value);
+//      fireApplyEditorValue();
+//      deactivate();
+//    }
+//    
+//    protected Object doGetValue()
+//    { 
+//      fValue = fText.getText();
+//      return fText.getText();
+//    }
+//
+//  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ReadOnlyPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ReadOnlyPropertySource.java
new file mode 100644
index 0000000..0f5cb7f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/ReadOnlyPropertySource.java
@@ -0,0 +1,76 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+
+public class ReadOnlyPropertySource implements IPropertySource
+{
+	protected Element element;
+
+	public ReadOnlyPropertySource(IEditorPart editPart, Element element)
+	{
+			this.element = element;
+	}
+
+	public Object getEditableValue()
+	{
+			return null;
+	}
+
+	public IPropertyDescriptor[] getPropertyDescriptors()
+	{
+			List list = new ArrayList();
+			NamedNodeMap map = element.getAttributes();
+			int mapLength = map.getLength();
+			for (int i = 0; i < mapLength; i++)
+			{
+					Attr attr = (Attr) map.item(i);
+					list.add(new PropertyDescriptor(attr.getName(), attr.getName()));
+			}
+			IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+			list.toArray(result);
+			return result;
+	}
+
+	public Object getPropertyValue(Object id)
+	{
+			Object result = null;
+			if (id instanceof String)
+			{
+					result = element.getAttribute((String) id);
+			}
+			return result != null ? result : "";
+	}
+
+	public boolean isPropertySet(Object id)
+	{
+			return false;
+	}
+
+	public void resetPropertyValue(Object id)
+	{
+	}
+
+	public void setPropertyValue(Object id, Object value)
+	{
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SchemaDirectiveHelperPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SchemaDirectiveHelperPropertySource.java
new file mode 100644
index 0000000..b8e1ed2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SchemaDirectiveHelperPropertySource.java
@@ -0,0 +1,191 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+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.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.views.navigator.ResourceNavigator;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.wst.common.ui.viewers.ResourceFilter;
+import org.eclipse.wst.xml.uriresolver.util.URIHelper;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.wizards.XSDSelectIncludeFileWizard;
+import org.eclipse.xsd.XSDSchema;
+
+public abstract class SchemaDirectiveHelperPropertySource
+  extends BasePropertySource
+{
+  protected IFile currentIFile;
+
+  IFile selectedIFile;
+  String selectedNamespace;
+  XSDSchema selectedXSDSchema;
+  boolean isInclude;
+  /**
+   * 
+   */
+  public SchemaDirectiveHelperPropertySource(boolean isInclude)
+  {
+    super();
+    this.isInclude = isInclude;
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public SchemaDirectiveHelperPropertySource(
+    Viewer viewer,
+    XSDSchema xsdSchema,
+    boolean isInclude)
+  {
+    super(viewer, xsdSchema);
+    this.isInclude = isInclude;
+  }
+  /**
+   * @param xsdSchema
+   */
+  public SchemaDirectiveHelperPropertySource(XSDSchema xsdSchema, boolean isInclude)
+  {
+    super(xsdSchema);
+    this.isInclude = isInclude;
+  }
+
+  
+  public class SchemaLocationPropertyDescriptor extends PropertyDescriptor
+  {
+    /**
+     * @param id
+     * @param displayName
+     */
+    public SchemaLocationPropertyDescriptor(Object id, String displayName)
+    {
+      super(id, displayName);
+    }
+    
+    public CellEditor createPropertyEditor(Composite parent)
+    {
+      CellEditor editor = new SchemaLocationDialogCellEditor(parent);
+      if (getValidator() != null)
+        editor.setValidator(getValidator());
+      return editor;
+    }
+  }
+
+  public class SchemaLocationDialogCellEditor extends DialogCellEditor {
+
+    /**
+     * Creates a new Font dialog cell editor parented under the given control.
+     * The cell editor value is <code>null</code> initially, and has no 
+     * validator.
+     *
+     * @param parent the parent control
+     */
+    protected SchemaLocationDialogCellEditor(Composite parent) {
+      super(parent);
+    }
+
+    /**
+     * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(Control)
+     */
+    protected Object openDialogBox(Control cellEditorWindow)
+    {
+      Shell shell = Display.getCurrent().getActiveShell();
+      
+//      oldSchemaLocation = locationField.getText().trim();
+//      IFile currentIFile = ((IFileEditorInput)getIEditorPart().getEditorInput()).getFile();
+      ViewerFilter filter = new ResourceFilter(new String[] { ".xsd" }, 
+      new IFile[] { currentIFile },
+      null);
+//
+
+      IViewPart viewParts[] = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getViews();
+      ResourceNavigator resourceNav = null;
+      for (int i = 0; i < viewParts.length; i++) 
+       {
+        if (viewParts[i] instanceof ResourceNavigator) 
+         {
+          resourceNav = (ResourceNavigator) viewParts[i];
+          break;
+        }
+      }
+      IStructuredSelection selection = StructuredSelection.EMPTY;
+      if (resourceNav != null)
+       {
+        selection = (IStructuredSelection)resourceNav.getViewSite().getSelectionProvider().getSelection();
+      }
+      
+      XSDSelectIncludeFileWizard fileSelectWizard = 
+      new XSDSelectIncludeFileWizard(xsdSchema, isInclude,
+          XSDEditorPlugin.getXSDString("_UI_FILEDIALOG_SELECT_XML_SCHEMA"),
+          XSDEditorPlugin.getXSDString("_UI_FILEDIALOG_SELECT_XML_DESC"),
+          filter,
+          selection);
+
+      WizardDialog wizardDialog = new WizardDialog(shell, fileSelectWizard);
+      wizardDialog.create();
+      wizardDialog.setBlockOnOpen(true);
+      int result = wizardDialog.open();
+
+      
+      String value = (String)getValue();
+      // System.out.println("VALUE IS *** = " + value);
+      if (result == Window.OK)
+      {
+        selectedIFile = fileSelectWizard.getResultFile();
+        String schemaFileString = value;
+        if (selectedIFile != null) 
+         {
+          schemaFileString = URIHelper.getRelativeURI(selectedIFile.getLocation(), currentIFile.getLocation());
+        }
+        else
+         {
+          schemaFileString = fileSelectWizard.getURL();
+        }
+
+//        updateExternalModel(selectedIFile, fileSelectWizard.getNamespace(), fileSelectWizard.getExternalSchema());
+        selectedNamespace = fileSelectWizard.getNamespace();
+        selectedXSDSchema = fileSelectWizard.getExternalSchema();
+        
+        return schemaFileString;
+      }
+      return value;
+    }
+  }
+
+  public IFile getSelectedIFile()
+  {
+    return selectedIFile;
+  }
+  
+  public String getSelectedNamespace()
+  {
+    return selectedNamespace;
+  }
+  
+  public XSDSchema getSelectedXSDSchema()
+  {
+    return selectedXSDSchema;
+  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SchemaPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SchemaPropertySource.java
new file mode 100644
index 0000000..051c3c8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SchemaPropertySource.java
@@ -0,0 +1,530 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.TargetNamespaceChangeHandler;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDSchemaHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class SchemaPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  private String oldPrefix = "";
+  private String oldNamespace = "";
+  
+  private String[] attributeFormDefaultComboValues =
+  { 
+    "",
+    XSDEditorPlugin.getXSDString("_UI_COMBO_UNQUALIFIED"),
+    XSDEditorPlugin.getXSDString("_UI_COMBO_QUALIFIED")
+  };
+  
+  private String[] elementFormDefaultComboValues =
+  {
+    "",
+    XSDEditorPlugin.getXSDString("_UI_COMBO_UNQUALIFIED"),
+    XSDEditorPlugin.getXSDString("_UI_COMBO_QUALIFIED")
+  };
+
+  private String[] blockDefaultComboValues =
+  {
+    "",
+    "#all",
+    "extension",
+    "restriction",
+    "substitution"
+  };
+
+  private String[] finalDefaultComboValues =
+  {
+    "",
+    "#all",
+    "extension",
+    "restriction"
+  };
+  
+  /**
+   * 
+   */
+  public SchemaPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public SchemaPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public SchemaPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+// These have been moved to the General tab    
+//    PropertyDescriptor prefixDescriptor = 
+//    new TextPropertyDescriptor(
+//        "prefix",
+//        "prefix");
+//    list.add(prefixDescriptor);
+//    prefixDescriptor.setCategory("Namespace");
+//
+//    PropertyDescriptor targetNamespaceDescriptor = 
+//    new TextPropertyDescriptor(
+//        XSDConstants.TARGETNAMESPACE_ATTRIBUTE,
+//        XSDConstants.TARGETNAMESPACE_ATTRIBUTE);
+//    list.add(targetNamespaceDescriptor);
+//    targetNamespaceDescriptor.setCategory("Namespace");
+    
+    PropertyDescriptor versionDescriptor = 
+    new TextPropertyDescriptor(
+        XSDConstants.VERSION_ATTRIBUTE,
+        XSDConstants.VERSION_ATTRIBUTE);
+//    versionDescriptor.setDescription("Version attribute"); // XSDEditorPlugin.getXSDString("_UI_TOOLTIP_VERSION"));
+    list.add(versionDescriptor);
+    PropertyDescriptor xmlLangDescriptor = 
+    new TextPropertyDescriptor(
+        "xml:lang",
+        "xml:lang");
+    list.add(xmlLangDescriptor);
+    
+    XSDComboBoxPropertyDescriptor attributeFormDefaultDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        XSDConstants.ATTRIBUTEFORMDEFAULT_ATTRIBUTE,
+        XSDConstants.ATTRIBUTEFORMDEFAULT_ATTRIBUTE,
+        attributeFormDefaultComboValues);
+    list.add(attributeFormDefaultDescriptor);
+    
+    
+    XSDComboBoxPropertyDescriptor elementFormDefaultDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        XSDConstants.ELEMENTFORMDEFAULT_ATTRIBUTE,
+        XSDConstants.ELEMENTFORMDEFAULT_ATTRIBUTE,
+        elementFormDefaultComboValues);
+    list.add(elementFormDefaultDescriptor);
+    
+    XSDComboBoxPropertyDescriptor blockDefaultDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        XSDConstants.BLOCKDEFAULT_ATTRIBUTE,
+        XSDConstants.BLOCKDEFAULT_ATTRIBUTE,
+        blockDefaultComboValues);
+    list.add(blockDefaultDescriptor);
+    XSDComboBoxPropertyDescriptor finalDefaultDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        XSDConstants.FINALDEFAULT_ATTRIBUTE,
+        XSDConstants.FINALDEFAULT_ATTRIBUTE,
+        finalDefaultComboValues);
+    list.add(finalDefaultDescriptor);
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+    //    return propertyDescriptors;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+      String attributeName = (String)id;
+      if (result == null)
+      {
+        result = "";
+      }
+
+      if (attributeName.equals("prefix"))
+      {
+        TypesHelper helper = new TypesHelper(xsdSchema);
+        String aPrefix = helper.getPrefix(element.getAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE), false);
+        // System.out.println("schema targetNS is " + xsdSchema.getTargetNamespace());
+        if (aPrefix != null && aPrefix.length() > 0)
+        {
+          return aPrefix;
+        }
+        return "";        
+      }
+      else
+      {
+        return result;
+      }
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      String newValue = (String)value;
+      String attributeName = (String)id;
+      if (attributeName.equals("prefix"))
+      {
+        updatePrefix(newValue); 
+      }
+      else if (attributeName.equals(XSDConstants.TARGETNAMESPACE_ATTRIBUTE))
+      {
+        updateTargetNamespace(newValue);
+      }
+      else if (attributeName.equals("xml:lang"))
+      {
+        validateLanguage(newValue);
+        // return;  // we will accept the value even though it does not conform
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_SCHEMA_LANG_CHANGE"), element);
+      }
+      else if (attributeName.equals(XSDConstants.VERSION_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_SCHEMA_VERSION_CHANGE"), element);
+      }
+      else if (attributeName.equals(XSDConstants.ATTRIBUTEFORMDEFAULT_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_SCHEMA_ATTRIBUTEFORMDEFAULT_CHANGE"), element);
+      }
+      else if (attributeName.equals(XSDConstants.ELEMENTFORMDEFAULT_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_SCHEMA_ELEMENTFORMDEFAULT_CHANGE"), element); 
+      }
+      else if (attributeName.equals(XSDConstants.BLOCKDEFAULT_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_SCHEMA_BLOCKDEFAULT_CHANGE"), element); 
+      }
+      else if (attributeName.equals(XSDConstants.FINALDEFAULT_ATTRIBUTE))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_SCHEMA_FINALDEFAULT_CHANGE"), element);
+      }
+
+      if (!attributeName.equals("prefix") && !attributeName.equals(XSDConstants.TARGETNAMESPACE_ATTRIBUTE))
+      {        
+        if (newValue.equals(""))
+        {
+          element.removeAttribute(attributeName); 
+        }
+        else
+        {
+          element.setAttribute(attributeName, newValue);
+        }
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+        viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+
+  public void setInput(Element element)
+  {
+    super.setInput(element);
+    
+    oldNamespace = "";
+    oldPrefix = "";
+    
+    if (element!= null)
+    {
+      String targetNamespace = element.getAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE);
+      oldNamespace = targetNamespace;
+
+      TypesHelper helper = new TypesHelper(xsdSchema);
+      String aPrefix = helper.getPrefix(targetNamespace, false);
+      if (aPrefix != null && aPrefix.length() > 0)
+      {
+        oldPrefix = aPrefix;
+      }
+    }
+
+//  For debugging
+//    System.out.println("old Prefix is " + oldPrefix);
+//    System.out.println("old NS is " + oldNamespace);
+    if (xsdSchema != null)
+    {
+      Map map = xsdSchema.getQNamePrefixToNamespaceMap();
+//      System.out.println("SetInput: Prefixes: " + map.values());
+//      System.out.println("SetInput: NS:" + map.keySet());
+    }
+    
+  }
+  
+  
+  private void updatePrefix(String newPrefix)
+  {
+    updateNamespaceInfo(newPrefix, oldNamespace);  
+  }
+  
+  private void updateTargetNamespace(String newTargetNamespace)
+  {
+    updateNamespaceInfo(oldPrefix, newTargetNamespace);
+  }
+  
+  private void updateNamespaceInfo(String newPrefix, String newTargetNamespace)
+  {
+//    System.out.println("\nold Prefix is " + oldPrefix);
+//    System.out.println("old NS is " + oldNamespace);
+//    System.out.println("new Prefix is " + newPrefix);
+//    System.out.println("new NS is " + newTargetNamespace);
+    
+    DocumentImpl doc = (DocumentImpl)element.getOwnerDocument();
+
+    String modelTargetNamespace = xsdSchema.getTargetNamespace();
+//    System.out.println("Model TargetNS is " + modelTargetNamespace);
+    if (modelTargetNamespace == null)
+    {
+      modelTargetNamespace = "";
+    }
+        
+    String targetNamespace = newTargetNamespace.trim(); 
+    String prefix = newPrefix.trim();
+
+    if (!validatePrefix(prefix) || !validateTargetNamespace(targetNamespace))
+    {
+      return;
+    }
+        
+    if (prefix.length() > 0 && targetNamespace.length() == 0)
+    {
+       // can't have blank targetnamespace and yet specify a prefix
+       return;
+    }
+
+    doc.getModel().beginRecording(this, "Target Namespace Change");
+    String xsdForXSDPrefix = xsdSchema.getSchemaForSchemaQNamePrefix();
+    Map map = xsdSchema.getQNamePrefixToNamespaceMap();
+
+// For debugging
+//        System.out.println("1. SW Map is " + map.values());
+//        System.out.println("1. SW Map keys are " + map.keySet());
+
+    // Check if prefix is blank
+    // if it is, then make sure we have a prefix 
+    // for schema for schema
+    if (prefix.length() == 0)
+    {
+      // if prefix for schema for schema is blank
+      // then set it to value specified in preference
+      // and update ALL nodes with this prefix
+      if (xsdForXSDPrefix == null || (xsdForXSDPrefix != null && xsdForXSDPrefix.trim().length() == 0))
+      {
+        // get preference prefix
+        xsdForXSDPrefix = XSDEditorPlugin.getPlugin().getXMLSchemaPrefix();
+        // get a unique prefix by checking what's in the map
+
+        xsdForXSDPrefix = getUniqueSchemaForSchemaPrefix(xsdForXSDPrefix, map);
+        element.setAttribute("xmlns:" + xsdForXSDPrefix, XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001);
+
+        updateAllNodes(element, xsdForXSDPrefix);
+            
+        // remove the old xmlns attribute for the schema for schema
+        if (element.getAttribute("xmlns") != null &&
+            element.getAttribute("xmlns").equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))
+        {
+          element.removeAttribute("xmlns");
+        }
+      }
+    }
+
+    if (targetNamespace.length() > 0 ||
+       (targetNamespace.length() == 0 && prefix.length() == 0))
+    {
+      // clean up the old prefix for this schema
+      if (oldPrefix != null && oldPrefix.length() > 0)
+      {
+        element.removeAttribute("xmlns:"+oldPrefix);
+//            element.setAttribute("xmlns:" + prefix, targetNamespace);
+//            java.util.Map prefixToNameSpaceMap = xsdSchema.getQNamePrefixToNamespaceMap();
+//            prefixToNameSpaceMap.remove(oldPrefix);
+      }
+      else // if no prefix
+      {
+        if (element.getAttribute("xmlns") != null)
+        {
+          if (!element.getAttribute("xmlns").equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))
+           {
+            element.removeAttribute("xmlns");
+          }
+        }
+      }
+    }
+
+    if (targetNamespace.length() > 0)
+    {
+      if (!modelTargetNamespace.equals(targetNamespace))
+      {
+        element.setAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE, targetNamespace);
+      }
+      // now set the new xmlns:prefix attribute
+      if (prefix.length() > 0)
+      {
+        element.setAttribute("xmlns:" + prefix, targetNamespace);
+      }
+      else
+      {
+        element.setAttribute("xmlns", targetNamespace);
+      }
+      // set the targetNamespace attribute
+    }
+    else // else targetNamespace is blank
+    {
+      if (prefix.length() == 0)
+      {
+        element.removeAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE);
+      }
+    }
+
+//    System.out.println("1.5 SW Map is " + map.values());
+//    System.out.println("1.5 SW Map keys are " + map.keySet());
+    
+    // do our own referential integrity
+    TargetNamespaceChangeHandler targetNamespaceChangeHandler = new TargetNamespaceChangeHandler(xsdSchema, oldNamespace, targetNamespace);
+    targetNamespaceChangeHandler.resolve();
+
+    oldPrefix = prefix;
+    oldNamespace = targetNamespace;
+    
+    XSDSchemaHelper.updateElement(xsdSchema);
+    
+    doc.getModel().endRecording(this);
+
+// For debugging
+        map = xsdSchema.getQNamePrefixToNamespaceMap();
+//        System.out.println("2. SW Map is " + map.values());
+//        System.out.println("2. SW Map keys are " + map.keySet());
+  }
+
+
+  private String getUniqueSchemaForSchemaPrefix(String xsdForXSDPrefix, Map map)
+  {
+    if (xsdForXSDPrefix == null || (xsdForXSDPrefix != null && xsdForXSDPrefix.trim().length() == 0))
+     {       
+      xsdForXSDPrefix = "xsd";
+    }
+    // ensure prefix is unique
+    int prefixExtension = 1;
+    while (map.containsKey(xsdForXSDPrefix) && prefixExtension < 100)
+     {
+      xsdForXSDPrefix = xsdForXSDPrefix + String.valueOf(prefixExtension);
+      prefixExtension++;
+    }
+    return xsdForXSDPrefix;
+  }
+
+  private void updateAllNodes(Element element, String prefix)
+  {
+    element.setPrefix(prefix);
+    NodeList list = element.getChildNodes();
+    if (list != null)
+    {
+      for (int i=0; i < list.getLength(); i++)
+      {
+        Node child = list.item(i);
+        if (child != null && child instanceof Element)
+        {
+          child.setPrefix(prefix);
+          if (child.hasChildNodes())
+          {
+            updateAllNodes((Element)child, prefix);
+          }
+        }
+      }
+    }   
+  }
+
+  protected boolean validateTargetNamespace(String ns)
+  {
+    // will allow blank namespace !!
+    if (ns.equals(""))
+     {
+      return true;
+    }
+    
+    String errorMessage = null;
+    try
+    {
+      URI testURI = new URI(ns);
+    }
+    catch (URISyntaxException e)
+    {
+      errorMessage = XSDEditorPlugin.getXSDString("_WARN_INVALID_TARGET_NAMESPACE");
+    }
+    
+    if (errorMessage == null || errorMessage.length() == 0)
+     {
+      return true;
+    }
+    return false;
+  }
+  
+}
+
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleContentPropertyDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleContentPropertyDescriptor.java
new file mode 100644
index 0000000..1948146
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleContentPropertyDescriptor.java
@@ -0,0 +1,209 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.xsd.ui.internal.properties.section.SimpleContentBaseTypeOptionsDialog;
+import org.eclipse.xsd.XSDSchema;
+import org.w3c.dom.Element;
+
+public class SimpleContentPropertyDescriptor extends TypesPropertyDescriptor
+{
+  public SimpleContentPropertyDescriptor(Object id, String displayName, Element element, XSDSchema xsdSchema)
+  {
+    super(id, displayName, element, xsdSchema);
+  }
+  
+  public CellEditor createPropertyEditor(Composite parent)
+  {
+    // CellEditor editor = new SimpleContentBaseTypeOptionsTextCellEditor(parent);
+    CellEditor editor = new SimpleContentBaseTypeDialogCellEditor(parent);
+    if (getValidator() != null)
+      editor.setValidator(getValidator());
+    return editor;
+  }
+  
+  public class SimpleContentBaseTypeDialogCellEditor extends TypesDialogCellEditor
+  {
+
+    /**
+     * Creates a new Font dialog cell editor parented under the given control.
+     * The cell editor value is <code>null</code> initially, and has no 
+     * validator.
+     *
+     * @param parent the parent control
+     */
+    protected SimpleContentBaseTypeDialogCellEditor(Composite parent)
+    {
+      super(parent);
+    }
+
+    protected Object openDialogBox(Control cellEditorWindow)
+    {
+	    Shell shell = Display.getCurrent().getActiveShell();
+	    
+	    // SimpleContentBaseTypeOptionsDialog dialog = new SimpleContentBaseTypeOptionsDialog(shell);
+	    SimpleContentBaseTypeOptionsDialog dialog = new SimpleContentBaseTypeOptionsDialog(shell, element, property, xsdSchema);
+
+	    dialog.setBlockOnOpen(true);
+	    dialog.create();
+	    
+	    String value = (String)getValue();
+	
+	    int result = dialog.open();
+	
+	    if (result == Window.OK)
+	    {
+	      value = dialog.getType();
+	      return value;
+	    }
+	    deactivate();
+	    return value;
+	  }
+  }
+
+//  class SimpleContentBaseTypeOptionsDialog extends TypesDialog
+//  {
+//    public SimpleContentBaseTypeOptionsDialog(Shell shell)
+//    {
+//      super(shell);
+//      showAnonymous = false;
+//    }
+//
+////    protected void ok()
+////    {
+////      TableItem[] items = table.getItems();
+////      selection = table.getSelectionIndex();
+////      if (items != null && items.length > 0 && selection >= 0)
+////       {
+////        typeObject = items[selection].getData();
+////      }
+////      System.out.println("typeObject is " + typeObject);
+////
+////      doSetValue(typeObject);
+////      applyEditorValueAndDeactivate();
+////      dialog.close();
+////    }
+//    
+//    public void handleSetInput()
+//    {
+//      XSDDOMHelper domHelper = new XSDDOMHelper();
+//      typeSection.getSimpleType().setSelection(false);
+//      typeSection.getUserSimpleType().setSelection(false);
+//      typeSection.getUserComplexType().setSelection(false);
+//      showAnonymous = false;
+//      if (element != null)
+//      {
+//        String derivedBy = domHelper.getDerivedByName(element);
+//        String baseType = domHelper.getBaseType(element);
+//        boolean derivedByRestriction = true;
+//        
+//        if (XSDDOMHelper.inputEquals(element, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+//        {
+//          typeSection.getSimpleType().setEnabled(false);
+//          typeSection.getUserSimpleType().setEnabled(false);
+//          typeSection.getUserComplexType().setSelection(true);
+//
+//          previousType = 3;
+//        }
+//        else if (XSDDOMHelper.inputEquals(element, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+//        {
+//          typeSection.getSimpleType().setEnabled(false);
+//          typeSection.getUserSimpleType().setEnabled(false);
+//
+//          if (derivedBy.equals("restriction"))
+//          {
+//            typeSection.getSimpleType().setEnabled(false);
+//            typeSection.getUserSimpleType().setEnabled(false);
+//            typeSection.getUserComplexType().setEnabled(true);
+//          }
+//          else if (derivedBy.equals("extension"))
+//          {
+//            derivedByRestriction = false;
+//            typeSection.getSimpleType().setEnabled(true);
+//            typeSection.getUserSimpleType().setEnabled(true);
+//            typeSection.getUserComplexType().setEnabled(true);
+//          }
+//        }
+//          
+//        if (derivedBy != null)
+//        {
+//            if (baseType != null && !baseType.equals(""))
+//            {
+//              Element parent = (Element)element.getParentNode();
+//              XSDConcreteComponent component = null;
+//              if (parent != null)
+//              {
+//                component = xsdSchema.getCorrespondingComponent(parent);
+//              }
+//              XSDTypeDefinition baseTypeDefinition = null;
+//              if (component instanceof XSDComplexTypeDefinition)
+//              {
+//                XSDComplexTypeDefinition complexType = (XSDComplexTypeDefinition)component;
+//                baseTypeDefinition = complexType.getBaseTypeDefinition();
+//              }               
+//
+//              if (typeSection.getBuiltInTypeNamesList(xsdSchema).contains(baseType) && !derivedByRestriction)
+//              {
+//                typeSection.getSimpleType().setSelection(true);
+//                populateBuiltInType();
+//                int i = typeSection.getBuiltInTypeNamesList(xsdSchema).indexOf(baseType);
+//                table.setSelection(i);
+//                previousType = 1;
+//              }
+//              else if (baseTypeDefinition instanceof XSDSimpleTypeDefinition && !derivedByRestriction)
+//              {
+//                typeSection.getUserSimpleType().setSelection(true);
+//                populateUserSimpleType();
+//                int i = typeSection.getUserSimpleTypeNamesList(xsdSchema).indexOf(baseType);
+//                if (showAnonymous)
+//                 {
+//                  table.setSelection(i + 1);
+//                }
+//                else
+//                 {
+//                  table.setSelection(i);
+//                }
+//                previousType = 2;
+//              }
+//              else if (baseTypeDefinition instanceof XSDComplexTypeDefinition)
+//              {
+//                typeSection.getUserComplexType().setSelection(true);
+//                populateUserComplexType();
+//                int i = typeSection.getUserComplexTypeNamesList(xsdSchema).indexOf(baseType);
+//                if (showAnonymous)
+//                 {
+//                  table.setSelection(i + 1);
+//                }
+//                else
+//                 {
+//                  table.setSelection(i);
+//                }
+//                previousType = 3;
+//              }
+//            }
+//            else
+//            {
+//              typeSection.getUserComplexType().setSelection(true);
+//              populateUserComplexType();
+//              table.setSelection(0);
+//            }
+//          }
+//
+//      }
+//    }
+//  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleContentPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleContentPropertySource.java
new file mode 100644
index 0000000..f0233cd
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleContentPropertySource.java
@@ -0,0 +1,230 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class SimpleContentPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  private String DERIVED_BY_ID = "derived by";  // XSDEditorPlugin.getXSDString("_UI_LABEL_DERIVED_BY"); 
+  private String BASE_TYPE_ID = "base";  // XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE");
+  
+  private String derivedByChoicesComboValues[] =
+  {
+     "",
+     XSDConstants.RESTRICTION_ELEMENT_TAG,
+     XSDConstants.EXTENSION_ELEMENT_TAG
+  };
+  
+  /**
+   * 
+   */
+  public SimpleContentPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public SimpleContentPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public SimpleContentPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    
+    SimpleContentPropertyDescriptor typeDescriptor = new SimpleContentPropertyDescriptor(
+        BASE_TYPE_ID,
+        BASE_TYPE_ID,
+        element, xsdSchema);
+    list.add(typeDescriptor);
+    XSDComboBoxPropertyDescriptor derivedByDescriptor =
+    new XSDComboBoxPropertyDescriptor(
+        DERIVED_BY_ID,
+        DERIVED_BY_ID,
+        derivedByChoicesComboValues);
+    list.add(derivedByDescriptor);
+    
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+     {
+      if (((String) id).equals(DERIVED_BY_ID))
+      {
+        String derivedBy = getDomHelper().getDerivedByName(element);
+        if (derivedBy == null)
+         {
+          derivedBy = "";
+        }
+        return derivedBy;
+      }
+      else if (((String) id).equals(BASE_TYPE_ID))
+      {
+        String baseType = getDomHelper().getBaseType(element);
+        if (baseType == null)
+        {
+          baseType = "";
+        }
+        return baseType;
+      }
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value != null)
+    {
+      if (value instanceof String)
+      {
+        String origBaseType = getDomHelper().getBaseType(element);
+        String derivedBy = getDomHelper().getDerivedByName(element);
+        
+        if (((String) id).equals(BASE_TYPE_ID))
+        {            
+          Document doc = element.getOwnerDocument();
+          Element childElement = null;
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_TYPE_CHANGE"), element);        
+          getDomHelper().setDerivedByBaseType(element, derivedBy, (String)value);
+          endRecording(element);
+        }
+        else if (((String) id).equals(DERIVED_BY_ID))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_DERIVEDBY_CHANGE"), element);
+          String newDerivedBy = (String)value;
+          if (newDerivedBy.equals(XSDConstants.RESTRICTION_ELEMENT_TAG))
+          {
+            String prefix = element.getPrefix();
+            String anyType = prefix == null? "anyType" : prefix + ":anyType"; 
+            getDomHelper().changeDerivedByType(element, (String)value, anyType);
+          }
+          else
+          {
+            Element derivedByElem = getDomHelper().getDerivedByElement(element);
+            if (checkForAnonymousType(derivedByElem))
+            {            
+// KCPort
+//            ArrayList message = new ArrayList();
+//            ErrorMessage aTask = new ErrorMessage();
+//            Node aNode = getDomHelper().getChildNode(derivedByElem, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+////////////// shall we remove the node and its children??
+////            getDomHelper().removeNodeAndWhitespace(aNode);
+//////////////
+////            if (aNode instanceof Element)
+////            {
+////              Element st = (Element)aNode;
+////             if (st instanceof NodeImpl)
+////              {
+////                aTask.setNode((NodeImpl)st);
+////              }
+////            }
+//            if (derivedByElem instanceof NodeImpl)
+//            {
+//              aTask.setModelObject(derivedByElem);
+//            }
+//            aTask.setLocalizedMessage(XSDEditorPlugin.getXSDString("_ERROR_REMOVE_LOCAL_SIMPLETYPE"));
+//            message.add(aTask);
+//            if (getEditor() != null)
+//            {
+//              getEditor().createTasksInTaskList(message);
+//            }
+            }   
+            getDomHelper().changeDerivedByType(element, (String)value, origBaseType);
+          }
+
+          
+          endRecording(element);
+//        setInput(element);
+        }
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+  }
+
+  boolean checkForAnonymousType(Element element)
+  {
+    boolean isAnonymous = false;
+
+    Node aNode = getDomHelper().getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+    if (aNode != null)
+     {
+      return true;
+    }
+    return isAnonymous;
+  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleRestrictPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleRestrictPropertySource.java
new file mode 100644
index 0000000..38a8819
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleRestrictPropertySource.java
@@ -0,0 +1,362 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.actions.DOMAttribute;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDSchemaHelper;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDFacet;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.impl.XSDFactoryImpl;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class SimpleRestrictPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  private String BASE_TYPE_ID = XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE");
+  private String [] whiteSpaceComboChoices = { "", "preserve", "replace", "collapse" };
+  /**
+   * 
+   */
+  public SimpleRestrictPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public SimpleRestrictPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public SimpleRestrictPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    
+    SimpleContentPropertyDescriptor typeDescriptor = new SimpleContentPropertyDescriptor(
+        XSDConstants.BASE_ATTRIBUTE,
+        XSDConstants.BASE_ATTRIBUTE,
+        (Element)element.getParentNode(), xsdSchema);  // get the parent node!
+    list.add(typeDescriptor);
+    
+    Iterator facets = xsdSimpleType.getValidFacets().iterator();
+    
+    while(facets.hasNext())
+    {
+      String aValidFacet = (String)facets.next();
+      if (!(aValidFacet.equals(XSDConstants.PATTERN_ELEMENT_TAG) || aValidFacet.equals(XSDConstants.ENUMERATION_ELEMENT_TAG)))
+      {
+        if (aValidFacet.equals(XSDConstants.WHITESPACE_ELEMENT_TAG))
+        {
+          XSDComboBoxPropertyDescriptor whitespaceDescriptor = new XSDComboBoxPropertyDescriptor(
+              aValidFacet, aValidFacet, whiteSpaceComboChoices);
+          list.add(whitespaceDescriptor);
+        }
+        else
+        {  
+          list.add(new TextPropertyDescriptor(aValidFacet, aValidFacet));
+        }
+      }
+    }
+    
+    
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      if (((String) id).equals(XSDConstants.BASE_ATTRIBUTE))
+      {
+        String baseType = element.getAttribute(XSDConstants.BASE_ATTRIBUTE);
+        if (baseType == null)
+        {
+          baseType = "";
+        }
+        return baseType;
+      }
+      else
+      {
+        String aFacet = (String)id;
+        Iterator facets = xsdSimpleType.getFacets().iterator();
+        
+        while(facets.hasNext())
+        {
+          XSDFacet aValidFacet = (XSDFacet)facets.next();
+          if (aValidFacet.getFacetName().equals(aFacet))
+          {
+            result = aValidFacet.getLexicalValue();
+            if (result == null)
+            {
+              result = "";
+            }
+            return result;
+          }
+        }
+      }
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value != null)
+     {
+      if (value instanceof String)
+      {
+        String newValue = (String)value;
+        String origBaseType = getDomHelper().getBaseType(element);
+        
+        if (((String) id).equals(XSDConstants.BASE_ATTRIBUTE))
+        {            
+          Document doc = element.getOwnerDocument();
+          Element childElement = null;
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_TYPE_CHANGE"), element);        
+
+          Element parent = (Element)element.getParentNode();
+          if (XSDDOMHelper.inputEquals(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+          {
+//            updateElementToNotAnonymous(element);
+          }
+          getDomHelper().setSimpleContentType(element, newValue);
+          endRecording(element);
+        }
+        else
+        {
+          Element simpleTypeElement = xsdSimpleType.getElement();
+          XSDDOMHelper xsdDOMHelper = new XSDDOMHelper();
+          Element derivedByElement = xsdDOMHelper.getDerivedByElement(simpleTypeElement);
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_FACET_CHANGE"), simpleTypeElement);
+          String prefix = simpleTypeElement.getPrefix();
+          prefix = (prefix == null) ? "" : (prefix + ":");
+
+          String aFacet = (String)id;
+          XSDFactoryImpl factory = new XSDFactoryImpl();
+
+          Element childNodeElement = null;
+          DOMAttribute valueAttr = null;
+          XSDFacet facet = null;
+          if (aFacet.equals(XSDConstants.TOTALDIGITS_ELEMENT_TAG))
+          {
+            facet = xsdSimpleType.getTotalDigitsFacet();
+          }
+          else if (aFacet.equals(XSDConstants.FRACTIONDIGITS_ELEMENT_TAG))
+          {
+            facet = xsdSimpleType.getFractionDigitsFacet();
+          }
+          else if (aFacet.equals(XSDConstants.WHITESPACE_ELEMENT_TAG))
+          {
+            facet = xsdSimpleType.getWhiteSpaceFacet();
+          }
+          else if (aFacet.equals(XSDConstants.MAXEXCLUSIVE_ELEMENT_TAG))
+          {
+            facet = xsdSimpleType.getMaxExclusiveFacet();
+          }
+          else if (aFacet.equals(XSDConstants.MAXINCLUSIVE_ELEMENT_TAG))
+          {
+            facet = xsdSimpleType.getMaxInclusiveFacet();
+          }
+          else if (aFacet.equals(XSDConstants.MINEXCLUSIVE_ELEMENT_TAG))
+          {
+            facet = xsdSimpleType.getMinExclusiveFacet();
+          }
+          else if (aFacet.equals(XSDConstants.MININCLUSIVE_ELEMENT_TAG))
+          {
+            facet = xsdSimpleType.getMinInclusiveFacet();
+          }
+          else if (aFacet.equals(XSDConstants.LENGTH_ELEMENT_TAG))
+          {
+            facet = xsdSimpleType.getLengthFacet();
+          }
+          else if (aFacet.equals(XSDConstants.MAXLENGTH_ELEMENT_TAG))
+          {
+            facet = xsdSimpleType.getMaxLengthFacet();
+          }
+          else if (aFacet.equals(XSDConstants.MINLENGTH_ELEMENT_TAG))
+          {
+            facet = xsdSimpleType.getMinLengthFacet();
+          }
+          
+          if (facet != null)
+          {
+            facet.setLexicalValue(newValue);
+          }
+          else
+          {
+            facet = (XSDFacet)factory.createXSDTotalDigitsFacet();
+            childNodeElement = (derivedByElement.getOwnerDocument()).createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + aFacet);
+            valueAttr = new DOMAttribute(XSDConstants.VALUE_ATTRIBUTE, "");
+            childNodeElement.setAttribute(valueAttr.getName(), valueAttr.getValue());
+            valueAttr.setValue(newValue);
+            childNodeElement.setAttribute(valueAttr.getName(), valueAttr.getValue());  
+            boolean hasChildrenElements = hasElementChildren(derivedByElement);
+            element.appendChild(childNodeElement);
+          //formatChild(childNodeElement, hasChildrenElements);    
+          }
+          XSDSchemaHelper.updateElement(xsdSimpleType);
+          if (facet != null)
+          {
+            XSDSchemaHelper.updateElement(facet);
+          }
+        }
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+
+  }
+
+  protected boolean isAnonymous;
+  protected XSDSimpleTypeDefinition xsdSimpleType;
+  public void setInput(Element element)
+  {
+    this.element = element;
+    if (xsdSchema == null)
+    {
+      return;
+    }
+    String type = element.getLocalName();
+
+    isAnonymous = checkForAnonymousType(element);
+    
+    int restrictionType = 0;  // 0 = SimpleType restriction
+    // 1 = SimpleContent restriction
+    // ComplexContent restriction different window
+    
+    if (XSDDOMHelper.inputEquals(element, XSDConstants.RESTRICTION_ELEMENT_TAG, false))
+    {
+      String baseType = element.getAttribute(XSDConstants.BASE_ATTRIBUTE);
+
+      XSDTypeDefinition baseTypeDefinition = null;
+
+      Element parent = (Element)element.getParentNode();
+      if (XSDDOMHelper.inputEquals(parent, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+      {
+        restrictionType = 1;
+        Element grandparent = (Element)parent.getParentNode();
+        XSDConcreteComponent component = null;
+        if (grandparent != null)
+        {
+          component = xsdSchema.getCorrespondingComponent(grandparent);
+        }
+        if (component instanceof XSDComplexTypeDefinition)
+        {
+          XSDComplexTypeDefinition complexType = (XSDComplexTypeDefinition)component;
+          baseTypeDefinition = complexType.getBaseTypeDefinition();
+        }               
+      }
+      else if (XSDDOMHelper.inputEquals(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+      {
+        restrictionType = 0;
+        XSDConcreteComponent component = null;
+        if (parent != null)
+         {
+          component = xsdSchema.getCorrespondingComponent(parent);
+        }
+        if (component instanceof XSDSimpleTypeDefinition)
+         {
+          XSDSimpleTypeDefinition simpleType = (XSDSimpleTypeDefinition)component;
+          baseTypeDefinition = simpleType.getBaseTypeDefinition();
+        }
+      }
+
+      XSDConcreteComponent xsdConcreteComponent = null;
+      if (element.getParentNode() != null)
+      {
+        xsdConcreteComponent = xsdSchema.getCorrespondingComponent(element.getParentNode());
+      }
+
+      if (xsdConcreteComponent instanceof XSDSimpleTypeDefinition)
+      {
+        xsdSimpleType = (XSDSimpleTypeDefinition)xsdConcreteComponent;
+      }
+      //facetViewer.setInput(xsdSimpleType);
+    }
+  }
+
+  boolean checkForAnonymousType(Element element)
+  {
+    boolean isAnonymous = false;
+
+    Node aNode = getDomHelper().getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+    if (aNode != null)
+    {
+      return true;
+    }
+    return isAnonymous;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypeListPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypeListPropertySource.java
new file mode 100644
index 0000000..fc104c0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypeListPropertySource.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+
+public class SimpleTypeListPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  /**
+   * 
+   */
+  public SimpleTypeListPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public SimpleTypeListPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public SimpleTypeListPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    TypesPropertyDescriptor typeDescriptor = new TypesPropertyDescriptor(
+          XSDConstants.ITEMTYPE_ATTRIBUTE,
+          XSDConstants.ITEMTYPE_ATTRIBUTE,
+          element, xsdSchema);
+        
+    typeDescriptor.setLabelProvider(new LabelProvider()
+    {
+      public String getText(Object element)
+      {
+        return (String) element;
+      }
+    });
+    list.add(typeDescriptor);
+    
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      if (((String) id).equals(XSDConstants.ITEMTYPE_ATTRIBUTE))
+      {
+        result = element.getAttribute((String) id);
+        if (result == null)
+        {
+          result = "**anonymous**";
+        }
+        return result;
+      }
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value != null)
+     {
+      if (value instanceof String)
+      {
+        if (((String) id).equals(XSDConstants.ITEMTYPE_ATTRIBUTE))
+        { 
+          beginRecording("ItemType Change", element);
+          element.setAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE, (String)value);
+          endRecording(element);
+        }
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypePropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypePropertySource.java
new file mode 100644
index 0000000..99885fa
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypePropertySource.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalSimpleOrComplexTypeRenamer;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Node;
+
+public class SimpleTypePropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  private boolean isAnonymous = false;
+  /**
+   * 
+   */
+  public SimpleTypePropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public SimpleTypePropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public SimpleTypePropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    Node parent = element.getParentNode();
+    if (XSDDOMHelper.inputEquals(parent, XSDConstants.RESTRICTION_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(parent, XSDConstants.ELEMENT_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(parent, XSDConstants.UNION_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(parent, XSDConstants.LIST_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+    {
+      isAnonymous = true;
+    }
+
+    List list = new ArrayList();
+    if (!isAnonymous)
+    {
+      // Create a descriptor and set a category
+      PropertyDescriptor nameDescriptor =
+      new TextPropertyDescriptor(
+          XSDConstants.NAME_ATTRIBUTE,
+          XSDConstants.NAME_ATTRIBUTE);
+      list.add(nameDescriptor);
+    }
+    else
+    {
+      PropertyDescriptor readOnly = new PropertyDescriptor(XSDConstants.NAME_ATTRIBUTE, XSDConstants.NAME_ATTRIBUTE);
+      list.add(readOnly);
+    }
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+    {
+      result = element.getAttribute((String) id);
+      if (isAnonymous)
+      {
+        result = "**anonymous**";
+      }
+    }
+    if (result == null)
+     {
+      result = "";
+    }
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    if (value instanceof String)
+    {
+      String name = (String)value;
+      if (validateName(name))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_SIMPLETYPE_NAME_CHANGE"), element);
+        if (name != null && name.length() > 0)
+        {
+          // now rename any references to this type
+          if (xsdSchema != null)
+          {
+            XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+            if (comp != null && comp instanceof XSDSimpleTypeDefinition && comp.getContainer().equals(xsdSchema))
+            {
+//                ((XSDNamedComponent)comp).setName(name);
+              GlobalSimpleOrComplexTypeRenamer renamer = new GlobalSimpleOrComplexTypeRenamer((XSDNamedComponent)comp, name);
+              renamer.visitSchema(xsdSchema);
+            }
+          }
+          element.setAttribute(XSDConstants.NAME_ATTRIBUTE, name);
+        }
+        else
+        {
+          element.setAttribute(XSDConstants.NAME_ATTRIBUTE, "");
+        }
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypeUnionPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypeUnionPropertySource.java
new file mode 100644
index 0000000..ec0adf7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/SimpleTypeUnionPropertySource.java
@@ -0,0 +1,494 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+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.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.wst.xsd.ui.internal.widgets.TypeSection;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+
+
+public class SimpleTypeUnionPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  /**
+   * 
+   */
+  public SimpleTypeUnionPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public SimpleTypeUnionPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+  }
+  /**
+   * @param xsdSchema
+   */
+  public SimpleTypeUnionPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    SimpleUnionMemberTypesPropertyDescriptor typeDescriptor = new SimpleUnionMemberTypesPropertyDescriptor(
+        XSDConstants.MEMBERTYPES_ATTRIBUTE,
+        XSDConstants.MEMBERTYPES_ATTRIBUTE);
+    
+    typeDescriptor.setLabelProvider(new LabelProvider()
+        {
+      public String getText(Object element)
+      {
+        return (String) element;
+      }
+    });
+    list.add(typeDescriptor);
+    
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+     {
+      if (((String) id).equals(XSDConstants.MEMBERTYPES_ATTRIBUTE))
+       {
+        result = element.getAttribute((String) id);
+        if (result == null)
+        { 
+          result = "";
+        }
+        return result;
+      }
+    }
+    return "";
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value == null)
+    {
+      value = "";
+    }
+    
+    if (value instanceof String)
+    {
+      String newValue = (String)value;
+      if (((String) id).equals(XSDConstants.MEMBERTYPES_ATTRIBUTE))
+      { 
+        beginRecording("MemberTypes Change", element);
+        if (newValue.length() > 0)
+        {
+          element.setAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE, (String)value);
+        }
+        else
+        {
+          element.removeAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);  
+        }
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+
+  
+  public class SimpleUnionMemberTypesPropertyDescriptor extends PropertyDescriptor
+  {
+    /**
+     * @param id
+     * @param displayName
+     */
+    public SimpleUnionMemberTypesPropertyDescriptor(Object id, String displayName)
+    {
+      super(id, displayName);
+    }
+    
+    public CellEditor createPropertyEditor(Composite parent)
+    {
+      CellEditor editor = new SimpleTypeUnionMemberTypesDialogCellEditor(parent);
+      if (getValidator() != null)
+        editor.setValidator(getValidator());
+      return editor;
+    }
+  }
+  
+  public class SimpleTypeUnionMemberTypesDialogCellEditor extends DialogCellEditor {
+
+    /**
+     * Creates a new Font dialog cell editor parented under the given control.
+     * The cell editor value is <code>null</code> initially, and has no 
+     * validator.
+     *
+     * @param parent the parent control
+     */
+    protected SimpleTypeUnionMemberTypesDialogCellEditor(Composite parent) {
+      super(parent);
+    }
+
+    /**
+     * @see org.eclipse.jface.viewers.DialogCellEditor#openDialogBox(Control)
+     */
+    protected Object openDialogBox(Control cellEditorWindow)
+    {
+      Shell shell = Display.getCurrent().getActiveShell();
+      
+      SimpleContentUniontMemberTypesDialog dialog = new SimpleContentUniontMemberTypesDialog(shell);
+      dialog.setBlockOnOpen(true);
+      dialog.create();
+      
+      String value = (String)getValue();
+
+      int result = dialog.open();
+
+      if (result == Window.OK)
+       {
+        return dialog.getResult();
+      }
+      return value;
+    }
+
+  }
+
+  public class SimpleContentUniontMemberTypesDialog extends org.eclipse.jface.dialogs.Dialog implements SelectionListener
+  {
+    Table table;
+    TypeSection typeSection;
+    Button addButton, removeButton;
+    org.eclipse.swt.widgets.List memberTypesList;
+    
+    private String result;
+    
+    public SimpleContentUniontMemberTypesDialog(Shell shell)
+    {
+      super(shell);
+    }
+
+    protected void configureShell(Shell shell)
+    {
+      super.configureShell(shell);
+    }
+
+    protected void buttonPressed(int buttonId)
+    {
+      if (buttonId == Dialog.OK)
+      {
+        StringBuffer sb = new StringBuffer();
+        int length = memberTypesList.getItemCount();
+        for (int i=0 ; i < length; i++)
+        {
+          sb.append(memberTypesList.getItem(i));
+          if (i < length - 1)
+          {
+            sb.append(" ");
+          }
+        }
+        result = sb.toString();
+      }
+      super.buttonPressed(buttonId);
+    }
+
+    public String getResult() { return result; }
+
+    //
+    // Create the controls
+    //
+    public Control createDialogArea(Composite parent)
+    {
+      int tabIndex = 0;
+      Composite client = (Composite)super.createDialogArea(parent);
+      getShell().setText("Union " + XSDConstants.MEMBERTYPES_ATTRIBUTE); 
+      
+      Label instructions = new Label(client, SWT.LEFT | SWT.WRAP);
+      instructions.setText("Select from the available types and add to the memberTypes list");
+      
+      Composite columnsComposite = new Composite(client, SWT.NONE);
+      GridLayout ccGL = new GridLayout();
+      ccGL.verticalSpacing = 0;
+      ccGL.horizontalSpacing = 0;
+      ccGL.marginHeight = 0;
+      ccGL.marginWidth = 0;
+      ccGL.makeColumnsEqualWidth = true;
+      ccGL.numColumns = 3;
+      columnsComposite.setLayout(ccGL);
+      
+      GridData ccGD = new GridData();
+      ccGD.grabExcessHorizontalSpace = true;
+      ccGD.horizontalAlignment = GridData.FILL;
+      columnsComposite.setLayoutData(ccGD);     
+                             
+      typeSection = new TypeSection(columnsComposite);
+      typeSection.setShowUserComplexType(false);
+
+      typeSection.createClient(columnsComposite);
+      typeSection.getSimpleType().setSelection(false);
+      typeSection.getSimpleType().addSelectionListener(this);
+      typeSection.getUserSimpleType().addSelectionListener(this);
+      
+      ViewUtility.createHorizontalFiller(columnsComposite, 1);
+      
+      Label memberListLabel = new Label(columnsComposite, SWT.LEFT);
+      memberListLabel.setText("memberTypes value:");
+      
+      Composite dataComposite = new Composite(client, SWT.NONE);
+      GridLayout dcGL = new GridLayout();
+      dcGL.verticalSpacing = 0;
+      dcGL.marginHeight = 0;
+      dcGL.marginWidth = 0;
+      dcGL.numColumns = 3;
+      dataComposite.setLayout(dcGL);
+      
+      GridData dcGD = new GridData();
+      dcGD.grabExcessHorizontalSpace = true;
+      dcGD.grabExcessVerticalSpace = true;
+      dataComposite.setLayoutData(dcGD);
+      
+      table = new Table(dataComposite,
+          SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); 
+      table.setHeaderVisible(false);
+      table.setLinesVisible(true);
+      GridData gd2 = new GridData();
+      gd2.grabExcessHorizontalSpace = true;
+      gd2.grabExcessVerticalSpace = true;
+      gd2.horizontalAlignment = GridData.FILL;
+      gd2.verticalAlignment = GridData.FILL;
+      gd2.heightHint = 200;
+      gd2.widthHint = 200;
+      table.setLayoutData(gd2);
+
+      // Fill table
+      handleSetInput();
+      int tableItemCount = table.getItemCount();
+
+      TableColumn tc = new TableColumn(table, SWT.LEFT);
+//      tc.setImage(XSDEditorPlugin.getXSDImage("icons/XSDElement.gif"));
+      //tc.setText("Available types:");
+      tc.setWidth(200);
+      tc.setResizable(true);
+      
+      Composite buttonComposite = new Composite(dataComposite, SWT.NONE);
+      GridLayout bcGL = new GridLayout();
+      bcGL.numColumns = 1;
+      buttonComposite.setLayout(bcGL);
+      addButton = new Button(buttonComposite, SWT.PUSH);
+      addButton.setText(">");
+      addButton.addSelectionListener(this);
+      removeButton = new Button(buttonComposite, SWT.PUSH);
+      removeButton.setText("<");
+      removeButton.addSelectionListener(this);
+      
+      Composite listComposite = new Composite(dataComposite, SWT.NONE);
+      GridLayout mtGL = new GridLayout();
+      mtGL.numColumns = 1;
+      mtGL.marginHeight = 0;
+      mtGL.marginWidth = 0;
+      mtGL.horizontalSpacing = 0;
+      mtGL.verticalSpacing = 0;
+      listComposite.setLayout(mtGL);
+
+      GridData mtGD = new GridData();
+      mtGD.grabExcessHorizontalSpace = true;
+      mtGD.grabExcessVerticalSpace = true;
+      mtGD.verticalAlignment = GridData.FILL;
+      mtGD.horizontalAlignment = GridData.FILL;
+      listComposite.setLayoutData(mtGD);
+      
+      memberTypesList = new org.eclipse.swt.widgets.List(listComposite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+      GridData mtlGD = new GridData();
+      mtlGD.grabExcessHorizontalSpace = true;
+      mtlGD.grabExcessVerticalSpace = true;
+      mtlGD.verticalAlignment = GridData.FILL;
+      mtlGD.horizontalAlignment = GridData.FILL;
+      mtlGD.heightHint = 200;
+      mtlGD.widthHint = 200;
+      memberTypesList.setLayoutData(mtlGD);
+      
+      initializeMemberListContent();
+      return client;
+    }
+
+    private void initializeMemberListContent()
+    {
+      String result = element.getAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);
+      if (result == null)
+      {
+        return;
+      }
+      StringTokenizer token = new StringTokenizer(result);
+      while (token.hasMoreTokens())
+      {
+        memberTypesList.add(token.nextToken());
+      }
+    }
+  
+    public void widgetSelected(SelectionEvent e)
+    {
+      if (e.widget == typeSection.getSimpleType() && typeSection.getSimpleType().getSelection())
+       {
+        populateBuiltInType();
+      }
+      else if (e.widget == typeSection.getUserSimpleType() && typeSection.getUserSimpleType().getSelection())
+       {
+        populateUserSimpleType(false);
+      }
+      else if (e.widget == addButton)
+      {
+        TableItem[] items = table.getItems();
+        int selection = table.getSelectionIndex();
+        if (items != null && items.length > 0 && selection >= 0)
+        {
+          String typeToAdd = items[selection].getData().toString();
+          if (memberTypesList.indexOf(typeToAdd) < 0)
+          {
+            memberTypesList.add(items[selection].getData().toString());
+          }
+        }
+      }
+      else if (e.widget == removeButton)
+      {
+        String[] typesToRemove = memberTypesList.getSelection();
+        for (int i=0; i < typesToRemove.length; i++)
+        {
+          memberTypesList.remove(typesToRemove[i]);
+        }
+      }
+    }
+    
+    public void widgetDefaultSelected(SelectionEvent e)
+    {
+    }
+    
+    public void handleSetInput()
+    {
+      populateBuiltInType();
+    }
+    
+    public void populateBuiltInType()
+    {
+      table.removeAll();
+      List items = getBuiltInTypeNamesList();
+      for (int i = 0; i < items.size(); i++)
+       {
+        TableItem item = new TableItem(table, SWT.NONE);
+        item.setText(items.get(i).toString());
+        item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+        item.setData(items.get(i));
+      }
+    }
+
+    public void populateUserSimpleType(boolean showAnonymous)
+    {
+      table.removeAll();
+      if (showAnonymous)
+       {
+        TableItem anonymousItem = new TableItem(table, SWT.NONE);
+        anonymousItem.setText("**anonymous**");
+        anonymousItem.setData("**anonymous**");
+      }
+      List items = getUserSimpleTypeNamesList();
+      for (int i = 0; i < items.size(); i++)
+       {
+        TableItem item = new TableItem(table, SWT.NONE);
+        item.setText(items.get(i).toString());
+        item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+        item.setData(items.get(i));
+      }
+    }
+    
+    public java.util.List getBuiltInTypeNamesList()
+    {
+      TypesHelper helper = new TypesHelper(xsdSchema);
+      return helper.getBuiltInTypeNamesList();
+    }
+
+    public java.util.List getUserSimpleTypeNamesList()
+    {
+      TypesHelper helper = new TypesHelper(xsdSchema);
+      return helper.getUserSimpleTypeNamesList();
+    }
+  }
+  
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/TypesPropertyDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/TypesPropertyDescriptor.java
new file mode 100644
index 0000000..207e53a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/TypesPropertyDescriptor.java
@@ -0,0 +1,1160 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.List;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.DialogCellEditor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.events.ShellAdapter;
+import org.eclipse.swt.events.ShellEvent;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+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.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.wst.xsd.ui.internal.widgets.TypeSection;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+public class TypesPropertyDescriptor extends PropertyDescriptor
+{
+  Element element;
+  XSDSchema xsdSchema;
+  String property;
+  /**
+   * @param id
+   * @param displayName
+   */
+  public TypesPropertyDescriptor(Object id, String displayName, Element element, XSDSchema xsdSchema)
+  {
+    super(id, displayName);
+    this.property = (String)id;
+    this.element = element;
+    this.xsdSchema = xsdSchema;
+  }
+  
+  boolean showComplexTypes = true;
+
+  public CellEditor createPropertyEditor(Composite parent)
+  {
+    if (XSDDOMHelper.inputEquals(element, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+    {
+      showComplexTypes = true;
+    }
+    else if (XSDDOMHelper.inputEquals(element, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false) ||
+      XSDDOMHelper.inputEquals(element, XSDConstants.LIST_ELEMENT_TAG, false) ||
+      XSDDOMHelper.inputEquals(element, XSDConstants.UNION_ELEMENT_TAG, false))
+    {
+      showComplexTypes = false;
+    }
+    // CellEditor editor = new TypesOptionsTextCellEditor(parent);
+    CellEditor editor = new TypesDialogCellEditor(parent);
+    if (getValidator() != null)
+      editor.setValidator(getValidator());
+    return editor;
+  }
+
+  
+  public class TypesDialogCellEditor extends DialogCellEditor
+  {
+
+    /**
+     * Creates a new Font dialog cell editor parented under the given control.
+     * The cell editor value is <code>null</code> initially, and has no 
+     * validator.
+     *
+     * @param parent the parent control
+     */
+    protected TypesDialogCellEditor(Composite parent)
+    {
+      super(parent);
+    }
+
+    protected Object openDialogBox(Control cellEditorWindow)
+    {
+	    Shell shell = Display.getCurrent().getActiveShell();
+	    
+	    TypesDialog dialog = new TypesDialog(shell);
+
+	    dialog.setBlockOnOpen(true);
+	    dialog.create();
+	    
+	    String value = (String)getValue();
+	
+	    int result = dialog.open();
+	    
+	    if (result == Window.OK)
+	    {
+	      value = dialog.getType();
+        doSetValue(value);
+        fireApplyEditorValue();
+	    }
+	    deactivate();
+	    return null;
+	  }
+  }
+
+  public class TypesDialog extends org.eclipse.jface.dialogs.Dialog implements SelectionListener
+  {
+    String type;
+    Object typeObject;
+    Table table;
+
+    TypeSection typeSection;
+    boolean showAnonymous = true;
+    String previousStringType = "";
+    boolean isAnonymous;
+    int previousType;
+
+    
+    public TypesDialog(Shell shell)
+    {
+      super(shell);
+    }
+
+    protected void configureShell(Shell shell)
+    {
+      super.configureShell(shell);
+    }
+
+    protected void buttonPressed(int buttonId)
+    {
+      if (buttonId == Dialog.OK)
+      {
+        type = table.getItem(table.getSelectionIndex()).getText();
+        ok();
+      }
+      super.buttonPressed(buttonId);
+    }
+
+    public Object getTypeObject() { return typeObject; }
+    public String getType() { return type; }
+
+    //
+    // Create the controls
+    //
+    public Control createDialogArea(Composite parent)
+    {
+      int tabIndex = 0;
+      Composite client = (Composite)super.createDialogArea(parent);
+      getShell().setText("Available Types");
+
+      typeObject = null;
+      
+      GridLayout gl = new GridLayout(1, true);
+//      gl.marginHeight = 0;
+//      gl.marginWidth = 0;
+//      gl.horizontalSpacing = 0;
+//      gl.verticalSpacing = 0;
+      client.setLayout(gl);
+
+      GridData gd = new GridData();
+      gd.grabExcessHorizontalSpace = true;
+      gd.grabExcessVerticalSpace = true;
+      gd.horizontalAlignment = GridData.FILL;
+      gd.verticalAlignment = GridData.FILL;
+      gd.horizontalIndent = 0;
+      client.setLayoutData(gd);
+      
+      typeSection = new TypeSection(client);
+      typeSection.setShowUserComplexType(showComplexTypes);
+
+      typeSection.createClient(client);
+      typeSection.getSimpleType().setSelection(false);
+      typeSection.getSimpleType().addSelectionListener(this);
+      typeSection.getUserSimpleType().addSelectionListener(this);
+      if (showComplexTypes)
+      {
+        typeSection.getUserComplexType().addSelectionListener(this);
+      }
+
+      table = new Table(client,
+                        SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); 
+      table.setHeaderVisible(false);
+      table.setLinesVisible(true);
+      
+      GridData gd2 = new GridData();
+      gd2.grabExcessHorizontalSpace = true;
+      gd2.grabExcessVerticalSpace = true;
+      gd2.horizontalAlignment = GridData.FILL;
+      gd2.heightHint = 200;
+      table.setLayoutData(gd2);
+
+      TableColumn tableColumn = new TableColumn(table, SWT.LEFT);
+//      tableColumn.setImage(XSDEditorPlugin.getXSDImage("icons/XSDElement.gif"));
+      tableColumn.setResizable(true);
+      tableColumn.setWidth(200);
+      
+
+      // Fill table and select input type
+      handleSetInput();
+
+      return client;
+    }
+    
+    public void widgetSelected(SelectionEvent e)
+    {
+      if (e.widget == typeSection.getSimpleType() && typeSection.getSimpleType().getSelection())
+      {
+        populateBuiltInType();
+      }
+      else if (e.widget == typeSection.getUserComplexType() && typeSection.getUserComplexType().getSelection())
+      {
+        populateUserComplexType();
+      }
+      else if (e.widget == typeSection.getUserSimpleType() && typeSection.getUserSimpleType().getSelection())
+      {
+        populateUserSimpleType();
+      }
+
+    }
+    
+  	public void widgetDefaultSelected(SelectionEvent e)
+    {
+    }
+
+    protected void ok()
+    {
+      TableItem[] items = table.getItems();
+      int selection = table.getSelectionIndex();
+      if (items != null && items.length > 0 && selection >= 0)
+      {
+        typeObject = items[selection].getData();
+      }
+//      System.out.println("typeObject is " + typeObject);
+
+//      beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_TYPE_CHANGE"), element);
+//      beginRecording(XSDEditorPlugin.getXSDString("_UI_TYPE_CHANGE"), element);
+//      doSetValue(typeObject);
+//      applyEditorValueAndDeactivate();
+//      dialog.close();
+
+      if (!XSDDOMHelper.inputEquals(element, XSDConstants.UNION_ELEMENT_TAG, false))
+      {
+      if (typeObject.equals("**anonymous**"))
+      {
+        if (typeSection.getUserSimpleType().getSelection())
+        {
+          if (!previousStringType.equals("**anonymous**"))
+          {
+            updateElementToAnonymous(
+              element,
+              XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+          }
+        }
+        else
+        {
+          if (!previousStringType.equals("**anonymous**"))
+          {
+            updateElementToAnonymous(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+          }
+        }
+        // element.removeAttribute(XSDConstants.TYPE_ATTRIBUTE);
+        element.removeAttribute(property);
+      }
+      else
+      {
+        updateElementToNotAnonymous(element);
+        //element.setAttribute(XSDConstants.TYPE_ATTRIBUTE, typeObject.toString());
+        element.setAttribute(property, typeObject.toString());
+      }
+      }
+//      endRecording(element);
+
+      //implement dispose();
+//      table.removeAll();
+//      table.dispose();
+    }
+
+  	
+    public void handleSetInput()
+    {
+      table.removeAll();
+      isAnonymous = checkForAnonymousType(element);
+      // Attr attr = element.getAttributeNode(XSDConstants.TYPE_ATTRIBUTE);
+      Attr attr = element.getAttributeNode(property);
+      if (attr != null)
+      {
+        String value = attr.getValue();
+        if (typeSection.getBuiltInTypeNamesList(xsdSchema).contains(value))
+        {
+          typeSection.getSimpleType().setSelection(true);
+          populateBuiltInType();
+          int i = typeSection.getBuiltInTypeNamesList(xsdSchema).indexOf(value);
+          table.setSelection(i);
+          previousType = 1;
+        }
+        else if (typeSection.getUserSimpleTypeNamesList(xsdSchema).contains(value))
+        {
+          typeSection.getUserSimpleType().setSelection(true);
+          populateUserSimpleType();
+          int i = typeSection.getUserSimpleTypeNamesList(xsdSchema).indexOf(value);
+          if (showAnonymous)
+          {
+            table.setSelection(i + 1);
+          }
+          else
+          {
+            table.setSelection(i);
+          }
+          previousType = 2;
+        }
+        else if (typeSection.getUserComplexTypeNamesList(xsdSchema).contains(value))
+        {
+          typeSection.getUserComplexType().setSelection(true);
+          populateUserComplexType();
+          int i = typeSection.getUserComplexTypeNamesList(xsdSchema).indexOf(value);
+          if (showAnonymous)
+           {
+            table.setSelection(i + 1);
+          }
+          else
+           {
+            table.setSelection(i);
+          }
+          previousType = 3;
+        }
+        else // if it is type="" for an empty list of simple types
+          {
+          typeSection.getUserSimpleType().setSelection(true);
+          populateUserSimpleType();
+          previousType = 2;
+        }
+      }
+      else
+      {
+        if (isAnonymous)
+        {
+          if (isSTAnonymous(element))
+          {
+            typeSection.getUserSimpleType().setSelection(true);
+            populateUserSimpleType();
+            previousType = 2;
+          }
+          else
+          {
+            typeSection.getUserComplexType().setSelection(true);
+            populateUserComplexType();
+            previousType = 3;
+          }
+          table.setSelection(0); // anonymous
+          //        typeSection.getTypeList().setText("**anonymous**");
+        }
+        else
+        {
+          typeSection.getSimpleType().setSelection(true);
+          populateBuiltInType();
+          table.setSelection(0);
+          
+          //        typeSection.getTypeList().setEnabled(true);
+          //        typeSection.getSimpleType().setSelection(true);
+          //        typeSection.populateBuiltInType(xsdSchema);
+          //        typeSection.getTypeList().setText(XSDEditorPlugin.getXSDString("_UI_NO_TYPE"));
+          previousType = 1;
+        }
+      }
+      if (table.getSelection() != null && table.getSelection().length > 0)
+      {
+        previousStringType = (table.getSelection()[0]).getText();
+      }
+    }
+    
+    public void populateBuiltInType()
+    {
+      table.removeAll();
+      List items = getBuiltInTypeNamesList();
+      for (int i = 0; i < items.size(); i++)
+      {
+        TableItem item = new TableItem(table, SWT.NONE);
+        item.setText(items.get(i).toString());
+        item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+        item.setData(items.get(i));
+      }
+    }
+
+    public void populateUserComplexType()
+    {
+      table.removeAll();
+      if (showAnonymous)
+      {
+        TableItem anonymousItem = new TableItem(table, SWT.NONE);
+        anonymousItem.setText("**anonymous**");
+        anonymousItem.setData("**anonymous**");
+      }
+      List items = getUserComplexTypeNamesList();
+      for (int i = 0; i < items.size(); i++)
+      {
+        TableItem item = new TableItem(table, SWT.NONE);
+//        System.out.println("item " + i + " is " + item);
+        item.setText(items.get(i).toString());
+        item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDComplexType.gif"));
+        item.setData(items.get(i));
+      }
+    }
+
+    public void populateUserSimpleType()
+    {
+      table.removeAll();
+      if (showAnonymous)
+       {
+        TableItem anonymousItem = new TableItem(table, SWT.NONE);
+        anonymousItem.setText("**anonymous**");
+        anonymousItem.setData("**anonymous**");
+      }
+      List items = getUserSimpleTypeNamesList();
+      for (int i = 0; i < items.size(); i++)
+       {
+        TableItem item = new TableItem(table, SWT.NONE);
+        item.setText(items.get(i).toString());
+        item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+        item.setData(items.get(i));
+      }
+    }
+
+    boolean checkForAnonymousType(Element element)
+    {
+      /*
+       * Using Ed's model to check boolean isAnonymous = false;
+       * 
+       * XSDConcreteComponent component =
+       * getXSDSchema().getCorrespondingComponent(element); if (component
+       * instanceof XSDElementDeclaration) { XSDElementDeclaration xsdElem =
+       * (XSDElementDeclaration)component; isAnonymous =
+       * xsdElem.isSetAnonymousTypeDefinition(); } return isAnonymous;
+       */
+      XSDDOMHelper helper = new XSDDOMHelper();
+      boolean isAnonymous = false;
+      Node aNode =
+      helper.getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+      if (aNode != null)
+       {
+        return true;
+      }
+      aNode = helper.getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+      if (aNode != null)
+       {
+        isAnonymous = true;
+      }
+      return isAnonymous;
+    }
+
+    void updateElementToAnonymous(Element element, String xsdType)
+    {
+      String prefix = element.getPrefix();
+      prefix = (prefix == null) ? "" : (prefix + ":");
+      updateElementToNotAnonymous(element);
+      boolean hasChildrenElements = hasElementChildren(element);
+      Element childNode = null;
+      if (xsdType.equals(XSDConstants.COMPLEXTYPE_ELEMENT_TAG))
+       {
+        childNode = element.getOwnerDocument().createElementNS(
+            XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+            prefix + XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+      }
+      else if (xsdType.equals(XSDConstants.SIMPLETYPE_ELEMENT_TAG))
+       {
+        childNode =
+        element.getOwnerDocument().createElementNS(
+            XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+            prefix + XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+      }
+      element.appendChild(childNode);
+      //formatChild(childNode, hasChildrenElements);
+    }
+
+    boolean isSTAnonymous(Element element)
+    {
+      XSDDOMHelper helper = new XSDDOMHelper();
+      Node aNode =
+      helper.getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+      if (aNode != null)
+       {
+        if (XSDDOMHelper
+            .inputEquals(aNode, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+         {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    boolean isCTAnonymous(Element element)
+    {
+      XSDDOMHelper helper = new XSDDOMHelper();
+      Node aNode = helper.getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+      if (aNode != null)
+       {
+        if (XSDDOMHelper.inputEquals(aNode, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+         {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    XSDTypeDefinition getAnonymousTypeDefinition(Element element)
+    {
+      XSDDOMHelper helper = new XSDDOMHelper();
+      Node typeDefinitionNode =
+      helper.getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+      if (typeDefinitionNode == null)
+       {
+        typeDefinitionNode =
+        helper.getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+      }
+      if (typeDefinitionNode != null)
+       {
+        XSDConcreteComponent component =
+        xsdSchema.getCorrespondingComponent(typeDefinitionNode);
+        if (component instanceof XSDTypeDefinition)
+         {
+          return (XSDTypeDefinition) component;
+        }
+      }
+      return null;
+    }
+
+    void updateElementToNotAnonymous(Element element)
+    {
+      if (element != null)
+      {
+	      NodeList children = element.getChildNodes();
+	      if (children != null)
+	       {
+	        for (int i = 0; i < children.getLength(); i++)
+	         {
+	          Node node = (Node) children.item(i);
+	          if (node instanceof Element)
+	           {
+	            if (node.getLocalName().equals(XSDConstants.SIMPLETYPE_ELEMENT_TAG)
+	                || node.getLocalName().equals(XSDConstants.COMPLEXTYPE_ELEMENT_TAG))
+	             {
+	              XSDDOMHelper.removeNodeAndWhitespace(node);
+	              i = 0;
+	            }
+	          }
+	        }
+	      }
+      }
+    }
+
+    public java.util.List getBuiltInTypeNamesList()
+    {
+      TypesHelper helper = new TypesHelper(xsdSchema);
+      return helper.getBuiltInTypeNamesList();
+    }
+
+    public java.util.List getUserSimpleTypeNamesList()
+    {
+      TypesHelper helper = new TypesHelper(xsdSchema);
+      return helper.getUserSimpleTypeNamesList();
+    }
+    
+    public java.util.List getUserComplexTypeNamesList()
+    {
+      TypesHelper helper = new TypesHelper(xsdSchema);
+      return helper.getUserComplexTypeNamesList();
+    }
+    
+	  protected boolean hasElementChildren(Node parentNode)
+	  {
+	    boolean hasChildrenElements = false;
+	    if (parentNode != null && parentNode.hasChildNodes())
+	    {
+	      NodeList nodes = parentNode.getChildNodes();
+	      for (int i = 0; i < nodes.getLength(); i++)
+	      {
+	        if (nodes.item(i) instanceof Element)
+	        {
+	          hasChildrenElements = true;
+	          break;
+	        }
+	      }
+	    }
+	    return hasChildrenElements;
+	  }
+
+  }
+
+  
+  
+  
+  
+  
+  
+  
+  class TypesOptionsTextCellEditor extends OptionsTextCellEditor
+  {
+    boolean showAnonymous = true;
+    
+    public TypesOptionsTextCellEditor(Composite parent)
+    {
+      super(parent);
+    }
+
+    protected Control createControl(Composite parent)
+    {
+      isTextReadOnly = true;
+      return super.createControl(parent);
+    }
+
+    Table table;
+    TypeSection typeSection;
+
+    protected void openDialog()
+    {
+      typeObject = null;
+      dialog = new Shell(XSDEditorPlugin.getPlugin().getWorkbench().getActiveWorkbenchWindow().getShell(), SWT.MODELESS);
+      Display display = dialog.getDisplay();
+      GridLayout gl = new GridLayout(1, true);
+      gl.marginHeight = 0;
+      gl.marginWidth = 0;
+      gl.horizontalSpacing = 0;
+      gl.verticalSpacing = 0;
+      dialog.setLayout(gl);
+      GridData gd = new GridData();
+      gd.grabExcessHorizontalSpace = true;
+      gd.grabExcessVerticalSpace = true;
+      gd.horizontalAlignment = GridData.FILL;
+      gd.verticalAlignment = GridData.FILL;
+      gd.horizontalIndent = 0;
+      dialog.setLayoutData(gd);
+
+      
+      
+      typeSection = new TypeSection(dialog);
+      typeSection.setShowUserComplexType(showComplexTypes);
+
+      typeSection.createClient(dialog);
+      typeSection.getSimpleType().setSelection(false);
+      typeSection.getSimpleType().addSelectionListener(this);
+      typeSection.getUserSimpleType().addSelectionListener(this);
+      if (showComplexTypes)
+      {
+        typeSection.getUserComplexType().addSelectionListener(this);
+      }
+
+      table = new Table(dialog,
+                        SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); 
+      table.setHeaderVisible(false);
+      table.setLinesVisible(true);
+      GridData gd2 = new GridData();
+      gd2.grabExcessHorizontalSpace = true;
+      gd2.grabExcessVerticalSpace = true;
+      gd2.horizontalAlignment = GridData.FILL;
+      gd2.verticalAlignment = GridData.FILL;
+      table.setLayoutData(gd2);
+
+      // Fill table and select input type
+      handleSetInput();
+      int tableItemCount = table.getItemCount();
+
+      TableColumn tc = new TableColumn(table, SWT.LEFT);
+      tc.setImage(XSDEditorPlugin.getXSDImage("icons/XSDElement.gif"));
+      //tc.setText("Available types:");
+      tc.setResizable(false);
+
+      int MAX_ITEMS = 23;
+//      tc.pack();
+//      table.pack();
+      Rectangle tableBounds = table.getBounds();
+      tableBounds.height = Math.min(tableBounds.height, table.getItemHeight()*MAX_ITEMS);
+      table.setBounds(tableBounds);
+      dialog.pack();
+      
+      dialog.addShellListener(new ShellAdapter()
+      {
+        public void shellDeactivated(ShellEvent e)
+        {
+          cancel();
+        }
+      });
+
+      Rectangle dialogBounds = dialog.getBounds();
+      Point buttonLocation = getButtonAbsoluteLocation();
+      dialogBounds.x = buttonLocation.x;
+      dialogBounds.y = buttonLocation.y;
+
+      if (dialogBounds.height > 200)
+      {        
+        dialogBounds.height = 200;
+      }
+      if (dialogBounds.height < 100)
+      {
+        dialogBounds.height = 200;
+      }
+      if (dialogBounds.width > 200)
+      {
+        dialogBounds.width = typeSection.getUserComplexType().getBounds().width + 30;
+      }
+      dialog.setBounds(dialogBounds);
+      tc.setWidth(dialogBounds.width);
+
+      table.addKeyListener(new KeyAdapter()
+      {
+        public void keyPressed(KeyEvent e)
+        {
+          int keyCode = e.keyCode;
+          int stateMask = e.stateMask;
+          char character = e.character;
+          if (character == SWT.CR || character == SWT.LF)
+            ok();
+          else if (character == SWT.ESC)
+            cancel();
+        }
+      });
+
+      table.addMouseListener(new MouseAdapter()
+      {
+        public void mouseDoubleClick(MouseEvent e)
+        {
+          ok();
+        }
+        public void mouseDown(MouseEvent e)
+        {
+          ok();
+        }
+      });
+
+      try
+      {
+        dialog.open();
+        table.setFocus();
+        table.showSelection();
+        
+        while (!dialog.isDisposed())
+        {
+          if (!display.readAndDispatch())
+          {
+            display.sleep();
+          }
+        }
+      }
+      finally
+      {
+        if (!dialog.isDisposed())
+          cancel();
+      }
+    }
+    
+    public void widgetSelected(SelectionEvent e)
+    {
+      if (e.widget == typeSection.getSimpleType() && typeSection.getSimpleType().getSelection())
+      {
+        populateBuiltInType();
+      }
+      else if (e.widget == typeSection.getUserComplexType() && typeSection.getUserComplexType().getSelection())
+      {
+        populateUserComplexType();
+      }
+      else if (e.widget == typeSection.getUserSimpleType() && typeSection.getUserSimpleType().getSelection())
+      {
+        populateUserSimpleType();
+      }
+    }
+    
+    protected void cancel()
+    {
+      super.cancel();
+      table.dispose();
+    }
+
+    protected void ok()
+    {
+      TableItem[] items = table.getItems();
+      selection = table.getSelectionIndex();
+      if (items != null && items.length > 0 && selection >= 0)
+      {
+        typeObject = items[selection].getData();
+      }
+//      System.out.println("typeObject is " + typeObject);
+
+//      beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_TYPE_CHANGE"), element);
+//      beginRecording(XSDEditorPlugin.getXSDString("_UI_TYPE_CHANGE"), element);
+      doSetValue(typeObject);
+      applyEditorValueAndDeactivate();
+      dialog.close();
+
+      if (!XSDDOMHelper.inputEquals(element, XSDConstants.UNION_ELEMENT_TAG, false))
+      {
+      if (typeObject.equals("**anonymous**"))
+      {
+        if (typeSection.getUserSimpleType().getSelection())
+        {
+          if (!previousStringType.equals("**anonymous**"))
+          {
+            updateElementToAnonymous(
+              element,
+              XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+          }
+        }
+        else
+        {
+          if (!previousStringType.equals("**anonymous**"))
+          {
+            updateElementToAnonymous(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+          }
+        }
+        // element.removeAttribute(XSDConstants.TYPE_ATTRIBUTE);
+        element.removeAttribute(property);
+      }
+      else
+      {
+        updateElementToNotAnonymous(element);
+        //element.setAttribute(XSDConstants.TYPE_ATTRIBUTE, typeObject.toString());
+        element.setAttribute(property, typeObject.toString());
+      }
+      }
+//      endRecording(element);
+
+      //implement dispose();
+      table.removeAll();
+      table.dispose();
+    }
+
+    String previousStringType = "";
+    boolean isAnonymous;
+    int previousType;
+
+    public void handleSetInput()
+    {
+      table.removeAll();
+      isAnonymous = checkForAnonymousType(element);
+      // Attr attr = element.getAttributeNode(XSDConstants.TYPE_ATTRIBUTE);
+      Attr attr = element.getAttributeNode(property);
+      if (attr != null)
+      {
+        String value = attr.getValue();
+        if (typeSection.getBuiltInTypeNamesList(xsdSchema).contains(value))
+        {
+          typeSection.getSimpleType().setSelection(true);
+          populateBuiltInType();
+          int i = typeSection.getBuiltInTypeNamesList(xsdSchema).indexOf(value);
+          table.setSelection(i);
+          previousType = 1;
+        }
+        else if (typeSection.getUserSimpleTypeNamesList(xsdSchema).contains(value))
+        {
+          typeSection.getUserSimpleType().setSelection(true);
+          populateUserSimpleType();
+          int i = typeSection.getUserSimpleTypeNamesList(xsdSchema).indexOf(value);
+          if (showAnonymous)
+          {
+            table.setSelection(i + 1);
+          }
+          else
+          {
+            table.setSelection(i);
+          }
+          previousType = 2;
+        }
+        else if (typeSection.getUserComplexTypeNamesList(xsdSchema).contains(value))
+        {
+          typeSection.getUserComplexType().setSelection(true);
+          populateUserComplexType();
+          int i = typeSection.getUserComplexTypeNamesList(xsdSchema).indexOf(value);
+          if (showAnonymous)
+           {
+            table.setSelection(i + 1);
+          }
+          else
+           {
+            table.setSelection(i);
+          }
+          previousType = 3;
+        }
+        else // if it is type="" for an empty list of simple types
+          {
+          typeSection.getUserSimpleType().setSelection(true);
+          populateUserSimpleType();
+          previousType = 2;
+        }
+      }
+      else
+      {
+        if (isAnonymous)
+        {
+          if (isSTAnonymous(element))
+          {
+            typeSection.getUserSimpleType().setSelection(true);
+            populateUserSimpleType();
+            previousType = 2;
+          }
+          else
+          {
+            typeSection.getUserComplexType().setSelection(true);
+            populateUserComplexType();
+            previousType = 3;
+          }
+          table.setSelection(0); // anonymous
+          //        typeSection.getTypeList().setText("**anonymous**");
+        }
+        else
+        {
+          typeSection.getSimpleType().setSelection(true);
+          populateBuiltInType();
+          table.setSelection(0);
+          
+          //        typeSection.getTypeList().setEnabled(true);
+          //        typeSection.getSimpleType().setSelection(true);
+          //        typeSection.populateBuiltInType(xsdSchema);
+          //        typeSection.getTypeList().setText(XSDEditorPlugin.getXSDString("_UI_NO_TYPE"));
+          previousType = 1;
+        }
+      }
+      if (table.getSelection() != null && table.getSelection().length > 0)
+      {
+        previousStringType = (table.getSelection()[0]).getText();
+      }
+    }
+    
+    public void populateBuiltInType()
+    {
+      table.removeAll();
+      List items = getBuiltInTypeNamesList();
+      for (int i = 0; i < items.size(); i++)
+      {
+        TableItem item = new TableItem(table, SWT.NONE);
+        item.setText(items.get(i).toString());
+        item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+        item.setData(items.get(i));
+      }
+    }
+
+    public void populateUserComplexType()
+    {
+      table.removeAll();
+      if (showAnonymous)
+      {
+        TableItem anonymousItem = new TableItem(table, SWT.NONE);
+        anonymousItem.setText("**anonymous**");
+        anonymousItem.setData("**anonymous**");
+      }
+      List items = getUserComplexTypeNamesList();
+      for (int i = 0; i < items.size(); i++)
+      {
+        TableItem item = new TableItem(table, SWT.NONE);
+//        System.out.println("item " + i + " is " + item);
+        item.setText(items.get(i).toString());
+        item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDComplexType.gif"));
+        item.setData(items.get(i));
+      }
+    }
+
+    public void populateUserSimpleType()
+    {
+      table.removeAll();
+      if (showAnonymous)
+       {
+        TableItem anonymousItem = new TableItem(table, SWT.NONE);
+        anonymousItem.setText("**anonymous**");
+        anonymousItem.setData("**anonymous**");
+      }
+      List items = getUserSimpleTypeNamesList();
+      for (int i = 0; i < items.size(); i++)
+       {
+        TableItem item = new TableItem(table, SWT.NONE);
+        item.setText(items.get(i).toString());
+        item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+        item.setData(items.get(i));
+      }
+    }
+
+    boolean checkForAnonymousType(Element element)
+    {
+      /*
+       * Using Ed's model to check boolean isAnonymous = false;
+       * 
+       * XSDConcreteComponent component =
+       * getXSDSchema().getCorrespondingComponent(element); if (component
+       * instanceof XSDElementDeclaration) { XSDElementDeclaration xsdElem =
+       * (XSDElementDeclaration)component; isAnonymous =
+       * xsdElem.isSetAnonymousTypeDefinition(); } return isAnonymous;
+       */
+      XSDDOMHelper helper = new XSDDOMHelper();
+      boolean isAnonymous = false;
+      Node aNode =
+      helper.getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+      if (aNode != null)
+       {
+        return true;
+      }
+      aNode = helper.getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+      if (aNode != null)
+       {
+        isAnonymous = true;
+      }
+      return isAnonymous;
+    }
+
+    void updateElementToAnonymous(Element element, String xsdType)
+    {
+      String prefix = element.getPrefix();
+      prefix = (prefix == null) ? "" : (prefix + ":");
+      updateElementToNotAnonymous(element);
+      boolean hasChildrenElements = hasElementChildren(element);
+      Element childNode = null;
+      if (xsdType.equals(XSDConstants.COMPLEXTYPE_ELEMENT_TAG))
+       {
+        childNode = element.getOwnerDocument().createElementNS(
+            XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+            prefix + XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+      }
+      else if (xsdType.equals(XSDConstants.SIMPLETYPE_ELEMENT_TAG))
+       {
+        childNode =
+        element.getOwnerDocument().createElementNS(
+            XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+            prefix + XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+      }
+      element.appendChild(childNode);
+      //formatChild(childNode, hasChildrenElements);
+    }
+
+    boolean isSTAnonymous(Element element)
+    {
+      XSDDOMHelper helper = new XSDDOMHelper();
+      Node aNode =
+      helper.getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+      if (aNode != null)
+       {
+        if (XSDDOMHelper
+            .inputEquals(aNode, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+         {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    boolean isCTAnonymous(Element element)
+    {
+      XSDDOMHelper helper = new XSDDOMHelper();
+      Node aNode = helper.getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+      if (aNode != null)
+       {
+        if (XSDDOMHelper.inputEquals(aNode, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+         {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    XSDTypeDefinition getAnonymousTypeDefinition(Element element)
+    {
+      XSDDOMHelper helper = new XSDDOMHelper();
+      Node typeDefinitionNode =
+      helper.getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+      if (typeDefinitionNode == null)
+       {
+        typeDefinitionNode =
+        helper.getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+      }
+      if (typeDefinitionNode != null)
+       {
+        XSDConcreteComponent component =
+        xsdSchema.getCorrespondingComponent(typeDefinitionNode);
+        if (component instanceof XSDTypeDefinition)
+         {
+          return (XSDTypeDefinition) component;
+        }
+      }
+      return null;
+    }
+
+    void updateElementToNotAnonymous(Element element)
+    {
+      NodeList children = element.getChildNodes();
+      if (children != null)
+       {
+        for (int i = 0; i < children.getLength(); i++)
+         {
+          Node node = (Node) children.item(i);
+          if (node instanceof Element)
+           {
+            if (node.getLocalName().equals(XSDConstants.SIMPLETYPE_ELEMENT_TAG)
+                || node.getLocalName().equals(XSDConstants.COMPLEXTYPE_ELEMENT_TAG))
+             {
+              XSDDOMHelper.removeNodeAndWhitespace(node);
+              i = 0;
+            }
+          }
+        }
+      }
+    }
+
+    public java.util.List getBuiltInTypeNamesList()
+    {
+      TypesHelper helper = new TypesHelper(xsdSchema);
+      return helper.getBuiltInTypeNamesList();
+    }
+
+    public java.util.List getUserSimpleTypeNamesList()
+    {
+      TypesHelper helper = new TypesHelper(xsdSchema);
+      return helper.getUserSimpleTypeNamesList();
+    }
+    
+    public java.util.List getUserComplexTypeNamesList()
+    {
+      TypesHelper helper = new TypesHelper(xsdSchema);
+      return helper.getUserComplexTypeNamesList();
+    }
+    
+	  protected boolean hasElementChildren(Node parentNode)
+	  {
+	    boolean hasChildrenElements = false;
+	    if (parentNode != null && parentNode.hasChildNodes())
+	    {
+	      NodeList nodes = parentNode.getChildNodes();
+	      for (int i = 0; i < nodes.getLength(); i++)
+	      {
+	        if (nodes.item(i) instanceof Element)
+	        {
+	          hasChildrenElements = true;
+	          break;
+	        }
+	      }
+	    }
+	    return hasChildrenElements;
+	  }
+
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XPathPropertySource.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XPathPropertySource.java
new file mode 100644
index 0000000..9a5d893
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XPathPropertySource.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+
+
+public class XPathPropertySource
+  extends BasePropertySource
+  implements IPropertySource
+{
+  /**
+   * 
+   */
+  public XPathPropertySource()
+  {
+    super();
+  }
+  /**
+   * @param viewer
+   * @param xsdSchema
+   */
+  public XPathPropertySource(Viewer viewer, XSDSchema xsdSchema)
+  {
+    super(viewer, xsdSchema);
+// From Field     
+// WorkbenchHelp.setHelp(comp, XSDEditorContextIds.XSDE_UNIQUE_BASE_FIELDS_GROUP);
+//    fieldField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_FIELD_TEXT"));
+//    WorkbenchHelp.setHelp(fieldField, XSDEditorContextIds.XSDE_UNIQUE_BASE_SOURCE);
+
+// From Selector
+// WorkbenchHelp.setHelp(comp, XSDEditorContextIds.XSDE_UNIQUE_BASE_SELECTOR_GROUP);
+// WorkbenchHelp.setHelp(selectorField, XSDEditorContextIds.XSDE_UNIQUE_BASE_SELECTOR);
+// selectorField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_SELECTOR_TEXT"));
+    
+  }
+  /**
+   * @param xsdSchema
+   */
+  public XPathPropertySource(XSDSchema xsdSchema)
+  {
+    super(xsdSchema);
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getEditableValue()
+   */
+  public Object getEditableValue()
+  {
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyDescriptors()
+   */
+  public IPropertyDescriptor[] getPropertyDescriptors()
+  {
+    List list = new ArrayList();
+    // Create a descriptor and set a category
+    PropertyDescriptor xpathDescriptor =
+    new TextPropertyDescriptor(
+        XSDConstants.XPATH_ATTRIBUTE,
+        XSDConstants.XPATH_ATTRIBUTE);
+    list.add(xpathDescriptor);
+
+    IPropertyDescriptor[] result = new IPropertyDescriptor[list.size()];
+    list.toArray(result);
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object)
+   */
+  public Object getPropertyValue(Object id)
+  {
+    Object result = null;
+    if (id instanceof String)
+     {
+      result = element.getAttribute((String) id);
+    }
+    if (result == null)
+     {
+      result = "";
+    }
+    return result;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object)
+   */
+  public boolean isPropertySet(Object id)
+  {
+    return false;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+   */
+  public void resetPropertyValue(Object id)
+  {
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
+   */
+  public void setPropertyValue(Object id, Object value)
+  {
+    if (value != null)
+     {
+      if (value instanceof String)
+      {
+        if (XSDDOMHelper.inputEquals(element, XSDConstants.FIELD_ELEMENT_TAG, false))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_FIELD_XPATH_CHANGE"), element);
+        }
+        else if (XSDDOMHelper.inputEquals(element, XSDConstants.SELECTOR_ELEMENT_TAG, false))
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_SELECTOR_XPATH_CHANGE"), element);
+        }
+        
+        element.setAttribute(XSDConstants.XPATH_ATTRIBUTE, (String)value);
+        endRecording(element);
+      }
+    }
+    Runnable delayedUpdate = new Runnable()
+    {
+      public void run()
+      {
+        if (viewer != null)
+          viewer.refresh();
+      }
+    };
+    Display.getCurrent().asyncExec(delayedUpdate);
+    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDComboBoxPropertyDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDComboBoxPropertyDescriptor.java
new file mode 100644
index 0000000..b4d9cc2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDComboBoxPropertyDescriptor.java
@@ -0,0 +1,304 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import java.text.MessageFormat;
+
+import org.eclipse.jface.util.Assert;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.PopupList;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.KeyAdapter;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.views.properties.PropertyDescriptor;
+
+public class XSDComboBoxPropertyDescriptor extends PropertyDescriptor
+{
+	private String[] values;
+	
+	public XSDComboBoxPropertyDescriptor(Object id, String displayName, String[] valuesArray) {
+		super(id, displayName);
+		values = valuesArray;
+	}
+	/**
+	 * The <code>ComboBoxPropertyDescriptor</code> implementation of this 
+	 * <code>IPropertyDescriptor</code> method creates and returns a new
+	 * <code>ComboBoxCellEditor</code>.
+	 * <p>
+	 * The editor is configured with the current validator if there is one.
+	 * </p>
+	 */
+	public CellEditor createPropertyEditor(Composite parent) {
+    CellEditor editor = new XSDComboBoxCellEditor(parent, values);
+    //CellEditor editor = new StringComboBoxCellEditor(parent, values);
+		if (getValidator() != null)
+			editor.setValidator(getValidator());
+		return editor;
+	}
+	
+	public class XSDComboBoxCellEditor extends CellEditor
+	{
+		DynamicCellEditor comboBox;
+
+		private String fSelection;
+		protected String[] fItems;
+		protected Object fValue;
+		int selection;
+		Object typeObject;
+		
+		public void createItems(String[] items)
+		{
+			fItems = items;
+		}
+
+		public String[] getComboBoxItems()
+		{
+			return fItems;
+		}
+
+	/**
+	 * Creates a new combo box cell editor with the given choices.
+	 */
+		 public XSDComboBoxCellEditor(Composite parent, String[] items)
+		 {
+			 super(parent);
+			 fSelection = "";
+			 setItems(items);
+//			 fText.setText("");
+		 }
+
+		public void activate() {
+      if (doGetValue() != null)
+      {
+//			  int i = ((Integer)doGetValue()).intValue();
+//			  if (i >= 0)
+//		  	{
+//		  	  comboBox.setText(fItems[i]);
+//		  	}
+        comboBox.setText((String)fValue);
+			}
+		}
+
+		public void deactivate() {
+		  super.deactivate();
+		}
+
+		public void setItems(String[] items) {
+			Assert.isNotNull(items);
+			this.fItems = items;
+			populateComboBoxItems();
+		}
+
+		private void populateComboBoxItems() {
+			if (comboBox != null && fItems != null) {
+				comboBox.removeAll();
+				for (int i = 0; i < fItems.length; i++)
+					comboBox.add(fItems[i], i);
+
+				setValueValid(true);
+				selection = 0;
+			}
+		}
+
+	/**
+	 * Creates the actual UI representation.
+	 */
+
+		protected Control createControl(Composite parent)
+		{
+			comboBox = new DynamicCellEditor(parent, SWT.READ_ONLY |SWT.NONE | SWT.NO_TRIM);
+			comboBox.addKeyListener(new KeyAdapter() {
+				// hook key pressed - see PR 14201  
+				public void keyPressed(KeyEvent e) {
+//					System.out.println("Key e " + e);
+					keyReleaseOccured(e);
+				}
+			});
+
+			comboBox.addSelectionListener(new SelectionAdapter() {
+				public void widgetDefaultSelected(SelectionEvent event) {
+				}
+		
+				public void widgetSelected(SelectionEvent event) {
+//				  System.out.println("combo selected");
+					selection = comboBox.getSelectionIndex();
+					if (!comboBox.isDropped()) // allows user to traverse list using keyboard without applying value
+					applyEditorValueAndDeactivate();
+				}
+			});
+
+			comboBox.addTraverseListener(new TraverseListener() {
+				public void keyTraversed(TraverseEvent e) {
+//				  System.out.println("TRAVERSE e " + e);
+					if (e.detail == SWT.TRAVERSE_ESCAPE || e.detail == SWT.TRAVERSE_RETURN) {
+						e.doit = false;
+					}
+				}
+			});
+			
+      
+			comboBox.addFocusListener(new FocusAdapter() {
+				public void focusLost(FocusEvent e) {
+					XSDComboBoxCellEditor.this.focusLost();
+				}
+				public void focusGained(FocusEvent e) {
+//				  System.out.println("focusGained");
+				}
+			});
+		  setValueValid(true);
+			return comboBox;
+		}
+
+		protected void focusLost() {
+//		  System.out.println("CELLEDITOR FOCUS LOST");
+			if (isActivated()) {
+				applyEditorValueAndDeactivate();
+			}
+		}
+		
+		protected void keyReleaseOccured(KeyEvent keyEvent) {
+			if (keyEvent.character == '\u001b') { // Escape character
+			  comboBox.setText(""); // clear text
+				fireCancelEditor();
+			} else if (keyEvent.character == '\r') { // Return key
+				//fireApplyEditorValue();
+				applyEditorValueAndDeactivate();
+				deactivate();
+			}
+		}
+
+		void applyEditorValueAndDeactivate() {
+			//	must set the selection before getting value
+			selection = comboBox.getSelectionIndex();
+			if (selection < 0)
+			{
+			  deactivate();
+			  return;
+			}
+			// Object newValue = new Integer(selection);
+      Object newValue = fItems[selection];
+			markDirty();
+			boolean isValid = isCorrect(newValue);
+			setValueValid(isValid);
+			if (!isValid) {
+				// try to insert the current value into the error message.
+				setErrorMessage(
+					MessageFormat.format(getErrorMessage(), new Object[] {fItems[selection]})); 
+			}
+			doSetValue(newValue);
+			fireApplyEditorValue();
+			deactivate();
+		}
+
+    protected Object doGetValue() {
+      return fValue;
+      // otherwise limits to set of valid values
+//      Object index = super.doGetValue();
+//      int selection = -1;
+//      if (index instanceof Integer)
+//        selection = ((Integer) index).intValue();
+//      if (selection >= 0)
+//        return fItems[selection];
+//      else if (getControl() instanceof CCombo) {
+//        // retrieve the actual text as the list of valid items doesn't contain the value
+//        return ((CCombo) getControl()).getText();
+//      }
+//      return null;
+    }
+    private boolean fSettingValue = false;
+    protected void doSetValue(Object value) {
+      if (fSettingValue)
+        return;
+      fSettingValue = true;
+      if (value instanceof Integer) {
+        //super.doSetValue(value);
+        fValue = value;
+      }
+      else {
+        String stringValue = value.toString();
+        int selection = -1;
+        for (int i = 0; i < fItems.length; i++)
+          if (fItems[i].equals(stringValue))
+            selection = i;
+        if (selection >= 0)
+          //super.doSetValue(new Integer(selection));
+          fValue = stringValue;
+        else {
+          // super.doSetValue(new Integer(-1));
+          // fValue = new Integer(-1);
+          fValue = stringValue;
+          if (getControl() instanceof CCombo && !stringValue.equals(((CCombo) getControl()).getText())) {
+            // update the Text widget
+            ((CCombo) getControl()).setText(stringValue);
+          }
+        }
+      }
+      fSettingValue = false;
+    }		
+		
+	/**
+		* Returns the cell editor's value.
+		*/
+//		protected Object doGetValue() 
+//		{
+//			return fValue;
+//		}
+
+	/**
+	 * Set the focus to the cell editor's UI representation.
+	 */
+		protected void doSetFocus()
+		{
+//			fButton.setFocus();
+//      System.out.println("doSetFocus() " + moreButton.setFocus());
+      comboBox.setFocus();
+		}
+
+	/**
+	 * Sets the value of the cell editor to the given value.
+	 */
+//		protected void doSetValue(Object value)
+//		{
+//			fValue = value;
+//		}
+
+		protected void fillPopupList(PopupList list) 
+		{
+			String[] labels= new String[fItems.length];
+			for (int i= 0; i < labels.length; i++)
+			{
+				String item= fItems[i];
+				labels[i]= item;
+//				System.out.println(fItems[i]);
+				if (fSelection == null && fValue != null && fValue.equals(item)) 
+				{
+					fSelection = item;
+				}
+			}
+
+			list.setItems(labels);
+			if (fSelection != null) 
+			{
+//				fText.setText(fSelection);
+				list.select(fSelection);
+			}	
+		}
+	}
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDPropertySheetPage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDPropertySheetPage.java
new file mode 100644
index 0000000..95ee94b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDPropertySheetPage.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.custom.ViewForm;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.views.properties.PropertySheet;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+import org.eclipse.wst.sse.core.IStructuredModel;
+import org.eclipse.wst.sse.ui.ViewerSelectionManager;
+import org.eclipse.wst.sse.ui.view.events.INodeSelectionListener;
+import org.eclipse.wst.sse.ui.view.events.NodeSelectionChangedEvent;
+import org.eclipse.wst.sse.ui.views.properties.RemoveAction;
+import org.w3c.dom.Node;
+import org.w3c.dom.Text;
+
+public class XSDPropertySheetPage extends PropertySheetPage implements ISelectionChangedListener, INodeSelectionListener
+{
+  /**
+   * @param model
+   */
+
+  IEditorPart editorPart;
+	private ViewerSelectionManager fViewerSelectionManager;
+  IStructuredModel model;
+  protected RemoveAction fRemoveAction;
+  Control designControl;
+
+  public XSDPropertySheetPage(IStructuredModel model, IEditorPart editorPart)
+  {
+    super();
+    this.model = model;
+    this.editorPart = editorPart;
+  }
+
+  public void selectionChanged(SelectionChangedEvent event)
+  {
+		super.selectionChanged(null, event.getSelection());
+  }
+  
+	public void setViewerSelectionManager(ViewerSelectionManager viewerSelectionManager) {
+		// disconnect from old one
+		if (fViewerSelectionManager != null) {
+			fViewerSelectionManager.removeNodeSelectionListener(this);
+		}
+
+		fViewerSelectionManager = viewerSelectionManager;
+
+		// connect to new one
+		if (fViewerSelectionManager != null) {
+			fViewerSelectionManager.addNodeSelectionListener(this);
+		}
+	}
+
+	public void dispose() {
+		// disconnect from the ViewerSelectionManager
+		if (fViewerSelectionManager != null) {
+			fViewerSelectionManager.removeNodeSelectionListener(this);
+		}
+		super.dispose();
+	}
+
+	public void nodeSelectionChanged(NodeSelectionChangedEvent event) {
+		// multiple selection is unsupported
+		if (event.getSelectedNodes().size() > 1)
+		{
+			selectionChanged(null, StructuredSelection.EMPTY);
+		}
+		else if (event.getSelectedNodes().size() == 0)
+		{
+		  
+		}
+		else
+		{
+      Object item = event.getSelectedNodes().get(0);
+      if (item instanceof Text)
+      {
+        Node parent = ((Text)item).getParentNode();
+        selectionChanged(null, new StructuredSelection(parent));
+      }
+      else
+      {
+  			selectionChanged(null, new StructuredSelection(event.getSelectedNodes()));
+      }
+		}
+	}
+
+  private void setPropertiesTitle(PropertySheet thePart, String title)
+	{
+		Control control = thePart.getDefaultPage().getControl();
+		for (Composite parent = control.getParent(); parent != null; parent = parent.getParent())
+		{
+			if (parent instanceof ViewForm)
+			{
+				Control[] children = parent.getChildren();
+				if (children.length > 0 && children[0] instanceof CLabel)
+				{
+					CLabel clabel = (CLabel)children[0];
+  				clabel.setText(title);
+				}
+			}
+		}
+	}
+  
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDPropertySourceProvider.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDPropertySourceProvider.java
new file mode 100644
index 0000000..78e790b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/XSDPropertySourceProvider.java
@@ -0,0 +1,285 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties;
+
+import org.eclipse.ui.views.properties.IPropertySource;
+import org.eclipse.ui.views.properties.IPropertySourceProvider;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class XSDPropertySourceProvider implements IPropertySourceProvider
+{
+  XSDSchema xsdSchema;
+  /**
+   * 
+   * @todo Generated comment
+   */
+  public XSDPropertySourceProvider()
+  {
+    super();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.ui.views.properties.IPropertySourceProvider#getPropertySource(java.lang.Object)
+   */
+  public IPropertySource getPropertySource(Object object)
+  {
+    if (object == null) return null;
+    
+    if (object instanceof XSDConcreteComponent)
+    {
+      XSDConcreteComponent component = (XSDConcreteComponent)object;
+      
+      xsdSchema = component.getSchema();
+      
+      if (component instanceof XSDElementDeclaration)
+      {
+        XSDElementDeclaration elementDeclaration = (XSDElementDeclaration)component;
+        if (elementDeclaration.isElementDeclarationReference())
+        {
+          component = elementDeclaration.getResolvedElementDeclaration();
+        }
+      }
+      
+      Element input = component.getElement(); 
+      
+      BasePropertySource bps = (BasePropertySource)getXSDPropertySource(input);
+      if (bps == null) return null;
+      
+      bps.setInput(input);
+      return bps;
+    }
+    return null;
+  }
+  
+  boolean showParent = false;
+  
+  public IPropertySource getXSDPropertySource(Object object)
+  {
+    Element input = (Element)object;
+
+    showParent = false;
+  
+    if (inputEquals(input, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+    {
+      return new ElementPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.ELEMENT_ELEMENT_TAG, true))
+    {
+      return new GroupRefPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.SEQUENCE_ELEMENT_TAG, false) ||
+              inputEquals(input, XSDConstants.CHOICE_ELEMENT_TAG, false) ||
+              inputEquals(input, XSDConstants.ALL_ELEMENT_TAG, false))
+    {
+      return new ModelGroupPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+    {
+      return new AttributePropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.ATTRIBUTE_ELEMENT_TAG, true))
+    {
+      return new AttributeGroupRefPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, false))
+    {
+      return new NamePropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true))
+    {
+      return new AttributeGroupRefPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.NOTATION_ELEMENT_TAG, false))
+    {
+      return new NotationPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+    {
+      return new SimpleTypePropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.GROUP_ELEMENT_TAG, false))
+    {
+      return new NamePropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.GROUP_ELEMENT_TAG, true))
+    {
+      return new GroupRefPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.SCHEMA_ELEMENT_TAG, false))
+    {
+      return new SchemaPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+    {
+      return new ComplexTypePropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.DOCUMENTATION_ELEMENT_TAG, false))
+    {
+      return new DocumentationPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.APPINFO_ELEMENT_TAG, false))
+    {
+      return new AppInfoPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+    {
+      if (input != null && input instanceof Element)
+      {
+        Element parent = (Element)input;
+        XSDDOMHelper xsdDOMHelper = new XSDDOMHelper();
+        Element derivedByNode = xsdDOMHelper.getDerivedByElement(parent);
+        if (derivedByNode != null)
+        {
+          if (inputEquals(derivedByNode, XSDConstants.RESTRICTION_ELEMENT_TAG, false) || 
+              inputEquals(derivedByNode, XSDConstants.EXTENSION_ELEMENT_TAG, false))
+          {
+            return new SimpleContentPropertySource(xsdSchema);
+          }
+        }
+        else
+        {
+          return null;
+        }
+      }
+    }
+    else if (inputEquals(input, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+    {
+      if (input != null && input instanceof Element)
+      {
+        Element parent = (Element)input;
+        XSDDOMHelper xsdDOMHelper = new XSDDOMHelper();
+        Element derivedByNode = xsdDOMHelper.getDerivedByElement(parent);
+        if (derivedByNode != null)
+        {
+          return new SimpleContentPropertySource(xsdSchema);
+        }
+        else
+        {
+          return null;
+        }
+      }
+    }
+    else if (inputEquals(input, XSDConstants.LIST_ELEMENT_TAG, false))
+    {
+      return new SimpleTypeListPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.UNION_ELEMENT_TAG, false))
+    {
+      return new SimpleTypeUnionPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.RESTRICTION_ELEMENT_TAG, false))
+    {
+      return createRestrictWindow(input, xsdSchema);
+    }
+    else if (XSDDOMHelper.isFacet(input))
+    {
+      if (input != null && input instanceof Element)
+      {
+        Node parent = ((Element)input).getParentNode();
+        if (inputEquals(parent, XSDConstants.RESTRICTION_ELEMENT_TAG, false))
+        {
+          return createRestrictWindow(input, xsdSchema);
+        } 
+      }
+    }
+    else if (inputEquals(input, XSDConstants.EXTENSION_ELEMENT_TAG, false))
+    {
+      if (input != null && input instanceof Element)
+      {
+        Node parent = ((Element)input).getParentNode();
+        if (inputEquals(parent, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false)
+            || inputEquals(parent, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+        {
+          showParent = true;
+          return new SimpleContentPropertySource(xsdSchema);
+        }
+      }
+    }
+    else if (inputEquals(input, XSDConstants.PATTERN_ELEMENT_TAG, false))
+    {
+      return new PatternPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.ENUMERATION_ELEMENT_TAG, false))
+    {
+      return new EnumerationPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.ANY_ELEMENT_TAG, false))
+    {
+      return new AnyElementPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false))
+    {
+      return new AnyAttributePropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.UNIQUE_ELEMENT_TAG, false))
+    {
+      return new NamePropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.KEYREF_ELEMENT_TAG, false))
+    {
+      return new KeyrefPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.SELECTOR_ELEMENT_TAG, false))
+    {
+      return new XPathPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.FIELD_ELEMENT_TAG, false))
+    {
+      return new XPathPropertySource(xsdSchema);
+    }
+    else if (inputEquals(input, XSDConstants.KEY_ELEMENT_TAG, false))
+    {
+      return new NamePropertySource(xsdSchema);
+    }
+    else
+    {
+      return null;
+    }
+    return null;
+  }
+
+  protected IPropertySource createRestrictWindow(Object input, XSDSchema xsdSchema)
+  {
+    // special case where SimpleType restriction is different than SimpleContent restriction
+
+    if (input != null && input instanceof Element)
+    {
+      Node parent = ((Element)input).getParentNode();
+      if (inputEquals(parent, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+      {
+        return new SimpleRestrictPropertySource(xsdSchema);
+      }
+      else if (inputEquals(parent, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+      {
+        return new SimpleRestrictPropertySource(xsdSchema);
+      }
+      else if (inputEquals(parent, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+      {
+        showParent = true;
+        return new SimpleContentPropertySource(xsdSchema);
+      }
+    }
+    return null;
+  }
+
+
+  protected boolean inputEquals(Object input, String tagname, boolean isRef)
+  {
+    return XSDDOMHelper.inputEquals(input, tagname, isRef);
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AbstractSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AbstractSection.java
new file mode 100644
index 0000000..010bf73
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AbstractSection.java
@@ -0,0 +1,495 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.jface.util.IPropertyChangeListener;
+import org.eclipse.jface.util.PropertyChangeEvent;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+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.ui.IEditorPart;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.part.EditorActionBarContributor;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetPage;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xml.core.NameValidator;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateElementAction;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class AbstractSection implements ISection, IPropertyChangeListener, Listener, SelectionListener
+{
+	private TabbedPropertySheetWidgetFactory factory;
+	protected IWorkbenchPart part;
+	protected ISelection selection;
+	protected Object input;
+  protected boolean doRefresh = true;
+	XSDSchema xsdSchema;
+  protected boolean isReadOnly = false;
+  private IStatusLineManager statusLine;
+  protected Composite composite;
+  protected int rightMarginSpace;
+  protected int tableMinimumWidth = 50;
+ 
+  /**
+   * 
+   */
+  public AbstractSection()
+  {
+    super();
+  }
+  
+  public void createControls(Composite parent,	TabbedPropertySheetPage tabbedPropertySheetPage)
+  {
+    createControls(parent, tabbedPropertySheetPage.getWidgetFactory());
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+   */
+  public void createControls(Composite parent, TabbedPropertySheetWidgetFactory aFactory)
+  {
+		this.factory = aFactory;
+    GC gc = new GC(parent);
+    Point extent = gc.textExtent("  ...  ");
+    rightMarginSpace = extent.x;
+    gc.dispose();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#setInput(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public void setInput(IWorkbenchPart part, ISelection selection)
+  {
+		Assert.isTrue(selection instanceof IStructuredSelection);
+		this.part = part;
+		this.selection = selection;
+		Object input = ((IStructuredSelection)selection).getFirstElement();
+    this.input = input;
+    
+    if (input instanceof XSDConcreteComponent)
+    {
+      xsdSchema = ((XSDConcreteComponent)input).getSchema();
+      
+      Element element = ((XSDConcreteComponent)input).getElement();
+      if (element instanceof XMLNode)
+      {
+        isReadOnly = false;
+      }
+      else
+      {
+        isReadOnly = true;
+      }
+    }
+    statusLine = getStatusLine();
+    clearErrorMessage();
+
+//		refresh();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#aboutToBeShown()
+   */
+  public void aboutToBeShown()
+  {
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#aboutToBeHidden()
+   */
+  public void aboutToBeHidden()
+  {
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#dispose()
+   */
+  public void dispose()
+  {
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#getMinimumHeight()
+   */
+  public int getMinimumHeight()
+  {
+    return SWT.DEFAULT;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#shouldUseExtraSpace()
+   */
+  public boolean shouldUseExtraSpace()
+  {
+    return false;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#refresh()
+   */
+  public void refresh()
+  {
+  }
+
+  public Object getInput()
+  {
+    if (input instanceof Element)
+    {
+      input = xsdSchema.getCorrespondingComponent((Element)input);
+    }
+    return input;
+  }
+  
+  public XSDSchema getSchema()
+  {
+    return xsdSchema;
+  }
+  
+	/**
+	 * Get the widget factory.
+	 * @return the widget factory.
+	 */
+	public TabbedPropertySheetWidgetFactory getWidgetFactory() {
+		return factory;
+	}
+
+	public void propertyChange(PropertyChangeEvent event)
+	{
+    refresh();
+	}
+
+	
+  public void doWidgetDefaultSelected(SelectionEvent e)
+  {}
+  
+  public void doWidgetSelected(SelectionEvent e)
+  {}
+  
+  /**
+   * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(SelectionEvent)
+   */
+  public void widgetDefaultSelected(SelectionEvent e)
+  {
+    if (isListenerEnabled() &&
+        getInput() != null &&
+        !isInDoHandle &&
+        !isReadOnly) 
+    {
+      isInDoHandle = true;
+      doWidgetDefaultSelected(e);
+      isInDoHandle = false;
+    }
+    
+  }
+
+  /**
+   * @see org.eclipse.swt.events.SelectionListener#widgetSelected(SelectionEvent)
+   */
+  public void widgetSelected(SelectionEvent e)
+  {
+    if (isListenerEnabled() &&
+        getInput() != null &&
+        !isInDoHandle &&
+        !isReadOnly) 
+    {
+      isInDoHandle = true;
+      doWidgetSelected(e);
+      isInDoHandle = false;
+    }
+    
+  }
+  
+  boolean listenerEnabled = true;
+  /**
+   * Get the value of listenerEnabled.
+   * @return value of listenerEnabled.
+   */
+  public boolean isListenerEnabled() 
+  {
+    return listenerEnabled;
+  }
+  
+  /**
+   * Set the value of listenerEnabled.
+   * @param v  Value to assign to listenerEnabled.
+   */
+  public void setListenerEnabled(boolean  v) 
+  {
+    this.listenerEnabled = v;
+  }
+
+  public void handleEvent(Event event)
+  {
+    if (isListenerEnabled() && !isInDoHandle && !isReadOnly) 
+    {
+      isInDoHandle = true;
+      startDelayedEvent(event);
+      isInDoHandle = false;
+    } // end of if ()
+  }
+  
+  public void doHandleEvent(Event event)
+  {
+    
+  }
+  
+  protected DelayedEvent delayedTask;
+  
+  protected void startDelayedEvent(Event e)
+  {
+    if (delayedTask == null ||
+      delayedTask.getEvent() == null)
+    {
+      delayedTask = new DelayedEvent();
+      delayedTask.setEvent(e);
+      Display.getDefault().timerExec(500,delayedTask);
+    }
+    else
+    {
+      Event delayedEvent = delayedTask.getEvent();
+      
+      if (e.widget == delayedEvent.widget &&
+        e.type == delayedEvent.type)
+      {
+        // same event, just different data, delay new event
+        delayedTask.setEvent(null);
+      }
+      delayedTask = new DelayedEvent();
+      delayedTask.setEvent(e);
+      Display.getDefault().timerExec(500,delayedTask);
+    }
+  }
+  
+  class DelayedEvent implements Runnable
+  {
+    protected Event event;
+    
+    /*
+     * @see Runnable#run()
+     */
+    public void run()
+    {
+      if (event != null)
+      {
+        isInDoHandle = true;
+        doHandleEvent(event);
+        isInDoHandle = false;
+        event = null;
+      }
+    }
+    
+    /**
+     * Gets the event.
+     * @return Returns a Event
+     */
+    public Event getEvent()
+    {
+      return event;
+    }
+
+    /**
+     * Sets the event.
+     * @param event The event to set
+     */
+    public void setEvent(Event event)
+    {
+      this.event = event;
+    }
+
+  }
+
+  boolean isInDoHandle;
+  /**
+   * Get the value of isInDoHandle.
+   * @return value of isInDoHandle.
+   */
+  public boolean isInDoHandle() 
+  {
+    return isInDoHandle;
+  }
+
+  
+  protected IEditorPart getActiveEditor()
+  {
+    IWorkbench workbench = XSDEditorPlugin.getPlugin().getWorkbench();
+    IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+    IEditorPart editorPart = workbenchWindow.getActivePage().getActiveEditor();
+//    IEditorPart editorPart = part.getSite().getWorkbenchWindow().getActivePage().getActiveEditor();
+
+    return editorPart;
+  }
+
+  static protected IStatusLineManager getStatusLineManager(IEditorPart editorPart)
+  { 
+    IStatusLineManager result = null;
+    try
+    {                       
+      EditorActionBarContributor contributor = (EditorActionBarContributor)editorPart.getEditorSite().getActionBarContributor();
+      result = contributor.getActionBars().getStatusLineManager();
+    }
+    catch (Exception e)
+    {
+    }  
+    return result;
+  }
+
+  protected XSDDOMHelper domHelper = new XSDDOMHelper();
+  /**
+   * Gets the domHelper.
+   * @return Returns a XSDDomHelper
+   */
+  public XSDDOMHelper getDomHelper()
+  {
+    return domHelper;
+  }
+  
+  public DocumentImpl getDocument(Element element)
+  {
+    return (DocumentImpl) element.getOwnerDocument();
+  }
+
+  public void beginRecording(String description, Element element)
+  {
+    getDocument(element).getModel().beginRecording(this, description);
+  }
+  
+  public void endRecording(Element element)
+  {
+    DocumentImpl doc = (DocumentImpl) getDocument(element);
+    
+    doc.getModel().endRecording(this);    
+  }
+
+  protected boolean validateName(String name)
+  {
+    try
+    {
+      return NameValidator.isValid(name);
+    }
+    catch (Exception e)
+    {
+      return false;
+    }
+  }
+
+  // TODO
+  protected boolean validateLanguage(String lang)
+  {
+    return true;
+  }
+
+  // TODO
+  protected boolean validatePrefix(String prefix)
+  {
+    return true;
+  }
+
+  
+  protected Action getNewElementAction(String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    CreateElementAction action = new CreateElementAction(label);
+    action.setElementTag(elementTag);
+    action.setAttributes(attributes);
+    action.setParentNode(parent);
+    action.setRelativeNode(relativeNode);
+    action.setXSDSchema(getSchema());
+    action.setSelectionProvider(null);
+    return action;
+  }
+
+  public void setErrorMessage(String message)
+  {
+    if (statusLine != null)
+    {
+      statusLine.setErrorMessage(message);
+      statusLine.update(true);
+    }
+  }
+
+  public void clearErrorMessage()
+  {
+    if (statusLine != null)
+    {
+      statusLine.setErrorMessage(null);
+      statusLine.update(false);
+    }
+  }
+
+  EditorActionBarContributor contributor;
+  protected IStatusLineManager getStatusLine()
+  {
+//    IWorkbench workbench = XSDEditorPlugin.getPlugin().getWorkbench();
+//    IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+    IEditorPart editorPart = part.getSite().getWorkbenchWindow().getActivePage().getActiveEditor();
+    
+    if (statusLine == null)
+    {
+      try
+      {                       
+        contributor = (EditorActionBarContributor)editorPart.getEditorSite().getActionBarContributor();
+        statusLine = contributor.getActionBars().getStatusLineManager();
+      }
+      catch (Exception e)
+      {
+      }  
+    }
+    return statusLine;
+  }
+  
+  /**
+   * Get the standard label width when labels for sections line up on the left
+   * hand side of the composite. We line up to a fixed position, but if a
+   * string is wider than the fixed position, then we use that widest string.
+   * 
+   * @param parent
+   *            The parent composite used to create a GC.
+   * @param labels
+   *            The list of labels.
+   * @return the standard label width.
+   */
+  protected int getStandardLabelWidth(Composite parent, String[] labels) {
+    int standardLabelWidth = 100;   // STANDARD_LABEL_WIDTH;
+    GC gc = new GC(parent);
+    int indent = gc.textExtent("XXX").x; //$NON-NLS-1$
+    for (int i = 0; i < labels.length; i++) {
+      int width = gc.textExtent(labels[i]).x;
+      if (width + indent > standardLabelWidth) {
+        standardLabelWidth = width + indent;
+      }
+    }
+    gc.dispose();
+    return standardLabelWidth;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AbstractSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AbstractSectionDescriptor.java
new file mode 100644
index 0000000..68bc6f7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AbstractSectionDescriptor.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.wst.common.ui.properties.ISectionDescriptor;
+import org.eclipse.wst.common.ui.properties.ITypeMapper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.w3c.dom.Element;
+
+public class AbstractSectionDescriptor implements ISectionDescriptor
+{
+  /**
+   * 
+   */
+  public AbstractSectionDescriptor()
+  {
+    super();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getFilter()
+   */
+  public ITypeMapper getFilter()
+  {
+    return null;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDConcreteComponent.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return null;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return null;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDConcreteComponent || object instanceof Element)
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getAfterSection()
+   */
+  public String getAfterSection()
+  {
+    return "";
+  }
+
+  protected boolean inputEquals(Object input, String tagname, boolean isRef)
+  {
+    return XSDDOMHelper.inputEquals(input, tagname, isRef);
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AnnotationSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AnnotationSection.java
new file mode 100644
index 0000000..75da720
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AnnotationSection.java
@@ -0,0 +1,595 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDAnnotation;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFacet;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDIdentityConstraintDefinition;
+import org.eclipse.xsd.XSDImport;
+import org.eclipse.xsd.XSDInclude;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNotationDeclaration;
+import org.eclipse.xsd.XSDRedefine;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.XSDWildcard;
+import org.eclipse.xsd.XSDXPathDefinition;
+import org.eclipse.xsd.impl.XSDFactoryImpl;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.CharacterData;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class AnnotationSection extends AbstractSection
+{
+  DocumentationWorkbookPage documentationPage;
+  AppInfoWorkbookPage appInfoPage;
+  XSDWorkbook workbook;
+  XSDFactory factory;
+  
+  /**
+   * 
+   */
+  public AnnotationSection()
+  {
+    super();
+    factory = new XSDFactoryImpl();
+  }
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+//		Composite composite = getWidgetFactory().createFlatFormComposite(parent);
+//    Composite composite = new Composite(parent, SWT.NONE);
+		FormData data;
+
+    workbook = new XSDWorkbook(parent, SWT.BOTTOM | SWT.FLAT);
+    
+    documentationPage = new DocumentationWorkbookPage(workbook);
+    appInfoPage = new AppInfoWorkbookPage(workbook);
+
+    documentationPage.activate();
+    appInfoPage.activate();
+    workbook.setSelectedPage(documentationPage);
+  }
+
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+    if (doRefresh)
+    {
+      if (documentationPage.getDocumentationText().isFocusControl() || appInfoPage.getAppInfoText().isFocusControl())
+      {
+        return;
+      }
+      
+      if (isReadOnly)
+      {
+        documentationPage.setEnabled(false);
+        appInfoPage.setEnabled(false);
+      }
+      else
+      {
+        documentationPage.setEnabled(true);
+        appInfoPage.setEnabled(true);
+      }
+      setListenerEnabled(false);
+	    Object input = getInput();
+	    if (input != null)
+	    {
+	      XSDAnnotation xsdAnnotation = getInputXSDAnnotation(false);
+        setInitialText(xsdAnnotation);
+      }
+      setListenerEnabled(true);
+	  }
+	}
+
+  
+  public void doHandleEvent(Event event)
+  {
+    Object input = getInput();
+    if (input != null)
+    {
+      XSDAnnotation xsdAnnotation = getInputXSDAnnotation(true);
+  
+      if (event.widget == documentationPage.getDocumentationText())
+      {
+        documentationPage.doHandleEvent(xsdAnnotation);
+      }
+      else if (event.widget == appInfoPage.getAppInfoText())
+      {
+        appInfoPage.doHandleEvent(xsdAnnotation);
+      }
+    }
+    
+  }
+  
+  protected XSDAnnotation getInputXSDAnnotation(boolean createIfNotExist)
+  {
+    XSDAnnotation xsdAnnotation = null;
+    
+    if (input instanceof XSDAttributeDeclaration)
+    {
+      XSDAttributeDeclaration xsdComp = (XSDAttributeDeclaration)input; 
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDAttributeGroupDefinition)
+    {
+      XSDAttributeGroupDefinition xsdComp = (XSDAttributeGroupDefinition)input;
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDElementDeclaration)
+    {
+      XSDElementDeclaration xsdComp = (XSDElementDeclaration)input; 
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDNotationDeclaration)
+    {
+      XSDNotationDeclaration xsdComp =(XSDNotationDeclaration)input;
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDXPathDefinition)
+    {
+      XSDXPathDefinition xsdComp = (XSDXPathDefinition)input;
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDModelGroup)
+    {
+      XSDModelGroup xsdComp = (XSDModelGroup)input;
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDModelGroupDefinition)
+    {
+      XSDModelGroupDefinition xsdComp = (XSDModelGroupDefinition)input;
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDIdentityConstraintDefinition)
+    {
+      XSDIdentityConstraintDefinition xsdComp = (XSDIdentityConstraintDefinition)input;
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDWildcard)
+    {
+      XSDWildcard xsdComp = (XSDWildcard)input;
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDSchema)
+    {
+      XSDSchema xsdComp = (XSDSchema)input;
+      List list = xsdComp.getAnnotations();
+      if (list.size() > 0)
+      {
+        xsdAnnotation = (XSDAnnotation)list.get(0);
+      }
+      else
+      {
+        if (createIfNotExist && xsdAnnotation == null)
+        {
+          xsdAnnotation = factory.createXSDAnnotation();
+          if (xsdComp.getContents() != null)
+          {
+            xsdComp.getContents().add(0, xsdAnnotation);
+          }
+        }
+      }
+      return xsdAnnotation;
+    }
+    else if (input instanceof XSDFacet)
+    {
+      XSDFacet xsdComp = (XSDFacet)input;
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDTypeDefinition)
+    {
+      XSDTypeDefinition xsdComp = (XSDTypeDefinition)input;
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDInclude)
+    {
+      XSDInclude xsdComp = (XSDInclude)input;
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDImport)
+    {
+      XSDImport xsdComp = (XSDImport)input;
+      xsdAnnotation = xsdComp.getAnnotation();
+      if (createIfNotExist && xsdAnnotation == null)
+      {
+        xsdAnnotation = factory.createXSDAnnotation();
+        xsdComp.setAnnotation(xsdAnnotation);
+      }
+    }
+    else if (input instanceof XSDRedefine)
+    {
+      XSDRedefine xsdComp = (XSDRedefine)input;
+      List list = xsdComp.getAnnotations();
+      if (list.size() > 0)
+      {
+        xsdAnnotation = (XSDAnnotation)list.get(0);
+      }
+      else
+      {
+        if (createIfNotExist && xsdAnnotation == null)
+        {
+// ?
+        }
+      }
+      return xsdAnnotation;
+    }
+    else if (input instanceof XSDAnnotation)
+    {
+      xsdAnnotation = (XSDAnnotation)input;
+    }
+    
+    if (createIfNotExist)
+    {
+      formatAnnotation(xsdAnnotation);
+    }
+
+    return xsdAnnotation;
+  }
+  
+  private void formatAnnotation(XSDAnnotation annotation)
+  {
+    Element element = annotation.getElement();
+    XSDDOMHelper.formatChild(element);
+  }
+  
+
+  public boolean shouldUseExtraSpace()
+  {
+    return true;
+  }
+
+  public void dispose()
+  {
+    factory = null;
+  }
+  
+  private void setInitialText(XSDAnnotation an)
+  {
+    if (documentationPage != null)
+    {
+      documentationPage.setText("");
+    }
+    if (appInfoPage != null)
+    {
+      appInfoPage.setText("");
+    }
+
+    if (an != null)
+    {
+      Element element = an.getElement();
+      try
+      {
+        if (element.hasChildNodes())
+         {
+          // if the element is Text
+          Element docElement = (Element)domHelper.getChildNode(element, XSDConstants.DOCUMENTATION_ELEMENT_TAG);
+          if (docElement != null)
+          {
+            Node node = docElement.getFirstChild();
+            if (node instanceof CharacterData)
+            {
+              documentationPage.setText( ((CharacterData)node).getData());
+            }
+          }
+          
+          Element appInfoElement = (Element)domHelper.getChildNode(element, XSDConstants.APPINFO_ELEMENT_TAG);
+          if (appInfoElement != null)
+          {
+            Node node = appInfoElement.getFirstChild();
+            if (node instanceof CharacterData)
+            {
+              appInfoPage.setText( ((CharacterData)node).getData());
+            }
+          }
+
+        }
+      }
+      catch (Exception e)
+      {
+        
+      }
+    }
+  }
+  
+ 
+  class DocumentationWorkbookPage extends XSDWorkbookPage
+  {
+    Text documentationText;
+    Composite page1;
+    
+    public DocumentationWorkbookPage(XSDWorkbook workbook)
+    {
+      super(workbook);
+      this.getTabItem().setText("Documentation");
+    }
+
+    public void setText(String value)
+    {
+      documentationText.setText(value);
+    }
+    
+    public void setEnabled(boolean state)
+    {
+      page1.setEnabled(state);
+    }
+    
+    public String getText()
+    {
+      return documentationText.getText();
+    }
+    
+    public Text getDocumentationText()
+    {
+      return documentationText;
+    }
+    
+    public Control createControl (Composite parent)
+    {
+      page1 = getWidgetFactory().createFlatFormComposite(parent);
+      documentationText = getWidgetFactory().createText(page1, "", SWT.V_SCROLL | SWT.H_SCROLL);
+      documentationText.addListener(SWT.Modify, AnnotationSection.this);
+
+      FormData data = new FormData();
+      data.left = new FormAttachment(0, 0);
+      data.right = new FormAttachment(100, 0);
+      data.top = new FormAttachment(0, 0);
+      data.bottom = new FormAttachment(100, 0);
+      documentationText.setLayoutData(data);
+                  
+      return page1;
+    }
+    
+    public void doHandleEvent(XSDAnnotation xsdAnnotation)
+    {
+      if (xsdAnnotation != null)
+      {
+        Element element = xsdAnnotation.getElement();
+        List documentationList = xsdAnnotation.getUserInformation();
+        Element documentationElement = null;
+        if (documentationList.size() > 0)
+        {
+          documentationElement = (Element)documentationList.get(0);
+        }
+        
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_DOCUMENTATION_COMMENT_CHANGE"), element);
+        
+        if (documentationElement == null)
+        {
+          documentationElement = xsdAnnotation.createUserInformation(null);
+          element.appendChild(documentationElement);
+          XSDDOMHelper.formatChild(documentationElement);
+          // Defect in model....I create it but the model object doesn't appear to be updated
+          // Notice that it is fine for appinfo
+          xsdAnnotation.updateElement();
+          xsdAnnotation.setElement(element);
+        }
+        
+        String newValue = documentationText.getText();
+        if (documentationElement != null)
+        {
+          try
+          {
+            if (documentationElement.hasChildNodes())
+            {
+            // if the element is Text
+              Node node = documentationElement.getFirstChild();
+              if (node instanceof CharacterData)
+              {
+                ((CharacterData)node).setData(newValue);
+              }
+            }
+            else
+            {
+              if (newValue.length() > 0)
+              {
+                Node childNode = documentationElement.getOwnerDocument().createTextNode(newValue);
+                documentationElement.appendChild(childNode);
+              }
+            }
+          }
+          catch (Exception e)
+          {
+          
+          }
+        }
+        endRecording(element);
+      }    
+    }
+  }
+  
+  class AppInfoWorkbookPage extends XSDWorkbookPage
+  {
+    Text appInfoText;
+    Composite page2;
+    
+    public AppInfoWorkbookPage(XSDWorkbook workbook)
+    {
+      super(workbook);
+      this.getTabItem().setText("App Info");
+    }
+    
+    public void setText(String value)
+    {
+      appInfoText.setText(value);
+    }
+
+    public String getText()
+    {
+      return appInfoText.getText();
+    }
+
+    public Text getAppInfoText()
+    {
+      return appInfoText;
+    }
+
+    public void setEnabled(boolean state)
+    {
+      page2.setEnabled(state);
+    }
+
+    public Control createControl (Composite parent)
+    {
+      page2 = getWidgetFactory().createFlatFormComposite(parent);
+      appInfoText = getWidgetFactory().createText(page2, "", SWT.V_SCROLL | SWT.H_SCROLL);
+      appInfoText.addListener(SWT.Modify, AnnotationSection.this);
+      
+      FormData data = new FormData();
+      data.left = new FormAttachment(0, 0);
+      data.right = new FormAttachment(100, 0);
+      //data.top = new FormAttachment(documentationText, +ITabbedPropertyConstants.HSPACE);
+      data.top = new FormAttachment(0, 0);
+      data.bottom = new FormAttachment(100, 0);
+      appInfoText.setLayoutData(data);
+
+      return page2;
+    }
+    
+    public void doHandleEvent(XSDAnnotation xsdAnnotation)
+    {
+      if (xsdAnnotation != null)
+      {
+        Element element = xsdAnnotation.getElement();
+        List appInfoList = xsdAnnotation.getApplicationInformation();
+        
+        Element appInfoElement = null;
+        if (appInfoList.size() > 0)
+        {
+          appInfoElement = (Element)appInfoList.get(0);
+        }
+
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_COMMENT_CHANGE"), element);
+        if (appInfoElement == null)
+        {
+          appInfoElement = xsdAnnotation.createApplicationInformation(null);
+          element.appendChild(appInfoElement);
+          XSDDOMHelper.formatChild(appInfoElement);
+        }
+        
+        String newValue = appInfoText.getText();
+        if (appInfoElement != null)
+        {
+          try
+          {
+            if (appInfoElement.hasChildNodes())
+            {
+              // if the element is Text
+              Node node = appInfoElement.getFirstChild();
+              if (node instanceof CharacterData)
+              {
+                ((CharacterData)node).setData(newValue);
+              }
+            }
+            else
+            {
+              if (newValue.length() > 0)
+              {
+                Node childNode = appInfoElement.getOwnerDocument().createTextNode(newValue);
+                appInfoElement.appendChild(childNode);
+              }
+            }
+          }
+          catch (Exception e)
+          {
+
+          }
+          endRecording(element);          
+        }
+      }    
+    }
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AnnotationSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AnnotationSectionDescriptor.java
new file mode 100644
index 0000000..e6bf7b8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AnnotationSectionDescriptor.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDAnnotation;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFacet;
+import org.eclipse.xsd.XSDIdentityConstraintDefinition;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNotationDeclaration;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.XSDWildcard;
+import org.eclipse.xsd.XSDXPathDefinition;
+
+public class AnnotationSectionDescriptor extends AbstractSectionDescriptor
+{
+  /**
+   * 
+   */
+  public AnnotationSectionDescriptor()
+  {
+    super();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.annotation";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDAnnotation.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new AnnotationSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.documentation";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDAttributeDeclaration ||
+          object instanceof XSDAttributeGroupDefinition ||
+          object instanceof XSDElementDeclaration ||
+          object instanceof XSDNotationDeclaration ||
+          object instanceof XSDXPathDefinition ||
+          object instanceof XSDModelGroup ||
+          object instanceof XSDModelGroupDefinition ||
+          object instanceof XSDIdentityConstraintDefinition ||
+          object instanceof XSDWildcard ||
+          object instanceof XSDSchema ||
+          object instanceof XSDFacet || 
+          object instanceof XSDTypeDefinition ||
+          object instanceof XSDAnnotation ||
+          object instanceof XSDSchemaDirective)
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewContentProvider.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewContentProvider.java
new file mode 100644
index 0000000..3b64735
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewContentProvider.java
@@ -0,0 +1,289 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDAbstractAdapter;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDAdapterFactoryLabelProvider;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDModelAdapterFactoryImpl;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupContent;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.XSDWildcard;
+
+
+public class AttributesViewContentProvider implements ITreeContentProvider, ITableLabelProvider, ILabelProvider, INotifyChangedListener
+{
+  IEditorPart editorPart;
+
+  static XSDModelAdapterFactoryImpl xsdModelAdapterFactory = new XSDModelAdapterFactoryImpl(); // XSDTextEditor.getXSDModelAdapterFactory();
+  static XSDAdapterFactoryLabelProvider adapterFactoryLabelProvider = new XSDAdapterFactoryLabelProvider(xsdModelAdapterFactory);  // XSDTextEditor.getLabelProvider();
+  
+  XSDAbstractAdapter elementAdapter;
+  XSDAbstractAdapter ctAdapter;
+  XSDComplexTypeDefinition ct;
+  
+  /**
+   * 
+   */
+  public AttributesViewContentProvider()
+  {
+    super();
+//    if (xsdModelAdapterFactory instanceof IChangeNotifier)
+//    {
+//      ((IChangeNotifier)xsdModelAdapterFactory).addListener(this);
+//    }
+
+  }
+  
+  Viewer attributesViewer;
+  public AttributesViewContentProvider(IEditorPart editorPart, Viewer viewer)
+  {
+    super();
+    this.editorPart = editorPart;
+    this.attributesViewer = viewer;
+  }
+  
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object)
+   */
+  public Object[] getChildren(Object inputElement)
+  {
+    List list = new ArrayList();
+    ct = null;
+    if (inputElement instanceof XSDElementDeclaration)
+    {
+      XSDElementDeclaration xsdElement = (XSDElementDeclaration)inputElement;
+      
+      if (elementAdapter != null)
+      {
+        elementAdapter.removeListener((INotifyChangedListener)this);
+      }
+      elementAdapter = (XSDAbstractAdapter)xsdModelAdapterFactory.adapt(xsdElement, xsdModelAdapterFactory);
+      elementAdapter.addListener((INotifyChangedListener)this);
+
+      if (xsdElement.getAnonymousTypeDefinition() instanceof XSDComplexTypeDefinition)
+      {
+        ct = (XSDComplexTypeDefinition)xsdElement.getAnonymousTypeDefinition();
+      }
+      else
+      {
+        XSDTypeDefinition xsdType = xsdElement.getTypeDefinition();
+        if (xsdType instanceof XSDComplexTypeDefinition)
+        {
+          ct = (XSDComplexTypeDefinition)xsdType;
+        }
+      }
+    }
+    else if (inputElement instanceof XSDComplexTypeDefinition)
+    {
+      ct = (XSDComplexTypeDefinition)inputElement;
+    }
+
+    if (ct != null)
+    {
+      if (ctAdapter != null)
+      {
+        ctAdapter.removeListener((INotifyChangedListener)this);
+      }
+      ctAdapter = (XSDAbstractAdapter)xsdModelAdapterFactory.adapt(ct, xsdModelAdapterFactory);
+      ctAdapter.addListener((INotifyChangedListener)this);
+      
+      XSDWildcard wildcard = ct.getAttributeWildcard();
+      if (wildcard != null)
+      {
+        list.add(wildcard);
+      }
+      
+      Iterator i = ct.getAttributeContents().iterator();
+      while (i.hasNext())
+      {
+        XSDAttributeGroupContent attributeGroupContent = (XSDAttributeGroupContent)i.next();
+        if (attributeGroupContent instanceof XSDAttributeGroupDefinition)
+        {
+          XSDAttributeGroupDefinition attributeGroupDefinition = (XSDAttributeGroupDefinition)attributeGroupContent;
+          XSDAbstractAdapter a = (XSDAbstractAdapter)xsdModelAdapterFactory.adapt(attributeGroupDefinition, xsdModelAdapterFactory);
+          a.removeListener((INotifyChangedListener)this);
+ 	        a.addListener((INotifyChangedListener)this);
+ 	        list.add(attributeGroupDefinition);
+        }
+        else if (attributeGroupContent instanceof XSDAttributeUse)
+        {
+          XSDAttributeUse attributeUse = (XSDAttributeUse)attributeGroupContent;
+          
+          XSDAttributeDeclaration attribute = attributeUse.getAttributeDeclaration();
+          
+          boolean isRef = XSDDOMHelper.isAttributeRef(ct.getElement(), attribute.getQName(), attribute.getTargetNamespace());
+         
+          if (isRef)
+          {
+            XSDAbstractAdapter a = (XSDAbstractAdapter)xsdModelAdapterFactory.adapt(attributeUse, xsdModelAdapterFactory);            
+            a.removeListener((INotifyChangedListener)this);
+   	        a.addListener((INotifyChangedListener)this);
+            list.add(attributeUse);
+          }
+          else
+          {
+            XSDAbstractAdapter a = (XSDAbstractAdapter)xsdModelAdapterFactory.adapt(attribute, xsdModelAdapterFactory);            
+            a.removeListener((INotifyChangedListener)this);
+   	        a.addListener((INotifyChangedListener)this);
+            list.add(attribute);
+          }
+        }
+      }
+    }
+    return list.toArray();
+  }
+  /* (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.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+   */
+  public Image getColumnImage(Object element, int columnIndex)
+  {
+    if (element instanceof XSDConcreteComponent)
+    {
+	    return adapterFactoryLabelProvider.getImage((XSDConcreteComponent)element);
+    }
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+   */
+  public String getColumnText(Object element, int columnIndex)
+  {
+    if (element instanceof XSDConcreteComponent)
+    {
+	    XSDAbstractAdapter a = (XSDAbstractAdapter)xsdModelAdapterFactory.adapt((XSDConcreteComponent)element, xsdModelAdapterFactory);
+	    return a.getText((XSDConcreteComponent)element);
+    }
+    return ""; 
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+   */
+  public Image getImage(Object element)
+  {
+    if (element instanceof XSDConcreteComponent)
+    {
+	    return adapterFactoryLabelProvider.getImage((XSDConcreteComponent)element);
+    }
+    return null;
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+   */
+  public String getText(Object element)
+  {
+    if (element instanceof XSDConcreteComponent)
+    {
+	    XSDAbstractAdapter a = (XSDAbstractAdapter)xsdModelAdapterFactory.adapt((XSDConcreteComponent)element, xsdModelAdapterFactory);
+	    return a.getText((XSDConcreteComponent)element);
+    }
+    return ""; 
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
+   */
+  public Object[] getElements(Object inputElement)
+  {
+    return getChildren(inputElement);
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+   */
+  public void dispose()
+  {
+    if (elementAdapter != null)
+    {
+      elementAdapter.removeListener(this);
+    }
+    if (ctAdapter != null)
+    {
+      ctAdapter.removeListener((INotifyChangedListener)this);
+    }
+  }
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.IContentProvider#inputChanged(org.eclipse.jface.viewers.Viewer, java.lang.Object, java.lang.Object)
+   */
+  Viewer viewer;
+  public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
+  {
+//    System.out.println("input changed " + oldInput + "\n" + newInput);
+    this.viewer = viewer;
+  }
+  /* (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)
+  {
+  }
+
+  public void notifyChanged(Notification notification)
+  {
+    if (attributesViewer != null && !attributesViewer.getControl().isDisposed())
+    {
+      if (attributesViewer instanceof StructuredViewer)
+      {
+        attributesViewer.refresh();
+      }
+    }
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewSection.java
new file mode 100644
index 0000000..8b79242
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewSection.java
@@ -0,0 +1,460 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuManager;
+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.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.XSDMenuListener;
+import org.eclipse.wst.xsd.ui.internal.actions.AddAttributeAction;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateAttributeAndRequired;
+import org.eclipse.wst.xsd.ui.internal.actions.DOMAttribute;
+import org.eclipse.wst.xsd.ui.internal.actions.DeleteAction;
+import org.eclipse.wst.xsd.ui.internal.properties.XSDPropertySourceProvider;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDFactory;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class AttributesViewSection extends AbstractSection implements ISelectionChangedListener
+{
+  AttributeTableTreeViewer viewer;
+  AttributesPropertySheetPage propertySheetPage;
+
+  /**
+   * 
+   */
+  public AttributesViewSection()
+  {
+    super();
+  }
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent,	TabbedPropertySheetWidgetFactory factory) {
+		super.createControls(parent, factory);
+		
+		composite =	getWidgetFactory().createFlatFormComposite(parent);
+    SashForm sashForm = new SashForm(composite, SWT.HORIZONTAL);
+
+    FormData data = new FormData();
+    data.top = new FormAttachment(0, 0);
+    data.left = new FormAttachment(0, 0);
+    data.right = new FormAttachment(100, 0);
+    data.bottom = new FormAttachment(100, 0);
+    sashForm.setLayoutData(data);
+    
+    viewer = new AttributeTableTreeViewer(sashForm);
+    propertySheetPage = new AttributesPropertySheetPage();
+    propertySheetPage.createControl(sashForm);
+
+		AttributesViewContentProvider provider = new AttributesViewContentProvider(getActiveEditor(), viewer); 
+		viewer.setContentProvider(provider);
+
+		viewer.setLabelProvider(provider);
+		viewer.addSelectionChangedListener(this);
+
+    propertySheetPage.setPropertySourceProvider(new XSDPropertySourceProvider());
+	}
+
+  public void setInput(IWorkbenchPart part, ISelection selection)
+  {
+    super.setInput(part, selection);
+    if (input instanceof XSDElementDeclaration)
+    {
+      XSDElementDeclaration elementDeclaration = (XSDElementDeclaration)input;
+      if (elementDeclaration.isElementDeclarationReference())
+      {
+        input = elementDeclaration.getResolvedElementDeclaration();
+        
+        isReadOnly = (!(elementDeclaration.getResolvedElementDeclaration().getRootContainer() == xsdSchema));
+      }
+    }
+  }
+  
+	public void selectionChanged(SelectionChangedEvent event)
+	{
+	  propertySheetPage.selectionChanged(part, event.getSelection());
+	}
+	
+	public void selectionChanged(IWorkbenchPart part, ISelection selection)
+	{
+	}
+
+  public void aboutToBeShown()
+  {
+		refresh();
+  }
+	
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+    if (isReadOnly)
+    {
+      composite.setEnabled(false);
+    }
+    else
+    {
+      composite.setEnabled(true);
+    }
+    setListenerEnabled(false);
+	  if (viewer != null)
+	  {
+      viewer.setInput(getInput());
+      viewer.refresh();
+	  }
+    setListenerEnabled(true);
+	}
+	
+  public void dispose()
+  {
+//    if (propertySheetPage != null)
+//    {
+//      propertySheetPage.dispose();
+//      propertySheetPage = null;
+//    }
+//    if (viewer != null)
+//    {
+//      viewer = null;
+//    }
+  }
+
+  public boolean shouldUseExtraSpace()
+  {
+    return true;
+  }
+
+	
+	class AttributeTableTreeViewer extends TreeViewer // ExtendedTableTreeViewer
+	{
+	  public AttributeTableTreeViewer(Composite c)
+	  {
+	    super(c);
+	    
+	    MenuManager menuManager = new MenuManager("#popup");//$NON-NLS-1$
+	    menuManager.setRemoveAllWhenShown(true);
+	    Menu menu = menuManager.createContextMenu(getTree());
+	    getTree().setMenu(menu);
+
+	    XSDAttributeMenuListener menuListener = new XSDAttributeMenuListener(this);
+	    menuManager.addMenuListener(menuListener);
+
+	  }
+	  
+	  public class XSDAttributeMenuListener extends XSDMenuListener
+	  {
+	    public XSDAttributeMenuListener(TreeViewer viewer)
+	    {
+	      super(viewer);
+        selectionProvider = viewer;
+       
+	      deleteAction = new DeleteAction(XSDEditorPlugin.getXSDString("_UI_ACTION_DELETE"), AttributesViewSection.this.getActiveEditor(), getXSDSchema());
+        deleteAction.setSelectionProvider(selectionProvider);
+        selectionProvider.addSelectionChangedListener(deleteAction);
+	    }
+	    
+	    protected XSDSchema getXSDSchema()
+	    {
+        return xsdSchema;
+//        return getSchema();
+//	      XSDConcreteComponent xsdInput = (XSDConcreteComponent)AttributesViewSection.this.getInput();
+//	      return xsdInput.getSchema();
+	    }
+	    
+	    protected Object getSelectedElement()
+	    {
+        XSDComponent xsdInput = (XSDComponent)AttributesViewSection.this.getInput();
+        
+        if (xsdInput instanceof XSDElementDeclaration)
+        {
+          XSDElementDeclaration xsdElement = (XSDElementDeclaration)xsdInput;
+          XSDTypeDefinition xsdType = xsdElement.getType();
+          if (xsdType instanceof XSDComplexTypeDefinition)
+          {
+            XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)xsdType;
+            return ct;
+          }
+          return xsdElement;
+        }
+        else if (xsdInput instanceof XSDComplexTypeDefinition)
+        {
+          return xsdInput;
+        }
+
+        return null;
+	    }
+      
+      public void menuAboutToShow(IMenuManager manager)
+      {
+        updateXSDSchema();
+        if (xsdSchema == null)
+        {
+          return;
+        }
+
+        Object selectedElementObj = getSelectedElement();
+        
+        Element selectedElement = null;
+
+        if (selectedElementObj instanceof XSDComplexTypeDefinition)
+        {
+          selectedElement = ((XSDComplexTypeDefinition)selectedElementObj).getElement();
+        }
+        
+        addContextItems(manager, selectedElement, null);
+
+        if (!selectionProvider.getSelection().isEmpty())
+        {
+          // Add context menu items for selected element
+//          addContextItems(manager, selectedElement, null);
+          
+          manager.add(new Separator());
+          if (deleteAction != null)
+          {
+            deleteAction.setXSDSchema(getXSDSchema());
+            manager.add(deleteAction);
+          }
+        }
+      }
+	    
+	    protected void addContextItems(IMenuManager manager, Element parent, Node relativeNode)
+	    {
+	      ArrayList attributes = null;
+	      if (XSDDOMHelper.inputEquals(parent, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+	      { //
+	        boolean annotationExists = false;
+	        boolean contentExists = false;
+	        boolean complexOrSimpleContentExists = false;
+	        boolean anyAttributeExists = false;
+	        Node annotationNode = null;
+	        Element contentNode = null;
+	        Node anyAttributeNode = null;
+	        NodeList children = parent.getChildNodes();
+	        
+	        for (int i=0; i < children.getLength(); i++)
+	        {
+	          Node child = children.item(i);
+	          if (child != null && child instanceof Element)
+	          {
+	            if (XSDDOMHelper.inputEquals((Element)child, XSDConstants.ANNOTATION_ELEMENT_TAG, false))
+	            {
+	              annotationNode = child;
+	              annotationExists = true;
+	            }
+	            else if (XSDDOMHelper.inputEquals((Element)child, XSDConstants.SEQUENCE_ELEMENT_TAG, false) ||
+	                     XSDDOMHelper.inputEquals((Element)child, XSDConstants.ALL_ELEMENT_TAG, false) ||
+	                     XSDDOMHelper.inputEquals((Element)child, XSDConstants.CHOICE_ELEMENT_TAG, false) ||
+	                     XSDDOMHelper.inputEquals((Element)child, XSDConstants.GROUP_ELEMENT_TAG, true) ||
+	                     XSDDOMHelper.inputEquals((Element)child, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false) ||
+	                     XSDDOMHelper.inputEquals((Element)child, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+	            {
+	              contentExists = true;
+	              contentNode = (Element)child;
+
+	              if (XSDDOMHelper.inputEquals((Element)child, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false) ||
+	                  XSDDOMHelper.inputEquals((Element)child, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+	              {
+	                complexOrSimpleContentExists = true;
+	              }
+	            } 
+	            else if (XSDDOMHelper.inputEquals((Element)child, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false))
+	            {
+	              anyAttributeExists = true;
+	              anyAttributeNode = child;
+	            }
+	          }
+	        }
+//	        addCreateAnnotationActionIfNotExist(manager, XSDConstants.ANNOTATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANNOTATION"), attributes, parent, parent.getFirstChild());
+//	        manager.add(new Separator());
+//	        addSetBaseTypeAction(manager, parent);
+//	        if (annotationExists)
+//	        {
+//	          if (!contentExists)
+//	          {
+//	            addCreateElementAction(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, annotationNode.getNextSibling());
+//	            addCreateSimpleContentAction(manager, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_CONTENT"), attributes, parent, annotationNode.getNextSibling());
+//	            addCreateSimpleContentAction(manager, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_CONTENT"), attributes, parent, annotationNode.getNextSibling());
+//	            addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, annotationNode.getNextSibling());
+//	            attributes = null;
+//	          }
+//	        }
+//	        else
+//	        {
+//	          if (!contentExists)
+//	          {
+//	            addCreateElementAction(manager, XSDConstants.SEQUENCE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_CONTENT_MODEL"), attributes, parent, parent.getFirstChild());
+//	            addCreateSimpleContentAction(manager, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_SIMPLE_CONTENT"), attributes, parent, parent.getFirstChild());
+//	            addCreateSimpleContentAction(manager, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_COMPLEX_CONTENT"), attributes, parent, parent.getFirstChild());
+//	            addCreateElementRefAction(manager, XSDConstants.GROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ADD_GROUP_REF"), parent, parent.getFirstChild());
+//	            attributes = null;
+//	          }
+//	        }
+//
+//	        manager.add(new Separator());
+
+	        if (anyAttributeExists)
+	        {
+	          if (!complexOrSimpleContentExists)
+	          {
+	            attributes = new ArrayList();
+	            attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE,
+	                                            getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+	            attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+	            addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, anyAttributeNode);
+	            attributes = null;
+//	   ARE ATTRIBUTE GROUPS ALLOWED ?
+//	            addCreateElementAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, "_UI_ACTION_ADD_ATTRIBUTE_GROUP", attributes, parent, anyAttributeNode);
+	            addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, anyAttributeNode);
+	            addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, anyAttributeNode);
+	          }
+	        }
+	        else
+	        {
+	          if (!complexOrSimpleContentExists)
+	          {
+	            attributes = new ArrayList();
+	            attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE,
+	                                            getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+	            attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+	            addCreateElementAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+	            attributes = null;
+	            addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), parent, parent.getLastChild());
+	            addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), parent, parent.getLastChild());
+	            attributes = null;
+	            addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, parent, parent.getLastChild());
+	          }
+            else
+            {
+              // new model based add attribute action
+              XSDComplexTypeDefinition xsdCT = (XSDComplexTypeDefinition)getXSDSchema().getCorrespondingComponent(parent);
+              manager.add(new AddAttributeAction(XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"), xsdCT));
+
+              Element derivedByElement = domHelper.getDerivedByElement(contentNode);
+              if (derivedByElement != null)
+              {
+                attributes = null;
+                addCreateElementRefAction(manager, XSDConstants.ATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"), derivedByElement, derivedByElement.getLastChild());
+                addCreateElementRefAction(manager, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"), derivedByElement, derivedByElement.getLastChild());
+                attributes = null;
+                addCreateElementActionIfNotExist(manager, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"), attributes, derivedByElement, derivedByElement.getLastChild());
+              }
+            }
+	        }
+	      }
+	      else if (parent == null) {	      
+	      	XSDElementDeclaration ed = (XSDElementDeclaration)input;      
+	      	if (ed.getTypeDefinition() != null) 
+	      	{
+	      		XSDComplexTypeDefinition td = XSDFactory.eINSTANCE.createXSDComplexTypeDefinition();
+	      	}
+	      
+	      	// Add Attribute
+	      	attributes = new ArrayList();
+	      	attributes.add(new DOMAttribute(XSDConstants.NAME_ATTRIBUTE,
+                                          getNewName(parent, XSDConstants.ATTRIBUTE_ELEMENT_TAG, "Attribute", false)));
+	      	attributes.add(new DOMAttribute(XSDConstants.TYPE_ATTRIBUTE, getBuiltInStringQName()));
+	      	manager.add(new CreateAttributeAndRequired(XSDConstants.ATTRIBUTE_ELEMENT_TAG,
+					   XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE"),
+					   attributes,
+					   getXSDSchema(),
+					   selectionProvider,
+					   ed));
+	      	
+	      	// Add Attribute Reference
+	      	attributes = null;
+	      	attributes = new ArrayList();
+	        String ref = getFirstGlobalElementTagName(XSDConstants.ATTRIBUTE_ELEMENT_TAG);
+	        attributes.add(new DOMAttribute(XSDConstants.REF_ATTRIBUTE, ref));
+	      
+	        Action action = new CreateAttributeAndRequired(XSDConstants.ATTRIBUTE_ELEMENT_TAG,
+					   XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_REFERENCE"),
+					   attributes,
+					   getXSDSchema(),
+					   selectionProvider,
+					   ed);
+	        manager.add(action);
+	        action.setEnabled(ref != null);
+
+	        // Add Attribute Group Reference
+	        attributes = null;
+	      	attributes = new ArrayList();
+	        ref = getFirstGlobalElementTagName(XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG);
+	        attributes.add(new DOMAttribute(XSDConstants.REF_ATTRIBUTE, ref));
+	        
+	        action = new CreateAttributeAndRequired(XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG,
+					   XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ATTRIBUTE_GROUP_REF"),
+					   attributes,
+					   getXSDSchema(),
+					   selectionProvider,
+					   ed);
+
+	      	manager.add(action);
+	      	action.setEnabled(ref != null);
+	      	
+	      	// Add Any Attribute
+	      	attributes = null;
+	      	if (getFirstChildNodeIfExists(parent, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false) == null)
+	        {
+	      		action = new CreateAttributeAndRequired(XSDConstants.ANYATTRIBUTE_ELEMENT_TAG,
+						   XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ANY_ATTRIBUTE"),
+						   attributes,
+						   getXSDSchema(),
+						   selectionProvider,
+						   ed);
+	      		manager.add(action);
+	         }
+	      }
+	    }
+	  }
+	}
+	
+	class AttributesPropertySheetPage extends PropertySheetPage implements INotifyChangedListener
+	{
+	  public AttributesPropertySheetPage()
+	  {
+	    super();
+	  }
+	  
+	  public void notifyChanged(Notification notification)
+	  {
+	    System.out.println("Notification");
+	  }
+	}
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewSectionDescriptor.java
new file mode 100644
index 0000000..51f233c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/AttributesViewSectionDescriptor.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+
+public class AttributesViewSectionDescriptor extends AbstractSectionDescriptor
+{
+  /**
+   * 
+   */
+  public AttributesViewSectionDescriptor()
+  {
+    super();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.attributes";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDElementDeclaration.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new AttributesViewSection();
+  }
+
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDElementDeclaration)
+      {
+// Remove this to fix bug 3870 Element references should have the same properties as elements 
+//        XSDElementDeclaration elementDeclaration = (XSDElementDeclaration)object;
+//        if (elementDeclaration.isElementDeclarationReference())
+//        {
+//          return false;
+//        }
+        return true;
+      }
+      else if (object instanceof XSDComplexTypeDefinition)
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.attributes";
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getAfterSection()
+   */
+  public String getAfterSection()
+  {
+    return "";
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ComplexTypeSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ComplexTypeSection.java
new file mode 100644
index 0000000..4de57c5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ComplexTypeSection.java
@@ -0,0 +1,222 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.actions.SetBaseTypeAction;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class ComplexTypeSection extends AbstractSection
+{
+  private String DERIVED_BY_ID = "derived by"; // XSDEditorPlugin.getXSDString("_UI_LABEL_DERIVED_BY"); //$NON-NLS-1$ 
+  private String BASE_TYPE_ID = "base type"; //  XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE"); //$NON-NLS-1$
+  private String derivedByChoicesComboValues[] =
+  {
+        "",
+        XSDConstants.RESTRICTION_ELEMENT_TAG,
+        XSDConstants.EXTENSION_ELEMENT_TAG
+  };
+
+  /**
+   * 
+   */
+  public ComplexTypeSection()
+  {
+    super();
+  }
+
+	Text baseTypeCombo;
+	CCombo derivedByCombo;
+	Button button;
+
+	/**
+	 * A helper to listen for events that indicate that a text
+	 * field has been changed.
+	 */
+	private TextChangeHelper listener = new TextChangeHelper()
+	{
+		public void textChanged(Control control)
+		{
+			Object input = getInput();
+			refresh();
+		}
+	};
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		composite =	getWidgetFactory().createFlatFormComposite(parent);
+		FormData data;
+
+		baseTypeCombo = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
+		CLabel baseTypeLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE_WITH_COLON")); //$NON-NLS-1$ 
+
+    button = getWidgetFactory().createButton(composite, "", SWT.PUSH);
+    button.setImage(XSDEditorPlugin.getXSDImage("icons/browsebutton.gif")); //$NON-NLS-1$
+    baseTypeCombo.setEditable(false);
+    baseTypeCombo.addListener(SWT.Modify, this);
+
+		data = new FormData();
+		data.left = new FormAttachment(0, 100);
+    data.right = new FormAttachment(button, 0);
+		baseTypeCombo.setLayoutData(data);
+
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(baseTypeCombo, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(button, 0, SWT.CENTER);
+		baseTypeLabel.setLayoutData(data);
+
+    button.addSelectionListener(this);
+		data = new FormData();
+    data.left = new FormAttachment(100, -rightMarginSpace + 2);
+		data.right = new FormAttachment(100,0);
+    data.top = new FormAttachment(baseTypeCombo, 0, SWT.CENTER);
+		button.setLayoutData(data);
+		
+		derivedByCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT);
+		data = new FormData();
+		data.left = new FormAttachment(0, 100);
+		data.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(baseTypeCombo, +ITabbedPropertyConstants.VSPACE);
+		derivedByCombo.setLayoutData(data);
+		derivedByCombo.setItems(derivedByChoicesComboValues);
+		derivedByCombo.addSelectionListener(this);
+
+		CLabel derivedByLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_DERIVED_BY")); //$NON-NLS-1$
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(derivedByCombo, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(derivedByCombo, 0, SWT.CENTER);
+		derivedByLabel.setLayoutData(data);
+	}
+
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+	  setListenerEnabled(false);
+    
+    if (isReadOnly)
+    {
+      composite.setEnabled(false);
+    }
+    else
+    {
+      composite.setEnabled(true);
+    }
+
+	  Object input = getInput();
+	  baseTypeCombo.setText(""); //$NON-NLS-1$
+	  
+    if (input instanceof XSDComplexTypeDefinition)
+    {
+      XSDComplexTypeDefinition complexType = (XSDComplexTypeDefinition)input;
+      Element element = complexType.getElement();
+      Element contentModelElement = getDomHelper().getContentModelFromParent(element);    
+      String baseType = getDomHelper().getBaseType(contentModelElement);
+    
+      derivedByCombo.setText(getDomHelper().getDerivedByName(contentModelElement));
+
+      if (baseType != null)
+      {
+        baseTypeCombo.setText(baseType);
+      }
+    }	  
+	  
+	  setListenerEnabled(true);
+	}
+	
+  /**
+   * @see org.eclipse.swt.events.SelectionListener#widgetSelected(SelectionEvent)
+   */
+  public void widgetSelected(SelectionEvent e)
+  {
+    XSDComplexTypeDefinition xsdComplexType = (XSDComplexTypeDefinition)getInput();
+    Element ctElement = xsdComplexType.getElement();
+    if (e.widget == button)
+    {
+	    Shell shell = Display.getCurrent().getActiveShell();
+	    Element element = null;
+	    if (xsdComplexType.getContent() != null)
+	    {
+  	    element = ((XSDComplexTypeDefinition)getInput()).getContent().getElement();
+	    }
+	    
+	    SimpleContentBaseTypeOptionsDialog dialog = new SimpleContentBaseTypeOptionsDialog(shell, element, BASE_TYPE_ID, ((XSDConcreteComponent)getInput()).getSchema());
+
+	    dialog.setBlockOnOpen(true);
+	    dialog.create();
+	    
+	    int result = dialog.open();
+   
+	    if (result == Window.OK)
+	    {
+	      String typeString = dialog.getType();
+	     
+        String derivedBy = getDomHelper().getDerivedByName(element);
+        SetBaseTypeAction setBaseTypeAction = new SetBaseTypeAction(XSDEditorPlugin.getXSDString("_UI_LABEL_SET_BASE_TYPE")); //$NON-NLS-1$
+        setBaseTypeAction.setXSDSchema(xsdSchema);
+        setBaseTypeAction.setComplexTypeElement(ctElement);
+        setBaseTypeAction.setType(typeString);
+        setBaseTypeAction.setDerivedBy(derivedBy);
+        setBaseTypeAction.performAction();
+	      
+	    }
+
+      refresh();
+    }
+    else if (e.widget == derivedByCombo)
+    {
+      Element contentModelElement = getDomHelper().getContentModelFromParent(ctElement);
+      String baseType = getDomHelper().getBaseType(contentModelElement);
+      beginRecording(XSDEditorPlugin.getXSDString("_UI_DERIVEDBY_CHANGE"), ctElement); //$NON-NLS-1$
+      Element derivedByElem = getDomHelper().getDerivedByElement(ctElement);
+      if (contentModelElement != null)
+      {
+        getDomHelper().changeDerivedByType(contentModelElement, derivedByCombo.getText(), baseType);
+      }
+      endRecording(ctElement);
+    }
+  }
+
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#shouldUseExtraSpace()
+   */
+  public boolean shouldUseExtraSpace()
+  {
+    return false;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ComplexTypeSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ComplexTypeSectionDescriptor.java
new file mode 100644
index 0000000..c71d770
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ComplexTypeSectionDescriptor.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+
+public class ComplexTypeSectionDescriptor extends AbstractSectionDescriptor
+{
+  /**
+   * 
+   */
+  public ComplexTypeSectionDescriptor()
+  {
+    super();
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDComplexTypeDefinition.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new ComplexTypeSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.general";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDComplexTypeDefinition)
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+  
+  public String getAfterSection()
+  {
+    return "com.ibm.xsdeditor.section.name";
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/EnumerationsSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/EnumerationsSection.java
new file mode 100644
index 0000000..d2dd2db
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/EnumerationsSection.java
@@ -0,0 +1,434 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.common.ui.viewers.NavigableTableViewer;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.actions.AddEnumsAction;
+import org.eclipse.wst.xsd.ui.internal.actions.DOMAttribute;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDEnumerationFacet;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDVariety;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class EnumerationsSection extends AbstractSection
+{
+  private EnumerationsTableViewer enumerationsTable;
+  private Button addButton;
+  private Button addManyButton;
+  private Button deleteButton;
+  
+  /**
+   * 
+   */
+  public EnumerationsSection()
+  {
+    super();
+  }
+  
+  public void widgetSelected(SelectionEvent e)
+  {
+    XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)getInput();
+    Element element = st.getElement();
+    if (e.widget == addButton || e.widget == addManyButton)
+    {
+      XSDDOMHelper helper = new XSDDOMHelper();
+      
+      int variety = st.getVariety().getValue();
+      Node varietyElement = null;
+      if (variety == XSDVariety.ATOMIC)
+      {
+        varietyElement = helper.getChildNode(element, XSDConstants.RESTRICTION_ELEMENT_TAG);
+      }
+      else if (variety == XSDVariety.UNION)
+      {
+        varietyElement = helper.getChildNode(element, XSDConstants.UNION_ELEMENT_TAG);
+      }
+      else if (variety == XSDVariety.LIST)
+      {
+        varietyElement = helper.getChildNode(element, XSDConstants.LIST_ELEMENT_TAG);
+      }
+            
+      if (varietyElement != null)
+      {
+        if (e.widget == addButton)
+        {
+          java.util.List attributes = new ArrayList();
+          
+          List enumList = st.getEnumerationFacets();
+          StringBuffer newName = new StringBuffer("value1"); //$NON-NLS-1$
+          int suffix = 1;
+          for (Iterator i = enumList.iterator(); i.hasNext(); )
+          {
+            XSDEnumerationFacet enumFacet = (XSDEnumerationFacet)i.next();
+            String value = enumFacet.getLexicalValue();
+            if (value != null)
+            {
+              if (value.equals(newName.toString()))
+              {
+                suffix++;
+                newName = new StringBuffer("value" + String.valueOf(suffix)); //$NON-NLS-1$
+              }
+            }
+          }
+          attributes.add(new DOMAttribute(XSDConstants.VALUE_ATTRIBUTE, newName.toString()));
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ENUM"), element); //$NON-NLS-1$
+          Action action = getNewElementAction(XSDConstants.ENUMERATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ENUM"), attributes, (Element)varietyElement, null);
+          action.run();
+          st.setElement(element);
+
+          endRecording(element);
+          enumerationsTable.refresh();
+          int newItemIndex = enumerationsTable.getTable().getItemCount() - 1;
+          enumerationsTable.editElement(enumerationsTable.getElementAt(newItemIndex), 0);
+          attributes = null;
+        }
+        else if (e.widget == addManyButton)
+        {
+          AddEnumsAction action = new AddEnumsAction(XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ENUMS")); //$NON-NLS-1$
+          action.setElementTag(XSDConstants.ENUMERATION_ELEMENT_TAG);
+          action.setAttributes(null);
+          action.setParentNode((Element)varietyElement);
+          action.setRelativeNode(null);
+          action.setDescription(XSDEditorPlugin.getXSDString("_UI_ENUMERATIONS_DIALOG_TITLE")); //$NON-NLS-1$
+          action.run();
+          st.setElement(element);
+          enumerationsTable.refresh();
+        }
+      }
+    }
+    else if (e.widget == deleteButton)
+    {
+      StructuredSelection selection = (StructuredSelection)enumerationsTable.getSelection();
+      if (selection != null)
+      {
+        Iterator i = selection.iterator();
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ACTION_DELETE_ENUMERATION"), element); //$NON-NLS-1$
+        while (i.hasNext())
+        {
+          Object obj = i.next();
+          if (obj != null)
+          {
+            if (obj instanceof XSDEnumerationFacet)
+            {
+              XSDEnumerationFacet enumFacet = (XSDEnumerationFacet)obj;
+    
+              // I have to update using DOM
+              XSDDOMHelper.removeNodeAndWhitespace(enumFacet.getElement());            
+              
+            }
+          }
+        }
+        enumerationsTable.refresh();
+        st.setElement(element);
+        endRecording(element);
+      }
+    }
+    else if (e.widget == enumerationsTable.getTable())
+    {
+      StructuredSelection selection = (StructuredSelection)enumerationsTable.getSelection();
+      if (selection.getFirstElement() != null)
+      {
+        deleteButton.setEnabled(true);
+      }
+      else
+      {
+        deleteButton.setEnabled(false);
+      }
+    }
+
+  }
+
+  public void widgetDefaultSelected(SelectionEvent e)
+  {
+    
+  }
+  
+  /**
+   * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+   */
+  public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+  {
+    super.createControls(parent, factory);
+
+    composite = getWidgetFactory().createFlatFormComposite(parent);
+    FormData data;
+    
+    GC gc = new GC(parent);
+    Point extent = gc.textExtent("  " + XSDEditorPlugin.getXSDString("_UI_ACTION_DELETE_INCLUDE") + "  "); //$NON-NLS-1$
+    gc.dispose();
+
+    enumerationsTable = new EnumerationsTableViewer(getWidgetFactory().createTable(composite, SWT.MULTI | SWT.FULL_SELECTION));
+    enumerationsTable.setInput(getInput());
+    Table table = enumerationsTable.getTable();
+    table.addSelectionListener(this);
+    
+    addButton = getWidgetFactory().createButton(composite, XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_ADD_BUTTON_LABEL"), SWT.PUSH); //$NON-NLS-1$
+    addManyButton = getWidgetFactory().createButton(composite, XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_ADD_BUTTON_LABEL") + "...", SWT.PUSH); //$NON-NLS-1$
+    deleteButton = getWidgetFactory().createButton(composite, XSDEditorPlugin.getXSDString("_UI_ACTION_DELETE_INCLUDE"), SWT.PUSH); //$NON-NLS-1$
+
+    FormData data2 = new FormData();
+    data2.top = new FormAttachment(0, 0);
+    data2.left = new FormAttachment(100, -100);
+    data2.right = new FormAttachment(100, 0);
+//    data2.width = 50;
+    addButton.setLayoutData(data2);
+    addButton.addSelectionListener(this);
+
+    data = new FormData();
+    data.left = new FormAttachment(addButton, 0, SWT.LEFT);
+    data.right = new FormAttachment(100, 0);
+    data.top = new FormAttachment(addButton, 0);
+    addManyButton.setLayoutData(data);
+    addManyButton.addSelectionListener(this);
+
+    data = new FormData();
+    data.left = new FormAttachment(addButton, 0, SWT.LEFT);
+    data.right = new FormAttachment(100, 0);
+    data.top = new FormAttachment(addManyButton, 0);
+    deleteButton.setLayoutData(data);
+    deleteButton.setEnabled(false);
+    deleteButton.addSelectionListener(this);
+
+    data = new FormData();
+    data.top = new FormAttachment(0, 0);
+    data.left = new FormAttachment(0, 0);
+    data.right = new FormAttachment(addButton, 0);
+    data.bottom = new FormAttachment(100, 0);
+    data.width = tableMinimumWidth;
+    table.setLayoutData(data);
+    table.addListener(SWT.Resize, this);
+  }
+  
+  /*
+   * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+   */
+  public void refresh()
+  {
+    Object input = getInput();
+    if (isReadOnly)
+    {
+      composite.setEnabled(false);
+    }
+    else
+    {
+      composite.setEnabled(true);
+    }
+    XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)input;
+    Element element = st.getElement();
+    XSDDOMHelper helper = new XSDDOMHelper();
+    Node restrictionElement = helper.getChildNode(element, XSDConstants.RESTRICTION_ELEMENT_TAG);
+    
+    Iterator validFacets = st.getValidFacets().iterator();
+    
+    boolean isApplicable = false;
+    while (validFacets.hasNext())
+    {
+      String aValidFacet = (String)validFacets.next();
+      if (aValidFacet.equals(XSDConstants.ENUMERATION_ELEMENT_TAG))
+      {
+        isApplicable = true;
+      }
+    }
+    
+    if (isApplicable)  
+//    if (restrictionElement != null)
+    {
+      addButton.setEnabled(true);
+      addManyButton.setEnabled(true);
+    }
+    else
+    {
+      addButton.setEnabled(false);
+      addManyButton.setEnabled(false);
+    }
+    enumerationsTable.setInput(input);
+  }
+
+  public void handleEvent(Event event)
+  {
+    Table table = enumerationsTable.getTable();
+    if (event.type == SWT.Resize && event.widget == table)
+    {
+      TableColumn tableColumn = table.getColumn(0);
+      tableColumn.setWidth(table.getSize().x);
+    }
+  }
+  
+  public void dispose()
+  {
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#shouldUseExtraSpace()
+   */
+  public boolean shouldUseExtraSpace()
+  {
+    return true;
+  }
+
+  
+  class EnumerationsTableViewer extends NavigableTableViewer implements ICellModifier
+  {
+    protected String[] columnProperties = {XSDConstants.ENUMERATION_ELEMENT_TAG};
+
+    protected CellEditor[] cellEditors;
+
+    Table table;
+    
+    public EnumerationsTableViewer(Table table)
+    {
+      super(table);
+      table = getTable();
+
+      table.setLinesVisible(true);
+      
+      setContentProvider(new EnumerationsTableContentProvider());
+      setLabelProvider(new EnumerationsTableLabelProvider());
+      setColumnProperties(columnProperties);
+
+      setCellModifier(this);
+
+      TableColumn column = new TableColumn(table, SWT.NONE, 0);
+      column.setText(columnProperties[0]);
+      column.setAlignment(SWT.LEFT);
+      column.setResizable(true);
+ 
+      cellEditors = new CellEditor[1];
+
+      TableLayout layout = new TableLayout();
+      ColumnWeightData data = new ColumnWeightData(100);
+
+      layout.addColumnData(data);
+      cellEditors[0] = new TextCellEditor(table);
+
+      getTable().setLayout(layout);
+      setCellEditors(cellEditors);
+    }
+    
+    public boolean canModify(Object element, String property)
+    {
+      return true;
+    }
+
+    public void modify(Object element, String property, Object value)
+    {
+      if (element instanceof TableItem && (value != null))
+      {
+        TableItem item = (TableItem)element;
+        
+        Element simpleTypeElement = ((XSDSimpleTypeDefinition)getInput()).getElement();
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ENUM_VALUE_CHANGE"), simpleTypeElement); //$NON-NLS-1$
+        
+        XSDEnumerationFacet enumFacet = (XSDEnumerationFacet)item.getData();
+        enumFacet.setLexicalValue((String)value);
+        item.setData(enumFacet);
+        item.setText((String)value);
+        endRecording(simpleTypeElement);
+      }
+    }    
+
+    public Object getValue(Object element, String property)
+    {
+      if (element instanceof XSDEnumerationFacet)
+      {
+        XSDEnumerationFacet enumFacet = (XSDEnumerationFacet)element;
+        String value = enumFacet.getLexicalValue();
+        if (value == null) value = ""; //$NON-NLS-1$
+        return value;
+      }
+      return ""; //$NON-NLS-1$
+    }
+
+  }
+    
+  class EnumerationsTableContentProvider implements IStructuredContentProvider
+  {
+    public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
+    {
+    }
+
+    public java.lang.Object[] getElements(java.lang.Object inputElement)
+    {
+      java.util.List list = new ArrayList();
+      if (inputElement instanceof XSDSimpleTypeDefinition)
+      {
+        XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)inputElement;
+        return st.getEnumerationFacets().toArray();
+      }
+      return list.toArray();
+    }
+
+    public void dispose()
+    {
+    }
+  }
+
+  class EnumerationsTableLabelProvider extends LabelProvider implements ITableLabelProvider
+  {
+    public EnumerationsTableLabelProvider()
+    {
+      
+    }
+    
+    public Image getColumnImage(Object element, int columnIndex)
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDSimpleEnum.gif");
+    }
+    
+    public String getColumnText(Object element, int columnIndex)
+    {
+      if (element instanceof XSDEnumerationFacet)
+      {
+        XSDEnumerationFacet enumFacet = (XSDEnumerationFacet)element;
+        String value = enumFacet.getLexicalValue();
+        if (value == null) value = "";
+        return value;
+      }
+      return "";
+    }
+
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/EnumerationsSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/EnumerationsSectionDescriptor.java
new file mode 100644
index 0000000..2f8aa67
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/EnumerationsSectionDescriptor.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+
+
+public class EnumerationsSectionDescriptor extends AbstractSectionDescriptor
+{
+
+  /**
+   * 
+   */
+  public EnumerationsSectionDescriptor()
+  {
+    super();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.enumerations";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDSimpleTypeDefinition.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new EnumerationsSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.enumerations";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDSimpleTypeDefinition)
+      {
+        return true;
+        // return false;  // turn off this tab
+      }
+    }
+    return false;
+  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetViewer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetViewer.java
new file mode 100644
index 0000000..0ec654e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetViewer.java
@@ -0,0 +1,498 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseTrackAdapter;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.wst.common.ui.WindowUtility;
+import org.eclipse.wst.common.ui.viewers.NavigableTableViewer;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.actions.DOMAttribute;
+import org.eclipse.wst.xsd.ui.internal.properties.XSDComboBoxPropertyDescriptor;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDConstrainingFacet;
+import org.eclipse.xsd.XSDMaxExclusiveFacet;
+import org.eclipse.xsd.XSDMaxFacet;
+import org.eclipse.xsd.XSDMaxInclusiveFacet;
+import org.eclipse.xsd.XSDMinExclusiveFacet;
+import org.eclipse.xsd.XSDMinFacet;
+import org.eclipse.xsd.XSDMinInclusiveFacet;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.impl.XSDFactoryImpl;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class FacetViewer extends NavigableTableViewer implements ICellModifier
+{
+  public static final String FACET_NAME = XSDEditorPlugin.getXSDString("_UI_FACET_NAME");  // "Name";
+  public static final String FACET_VALUE = XSDEditorPlugin.getXSDString("_UI_FACET_VALUE"); // "Value";
+  public static final String FACET_OTHER = XSDEditorPlugin.getXSDString("_UI_FACET_FIXED"); // "Fixed";
+
+  protected FacetsTableLabelProvider facetsTableLabelProvider = new FacetsTableLabelProvider();
+  protected FacetsTableContentProvider facetsTableContentProvider = new FacetsTableContentProvider();
+  protected String[] columnProperties = {FACET_NAME, FACET_VALUE, FACET_OTHER};
+  protected CellEditor[] cellEditors;    // these cellEditors are used when non-whitespace facet is selected
+  protected CellEditor[] altCellEditors; // these cellEditors are used when whitespace facet is selected
+  
+  protected String [] whiteSpaceValues = new String[] {"", "preserve", "replace", "collapse" };
+  protected String [] trueFalseValues = new String [] {"", "false", "true" }; 
+  protected FacetsSection facetsSection;
+  /**
+   * @param parent
+   */
+  public FacetViewer(Composite parent, FacetsSection facetsSection)
+  {
+    super(new Table(parent, SWT.FULL_SELECTION | SWT.SINGLE));
+    this.facetsSection = facetsSection;
+    
+    getTable().setLinesVisible(true);
+    getTable().setHeaderVisible(true);
+
+    addSelectionChangedListener(new SelectionChangedListener());
+    getTable().addMouseTrackListener(new MyMouseTrackListener());
+    
+    setContentProvider(facetsTableContentProvider);
+    setLabelProvider(facetsTableLabelProvider);
+    setColumnProperties(columnProperties);
+
+    setCellModifier(this);
+
+    for (int i = 0; i < 3; i++)
+    {
+      TableColumn column = new TableColumn(getTable(), SWT.NONE, i);
+      column.setText(columnProperties[i]);
+      column.setAlignment(SWT.LEFT);
+      column.setResizable(true);
+    }
+    
+    cellEditors = new CellEditor[3];
+    altCellEditors = new CellEditor[3];
+
+    TableLayout layout = new TableLayout();
+    ColumnWeightData data = new ColumnWeightData(60, 120, true);
+    layout.addColumnData(data);
+    cellEditors[0] = null;
+
+    ColumnWeightData data2 = new ColumnWeightData(120, 100, true);
+    layout.addColumnData(data2);
+
+    cellEditors[1] = new TextCellEditor(getTable());
+    XSDComboBoxPropertyDescriptor pd = new XSDComboBoxPropertyDescriptor("combo", "whitespace", whiteSpaceValues);
+    altCellEditors[1] = pd.createPropertyEditor(getTable());
+
+    ColumnWeightData data3 = new ColumnWeightData(60, 80, true);
+    layout.addColumnData(data3);
+
+    XSDComboBoxPropertyDescriptor pd2 = new XSDComboBoxPropertyDescriptor("combo", "other", trueFalseValues);
+    cellEditors[2] = pd2.createPropertyEditor(getTable());
+    altCellEditors[2] = pd2.createPropertyEditor(getTable());
+
+    getTable().setLayout(layout);
+    setCellEditors(cellEditors);
+
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ICellModifier#canModify(java.lang.Object, java.lang.String)
+   */
+  public boolean canModify(Object element, String property)
+  {
+    return property.equals(FACET_VALUE) || property.equals(FACET_OTHER);
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ICellModifier#getValue(java.lang.Object, java.lang.String)
+   */
+  public Object getValue(Object element, String property)
+  {
+    int column = 0;
+    if (property.equals(columnProperties[0]))
+    {
+      column = 0;
+    }
+    else if (property.equals(columnProperties[1]))
+    {
+      column = 1;
+    }
+    else if (property.equals(columnProperties[2]))
+    {
+      column = 2;
+    }
+
+    return facetsTableLabelProvider.getColumnText(element, column);
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ICellModifier#modify(java.lang.Object, java.lang.String, java.lang.Object)
+   */
+  public void modify(Object element, String property, Object value)
+  {
+    XSDSimpleTypeDefinition xsdSimpleType = (XSDSimpleTypeDefinition)getInput();
+    TableItem item = (TableItem)element;
+    if (item != null)
+    {
+      Object o = item.getData();
+      if (o != null)
+      {
+        if (o instanceof String)
+        {
+          String facet = (String)o;
+         
+          Element simpleTypeElement = xsdSimpleType.getElement();
+          XSDDOMHelper xsdDOMHelper = new XSDDOMHelper();
+          Element derivedByElement = xsdDOMHelper.getDerivedByElement(simpleTypeElement);
+
+          facetsSection.beginRecording(XSDEditorPlugin.getXSDString("_UI_FACET_CHANGE"), simpleTypeElement);
+
+          String prefix = simpleTypeElement.getPrefix();
+          prefix = (prefix == null) ? "" : (prefix + ":");
+          
+          Element childNodeElement = null;
+          DOMAttribute valueAttr = null;
+
+          XSDConstrainingFacet targetFacet = getXSDConstrainingFacet(facet);
+
+          String newValue = "";
+          if (value != null && value instanceof String)
+          {
+            newValue = (String)value;
+          }
+          
+          if (property.equals(columnProperties[1]))
+          {
+            if (targetFacet == null && newValue.length() > 0)
+            {
+              targetFacet = createFacet(facet);
+              childNodeElement = (derivedByElement.getOwnerDocument()).createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + facet);
+              valueAttr = new DOMAttribute(XSDConstants.VALUE_ATTRIBUTE, newValue);
+              childNodeElement.setAttribute(valueAttr.getName(), valueAttr.getValue());
+              // add and format child
+              derivedByElement.appendChild(childNodeElement);
+              targetFacet.setElement(childNodeElement);
+              XSDDOMHelper.formatChild(childNodeElement);
+
+//              XSDSchemaHelper.updateElement(xsdSimpleType);
+            }
+            if (targetFacet == null)
+            {
+              facetsSection.endRecording(simpleTypeElement);
+              return;
+            }
+
+            if (newValue.length() > 0)
+            {            
+              targetFacet.setLexicalValue(newValue);
+              
+              if (targetFacet instanceof XSDMaxFacet || targetFacet instanceof XSDMinFacet)
+              {
+                Element elementFacet = targetFacet.getElement();
+
+                if (targetFacet instanceof XSDMaxFacet)
+                {
+                  if (targetFacet instanceof XSDMaxExclusiveFacet)
+                  {
+                    XSDMaxInclusiveFacet xsdMaxInclusiveFacet = xsdSimpleType.getMaxInclusiveFacet();
+                    if (xsdMaxInclusiveFacet != null)
+                    {
+                      Element xsdMaxInclusiveFacetElement = xsdMaxInclusiveFacet.getElement();
+                      XSDDOMHelper.removeNodeAndWhitespace(xsdMaxInclusiveFacetElement);
+                    }
+                  }
+                  else if (targetFacet instanceof XSDMaxInclusiveFacet)
+                  {
+                    XSDMaxExclusiveFacet xsdMaxExclusiveFacet = xsdSimpleType.getMaxExclusiveFacet();
+                    if (xsdMaxExclusiveFacet != null)
+                    {
+                      Element xsdMaxExclusiveFacetElement = xsdMaxExclusiveFacet.getElement();
+                      XSDDOMHelper.removeNodeAndWhitespace(xsdMaxExclusiveFacetElement);
+                    }
+                  }
+                }
+                else if (targetFacet instanceof XSDMinFacet)
+                {
+                  if (targetFacet instanceof XSDMinExclusiveFacet)
+                  {
+                    XSDMinInclusiveFacet xsdMinInclusiveFacet = xsdSimpleType.getMinInclusiveFacet();
+                    if (xsdMinInclusiveFacet != null)
+                    {
+                      Element xsdMinInclusiveFacetElement = xsdMinInclusiveFacet.getElement();
+                      XSDDOMHelper.removeNodeAndWhitespace(xsdMinInclusiveFacetElement);
+                    }
+                  }
+                  else if (targetFacet instanceof XSDMinInclusiveFacet)
+                  {
+                    XSDMinExclusiveFacet xsdMinExclusiveFacet = xsdSimpleType.getMinExclusiveFacet();
+                    if (xsdMinExclusiveFacet != null)
+                    {
+                      Element xsdMinExclusiveFacetElement = xsdMinExclusiveFacet.getElement();
+                      XSDDOMHelper.removeNodeAndWhitespace(xsdMinExclusiveFacetElement);
+                    }
+                  }
+                }
+              }
+            }
+            else // newValue.length == 0
+            {
+              Element targetFacetElement = targetFacet.getElement();
+              XSDDOMHelper.removeNodeAndWhitespace(targetFacetElement);
+            }
+          }
+          else if (property.equals(columnProperties[2]))
+          {
+            if (targetFacet != null)
+            {
+              if (newValue.length() > 0)
+              {            
+                targetFacet.getElement().setAttribute(XSDConstants.FIXED_ATTRIBUTE, newValue);
+              }
+              else
+              {
+                targetFacet.getElement().removeAttribute(XSDConstants.FIXED_ATTRIBUTE);
+              }
+            }
+          }
+          xsdSimpleType.setElement(simpleTypeElement);
+          //xsdSimpleType.updateElement();
+          facetsSection.endRecording(simpleTypeElement);
+          refresh();
+        }
+      }
+    }
+  }
+
+  
+  private XSDConstrainingFacet getXSDConstrainingFacet(String facetString)
+  {
+    XSDSimpleTypeDefinition xsdSimpleType = (XSDSimpleTypeDefinition)getInput();
+    List list = xsdSimpleType.getFacetContents();
+    if (list == null)
+    {
+      return null;
+    }
+    Iterator iter = list.iterator();
+    XSDConstrainingFacet targetFacet = null;
+    
+    while (iter.hasNext())
+    {
+      XSDConstrainingFacet xsdConstrainingFacet = (XSDConstrainingFacet)iter.next();
+      if (xsdConstrainingFacet.getFacetName().equals(facetString))
+      {
+        targetFacet = xsdConstrainingFacet;
+        break;
+      }
+    }
+    return targetFacet;
+  }
+
+  private XSDConstrainingFacet createFacet(String facet)
+  {
+    XSDFactoryImpl factory = new XSDFactoryImpl();
+    XSDConstrainingFacet xsdFacet = null;
+    if (facet.equals("length")) { xsdFacet = factory.createXSDLengthFacet(); }
+    else if (facet.equals("minLength")) { xsdFacet = factory.createXSDMinLengthFacet(); }
+    else if (facet.equals("maxLength")) { xsdFacet = factory.createXSDMaxLengthFacet(); }
+
+    else if (facet.equals("minInclusive")) { xsdFacet = factory.createXSDMinInclusiveFacet(); }
+    else if (facet.equals("minExclusive")) { xsdFacet = factory.createXSDMinExclusiveFacet(); }
+
+    else if (facet.equals("maxInclusive")) { xsdFacet = factory.createXSDMaxInclusiveFacet(); }
+    else if (facet.equals("maxExclusive")) { xsdFacet = factory.createXSDMaxExclusiveFacet(); }
+
+    else if (facet.equals("totalDigits")) { xsdFacet = factory.createXSDTotalDigitsFacet(); }
+    else if (facet.equals("fractionDigits")) { xsdFacet = factory.createXSDFractionDigitsFacet(); }
+
+    else if (facet.equals("whiteSpace"))   { xsdFacet = factory.createXSDWhiteSpaceFacet(); }
+
+    return xsdFacet;
+  }
+
+ /**
+  * Get the tooltip for the facet
+  */
+  public String getToolTip(String facet)
+  {
+    String key = "";
+    if (facet.equals("length")) { key = "_UI_TOOLTIP_LENGTH"; }
+    else if (facet.equals("minLength")) { key = "_UI_TOOLTIP_MIN_LEN"; }
+    else if (facet.equals("maxLength")) { key = "_UI_TOOLTIP_MAX_LEN"; }
+
+    else if (facet.equals("minInclusive")) { key = "_UI_TOOLTIP_MIN_INCLUSIVE"; }
+    else if (facet.equals("minExclusive")) { key = "_UI_TOOLTIP_MIN_EXCLUSIVE"; }
+
+    else if (facet.equals("maxInclusive")) { key = "_UI_TOOLTIP_MAX_INCLUSIVE"; }
+    else if (facet.equals("maxExclusive")) { key = "_UI_TOOLTIP_MAX_EXCLUSIVE"; }
+
+    else if (facet.equals("totalDigits"))   { key = "_UI_TOOLTIP_TOTAL_DIGITS"; }
+    else if (facet.equals("fractionDigits")) { key = "_UI_TOOLTIP_FRACTION_DIGITS"; }
+
+    else if (facet.equals("whiteSpace"))   { key = "_UI_TOOLTIP_WHITE_SPACE"; }
+
+    return (key != null) ? XSDEditorPlugin.getXSDString(key) : "";
+  }
+  
+  /**
+   * This listener detects which row is selected and add a tool tip for that row
+   */
+  public class MyMouseTrackListener extends MouseTrackAdapter
+  {
+    public void mouseHover(MouseEvent e)
+    {
+      TableItem item = getTable().getItem(new Point(e.x, e.y));
+      if (item != null)
+      {
+        Object o = item.getData();
+        if (o != null)
+        {
+          String facetName = (String)o;
+          getTable().setToolTipText(getToolTip(facetName));
+        }
+      }
+    }
+  }
+
+  /**
+   * Based on the selection, detects if it is a white space or not, and add the
+   * corresponding cell editors
+   */
+  public class SelectionChangedListener implements ISelectionChangedListener
+  {
+    public void selectionChanged(SelectionChangedEvent event)
+    {
+      Object o = WindowUtility.getSelection(event.getSelection());
+      if (o != null)
+      {
+        String facet = (String)o;
+        if (facet.equals("whiteSpace"))
+        {
+          setCellEditors(altCellEditors);
+        }
+        else
+        {
+          setCellEditors(cellEditors);
+        }
+      }
+    }
+  }
+
+  
+  class FacetsTableContentProvider implements IStructuredContentProvider
+  {
+    protected String facet;
+    
+    public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
+    {
+    }
+
+    public java.lang.Object[] getElements(java.lang.Object inputElement)
+    {
+      XSDDOMHelper xsdDomHelper = new XSDDOMHelper();
+
+      String facet = "";
+      Vector v = new Vector();
+      XSDSimpleTypeDefinition inputXSDSimpleType = (XSDSimpleTypeDefinition)inputElement;
+      XSDSimpleTypeDefinition base = inputXSDSimpleType.getBaseTypeDefinition();
+      
+      if (base != null)
+      {
+        Iterator validFacets = base.getValidFacets().iterator();
+        while (validFacets.hasNext())
+        {
+          String aValidFacet = (String)validFacets.next();
+          if (!(aValidFacet.equals("pattern") || aValidFacet.equals("enumeration")))
+          {
+            v.add(aValidFacet);
+          }
+        }
+      }
+      return v.toArray();
+    }
+
+    public void dispose()
+    {
+    }
+  }
+
+  class FacetsTableLabelProvider extends LabelProvider implements ITableLabelProvider
+  {
+    public Image getColumnImage(Object element, int columnIndex)
+    {
+      return null;
+    }
+    
+    public String getColumnText(Object element, int columnIndex)
+    {
+      if (element instanceof String)
+      {
+        String value = null;
+        XSDConstrainingFacet targetFacet = getXSDConstrainingFacet((String)element);
+        switch (columnIndex)
+        {
+          case 0:
+          {
+            value = (String)element;
+            break;
+          }
+          case 1:
+          {
+            if (targetFacet == null)
+            {
+              value = "";
+            }
+            else
+            {
+              value = targetFacet.getLexicalValue();
+            }
+
+            break;
+          }
+          case 2:
+          {
+            if (targetFacet == null)
+            {
+              value = "";
+            }
+            else
+            {
+              Element elem = targetFacet.getElement();
+              value = elem.getAttribute(XSDConstants.FIXED_ATTRIBUTE);
+              if (value == null) value = "";
+            }
+          }
+        }
+        return value; 
+      }
+      return "";
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetsSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetsSection.java
new file mode 100644
index 0000000..e6a80ba
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetsSection.java
@@ -0,0 +1,802 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+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.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+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.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.common.ui.viewers.NavigableTableViewer;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.actions.DOMAttribute;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.wst.xsd.ui.internal.wizards.RegexWizard;
+import org.eclipse.xsd.XSDPatternFacet;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDVariety;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class FacetsSection extends AbstractSection
+{
+  IWorkbenchPart part;
+  ISelection selection;
+  FacetViewer facetViewer;
+  
+  XSDWorkbook workbook;
+  FacetsWorkbookPage facetsWorkbookPage;
+// If you want to add the enumerations tab to this facets tab
+//  EnumsWorkbookPage enumsWorkbookPage;
+  PatternsWorkbookPage patternsWorkbookPage;
+
+  /**
+   * 
+   */
+  public FacetsSection()
+  {
+    super();
+  }
+  
+  /**
+   * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+   */
+  public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+  {
+    super.createControls(parent, factory);
+
+    workbook = new XSDWorkbook(parent, SWT.BOTTOM | SWT.FLAT);
+    
+    facetsWorkbookPage = new FacetsWorkbookPage(workbook, this);
+//    enumsWorkbookPage = new EnumsWorkbookPage(workbook);
+    patternsWorkbookPage = new PatternsWorkbookPage(workbook);
+    facetsWorkbookPage.activate();
+//    enumsWorkbookPage.activate();
+    patternsWorkbookPage.activate();
+    workbook.setSelectedPage(facetsWorkbookPage);
+  }
+  
+  public void selectionChanged(IWorkbenchPart part, ISelection selection)
+  {
+    this.part = part;
+    this.selection = selection;
+  }
+  
+
+  /*
+   * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+   */
+  public void refresh()
+  {
+    Object input = getInput();
+    
+    if (isReadOnly)
+    {
+      facetViewer.getControl().getParent().setEnabled(false);      
+    }
+    else
+    {
+      facetViewer.getControl().getParent().setEnabled(true);
+    }
+
+    if (facetViewer != null)
+    {
+      facetViewer.setInput(input);
+    }
+    
+//    if (enumsWorkbookPage != null)
+//    {
+//      enumsWorkbookPage.setInput(input);
+//    }
+    
+    if (patternsWorkbookPage != null)
+    {
+      patternsWorkbookPage.setInput(input);
+    }
+  }
+
+  public void dispose()
+  {
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#shouldUseExtraSpace()
+   */
+  public boolean shouldUseExtraSpace()
+  {
+    return true;
+  }
+  
+
+  /* General Facets Page */
+  
+  class FacetsWorkbookPage extends XSDWorkbookPage
+  {
+    FacetsSection facetsSection;
+    Composite page1;
+    
+    public FacetsWorkbookPage(XSDWorkbook workbook, FacetsSection facetsSection)
+    {
+      super(workbook);
+      this.getTabItem().setText(XSDEditorPlugin.getXSDString("_UI_LABEL_FACETS")); //$NON-NLS-1$
+      this.facetsSection = facetsSection;
+    }
+
+    public Control createControl (Composite parent)
+    {
+      page1 = getWidgetFactory().createFlatFormComposite(parent);
+
+      FormData data = new FormData();
+      data.left = new FormAttachment(0, 0);
+      data.right = new FormAttachment(100, 0);
+      data.top = new FormAttachment(0, 0);
+      data.bottom = new FormAttachment(100, 0);
+      
+      facetViewer = new FacetViewer(page1, facetsSection);
+      facetViewer.setInput(getInput());
+      facetViewer.getControl().setLayoutData(data);
+                  
+      return page1;
+    }
+  }
+
+  /* Enumerations Page */
+  
+//  class EnumsWorkbookPage extends XSDWorkbookPage implements SelectionListener
+//  {
+//    EnumerationsTableViewer enumerationsTable;
+//    Button addButton;
+//    Button deleteButton;
+//    
+//    public EnumsWorkbookPage(XSDWorkbook workbook)
+//    {
+//      super(workbook);
+//      this.getTabItem().setText("Enumerations");
+//    }
+//
+//    public Control createControl (Composite parent)
+//    {
+//      Composite composite = getWidgetFactory().createFlatFormComposite(parent);
+//      FormData data;
+//      
+//      addButton = getWidgetFactory().createButton(composite, "Add", SWT.PUSH);
+//      deleteButton = getWidgetFactory().createButton(composite, "Delete", SWT.PUSH);
+//      enumerationsTable = new EnumerationsTableViewer(getWidgetFactory().createTable(composite, SWT.MULTI | SWT.FULL_SELECTION));
+//      
+//      enumerationsTable.setInput(getInput());
+//      Table table = enumerationsTable.getTable();
+//      table.addSelectionListener(this);
+//
+//      data = new FormData();
+//      data.left = new FormAttachment(deleteButton, 0, SWT.LEFT);
+//      data.right = new FormAttachment(100, 0);
+//      data.top = new FormAttachment(0, 0);
+//      data.bottom = new FormAttachment(deleteButton, 0); //-ITabbedPropertyConstants.VSPACE);
+//      addButton.setLayoutData(data);
+//      addButton.addSelectionListener(this);
+//      
+//      data = new FormData();
+//      data.left = new FormAttachment(table, +ITabbedPropertyConstants.HSPACE);
+//      data.right = new FormAttachment(100, 0);
+//      data.top = new FormAttachment(addButton, 0);
+////      data.bottom = new FormAttachment(deleteButton, +ITabbedPropertyConstants.VSPACE);
+//      deleteButton.setLayoutData(data);
+//      deleteButton.setEnabled(false);
+//      deleteButton.addSelectionListener(this);
+//      
+//      data = new FormData();
+//      data.left = new FormAttachment(0, 0);
+//      data.right = new FormAttachment(85, 0);
+//      data.top = new FormAttachment(0, 0);
+//      data.bottom = new FormAttachment(100, 0);
+//      table.setLayoutData(data);
+//      
+//      return composite;
+//    }
+//    
+//    public void setInput(Object input)
+//    {
+//      enumerationsTable.setInput(input);
+//    }
+//    
+//    public void widgetSelected(SelectionEvent e)
+//    {
+//      XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)getInput();
+//      Element element = st.getElement();
+//      if (e.widget == addButton)
+//      {
+//        XSDDOMHelper helper = new XSDDOMHelper();
+//
+//        int variety = st.getVariety().getValue();
+//        Node varietyElement = null;
+//        if (variety == XSDVariety.ATOMIC)
+//        {
+//          varietyElement = helper.getChildNode(element, XSDConstants.RESTRICTION_ELEMENT_TAG);
+//        }
+//        else if (variety == XSDVariety.UNION)
+//        {
+//          varietyElement = helper.getChildNode(element, XSDConstants.UNION_ELEMENT_TAG);
+//        }
+//        else if (variety == XSDVariety.LIST)
+//        {
+//          varietyElement = helper.getChildNode(element, XSDConstants.LIST_ELEMENT_TAG);
+//        }
+//              
+//        if (varietyElement != null)
+//        {
+//          java.util.List attributes = new ArrayList();
+//          attributes.add(new DOMAttribute(XSDConstants.VALUE_ATTRIBUTE, ""));
+//          beginRecording("Add Enumeration", element);
+//          Action action = getNewElementAction(XSDConstants.ENUMERATION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_ENUM"), attributes, (Element)varietyElement, null);
+//          action.run();
+//          st.setElement(element);
+//
+//          endRecording(element);
+//          enumerationsTable.refresh();
+//          attributes = null;
+//        }
+//      }
+//      else if (e.widget == deleteButton)
+//      {
+//        StructuredSelection selection = (StructuredSelection)enumerationsTable.getSelection();
+//        if (selection != null)
+//        {
+//          Iterator i = selection.iterator();
+//          beginRecording("Delete Enumeration", element);
+//          while (i.hasNext())
+//          {
+//            Object obj = i.next();
+//            if (obj != null)
+//            {
+//              if (obj instanceof XSDEnumerationFacet)
+//              {
+//                XSDEnumerationFacet enumFacet = (XSDEnumerationFacet)obj;
+//      
+//                // I have to update using DOM
+//                XSDDOMHelper.removeNodeAndWhitespace(enumFacet.getElement());            
+//                
+//              }
+//            }
+//          }
+//          enumerationsTable.refresh();
+//          st.setElement(element);
+//          endRecording(element);
+//        }
+//      }
+//      else if (e.widget == enumerationsTable.getTable())
+//      {
+//        StructuredSelection selection = (StructuredSelection)enumerationsTable.getSelection();
+//        if (selection.getFirstElement() != null)
+//        {
+//          deleteButton.setEnabled(true);
+//        }
+//        else
+//        {
+//          deleteButton.setEnabled(false);
+//        }
+//      }
+//      
+//    }
+//
+//    public void widgetDefaultSelected(SelectionEvent e)
+//    {
+//      
+//    }
+//  }
+//  
+//  class EnumerationsTableViewer extends NavigableTableViewer implements ICellModifier
+//  {
+//    protected String[] columnProperties = {"Enumeration"};
+//
+//    protected CellEditor[] cellEditors;
+//
+//    Table table;
+//    
+//    public EnumerationsTableViewer(Table table)
+//    {
+//      super(table);
+//      table = getTable();
+//      
+//      table.setLinesVisible(true);
+//      
+//      setContentProvider(new EnumerationsTableContentProvider());
+//      setLabelProvider(new EnumerationsTableLabelProvider());
+//      setColumnProperties(columnProperties);
+//
+//      setCellModifier(this);
+//
+//      TableColumn column = new TableColumn(table, SWT.NONE, 0);
+//      column.setText(columnProperties[0]);
+//      column.setAlignment(SWT.LEFT);
+// 
+//      cellEditors = new CellEditor[1];
+//
+//      TableLayout layout = new TableLayout();
+//      ColumnWeightData data = new ColumnWeightData(100);
+//      layout.addColumnData(data);
+//      cellEditors[0] = new TextCellEditor(table);
+//
+//      getTable().setLayout(layout);
+//      setCellEditors(cellEditors);
+//    }
+//    
+//    public boolean canModify(Object element, String property)
+//    {
+//      return true;
+//    }
+//
+//    public void modify(Object element, String property, Object value)
+//    {
+//      if (element instanceof TableItem && (value != null))
+//      {
+//        TableItem item = (TableItem)element;
+//        
+//        Element simpleTypeElement = ((XSDSimpleTypeDefinition)getInput()).getElement();
+//        FacetsSection.this.beginRecording(XSDEditorPlugin.getXSDString("_UI_ENUM_VALUE_CHANGE"), simpleTypeElement);
+//        
+//        XSDEnumerationFacet enumFacet = (XSDEnumerationFacet)item.getData();
+//        enumFacet.setLexicalValue((String)value);
+//        item.setData(enumFacet);
+//        item.setText((String)value);
+//        FacetsSection.this.endRecording(simpleTypeElement);
+//      }
+//    }    
+//
+//    public Object getValue(Object element, String property)
+//    {
+//      if (element instanceof XSDEnumerationFacet)
+//      {
+//        XSDEnumerationFacet enumFacet = (XSDEnumerationFacet)element;
+//        String value = enumFacet.getLexicalValue();
+//        if (value == null) value = "";
+//        return value;
+//      }
+//      return "";
+//    }
+//
+//  }
+//    
+//  class EnumerationsTableContentProvider implements IStructuredContentProvider
+//  {
+//    public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
+//    {
+//    }
+//
+//    public java.lang.Object[] getElements(java.lang.Object inputElement)
+//    {
+//      java.util.List list = new ArrayList();
+//      if (inputElement instanceof XSDSimpleTypeDefinition)
+//      {
+//        XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)inputElement;
+//        return st.getEnumerationFacets().toArray();
+//      }
+//      return list.toArray();
+//    }
+//
+//    public void dispose()
+//    {
+//    }
+//  }
+//
+//  class EnumerationsTableLabelProvider extends LabelProvider implements ITableLabelProvider
+//  {
+//    public EnumerationsTableLabelProvider()
+//    {
+//      
+//    }
+//    
+//    public Image getColumnImage(Object element, int columnIndex)
+//    {
+//      return XSDEditorPlugin.getXSDImage("icons/XSDSimpleEnum.gif");
+//    }
+//    
+//    public String getColumnText(Object element, int columnIndex)
+//    {
+//      if (element instanceof XSDEnumerationFacet)
+//      {
+//        XSDEnumerationFacet enum = (XSDEnumerationFacet)element;
+//        String value = enum.getLexicalValue();
+//        if (value == null) value = "";
+//        return value;
+//      }
+//      return "";
+//    }
+//
+//  }
+
+  /* Patterns Page */
+  
+  class PatternsWorkbookPage extends XSDWorkbookPage implements SelectionListener, Listener
+  {
+    PatternsTableViewer patternsTable;
+    Button addButton;
+    Button deleteButton;
+    Button editButton;
+    Composite composite;
+    
+    public PatternsWorkbookPage(XSDWorkbook workbook)
+    {
+      super(workbook);
+      this.getTabItem().setText(XSDEditorPlugin.getXSDString("_UI_LABEL_PATTERNS")); //$NON-NLS-1$
+    }
+
+    public Control createControl (Composite parent)
+    {
+      composite = getWidgetFactory().createFlatFormComposite(parent);
+      FormData data;
+
+      patternsTable = new PatternsTableViewer(getWidgetFactory().createTable(composite, SWT.MULTI | SWT.FULL_SELECTION));
+      patternsTable.setInput(getInput());
+      Table table = patternsTable.getTable();
+      table.addSelectionListener(this);
+
+      addButton = getWidgetFactory().createButton(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_ADD"), SWT.PUSH); //$NON-NLS-1$
+      editButton = getWidgetFactory().createButton(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_EDIT"), SWT.PUSH); //$NON-NLS-1$
+      deleteButton = getWidgetFactory().createButton(composite, XSDEditorPlugin.getXSDString("_UI_ACTION_DELETE_INCLUDE"), SWT.PUSH); //$NON-NLS-1$
+
+      data = new FormData();
+      data.left = new FormAttachment(100, -100);
+      data.right = new FormAttachment(100, 0);
+      data.top = new FormAttachment(0, 0);
+      addButton.setLayoutData(data);
+      addButton.addSelectionListener(this);
+
+      data = new FormData();
+      data.left = new FormAttachment(addButton, 0, SWT.LEFT);
+      data.right = new FormAttachment(100, 0);
+      data.top = new FormAttachment(addButton, 0);
+      editButton.setLayoutData(data);
+      editButton.setEnabled(false);
+      editButton.addSelectionListener(this);
+      
+      data = new FormData();
+      data.left = new FormAttachment(addButton, 0, SWT.LEFT);
+      data.right = new FormAttachment(100, 0);
+      data.top = new FormAttachment(editButton, 0);
+      deleteButton.setLayoutData(data);
+      deleteButton.setEnabled(false);
+      deleteButton.addSelectionListener(this);
+      
+      data = new FormData();
+      data.top = new FormAttachment(0, 0);
+      data.left = new FormAttachment(0, 0);
+      data.right = new FormAttachment(addButton, 0);
+      data.bottom = new FormAttachment(100, 0);
+      data.width = tableMinimumWidth;
+      table.setLayoutData(data);
+      table.addListener(SWT.Resize, this);
+      
+      return composite;
+    }
+    
+    public void handleEvent(Event event)
+    {
+      Table table = patternsTable.getTable();
+      if (event.type == SWT.Resize && event.widget == table)
+      {
+        TableColumn tableColumn = table.getColumn(0);
+        tableColumn.setWidth(table.getSize().x);
+      }
+    }
+
+    
+    public void setInput(Object input)
+    {
+      patternsTable.setInput(input);
+      if (isReadOnly)
+      {
+        composite.setEnabled(false);
+      }
+      else
+      {
+        composite.setEnabled(true);
+      }
+    }
+    
+    public void widgetSelected(SelectionEvent e)
+    {
+      XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)getInput();
+      Element element = st.getElement();
+
+      if (e.widget == addButton)
+      {
+        XSDDOMHelper helper = new XSDDOMHelper();
+        
+        int variety = st.getVariety().getValue();
+        Node varietyElement = null;
+        if (variety == XSDVariety.ATOMIC)
+        {
+          varietyElement = helper.getChildNode(element, XSDConstants.RESTRICTION_ELEMENT_TAG);
+        }
+        else if (variety == XSDVariety.UNION)
+        {
+          varietyElement = helper.getChildNode(element, XSDConstants.UNION_ELEMENT_TAG);
+        }
+        else if (variety == XSDVariety.LIST)
+        {
+          varietyElement = helper.getChildNode(element, XSDConstants.LIST_ELEMENT_TAG);
+        }
+              
+        if (varietyElement != null)
+        {
+          Shell shell = Display.getCurrent().getActiveShell();
+
+          String initialValue = ""; //$NON-NLS-1$
+          RegexWizard wizard = new RegexWizard(initialValue);
+
+          WizardDialog wizardDialog = new WizardDialog(shell, wizard);
+          wizardDialog.setBlockOnOpen(true);
+          wizardDialog.create();
+          
+          int result = wizardDialog.open();
+
+          if (result == Window.OK)
+          {
+            String newPattern = wizard.getPattern();
+            
+            java.util.List attributes = new ArrayList();
+            attributes.add(new DOMAttribute(XSDConstants.VALUE_ATTRIBUTE, newPattern));
+            beginRecording(XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_PATTERN"), element); //$NON-NLS-1$
+            Action action = getNewElementAction(XSDConstants.PATTERN_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_PATTERN"), attributes, (Element)varietyElement, null); //$NON-NLS-1$
+            action.run();
+            st.setElement(element);
+            endRecording(element);
+            patternsTable.refresh();
+            attributes = null;
+          }
+        }
+      }
+      else if (e.widget == deleteButton)
+      {
+        StructuredSelection selection = (StructuredSelection)patternsTable.getSelection();
+        if (selection != null)
+        {
+          Iterator i = selection.iterator();
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_ACTION_DELETE_INCLUDE"), element); // Reword ?
+          while (i.hasNext())
+          {
+            Object obj = i.next();
+            if (obj != null)
+            {
+              if (obj instanceof XSDPatternFacet)
+              {
+                XSDPatternFacet patternFacet = (XSDPatternFacet)obj;
+      
+                // I have to update using DOM
+                XSDDOMHelper.removeNodeAndWhitespace(patternFacet.getElement());            
+              }
+            }
+          }
+          st.setElement(element);
+          endRecording(element);
+          patternsTable.refresh();
+          if (patternsTable.getTable().getItemCount() == 0)
+          {
+            editButton.setEnabled(false);
+            deleteButton.setEnabled(false);
+          }
+        }
+      }
+      else if (e.widget == editButton)
+      {
+        StructuredSelection selection = (StructuredSelection)patternsTable.getSelection();
+        if (selection != null)
+        {
+          Object obj = selection.getFirstElement();
+          if (obj instanceof XSDPatternFacet)
+          {
+            XSDPatternFacet pattern = (XSDPatternFacet)obj;
+            String initialValue = pattern.getLexicalValue();
+            if (initialValue == null)
+            {
+              initialValue = ""; //$NON-NLS-1$
+            }
+
+            Shell shell = Display.getCurrent().getActiveShell();
+
+            RegexWizard wizard = new RegexWizard(initialValue);
+
+            WizardDialog wizardDialog = new WizardDialog(shell, wizard);
+            wizardDialog.setBlockOnOpen(true);
+            wizardDialog.create();
+            
+            int result = wizardDialog.open();
+
+            if (result == Window.OK)
+            {
+              String newPattern = wizard.getPattern();
+              beginRecording(XSDEditorPlugin.getXSDString("_UI_PATTERN_VALUE_CHANGE"), element); //$NON-NLS-1$
+              element.setAttribute(XSDConstants.VALUE_ATTRIBUTE, newPattern);
+              pattern.setLexicalValue(newPattern);
+              endRecording(element);
+              patternsTable.refresh();
+            }
+          }
+        }
+      }
+      else if (e.widget == patternsTable.getTable())
+      {
+        StructuredSelection selection = (StructuredSelection)patternsTable.getSelection();
+        if (selection.getFirstElement() != null)
+        {
+          editButton.setEnabled(true);
+          deleteButton.setEnabled(true);
+        }
+        else
+        {
+          editButton.setEnabled(false);
+          deleteButton.setEnabled(false);
+        }
+      }
+      
+    }
+
+    public void widgetDefaultSelected(SelectionEvent e)
+    {
+      
+    }
+  }
+
+  
+  class PatternsTableViewer extends NavigableTableViewer implements ICellModifier
+  {
+    protected String[] columnProperties = {"Pattern"};
+
+    protected CellEditor[] cellEditors;
+
+    Table table;
+    
+    public PatternsTableViewer(Table table)
+    {
+      super(table);
+      table = getTable();
+      
+      table.setLinesVisible(true);
+      
+      setContentProvider(new PatternsTableContentProvider());
+      setLabelProvider(new PatternsTableLabelProvider());
+      setColumnProperties(columnProperties);
+
+      setCellModifier(this);
+
+      TableColumn column = new TableColumn(table, SWT.NONE, 0);
+      column.setText(columnProperties[0]);
+      column.setAlignment(SWT.LEFT);
+      column.setResizable(true);
+ 
+      cellEditors = new CellEditor[1];
+
+      TableLayout layout = new TableLayout();
+      ColumnWeightData data = new ColumnWeightData(100);
+      layout.addColumnData(data);
+      cellEditors[0] = new TextCellEditor(table);
+
+      getTable().setLayout(layout);
+      setCellEditors(cellEditors);
+    }
+    
+    public boolean canModify(Object element, String property)
+    {
+      return true;
+    }
+
+    public void modify(Object element, String property, Object value)
+    {
+      if (element instanceof TableItem && (value != null))
+      {
+        TableItem item = (TableItem)element;
+        
+        Element simpleTypeElement = ((XSDSimpleTypeDefinition)getInput()).getElement();
+        FacetsSection.this.beginRecording(XSDEditorPlugin.getXSDString("_UI_PATTERN_VALUE_CHANGE"), simpleTypeElement); //$NON-NLS-1$
+        
+        XSDPatternFacet patternFacet = (XSDPatternFacet)item.getData();
+        patternFacet.setLexicalValue((String)value);
+
+        item.setData(patternFacet);
+        item.setText((String)value);
+        FacetsSection.this.endRecording(simpleTypeElement);
+      }
+    }    
+
+    public Object getValue(Object element, String property)
+    {
+      if (element instanceof XSDPatternFacet)
+      {
+        XSDPatternFacet patternFacet = (XSDPatternFacet)element;
+        String value = patternFacet.getLexicalValue();
+        if (value == null) value = ""; //$NON-NLS-1$
+        return value;
+      }
+      return ""; //$NON-NLS-1$
+    }
+
+  }
+    
+  class PatternsTableContentProvider implements IStructuredContentProvider
+  {
+    public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
+    {
+    }
+
+    public java.lang.Object[] getElements(java.lang.Object inputElement)
+    {
+      java.util.List list = new ArrayList();
+      if (inputElement instanceof XSDSimpleTypeDefinition)
+      {
+        XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)inputElement;
+        return st.getPatternFacets().toArray();
+      }
+      return list.toArray();
+    }
+
+    public void dispose()
+    {
+    }
+  }
+
+  class PatternsTableLabelProvider extends LabelProvider implements ITableLabelProvider
+  {
+    public PatternsTableLabelProvider()
+    {
+      
+    }
+    
+    public Image getColumnImage(Object element, int columnIndex)
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDSimplePattern.gif"); //$NON-NLS-1$
+    }
+    
+    public String getColumnText(Object element, int columnIndex)
+    {
+      if (element instanceof XSDPatternFacet)
+      {
+        XSDPatternFacet pattern = (XSDPatternFacet)element;
+        String value = pattern.getLexicalValue();
+        if (value == null) value = ""; //$NON-NLS-1$
+        return value;
+      }
+      return ""; //$NON-NLS-1$
+    }
+
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetsSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetsSectionDescriptor.java
new file mode 100644
index 0000000..c5f9d1f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/FacetsSectionDescriptor.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+
+
+public class FacetsSectionDescriptor extends AbstractSectionDescriptor
+{
+
+  /**
+   * 
+   */
+  public FacetsSectionDescriptor()
+  {
+    super();
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.facets";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDSimpleTypeDefinition.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new FacetsSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.facets";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDSimpleTypeDefinition)
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/MinMaxSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/MinMaxSection.java
new file mode 100644
index 0000000..4596281
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/MinMaxSection.java
@@ -0,0 +1,286 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDParticleContent;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class MinMaxSection extends AbstractSection
+{
+  CCombo minCombo;
+  CCombo maxCombo;
+
+  /**
+   * 
+   */
+  public MinMaxSection()
+  {
+    super();
+  }
+
+
+  public void doHandleEvent(Event event)
+	{
+    if (event.widget == minCombo)
+    {
+      updateMinAttribute();
+	  }
+	  else if (event.widget == maxCombo)
+	  {
+      updateMaxAttribute();
+	  }
+	}
+  
+  public void doWidgetSelected(SelectionEvent e)
+  {
+    if (e.widget == minCombo)
+    {
+      updateMinAttribute();
+    }
+    else if (e.widget == maxCombo)
+    {
+      updateMaxAttribute();
+    }
+  }
+
+  private void updateMinAttribute()
+  {
+    XSDParticle particle = null;
+    Object input = getInput();
+
+    if (input instanceof XSDParticleContent)
+    {
+      particle = getAssociatedParticle((XSDParticleContent)input);
+    }
+    if (particle != null)
+    {
+      Element element = particle.getElement();
+      String newValue = ""; //$NON-NLS-1$
+      String id = ""; //$NON-NLS-1$
+
+      newValue = minCombo.getText();
+      id = XSDConstants.MINOCCURS_ATTRIBUTE;
+      beginRecording(XSDEditorPlugin.getXSDString("_UI_MINOCCURS_CHANGE"), element); //$NON-NLS-1$        
+      if (newValue.length()==0)
+      {
+        particle.unsetMinOccurs();
+      }
+      try
+      {
+        if (newValue.equals("unbounded") || newValue.equals("*")) //$NON-NLS-1$
+        {
+          particle.setMinOccurs(XSDParticle.UNBOUNDED);
+        }
+        else
+        {
+          int val = Integer.parseInt(newValue);
+          particle.setMinOccurs(val);
+        }
+      }
+      catch (NumberFormatException e)
+      {
+      
+      }
+      finally
+      { 
+        endRecording(element);
+      }
+    }
+  }
+  
+  private void updateMaxAttribute()
+  {
+    XSDParticle particle = null;
+    Object input = getInput();
+
+    if (input instanceof XSDParticleContent)
+    {
+      particle = getAssociatedParticle((XSDParticleContent)input);
+    }
+    if (particle != null)
+    {
+      Element element = particle.getElement();
+      String newValue = "";
+      String id = "";
+      newValue = maxCombo.getText();
+      id = XSDConstants.MAXOCCURS_ATTRIBUTE;
+      beginRecording(XSDEditorPlugin.getXSDString("_UI_MAXOCCURS_CHANGE"), element); //$NON-NLS-1$
+      if (newValue.length()==0)
+      {
+        particle.unsetMaxOccurs();
+      }
+      try
+      {
+        if (newValue.equals("unbounded") || newValue.equals("*")) //$NON-NLS-1$
+        {
+          particle.setMaxOccurs(XSDParticle.UNBOUNDED);
+        }
+        else
+        {
+          int val = Integer.parseInt(newValue);
+            particle.setMaxOccurs(val);
+        }
+      }
+      catch (NumberFormatException e)
+      {
+        
+      }
+      finally
+      {
+        endRecording(element);
+      }
+    }    
+  }
+  
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+
+	public void createControls(Composite parent,TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		composite =	getWidgetFactory().createFlatFormComposite(parent);
+		FormData data;
+
+    minCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT);
+    data = new FormData();
+    data.left = new FormAttachment(0, 100);
+    data.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+    data.top = new FormAttachment(0, 0);
+    minCombo.setLayoutData(data);
+    minCombo.add("0"); //$NON-NLS-1$
+    minCombo.add("1"); //$NON-NLS-1$
+    minCombo.addListener(SWT.Modify, this);
+    minCombo.addSelectionListener(this);
+    
+		CLabel minLabel = getWidgetFactory().createCLabel(composite, XSDConstants.MINOCCURS_ATTRIBUTE + ":");
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(minCombo, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(minCombo, 0, SWT.CENTER);
+		minLabel.setLayoutData(data);
+
+    maxCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT);
+    data = new FormData();
+    data.left = new FormAttachment(0, 100);
+    data.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+    data.top = new FormAttachment(minCombo, +ITabbedPropertyConstants.VSPACE);
+    maxCombo.setLayoutData(data);
+    maxCombo.add("0"); //$NON-NLS-1$
+    maxCombo.add("1"); //$NON-NLS-1$
+    maxCombo.add("unbounded"); //$NON-NLS-1$
+    maxCombo.addListener(SWT.Modify, this);
+    maxCombo.addSelectionListener(this);
+    
+		CLabel maxLabel = getWidgetFactory().createCLabel(composite, XSDConstants.MAXOCCURS_ATTRIBUTE + ":");
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(maxCombo, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(maxCombo, 0, SWT.CENTER);
+		maxLabel.setLayoutData(data);
+	}
+
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+    if (doRefresh)
+    {
+      if (isReadOnly)
+      {
+        composite.setEnabled(false);
+      }
+      else
+      {
+        composite.setEnabled(true);
+      }
+
+  	  setListenerEnabled(false);
+      boolean refreshMinText = true;
+      boolean refreshMaxText = true;
+      if (minCombo.isFocusControl())
+      {
+        refreshMinText = false;
+      }
+      if (maxCombo.isFocusControl())
+      {
+        refreshMaxText = false;
+      }
+      if (refreshMinText)
+      {
+        minCombo.setText(""); //$NON-NLS-1$
+      }
+      if (refreshMaxText)
+      {
+        maxCombo.setText(""); //$NON-NLS-1$
+      }
+  	  Object input = getInput();
+  	  if (input != null)
+  	  {
+  	    if (input instanceof XSDParticleContent)
+  	    {
+  		    XSDParticle particle = getAssociatedParticle((XSDParticleContent)input);
+  		    if (particle != null)
+  		    {
+  //  	      minText.setText(String.valueOf(particle.getMinOccurs()));
+  //	        maxText.setText(String.valueOf(particle.getMaxOccurs()));
+            Element element = particle.getElement();
+  		      if (element != null)
+  		      {
+  		        String min = element.getAttribute(XSDConstants.MINOCCURS_ATTRIBUTE);
+  		        String max = element.getAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE);
+  		        if (min != null && refreshMinText)
+  		        {
+  		          minCombo.setText(min);
+  		        }
+  		        if (max != null && refreshMaxText)
+  		        {
+  		          maxCombo.setText(max);
+  		        }
+  		      }
+  		    }
+  	    }
+  	  }
+  	  setListenerEnabled(true);
+    }
+	}
+	
+  public boolean shouldUseExtraSpace()
+  {
+    return false;
+  }
+
+  private XSDParticle getAssociatedParticle(XSDParticleContent particleContent)
+  {
+    XSDConcreteComponent xsdComp = particleContent.getContainer();
+    if (xsdComp instanceof XSDParticle)
+    {
+      return (XSDParticle)xsdComp;
+    }
+    return null;
+  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/MinMaxSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/MinMaxSectionDescriptor.java
new file mode 100644
index 0000000..80b5f42
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/MinMaxSectionDescriptor.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDWildcard;
+
+public class MinMaxSectionDescriptor extends AbstractSectionDescriptor
+{
+  /**
+   * 
+   */
+  public MinMaxSectionDescriptor()
+  {
+    super();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.minmax";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDElementDeclaration.class);
+    list.add(XSDModelGroup.class);
+    list.add(XSDWildcard.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new MinMaxSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.general";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+//      if (object instanceof XSDElementDeclaration)
+//      {
+//        Element element = ((XSDElementDeclaration)object).getElement();
+//        Object parentNode = element.getParentNode();
+//        // minOccurs and maxOccurs apply to non-global elements
+//        boolean isGlobalElement = XSDDOMHelper.inputEquals(parentNode, XSDConstants.SCHEMA_ELEMENT_TAG, false);
+//        return !isGlobalElement;
+//      }
+//      if (object instanceof XSDParticle)
+//      {
+//        XSDParticle particle = (XSDParticle)object;
+//        Element element = particle.getElement();
+//        if (inputEquals(element, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+//        {
+//          return true;
+//        }
+//        else if (inputEquals(element, XSDConstants.ELEMENT_ELEMENT_TAG, true))
+//        {
+//          return false;
+//        }
+//        else
+//        {
+//          return true;
+//        }
+//      }
+      if (object instanceof XSDModelGroup)
+      {
+        return true;
+      }
+      else if (object instanceof XSDElementDeclaration)
+      {
+        XSDElementDeclaration xsdElementDeclaration = (XSDElementDeclaration)object;
+        if (xsdElementDeclaration.isGlobal())
+        {
+          return false;
+        }
+        else
+        {
+          return true;
+        }
+      }
+      else if (object instanceof XSDWildcard)
+      {
+        XSDWildcard wildcard = (XSDWildcard)object;
+        if (wildcard.getContainer() instanceof XSDComplexTypeDefinition ||
+            wildcard.getContainer() instanceof XSDAttributeGroupDefinition)
+        {
+          return false;
+        }
+        else
+        {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+  
+  public String getAfterSection()
+  {
+    return "org.eclipse.wst.wsdleditor.section.reference";
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ModelGroupSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ModelGroupSection.java
new file mode 100644
index 0000000..c5e62d8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ModelGroupSection.java
@@ -0,0 +1,144 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDCompositor;
+import org.eclipse.xsd.XSDModelGroup;
+import org.w3c.dom.Element;
+
+public class ModelGroupSection extends AbstractSection
+{
+  CCombo modelGroupCombo;
+  private String[] modelGroupComboValues = { "sequence", "choice", "all" }; //$NON-NLS-1$
+  
+  /**
+   * 
+   */
+  public ModelGroupSection()
+  {
+    super();
+  }
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		composite = getWidgetFactory().createFlatFormComposite(parent);
+		FormData data;
+
+		modelGroupCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT);
+		data = new FormData();
+		data.left = new FormAttachment(0, 100);
+		data.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(0, 0);
+		modelGroupCombo.setLayoutData(data);
+		modelGroupCombo.addSelectionListener(this);
+		modelGroupCombo.setItems(modelGroupComboValues);
+
+		CLabel cLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_KIND")); //$NON-NLS-1$
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(modelGroupCombo, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(modelGroupCombo, 0, SWT.CENTER);
+		cLabel.setLayoutData(data);
+
+	}
+ 	
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+	  setListenerEnabled(false);
+    if (isReadOnly)
+    {
+      composite.setEnabled(false);
+    }
+    else
+    {
+      composite.setEnabled(true);
+    }
+	  Object input = getInput();
+	  if (input != null)
+	  {
+      if (input instanceof XSDModelGroup)
+	    {
+	      XSDModelGroup particle = (XSDModelGroup)input;
+	      String modelType = particle.getCompositor().getName();
+	      modelGroupCombo.setText(modelType);
+	    }
+	  }
+	  setListenerEnabled(true);
+	}
+
+  public void widgetSelected(SelectionEvent e)
+  {
+    if (e.widget == modelGroupCombo)
+    {
+      Object input = getInput();
+	    if (input instanceof XSDModelGroup)
+	    {
+	      XSDModelGroup particle = (XSDModelGroup)input;
+
+        Element element = particle.getElement();
+        Element parent = (Element)element.getParentNode();
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_GROUP_SCOPE_CHANGE"), parent); //$NON-NLS-1$
+//        changeContentModel(parent, modelGroupCombo.getText());
+        particle.setCompositor(XSDCompositor.get(modelGroupCombo.getText()));      
+        endRecording(parent);
+        refresh();
+	    }
+    }
+  }
+
+//  private void changeContentModel(Element parent, String contentModel)
+//  {
+//    Document doc = parent.getOwnerDocument();
+//    XSDDOMHelper domHelper = getDomHelper();
+//  
+//    String prefix = parent.getPrefix();
+//    prefix = prefix == null ? "" : prefix + ":";
+//    
+//    Element contentModelElement = domHelper.getContentModelFromParent(parent);
+//  
+//    if (contentModelElement.getLocalName().equals(contentModel))
+//    {
+//      return; // it's already the content model 
+//    }
+//  
+//    Element newNode = doc.createElementNS(XSDDOMHelper.XMLSchemaURI, prefix + contentModel);
+//  
+//    if (contentModelElement.hasChildNodes())
+//    {        
+//      NodeList nodes = contentModelElement.getChildNodes();
+//      // use clones so we don't have a refresh problem
+//      for (int i = 0; i < nodes.getLength(); i++)
+//      {
+//        Node node = nodes.item(i);
+//        newNode.appendChild(node.cloneNode(true)); 
+//      }
+//    }
+//    parent.replaceChild(newNode, contentModelElement);
+//  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ModelGroupSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ModelGroupSectionDescriptor.java
new file mode 100644
index 0000000..4f1a091
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ModelGroupSectionDescriptor.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDModelGroup;
+
+public class ModelGroupSectionDescriptor extends AbstractSectionDescriptor
+{
+  /**
+   * 
+   */
+  public ModelGroupSectionDescriptor()
+  {
+    super();
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.modelgroup";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDModelGroup.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new ModelGroupSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.general";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+//      if (object instanceof XSDParticle)
+//      {
+//        XSDParticle particle = (XSDParticle)object;
+//        Element element = particle.getElement();
+//        if (inputEquals(element, XSDConstants.SEQUENCE_ELEMENT_TAG, false) ||
+//            inputEquals(element, XSDConstants.CHOICE_ELEMENT_TAG, false) ||
+//            inputEquals(element, XSDConstants.ALL_ELEMENT_TAG, false))
+//        {
+//          return true;
+//        }
+//      }
+      if (object instanceof XSDModelGroup)
+      {
+        XSDModelGroup particle = (XSDModelGroup)object;
+//        Element element = particle.getElement();
+//        if (inputEquals(element, XSDConstants.SEQUENCE_ELEMENT_TAG, false) ||
+//            inputEquals(element, XSDConstants.CHOICE_ELEMENT_TAG, false) ||
+//            inputEquals(element, XSDConstants.ALL_ELEMENT_TAG, false))
+//        {
+          return true;
+//        }
+      }
+    }
+    return false;
+  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NameSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NameSection.java
new file mode 100644
index 0000000..bdfc606
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NameSection.java
@@ -0,0 +1,444 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalAttributeGroupRenamer;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalAttributeRenamer;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalElementRenamer;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalGroupRenamer;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.GlobalSimpleOrComplexTypeRenamer;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDComponent;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class NameSection extends AbstractSection
+{
+  /**
+   * 
+   */
+  public NameSection()
+  {
+    super();
+  }
+  
+	Text nameText;
+
+	
+  public void doHandleEvent(Event event) 
+  {
+    if (event.widget == nameText)
+	  {
+			Object input = getInput();
+      String newValue = nameText.getText();
+	    if (input instanceof XSDNamedComponent)
+	    {
+	      XSDNamedComponent namedComponent = (XSDNamedComponent)input;
+	      if (newValue.length() > 0)
+	      {
+	        namedComponent.setName(newValue);
+          doReferentialIntegrityCheck(namedComponent, newValue);
+	      }
+	      else
+	      {
+          // TODO: Show error message
+	      }
+	    }
+//	    else if (input instanceof XSDParticle)
+//	    {
+//	      XSDParticle xsdParticle = (XSDParticle)input;
+//	      if (newValue.length() > 0)
+//	      {
+//	        doReferentialIntegrityCheck(xsdParticle, newValue);
+//	      }
+//	      else
+//	      {
+//	        // TODO: Show error message
+//	      }
+//	    }
+      else if (input instanceof XSDAttributeDeclaration)
+      {
+        XSDAttributeDeclaration attribute = (XSDAttributeDeclaration)input;
+	      if (newValue.length() > 0)
+	      {
+	        doReferentialIntegrityCheck(attribute, newValue);
+	        attribute.setName(newValue);
+	      }
+	      else
+	      {
+	        // TODO: Show error message
+	      }
+      }
+	    else if (input instanceof XSDAttributeUse)
+      {
+        XSDAttributeUse attributeUse = (XSDAttributeUse)input;
+        XSDAttributeDeclaration attribute = attributeUse.getAttributeDeclaration();
+	      if (newValue.length() > 0)
+	      {
+	        doReferentialIntegrityCheck(attribute, newValue);
+	        attribute.setName(newValue);
+	        attributeUse.setAttributeDeclaration(attribute);
+	      }
+	      else
+	      {
+          // TODO: Show error message
+	      }
+      }
+	  }
+	}
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		composite =	getWidgetFactory().createFlatFormComposite(parent);
+		FormData data;
+
+		nameText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
+		data = new FormData();
+		data.left = new FormAttachment(0, 100);
+		// data.right = new FormAttachment(95, 0);
+    data.right = new FormAttachment(100, -rightMarginSpace -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(0, 0);
+		nameText.setLayoutData(data);
+		nameText.addListener(SWT.Modify, this);
+
+		CLabel nameLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_NAME")); //$NON-NLS-1$
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(nameText, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(nameText, 0, SWT.CENTER);
+		nameLabel.setLayoutData(data);
+	}
+
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+    if (nameText.isFocusControl())
+    {
+      return;
+    }
+    setListenerEnabled(false);
+    nameText.setEditable(true);
+    if (isReadOnly)
+    {
+      composite.setEnabled(false);
+    }
+    else
+    {
+      composite.setEnabled(true);
+    }
+	  Object input = getInput();
+	  nameText.setText(""); //$NON-NLS-1$
+	  if (input != null)
+	  {
+	    if (input instanceof XSDComplexTypeDefinition || input instanceof XSDSimpleTypeDefinition)
+	    {
+	      XSDTypeDefinition type = (XSDTypeDefinition)input;
+	      
+	      Element element = type.getElement();
+        String name = element.getAttribute(XSDConstants.NAME_ATTRIBUTE);
+        if (name == null) name = "";
+        
+        boolean isAnonymousType = checkForAnonymousType(element);
+        if (isAnonymousType)
+        {
+          nameText.setText("**anonymous**"); //$NON-NLS-1$
+          nameText.setEditable(false);
+        }
+        else
+        {
+          nameText.setText(name);
+          nameText.setEditable(true);
+        }
+	    }
+	    else if (input instanceof XSDNamedComponent)
+	    {
+	      XSDNamedComponent namedComponent = (XSDNamedComponent)input;
+	      Element element = namedComponent.getElement();
+        String name = namedComponent.getName();
+	      if (name != null)
+	      {
+	        nameText.setText(name);
+	      }
+	    }
+//	    else if (input instanceof XSDParticle)
+//	    {
+//	      XSDParticle xsdParticle = (XSDParticle)input;
+//	      String name = xsdParticle.getElement().getAttribute(XSDConstants.NAME_ATTRIBUTE);
+//	      if (name != null)
+//	      {
+//	        nameText.setText(name);
+//	      }
+//	    }
+      else if (input instanceof XSDAttributeDeclaration)
+      {
+        XSDAttributeDeclaration attribute = (XSDAttributeDeclaration)input;
+        //String name = attribute.getName();
+        Element element = attribute.getElement();
+        String name = element.getAttribute(XSDConstants.NAME_ATTRIBUTE);
+        if (name != null)
+	      {
+	        nameText.setText(name);
+	      }
+      }
+	    else if (input instanceof XSDAttributeUse)
+      {
+        XSDAttributeUse attributeUse = (XSDAttributeUse)input;
+        XSDAttributeDeclaration attribute = attributeUse.getAttributeDeclaration();
+        String name = attribute.getName();
+        if (name != null)
+	      {
+	        nameText.setText(name);
+	      }
+      }
+//	    else if (input instanceof Element)
+//	    {
+//	      String name = ((Element)input).getAttribute(XSDConstants.NAME_ATTRIBUTE);
+//	      if (name == null) name = "";
+//	      nameText.setText(name);
+//	    }
+	  }
+	  setListenerEnabled(true);
+	}
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#shouldUseExtraSpace()
+   */
+  public boolean shouldUseExtraSpace()
+  {
+    return false;
+  }
+
+	private void doReferentialIntegrityCheck(XSDComponent xsdComponent, String newValue)
+	{
+    Element element = xsdComponent.getElement();
+    if (XSDDOMHelper.inputEquals(element, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+    {
+      if (validateName(newValue))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_NAME_CHANGE"), element); //$NON-NLS-1$
+        element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+        if (xsdComponent instanceof XSDNamedComponent)
+        {
+          ((XSDNamedComponent)xsdComponent).setName(newValue);
+        }
+        
+        // now rename any references to this element
+       
+        if (xsdSchema != null)
+        {
+          XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+          if (comp != null && comp instanceof XSDElementDeclaration && comp.getContainer().equals(xsdSchema))
+          {
+            GlobalElementRenamer renamer = new GlobalElementRenamer((XSDNamedComponent)comp, newValue);
+            renamer.visitSchema(xsdSchema);
+          }
+        }        
+        endRecording(element);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+    {
+      if (validateName(newValue))
+      {
+	      beginRecording(XSDEditorPlugin.getXSDString("_UI_COMPLEXTYPE_NAME_CHANGE"), element); //$NON-NLS-1$
+	      if (newValue.length() > 0)
+	      {
+	        // now rename any references to this type
+	        if (xsdSchema != null)
+	        {
+	          XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+	          if (comp != null && comp instanceof XSDComplexTypeDefinition && comp.getContainer().equals(xsdSchema))
+	          {
+	            GlobalSimpleOrComplexTypeRenamer renamer = new GlobalSimpleOrComplexTypeRenamer((XSDNamedComponent)comp, newValue);
+	            renamer.visitSchema(xsdSchema);
+	          }
+	        }
+	        element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+	        ((XSDNamedComponent)xsdComponent).setName(newValue);
+	      }
+	      else
+	      {
+	        element.removeAttribute(XSDConstants.NAME_ATTRIBUTE);
+	      }
+      endRecording(element);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+    {
+      beginRecording(XSDEditorPlugin.getXSDString("_UI_SIMPLETYPE_NAME_CHANGE"), element);
+      if (validateName(newValue))
+      {
+        // now rename any references to this type
+        if (newValue.length() > 0)
+        {
+          if (xsdSchema != null)
+          {
+            XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+            if (comp != null && comp instanceof XSDSimpleTypeDefinition && comp.getContainer().equals(xsdSchema))
+            {
+              GlobalSimpleOrComplexTypeRenamer renamer = new GlobalSimpleOrComplexTypeRenamer((XSDNamedComponent)comp, newValue);
+              renamer.visitSchema(xsdSchema);
+            }
+          }
+//          element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+        }
+        else
+        {
+          element.setAttribute(XSDConstants.NAME_ATTRIBUTE, "");
+        }
+      }
+      endRecording(element);
+
+    }
+    else if (XSDDOMHelper.inputEquals(element, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+    {  
+      beginRecording(XSDEditorPlugin.getXSDString("_UI_ATTRIBUTE_NAME_CHANGE"), element); //$NON-NLS-1$
+      // now rename any references to this element
+      if (xsdSchema != null)
+       {
+        XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+        if (comp != null && comp instanceof XSDAttributeDeclaration && comp.getContainer().equals(xsdSchema))
+        {
+          GlobalAttributeRenamer renamer = new GlobalAttributeRenamer((XSDNamedComponent)comp, newValue);
+          renamer.visitSchema(xsdSchema);
+        }
+      }
+      // element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+      endRecording(element);
+    }
+    else if (XSDDOMHelper.inputEquals(element, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, false))
+    {  
+      beginRecording(XSDEditorPlugin.getXSDString("_UI_ATTRIBUTEGROUP_NAME_CHANGE"), element); //$NON-NLS-1$
+      ((XSDNamedComponent)xsdComponent).setName(newValue);
+      // now rename any references to this element
+      if (xsdSchema != null)
+      {
+        XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+        if (comp != null && comp instanceof XSDAttributeGroupDefinition && comp.getContainer().equals(xsdSchema))
+        {
+          GlobalAttributeGroupRenamer renamer = new GlobalAttributeGroupRenamer((XSDNamedComponent)comp, newValue);
+          renamer.visitSchema(xsdSchema);
+        }
+      }
+      endRecording(element);
+    }
+    else if (XSDDOMHelper.inputEquals(element, XSDConstants.UNIQUE_ELEMENT_TAG, false))
+    {
+      if (validateName(newValue))
+       {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_UNIQUE_NAME_CHANGE"), element); //$NON-NLS-1$
+        if (newValue.length() > 0)
+        {
+          element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+        }
+        else
+        {
+          element.setAttribute(XSDConstants.NAME_ATTRIBUTE, ""); //$NON-NLS-1$
+        }
+        endRecording(element);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(element, XSDConstants.KEY_ELEMENT_TAG, false))
+    {
+      if (validateName(newValue))
+      {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_KEY_NAME_CHANGE"), element); //$NON-NLS-1$
+        if (newValue.length() > 0)
+        {
+          element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+        }
+        else
+        {
+          element.setAttribute(XSDConstants.NAME_ATTRIBUTE, ""); //$NON-NLS-1$
+        }
+        endRecording(element);
+      }
+    }
+    else if (XSDDOMHelper.inputEquals(element, XSDConstants.GROUP_ELEMENT_TAG, false))
+    {
+      if (validateName(newValue))
+       {
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_GROUP_NAME_CHANGE"), element); //$NON-NLS-1$
+        // now rename any references to this element
+        if (xsdSchema != null)
+         {
+          XSDConcreteComponent comp = xsdSchema.getCorrespondingComponent(element);
+          if (comp != null && comp instanceof XSDModelGroupDefinition && comp.getContainer().equals(xsdSchema))
+          {
+            GlobalGroupRenamer renamer = new GlobalGroupRenamer((XSDNamedComponent)comp, newValue);
+            renamer.visitSchema(xsdSchema);
+          }
+        }
+        element.setAttribute(XSDConstants.NAME_ATTRIBUTE, newValue);
+        endRecording(element);
+      }
+      
+    }
+    
+
+
+	}
+
+  boolean checkForAnonymousType(Element element)
+  {
+    Object parentElement = (Object)element.getParentNode();
+    boolean isAnonymous = false;
+    if (parentElement != null)
+    {
+      if (XSDDOMHelper.inputEquals(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+      {
+        if (XSDDOMHelper.inputEquals(parentElement, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+        {
+          isAnonymous = true; 
+        }
+      }
+      else if (XSDDOMHelper.inputEquals(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+      {
+        if (XSDDOMHelper.inputEquals(parentElement, XSDConstants.RESTRICTION_ELEMENT_TAG, false) ||
+            XSDDOMHelper.inputEquals(parentElement, XSDConstants.ELEMENT_ELEMENT_TAG, false) ||
+            XSDDOMHelper.inputEquals(parentElement, XSDConstants.UNION_ELEMENT_TAG, false) ||
+            XSDDOMHelper.inputEquals(parentElement, XSDConstants.LIST_ELEMENT_TAG, false) ||
+            XSDDOMHelper.inputEquals(parentElement, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+        {
+          isAnonymous = true;
+        }
+      }
+    }
+    return isAnonymous;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NameSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NameSectionDescriptor.java
new file mode 100644
index 0000000..f2f7144
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NameSectionDescriptor.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.wst.common.ui.properties.ISectionDescriptor;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class NameSectionDescriptor extends AbstractSectionDescriptor implements ISectionDescriptor
+{
+  /**
+   * 
+   */
+  public NameSectionDescriptor()
+  {
+    super();
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.name";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDNamedComponent.class);
+    list.add(XSDAttributeUse.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new NameSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.general";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDNamedComponent)
+      {
+        XSDNamedComponent namedComponent = (XSDNamedComponent)object;
+        Element element = namedComponent.getElement();
+        
+        if (inputEquals(element, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false) ||
+            inputEquals(element, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+        {
+          return false;
+        }
+        
+        // don't want to show editable name section for ref's
+        // need to show ref section with a combobox
+        
+        if (namedComponent instanceof XSDElementDeclaration)
+        {
+          if (((XSDElementDeclaration)namedComponent).isElementDeclarationReference())
+          {
+            return false;
+          }
+          else
+          {
+            return true;
+          }
+        }
+        else if (namedComponent instanceof XSDAttributeDeclaration)
+        {
+          if (((XSDAttributeDeclaration)namedComponent).isAttributeDeclarationReference())
+          {
+            return false;
+          }
+          else
+          {
+            return true;
+          }
+        }
+
+        if (element != null)
+        {
+          if (inputEquals(element, element.getLocalName(), true))
+          {
+            return false;
+          }
+          else
+          {
+            return true;
+          }
+        }
+      }
+//      else if (object instanceof XSDParticle)
+//      {
+//        XSDParticle particle = (XSDParticle)object;
+//        Element element = particle.getElement();
+//        if (inputEquals(element, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+//        {
+//          return true;
+//        }
+//        else if (inputEquals(element, XSDConstants.ELEMENT_ELEMENT_TAG, true))
+//        {
+//          return false;
+//        }
+//        else
+//        {
+//          return false;
+//        }
+//      }
+      else if (object instanceof XSDAttributeUse)
+      {
+        XSDAttributeUse attributeUse = (XSDAttributeUse)object;
+        XSDAttributeDeclaration attribute = attributeUse.getAttributeDeclaration();
+        Element element = attributeUse.getElement();
+        if (inputEquals(element, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+        {
+          return true;
+        }
+        else
+        {
+          return false;
+        }
+      }
+
+    }
+
+    return false;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceAndSchemaLocationDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceAndSchemaLocationDescriptor.java
new file mode 100644
index 0000000..5a47fa8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceAndSchemaLocationDescriptor.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDImport;
+
+public class NamespaceAndSchemaLocationDescriptor extends AbstractSectionDescriptor
+{
+	  NamespaceAndSchemaLocationSection namespaceAndSchemaLocationSection;
+	  /**
+	   * 
+	   */
+	  public NamespaceAndSchemaLocationDescriptor()
+	  {
+	    super();
+	    namespaceAndSchemaLocationSection = new NamespaceAndSchemaLocationSection();
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+	   */
+	  public String getId()
+	  {
+	    return "com.ibm.xsdeditor.section.namespaceAndSchemaLocationSection";
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+	   */
+	  public List getInputTypes()
+	  {
+	    List list = new ArrayList();
+	    list.add(XSDConcreteComponent.class);
+	    return list;
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+	   */
+	  public ISection getSectionClass()
+	  {
+	    return namespaceAndSchemaLocationSection;
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+	   */
+	  public String getTargetTab()
+	  {
+	    return "com.ibm.xmlwebservices.general";
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+	   */
+	  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+	  {
+	    Object object = null;	    
+	    
+	    if (selection instanceof StructuredSelection)
+	    {
+	      StructuredSelection structuredSelection = (StructuredSelection)selection;
+	      object = structuredSelection.getFirstElement();
+	      if (object instanceof XSDImport) {
+		    return true;
+	      }
+	    }
+	    
+	    return false;
+	  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceAndSchemaLocationSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceAndSchemaLocationSection.java
new file mode 100644
index 0000000..2fdc737
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceAndSchemaLocationSection.java
@@ -0,0 +1,345 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+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.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.common.ui.viewers.ResourceFilter;
+import org.eclipse.wst.xml.uriresolver.util.URIHelper;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.refactor.delete.XSDExternalFileCleanup;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDSchemaHelper;
+import org.eclipse.wst.xsd.ui.internal.wizards.XSDSelectIncludeFileWizard;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDImport;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.impl.XSDImportImpl;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class NamespaceAndSchemaLocationSection extends AbstractSection
+{
+  Text schemaLocationText;
+	Text namespaceText, prefixText;
+	Button wizardButton;
+  protected String oldPrefixValue;
+	  
+	public NamespaceAndSchemaLocationSection()
+  {
+		super();
+	}
+	
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		Composite composite = getWidgetFactory().createFlatFormComposite(parent);
+
+		CLabel namespaceLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_NAMESPACE")); //$NON-NLS-1$
+    namespaceText = getWidgetFactory().createText(composite, "", SWT.NONE); //$NON-NLS-1$
+		namespaceText.setEditable(false);
+
+    FormData data = new FormData();
+    data.left = new FormAttachment(0, 0);
+    data.right = new FormAttachment(namespaceText, +ITabbedPropertyConstants.HSPACE);
+    data.top = new FormAttachment(namespaceText, 0, SWT.CENTER);
+    namespaceLabel.setLayoutData(data);
+    
+    data = new FormData();
+    data.left = new FormAttachment(0, 110);
+    data.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+    data.top = new FormAttachment(0, 0);
+    namespaceText.setLayoutData(data);
+
+    
+		CLabel prefixLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_PREFIX")); //$NON-NLS-1$				
+		prefixText = getWidgetFactory().createText(composite, "", SWT.NONE); //$NON-NLS-1$
+		prefixText.setEditable(true);
+    prefixText.addListener(SWT.Modify, this);
+
+    data = new FormData();
+    data.left = new FormAttachment(0, 0);
+    data.right = new FormAttachment(prefixText, 0);
+    data.top = new FormAttachment(prefixText, 0, SWT.CENTER);
+    prefixLabel.setLayoutData(data);  
+    
+		data = new FormData();
+		data.left = new FormAttachment(0, 110);
+		data.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(namespaceText, +ITabbedPropertyConstants.VSPACE);
+		prefixText.setLayoutData(data);
+
+		// Create Schema Location Label
+		CLabel schemaLocationLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_SCHEMA_LOCATION")); //$NON-NLS-1$
+    schemaLocationText = getWidgetFactory().createText(composite, "", SWT.NONE); //$NON-NLS-1$
+
+		// Create Wizard Button
+		wizardButton = getWidgetFactory().createButton(composite, "", SWT.NONE); //$NON-NLS-1$
+    wizardButton.setImage(XSDEditorPlugin.getXSDImage("icons/browsebutton.gif")); //$NON-NLS-1$
+		FormData buttonFormData = new FormData();
+		buttonFormData.left = new FormAttachment(100, -rightMarginSpace + 2);
+		buttonFormData.right = new FormAttachment(100, 0);
+		buttonFormData.top = new FormAttachment(schemaLocationText, 0, SWT.CENTER);
+		wizardButton.setLayoutData(buttonFormData);
+		wizardButton.addSelectionListener(this);
+		
+		// Create Schema Location Text
+		schemaLocationText.setEditable(false);
+		FormData schemaLocationData = new FormData();
+		schemaLocationData.left = new FormAttachment(0, 110);
+		schemaLocationData.right = new FormAttachment(wizardButton, 0);
+		schemaLocationData.top = new FormAttachment(prefixText, +ITabbedPropertyConstants.VSPACE);
+		schemaLocationText.setLayoutData(schemaLocationData);
+		schemaLocationText.addListener(SWT.Modify, this);
+    
+    data = new FormData();
+    data.left = new FormAttachment(0, 0);
+    data.right = new FormAttachment(schemaLocationText, 0);
+    data.top = new FormAttachment(schemaLocationText, 0, SWT.CENTER);
+    schemaLocationLabel.setLayoutData(data);
+   
+  }
+	
+	public void widgetSelected(SelectionEvent event)
+  {
+		if (event.widget == wizardButton)
+    {
+      setListenerEnabled(false);
+			Shell shell = Display.getCurrent().getActiveShell();
+		    
+			IFile currentIFile = ((IFileEditorInput)getActiveEditor().getEditorInput()).getFile();
+			ViewerFilter filter = new ResourceFilter(new String[] { ".xsd" }, //$NON-NLS-1$ 
+		            new IFile[] { currentIFile },
+		            null);
+		      
+			XSDSelectIncludeFileWizard fileSelectWizard = 
+			   new XSDSelectIncludeFileWizard(xsdSchema, 
+                                        false,
+			                                  XSDEditorPlugin.getXSDString("_UI_FILEDIALOG_SELECT_XML_SCHEMA"), //$NON-NLS-1$
+			                                  XSDEditorPlugin.getXSDString("_UI_FILEDIALOG_SELECT_XML_DESC"), //$NON-NLS-1$
+			                                  filter,
+			                                  (IStructuredSelection) selection);
+
+			WizardDialog wizardDialog = new WizardDialog(shell, fileSelectWizard);
+			wizardDialog.create();
+			wizardDialog.setBlockOnOpen(true);
+			int result = wizardDialog.open();
+			  
+		  String value = schemaLocationText.getText();
+      prefixText.removeListener(SWT.Modify, this);
+		  if (result == Window.OK)
+		  {
+		    IFile selectedIFile = fileSelectWizard.getResultFile();
+		    String schemaFileString = value;
+		    if (selectedIFile != null) 
+		    {
+		      schemaFileString = URIHelper.getRelativeURI(selectedIFile.getLocation(), currentIFile.getLocation());
+		    }
+		    else
+		    {
+		      schemaFileString = fileSelectWizard.getURL();
+		    }
+        
+        XSDConcreteComponent comp = (XSDConcreteComponent)getInput();
+        if (comp instanceof XSDImport)
+        {
+          XSDImport xsdImport = (XSDImport)comp;
+          Element importElement = comp.getElement();
+          
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_IMPORT_CHANGE"), importElement);
+          
+          String namespace = fileSelectWizard.getNamespace();
+          if (namespace == null) namespace = "";
+          XSDSchema externalSchema = fileSelectWizard.getExternalSchema();
+
+          xsdImport.setNamespace(namespace);
+          xsdImport.setSchemaLocation(schemaFileString);
+          xsdImport.setResolvedSchema(externalSchema);
+          
+          java.util.Map map = xsdSchema.getQNamePrefixToNamespaceMap();
+          
+//          System.out.println("changed Import Map is " + map.values());
+//          System.out.println("changed import Map keys are " + map.keySet());
+
+          // Referential integrity on old import
+          // How can we be sure that if the newlocation is the same as the oldlocation
+          // the file hasn't changed
+          
+          XSDSchema referencedSchema = xsdImport.getResolvedSchema();
+          if (referencedSchema != null)
+          {
+            XSDExternalFileCleanup cleanHelper = new XSDExternalFileCleanup(referencedSchema);
+            cleanHelper.visitSchema(xsdSchema);
+          }
+
+          Element schemaElement = getSchema().getElement();
+
+          // update the xmlns in the schema element first, and then update the import element next
+          // so that the last change will be in the import element.  This keeps the selection
+          // on the import element
+          TypesHelper helper = new TypesHelper(externalSchema);
+          String prefix = helper.getPrefix(namespace, false);
+          
+          if (map.containsKey(prefix))
+          {
+            prefix = null;
+          }
+
+          if (prefix == null || (prefix !=null && prefix.length() == 0))
+          {
+            StringBuffer newPrefix = new StringBuffer("pref");  //$NON-NLS-1$
+            int prefixExtension = 1;
+            while (map.containsKey(newPrefix.toString()) && prefixExtension < 100)
+            {
+              newPrefix = new StringBuffer("pref" + String.valueOf(prefixExtension));
+              prefixExtension++;
+            }
+            prefix = newPrefix.toString();
+          }
+
+          if (namespace.length() > 0)
+          {
+            // if ns already in map, use its corresponding prefix
+            if (map.containsValue(namespace))
+            {
+              TypesHelper typesHelper = new TypesHelper(xsdSchema);
+              prefix = typesHelper.getPrefix(namespace, false);
+            }
+            else // otherwise add to the map
+            {
+              schemaElement.setAttribute("xmlns:"+prefix, namespace);
+            }
+            prefixText.setText(prefix);
+          }
+          else
+          {
+            prefixText.setText("");
+            namespaceText.setText("");
+          }
+            
+          endRecording(importElement);
+          
+//          System.out.println("changed Import Map is " + map.values());
+//          System.out.println("changed import Map keys are " + map.keySet());
+
+        }        
+				refresh();
+		  }
+      setListenerEnabled(true);
+      prefixText.addListener(SWT.Modify, this);
+		}
+	}
+
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+		if (doRefresh)
+		{
+			setListenerEnabled(false);
+
+			Element element = null;
+			if (input instanceof XSDImport) { 
+				element = ((XSDImportImpl) input).getElement();
+				
+				String namespace = element.getAttribute("namespace"); //$NON-NLS-1$
+				String schemaLocation = element.getAttribute("schemaLocation"); //$NON-NLS-1$
+				
+				TypesHelper helper = new TypesHelper(xsdSchema);
+		        String prefix = helper.getPrefix(element.getAttribute(XSDConstants.NAMESPACE_ATTRIBUTE), false);
+
+				if (namespace == null) {
+					namespace = ""; //$NON-NLS-1$
+				}
+				if (prefix == null) {
+					prefix = ""; //$NON-NLS-1$
+				}
+				if (schemaLocation == null) {
+					schemaLocation = ""; //$NON-NLS-1$
+				}
+				
+				namespaceText.setText(namespace);
+				prefixText.setText(prefix);
+				schemaLocationText.setText(schemaLocation);
+        oldPrefixValue = prefixText.getText();
+			}
+
+			setListenerEnabled(true);
+		}
+	}
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#shouldUseExtraSpace()
+   */
+  public boolean shouldUseExtraSpace()
+  {
+    return true;
+  }
+
+  public void doHandleEvent(Event event)
+  {
+    if (event.type == SWT.Modify)
+    {
+      if (event.widget == prefixText)
+      {
+        if (validatePrefix(prefixText.getText()) && schemaLocationText.getText().trim().length() > 0)
+        {
+          Element element = ((XSDConcreteComponent)getInput()).getElement();
+          Map map = getSchema().getQNamePrefixToNamespaceMap();
+
+          if (map.containsKey(prefixText.getText()))
+          {
+            setErrorMessage(XSDEditorPlugin.getXSDString("_ERROR_LABEL_PREFIX_EXISTS"));
+          }
+          else
+          {
+            beginRecording(XSDEditorPlugin.getXSDString("_UI_PREFIX_CHANGE"), element);
+            
+            Element schemaElement = getSchema().getElement();
+            schemaElement.removeAttribute("xmlns:"+oldPrefixValue);
+            schemaElement.setAttribute("xmlns:" + prefixText.getText(), namespaceText.getText());
+            XSDSchemaHelper.updateElement(getSchema());
+
+            clearErrorMessage();
+            oldPrefixValue = prefixText.getText();
+            endRecording(element);  
+
+//            System.out.println("Map is " + map.values());
+//            System.out.println("Map keys are " + map.keySet());
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceProcessContentsSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceProcessContentsSection.java
new file mode 100644
index 0000000..6deaca9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceProcessContentsSection.java
@@ -0,0 +1,196 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDProcessContents;
+import org.eclipse.xsd.XSDWildcard;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class NamespaceProcessContentsSection extends AbstractSection
+{
+  CCombo namespaceCombo;
+  CCombo processContentsCombo;
+  
+  private String[] namespaceComboValues = {
+      "",               //$NON-NLS-1$
+      "##any",          //$NON-NLS-1$
+      "##other",        //$NON-NLS-1$
+      "##targetNamespace", //$NON-NLS-1$
+      "##local" //$NON-NLS-1$
+  };
+
+  /**
+   * 
+   */
+  public NamespaceProcessContentsSection()
+  {
+    super();
+  }
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent,TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		Composite composite =	getWidgetFactory().createFlatFormComposite(parent);
+		FormData data;
+		
+
+		namespaceCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT);
+		data = new FormData();
+		data.left = new FormAttachment(0, 100);
+		data.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(0, 0);
+		namespaceCombo.setLayoutData(data);
+//		Iterator list = XSDNamespaceConstraintCategory.VALUES.iterator();
+//		while (list.hasNext())
+//		{
+//		  namespaceCombo.add(((XSDNamespaceConstraintCategory)list.next()).getName());
+//		}
+		namespaceCombo.setItems(namespaceComboValues);
+		namespaceCombo.addSelectionListener(this);
+
+		CLabel namespaceLabel = getWidgetFactory().createCLabel(composite, XSDConstants.NAMESPACE_ATTRIBUTE);
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(namespaceCombo, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(namespaceCombo, 0, SWT.CENTER);
+		namespaceLabel.setLayoutData(data);
+
+		processContentsCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT);
+		data = new FormData();
+		data.left = new FormAttachment(0, 100);
+		data.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(namespaceCombo, +ITabbedPropertyConstants.VSPACE);
+		processContentsCombo.setLayoutData(data);
+		Iterator list = XSDProcessContents.VALUES.iterator();
+		processContentsCombo.add(""); //$NON-NLS-1$
+		while (list.hasNext())
+		{
+		  processContentsCombo.add(((XSDProcessContents)list.next()).getName());
+		}
+		processContentsCombo.addSelectionListener(this);
+
+		CLabel processContentsLabel = getWidgetFactory().createCLabel(composite, XSDConstants.PROCESSCONTENTS_ATTRIBUTE);
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(processContentsCombo, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(processContentsCombo, 0, SWT.CENTER);
+		processContentsLabel.setLayoutData(data);
+	}
+
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+//	  namespaceCombo.removeSelectionListener(this);
+//	  processContentsCombo.removeSelectionListener(this);
+	  namespaceCombo.setText(""); //$NON-NLS-1$
+	  processContentsCombo.setText(""); //$NON-NLS-1$
+	  Object input = getInput();
+	  if (input != null)
+	  {
+	    if (input instanceof XSDWildcard)
+	    {
+	      XSDWildcard wildcard = (XSDWildcard)input;
+	      List listNS = wildcard.getNamespaceConstraint();
+	      if (wildcard.isSetLexicalNamespaceConstraint())
+	      {
+	        namespaceCombo.setText(wildcard.getStringLexicalNamespaceConstraint());
+	      }
+	      else
+	      {
+	        namespaceCombo.setText("");
+	      }
+	      if (wildcard.isSetProcessContents())
+	      {
+	        XSDProcessContents pc = wildcard.getProcessContents();
+	        processContentsCombo.setText(pc.getName());
+	      }
+	    }
+	  }
+//	  namespaceCombo.addSelectionListener(this);
+//	  processContentsCombo.addSelectionListener(this);
+	}
+	
+  public boolean shouldUseExtraSpace()
+  {
+    return false;
+  }
+
+  public void widgetSelected(SelectionEvent e)
+  {
+    XSDConcreteComponent concreteComponent = (XSDConcreteComponent)getInput();
+    Element element = concreteComponent.getElement();
+    if (concreteComponent instanceof XSDWildcard)
+    {
+      XSDWildcard wildcard =  (XSDWildcard)concreteComponent;
+      if (e.widget == namespaceCombo)
+      {
+        String newValue = namespaceCombo.getText();
+        boolean removeAttribute = false;
+        if (newValue.length() == 0)
+        {
+          removeAttribute = true;
+        }
+
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_NAMESPACE_CHANGE"), element); //$NON-NLS-1$
+        if (removeAttribute)
+        {
+          wildcard.unsetLexicalNamespaceConstraint();
+        }
+        else
+        {
+          wildcard.setStringLexicalNamespaceConstraint(newValue);
+        }
+        endRecording(element);
+      }
+      else if (e.widget == processContentsCombo)
+      {
+        String newValue = processContentsCombo.getText();
+        boolean removeAttribute = false;
+        if (newValue.length() == 0)
+        {
+          removeAttribute = true;
+        }
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_PROCESSCONTENTS_CHANGE"), element); //$NON-NLS-1$
+        if (removeAttribute)
+        {
+          wildcard.unsetProcessContents();
+        }
+        else
+        {
+          wildcard.setProcessContents(XSDProcessContents.get(processContentsCombo.getItem(processContentsCombo.getSelectionIndex())));
+        }
+        endRecording(element);
+      }
+    }
+    refresh();
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceProcessContentsSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceProcessContentsSectionDescriptor.java
new file mode 100644
index 0000000..2198f2e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceProcessContentsSectionDescriptor.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDWildcard;
+
+public class NamespaceProcessContentsSectionDescriptor extends AbstractSectionDescriptor
+{
+  /**
+   * 
+   */
+  public NamespaceProcessContentsSectionDescriptor()
+  {
+    super();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.namespaceprocesscontents";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDWildcard.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new NamespaceProcessContentsSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.general";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDWildcard)
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceSection.java
new file mode 100644
index 0000000..e3a667a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceSection.java
@@ -0,0 +1,430 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Map;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xml.core.internal.document.DocumentImpl;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.actions.XSDEditNamespacesAction;
+import org.eclipse.wst.xsd.ui.internal.refactor.rename.TargetNamespaceChangeHandler;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDSchemaHelper;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+public class NamespaceSection extends AbstractSection
+{
+	  IWorkbenchPart part;
+	  Text prefixText;
+	  Text targetNamespaceText;
+    Button editButton;
+    StyledText errorText;
+    Color red;
+	  
+	  /**
+	   * 
+	   */
+	  public NamespaceSection()
+	  {
+	    super();
+	  }
+
+		/**
+		 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+		 */
+		public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+		{
+			super.createControls(parent, factory);
+			Composite composite = getWidgetFactory().createFlatFormComposite(parent);
+      
+			// Create Prefix Label
+			CLabel prefixLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_SCHEMA_PREFIX")); //$NON-NLS-1$
+
+      int leftCoordinate = getStandardLabelWidth(composite, 
+          new String[] {XSDEditorPlugin.getXSDString("_UI_LABEL_TARGET_NAME_SPACE"), XSDEditorPlugin.getXSDString("_UI_LABEL_SCHEMA_PREFIX")});
+      
+			// Create Prefix Text
+			prefixText = getWidgetFactory().createText(composite, "", SWT.NONE); //$NON-NLS-1$
+			FormData prefixTextData = new FormData();
+			// prefixTextData.left = new FormAttachment(0, 115);
+      prefixTextData.left = new FormAttachment(0, leftCoordinate);
+			prefixTextData.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+			prefixText.setLayoutData(prefixTextData);
+			prefixText.addListener(SWT.Modify, this);		    
+		    
+			FormData data = new FormData();
+			data.left = new FormAttachment(0, 0);
+			data.right = new FormAttachment(prefixText, -ITabbedPropertyConstants.HSPACE);
+      data.top = new FormAttachment(prefixText, 0, SWT.CENTER);
+			prefixLabel.setLayoutData(data);
+
+			// Create TargetNamespace Label
+			CLabel targetNamespaceLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_TARGET_NAME_SPACE")); //$NON-NLS-1$
+      
+      // Create TargetNamespace Text
+      targetNamespaceText = getWidgetFactory().createText(composite, "", SWT.NONE); //$NON-NLS-1$
+      
+			FormData tnsLabelData = new FormData();
+			tnsLabelData.left = new FormAttachment(0, 0);
+      tnsLabelData.right = new FormAttachment(targetNamespaceText, -ITabbedPropertyConstants.HSPACE); 
+			tnsLabelData.top = new FormAttachment(targetNamespaceText, 0, SWT.CENTER);
+			targetNamespaceLabel.setLayoutData(tnsLabelData);
+
+      FormData tnsTextData = new FormData();
+      // tnsTextData.left = new FormAttachment(0, 115);
+      tnsTextData.left = new FormAttachment(0, leftCoordinate);
+      tnsTextData.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+      tnsTextData.top = new FormAttachment(prefixText, +ITabbedPropertyConstants.VSPACE);
+      targetNamespaceText.setLayoutData(tnsTextData);
+      targetNamespaceText.addListener(SWT.Modify, this);
+      
+      // Advanced Button
+      editButton = getWidgetFactory().createButton(composite, XSDEditorPlugin.getXSDString("_UI_SECTION_ADVANCED_ATTRIBUTES") + "...", SWT.PUSH);
+
+      FormData buttonFormData = new FormData();
+      buttonFormData.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+      buttonFormData.top = new FormAttachment(targetNamespaceText, +ITabbedPropertyConstants.VSPACE);
+      editButton.setLayoutData(buttonFormData);
+      editButton.addSelectionListener(this);
+
+      // error text
+      errorText = new StyledText(composite, SWT.FLAT);
+      errorText.setEditable(false);
+      errorText.setEnabled(false);
+      errorText.setText("");
+      
+      data = new FormData();
+      data.left = new FormAttachment(targetNamespaceText, 0, SWT.LEFT);
+      data.right = new FormAttachment(100, 0);
+      data.top = new FormAttachment(editButton, 0);
+      errorText.setLayoutData(data);
+    }
+
+		/*
+		 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+		 */
+		public void refresh()
+		{
+      if (doRefresh)
+      {
+        // hack...open bug against properties
+        if (prefixText.isDisposed() || targetNamespaceText.isDisposed())
+        {
+          return;
+        }
+        if (prefixText.isFocusControl() || targetNamespaceText.isFocusControl())
+        {
+          return;
+        }
+
+        setListenerEnabled(false);
+	    	 
+			  Element element = xsdSchema.getElement();
+	    	 
+		    // Handle prefixText
+			  TypesHelper helper = new TypesHelper(xsdSchema);
+  		  String aPrefix = helper.getPrefix(element.getAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE), false);
+      
+        if (aPrefix != null && aPrefix.length() > 0)
+	      {
+	  	  	prefixText.setText(aPrefix);
+	  	  }
+	  	  else
+        {
+			  	prefixText.setText(""); //$NON-NLS-1$
+			  }
+	    	 
+				// Handle TargetNamespaceText
+				String tns = element.getAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE);
+			  if (tns != null && tns.length() > 0)
+        {
+ 	        targetNamespaceText.setText(tns);
+ 	      }
+			  else
+        {
+				  targetNamespaceText.setText(""); //$NON-NLS-1$
+			  }
+        errorText.setText("");
+
+				setListenerEnabled(true);
+			}
+		}
+		
+		public void doHandleEvent(Event event)
+		{
+      errorText.setText("");
+      String prefixValue = prefixText.getText();
+      String tnsValue = targetNamespaceText.getText();
+      if (tnsValue.trim().length() == 0)
+      {
+        if (prefixValue.trim().length() > 0)
+        {
+          errorText.setText(XSDEditorPlugin.getXSDString("_ERROR_TARGET_NAMESPACE_AND_PREFIX"));
+          int length = errorText.getText().length();
+          red = new Color(null, 255, 0, 0);
+          StyleRange style = new StyleRange(0, length, red, targetNamespaceText.getBackground());
+          errorText.setStyleRange(style);
+          return;
+        }
+      }
+
+		  if (event.widget == prefixText)
+		  {
+        updateNamespaceInfo(prefixValue, tnsValue);
+		  }
+		  else if (event.widget == targetNamespaceText)
+      {
+		  	TypesHelper helper = new TypesHelper(xsdSchema);
+			  String aPrefix = helper.getPrefix(xsdSchema.getElement().getAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE), false);
+		  	// updateNamespaceInfo(aPrefix, tnsValue);
+        updateNamespaceInfo(prefixValue, tnsValue);
+		  }
+		}
+		
+		public void doWidgetSelected(SelectionEvent e) {
+			if (e.widget == editButton) {
+				XSDEditNamespacesAction nsAction = new XSDEditNamespacesAction(XSDEditorPlugin.getXSDString("_UI_ACTION_EDIT_NAMESPACES"), xsdSchema.getElement(), null, xsdSchema); //$NON-NLS-1$ 
+				nsAction.run();
+				refresh();				
+			}			
+		}
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISection#shouldUseExtraSpace()
+	   */
+	  public boolean shouldUseExtraSpace()
+	  {
+	    return true;
+	  }
+
+	  private void updateNamespaceInfo(String newPrefix, String newTargetNamespace)
+	  {
+	    Element element = xsdSchema.getElement();
+	    DocumentImpl doc = (DocumentImpl)element.getOwnerDocument();
+
+	    String modelTargetNamespace = xsdSchema.getTargetNamespace();
+	    String oldNamespace = xsdSchema.getTargetNamespace();
+	    
+	    TypesHelper helper = new TypesHelper(xsdSchema);
+   		String oldPrefix = helper.getPrefix(element.getAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE), false);
+	    
+	    if (modelTargetNamespace == null)
+	    {
+	      modelTargetNamespace = ""; //$NON-NLS-1$
+	    }
+	        
+	    String targetNamespace = newTargetNamespace.trim(); 
+	    String prefix = newPrefix.trim();
+
+	    if (!validatePrefix(prefix) || !validateTargetNamespace(targetNamespace))
+	    {
+	      return;
+	    }
+	        
+	    if (prefix.length() > 0 && targetNamespace.length() == 0)
+	    {
+	       // can't have blank targetnamespace and yet specify a prefix
+	       return;
+	    }
+
+	    doc.getModel().beginRecording(this, XSDEditorPlugin.getXSDString("_UI_TARGETNAMESPACE_CHANGE")); //$NON-NLS-1$
+	    String xsdForXSDPrefix = xsdSchema.getSchemaForSchemaQNamePrefix();
+	    Map map = xsdSchema.getQNamePrefixToNamespaceMap();
+
+//	 For debugging
+//	        System.out.println("1. SW Map is " + map.values());
+//	        System.out.println("1. SW Map keys are " + map.keySet());
+
+	    // Check if prefix is blank
+	    // if it is, then make sure we have a prefix 
+	    // for schema for schema
+	    if (prefix.length() == 0)
+	    {
+	      // if prefix for schema for schema is blank
+	      // then set it to value specified in preference
+	      // and update ALL nodes with this prefix
+	      if (xsdForXSDPrefix == null || (xsdForXSDPrefix != null && xsdForXSDPrefix.trim().length() == 0))
+	      {
+	        // get preference prefix
+	        xsdForXSDPrefix = XSDEditorPlugin.getPlugin().getXMLSchemaPrefix();
+	        // get a unique prefix by checking what's in the map
+
+	        xsdForXSDPrefix = getUniqueSchemaForSchemaPrefix(xsdForXSDPrefix, map);
+	        element.setAttribute("xmlns:" + xsdForXSDPrefix, XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001); //$NON-NLS-1$
+
+	        updateAllNodes(element, xsdForXSDPrefix);
+	            
+	        // remove the old xmlns attribute for the schema for schema
+	        if (element.getAttribute("xmlns") != null && //$NON-NLS-1$
+	            element.getAttribute("xmlns").equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001)) //$NON-NLS-1$
+	        {
+	          element.removeAttribute("xmlns"); //$NON-NLS-1$
+	        }
+	      }
+	    }
+
+	    if (targetNamespace.length() > 0 ||
+	       (targetNamespace.length() == 0 && prefix.length() == 0))
+	    {
+	      // clean up the old prefix for this schema
+	      if (oldPrefix != null && oldPrefix.length() > 0)
+	      {
+	        element.removeAttribute("xmlns:"+oldPrefix); //$NON-NLS-1$
+//	            element.setAttribute("xmlns:" + prefix, targetNamespace);
+//	            java.util.Map prefixToNameSpaceMap = xsdSchema.getQNamePrefixToNamespaceMap();
+//	            prefixToNameSpaceMap.remove(oldPrefix);
+	      }
+	      else // if no prefix
+	      {
+	        if (element.getAttribute("xmlns") != null) //$NON-NLS-1$
+	        {
+	          if (!element.getAttribute("xmlns").equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001)) //$NON-NLS-1$
+	           {
+	            element.removeAttribute("xmlns"); //$NON-NLS-1$
+	          }
+	        }
+	      }
+	    }
+
+	    if (targetNamespace.length() > 0)
+	    {
+	      if (!modelTargetNamespace.equals(targetNamespace))
+	      {
+	        element.setAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE, targetNamespace);
+	      }
+	      // now set the new xmlns:prefix attribute
+	      if (prefix.length() > 0)
+	      {
+	        element.setAttribute("xmlns:" + prefix, targetNamespace); //$NON-NLS-1$
+	      }
+	      else
+	      {
+	        element.setAttribute("xmlns", targetNamespace); //$NON-NLS-1$
+	      }
+	      // set the targetNamespace attribute
+	    }
+	    else // else targetNamespace is blank
+	    {
+	      if (prefix.length() == 0)
+	      {
+	        element.removeAttribute(XSDConstants.TARGETNAMESPACE_ATTRIBUTE);
+	      }
+	    }
+
+//	    System.out.println("1.5 SW Map is " + map.values());
+//	    System.out.println("1.5 SW Map keys are " + map.keySet());
+	    
+	    // do our own referential integrity
+	    TargetNamespaceChangeHandler targetNamespaceChangeHandler = new TargetNamespaceChangeHandler(xsdSchema, oldNamespace, targetNamespace);
+	    targetNamespaceChangeHandler.resolve();
+	    
+	    XSDSchemaHelper.updateElement(xsdSchema);
+	    
+	    doc.getModel().endRecording(this);
+
+//	 For debugging
+//	        map = xsdSchema.getQNamePrefixToNamespaceMap();
+//	        System.out.println("2. SW Map is " + map.values());
+//	        System.out.println("2. SW Map keys are " + map.keySet());
+	  }
+
+	  private String getUniqueSchemaForSchemaPrefix(String xsdForXSDPrefix, Map map)
+	  {
+	    if (xsdForXSDPrefix == null || (xsdForXSDPrefix != null && xsdForXSDPrefix.trim().length() == 0))
+	     {       
+	      xsdForXSDPrefix = "xsd"; //$NON-NLS-1$
+	    }
+	    // ensure prefix is unique
+	    int prefixExtension = 1;
+	    while (map.containsKey(xsdForXSDPrefix) && prefixExtension < 100)
+	     {
+	      xsdForXSDPrefix = xsdForXSDPrefix + String.valueOf(prefixExtension);
+	      prefixExtension++;
+	    }
+	    return xsdForXSDPrefix;
+	  }
+	  
+	  private void updateAllNodes(Element element, String prefix)
+	  {
+	    element.setPrefix(prefix);
+	    NodeList list = element.getChildNodes();
+	    if (list != null)
+	    {
+	      for (int i=0; i < list.getLength(); i++)
+	      {
+	        Node child = list.item(i);
+	        if (child != null && child instanceof Element)
+	        {
+	          child.setPrefix(prefix);
+	          if (child.hasChildNodes())
+	          {
+	            updateAllNodes((Element)child, prefix);
+	          }
+	        }
+	      }
+	    }   
+	  }
+	  
+	  private boolean validateTargetNamespace(String ns)
+	  {
+	    // will allow blank namespace !!
+	    if (ns.equals(""))
+	     {
+	      return true;
+	    }
+	    
+	    String errorMessage = null;
+      try
+      {
+        URI testURI = new URI(ns);
+      }
+      catch (URISyntaxException e)
+      {
+	      errorMessage = XSDEditorPlugin.getXSDString("_WARN_INVALID_TARGET_NAMESPACE"); //$NON-NLS-1$
+	    }
+	    
+	    if (errorMessage == null || errorMessage.length() == 0)
+	     {
+	      return true;
+	    }
+	    return false;
+	  }
+    
+    public void dispose()
+    {
+      super.dispose();
+      if (red != null)
+      {
+        red.dispose();
+        red = null;
+      }
+    }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceSectionDescriptor.java
new file mode 100644
index 0000000..c156eaa
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/NamespaceSectionDescriptor.java
@@ -0,0 +1,86 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.impl.XSDSchemaImpl;
+
+public class NamespaceSectionDescriptor extends AbstractSectionDescriptor
+{
+	  NamespaceSection namespaceSection;
+	  /**
+	   * 
+	   */
+	  public NamespaceSectionDescriptor()
+	  {
+	    super();
+	    namespaceSection = new NamespaceSection();
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+	   */
+	  public String getId()
+	  {
+	    return "com.ibm.xsdeditor.section.namespaceSection";
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+	   */
+	  public List getInputTypes()
+	  {
+	    List list = new ArrayList();
+	    list.add(XSDConcreteComponent.class);
+	    return list;
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+	   */
+	  public ISection getSectionClass()
+	  {
+	    return namespaceSection;
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+	   */
+	  public String getTargetTab()
+	  {
+	    return "com.ibm.xmlwebservices.general";
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+	   */
+	  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+	  {
+	    Object object = null;
+	    if (selection instanceof StructuredSelection)
+	    {
+	      StructuredSelection structuredSelection = (StructuredSelection)selection;
+	      object = structuredSelection.getFirstElement();
+	      if (object instanceof XSDSchemaImpl) {
+	      	return true;
+	      }
+	    }
+	    
+	    return false;
+	  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/OtherAttributesSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/OtherAttributesSection.java
new file mode 100644
index 0000000..7309ced
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/OtherAttributesSection.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.views.properties.PropertySheetPage;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.properties.XSDPropertySourceProvider;
+import org.eclipse.xsd.XSDElementDeclaration;
+
+public class OtherAttributesSection extends AbstractSection
+{
+  PropertySheetPage propertySheetPage;
+  IWorkbenchPart part;
+  
+  /**
+   * 
+   */
+  public OtherAttributesSection()
+  {
+    super();
+  }
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		composite = getWidgetFactory().createFlatFormComposite(parent);
+		FormData data = new FormData();
+		data.left = new FormAttachment(0, 0);
+    data.right = new FormAttachment(100, 0);
+		data.top = new FormAttachment(0, 0);
+		data.bottom = new FormAttachment(100, 0);
+    
+//    composite = new Composite(parent, SWT.FLAT);
+//    GridLayout gl = new GridLayout(1, true);
+//    composite.setLayout(gl);
+//    GridData data = new GridData();
+//    data.grabExcessHorizontalSpace = true;
+//    data.grabExcessVerticalSpace = true; 
+//    composite.setLayoutData(data);
+    
+    propertySheetPage = new PropertySheetPage();
+		propertySheetPage.createControl(composite);
+    propertySheetPage.setPropertySourceProvider(new XSDPropertySourceProvider());
+    propertySheetPage.getControl().setLayoutData(data);
+	}
+	
+	public void selectionChanged(IWorkbenchPart part, ISelection selection)
+	{
+	  this.part = part;
+	  this.selection = selection;
+	  if (propertySheetPage == null)
+	  {
+	    propertySheetPage = new PropertySheetPage();
+	  }
+	  propertySheetPage.selectionChanged(part, selection);
+	}
+  
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+    if (doRefresh)
+    {
+      if (isReadOnly)
+      {
+        composite.setEnabled(false);
+      }
+      else
+      {
+        composite.setEnabled(true);
+      }
+
+	    Object input = getInput();
+      if (!propertySheetPage.getControl().isDisposed())
+  	    propertySheetPage.selectionChanged(part, selection);
+    }
+	}
+
+  public void dispose()
+  {
+//    propertySheetPage.dispose();
+//    propertySheetPage = null;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#shouldUseExtraSpace()
+   */
+  public boolean shouldUseExtraSpace()
+  {
+    return true;
+  }
+  
+  public void setInput(IWorkbenchPart part, ISelection selection)
+  {
+    super.setInput(part, selection);
+    if (input instanceof XSDElementDeclaration)
+    {
+      XSDElementDeclaration elementDeclaration = (XSDElementDeclaration)input;
+      if (elementDeclaration.isElementDeclarationReference())
+      {
+        input = elementDeclaration.getResolvedElementDeclaration();
+        
+        isReadOnly = (!(elementDeclaration.getResolvedElementDeclaration().getRootContainer() == xsdSchema));
+      }
+    }
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/OtherAttributesSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/OtherAttributesSectionDescriptor.java
new file mode 100644
index 0000000..714d6c2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/OtherAttributesSectionDescriptor.java
@@ -0,0 +1,145 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDAnnotation;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDEnumerationFacet;
+import org.eclipse.xsd.XSDIdentityConstraintCategory;
+import org.eclipse.xsd.XSDIdentityConstraintDefinition;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDPatternFacet;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDWildcard;
+
+public class OtherAttributesSectionDescriptor extends AbstractSectionDescriptor
+{
+  OtherAttributesSection otherAttributesSection;
+  /**
+   * 
+   */
+  public OtherAttributesSectionDescriptor()
+  {
+    super();
+    otherAttributesSection = new OtherAttributesSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.otherattributes";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDConcreteComponent.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return otherAttributesSection;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.other";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDConcreteComponent)
+      {
+      	if (object instanceof XSDAttributeGroupDefinition ||
+      	    object instanceof XSDAttributeUse ||
+      	    object instanceof XSDAttributeDeclaration ||
+      	    object instanceof XSDEnumerationFacet ||
+      	    object instanceof XSDPatternFacet ||
+      	    object instanceof XSDSimpleTypeDefinition ||
+      	    object instanceof XSDAnnotation ||
+            object instanceof XSDWildcard ||
+            object instanceof XSDSchemaDirective)
+      	{
+     	    return false;
+      	}
+        else if (object instanceof XSDModelGroup)
+        {
+          return false;
+        }
+        else if (object instanceof XSDElementDeclaration)
+        {
+//        Remove this to fix bug 3870 Element references should have the same properties as elements 
+//          if (((XSDElementDeclaration)object).isElementDeclarationReference())
+//          {
+//            return false;
+//          }
+          return true;
+        }
+        else if (object instanceof XSDModelGroupDefinition)
+        {
+          if (((XSDModelGroupDefinition)object).isModelGroupDefinitionReference())
+          {
+            return false;
+          }
+          return false;
+        }
+        else if (object instanceof XSDIdentityConstraintDefinition)
+        {
+          XSDIdentityConstraintDefinition constraint = (XSDIdentityConstraintDefinition)object;
+          XSDIdentityConstraintCategory category = constraint.getIdentityConstraintCategory();
+          if (category.getValue() == XSDIdentityConstraintCategory.KEYREF)
+          {
+            return true;
+          }
+          else
+          {
+            return false;
+          }
+        }
+        return true;
+      }
+    }
+    return false;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/PatternSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/PatternSection.java
new file mode 100644
index 0000000..b0fc34f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/PatternSection.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+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.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.wizards.RegexWizard;
+import org.eclipse.xsd.XSDPatternFacet;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class PatternSection extends AbstractSection
+{
+  /**
+   * 
+   */
+  public PatternSection()
+  {
+    super();
+  }
+  
+  Text patternText;
+  Button button;
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+
+		super.createControls(parent, factory);
+		Composite composite = getWidgetFactory().createFlatFormComposite(parent);
+		FormData data;
+
+		patternText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
+		CLabel nameLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_VALUE") + ":"); //$NON-NLS-1$
+    button = getWidgetFactory().createButton(composite, "", SWT.PUSH); //$NON-NLS-1$
+    button.setImage(XSDEditorPlugin.getXSDImage("icons/browsebutton.gif")); //$NON-NLS-1$
+    
+    patternText.addListener(SWT.Modify, this);
+
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(patternText, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(button, 0, SWT.CENTER);
+		nameLabel.setLayoutData(data);
+
+    button.addSelectionListener(this);
+		data = new FormData();
+		data.left = new FormAttachment(100, -rightMarginSpace + 2);
+		data.right = new FormAttachment(100,0);
+		data.top = new FormAttachment(patternText, 0, SWT.CENTER);
+		button.setLayoutData(data);
+
+    data = new FormData();
+    data.left = new FormAttachment(0, 100);
+    data.right = new FormAttachment(button, 0);
+    patternText.setLayoutData(data);
+	}
+
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+	  setListenerEnabled(false);
+	  Object input = getInput();
+	  patternText.setText(""); //$NON-NLS-1$
+	  if (input != null)
+	  {
+	    Element element = null;
+	    if (input instanceof XSDPatternFacet)
+	    {
+	      element = ((XSDPatternFacet)input).getElement();
+	    }
+	    if (element != null)
+	    {
+        String result = element.getAttribute(XSDConstants.VALUE_ATTRIBUTE);
+        if (result != null)
+        {
+          patternText.setText(result);
+        }
+	    }
+	  }
+	  setListenerEnabled(true);
+	}
+
+  /**
+   * @see org.eclipse.swt.events.SelectionListener#widgetSelected(SelectionEvent)
+   */
+  public void widgetSelected(SelectionEvent e)
+  {
+    if (e.widget == button)
+    {
+	    Shell shell = Display.getCurrent().getActiveShell();
+	    Element element = ((XSDPatternFacet)getInput()).getElement();
+
+      String initialValue = element.getAttribute(XSDConstants.VALUE_ATTRIBUTE);
+      if (initialValue == null)
+      {
+        initialValue = ""; //$NON-NLS-1$
+      }
+      RegexWizard wizard = new RegexWizard(initialValue);
+
+      WizardDialog wizardDialog = new WizardDialog(shell, wizard);
+      wizardDialog.setBlockOnOpen(true);
+      wizardDialog.create();
+      
+      int result = wizardDialog.open();
+
+      if (result == Window.OK)
+      {
+        String newPattern = wizard.getPattern();
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_PATTERN_VALUE_CHANGE"), element); //$NON-NLS-1$
+        element.setAttribute(XSDConstants.VALUE_ATTRIBUTE, newPattern);
+        ((XSDPatternFacet)getInput()).setLexicalValue(newPattern);
+        endRecording(element);
+      }
+
+      refresh();
+    }
+  }
+  
+  public void doHandleEvent(Event event)
+  {
+	  if (event.widget == patternText)
+	  {
+		  XSDPatternFacet pattern = (XSDPatternFacet)getInput();
+		  
+      String newValue = patternText.getText();
+      if (newValue.length() > 0)
+      {
+        pattern.setLexicalValue(newValue);
+      }
+	  }
+
+  }
+
+  public boolean shouldUseExtraSpace()
+  {
+    return false;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/PatternSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/PatternSectionDescriptor.java
new file mode 100644
index 0000000..e7432e8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/PatternSectionDescriptor.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDPatternFacet;
+
+public class PatternSectionDescriptor extends AbstractSectionDescriptor
+{
+  /**
+   * 
+   */
+  public PatternSectionDescriptor()
+  {
+    super();
+  }
+  
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.pattern";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDPatternFacet.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new PatternSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.general";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDPatternFacet)
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ReferenceSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ReferenceSection.java
new file mode 100644
index 0000000..472bd0b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ReferenceSection.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDParticleContent;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class ReferenceSection extends AbstractSection
+{
+  protected CCombo componentNameCombo; 
+  Button button;
+  IEditorPart editorPart;
+  CLabel refLabel;
+  
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		composite = getWidgetFactory().createFlatFormComposite(parent);
+		FormData data;
+
+    componentNameCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT);
+    componentNameCombo.addSelectionListener(this);
+		data = new FormData();
+		data.left = new FormAttachment(0, 100);
+		data.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(0, 1);
+		componentNameCombo.setLayoutData(data);
+
+		refLabel = getWidgetFactory().createCLabel(composite, XSDConstants.REF_ATTRIBUTE + ":");  //$NON-NLS-1$
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(componentNameCombo, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(componentNameCombo, 0, SWT.CENTER);
+		refLabel.setLayoutData(data);
+	}
+
+  public void setInput(IWorkbenchPart part, ISelection selection)
+  {
+    super.setInput(part, selection);
+    
+    Object obj = getInput();
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    List items = new ArrayList();
+    if (obj instanceof XSDElementDeclaration)
+    {
+      XSDElementDeclaration elementDeclaration = (XSDElementDeclaration)obj;
+      if (elementDeclaration.isElementDeclarationReference())
+      {
+        items = helper.getGlobalElements();
+//            minimumField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_ELEMENT_MINIMUM"));
+//            WorkbenchHelp.setHelp(minimumField, XSDEditorContextIds.XSDE_ELEMENT_REF_MINIMUM);
+//            maximumField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_ELEMENT_MAXIMUM"));
+//            WorkbenchHelp.setHelp(maximumField, XSDEditorContextIds.XSDE_ELEMENT_REF_MAXIMUM);
+      }
+    }
+    else if (obj instanceof XSDAttributeDeclaration)
+    {
+      items = helper.getGlobalAttributes();
+    }
+    else if (obj instanceof XSDModelGroupDefinition)
+    {
+      XSDModelGroupDefinition group = (XSDModelGroupDefinition)obj;
+      if (group.isModelGroupDefinitionReference())
+      {
+        items = helper.getModelGroups();
+          // Need tooltip for Group Ref
+//            minimumField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_ELEMENT_MINIMUM"));
+//            WorkbenchHelp.setHelp(minimumField, XSDEditorContextIds.XSDE_GROUP_REF_MINIMUM);
+//            maximumField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_ELEMENT_MAXIMUM"));
+//            WorkbenchHelp.setHelp(maximumField, XSDEditorContextIds.XSDE_GROUP_REF_MAXIMUM);
+      }
+    }
+    else if (obj instanceof XSDNamedComponent)
+    {
+      XSDNamedComponent namedComponent = (XSDNamedComponent)obj;
+      Element element = namedComponent.getElement();
+      if (XSDDOMHelper.inputEquals(element, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true))
+      {
+        items = helper.getGlobalAttributeGroups();
+//      WorkbenchHelp.setHelp(client, XSDEditorContextIds.XSDE_ATTRIBUTE_GROUP_REF_DESIGN_VIEW);
+//      WorkbenchHelp.setHelp(refCombo, XSDEditorContextIds.XSDE_ATTRIBUTE_GROUP_REF_NAME);
+      }
+      else if (XSDDOMHelper.inputEquals(element, XSDConstants.ELEMENT_ELEMENT_TAG, true))
+      {
+        items = helper.getGlobalElements();
+//          minimumField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_ELEMENT_MINIMUM"));
+//          WorkbenchHelp.setHelp(minimumField, XSDEditorContextIds.XSDE_ELEMENT_REF_MINIMUM);
+//          maximumField.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_ELEMENT_MAXIMUM"));
+//          WorkbenchHelp.setHelp(maximumField, XSDEditorContextIds.XSDE_ELEMENT_REF_MAXIMUM);
+      }
+    }
+    else if (obj instanceof XSDAttributeUse)
+    {
+      XSDAttributeUse attributeUse = (XSDAttributeUse)obj;
+      Element element = attributeUse.getElement();
+      if (XSDDOMHelper.inputEquals(element, XSDConstants.ATTRIBUTE_ELEMENT_TAG, true))
+      {
+        items = helper.getGlobalAttributes();
+//      WorkbenchHelp.setHelp(client, XSDEditorContextIds.XSDE_ATTRIBUTE_REF_DESIGN_VIEW);
+//      WorkbenchHelp.setHelp(refCombo, XSDEditorContextIds.XSDE_ATTRIBUTE_REF_NAME);      
+      }
+    }      
+    items.add(0, "");
+    int size = items.size();
+    String [] st = new String[size];
+    System.arraycopy(items.toArray(), 0, st, 0, size);
+    componentNameCombo.setItems(st);
+      
+    st = null;
+  }
+	
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+    if (doRefresh)
+    {
+  	  setListenerEnabled(false);  
+  //	  componentNameCombo.removeListener(SWT.Modify, this);
+  	  Object input = getInput();
+      if (isReadOnly)
+      {
+        composite.setEnabled(false);
+      }
+      else
+      {
+        composite.setEnabled(true);
+      }
+
+  	  if (input instanceof XSDNamedComponent)
+  	  {
+        XSDNamedComponent namedComponent = (XSDNamedComponent)getInput();
+        Element element = namedComponent.getElement();
+        if (element != null)
+        {
+          String attrValue = element.getAttribute(XSDConstants.REF_ATTRIBUTE);
+          if (attrValue == null)
+          {
+            attrValue = "";
+          }
+          componentNameCombo.setText(attrValue);
+        }
+  	  }
+      else if (input instanceof XSDParticleContent)
+      {
+        XSDParticleContent particle = (XSDParticleContent)input;
+        Element element = particle.getElement();
+        String attrValue = element.getAttribute(XSDConstants.REF_ATTRIBUTE);
+        if (attrValue == null)
+        {
+          attrValue = "";
+        }
+        componentNameCombo.setText(attrValue);
+      }
+  	  else if (input instanceof XSDAttributeUse)
+  	  {
+  	    XSDAttributeUse attributeUse = (XSDAttributeUse)getInput();
+  	    Element element = attributeUse.getElement();
+        String attrValue = element.getAttribute(XSDConstants.REF_ATTRIBUTE);
+        if (attrValue == null)
+        {
+          attrValue = "";
+        }
+        componentNameCombo.setText(attrValue);
+  	  }
+  	  
+      setListenerEnabled(true);
+  //    componentNameCombo.addListener(SWT.Modify, this);
+    }
+	}
+
+	
+  public void widgetSelected(SelectionEvent e)
+  {
+	  Object input = getInput();
+    if (e.widget == componentNameCombo)
+    {
+      String newValue = componentNameCombo.getText();
+		  if (input instanceof XSDNamedComponent)
+		  {
+	      XSDNamedComponent namedComponent = (XSDNamedComponent)getInput();
+	      Element element = namedComponent.getElement();
+	      
+	      if (namedComponent instanceof XSDElementDeclaration)
+	      {
+	        beginRecording(XSDEditorPlugin.getXSDString("_UI_GROUP_REF_CHANGE"), element); //$NON-NLS-1$
+	        element.setAttribute(XSDConstants.REF_ATTRIBUTE, newValue);
+	        endRecording(element);
+	      }
+			  else if (namedComponent instanceof XSDAttributeDeclaration)
+			  {
+			    XSDAttributeDeclaration attr = (XSDAttributeDeclaration)namedComponent;
+	        beginRecording(XSDEditorPlugin.getXSDString("_UI_ATTRIBUTEGROUP_REF_CHANGE"), element); //$NON-NLS-1$
+	        element.setAttribute(XSDConstants.REF_ATTRIBUTE, newValue);
+	        endRecording(element);
+
+			  }
+	  	  else if (namedComponent instanceof XSDAttributeGroupDefinition)
+	  	  {
+	        beginRecording(XSDEditorPlugin.getXSDString("_UI_ATTRIBUTEGROUP_REF_CHANGE"), element); //$NON-NLS-1$
+	        // element.setAttribute(XSDConstants.REF_ATTRIBUTE, (String) value);
+	        XSDAttributeGroupDefinition attrGroup = (XSDAttributeGroupDefinition)namedComponent;
+	        Iterator iter = xsdSchema.getAttributeGroupDefinitions().iterator();
+	        while (iter.hasNext())
+	        {
+	          XSDAttributeGroupDefinition def = (XSDAttributeGroupDefinition)iter.next();
+	          if (def.getQName(xsdSchema).equals(componentNameCombo.getText()))
+	          {
+	            attrGroup.setResolvedAttributeGroupDefinition(def);
+	            attrGroup.setName(componentNameCombo.getText());
+	            break;
+	          }
+	        }  
+	        endRecording(element);
+	  	  }
+        else if (namedComponent instanceof XSDModelGroupDefinition)
+        {
+          beginRecording(XSDEditorPlugin.getXSDString("_UI_GROUP_REF_CHANGE"), element); //$NON-NLS-1$
+          XSDModelGroupDefinition modelGroup = (XSDModelGroupDefinition)namedComponent;
+          element.setAttribute(XSDConstants.REF_ATTRIBUTE, newValue);
+          endRecording(element);
+        }
+		  }
+		  else if (input instanceof XSDAttributeUse)
+		  {
+		    XSDAttributeUse attributeUse = (XSDAttributeUse)getInput();
+		    Element element = attributeUse.getElement();
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ATTRIBUTE_USE_CHANGE"), element); //$NON-NLS-1$
+        Iterator iter = xsdSchema.getAttributeDeclarations().iterator();
+        while (iter.hasNext())
+        {
+          XSDAttributeDeclaration attr = (XSDAttributeDeclaration)iter.next();
+          if (attr.getQName(xsdSchema).equals(newValue))
+          {
+            attributeUse.setAttributeDeclaration(attr);
+            element.setAttribute(XSDConstants.REF_ATTRIBUTE, newValue);
+            break;
+          }
+        }  
+
+        endRecording(element);
+		  }
+    }
+  }
+  
+  public void setEditorPart(IEditorPart editorPart)
+  {
+    this.editorPart = editorPart;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ReferenceSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ReferenceSectionDescriptor.java
new file mode 100644
index 0000000..26885b6
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ReferenceSectionDescriptor.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.wst.common.ui.properties.ISectionDescriptor;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class ReferenceSectionDescriptor extends AbstractSectionDescriptor implements ISectionDescriptor
+{
+  ReferenceSection referenceSection;
+  
+  /**
+   * 
+   */
+  public ReferenceSectionDescriptor()
+  {
+    super();
+    this.referenceSection = new ReferenceSection();
+  }
+
+
+  /**
+   * 
+   */
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "org.eclipse.wst.wsdleditor.section.reference";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDNamedComponent.class);
+    list.add(XSDElementDeclaration.class);
+    list.add(XSDModelGroupDefinition.class);
+    list.add(XSDAttributeDeclaration.class);
+    list.add(XSDAttributeUse.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return referenceSection;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.general";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    if (part != null)
+    {
+      referenceSection.setEditorPart(part.getSite()
+            .getWorkbenchWindow()
+              .getActivePage()
+                .getActiveEditor());
+    }
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDNamedComponent)
+      {
+        XSDNamedComponent namedComponent = (XSDNamedComponent)object;
+        Element element = namedComponent.getElement();
+        if (element == null)
+        {
+          return false;
+        }
+        if (inputEquals(element, element.getLocalName(), true))
+        {
+          return true;
+        }
+        else
+        {
+          return false;
+        }
+      }
+      else if (object instanceof XSDElementDeclaration)
+      {
+        XSDElementDeclaration elementDeclaration = (XSDElementDeclaration)object;
+        if (elementDeclaration.isElementDeclarationReference())
+        {
+          return true;
+        }
+        else
+        {
+          return false;
+        }
+      }
+      else if (object instanceof XSDAttributeDeclaration)
+      {
+        XSDAttributeDeclaration attr = (XSDAttributeDeclaration)object;
+        if (attr.isAttributeDeclarationReference())
+        {
+          return true;
+        }
+        else
+        {
+          return false;
+        }
+      }
+      else if (object instanceof XSDModelGroupDefinition)
+      {
+        XSDModelGroupDefinition group = (XSDModelGroupDefinition)object;
+        if (group.isModelGroupDefinitionReference())
+        {
+          return true;
+        }
+        else
+        {
+          return false;
+        }
+      }
+      else if (object instanceof XSDAttributeUse)
+      {
+        XSDAttributeUse attributeUse = (XSDAttributeUse)object;
+        XSDAttributeDeclaration attribute = attributeUse.getAttributeDeclaration();
+        Element element = attributeUse.getElement();
+        if (inputEquals(element, XSDConstants.ATTRIBUTE_ELEMENT_TAG, true))
+        {
+          return true;
+        }
+        else
+        {
+          return false;
+        }
+      }
+      
+    }
+    return false;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SchemaLocationDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SchemaLocationDescriptor.java
new file mode 100644
index 0000000..59b47f0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SchemaLocationDescriptor.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDInclude;
+import org.eclipse.xsd.XSDRedefine;
+
+public class SchemaLocationDescriptor extends AbstractSectionDescriptor
+{
+	  SchemaLocationSection schemaLocationSection;
+	  /**
+	   * 
+	   */
+	  public SchemaLocationDescriptor()
+	  {
+	    super();
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+	   */
+	  public String getId()
+	  {
+	    return "com.ibm.xsdeditor.section.schemaLocationSection";
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+	   */
+	  public List getInputTypes()
+	  {
+	    List list = new ArrayList();
+	    list.add(XSDConcreteComponent.class);
+	    return list;
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+	   */
+	  public ISection getSectionClass()
+	  {
+	    return schemaLocationSection;
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+	   */
+	  public String getTargetTab()
+	  {
+	    return "com.ibm.xmlwebservices.general";
+	  }
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+	   */
+	  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+	  {
+	    Object object = null;	    
+	    
+	    if (selection instanceof StructuredSelection)
+	    {
+	      StructuredSelection structuredSelection = (StructuredSelection)selection;
+	      object = structuredSelection.getFirstElement();
+	      if (object instanceof XSDInclude || object instanceof XSDRedefine) {
+		    schemaLocationSection = new SchemaLocationSection();
+	      	return true;
+	      }
+	    }
+	    
+	    return false;
+	  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SchemaLocationSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SchemaLocationSection.java
new file mode 100644
index 0000000..99bd08f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SchemaLocationSection.java
@@ -0,0 +1,183 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.common.ui.viewers.ResourceFilter;
+import org.eclipse.wst.xml.uriresolver.util.URIHelper;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.wizards.XSDSelectIncludeFileWizard;
+import org.eclipse.xsd.XSDInclude;
+import org.eclipse.xsd.XSDRedefine;
+import org.eclipse.xsd.impl.XSDIncludeImpl;
+import org.eclipse.xsd.impl.XSDRedefineImpl;
+import org.w3c.dom.Element;
+
+public class SchemaLocationSection extends AbstractSection
+{
+	  IWorkbenchPart part;
+	  Text schemaLocationText;
+	  Button wizardButton;
+	  
+	  /**
+	   * 
+	   */
+	  public SchemaLocationSection()
+	  {
+	    super();
+	  }
+
+		/**
+		 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+		 */
+		public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+		{
+			super.createControls(parent, factory);
+			Composite composite = getWidgetFactory().createFlatFormComposite(parent);
+
+      int leftCoordinate = getStandardLabelWidth(composite, 
+          new String[] {XSDEditorPlugin.getXSDString("_UI_LABEL_SCHEMA_LOCATION")});
+      
+			// Create Schema Location Label
+			CLabel schemaLocationLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_SCHEMA_LOCATION")); //$NON-NLS-1$
+			
+      // Create Schema Location Text
+      schemaLocationText = getWidgetFactory().createText(composite, "", SWT.NONE); //$NON-NLS-1$
+      
+			// Create Wizard Button
+			wizardButton = getWidgetFactory().createButton(composite, "", SWT.NONE); //$NON-NLS-1$
+      
+      wizardButton.setImage(XSDEditorPlugin.getXSDImage("icons/browsebutton.gif")); //$NON-NLS-1$
+			FormData buttonFormData = new FormData();
+			buttonFormData.left = new FormAttachment(100, -rightMarginSpace + 2);
+			buttonFormData.right = new FormAttachment(100,0);
+			buttonFormData.top = new FormAttachment(schemaLocationText, 0, SWT.CENTER);
+			wizardButton.setLayoutData(buttonFormData);
+			wizardButton.addSelectionListener(this);
+			
+			schemaLocationText.setEditable(false);
+			FormData schemaLocationData = new FormData();
+			// schemaLocationData.left = new FormAttachment(0, 110);
+      schemaLocationData.left = new FormAttachment(0, leftCoordinate);
+      schemaLocationData.right = new FormAttachment(wizardButton, 0);
+//			schemaLocationData.top = new FormAttachment(0, 0);
+			schemaLocationText.setLayoutData(schemaLocationData);
+			schemaLocationText.addListener(SWT.Modify, this);		    
+
+			FormData data = new FormData();
+			data.left = new FormAttachment(0, 0);
+			data.right = new FormAttachment(schemaLocationText, -ITabbedPropertyConstants.HSPACE);
+			data.top = new FormAttachment(schemaLocationText, 0, SWT.CENTER);
+			schemaLocationLabel.setLayoutData(data);
+			
+		}
+		
+		public void widgetSelected(SelectionEvent event) {
+			if (event.widget == wizardButton) {
+				Shell shell = Display.getCurrent().getActiveShell();
+			    
+				IFile currentIFile = ((IFileEditorInput)getActiveEditor().getEditorInput()).getFile();
+				ViewerFilter filter = new ResourceFilter(new String[] { ".xsd" },  //$NON-NLS-1$
+			            new IFile[] { currentIFile },
+			            null);
+			      
+				  XSDSelectIncludeFileWizard fileSelectWizard = 
+				      new XSDSelectIncludeFileWizard(xsdSchema, true,
+				          XSDEditorPlugin.getXSDString("_UI_FILEDIALOG_SELECT_XML_SCHEMA"), //$NON-NLS-1$
+				          XSDEditorPlugin.getXSDString("_UI_FILEDIALOG_SELECT_XML_DESC"), //$NON-NLS-1$
+				          filter,
+				          (IStructuredSelection) selection);
+
+				  WizardDialog wizardDialog = new WizardDialog(shell, fileSelectWizard);
+				  wizardDialog.create();
+				  wizardDialog.setBlockOnOpen(true);
+				  int result = wizardDialog.open();
+				  
+			      String value = schemaLocationText.getText();
+			      if (result == Window.OK)
+			      {
+			        IFile selectedIFile = fileSelectWizard.getResultFile();
+			        String schemaFileString = value;
+			        if (selectedIFile != null) 
+			        {
+			          schemaFileString = URIHelper.getRelativeURI(selectedIFile.getLocation(), currentIFile.getLocation());
+			        }
+			        else
+			        {
+			          schemaFileString = fileSelectWizard.getURL();
+			        }
+			        
+			        if (input instanceof XSDInclude) {
+			        	Element element = ((XSDIncludeImpl) input).getElement();
+			        	element.setAttribute("schemaLocation", schemaFileString); //$NON-NLS-1$
+			        }
+			        else if (input instanceof XSDRedefine) {
+			        	Element element = ((XSDRedefineImpl) input).getElement();
+			        	element.setAttribute("schemaLocation", schemaFileString); //$NON-NLS-1$
+			        }
+					refresh();
+			      } 
+			}
+		}
+
+		/*
+		 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+		 */
+		public void refresh()
+		{
+			if (doRefresh)
+			{
+				setListenerEnabled(false);
+
+				Element element = null;
+				if (input instanceof XSDInclude) { 
+					element = ((XSDIncludeImpl) input).getElement();
+				}
+				else if (input instanceof XSDRedefine) {
+					element = ((XSDRedefineImpl) input).getElement();
+				}
+				
+				if (element != null) {
+					String location = ""; //$NON-NLS-1$
+					location = element.getAttribute("schemaLocation"); //$NON-NLS-1$
+					schemaLocationText.setText(location);
+				}
+
+				setListenerEnabled(true);
+			}
+		}
+
+	  /* (non-Javadoc)
+	   * @see org.eclipse.wst.common.ui.properties.ISection#shouldUseExtraSpace()
+	   */
+	  public boolean shouldUseExtraSpace()
+	  {
+	    return true;
+	  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleContentBaseTypeOptionsDialog.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleContentBaseTypeOptionsDialog.java
new file mode 100644
index 0000000..2aa1a50
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleContentBaseTypeOptionsDialog.java
@@ -0,0 +1,158 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class SimpleContentBaseTypeOptionsDialog extends TypesDialog
+{
+  /**
+   * @param parentShell
+   * @param element
+   * @param id
+   * @param xsdSchema
+   */
+  public SimpleContentBaseTypeOptionsDialog(Shell parentShell, Element element, Object id, XSDSchema xsdSchema)
+  {
+    super(parentShell, element, id, xsdSchema);
+    showAnonymous = false;
+  }
+  
+	protected void ok()
+	{
+		TableItem[] items = table.getItems();
+		int selection = table.getSelectionIndex();
+		if (items != null && items.length > 0 && selection >= 0)
+		 {
+		  typeObject = items[selection].getData();
+		}
+	}
+
+  
+  public void handleSetInput()
+  {
+    XSDDOMHelper domHelper = new XSDDOMHelper();
+    typeSection.getSimpleType().setSelection(false);
+    typeSection.getUserSimpleType().setSelection(false);
+    typeSection.getUserComplexType().setSelection(false);
+    showAnonymous = false;
+    if (element != null)
+    {
+      String derivedBy = domHelper.getDerivedByName(element);
+      String baseType = domHelper.getBaseType(element);
+      boolean derivedByRestriction = true;
+      
+      if (XSDDOMHelper.inputEquals(element, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+      {
+        typeSection.getSimpleType().setEnabled(false);
+        typeSection.getUserSimpleType().setEnabled(false);
+        typeSection.getUserComplexType().setSelection(true);
+
+        previousType = 3;
+      }
+      else if (XSDDOMHelper.inputEquals(element, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+      {
+        typeSection.getSimpleType().setEnabled(false);
+        typeSection.getUserSimpleType().setEnabled(false);
+
+        if (derivedBy.equals("restriction"))
+        {
+          typeSection.getSimpleType().setEnabled(false);
+          typeSection.getUserSimpleType().setEnabled(false);
+          typeSection.getUserComplexType().setEnabled(true);
+        }
+        else if (derivedBy.equals("extension"))
+        {
+          derivedByRestriction = false;
+          typeSection.getSimpleType().setEnabled(true);
+          typeSection.getUserSimpleType().setEnabled(true);
+          typeSection.getUserComplexType().setEnabled(true);
+        }
+      }
+        
+      if (derivedBy != null)
+      {
+          if (baseType != null && !baseType.equals(""))
+          {
+            Element parent = (Element)element.getParentNode();
+            XSDConcreteComponent component = null;
+            if (parent != null)
+            {
+              component = xsdSchema.getCorrespondingComponent(parent);
+            }
+            XSDTypeDefinition baseTypeDefinition = null;
+            if (component instanceof XSDComplexTypeDefinition)
+            {
+              XSDComplexTypeDefinition complexType = (XSDComplexTypeDefinition)component;
+              baseTypeDefinition = complexType.getBaseTypeDefinition();
+            }               
+
+            if (typeSection.getBuiltInTypeNamesList(xsdSchema).contains(baseType) && !derivedByRestriction)
+            {
+              typeSection.getSimpleType().setSelection(true);
+              populateBuiltInType();
+              int i = typeSection.getBuiltInTypeNamesList(xsdSchema).indexOf(baseType);
+              table.setSelection(i);
+              previousType = 1;
+            }
+            else if (baseTypeDefinition instanceof XSDSimpleTypeDefinition && !derivedByRestriction)
+            {
+              typeSection.getUserSimpleType().setSelection(true);
+              populateUserSimpleType();
+              int i = typeSection.getUserSimpleTypeNamesList(xsdSchema).indexOf(baseType);
+              if (showAnonymous)
+               {
+                table.setSelection(i + 1);
+              }
+              else
+               {
+                table.setSelection(i);
+              }
+              previousType = 2;
+            }
+            else if (baseTypeDefinition instanceof XSDComplexTypeDefinition)
+            {
+              typeSection.getUserComplexType().setSelection(true);
+              populateUserComplexType();
+              int i = typeSection.getUserComplexTypeNamesList(xsdSchema).indexOf(baseType);
+              if (showAnonymous)
+               {
+                table.setSelection(i + 1);
+              }
+              else
+               {
+                table.setSelection(i);
+              }
+              previousType = 3;
+            }
+          }
+          else
+          {
+            typeSection.getUserComplexType().setSelection(true);
+            populateUserComplexType();
+            table.setSelection(0);
+          }
+        }
+
+    }
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleContentUnionMemberTypesDialog.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleContentUnionMemberTypesDialog.java
new file mode 100644
index 0000000..7434a93
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleContentUnionMemberTypesDialog.java
@@ -0,0 +1,314 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.jface.dialogs.Dialog;
+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.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.wst.xsd.ui.internal.widgets.TypeSection;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+
+
+public class SimpleContentUnionMemberTypesDialog extends Dialog implements SelectionListener
+{
+  XSDSimpleTypeDefinition simpleType;
+  /**
+   * @param parentShell
+   */
+  public SimpleContentUnionMemberTypesDialog(Shell parentShell, XSDSimpleTypeDefinition simpleType)
+  {
+    super(parentShell);
+    this.simpleType = simpleType;
+  }
+  
+  Table table;
+  TypeSection typeSection;
+  Button addButton, removeButton;
+  org.eclipse.swt.widgets.List memberTypesList;
+  
+  private String result;
+
+  protected void configureShell(Shell shell)
+  {
+    super.configureShell(shell);
+  }
+
+  protected void buttonPressed(int buttonId)
+  {
+    if (buttonId == Dialog.OK)
+    {
+      StringBuffer sb = new StringBuffer();
+      int length = memberTypesList.getItemCount();
+      for (int i=0 ; i < length; i++)
+      {
+        sb.append(memberTypesList.getItem(i));
+        if (i < length - 1)
+        {
+          sb.append(" ");
+        }
+      }
+      result = sb.toString();
+    }
+    super.buttonPressed(buttonId);
+  }
+
+  public String getResult() { return result; }
+
+  //
+  // Create the controls
+  //
+  public Control createDialogArea(Composite parent)
+  {
+    int tabIndex = 0;
+    Composite client = (Composite)super.createDialogArea(parent);
+    getShell().setText("Union " + XSDConstants.MEMBERTYPES_ATTRIBUTE); 
+    
+    Label instructions = new Label(client, SWT.LEFT | SWT.WRAP);
+    instructions.setText(XSDEditorPlugin.getXSDString("_UI_LABEL_SELECT_MEMBERTYPES"));
+    
+    Composite columnsComposite = new Composite(client, SWT.NONE);
+    GridLayout ccGL = new GridLayout();
+    ccGL.verticalSpacing = 0;
+    ccGL.horizontalSpacing = 0;
+    ccGL.marginHeight = 0;
+    ccGL.marginWidth = 0;
+    ccGL.makeColumnsEqualWidth = true;
+    ccGL.numColumns = 3;
+    columnsComposite.setLayout(ccGL);
+    
+    GridData ccGD = new GridData();
+    ccGD.grabExcessHorizontalSpace = true;
+    ccGD.horizontalAlignment = GridData.FILL;
+    columnsComposite.setLayoutData(ccGD);     
+                           
+    typeSection = new TypeSection(columnsComposite);
+    typeSection.setShowUserComplexType(false);
+
+    typeSection.createClient(columnsComposite);
+    typeSection.getSimpleType().setSelection(false);
+    typeSection.getSimpleType().addSelectionListener(this);
+    typeSection.getUserSimpleType().addSelectionListener(this);
+    
+    ViewUtility.createHorizontalFiller(columnsComposite, 1);
+    
+    Label memberListLabel = new Label(columnsComposite, SWT.LEFT);
+    memberListLabel.setText(XSDEditorPlugin.getXSDString("_UI_LABEL_MEMBERTYPES_VALUE"));
+    
+    Composite dataComposite = new Composite(client, SWT.NONE);
+    GridLayout dcGL = new GridLayout();
+    dcGL.verticalSpacing = 0;
+    dcGL.marginHeight = 0;
+    dcGL.marginWidth = 0;
+    dcGL.numColumns = 3;
+    dataComposite.setLayout(dcGL);
+    
+    GridData dcGD = new GridData();
+    dcGD.grabExcessHorizontalSpace = true;
+    dcGD.grabExcessVerticalSpace = true;
+    dataComposite.setLayoutData(dcGD);
+    
+    table = new Table(dataComposite,
+        SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER); 
+    table.setHeaderVisible(false);
+    table.setLinesVisible(true);
+    GridData gd2 = new GridData();
+    gd2.grabExcessHorizontalSpace = true;
+    gd2.grabExcessVerticalSpace = true;
+    gd2.horizontalAlignment = GridData.FILL;
+    gd2.verticalAlignment = GridData.FILL;
+    gd2.heightHint = 200;
+    gd2.widthHint = 200;
+    table.setLayoutData(gd2);
+
+    // Fill table
+    handleSetInput();
+    int tableItemCount = table.getItemCount();
+
+    TableColumn tc = new TableColumn(table, SWT.LEFT);
+//    tc.setImage(XSDEditorPlugin.getXSDImage("icons/XSDElement.gif"));
+    //tc.setText("Available types:");
+    tc.setWidth(200);
+    tc.setResizable(true);
+    
+    Composite buttonComposite = new Composite(dataComposite, SWT.NONE);
+    GridLayout bcGL = new GridLayout();
+    bcGL.numColumns = 1;
+    buttonComposite.setLayout(bcGL);
+    addButton = new Button(buttonComposite, SWT.PUSH);
+    addButton.setText(">");
+    addButton.addSelectionListener(this);
+    removeButton = new Button(buttonComposite, SWT.PUSH);
+    removeButton.setText("<");
+    removeButton.addSelectionListener(this);
+    
+    Composite listComposite = new Composite(dataComposite, SWT.NONE);
+    GridLayout mtGL = new GridLayout();
+    mtGL.numColumns = 1;
+    mtGL.marginHeight = 0;
+    mtGL.marginWidth = 0;
+    mtGL.horizontalSpacing = 0;
+    mtGL.verticalSpacing = 0;
+    listComposite.setLayout(mtGL);
+
+    GridData mtGD = new GridData();
+    mtGD.grabExcessHorizontalSpace = true;
+    mtGD.grabExcessVerticalSpace = true;
+    mtGD.verticalAlignment = GridData.FILL;
+    mtGD.horizontalAlignment = GridData.FILL;
+    listComposite.setLayoutData(mtGD);
+    
+    memberTypesList = new org.eclipse.swt.widgets.List(listComposite, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+    GridData mtlGD = new GridData();
+    mtlGD.grabExcessHorizontalSpace = true;
+    mtlGD.grabExcessVerticalSpace = true;
+    mtlGD.verticalAlignment = GridData.FILL;
+    mtlGD.horizontalAlignment = GridData.FILL;
+    mtlGD.heightHint = 200;
+    mtlGD.widthHint = 200;
+    memberTypesList.setLayoutData(mtlGD);
+    
+    initializeMemberListContent();
+    return client;
+  }
+
+  private void initializeMemberListContent()
+  {
+//    String result = element.getAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);
+//    if (result == null)
+//    {
+//      return;
+//    }
+//    StringTokenizer token = new StringTokenizer(result);
+//    while (token.hasMoreTokens())
+//    {
+//      memberTypesList.add(token.nextToken());
+//    }
+    XSDSchema schema = simpleType.getSchema();
+    for (Iterator i = simpleType.getMemberTypeDefinitions().iterator(); i.hasNext(); )
+    {
+      String name = ((XSDSimpleTypeDefinition)i.next()).getQName(schema);
+      if (name != null)
+      memberTypesList.add(name);
+    }
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+   */
+  public void widgetSelected(SelectionEvent e)
+  {
+    if (e.widget == typeSection.getSimpleType() && typeSection.getSimpleType().getSelection())
+     {
+      populateBuiltInType();
+    }
+    else if (e.widget == typeSection.getUserSimpleType() && typeSection.getUserSimpleType().getSelection())
+     {
+      populateUserSimpleType(false);
+    }
+    else if (e.widget == addButton)
+    {
+      TableItem[] items = table.getItems();
+      int selection = table.getSelectionIndex();
+      if (items != null && items.length > 0 && selection >= 0)
+      {
+        String typeToAdd = items[selection].getData().toString();
+        if (memberTypesList.indexOf(typeToAdd) < 0)
+        {
+          memberTypesList.add(items[selection].getData().toString());
+        }
+      }
+    }
+    else if (e.widget == removeButton)
+    {
+      String[] typesToRemove = memberTypesList.getSelection();
+      for (int i=0; i < typesToRemove.length; i++)
+      {
+        memberTypesList.remove(typesToRemove[i]);
+      }
+    }
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+   */
+  public void widgetDefaultSelected(SelectionEvent e)
+  {
+  }
+  
+  public void handleSetInput()
+  {
+    populateBuiltInType();
+  }
+  
+  public void populateBuiltInType()
+  {
+    table.removeAll();
+    List items = getBuiltInTypeNamesList();
+    for (int i = 0; i < items.size(); i++)
+     {
+      TableItem item = new TableItem(table, SWT.NONE);
+      item.setText(items.get(i).toString());
+      item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+      item.setData(items.get(i));
+    }
+  }
+
+  public void populateUserSimpleType(boolean showAnonymous)
+  {
+    table.removeAll();
+    if (showAnonymous)
+     {
+      TableItem anonymousItem = new TableItem(table, SWT.NONE);
+      anonymousItem.setText("**anonymous**");
+      anonymousItem.setData("**anonymous**");
+    }
+    List items = getUserSimpleTypeNamesList();
+    for (int i = 0; i < items.size(); i++)
+     {
+      TableItem item = new TableItem(table, SWT.NONE);
+      item.setText(items.get(i).toString());
+      item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+      item.setData(items.get(i));
+    }
+  }
+  
+  public java.util.List getBuiltInTypeNamesList()
+  {
+    TypesHelper helper = new TypesHelper(simpleType.getSchema());
+    return helper.getBuiltInTypeNamesList();
+  }
+
+  public java.util.List getUserSimpleTypeNamesList()
+  {
+    TypesHelper helper = new TypesHelper(simpleType.getSchema());
+    return helper.getUserSimpleTypeNamesList();
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeSection.java
new file mode 100644
index 0000000..833292e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeSection.java
@@ -0,0 +1,541 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.actions.CreateElementAction;
+import org.eclipse.wst.xsd.ui.internal.actions.DOMAttribute;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDVariety;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+public class SimpleTypeSection extends AbstractSection
+{
+  CCombo varietyCombo;
+  Text typesText;
+  CLabel typesLabel;
+  Button button;
+
+  /**
+   * 
+   */
+  public SimpleTypeSection()
+  {
+    super();
+  }
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		composite = getWidgetFactory().createFlatFormComposite(parent);
+		FormData data;
+
+		varietyCombo = getWidgetFactory().createCCombo(composite, SWT.FLAT);
+		CLabel label = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_VARIETY")); //$NON-NLS-1$
+    
+		List list = XSDVariety.VALUES;	
+		Iterator iter = list.iterator();
+		while (iter.hasNext())
+		{
+		  varietyCombo.add(((XSDVariety)iter.next()).getName());
+		}
+    varietyCombo.addSelectionListener(this);
+
+		data = new FormData();
+		data.left = new FormAttachment(0, 100);
+		data.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(0, 0);
+		varietyCombo.setLayoutData(data);
+
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(varietyCombo, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(varietyCombo, 0, SWT.CENTER);
+		label.setLayoutData(data);
+    
+    typesText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
+    typesLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_MEMBERTYPES")); //$NON-NLS-1$
+    button = getWidgetFactory().createButton(composite, "", SWT.PUSH); //$NON-NLS-1$
+    button.setImage(XSDEditorPlugin.getXSDImage("icons/browsebutton.gif")); //$NON-NLS-1$
+    
+    typesText.addListener(SWT.Modify, this);
+
+    data = new FormData();
+    data.left = new FormAttachment(0, 100);
+    data.right = new FormAttachment(100, -rightMarginSpace - ITabbedPropertyConstants.HSPACE);
+    data.top = new FormAttachment(button, 0, SWT.CENTER);
+    typesText.setLayoutData(data);
+
+    data = new FormData();
+    data.left = new FormAttachment(0, 0);
+    data.right = new FormAttachment(typesText, -ITabbedPropertyConstants.HSPACE);
+    data.top = new FormAttachment(button, 0, SWT.CENTER);
+    typesLabel.setLayoutData(data);
+
+    button.addSelectionListener(this);
+    data = new FormData();
+    data.left = new FormAttachment(typesText, 0);
+    data.right = new FormAttachment(100,0);
+    data.top = new FormAttachment(varietyCombo, +ITabbedPropertyConstants.VSPACE);
+    button.setLayoutData(data);
+	}
+
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+	  setListenerEnabled(false);
+    if (isReadOnly)
+    {
+      composite.setEnabled(false);
+    }
+    else
+    {
+      composite.setEnabled(true);
+    }
+	  Object input = getInput();
+	  varietyCombo.setText(""); //$NON-NLS-1$
+    typesText.setText(""); //$NON-NLS-1$
+    typesLabel.setText(XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE_WITH_COLON")); //$NON-NLS-1$
+	  if (input != null)
+	  {
+	    if (input instanceof XSDSimpleTypeDefinition)
+	    {
+	      XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)input;
+        
+        Element simpleTypeElement = st.getElement();
+        Element element = null;
+	      String variety = st.getVariety().getName();
+        
+        int intVariety = st.getVariety().getValue();
+        
+	      if (variety != null)
+	      {
+          varietyCombo.setText(variety);
+          if (intVariety == XSDVariety.ATOMIC)
+          {
+            element = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.RESTRICTION_ELEMENT_TAG);
+//            if (element == null)
+//            {
+//              element = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.EXTENSION_ELEMENT_TAG);
+//              if (element == null) return;
+//            }
+            
+            if (element == null)
+            {
+              varietyCombo.setText(XSDEditorPlugin.getXSDString("_UI_NO_TYPE")); // "Select a simple type variety"); //$NON-NLS-1$            
+            }
+            else
+            {
+              String result = element.getAttribute(XSDConstants.BASE_ATTRIBUTE);
+              if (result == null)
+              {
+                typesText.setText("**anonymous**"); //$NON-NLS-1$
+              }
+              else
+              {
+                typesText.setText(result);
+              }
+            }
+            typesLabel.setText(XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE_WITH_COLON")); //$NON-NLS-1$
+          }
+          else if (intVariety == XSDVariety.LIST)
+          {
+            element = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.LIST_ELEMENT_TAG);
+            if (element != null)
+            {
+              String result = element.getAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE);
+              if (result == null)
+              {
+                typesText.setText("**anonymous**"); //$NON-NLS-1$
+              }
+              else
+              {
+                typesText.setText(result);
+              }
+            }
+            typesLabel.setText(XSDEditorPlugin.getXSDString("_UI_LABEL_ITEM_TYPE")); //$NON-NLS-1$
+          }
+          else if (intVariety == XSDVariety.UNION)
+          {
+            Element unionElement = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.UNION_ELEMENT_TAG);
+            if (unionElement != null)
+            {
+              String memberTypes = unionElement.getAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);
+              if (memberTypes != null)
+              {
+                typesText.setText(memberTypes);
+              }
+            }
+            typesLabel.setText(XSDEditorPlugin.getXSDString("_UI_LABEL_MEMBERTYPES")); //$NON-NLS-1$
+          }
+	      }
+	    }
+	  }
+	  setListenerEnabled(true);
+	}
+
+  /**
+   * @see org.eclipse.swt.events.SelectionListener#widgetSelected(SelectionEvent)
+   */
+  public void widgetSelected(SelectionEvent e)
+  {
+	  Object input = getInput();
+    if (e.widget == varietyCombo)
+    {
+  	  if (input != null)
+  	  {
+  	    if (input instanceof XSDSimpleTypeDefinition)
+  	    {
+  	      XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)input;
+          Element parent = st.getElement();
+          
+  	      String variety = varietyCombo.getText();
+  	      if (variety.equals(XSDVariety.ATOMIC_LITERAL.getName()))
+          {
+            typesLabel.setText(XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE_WITH_COLON")); //$NON-NLS-1$
+            st.setVariety(XSDVariety.ATOMIC_LITERAL);
+            List attributes = new ArrayList();
+            addCreateElementActionIfNotExist(XSDConstants.RESTRICTION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_RESTRICTION"), parent, null); //$NON-NLS-1$
+          }
+  	      else if (variety.equals(XSDVariety.UNION_LITERAL.getName()))
+  	      {
+            typesLabel.setText(XSDEditorPlugin.getXSDString("_UI_LABEL_MEMBERTYPES")); //$NON-NLS-1$
+            st.setVariety(XSDVariety.UNION_LITERAL);
+            addCreateElementActionIfNotExist(XSDConstants.UNION_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_UNION"), parent, null); //$NON-NLS-1$
+          }
+  	      else if (variety.equals(XSDVariety.LIST_LITERAL.getName()))
+  	      {
+            typesLabel.setText(XSDEditorPlugin.getXSDString("_UI_LABEL_ITEM_TYPE")); //$NON-NLS-1$
+            st.setVariety(XSDVariety.LIST_LITERAL);
+            addCreateElementActionIfNotExist(XSDConstants.LIST_ELEMENT_TAG, XSDEditorPlugin.getXSDString("_UI_ACTION_ADD_LIST"), parent, null); //$NON-NLS-1$
+          }
+  	    }
+  	  }
+    }
+    else if (e.widget == button)
+    {
+      Shell shell = Display.getCurrent().getActiveShell();
+      Element element = ((XSDConcreteComponent)input).getElement();
+      TypesDialog dialog = null;
+
+      if (input instanceof XSDSimpleTypeDefinition)
+      {
+        XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)input;
+        Element simpleTypeElement = st.getElement();
+        if (st.getVariety() == XSDVariety.LIST_LITERAL)
+        {
+          Element listElement = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.LIST_ELEMENT_TAG);
+          dialog = new TypesDialog(shell, listElement, XSDConstants.ITEMTYPE_ATTRIBUTE, xsdSchema);
+          dialog.showComplexTypes = false;
+        }
+        else if (st.getVariety() == XSDVariety.ATOMIC_LITERAL)
+        {
+          Element derivedByElement = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.RESTRICTION_ELEMENT_TAG);
+          if (derivedByElement == null)
+          {
+            derivedByElement = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.EXTENSION_ELEMENT_TAG);
+            if (derivedByElement == null) return;
+          }
+          if (derivedByElement != null)
+          {
+            dialog = new TypesDialog(shell, derivedByElement, XSDConstants.BASE_ATTRIBUTE, xsdSchema);
+            dialog.showComplexTypes = false;
+          }
+          else
+          {
+            return;
+          }
+        }
+        else if (st.getVariety() == XSDVariety.UNION_LITERAL)
+        {
+          SimpleContentUnionMemberTypesDialog unionDialog = new SimpleContentUnionMemberTypesDialog(shell, st);
+          unionDialog.setBlockOnOpen(true);
+          unionDialog.create();
+          
+          int result = unionDialog.open();
+          if (result == Window.OK)
+          {
+            String newValue = unionDialog.getResult();
+            beginRecording(XSDEditorPlugin.getXSDString("_UI_LABEL_MEMBERTYPES_CHANGE"), element); //$NON-NLS-1$
+            Element unionElement = (Element)domHelper.getChildNode(element, XSDConstants.UNION_ELEMENT_TAG);
+            unionElement.setAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE, newValue);
+
+            if (newValue.length() > 0)
+            {
+              unionElement.setAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE, newValue);
+            }
+            else
+            {
+              unionElement.removeAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);  
+            }
+            endRecording(unionElement);
+            if (doRefresh)
+            {
+              refresh();
+            }
+          }
+          return;
+        }
+        else
+        {
+          dialog = new TypesDialog(shell, element, "type", xsdSchema); //$NON-NLS-1$
+        }
+      }
+      else
+      {
+        dialog = new TypesDialog(shell, element, "type", xsdSchema); //$NON-NLS-1$
+      }
+      beginRecording(XSDEditorPlugin.getXSDString("_UI_TYPE_CHANGE"), element); //$NON-NLS-1$
+      dialog.setBlockOnOpen(true);
+      dialog.create();
+      int result = dialog.open();
+      
+      if (result == Window.OK)
+      {
+        XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)getInput();
+        st.setElement(element);
+        updateSimpleTypeFacets();
+      }
+      endRecording(element);
+    }
+    if (doRefresh)
+    {
+      refresh();
+    }
+  }
+
+  public boolean shouldUseExtraSpace()
+  {
+    return false;
+  }
+
+  
+  protected boolean addCreateElementActionIfNotExist(String elementTag, String label, Element parent, Node relativeNode)
+  {
+    XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)getInput();
+    List attributes = new ArrayList();
+    String reuseType = null;
+    
+    beginRecording(XSDEditorPlugin.getXSDString("_UI_LABEL_VARIETY_CHANGE"), parent); //$NON-NLS-1$
+    if (elementTag.equals(XSDConstants.RESTRICTION_ELEMENT_TAG))
+    {
+      Element listNode = getFirstChildNodeIfExists(parent, XSDConstants.LIST_ELEMENT_TAG, false);
+      if (listNode != null)
+      {
+        reuseType = listNode.getAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE);
+        XSDDOMHelper.removeNodeAndWhitespace(listNode);
+      }
+
+      Element unionNode = getFirstChildNodeIfExists(parent, XSDConstants.UNION_ELEMENT_TAG, false);
+      if (unionNode != null)
+      {
+        String memberAttr = unionNode.getAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);
+        if (memberAttr != null)
+        {
+          StringTokenizer stringTokenizer = new StringTokenizer(memberAttr);
+          reuseType = stringTokenizer.nextToken();
+        }
+        XSDDOMHelper.removeNodeAndWhitespace(unionNode);
+      }
+
+      if (reuseType == null)
+      {
+        reuseType = getBuiltInStringQName();        
+      }
+      attributes.add(new DOMAttribute(XSDConstants.BASE_ATTRIBUTE, reuseType));
+      st.setItemTypeDefinition(null);
+    }
+    else if (elementTag.equals(XSDConstants.LIST_ELEMENT_TAG))
+    {
+      Element restrictionNode = getFirstChildNodeIfExists(parent, XSDConstants.RESTRICTION_ELEMENT_TAG, false);
+      if (restrictionNode != null)
+      {
+        reuseType = restrictionNode.getAttribute(XSDConstants.BASE_ATTRIBUTE);
+        XSDDOMHelper.removeNodeAndWhitespace(restrictionNode);
+      }
+      Element unionNode = getFirstChildNodeIfExists(parent, XSDConstants.UNION_ELEMENT_TAG, false);
+      if (unionNode != null)
+      {
+        String memberAttr = unionNode.getAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);
+        if (memberAttr != null)
+        {
+          StringTokenizer stringTokenizer = new StringTokenizer(memberAttr);
+          reuseType = stringTokenizer.nextToken();
+        }
+        XSDDOMHelper.removeNodeAndWhitespace(unionNode);
+      }
+      attributes.add(new DOMAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE, reuseType));
+    }
+    else if (elementTag.equals(XSDConstants.UNION_ELEMENT_TAG))
+    {
+      Element listNode = getFirstChildNodeIfExists(parent, XSDConstants.LIST_ELEMENT_TAG, false);
+      if (listNode != null)
+      {
+        reuseType = listNode.getAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE);
+        XSDDOMHelper.removeNodeAndWhitespace(listNode);
+      }
+      Element restrictionNode = getFirstChildNodeIfExists(parent, XSDConstants.RESTRICTION_ELEMENT_TAG, false);
+      if (restrictionNode != null)
+      {
+        reuseType = restrictionNode.getAttribute(XSDConstants.BASE_ATTRIBUTE);
+        XSDDOMHelper.removeNodeAndWhitespace(restrictionNode);
+      }
+      attributes.add(new DOMAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE, reuseType));
+      st.setItemTypeDefinition(null);
+    }
+    
+    if (getFirstChildNodeIfExists(parent, elementTag, false) == null)
+    {
+      Action action = addCreateElementAction(elementTag,label,attributes,parent,relativeNode);
+      action.run();
+    }
+
+    st.setElement(parent);
+//    st.updateElement();
+    endRecording(parent);
+    return true;
+  }
+
+  protected Action addCreateElementAction(String elementTag, String label, List attributes, Element parent, Node relativeNode)
+  {
+    CreateElementAction action = new CreateElementAction(label);
+    action.setElementTag(elementTag);
+    action.setAttributes(attributes);
+    action.setParentNode(parent);
+    action.setRelativeNode(relativeNode);
+    return action;
+  }
+
+  
+  protected Element getFirstChildNodeIfExists(Node parent, String elementTag, boolean isRef)
+  {
+    NodeList children = parent.getChildNodes();
+    Element targetNode = null;
+    for (int i=0; i < children.getLength(); i++)
+    {
+      Node child = children.item(i);
+      if (child != null && child instanceof Element)
+      {
+        if (XSDDOMHelper.inputEquals((Element)child, elementTag, isRef))
+        {
+          targetNode = (Element)child;
+          break;
+        }
+      }
+    }
+    return targetNode;
+  }
+
+  protected String getBuiltInStringQName()
+  {
+    String stringName = "string"; //$NON-NLS-1$
+    
+    if (getSchema() != null)
+    {
+      String schemaForSchemaPrefix = getSchema().getSchemaForSchemaQNamePrefix();
+      if (schemaForSchemaPrefix != null && schemaForSchemaPrefix.length() > 0)
+      {
+        String prefix = getSchema().getSchemaForSchemaQNamePrefix();
+        if (prefix != null && prefix.length() > 0)
+        {
+          stringName = prefix + ":" + stringName; //$NON-NLS-1$
+        }
+      }
+    }
+    return stringName;
+  }
+
+  private void updateSimpleTypeFacets()
+  {
+    XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)getInput();
+    Element simpleTypeElement = st.getElement();
+    Element derivedByElement = getDomHelper().getDerivedByElement(simpleTypeElement);
+    if (derivedByElement != null)
+    {
+      List nodesToRemove = new ArrayList();
+      NodeList childList = derivedByElement.getChildNodes();
+      int length = childList.getLength();
+      for (int i = 0; i < length; i++)
+      {
+        Node child = childList.item(i);
+        if (child instanceof Element)
+        {
+          Element elementChild = (Element)child;
+          if (!(elementChild.getLocalName().equals("pattern") || elementChild.getLocalName().equals("enumeration") || //$NON-NLS-1$
+               XSDDOMHelper.inputEquals(elementChild, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false) ||
+               XSDDOMHelper.inputEquals(elementChild, XSDConstants.ANNOTATION_ELEMENT_TAG, false) ||
+               XSDDOMHelper.inputEquals(elementChild, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false) ||
+               XSDDOMHelper.inputEquals(elementChild, XSDConstants.ATTRIBUTE_ELEMENT_TAG, true) ||
+               XSDDOMHelper.inputEquals(elementChild, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, false) ||
+               XSDDOMHelper.inputEquals(elementChild, XSDConstants.ATTRIBUTEGROUP_ELEMENT_TAG, true) ||
+               XSDDOMHelper.inputEquals(elementChild, XSDConstants.ANYATTRIBUTE_ELEMENT_TAG, false)
+               ))
+          {
+            nodesToRemove.add(child);
+          }
+        }
+      }
+      Iterator iter = nodesToRemove.iterator();
+      while (iter.hasNext())
+      {
+        Element facetToRemove = (Element)iter.next();
+        String facetName = facetToRemove.getLocalName();
+        Iterator it = st.getValidFacets().iterator();
+        boolean doRemove = true;
+        while (it.hasNext())
+        {
+          String aValidFacet = (String)it.next();
+          if (aValidFacet.equals(facetName))
+          {
+            doRemove = false;
+            break;
+          }
+        }
+        if (doRemove)
+        {
+          XSDDOMHelper.removeNodeAndWhitespace(facetToRemove);
+        }
+      }
+    }
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeSectionDescriptor.java
new file mode 100644
index 0000000..71871e2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeSectionDescriptor.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+
+
+public class SimpleTypeSectionDescriptor extends AbstractSectionDescriptor
+{
+
+  /**
+   * 
+   */
+  public SimpleTypeSectionDescriptor()
+  {
+    super();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.simpletype";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDSimpleTypeDefinition.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new SimpleTypeSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.general";
+  }
+  
+  public String getAfterSection()
+  {
+    return "com.ibm.xsdeditor.section.name";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDSimpleTypeDefinition)
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeUnionSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeUnionSection.java
new file mode 100644
index 0000000..5754ef2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeUnionSection.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+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.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class SimpleTypeUnionSection extends AbstractSection
+{
+  Text memberTypesText;
+  Button button;
+
+  /**
+   * 
+   */
+  public SimpleTypeUnionSection()
+  {
+    super();
+  }
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		composite = getWidgetFactory().createFlatFormComposite(parent);
+		FormData data;
+
+		memberTypesText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
+		CLabel label = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_MEMBERTYPES")); //$NON-NLS-1$
+    button = getWidgetFactory().createButton(composite, "...", SWT.PUSH); //$NON-NLS-1$
+    
+    memberTypesText.addListener(SWT.Modify, this);
+//    memberTypesText.addSelectionListener(this);
+
+		data = new FormData();
+		data.left = new FormAttachment(0, 100);
+		data.right = new FormAttachment(95, 0);
+		data.top = new FormAttachment(button, 0, SWT.CENTER);
+		memberTypesText.setLayoutData(data);
+
+
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(memberTypesText, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(button, 0, SWT.CENTER);
+		label.setLayoutData(data);
+
+    button.addSelectionListener(this);
+		data = new FormData();
+		data.left = new FormAttachment(memberTypesText, +ITabbedPropertyConstants.HSPACE);
+		data.right = new FormAttachment(100,0);
+		// data.top = new FormAttachment(typeCombo, 0, SWT.CENTER);
+		data.top = new FormAttachment(0,0);
+		button.setLayoutData(data);
+		
+	}
+
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+	  setListenerEnabled(false);
+	  Object input = getInput();
+    if (isReadOnly)
+    {
+      composite.setEnabled(false);
+    }
+    else
+    {
+      composite.setEnabled(true);
+    }
+	  memberTypesText.setText(""); //$NON-NLS-1$
+	  if (input != null)
+	  {
+	    Element element = null;
+	    if (input instanceof XSDSimpleTypeDefinition)
+	    {
+	      XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)input;
+	      element = st.getElement();
+        Element unionElement = (Element)domHelper.getChildNode(element, XSDConstants.UNION_ELEMENT_TAG);
+        String memberTypes = unionElement.getAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);
+        if (memberTypes != null)
+        {
+          memberTypesText.setText(memberTypes);
+        }
+	      
+//        StringBuffer buf = new StringBuffer();	      
+//	      if (st.getMemberTypeDefinitions().size() > 0)
+//	      {
+//	        for (Iterator i = st.getMemberTypeDefinitions().iterator(); i.hasNext(); )
+//	        {
+//	          String name = ((XSDSimpleTypeDefinition)i.next()).getQName(getSchema());
+//	          if (name != null)
+//	          {
+//	            buf.append(name);
+//	            buf.append(" ");
+//	          }
+//	        }
+//	      }
+//	      memberTypesText.setText(buf.toString());
+	    }
+	  }
+	  setListenerEnabled(true);
+	}
+
+  /**
+   * @see org.eclipse.swt.events.SelectionListener#widgetSelected(SelectionEvent)
+   */
+  public void widgetSelected(SelectionEvent e)
+  {
+    if (e.widget == button)
+    {
+	    Shell shell = Display.getCurrent().getActiveShell();
+      
+	    XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)getInput();
+	    Element element = st.getElement();
+      SimpleContentUnionMemberTypesDialog dialog = new SimpleContentUnionMemberTypesDialog(shell, st);
+      dialog.setBlockOnOpen(true);
+      dialog.create();
+      
+      int result = dialog.open();
+      if (result == Window.OK)
+      {
+        String newValue = dialog.getResult();
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_LABEL_MEMBERTYPES_CHANGE"), element); //$NON-NLS-1$
+        Element unionElement = (Element)domHelper.getChildNode(element, XSDConstants.UNION_ELEMENT_TAG);
+        unionElement.setAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE, newValue);
+
+        if (newValue.length() > 0)
+        {
+          unionElement.setAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE, newValue);
+        }
+        else
+        {
+          unionElement.removeAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);  
+        }
+        endRecording(unionElement);
+
+      }
+
+      refresh();
+    }
+  }
+  
+  public void doHandleEvent(Event event)
+  {
+	  if (event.widget == memberTypesText)
+	  {
+	  }
+
+  }
+
+  public boolean shouldUseExtraSpace()
+  {
+    return false;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeUnionSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeUnionSectionDescriptor.java
new file mode 100644
index 0000000..e21bada
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/SimpleTypeUnionSectionDescriptor.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+
+public class SimpleTypeUnionSectionDescriptor extends AbstractSectionDescriptor
+{
+  /**
+   * 
+   */
+  public SimpleTypeUnionSectionDescriptor()
+  {
+    super();
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.simpletypeunion";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDSimpleTypeDefinition.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new SimpleTypeUnionSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.general";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+//    if (selection instanceof StructuredSelection)
+//    {
+//      StructuredSelection structuredSelection = (StructuredSelection)selection;
+//      object = structuredSelection.getFirstElement();
+//      if (object instanceof XSDSimpleTypeDefinition)
+//      {
+//        XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)object;
+//        if (st.getVariety().getValue() == XSDVariety.UNION)
+//        {
+//          return true;
+//        }
+//      }
+//    }
+    return false;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TextChangeHelper.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TextChangeHelper.java
new file mode 100644
index 0000000..0df6ffa
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TextChangeHelper.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+
+public abstract class TextChangeHelper implements Listener
+{
+	private boolean nonUserChange;
+
+	/**
+	 * Marks the start of a programmatic change to the widget contents.
+	 * Clients must call startNonUserChange() before directly setting 
+	 * the widget contents to avoid unwanted lifecycle events.
+	 * @throws IllegalArgumentException if a programmatic change is 
+	 * already in progress.
+	 */
+	public void startNonUserChange() {
+		if (nonUserChange)
+			throw new IllegalStateException("we already started a non user change");//$NON-NLS-1$
+		nonUserChange = true;
+	}
+
+	/**
+	 * Clients who call startNonUserChange() should call 
+	 * finishNonUserChange() as soon as possible after the change is done.
+	 * @throws IllegalArgumentException if no change is in progress.
+	 */
+	public void finishNonUserChange() {
+		if (!nonUserChange)
+			throw new IllegalStateException("we are not in a non user change");//$NON-NLS-1$
+		nonUserChange = false;
+	}
+
+	/**
+	 * Returns true if a programmatic change is in progress.
+	 */
+	public boolean isNonUserChange() {
+		return nonUserChange;
+	}
+
+	/**
+	 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
+	 */
+	public void handleEvent(Event event) {
+		switch (event.type) {
+			case SWT.KeyDown :
+				if (event.character == SWT.CR)
+					textChanged((Control)event.widget);
+				break;
+			case SWT.FocusOut :
+				textChanged((Control)event.widget);
+				break;
+		}
+	}
+
+	/**
+	 * Abstract method notified when a text field has been changed.
+	 * @param control
+	 */
+	public abstract void textChanged(Control control);
+
+	/**
+	 * Registers this helper with the given control to listen for events
+	 * which indicate that a change is in progress (or done).
+	 */
+	public void startListeningTo(Control control) {
+		control.addListener(SWT.FocusOut, this);
+		control.addListener(SWT.Modify, this);
+	}
+
+	/**
+	 * Registers this helper with the given control to listen for the
+	 * Enter key.  When Enter is pressed, the change is considered done 
+	 * (this is only appropriate for single-line Text widgets).
+	 */
+	public void startListeningForEnter(Control control) {
+		// NOTE: KeyDown rather than KeyUp, because of similar usage in CCombo. 
+		control.addListener(SWT.KeyDown, this);
+	}
+
+	/**
+	 * Unregisters this helper from a control previously passed to
+	 * startListeningTo() and/or startListeningForEnter().
+	 */
+	public void stopListeningTo(Control control) {
+		control.removeListener(SWT.FocusOut, this);
+		control.removeListener(SWT.Modify, this);
+		control.removeListener(SWT.KeyDown, this);
+	}
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesDialog.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesDialog.java
new file mode 100644
index 0000000..6af7a8f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesDialog.java
@@ -0,0 +1,722 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+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.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.wst.xsd.ui.internal.widgets.TypeSection;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+public class TypesDialog extends Dialog implements SelectionListener, Listener
+{
+  XSDSchema xsdSchema;
+  String property;
+
+  /**
+   * @param parentShell
+   */
+  public TypesDialog(Shell parentShell, Element element, Object id, XSDSchema xsdSchema)
+  {
+    super(parentShell);
+    setShellStyle(getShellStyle() | SWT.RESIZE);
+    this.element = element;
+    this.property = (String)id;
+    this.element = element;
+    this.xsdSchema = xsdSchema;
+
+    if (XSDDOMHelper.inputEquals(element, XSDConstants.ELEMENT_ELEMENT_TAG, false))
+    {
+      showComplexTypes = true;
+    }
+    else if (XSDDOMHelper.inputEquals(element, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false) ||
+      XSDDOMHelper.inputEquals(element, XSDConstants.LIST_ELEMENT_TAG, false) ||
+      XSDDOMHelper.inputEquals(element, XSDConstants.UNION_ELEMENT_TAG, false))
+    {
+      showComplexTypes = false;
+    }
+  }
+
+  String type;
+  Object typeObject;
+  Text textField;
+  Table table;
+  TableColumn tableColumn;
+  Element element;
+  
+  boolean showComplexTypes = true;
+  TypeSection typeSection;
+  boolean showAnonymous = true;
+  String previousStringType = "";
+  boolean isAnonymous;
+  int previousType;
+
+  protected void configureShell(Shell shell)
+  {
+    super.configureShell(shell);
+  }
+
+  protected void buttonPressed(int buttonId)
+  {
+    if (buttonId == Dialog.OK)
+    {
+      type = table.getItem(table.getSelectionIndex()).getText();
+      ok();
+    }
+    super.buttonPressed(buttonId);
+  }
+
+  public Object getTypeObject() { return typeObject; }
+  public String getType() { return type; }
+
+  //
+  // Create the controls
+  //
+  public Control createDialogArea(Composite parent)
+  {
+    int tabIndex = 0;
+    Composite client = (Composite)super.createDialogArea(parent);
+    getShell().setText(XSDEditorPlugin.getXSDString("_UI_LABEL_AVAILABLE_TYPES"));
+
+    typeObject = null;
+    
+    GridLayout gl = new GridLayout(1, true);
+//    gl.marginHeight = 0;
+//    gl.marginWidth = 0;
+//    gl.horizontalSpacing = 0;
+//    gl.verticalSpacing = 0;
+    client.setLayout(gl);
+
+    GridData gd = new GridData();
+    gd.grabExcessHorizontalSpace = true;
+    gd.grabExcessVerticalSpace = true;
+    gd.horizontalAlignment = GridData.FILL;
+    gd.verticalAlignment = GridData.FILL;
+    gd.horizontalIndent = 0;
+    client.setLayoutData(gd);
+    
+    typeSection = new TypeSection(client);
+    typeSection.setShowUserComplexType(showComplexTypes);
+
+    typeSection.createClient(client);
+    typeSection.getSimpleType().setSelection(false);
+    typeSection.getSimpleType().addSelectionListener(this);
+    typeSection.getUserSimpleType().addSelectionListener(this);
+    if (showComplexTypes)
+    {
+      typeSection.getUserComplexType().addSelectionListener(this);
+    }
+
+    textField = ViewUtility.createTextField(client, 50);
+    textField.addListener(SWT.Modify, this);
+    ViewUtility.createVerticalFiller(client, 0);
+
+    table = new Table(client,
+                      SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); 
+    table.setHeaderVisible(false);
+    table.setLinesVisible(true);
+    table.addSelectionListener(this);
+    
+    GridData gd2 = new GridData();
+    gd2.grabExcessHorizontalSpace = true;
+    gd2.grabExcessVerticalSpace = true;
+    gd2.horizontalAlignment = GridData.FILL;
+    gd2.verticalAlignment = GridData.FILL;
+    gd2.heightHint = 200;
+    table.setLayoutData(gd2);
+    table.addListener(SWT.Resize, this);
+    
+    tableColumn = new TableColumn(table, SWT.LEFT);
+//    tableColumn.setImage(XSDEditorPlugin.getXSDImage("icons/XSDElement.gif"));
+    tableColumn.setResizable(true);
+    tableColumn.setWidth(200);
+
+    // Fill table and select input type
+    handleSetInput();
+
+    return client;
+  }
+  
+  public void handleEvent(Event event)
+  {
+  	if (event.type == SWT.Resize && event.widget == table) {
+  		tableColumn.setWidth(table.getSize().x);
+  	}
+  	else if (event.type == SWT.Modify && event.widget == textField) {
+  		List items = null;
+  		boolean showAll = false;
+  		String inputString = textField.getText();
+  		
+  		if (inputString.equals("")) {
+  			showAll = true;
+  		}
+  		else {
+  			inputString = insertString("*", ".", inputString);
+  			inputString = insertString("?", ".", inputString);
+  			inputString = inputString + ".*";
+  		}
+  		
+  		try {
+  			if (typeSection.getSimpleType().getSelection())
+  			{
+  				if (showAll) {
+  					populateBuiltInType();
+  				}
+  				else {
+  					populateBuiltInType(inputString);
+  				}
+  			}
+  			else if (typeSection.getUserComplexType().getSelection())
+  			{
+  				if (showAll) {
+  					populateUserComplexType();
+  				}
+  				else {
+  					populateUserComplexType(inputString);
+  				}
+  			}
+  			else if (typeSection.getUserSimpleType().getSelection())
+  			{
+  				if (showAll) {
+  					populateUserSimpleType();
+  				}
+  				else {
+  					populateUserSimpleType(inputString);
+  				}
+  			}
+  		}
+  		catch (Exception e) {
+  			// Do nothing
+  		}
+  	}
+  	
+  	setEnabledState();
+  }
+  
+  private void setEnabledState() {
+  	if (table.getSelectionIndex() != -1) {
+  		this.getButton(IDialogConstants.OK_ID).setEnabled(true);
+  	}
+  	else {
+  		this.getButton(IDialogConstants.OK_ID).setEnabled(false);
+  	}
+  }
+  
+  private String insertString(String target, String newString, String string) {
+  	ArrayList list = new ArrayList();
+  	StringBuffer stringBuffer = new StringBuffer(string);
+  	
+  	int index = stringBuffer.indexOf(target);
+  	while (index != -1) {
+  		stringBuffer = stringBuffer.insert(index, newString);
+  		index = stringBuffer.indexOf(target, index + newString.length() + target.length());
+  	}
+  	
+  	return stringBuffer.toString();
+  }
+  
+  public void widgetSelected(SelectionEvent e)
+  {
+    if (e.widget == typeSection.getSimpleType() && typeSection.getSimpleType().getSelection())
+    {
+    	if (textField.getText().equals("")) {
+    		populateBuiltInType();
+    	}
+    	else {
+    		populateBuiltInType(textField.getText());
+    	}
+    }
+    else if (e.widget == typeSection.getUserComplexType() && typeSection.getUserComplexType().getSelection())
+    {
+    	if (textField.getText().equals("")) {
+    		populateUserComplexType();
+    	}
+    	else {
+    		populateUserComplexType(textField.getText());
+    	}
+    }
+    else if (e.widget == typeSection.getUserSimpleType() && typeSection.getUserSimpleType().getSelection())
+    {
+    	if (textField.getText().equals("")) {
+    		populateUserSimpleType();
+    	}
+    	else {
+    		populateUserSimpleType(textField.getText());
+    	}
+    }
+    setEnabledState();
+  }
+  
+	public void widgetDefaultSelected(SelectionEvent e)
+  {
+  }
+
+  protected void ok()
+  {
+    TableItem[] items = table.getItems();
+    int selection = table.getSelectionIndex();
+    if (items != null && items.length > 0 && selection >= 0)
+    {
+      typeObject = items[selection].getData();
+    }
+//    System.out.println("typeObject is " + typeObject);
+
+//    beginRecording(XSDEditorPlugin.getXSDString("_UI_ELEMENT_TYPE_CHANGE"), element);
+//    beginRecording(XSDEditorPlugin.getXSDString("_UI_TYPE_CHANGE"), element);
+//    doSetValue(typeObject);
+//    applyEditorValueAndDeactivate();
+//    dialog.close();
+
+    if (!XSDDOMHelper.inputEquals(element, XSDConstants.UNION_ELEMENT_TAG, false))
+    {
+	    if (typeObject.equals("**anonymous**"))
+	    {
+	      if (typeSection.getUserSimpleType().getSelection())
+	      {
+	        if (!previousStringType.equals("**anonymous**"))
+	        {
+	          updateElementToAnonymous(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+	        }
+	      }
+	      else
+	      {
+	        if (!previousStringType.equals("**anonymous**"))
+	        {
+	          updateElementToAnonymous(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+	        }
+	      }
+	      // element.removeAttribute(XSDConstants.TYPE_ATTRIBUTE);
+	      element.removeAttribute(property);
+	    }
+	    else
+	    {
+	      XSDDOMHelper.updateElementToNotAnonymous(element);
+	      //element.setAttribute(XSDConstants.TYPE_ATTRIBUTE, typeObject.toString());
+	      element.setAttribute(property, typeObject.toString());
+	    }
+    }
+//    endRecording(element);
+
+    //implement dispose();
+//    table.removeAll();
+//    table.dispose();
+  }
+
+	
+  public void handleSetInput()
+  {
+    table.removeAll();
+    isAnonymous = checkForAnonymousType(element);
+    // Attr attr = element.getAttributeNode(XSDConstants.TYPE_ATTRIBUTE);
+    Attr attr = element.getAttributeNode(property);
+    if (attr != null)
+    {
+      String value = attr.getValue();
+      if (typeSection.getBuiltInTypeNamesList(xsdSchema).contains(value))
+      {
+        typeSection.getSimpleType().setSelection(true);
+        populateBuiltInType();
+        int i = typeSection.getBuiltInTypeNamesList(xsdSchema).indexOf(value);
+        table.setSelection(i);
+        previousType = 1;
+      }
+      else if (typeSection.getUserSimpleTypeNamesList(xsdSchema).contains(value))
+      {
+        typeSection.getUserSimpleType().setSelection(true);
+        populateUserSimpleType();
+        int i = typeSection.getUserSimpleTypeNamesList(xsdSchema).indexOf(value);
+        if (showAnonymous)
+        {
+          table.setSelection(i + 1);
+        }
+        else
+        {
+          table.setSelection(i);
+        }
+        previousType = 2;
+      }
+      else if (typeSection.getUserComplexTypeNamesList(xsdSchema).contains(value))
+      {
+        typeSection.getUserComplexType().setSelection(true);
+        populateUserComplexType();
+        int i = typeSection.getUserComplexTypeNamesList(xsdSchema).indexOf(value);
+        if (showAnonymous)
+         {
+          table.setSelection(i + 1);
+        }
+        else
+         {
+          table.setSelection(i);
+        }
+        previousType = 3;
+      }
+      else // if it is type="" for an empty list of simple types
+        {
+        typeSection.getUserSimpleType().setSelection(true);
+        populateUserSimpleType();
+        previousType = 2;
+      }
+    }
+    else
+    {
+      if (isAnonymous)
+      {
+        if (isSTAnonymous(element))
+        {
+          typeSection.getUserSimpleType().setSelection(true);
+          populateUserSimpleType();
+          previousType = 2;
+        }
+        else
+        {
+          typeSection.getUserComplexType().setSelection(true);
+          populateUserComplexType();
+          previousType = 3;
+        }
+        table.setSelection(0); // anonymous
+        //        typeSection.getTypeList().setText("**anonymous**");
+      }
+      else
+      {
+        typeSection.getSimpleType().setSelection(true);
+        populateBuiltInType();
+        table.setSelection(0);
+        
+        //        typeSection.getTypeList().setEnabled(true);
+        //        typeSection.getSimpleType().setSelection(true);
+        //        typeSection.populateBuiltInType(xsdSchema);
+        //        typeSection.getTypeList().setText(XSDEditorPlugin.getXSDString("_UI_NO_TYPE"));
+        previousType = 1;
+      }
+    }
+    if (table.getSelection() != null && table.getSelection().length > 0)
+    {
+      previousStringType = (table.getSelection()[0]).getText();
+    }
+  }
+  
+  public void populateBuiltInType()
+  {
+    table.removeAll();
+    List items = getBuiltInTypeNamesList();
+    for (int i = 0; i < items.size(); i++)
+    {
+      TableItem item = new TableItem(table, SWT.NONE);
+      item.setText(items.get(i).toString());
+      item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+      item.setData(items.get(i));
+    }
+  }
+
+  public void populateBuiltInType(String fragment)
+  {
+    table.removeAll();
+    List items = getBuiltInTypeNamesList();
+    fragment = fragment.toLowerCase();
+	Pattern regex = Pattern.compile(fragment);
+	
+    for (int i = 0; i < items.size(); i++)
+    {
+    	String itemString = items.get(i).toString().toLowerCase();
+    	Matcher m = regex.matcher(itemString);
+
+    	if (itemString.startsWith(fragment) || m.matches()) {
+    		TableItem item = new TableItem(table, SWT.NONE);
+    		item.setText(items.get(i).toString());
+    		item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+    		item.setData(items.get(i));
+    	}
+    }
+    
+    table.select(0);
+  }
+
+  public void populateUserComplexType()
+  {
+    table.removeAll();
+    if (showAnonymous)
+    {
+      TableItem anonymousItem = new TableItem(table, SWT.NONE);
+      anonymousItem.setText("**anonymous**");
+      anonymousItem.setData("**anonymous**");
+    }
+    List items = getUserComplexTypeNamesList();
+    for (int i = 0; i < items.size(); i++)
+    {
+      TableItem item = new TableItem(table, SWT.NONE);
+//      System.out.println("item " + i + " is " + item);
+      item.setText(items.get(i).toString());
+      item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDComplexType.gif"));
+      item.setData(items.get(i));
+    }
+  }
+  
+  public void populateUserComplexType(String fragment)
+  {
+    table.removeAll();
+    fragment = fragment.toLowerCase();
+    Pattern regex = java.util.regex.Pattern.compile(fragment);
+    
+    if (showAnonymous)
+    {
+    	Matcher m = regex.matcher("**anonymous**");
+    	if ("**anonymous**".startsWith(fragment) || m.matches()) {
+    		TableItem anonymousItem = new TableItem(table, SWT.NONE);
+    		anonymousItem.setText("**anonymous**");
+    		anonymousItem.setData("**anonymous**");
+    	}
+    }
+    List items = getUserComplexTypeNamesList();
+    for (int i = 0; i < items.size(); i++)
+    {
+    	String itemString = items.get(i).toString().toLowerCase();
+    	Matcher m = regex.matcher(itemString);
+    	
+    	if (itemString.startsWith(fragment) || m.matches()) {
+    		TableItem item = new TableItem(table, SWT.NONE);
+    		item.setText(items.get(i).toString());
+    		item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDComplexType.gif"));
+    		item.setData(items.get(i));
+    	}
+    }
+    
+    table.select(0);
+  }
+
+  public void populateUserSimpleType()
+  {
+    table.removeAll();
+    if (showAnonymous)
+     {
+      TableItem anonymousItem = new TableItem(table, SWT.NONE);
+      anonymousItem.setText("**anonymous**");
+      anonymousItem.setData("**anonymous**");
+    }
+    List items = getUserSimpleTypeNamesList();
+    for (int i = 0; i < items.size(); i++)
+     {
+      TableItem item = new TableItem(table, SWT.NONE);
+      item.setText(items.get(i).toString());
+      item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+      item.setData(items.get(i));
+    }
+  }
+
+  public void populateUserSimpleType(String fragment)
+  {
+    table.removeAll();
+    fragment = fragment.toLowerCase();
+    Pattern regex = java.util.regex.Pattern.compile(fragment);
+    
+    if (showAnonymous)
+     {
+    	Matcher m = regex.matcher("**anonymous**");
+    	if ("**anonymous**".startsWith(fragment) || m.matches())  {
+    		TableItem anonymousItem = new TableItem(table, SWT.NONE);
+    		anonymousItem.setText("**anonymous**");
+    		anonymousItem.setData("**anonymous**");
+    	}
+    }
+    List items = getUserSimpleTypeNamesList();
+    for (int i = 0; i < items.size(); i++)
+     {
+    	String itemString = items.get(i).toString().toLowerCase();
+    	Matcher m = regex.matcher(itemString);
+    	
+    	if (itemString.startsWith(fragment) || m.matches()) {
+    		TableItem item = new TableItem(table, SWT.NONE);
+    		item.setText(items.get(i).toString());
+    		item.setImage(XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif"));
+    		item.setData(items.get(i));
+    	}
+    }
+    
+    table.select(0);
+  }
+  
+  boolean checkForAnonymousType(Element element)
+  {
+    /*
+     * Using Ed's model to check boolean isAnonymous = false;
+     * 
+     * XSDConcreteComponent component =
+     * getXSDSchema().getCorrespondingComponent(element); if (component
+     * instanceof XSDElementDeclaration) { XSDElementDeclaration xsdElem =
+     * (XSDElementDeclaration)component; isAnonymous =
+     * xsdElem.isSetAnonymousTypeDefinition(); } return isAnonymous;
+     */
+    XSDDOMHelper helper = new XSDDOMHelper();
+    boolean isAnonymous = false;
+    Node aNode =
+    helper.getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+    if (aNode != null)
+     {
+      return true;
+    }
+    aNode = helper.getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+    if (aNode != null)
+     {
+      isAnonymous = true;
+    }
+    return isAnonymous;
+  }
+
+  void updateElementToAnonymous(Element element, String xsdType)
+  {
+    String prefix = element.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+    XSDDOMHelper.updateElementToNotAnonymous(element);
+    boolean hasChildrenElements = hasElementChildren(element);
+    Element childNode = null;
+    if (xsdType.equals(XSDConstants.COMPLEXTYPE_ELEMENT_TAG))
+    {
+      childNode = element.getOwnerDocument().createElementNS(
+          XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001,
+          prefix + XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+    }
+    else if (xsdType.equals(XSDConstants.SIMPLETYPE_ELEMENT_TAG))
+    {
+      childNode = element.getOwnerDocument().createElementNS(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, prefix + XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+    }
+    if (childNode != null)
+    {
+      XSDDOMHelper helper = new XSDDOMHelper();
+      Node annotationNode = helper.getChildNode(element, XSDConstants.ANNOTATION_ELEMENT_TAG);
+      if (annotationNode == null)
+      {
+        Node firstChild = element.getFirstChild();
+        element.insertBefore(childNode, firstChild);
+      }
+      else
+      {
+        Node nextSibling = annotationNode.getNextSibling();
+        element.insertBefore(childNode, nextSibling);
+      }
+      XSDDOMHelper.formatChild(childNode);
+    }
+  }
+
+  boolean isSTAnonymous(Element element)
+  {
+    XSDDOMHelper helper = new XSDDOMHelper();
+    Node aNode = helper.getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+    if (aNode != null)
+    {
+      if (XSDDOMHelper.inputEquals(aNode, XSDConstants.SIMPLETYPE_ELEMENT_TAG, false))
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  boolean isCTAnonymous(Element element)
+  {
+    XSDDOMHelper helper = new XSDDOMHelper();
+    Node aNode = helper.getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+    if (aNode != null)
+     {
+      if (XSDDOMHelper.inputEquals(aNode, XSDConstants.COMPLEXTYPE_ELEMENT_TAG, false))
+       {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  XSDTypeDefinition getAnonymousTypeDefinition(Element element)
+  {
+    XSDDOMHelper helper = new XSDDOMHelper();
+    Node typeDefinitionNode =
+    helper.getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+    if (typeDefinitionNode == null)
+     {
+      typeDefinitionNode = helper.getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+    }
+    if (typeDefinitionNode != null)
+     {
+      XSDConcreteComponent component =
+      xsdSchema.getCorrespondingComponent(typeDefinitionNode);
+      if (component instanceof XSDTypeDefinition)
+       {
+        return (XSDTypeDefinition) component;
+      }
+    }
+    return null;
+  }
+  
+  public java.util.List getBuiltInTypeNamesList()
+  {
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    return helper.getBuiltInTypeNamesList();
+  }
+
+  public java.util.List getUserSimpleTypeNamesList()
+  {
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    return helper.getUserSimpleTypeNamesList();
+  }
+  
+  public java.util.List getUserComplexTypeNamesList()
+  {
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    return helper.getUserComplexTypeNamesList();
+  }
+  
+  protected boolean hasElementChildren(Node parentNode)
+  {
+    boolean hasChildrenElements = false;
+    if (parentNode != null && parentNode.hasChildNodes())
+    {
+      NodeList nodes = parentNode.getChildNodes();
+      for (int i = 0; i < nodes.getLength(); i++)
+      {
+        if (nodes.item(i) instanceof Element)
+        {
+          hasChildrenElements = true;
+          break;
+        }
+      }
+    }
+    return hasChildrenElements;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesSection.java
new file mode 100644
index 0000000..c0d8ab0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesSection.java
@@ -0,0 +1,326 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.widgets.TypeSection;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+public class TypesSection extends AbstractSection
+{
+  Text typeCombo;
+  Button button;
+
+  String type;
+  Object typeObject;
+  CLabel typeLabel;
+  Table table;
+  TypeSection typeSection;
+  boolean showAnonymous = true;
+  String previousStringType = "";
+  boolean isAnonymous;
+  int previousType;
+  boolean showComplexTypes = true;
+  
+  /**
+   * 
+   */
+  public TypesSection()
+  {
+    super();
+  }
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		composite = getWidgetFactory().createFlatFormComposite(parent);
+    
+		FormData data;
+
+		typeCombo = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
+    typeCombo.setEditable(false);
+		typeCombo.addListener(SWT.Modify, this);
+    
+    button = getWidgetFactory().createButton(composite, "", SWT.PUSH); //$NON-NLS-1$
+    button.setImage(XSDEditorPlugin.getXSDImage("icons/browsebutton.gif")); //$NON-NLS-1$
+
+    typeLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_LABEL_TYPE") + ":"); //$NON-NLS-1$
+
+    button.addSelectionListener(this);
+		FormData data2 = new FormData();
+		data2.left = new FormAttachment(100, -rightMarginSpace + 2);
+		data2.right = new FormAttachment(100,0);
+		data2.top = new FormAttachment(typeCombo, 0, SWT.CENTER);
+		button.setLayoutData(data2);
+
+    data = new FormData();
+    data.left = new FormAttachment(0, 100);
+    data.right = new FormAttachment(button, 0);
+    typeCombo.setLayoutData(data);
+	}
+
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+	  Object input = getInput();
+    if (isReadOnly)
+    {
+      composite.setEnabled(false);
+    }
+    else
+    {
+      composite.setEnabled(true);
+    }
+	  typeCombo.setText(""); //$NON-NLS-1$
+	  if (input != null)
+	  {
+	    Element element = null;
+	    if (input instanceof XSDElementDeclaration)
+	    {
+        XSDElementDeclaration xsdElem = (XSDElementDeclaration)input;
+	      element = xsdElem.getElement();
+        XSDTypeDefinition typeDef = xsdElem.getTypeDefinition();
+        boolean isAnonymous = xsdElem.isAbstract();
+
+        if (isAnonymous)
+        {
+          typeCombo.setText("**anonymous**"); //$NON-NLS-1$
+        }
+        else
+        {
+          String typeName = ""; //$NON-NLS-1$
+          if (typeDef != null)
+          {
+            typeName = typeDef.getQName(getSchema());
+            if (typeName == null)
+            {
+              typeName = ""; //$NON-NLS-1$
+            }
+            typeCombo.setText(typeName);
+          }
+          else
+          {
+            typeCombo.setText(XSDEditorPlugin.getXSDString("_UI_NO_TYPE")); //$NON-NLS-1$
+          }
+        }
+	    }
+	    else if (input instanceof XSDAttributeDeclaration)
+	    {
+	      element = ((XSDAttributeDeclaration)input).getElement();
+	    }
+      else if (input instanceof XSDAttributeUse)
+      {
+        XSDAttributeUse attributeUse = (XSDAttributeUse)input;
+        XSDAttributeDeclaration attribute = attributeUse.getAttributeDeclaration();
+        element = attribute.getElement();
+      }
+	    else if (input instanceof Element)
+	    {
+	      element = (Element)input;
+	    }
+//      else if (input instanceof XSDSimpleTypeDefinition)
+//      {
+//	      XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)input;
+//	      Element simpleTypeElement = st.getElement();
+//        if (st.getVariety() == XSDVariety.LIST_LITERAL)
+//        {
+//	        element = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.LIST_ELEMENT_TAG);
+//          String result = element.getAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE);
+//          if (result == null)
+//          {
+//            typeCombo.setText("**anonymous**");
+//          }
+//          else
+//          {
+//            typeCombo.setText(result);
+//          }
+//          typeLabel.setText("Item Type:");
+//        }
+//        else if (st.getVariety() == XSDVariety.ATOMIC_LITERAL)
+//        {
+//          typeLabel.setText("Base Type:");
+//	        element = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.RESTRICTION_ELEMENT_TAG);
+//	        if (element == null)
+//	        {
+//	          element = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.EXTENSION_ELEMENT_TAG);
+//	          if (element == null) return;
+//	        }
+//
+//          String result = element.getAttribute(XSDConstants.BASE_ATTRIBUTE);
+//          if (result == null)
+//          {
+//            typeCombo.setText("");
+//          }
+//          else
+//          {
+//            typeCombo.setText(result);
+//          }
+//        }
+//        return;
+//      }
+      
+      typeLabel.setText(XSDEditorPlugin.getXSDString("_UI_LABEL_TYPE") + ":"); //$NON-NLS-1$
+	    if (element != null)
+	    {
+        boolean isAnonymous = checkForAnonymousType(element);
+        String result = element.getAttribute(XSDConstants.TYPE_ATTRIBUTE);
+	      if (isAnonymous)
+	      {
+	        typeCombo.setText("**anonymous**"); //$NON-NLS-1$
+	      }
+	      if (result != null && result.equals("")) //$NON-NLS-1$
+	      {
+	        typeCombo.setText(XSDEditorPlugin.getXSDString("_UI_NO_TYPE")); //$NON-NLS-1$
+	      }
+	      else if (result != null)
+	      {
+	        typeCombo.setText(result);
+	      }
+
+	    }
+	  }
+	}
+
+  /**
+   * @see org.eclipse.swt.events.SelectionListener#widgetSelected(SelectionEvent)
+   */
+  public void widgetSelected(SelectionEvent e)
+  {
+    if (e.widget == button)
+    {
+	    Shell shell = Display.getCurrent().getActiveShell();
+	    Object input = getInput();
+	    Element element = ((XSDConcreteComponent)getInput()).getElement();
+	    TypesDialog dialog;
+
+//	    if (input instanceof XSDSimpleTypeDefinition)
+//	    {
+//	      XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)input;
+//	      Element simpleTypeElement = st.getElement();
+//	      if (st.getVariety() == XSDVariety.LIST_LITERAL)
+//	      {
+//	        Element listElement = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.LIST_ELEMENT_TAG);
+//	        dialog = new TypesDialog(shell, listElement, XSDConstants.ITEMTYPE_ATTRIBUTE, xsdSchema);
+//          dialog.showComplexTypes = false;
+//        }
+//        else if (st.getVariety() == XSDVariety.ATOMIC_LITERAL)
+//        {
+//          Element derivedByElement = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.RESTRICTION_ELEMENT_TAG);
+//          if (derivedByElement == null)
+//          {
+//            derivedByElement = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.EXTENSION_ELEMENT_TAG);
+//            if (derivedByElement == null) return;
+//          }
+//          if (derivedByElement != null)
+//          {
+//            dialog = new TypesDialog(shell, derivedByElement, XSDConstants.BASE_ATTRIBUTE, xsdSchema);
+//          }
+//          else
+//          {
+//            return;
+//          }
+//        }
+//        else
+//        {
+//          dialog = new TypesDialog(shell, element, "type", xsdSchema);
+//        }
+//	    }
+//	    else
+//	    {
+	      dialog = new TypesDialog(shell, element, "type", xsdSchema); //$NON-NLS-1$
+//	    }
+	    
+	    dialog.setBlockOnOpen(true);
+	    dialog.create();
+	    int result = dialog.open();
+	    
+	    if (result == Window.OK)
+	    {
+	      Object typeObject = dialog.getType();
+//		    if (input instanceof XSDSimpleTypeDefinition)
+//		    {
+//		      XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)input;
+//		      Element simpleTypeElement = st.getElement();
+//	        Element listElement = (Element)domHelper.getChildNode(simpleTypeElement, XSDConstants.LIST_ELEMENT_TAG);
+//
+//  	      beginRecording("ItemType Change", element);
+//          listElement.setAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE, (String)typeObject);
+//          endRecording(element);
+//		    }
+	    }
+
+      refresh();
+    }
+  }
+
+  
+  
+  boolean checkForAnonymousType(Element element)
+  {
+    /* Using Ed's model to check
+     boolean isAnonymous = false;
+
+     XSDConcreteComponent component = getXSDSchema().getCorrespondingComponent(element);
+     if (component instanceof XSDElementDeclaration)
+     {
+     XSDElementDeclaration xsdElem = (XSDElementDeclaration)component;
+     isAnonymous = xsdElem.isSetAnonymousTypeDefinition();
+     }
+     return isAnonymous;
+     */
+
+    boolean isAnonymous = false;
+
+    Node aNode = getDomHelper().getChildNode(element, XSDConstants.SIMPLETYPE_ELEMENT_TAG);
+    if (aNode != null)
+     {
+      return true;
+    }
+    aNode = getDomHelper().getChildNode(element, XSDConstants.COMPLEXTYPE_ELEMENT_TAG);
+    if (aNode != null)
+     {
+      isAnonymous = true;
+    }
+    return isAnonymous;
+  }
+
+  public boolean shouldUseExtraSpace()
+  {
+    return false;
+  }
+
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesSectionDescriptor.java
new file mode 100644
index 0000000..af0e55b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/TypesSectionDescriptor.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class TypesSectionDescriptor extends AbstractSectionDescriptor
+{
+  /**
+   * 
+   */
+  public TypesSectionDescriptor()
+  {
+    super();
+  }
+
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getId()
+   */
+  public String getId()
+  {
+    return "com.ibm.xsdeditor.section.types";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDElementDeclaration.class);
+    list.add(XSDAttributeDeclaration.class);
+    list.add(XSDAttributeUse.class);
+    list.add(XSDSimpleTypeDefinition.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new TypesSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.general";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDElementDeclaration)
+      {
+        XSDElementDeclaration elementDeclaration = (XSDElementDeclaration)object;
+        if (elementDeclaration.isElementDeclarationReference())
+        {
+          return false;
+        }
+        return true;
+      }
+      else if (object instanceof XSDAttributeDeclaration)
+      {
+        XSDAttributeDeclaration attr = (XSDAttributeDeclaration)object;
+        if (attr.isAttributeDeclarationReference())
+        {
+          return false;
+        }
+        return true;
+      }
+      else if (object instanceof XSDAttributeUse)
+      {
+        XSDAttributeUse attributeUse = (XSDAttributeUse)object;
+        XSDAttributeDeclaration attribute = attributeUse.getAttributeDeclaration();
+        Element element = attributeUse.getElement();
+        if (inputEquals(element, XSDConstants.ATTRIBUTE_ELEMENT_TAG, false))
+        {
+          return true;
+        }
+        else
+        {
+          return false;
+        }
+
+      }
+//      else if (object instanceof XSDSimpleTypeDefinition)
+//      {
+//        XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)object;
+//        if (st.getVariety() == XSDVariety.LIST_LITERAL)
+//        {
+//          return true;
+//        }
+//        else if (st.getVariety() == XSDVariety.ATOMIC_LITERAL)
+//        {
+//          return true;
+//        }
+//      }
+    }
+    return false;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ValueSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ValueSection.java
new file mode 100644
index 0000000..c24f79d
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ValueSection.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CLabel;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertyConstants;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDEnumerationFacet;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class ValueSection extends AbstractSection
+{
+  Text valueText;
+  /**
+   * 
+   */
+  public ValueSection()
+  {
+    super();
+  }
+
+	/**
+	 * @see org.eclipse.wst.common.ui.properties.ITabbedPropertySection#createControls(org.eclipse.swt.widgets.Composite, org.eclipse.wst.common.ui.properties.TabbedPropertySheetWidgetFactory)
+	 */
+	public void createControls(Composite parent, TabbedPropertySheetWidgetFactory factory)
+	{
+		super.createControls(parent, factory);
+		Composite composite =	getWidgetFactory().createFlatFormComposite(parent);
+		FormData data;
+
+		valueText = getWidgetFactory().createText(composite, ""); //$NON-NLS-1$
+		data = new FormData();
+		data.left = new FormAttachment(0, 100);
+		data.right = new FormAttachment(100, 0);
+		data.top = new FormAttachment(0, 0);
+		valueText.setLayoutData(data);
+		valueText.addListener(SWT.Modify, this);
+
+		CLabel valueLabel = getWidgetFactory().createCLabel(composite, XSDEditorPlugin.getXSDString("_UI_VALUE") + ":"); //$NON-NLS-1$
+		data = new FormData();
+		data.left = new FormAttachment(0, 0);
+		data.right = new FormAttachment(valueText, -ITabbedPropertyConstants.HSPACE);
+		data.top = new FormAttachment(valueText, 0, SWT.CENTER);
+		valueLabel.setLayoutData(data);
+		
+//		listener.startListeningForEnter(valueText);
+//		listener.startListeningTo(valueText);
+	}
+
+	/*
+	 * @see org.eclipse.wst.common.ui.properties.view.ITabbedPropertySection#refresh()
+	 */
+	public void refresh()
+	{
+	  setListenerEnabled(false);
+	  Object input = getInput();
+	  valueText.setText(""); //$NON-NLS-1$
+	  if (input != null)
+	  {
+	    if (input instanceof XSDEnumerationFacet)
+	    {
+	      XSDEnumerationFacet enumFacet = (XSDEnumerationFacet)input;
+	      Element element = enumFacet.getElement();
+        String value = element.getAttribute(XSDConstants.VALUE_ATTRIBUTE);
+        
+        if (value != null)
+        {
+          valueText.setText(value);
+        }
+	    }
+	  }
+	  setListenerEnabled(true);
+	}
+	
+  public void doHandleEvent(Event event)
+  {
+    if (event.widget == valueText)
+    {
+      Object input = getInput();
+	    if (input instanceof XSDEnumerationFacet)
+	    {
+	      XSDEnumerationFacet enumFacet = (XSDEnumerationFacet)input;
+	      Element element = enumFacet.getElement();
+        
+        beginRecording(XSDEditorPlugin.getXSDString("_UI_ENUM_VALUE_CHANGE"), element); //$NON-NLS-1$
+        String value = valueText.getText();
+        element.setAttribute(XSDConstants.VALUE_ATTRIBUTE, value);
+        endRecording(element);
+	    }
+    }
+  }
+
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISection#shouldUseExtraSpace()
+   */
+  public boolean shouldUseExtraSpace()
+  {
+    return false;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ValueSectionDescriptor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ValueSectionDescriptor.java
new file mode 100644
index 0000000..7fd5517
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/ValueSectionDescriptor.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ISection;
+import org.eclipse.xsd.XSDEnumerationFacet;
+
+public class ValueSectionDescriptor extends AbstractSectionDescriptor
+{
+  /**
+   * 
+   */
+  public ValueSectionDescriptor()
+  {
+    super();
+  }
+  
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getInputTypes()
+   */
+  public List getInputTypes()
+  {
+    List list = new ArrayList();
+    list.add(XSDEnumerationFacet.class);
+    return list;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getSectionClass()
+   */
+  public ISection getSectionClass()
+  {
+    return new ValueSection();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#getTargetTab()
+   */
+  public String getTargetTab()
+  {
+    return "com.ibm.xmlwebservices.general";
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptor#appliesTo(org.eclipse.ui.IWorkbenchPart, org.eclipse.jface.viewers.ISelection)
+   */
+  public boolean appliesTo(IWorkbenchPart part, ISelection selection)
+  {
+    Object object = null;
+    if (selection instanceof StructuredSelection)
+    {
+      StructuredSelection structuredSelection = (StructuredSelection)selection;
+      object = structuredSelection.getFirstElement();
+      if (object instanceof XSDEnumerationFacet)
+      {
+        return true;
+      }
+    }
+    return false;
+  }
+  
+  public String getAfterSection()
+  {
+    return "com.ibm.xsdeditor.section.name";
+  }
+
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDSectionDescriptorProvider.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDSectionDescriptorProvider.java
new file mode 100644
index 0000000..7b9e43c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDSectionDescriptorProvider.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.wst.common.ui.properties.ISectionDescriptor;
+import org.eclipse.wst.common.ui.properties.ISectionDescriptorProvider;
+
+
+public class XSDSectionDescriptorProvider implements ISectionDescriptorProvider
+{
+  /**
+   * 
+   */
+  public XSDSectionDescriptorProvider()
+  {
+    super();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.wst.common.ui.properties.ISectionDescriptorProvider#getSectionDescriptors()
+   */
+  public ISectionDescriptor[] getSectionDescriptors()
+  {
+    ISectionDescriptor[] descriptors = new ISectionDescriptor[18];
+    descriptors[0] = new NameSectionDescriptor();
+    descriptors[1] = new TypesSectionDescriptor();
+    descriptors[2] = new OtherAttributesSectionDescriptor();
+    descriptors[3] = new AttributesViewSectionDescriptor();
+    descriptors[4] = new ModelGroupSectionDescriptor();
+    descriptors[5] = new NamespaceProcessContentsSectionDescriptor();
+    descriptors[6] = new ReferenceSectionDescriptor();
+    descriptors[7] = new ComplexTypeSectionDescriptor();
+    descriptors[8] = new ValueSectionDescriptor();
+    descriptors[9] = new PatternSectionDescriptor();
+    descriptors[10] = new AnnotationSectionDescriptor();
+    descriptors[11] = new SimpleTypeSectionDescriptor();
+    descriptors[12] = new FacetsSectionDescriptor();
+    descriptors[13] = new EnumerationsSectionDescriptor();
+    descriptors[14] = new NamespaceSectionDescriptor();
+    descriptors[15] = new SchemaLocationDescriptor();
+    descriptors[16] = new NamespaceAndSchemaLocationDescriptor();
+    descriptors[17] = new MinMaxSectionDescriptor();
+    
+//  descriptors[18] = new SimpleTypeUnionSectionDescriptor();
+//  descriptors[19] = new FixedDefaultSectionDescriptor();    
+    return descriptors;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDSectionLabelProvider.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDSectionLabelProvider.java
new file mode 100644
index 0000000..d5c6578
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDSectionLabelProvider.java
@@ -0,0 +1,169 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.util.Assert;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.XSDTextEditor;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.w3c.dom.Element;
+
+
+public class XSDSectionLabelProvider extends LabelProvider
+{
+  /**
+   * 
+   */
+  public XSDSectionLabelProvider()
+  {
+    super();
+  }
+
+	/**
+	 * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+	 */
+	public Image getImage(Object object)
+	{
+		if (object == null || object.equals(StructuredSelection.EMPTY)) {
+			return null;
+		}
+    Image result = null;           
+    if (object instanceof StructuredSelection)
+    {
+      Object selected = ((StructuredSelection)object).getFirstElement();
+      
+      if (selected instanceof XSDConcreteComponent)
+      {
+        return XSDTextEditor.getLabelProvider().getImage((XSDConcreteComponent)selected);
+      }
+      
+//      selected  = typeMapper.remapObject(selected);
+//      ModelAdapter modelAdapter = adapterFactory.getAdapter(selected);
+//      if (modelAdapter != null)
+//      {
+//        result = (Image)modelAdapter.getProperty(selected, ModelAdapter.IMAGE_PROPERTY);     
+//      }
+    }
+    return result;
+	}
+
+	/**
+	 * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+	 */
+	public String getText(Object object)
+	{
+		if (object == null || object.equals(StructuredSelection.EMPTY))
+    {
+			return "No items selected";
+		}
+    
+    String result = null;
+
+    boolean isReference = false;
+    Object selected = null;
+    if (object instanceof StructuredSelection)
+    {
+      selected = ((StructuredSelection)object).getFirstElement();
+      
+      if (selected instanceof XSDConcreteComponent)
+      {
+        if (selected instanceof XSDElementDeclaration)
+        {
+          XSDElementDeclaration xsdElementDeclaration = (XSDElementDeclaration)selected;
+          if (xsdElementDeclaration.isElementDeclarationReference())
+          {
+            isReference = true;
+          }
+        }
+        else if (selected instanceof XSDAttributeDeclaration)
+        {
+          if (((XSDAttributeDeclaration)selected).isAttributeDeclarationReference())
+          {
+            isReference = true;
+          }
+        }
+        else if (selected instanceof XSDModelGroupDefinition)
+        {
+          if (((XSDModelGroupDefinition)selected).isModelGroupDefinitionReference())
+          {
+            isReference = true;
+          }
+        }
+        StringBuffer sb = new StringBuffer();
+        Element element = ((XSDConcreteComponent)selected).getElement();
+        if (element != null)
+        {
+          sb.append(((XSDConcreteComponent)selected).getElement().getLocalName());
+          
+          if (isReference)
+          {
+            sb.append(" ");
+            sb.append(XSDEditorPlugin.getXSDString("_UI_PAGE_HEADING_REFERENCE"));
+          }
+          
+          if (!(element instanceof XMLNode))
+          {
+            sb.append(" (" + XSDEditorPlugin.getXSDString("_UI_LABEL_READ_ONLY") + ")");   //$NON-NLS-1$
+          }
+          return sb.toString();
+        }
+        else
+        {
+          return "(" + XSDEditorPlugin.getXSDString("_UI_LABEL_READ_ONLY") + ")";  //$NON-NLS-1$
+        }
+      }
+
+//      selected  = typeMapper.remapObject(selected);
+//      
+//       ModelAdapter modelAdapter = adapterFactory.getAdapter(selected);
+//       if (modelAdapter != null)
+//       {                       
+//         // result = (String)modelAdapter.getProperty(selected, ModelAdapter.LABEL_PROPERTY);
+//         result = ((WSDLElement)selected).getElement().getLocalName();
+//       }
+      if (object instanceof Element)
+      {
+        return ((Element)object).getLocalName();
+      }
+    }
+    else if (object instanceof TextSelection)
+    {
+    }
+    
+
+    return result;
+	}
+
+	/**
+	 * 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;
+		return object;
+	}
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDTabbedPropertySheetPage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDTabbedPropertySheetPage.java
new file mode 100644
index 0000000..1435ed7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDTabbedPropertySheetPage.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.jface.text.TextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.wst.common.ui.properties.ITabbedPropertySheetPageContributor;
+import org.eclipse.wst.common.ui.properties.TabbedPropertySheetPage;
+import org.eclipse.wst.sse.ui.ViewerSelectionManager;
+import org.eclipse.wst.xsd.ui.internal.XSDSelectionManager;
+import org.eclipse.wst.xsd.ui.internal.graph.model.Category;
+import org.eclipse.wst.xsd.ui.internal.provider.CategoryAdapter;
+import org.eclipse.wst.xsd.ui.internal.provider.XSDModelAdapterFactoryImpl;
+import org.eclipse.xsd.XSDSchema;
+
+public class XSDTabbedPropertySheetPage extends TabbedPropertySheetPage
+  implements ISelectionChangedListener, INotifyChangedListener 
+{
+  private ViewerSelectionManager fViewerSelectionManager;
+  private XSDSelectionManager selectionManager;
+  private XSDModelAdapterFactoryImpl adapterFactory;
+  /**
+   * @param tabbedPropertySheetPageContributor
+   */
+  public XSDTabbedPropertySheetPage(ITabbedPropertySheetPageContributor tabbedPropertySheetPageContributor)
+  {
+    super(tabbedPropertySheetPageContributor);
+  }
+  
+  XSDSchema xsdSchema;
+  public void setXSDSchema(XSDSchema xsdSchema)
+  {
+    this.xsdSchema = xsdSchema;
+  }
+  
+  public void setXSDModelAdapterFactory(XSDModelAdapterFactoryImpl adapterFactory) {
+    // disconnect from old one
+    if (adapterFactory != null) {
+      adapterFactory.removeListener(this);
+    }
+
+    this.adapterFactory = adapterFactory;
+
+    // connect to new one
+    if (adapterFactory != null) {
+      adapterFactory.addListener(this);
+    }
+  }
+  
+  public void setSelectionManager(XSDSelectionManager newSelectionManager)
+  { 
+    // disconnect from old one
+    if (selectionManager != null)
+    {                                                        
+      selectionManager.removeSelectionChangedListener(this);  
+    }
+
+    selectionManager = newSelectionManager;
+
+    // connect to new one
+    if (selectionManager != null)
+    {
+      selectionManager.addSelectionChangedListener(this);  
+    }
+  }    
+
+  public void selectionChanged(IWorkbenchPart part, ISelection selection)
+  {
+    // override for category
+    if (selection != null)
+    {
+      if (selection instanceof StructuredSelection)
+      {
+        StructuredSelection structuredSelection = (StructuredSelection)selection;
+        if (structuredSelection.isEmpty())
+        {
+          return;
+        }
+        Object obj = structuredSelection.getFirstElement();        
+        if (obj instanceof CategoryAdapter)
+        {
+          selection = new StructuredSelection(((CategoryAdapter)obj).getXSDSchema());
+        }
+        else if (obj instanceof Category)
+        {
+          selection = new StructuredSelection(((Category)obj).getXSDSchema());
+        }  
+      }
+      else if (selection instanceof TextSelection)
+      {
+        return;
+      }
+    }
+    super.selectionChanged(part, selection);
+  }
+	
+  public void selectionChanged(SelectionChangedEvent event)
+  {
+    if (!event.getSelection().isEmpty())
+    {
+      selectionChanged(getSite().getWorkbenchWindow().getActivePage().getActivePart(), event.getSelection());
+      //super.selectionChanged(getSite().getWorkbenchWindow().getActivePage().getActivePart(), event.getSelection());
+    }
+  }
+  
+  public void dispose()
+  {
+    if (selectionManager != null)
+    {
+      selectionManager.removeSelectionChangedListener(this);
+    }
+    if (adapterFactory != null)
+    {
+      adapterFactory.removeListener(this);
+    }
+    super.dispose();
+  }
+  
+  public void notifyChanged(Notification notification)
+  {
+    if (getCurrentTab() != null)
+    {
+      refresh();
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDWorkbook.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDWorkbook.java
new file mode 100644
index 0000000..9c43704
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDWorkbook.java
@@ -0,0 +1,97 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+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.widgets.Composite;
+
+public class XSDWorkbook {
+  private CTabFolder tabFolder;
+  private CTabItem selectedTab;
+/**
+ * Workbook constructor comment.
+ */
+public XSDWorkbook(Composite parent, int style) {
+  tabFolder = new CTabFolder(parent, style);
+
+  tabFolder.addSelectionListener(new SelectionAdapter() {
+    public void widgetSelected(SelectionEvent event) {
+      CTabItem newSelectedTab = (CTabItem) event.item;
+      if (selectedTab == newSelectedTab) // Do nothing if the selection did not change.
+        return;
+
+      if (selectedTab != null && (!selectedTab.isDisposed())) {
+        XSDWorkbookPage selectedPage = getWorkbookPage(selectedTab);
+        if (!selectedPage.deactivate()) {
+          // tabFolder.setSelection(new CTabItem[] {selectedTab});
+          tabFolder.setSelection(selectedTab);
+          return;
+        }
+      }
+
+      selectedTab = newSelectedTab;
+      XSDWorkbookPage newSelectedPage = getWorkbookPage(newSelectedTab);
+      if (newSelectedPage != null)
+      newSelectedPage.activate();
+
+    }
+  });
+
+}
+public XSDWorkbookPage getSelectedPage() {
+
+  int index = tabFolder.getSelectionIndex();
+  if (index == -1) // When can this be -1
+    return null;
+
+  CTabItem selectedItem = tabFolder.getItem(index);
+
+  return (XSDWorkbookPage)selectedItem.getData();
+}
+public CTabFolder getTabFolder() {
+
+  return tabFolder;
+
+}
+protected XSDWorkbookPage getWorkbookPage(CTabItem item) {
+
+  try {
+    return (XSDWorkbookPage) item.getData();
+  } catch (ClassCastException e) {
+    return null;
+  }
+}
+public XSDWorkbookPage[] getWorkbookPages() {
+
+  CTabItem[] tabItems = tabFolder.getItems();
+  int nItems = tabItems.length;
+  XSDWorkbookPage[] workbookPages = new XSDWorkbookPage[nItems];
+  for (int i = 0; i < nItems; i++)
+    workbookPages[i] = getWorkbookPage(tabItems[i]);
+  return workbookPages;
+}
+public void setSelectedPage (XSDWorkbookPage workbookPage)
+{
+  CTabItem newSelectedTab = workbookPage.getTabItem();
+
+  if (selectedTab == newSelectedTab)
+    return;
+
+  selectedTab = newSelectedTab;
+  workbookPage.activate();
+  // tabFolder.setSelection(new CTabItem[] {newSelectedTab});
+  tabFolder.setSelection(newSelectedTab);
+
+}
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDWorkbookPage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDWorkbookPage.java
new file mode 100644
index 0000000..f865afa
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/properties/section/XSDWorkbookPage.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.properties.section;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+public abstract class XSDWorkbookPage {
+  public CTabItem tabItem;
+/**
+ * WorkbookPage constructor comment.
+ */
+public XSDWorkbookPage(XSDWorkbook parent) {
+  CTabFolder folder = parent.getTabFolder();
+  tabItem = new CTabItem(folder,SWT.NONE);
+  tabItem.setData(this);
+}
+public void activate() {
+
+  if (tabItem.getControl() == null)
+    tabItem.setControl(createControl(tabItem.getParent()));
+      
+}
+protected abstract Control createControl (Composite parent);
+public boolean deactivate() {
+  return true;
+}
+public void dispose() {
+
+  if (tabItem == null)
+    return;
+
+  CTabItem oldItem = tabItem;
+  tabItem = null;
+  oldItem.dispose();
+}
+public CTabItem getTabItem() {
+  return tabItem;
+}
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/CategoryAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/CategoryAdapter.java
new file mode 100644
index 0000000..3182e9a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/CategoryAdapter.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.Collection;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.edit.provider.IChangeNotifier;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.xsd.XSDSchema;
+
+
+public class CategoryAdapter // extends ItemProvider
+  implements ILabelProvider, IChangeNotifier, ITreeContentProvider
+{
+  
+  protected String text;
+
+  /**
+   * This is the image returned by {@link #getImage getImage(Object)}.
+   */
+  protected Image image;
+
+  /**
+   * This is the parent returned by {@link #getParent getParent(Object)}.
+   */
+  protected Object parent;
+
+  public CategoryAdapter(String label, Image image, Collection children, XSDSchema xsdSchema, int groupType)
+  {
+//    super(label, image, xsdSchema);
+    this.text = label;
+    this.image = image;
+    this.parent = xsdSchema;
+    this.xsdSchema = xsdSchema;
+    this.children = children;
+    this.groupType = groupType;
+  }
+  
+  public final static int ATTRIBUTES = 1;
+  public final static int ELEMENTS = 2;
+  public final static int TYPES = 3;
+  public final static int GROUPS = 5;
+  public final static int DIRECTIVES = 6;
+  public final static int NOTATIONS = 7;
+  public final static int ATTRIBUTE_GROUPS = 8;
+  public final static int IDENTITY_CONSTRAINTS = 9;
+  public final static int ANNOTATIONS = 10;
+                                 
+  protected int groupType;
+  Collection children;
+  XSDSchema xsdSchema;
+  
+  public XSDSchema getXSDSchema()
+  {
+    return xsdSchema;
+  }
+  
+  public int getGroupType()
+  {
+    return groupType;
+  }   
+
+//  public boolean hasChildren(Object o)
+//  {
+//    return !children.isEmpty();
+//  }
+
+//  public Collection getChildren(Object o)
+//  {
+//    return children;
+//  }
+  
+  public Image getImage(Object element)
+  {
+    return image;
+  }
+  
+  public String getText(Object object)
+  {
+    // return object.toString();
+    return text;
+  }
+  
+  public void addListener(ILabelProviderListener listener)
+  {
+    
+  }
+  
+  public boolean isLabelProperty(Object element, String property)
+  {
+    return false;
+  }
+
+  public void removeListener(ILabelProviderListener listener)
+  {
+    
+  }
+
+  public void fireNotifyChanged(Notification notification)
+  {
+    
+  }
+
+  /**
+   * This adds another listener.
+   */
+  public void addListener(INotifyChangedListener notifyChangedListener)
+  {
+    
+  }
+
+  /**
+   * This removes a listener.
+   */
+  public void removeListener(INotifyChangedListener notifyChangedListener)
+  {
+    
+  }
+
+  public void dispose()
+  {
+    
+  }
+  
+  public Object[] getElements(Object inputElement)
+  {
+    return getChildren(inputElement);
+  }
+
+  public Object[] getChildren(Object parentElement)
+  {
+    return children.toArray();
+  }
+  
+  public void setChildren(Collection list)
+  {
+    children = list;
+  }
+
+  public Object getParent(Object element)
+  {
+    return xsdSchema;
+  }
+  
+  public boolean hasChildren(Object element)
+  {
+    return true;
+  }
+
+  public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
+  {
+    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAbstractAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAbstractAdapter.java
new file mode 100644
index 0000000..8233c5e
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAbstractAdapter.java
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+
+import java.util.ArrayList;
+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.AdapterImpl;
+import org.eclipse.emf.edit.provider.ChangeNotifier;
+import org.eclipse.emf.edit.provider.IChangeNotifier;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.graphics.Image;
+
+public class XSDAbstractAdapter extends AdapterImpl
+  implements ITreeContentProvider, ILabelProvider, IChangeNotifier
+{
+
+  protected AdapterFactory adapterFactory;
+  /**
+   * 
+   */
+  public XSDAbstractAdapter(AdapterFactory adapterFactory)
+  {
+    super();
+    this.adapterFactory = adapterFactory;
+  }
+  
+  /**
+   * The adapter factory is used as the type key.
+   * This returns true, only if this adapter was created by the given factory.
+   */
+  public boolean isAdapterForType(Object type)
+  {
+    return type == adapterFactory;
+  }
+
+  public Image getImage(Object element)
+  {
+    return null;
+  }
+  
+  public String getText(Object object)
+  {
+    return object.toString();
+  }
+  
+  public void addListener(ILabelProviderListener listener)
+  {
+    
+  }
+  
+  public boolean isLabelProperty(Object element, String property)
+  {
+    return false;
+  }
+
+  public void removeListener(ILabelProviderListener listener)
+  {
+    
+  }
+  
+  public Object[] getChildren(Object parentElement)
+  {
+    List list = new ArrayList();
+    return list.toArray();
+  }
+  
+  public boolean hasChildren(Object object)
+  {
+    return false;
+  }
+
+  public Object getParent(Object object)
+  {
+    return null;
+  }
+
+  public Object[] getElements(Object inputElement)
+  {
+    return getChildren(inputElement);
+  }
+
+  public void dispose()
+  {
+    
+  }
+  
+  public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
+  {
+    
+  }
+
+  /**
+   * This is used to implement {@link IChangeNotifier}.
+   */
+  protected IChangeNotifier changeNotifier;
+
+  
+  public void notifyChanged(Notification msg)
+  {                        
+    if (msg.getEventType() != Notification.RESOLVE)
+    {        
+      fireNotifyChanged(msg);
+    }
+  }  
+
+  /**
+   * This calls {@link org.eclipse.emf.edit.provider.INotifyChangedListener#notifyChanged notifyChanged} for each listener.
+   */
+  public void fireNotifyChanged(Notification notification)
+  {
+    if (changeNotifier != null)
+    {
+      changeNotifier.fireNotifyChanged(notification);
+    }
+
+    if (adapterFactory instanceof IChangeNotifier)
+    {
+      IChangeNotifier changeNotifier = (IChangeNotifier)adapterFactory;
+      changeNotifier.fireNotifyChanged(notification);
+    }
+  }
+
+
+  /**
+   * This adds another listener.
+   */
+  public void addListener(INotifyChangedListener notifyChangedListener)
+  {
+    if (changeNotifier == null)
+    {
+      changeNotifier = new ChangeNotifier();
+    }
+    changeNotifier.addListener(notifyChangedListener);
+   
+  }
+
+  /**
+   * This removes a listener.
+   */
+  public void removeListener(INotifyChangedListener notifyChangedListener)
+  {
+    if (changeNotifier != null)
+    {
+      changeNotifier.removeListener(notifyChangedListener);
+    }
+   
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAdapterFactoryLabelProvider.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAdapterFactoryLabelProvider.java
new file mode 100644
index 0000000..6587060
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAdapterFactoryLabelProvider.java
@@ -0,0 +1,160 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+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.emf.edit.provider.IChangeNotifier;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+public class XSDAdapterFactoryLabelProvider implements ILabelProvider, INotifyChangedListener, ITableLabelProvider
+{
+  protected XSDModelAdapterFactoryImpl adapterFactory;
+  protected Collection labelProviderListeners;
+  
+  private static final Class ILabelProviderClass = ILabelProvider.class;
+  private static final Class ITableLabelProviderClass = ITableLabelProvider.class;
+
+  /**
+   * 
+   */
+  public XSDAdapterFactoryLabelProvider(XSDModelAdapterFactoryImpl adapterFactory)
+  {
+    this.adapterFactory = adapterFactory;
+//    if (adapterFactory instanceof IChangeNotifier)
+//    {
+//      ((IChangeNotifier)adapterFactory).addListener(this);
+//    }
+
+    labelProviderListeners = new ArrayList();
+  }
+
+  /**
+   * Return the wrapped AdapterFactory.
+   */
+  public AdapterFactory getAdapterFactory()
+  {
+    return adapterFactory;
+  }
+
+  /**
+   * Set the wrapped AdapterFactory.
+   */
+  public void setAdapterFactory(XSDModelAdapterFactoryImpl adapterFactory)
+  {
+    if (this.adapterFactory instanceof IChangeNotifier)
+    {
+      ((IChangeNotifier)this.adapterFactory).removeListener(this);
+    }
+
+    if (adapterFactory instanceof IChangeNotifier)
+    {
+      ((IChangeNotifier)adapterFactory).addListener(this);
+    }
+
+    this.adapterFactory = adapterFactory;
+  }
+
+  /**
+   * Since we won't ever generate these notifications, we can just ignore this.
+   */
+  public void addListener(ILabelProviderListener listener) 
+  {
+    labelProviderListeners.add(listener);
+  }
+
+  /**
+   * Since we won't ever add listeners, we can just ignore this.
+   */
+  public void removeListener(ILabelProviderListener listener)
+  {
+    labelProviderListeners.remove(listener);
+  }
+
+  /**
+   * This discards the content provider and removes this as a listener to the {@link #adapterFactory}.
+   */
+  public void dispose()
+  {
+    if (this.adapterFactory instanceof IChangeNotifier)
+    {
+      ((IChangeNotifier)adapterFactory).removeListener(this);
+    }
+  }
+
+  /**
+   * This always returns true right now.
+   */
+  public boolean isLabelProperty(Object object, String id)
+  {
+    return true;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ILabelProvider#getImage(java.lang.Object)
+   */
+  public Image getImage(Object object)
+  {
+    ILabelProvider labelProvider = (ILabelProvider)adapterFactory.adapt(object, ILabelProviderClass);
+
+    return 
+      labelProvider != null ?
+        labelProvider.getImage(object) : null;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
+   */
+  public String getText(Object object)
+  {
+    // Get the adapter from the factory.
+    //
+    ILabelProvider labelProvider = (ILabelProvider)adapterFactory.adapt(object, ILabelProviderClass);
+
+    return
+      labelProvider != null ?
+        labelProvider.getText(object) :
+        object == null ? 
+          "" :
+          object.toString();
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.emf.edit.provider.INotifyChangedListener#notifyChanged(org.eclipse.emf.common.notify.Notification)
+   */
+  public void notifyChanged(Notification notification)
+  {
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+   */
+  public Image getColumnImage(Object element, int columnIndex)
+  {
+    return null;
+  }
+
+  /* (non-Javadoc)
+   * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+   */
+  public String getColumnText(Object element, int columnIndex)
+  {
+    return null;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAnnotationAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAnnotationAdapter.java
new file mode 100644
index 0000000..b57a4c5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAnnotationAdapter.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDAnnotation;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class XSDAnnotationAdapter extends XSDAbstractAdapter
+{
+  public XSDAnnotationAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  public Image getImage(Object element)
+  {
+    return XSDEditorPlugin.getPlugin().getImage("icons/XSDAnnotate.gif");
+  }
+  
+  public String getText(Object object)
+  {
+    XSDAnnotation xsdAnnotation = ((XSDAnnotation)object);
+    String result = "";
+    List userInformation = xsdAnnotation.getUserInformation();
+    if (!userInformation.isEmpty())
+    {
+      Element element = (Element)userInformation.get(0);
+      if (element.hasAttribute(XSDConstants.SOURCE_ATTRIBUTE))
+      {
+        result = element.getAttribute(XSDConstants.SOURCE_ATTRIBUTE);
+      }
+      else
+      {
+        org.w3c.dom.Node text = element.getFirstChild(); 
+        while (text instanceof Element)
+        {
+          text = ((Element)text).getFirstChild();
+        }
+        if (text != null && text.getNodeValue() != null)
+        {
+          result = text.getNodeValue();
+          result = result.trim();
+          if (result.length() > 50)
+          {
+            result = result.substring(0, 50) + "...";
+          }
+        }
+      }
+    }
+
+    return result;
+  }
+  
+  public Object[] getChildren(Object parentElement)
+  {
+    return null;  
+  }
+  
+  public boolean hasChildren(Object object)
+  {
+    return true;
+  }
+
+  public Object getParent(Object object)
+  {
+    XSDAnnotation element = (XSDAnnotation)object;
+    return element.getContainer();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeDeclarationAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeDeclarationAdapter.java
new file mode 100644
index 0000000..330925f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeDeclarationAdapter.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+public class XSDAttributeDeclarationAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDAttributeDeclarationAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  public Image getImage(Object object)
+  {
+    XSDAttributeDeclaration xsdAttributeDeclaration = ((XSDAttributeDeclaration)object);
+    XSDAttributeDeclaration resolvedAttributeDeclaration = xsdAttributeDeclaration.getResolvedAttributeDeclaration();
+    
+    if (resolvedAttributeDeclaration.getContainer() == null)
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDAttribute.gif");
+    }
+    // if (xsdAttributeDeclaration.getResolvedAttributeDeclaration() == xsdAttributeDeclaration)
+    if (xsdAttributeDeclaration.isAttributeDeclarationReference())
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDAttributeRef.gif");
+    }
+    else
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDAttribute.gif");
+    }
+    
+//    return 
+//    XSDEditorPlugin.getPlugin().getIconImage
+//     (resolvedAttributeDeclaration.getContainer() == null ?
+//        "full/obj16/XSDAttributeUnresolved" :
+//          xsdAttributeDeclaration.getResolvedAttributeDeclaration() == xsdAttributeDeclaration ?
+//          "full/obj16/XSDAttributeDeclaration" :
+//          "full/obj16/XSDAttributeUse");
+  }
+
+  public String getText(Object object)
+  {
+    XSDAttributeDeclaration xsdAttributeDeclaration = ((XSDAttributeDeclaration)object);
+    XSDAttributeDeclaration resolvedAttributeDeclaration = xsdAttributeDeclaration.getResolvedAttributeDeclaration();
+    String name =
+      xsdAttributeDeclaration != resolvedAttributeDeclaration ?
+        xsdAttributeDeclaration.getQName() :
+        xsdAttributeDeclaration.getName();
+
+    StringBuffer result = new StringBuffer();
+    if (name == null)
+    {
+      result.append("'absent'");
+    }
+    else
+    {
+      result.append(name);
+    }
+
+    if (resolvedAttributeDeclaration.getAnonymousTypeDefinition() == null && resolvedAttributeDeclaration.getTypeDefinition() != null)
+    {
+      result.append(" : ");
+      result.append(resolvedAttributeDeclaration.getTypeDefinition().getQName(xsdAttributeDeclaration));
+    }
+
+    return result.toString();
+  }
+
+  public Object[] getChildren(Object parentElement)
+  {
+    XSDAttributeDeclaration xsdAttributeDeclaration = (XSDAttributeDeclaration)parentElement;
+    List list = new ArrayList();
+    
+    XSDTypeDefinition type = xsdAttributeDeclaration.getAnonymousTypeDefinition();
+    if (type != null)
+    {
+      list.add(type);
+    }
+    return list.toArray();
+  }
+  
+  public boolean hasChildren(Object object)
+  {
+    return true;
+  }
+
+  public Object getParent(Object object)
+  {
+    XSDAttributeDeclaration element = (XSDAttributeDeclaration)object;
+    return element.getContainer();
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeGroupDefinitionAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeGroupDefinitionAdapter.java
new file mode 100644
index 0000000..19861ae
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeGroupDefinitionAdapter.java
@@ -0,0 +1,100 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDAttributeGroupContent;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDWildcard;
+
+
+public class XSDAttributeGroupDefinitionAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDAttributeGroupDefinitionAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  public Image getImage(Object object)
+  {
+    XSDAttributeGroupDefinition xsdAttributeGroupDefinition = ((XSDAttributeGroupDefinition)object);
+    XSDAttributeGroupDefinition resolvedAttributeGroupDefinition = xsdAttributeGroupDefinition.getResolvedAttributeGroupDefinition();
+
+    if (xsdAttributeGroupDefinition.isAttributeGroupDefinitionReference())
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDAttributeGroupRef.gif");
+    }
+    else
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDAttributeGroup.gif");
+    }
+  }
+
+  public String getText(Object object)
+  {
+    XSDAttributeGroupDefinition xsdAttributeGroupDefinition = ((XSDAttributeGroupDefinition)object);
+    String result =  
+      xsdAttributeGroupDefinition.isAttributeGroupDefinitionReference() ?
+        xsdAttributeGroupDefinition.getQName() :
+        xsdAttributeGroupDefinition.getName();
+    return result == null ? "'absent'" : result;
+  }
+
+  public Object[] getChildren(Object parentElement)
+  {
+    XSDAttributeGroupDefinition xsdAttributeGroup = (XSDAttributeGroupDefinition)parentElement;
+    List list = new ArrayList();
+//  list.addAll(xsdAttributeGroup.getContents());   
+    Iterator i = xsdAttributeGroup.getContents().iterator();
+    while (i.hasNext())
+    {
+      XSDAttributeGroupContent attrGroupContent = (XSDAttributeGroupContent)i.next();
+      if (attrGroupContent instanceof XSDAttributeUse)
+      {
+        list.add(((XSDAttributeUse)attrGroupContent).getAttributeDeclaration());
+      }
+      else
+      {
+        list.add(attrGroupContent);
+      }
+    }
+    
+    XSDWildcard wildcard = xsdAttributeGroup.getAttributeWildcard();
+    if (wildcard != null)
+    {
+      list.add(wildcard);
+    }
+    return list.toArray();
+  }
+  
+  public boolean hasChildren(Object object)
+  {
+    return true;
+  }
+
+  public Object getParent(Object object)
+  {
+    XSDAttributeGroupDefinition element = (XSDAttributeGroupDefinition)object;
+    return element.getContainer();
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeUseAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeUseAdapter.java
new file mode 100644
index 0000000..5c8c127
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDAttributeUseAdapter.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeUse;
+
+public class XSDAttributeUseAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDAttributeUseAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+  
+  protected XSDAttributeDeclaration getDelegate(XSDAttributeUse xsdAttributeUse)
+  {
+    return xsdAttributeUse.getContent();
+  }
+  
+  /**
+   * This returns XSDAttributeUse.gif.
+   */
+  public Image getImage(Object object)
+  {
+    XSDAttributeUse xsdAttributeUse = ((XSDAttributeUse)object);
+    
+    XSDAttributeDeclaration xsdAttributeDeclaration = getDelegate(xsdAttributeUse);
+    if (xsdAttributeDeclaration.isAttributeDeclarationReference())
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDAttributeRef.gif");
+    }
+    else
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDAttribute.gif");
+    }
+    //return XSDEditorPlugin.getPlugin().getIconImage("full/obj16/XSDAttributeUse");  
+    
+  }
+
+  public String getText(Object object)
+  {
+    return getText(object, true);
+  }
+
+  public String getText(Object object, boolean showType)
+  {
+    XSDAttributeUse xsdAttributeUse = ((XSDAttributeUse)object);
+    XSDAttributeDeclaration xsdAttributeDeclaration = getDelegate(xsdAttributeUse);
+    if (xsdAttributeDeclaration.isAttributeDeclarationReference())
+    {
+      return xsdAttributeDeclaration.getResolvedAttributeDeclaration().getName();
+    }
+    StringBuffer result  = new StringBuffer();
+    if (xsdAttributeDeclaration != null)
+    {
+      result.append(xsdAttributeDeclaration.getName());
+    }
+
+    if (xsdAttributeUse.isSetConstraint())
+    {
+      if (result.length() != 0)
+      {
+        result.append("  ");
+      }
+      result.append('<');
+      result.append(xsdAttributeUse.getConstraint());
+      result.append("=\"");
+      result.append(xsdAttributeUse.getLexicalValue());
+      result.append("\">");
+    }
+
+    return result.toString();
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDComplexTypeDefinitionAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDComplexTypeDefinitionAdapter.java
new file mode 100644
index 0000000..38f7351
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDComplexTypeDefinitionAdapter.java
@@ -0,0 +1,182 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.xsd.XSDComplexTypeContent;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+
+public class XSDComplexTypeDefinitionAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDComplexTypeDefinitionAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  public Image getImage(Object object)
+  {
+    return XSDEditorPlugin.getXSDImage("icons/XSDComplexType.gif");
+//    XSDComplexTypeDefinition xsdComplexTypeDefinition = ((XSDComplexTypeDefinition)object);
+//    return 
+//      XSDEditorPlugin.getPlugin().getIconImage
+//        (xsdComplexTypeDefinition.getContainer() == null ?
+//          "full/obj16/XSDComplexTypeDefinitionUnresolved" :
+//          "full/obj16/XSDComplexTypeDefinition");
+  }
+  
+  public String getText(Object object)
+  {
+    return getText(object, true);
+  }
+  
+  public String getText(Object object, boolean showType)
+  {
+    XSDComplexTypeDefinition xsdComplexTypeDefinition = ((XSDComplexTypeDefinition)object);
+
+    StringBuffer result = new StringBuffer();
+    
+    result.append
+     (xsdComplexTypeDefinition.getName() == null ? 
+        // xsdComplexTypeDefinition.getAliasName() :
+        "local type" :
+        xsdComplexTypeDefinition.getName());
+
+    if (showType)
+    {
+      XSDTypeDefinition baseTypeDefinition = xsdComplexTypeDefinition.getBaseTypeDefinition();
+      if (baseTypeDefinition != null && 
+            baseTypeDefinition != xsdComplexTypeDefinition.getContent() &&
+            baseTypeDefinition.getName() != null &&
+            !XSDConstants.isURType(baseTypeDefinition))
+      {
+        result.append(" : ");
+        result.append(baseTypeDefinition.getQName(xsdComplexTypeDefinition));
+      }
+    }
+
+    return result.toString();
+  }
+
+  public Object[] getChildren(Object parentElement)
+  {
+    XSDComplexTypeDefinition xsdComplexTypeDefinition = (XSDComplexTypeDefinition)parentElement;
+    List list = new ArrayList();
+    
+    if (xsdComplexTypeDefinition.getContent() != null)
+    {
+      XSDComplexTypeContent xsdComplexTypeContent = xsdComplexTypeDefinition.getContent();
+      if (xsdComplexTypeContent instanceof XSDParticle)
+      {
+        list.add(((XSDParticle)xsdComplexTypeContent).getContent());
+      }
+    }
+    
+//    if (((XSDModelAdapterFactoryImpl)adapterFactory).getShowInherited())
+//    {
+//      if (xsdComplexTypeDefinition.getSyntheticParticle() != null)
+//      {
+//        XSDTypeDefinition type = xsdComplexTypeDefinition.getBaseTypeDefinition();
+//        list.addAll(XSDChildUtility.getModelChildren(type));
+//      }
+//      if (xsdComplexTypeDefinition.getSyntheticWildcard() != null)
+//      {
+//        list.add(xsdComplexTypeDefinition.getSyntheticWildcard());
+//      }
+//    }
+    
+//    List attributes = xsdComplexTypeDefinition.getAttributeContents();
+//    if (attributes.size() > 0)
+//    {
+//      list.addAll(attributes);
+//    }
+
+//  list = new ArrayList();
+    if (((XSDModelAdapterFactoryImpl)adapterFactory).getShowInherited())
+    {
+      if (xsdComplexTypeDefinition.getDerivationMethod().getName().equals("extension"))
+      {
+        XSDTypeDefinition type = xsdComplexTypeDefinition.getBaseTypeDefinition();
+        Iterator iter = XSDChildUtility.getModelChildren(type).iterator();
+        boolean cont = true;
+        while (cont)
+        {
+          while (iter.hasNext())
+          {
+            list.add(0, iter.next());
+          }
+          
+          if (type instanceof XSDComplexTypeDefinition)
+          {
+            XSDComplexTypeDefinition ctd = (XSDComplexTypeDefinition)type;
+            type = ctd.getBaseTypeDefinition();
+                      
+            // defect 264957 - workbench hangs when modifying complex content
+            // Since we don't filter out the current complexType from
+            // the combobox, we can potentially have an endless loop
+            if (ctd == type)
+            {
+              cont = false;
+              break;
+            }
+
+            if (ctd.getDerivationMethod().getName().equals("extension"))
+            {
+              iter = XSDChildUtility.getModelChildren(type).iterator();
+            }
+            else
+            {
+              cont = false;
+            }
+          }
+          else
+          {
+            cont = false;
+          }
+        }
+
+      }
+
+          
+//          list.addAll(XSDChildUtility.getModelChildren(baseType));
+      }
+
+//    list.addAll(XSDChildUtility.getModelChildren(xsdComplexTypeDefinition));
+
+    return list.toArray();
+ 
+  }
+  
+  public boolean hasChildren(Object object)
+  {
+    return true;
+  }
+
+  public Object getParent(Object object)
+  {
+    XSDComplexTypeDefinition element = (XSDComplexTypeDefinition)object;
+    return element.getContainer();
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDContentProvider.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDContentProvider.java
new file mode 100644
index 0000000..8ed43c2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDContentProvider.java
@@ -0,0 +1,306 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.edit.provider.IChangeNotifier;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.xsd.XSDComponent;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDParticleContent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDWildcard;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+
+public class XSDContentProvider implements ITreeContentProvider, INotifyChangedListener
+{
+//  protected static XSDItemProviderAdapterFactory syntacticAdapterFactory = new XSDItemProviderAdapterFactory();
+//  protected static XSDSemanticItemProviderAdapterFactory semanticAdapterFactory = new XSDSemanticItemProviderAdapterFactory();
+  
+  XSDModelAdapterFactoryImpl xsdModelAdapterFactory;
+
+  XSDSchema xsdSchema;
+  public XSDContentProvider(XSDModelAdapterFactoryImpl xsdModelAdapterFactoryImpl)
+  {
+    this.xsdModelAdapterFactory = xsdModelAdapterFactoryImpl;
+    
+    if (xsdModelAdapterFactory instanceof IChangeNotifier)
+    {
+      ((IChangeNotifier)xsdModelAdapterFactory).addListener(this);
+    }
+  }
+  
+  public void setXSDSchema(XSDSchema xsdSchema)
+  {
+    this.xsdSchema = xsdSchema;
+  }
+  
+  /*
+   * @see ITreeContentProvider#getChildren(Object)
+   */
+  public Object[] getChildren(Object parentElement)
+  {
+//  return adapterFactoryContentProvider.getChildren(parentElement);
+    XSDConcreteComponent xsdComp = null;
+    List list = null;
+    if (parentElement instanceof Document)
+    {
+      xsdComp = xsdSchema;
+ 	    // ItemProviderAdapter a = (ItemProviderAdapter)syntacticAdapterFactory.adapt(xsdComp, syntacticAdapterFactory);
+      // ItemProviderAdapter a = (ItemProviderAdapter)semanticAdapterFactory.adapt(xsdComp, semanticAdapterFactory);
+ 	    
+ 	    XSDAbstractAdapter a = (XSDAbstractAdapter)xsdModelAdapterFactory.adapt(xsdComp, xsdModelAdapterFactory);
+ 	    
+//      a.removeListener((INotifyChangedListener)this);
+// 	    a.addListener((INotifyChangedListener)this);
+
+      list = new ArrayList();
+      list.add(xsdComp);
+      return list.toArray();
+    }
+    else if (parentElement instanceof XSDConcreteComponent)
+    {
+      xsdComp = (XSDConcreteComponent)parentElement;
+      list = new ArrayList();
+    }
+    else if (parentElement instanceof ITreeItemContentProvider)
+    {
+      // return adapterFactoryContentProvider.getChildren(parentElement);
+      return ((ITreeItemContentProvider)parentElement).getChildren(parentElement).toArray();
+    }
+    else if (parentElement instanceof ITreeContentProvider)
+    {
+      return ((ITreeContentProvider)parentElement).getChildren(parentElement);
+    }
+    
+    if (xsdComp != null)
+    {
+ 	    // ItemProviderAdapter a = (ItemProviderAdapter)syntacticAdapterFactory.adapt(xsdComp, syntacticAdapterFactory);
+      // ItemProviderAdapter a = (ItemProviderAdapter)semanticAdapterFactory.adapt(xsdComp, semanticAdapterFactory);
+ 	    
+      XSDAbstractAdapter a = (XSDAbstractAdapter)xsdModelAdapterFactory.adapt(xsdComp, xsdModelAdapterFactory);
+      
+      if (xsdComp instanceof XSDElementDeclaration || xsdComp instanceof XSDModelGroup || xsdComp instanceof XSDWildcard)
+      {
+        XSDAbstractAdapter particleAdapter = (XSDAbstractAdapter)xsdModelAdapterFactory.adapt(((XSDParticleContent)xsdComp).getContainer(), xsdModelAdapterFactory);
+      }
+
+ 	    if (a != null)
+ 	    {
+// 	      a.removeListener((INotifyChangedListener)this);
+// 	      a.addListener((INotifyChangedListener)this);
+ 	    
+ 	      Object [] obj = a.getChildren(xsdComp);
+ 	      if (obj != null)
+ 	      {
+ 	        list = Arrays.asList(obj);
+ 	      }
+ 	    }
+//	     list = (List)a.getChildren(xsdComp);
+    }
+    
+    list =  list != null ? list : Collections.EMPTY_LIST;
+    return list.toArray();
+  }
+
+  /*
+   * @see ITreeContentProvider#getParent(Object)
+   */
+  public Object getParent(Object element)
+  {
+    if (element instanceof Node)
+    {
+      return ((Node)element).getParentNode();
+    }
+    else if (element instanceof XSDComponent)
+    {
+      return ((XSDComponent)element).getContainer();
+    }
+    return null;
+  }
+
+  /*
+   * @see ITreeContentProvider#hasChildren(Object)
+   */
+  public boolean hasChildren(Object element)
+  {
+    Object[] children = getChildren(element);
+    return children != null && children.length > 0;   
+  }
+
+  /*
+   * @see IStructuredContentProvider#getElements(Object)
+   */
+  public Object[] getElements(Object inputElement)
+  {
+    return getChildren(inputElement);
+  }
+
+  public void notifyChanged(Notification notification)
+  {
+    if (viewer != null)
+    {
+      if (viewer instanceof StructuredViewer)
+      {
+        if (notification.getFeature() instanceof EAttribute)
+        {
+          ((StructuredViewer)viewer).update(notification.getNotifier(), null);
+        }
+        else
+        {
+          ((StructuredViewer)viewer).refresh(notification.getNotifier());
+        }
+      }
+      else
+      {
+        viewer.refresh();
+      }
+    }
+
+  }
+
+  /*
+   * @see IContentProvider#dispose()
+   */
+  public void dispose()
+  {
+    viewer = null;
+    xsdModelAdapterFactory.removeListener(this);
+  }
+  
+  protected Viewer viewer = null;
+
+  /*
+   * @see IContentProvider#inputChanged(Viewer, Object, Object)
+   */
+  public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
+  {
+    this.viewer = viewer;
+  }
+  
+//  protected ViewerNotifyingAdapterFactory viewerNotifyingAdapterFactory = new ViewerNotifyingAdapterFactory();
+//
+//  
+//    // There is only 1 adapter associated with this factory.  This single adapter gets added
+//  // to the adapter lists of many nodes.
+//  public class ViewerNotifyingAdapterFactory extends // KCPort com.ibm.sed.model.AbstractAdapterFactory
+//    AbstractAdapterFactory
+//  {
+//    protected ViewerNotifyingAdapter viewerNotifyingAdapter = new ViewerNotifyingAdapter();
+//
+//    protected INodeAdapter createAdapter(INodeNotifier target)
+//    {
+//      return viewerNotifyingAdapter;
+//    }
+//
+//    protected ViewerNotifyingAdapter doAdapt(Object object)
+//    {
+//      ViewerNotifyingAdapter result = null;
+//      if (object instanceof INodeNotifier)
+//      {
+//        result = (ViewerNotifyingAdapter)adapt((INodeNotifier)object);
+//      }
+//      return result;
+//    }
+//  }
+//                    
+//
+//  public class ViewerNotifyingAdapter implements INodeAdapter
+//  {
+//    public boolean isAdapterForType(Object type)
+//    {
+//      return type == viewerNotifyingAdapterFactory;
+//    }
+//    
+//    public void notifyChanged(INodeNotifier notifier, int eventType, Object changedFeature, Object oldValue,	Object newValue,	int pos)
+//    { 
+//      if (viewer == null || newValue instanceof Text || oldValue instanceof Text)
+//        return;
+//      
+//      if (eventType != INodeNotifier.ADD && eventType != INodeNotifier.REMOVE)
+//      {                                 
+//        if (notifier instanceof Element)
+//        {        
+//          Node node = (Node)notifier;                   
+//          Node parent = node instanceof Attr ? ((Attr)node).getOwnerElement() : node.getParentNode();
+//          // we use to refresh the parent, but it seems that the notifier is sufficient now
+//          
+//          Object objToRefresh = notifier;      
+//          if (notifier instanceof DocumentImpl)
+//          {
+//            objToRefresh = ((DocumentImpl)notifier).getModel();
+//          }
+//          if (viewer instanceof AbstractTreeViewer)
+//          {
+////            if (node instanceof XMLNode)
+////            {
+////              XMLNode xmlNode = (XMLNode)node;
+////              int caretPosition =  xmlNode.getStartOffset();
+////              ((XSDEditorTreeViewer)viewer).setCaretPosition(caretPosition);
+////            }
+//            ((AbstractTreeViewer)viewer).refresh(objToRefresh);
+//          }
+//          else
+//          {
+//            viewer.refresh();
+//          }
+//        }
+//        
+//      }
+//      else if (eventType == INodeNotifier.ADD || eventType == INodeNotifier.REMOVE)
+//      {
+//        if (notifier instanceof DocumentImpl)
+//        {
+//          Object objToRefresh = ((DocumentImpl)notifier).getModel();
+//          if (viewer instanceof AbstractTreeViewer)
+//          {
+//            ((AbstractTreeViewer)viewer).refresh(objToRefresh);
+//          }
+//        }
+//      }
+////        if (notifier instanceof Element)
+////        {  
+//// performance problem - updates all elements when the children are reparented
+////          Object objToRefresh = notifier;      
+////          if (notifier instanceof DocumentImpl)
+////          {
+////            objToRefresh = ((DocumentImpl)notifier).getModel();
+////          }
+////          if (viewer instanceof AbstractTreeViewer)
+////          {
+////            ((AbstractTreeViewer)viewer).refresh(objToRefresh);
+////          }
+////          if (eventType == Notifier.ADD && newValue instanceof Element)
+////          {
+////            if (viewer instanceof XSDEditorTreeViewer)
+////            {
+////              // default select the new added element
+////              ((XSDEditorTreeViewer)viewer).getOutlinePage().updateSelection(new StructuredSelection(newValue));
+////            }
+////          }
+////        }          
+////      }
+//    }
+//  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDElementDeclarationAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDElementDeclarationAdapter.java
new file mode 100644
index 0000000..a74e4bf
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDElementDeclarationAdapter.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class XSDElementDeclarationAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDElementDeclarationAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  public Image getImage(Object element)
+  {
+    XSDElementDeclaration xsdElementDeclaration = ((XSDElementDeclaration)element);
+    XSDElementDeclaration resolvedElementDeclaration = xsdElementDeclaration.getResolvedElementDeclaration();
+    
+    if (!xsdElementDeclaration.isElementDeclarationReference())
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDElement.gif");
+    }
+    else
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDElementRef.gif");
+    }
+    
+//    return 
+//      XSDEditorPlugin.getPlugin().getIconImage
+//        (resolvedElementDeclaration.getContainer() == null ?
+//           "full/obj16/XSDElementUnresolved" :
+//           xsdElementDeclaration.getResolvedElementDeclaration() == xsdElementDeclaration ?
+//             "full/obj16/XSDElementDeclaration" :
+//             "full/obj16/XSDElementUse");
+
+  }
+  
+  public String getText(Object object)
+  {
+    XSDElementDeclaration xsdElementDeclaration = ((XSDElementDeclaration)object);
+    XSDElementDeclaration resolvedElementDeclaration = xsdElementDeclaration.getResolvedElementDeclaration();
+    String name = 
+      xsdElementDeclaration != resolvedElementDeclaration ?
+        xsdElementDeclaration.getQName() :
+        xsdElementDeclaration.getName();
+
+    StringBuffer result = new StringBuffer();
+    if (name == null)
+    {
+      result.append("'absent'");
+    }
+    else
+    {
+      result.append(name);
+    }
+    
+    if (!xsdElementDeclaration.isGlobal())
+    {
+      Element element = xsdElementDeclaration.getElement();
+      boolean hasMinOccurs = element.hasAttribute(XSDConstants.MINOCCURS_ATTRIBUTE);
+      boolean hasMaxOccurs = element.hasAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE);
+
+      if (hasMinOccurs || hasMaxOccurs)
+      {
+	      result.append(" ["); 
+		    if (hasMinOccurs)
+	      {
+	        int min = ((XSDParticle)xsdElementDeclaration.getContainer()).getMinOccurs();
+	  	    if (min == XSDParticle.UNBOUNDED)
+	  	    {
+	  	      result.append("*");
+	  	    }
+	  	    else
+	  	    {
+	  	      result.append(String.valueOf(min));
+	  	    }
+	      }
+        else // print default
+        {
+          int min = ((XSDParticle)xsdElementDeclaration.getContainer()).getMinOccurs();
+          result.append(String.valueOf(min));
+        }
+	      if (hasMaxOccurs)
+	      {
+	        int max = ((XSDParticle)xsdElementDeclaration.getContainer()).getMaxOccurs();
+	  	    result.append("..");
+	  	    if (max == XSDParticle.UNBOUNDED)
+	  	    {
+	  	      result.append("*");
+	  	    }
+	  	    else
+	  	    {
+	  	      result.append(String.valueOf(max));
+	  	    }
+	      }
+        else // print default
+        {
+          result.append("..");
+          int max = ((XSDParticle)xsdElementDeclaration.getContainer()).getMaxOccurs();
+          result.append(String.valueOf(max));
+         
+        }
+	      result.append("]");
+      }
+    }
+    
+    if (resolvedElementDeclaration.getAnonymousTypeDefinition() == null && resolvedElementDeclaration.getTypeDefinition() != null)
+    {
+      result.append(" : ");
+      result.append(resolvedElementDeclaration.getTypeDefinition().getQName(xsdElementDeclaration));
+    }
+
+    return result.toString();
+  }
+  
+  public Object[] getChildren(Object parentElement)
+  {
+    XSDElementDeclaration xsdElementDeclaration = (XSDElementDeclaration)parentElement;
+    List list = new ArrayList();
+    XSDTypeDefinition type = null;
+    if (xsdElementDeclaration.isElementDeclarationReference())
+    {
+      if (((XSDModelAdapterFactoryImpl)adapterFactory).getShowReferences())
+      {
+        type = xsdElementDeclaration.getResolvedElementDeclaration().getTypeDefinition();
+      }
+    }
+    else
+    {
+      type = xsdElementDeclaration.getAnonymousTypeDefinition();
+      if (type == null)
+      {
+        if (((XSDModelAdapterFactoryImpl)adapterFactory).getShowReferences())
+        {
+          type = xsdElementDeclaration.getTypeDefinition();
+        }
+      }
+    }
+
+    if (type != null && type instanceof XSDComplexTypeDefinition)
+    {
+      XSDComplexTypeDefinition ctType = (XSDComplexTypeDefinition)type;
+      if (ctType != null)
+      {
+        list.add(ctType);
+      }
+    }
+
+//    if (xsdElementDeclaration.getIdentityConstraintDefinitions() != null)
+//    {
+//      list.addAll(xsdElementDeclaration.getIdentityConstraintDefinitions());
+//    }
+    
+//    return XSDChildUtility.getModelChildren(xsdElementDeclaration.getResolvedElementDeclaration()).toArray();
+    return list.toArray();
+  
+  }
+  
+  public boolean hasChildren(Object object)
+  {
+    return true;
+  }
+
+  public Object getParent(Object object)
+  {
+    XSDElementDeclaration element = (XSDElementDeclaration)object;
+    return element.getContainer();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelAdapterFactoryImpl.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelAdapterFactoryImpl.java
new file mode 100644
index 0000000..faf443f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelAdapterFactoryImpl.java
@@ -0,0 +1,422 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.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.ecore.EObject;
+import org.eclipse.emf.edit.provider.ChangeNotifier;
+import org.eclipse.emf.edit.provider.Disposable;
+import org.eclipse.emf.edit.provider.IChangeNotifier;
+import org.eclipse.emf.edit.provider.IDisposable;
+import org.eclipse.emf.edit.provider.INotifyChangedListener;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.xsd.XSDAnnotation;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDImport;
+import org.eclipse.xsd.XSDInclude;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNotationDeclaration;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDRedefine;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDWildcard;
+import org.eclipse.xsd.util.XSDAdapterFactory;
+import org.eclipse.xsd.util.XSDSwitch;
+
+public class XSDModelAdapterFactoryImpl extends XSDAdapterFactory
+  implements IChangeNotifier, IDisposable
+{
+  
+  protected IChangeNotifier changeNotifier = new ChangeNotifier();
+  
+  protected Disposable disposable = new Disposable();
+  
+  protected Collection supportedTypes = new ArrayList();
+  
+  protected boolean showReferences = false;
+  protected boolean showInherited = false;
+  
+  /**
+   * 
+   */
+  public XSDModelAdapterFactoryImpl()
+  {
+    super();
+    supportedTypes.add(ILabelProvider.class);
+  }
+
+  public void setShowReferences(boolean b)
+  {
+    showReferences = b;
+  }
+  
+  public boolean getShowReferences()
+  {
+    return showReferences;
+  }
+  
+  public void setShowInherited(boolean b)
+  {
+    showInherited= b;
+  }
+  
+  public boolean getShowInherited()
+  {
+    return showInherited;
+  }
+  
+  protected XSDSwitch modelSwitch = new XSDSwitch()
+  {
+      public Object caseXSDAnnotation(XSDAnnotation object)
+      {
+        return createXSDAnnotationAdapter();
+      }
+      public Object caseXSDAttributeDeclaration(XSDAttributeDeclaration object)
+      {
+        return createXSDAttributeDeclarationAdapter();
+      }
+      public Object caseXSDAttributeGroupDefinition(XSDAttributeGroupDefinition object)
+      {
+        return createXSDAttributeGroupDefinitionAdapter();
+      }
+      public Object caseXSDAttributeUse(XSDAttributeUse object)
+      {
+        return createXSDAttributeUseAdapter();
+      }
+      public Object caseXSDComplexTypeDefinition(XSDComplexTypeDefinition object)
+      {
+        return createXSDComplexTypeDefinitionAdapter();
+      }
+      public Object caseXSDElementDeclaration(XSDElementDeclaration object)
+      {
+        return createXSDElementDeclarationAdapter();
+      }
+      public Object caseXSDModelGroup(XSDModelGroup object)
+      {
+        return createXSDModelGroupAdapter();
+      }
+      public Object caseXSDModelGroupDefinition(XSDModelGroupDefinition object)
+      {
+        return createXSDModelGroupDefinitionAdapter();
+      }
+      public Object caseXSDNotationDeclaration(XSDNotationDeclaration object)
+      {
+        return createXSDNotationDeclarationAdapter();
+      }
+      public Object caseXSDParticle(XSDParticle object)
+      {
+        return createXSDParticleAdapter();
+      }
+//      public Object caseXSDParticleContent(XSDParticleContent object)
+//      {
+//        return createXSDParticleContentAdapter();
+//      }
+      public Object caseXSDSchema(XSDSchema object)
+      {
+        return createXSDSchemaAdapter();
+      }
+      public Object caseXSDImport(XSDImport object)
+      {
+        // return createXSDImportAdapter();
+        return createXSDSchemaDirectiveAdapter();
+      }
+      public Object caseXSDInclude(XSDInclude object)
+      {
+        // return createXSDIncludeAdapter();
+        return createXSDSchemaDirectiveAdapter();
+      }
+      public Object caseXSDRedefine(XSDRedefine object)
+      {
+        // return createXSDRedefineAdapter();
+        return createXSDSchemaDirectiveAdapter();
+      }
+      public Object caseXSDSimpleTypeDefinition(XSDSimpleTypeDefinition object)
+      {
+        return createXSDSimpleTypeDefinitionAdapter();
+      
+      }
+      public Object caseXSDWildcard(XSDWildcard object)
+      {
+        return createXSDWildcardAdapter();
+      }
+      public Object defaultCase(EObject object)
+      {
+        return createEObjectAdapter();
+      }
+  };
+
+  public Adapter createAdapter(Notifier target)
+  {
+    Adapter adapter = null;
+    if (target instanceof EObject)
+    {
+      adapter = (Adapter)modelSwitch.doSwitch((EObject)target);
+    }
+    return adapter;
+  }
+
+/* create adapters */
+  
+  protected XSDAnnotationAdapter xsdAnnotationAdapter;
+  public Adapter createXSDAnnotationAdapter()
+  {
+    if (xsdAnnotationAdapter == null)
+    {
+      xsdAnnotationAdapter = new XSDAnnotationAdapter(this);
+    }
+    return xsdAnnotationAdapter;
+  }
+
+  protected XSDAttributeDeclarationAdapter xsdAttributeDeclarationAdapter;
+  public Adapter createXSDAttributeDeclarationAdapter()
+  {
+    if (xsdAttributeDeclarationAdapter == null)
+    {
+      xsdAttributeDeclarationAdapter = new XSDAttributeDeclarationAdapter(this);
+    }
+    return xsdAttributeDeclarationAdapter;
+  }
+
+  protected XSDAttributeGroupDefinitionAdapter xsdAttributeGroupDefinitionAdapter;
+  public Adapter createXSDAttributeGroupDefinitionAdapter()
+  {
+    if (xsdAttributeGroupDefinitionAdapter == null)
+    {
+      xsdAttributeGroupDefinitionAdapter = new XSDAttributeGroupDefinitionAdapter(this);
+    }
+    return xsdAttributeGroupDefinitionAdapter;
+  }
+
+  protected XSDAttributeUseAdapter xsdAttributeUseAdapter;
+  public Adapter createXSDAttributeUseAdapter()
+  {
+    if (xsdAttributeUseAdapter == null)
+    {
+      xsdAttributeUseAdapter = new XSDAttributeUseAdapter(this);
+    }
+
+    return xsdAttributeUseAdapter;
+  }
+
+  
+  XSDComplexTypeDefinitionAdapter xsdComplexTypeDefinitionAdapter;
+  public Adapter createXSDComplexTypeDefinitionAdapter()
+  {
+    if (xsdComplexTypeDefinitionAdapter == null)
+    {
+      xsdComplexTypeDefinitionAdapter = new XSDComplexTypeDefinitionAdapter(this);
+    }
+    return xsdComplexTypeDefinitionAdapter;
+  }
+
+  XSDElementDeclarationAdapter xsdElementDeclarationAdapter;
+  public Adapter createXSDElementDeclarationAdapter()
+  {
+    if (xsdElementDeclarationAdapter == null)
+    {
+      xsdElementDeclarationAdapter = new XSDElementDeclarationAdapter(this);
+    }
+    return xsdElementDeclarationAdapter;
+  }
+
+  XSDModelGroupAdapter xsdModelGroupAdapter;
+  public Adapter createXSDModelGroupAdapter()
+  {
+    if (xsdModelGroupAdapter == null)
+    {
+      xsdModelGroupAdapter = new XSDModelGroupAdapter(this);
+    }
+    return xsdModelGroupAdapter;
+  }
+
+  XSDModelGroupDefinitionAdapter xsdModelGroupDefinitionAdapter;
+  public Adapter createXSDModelGroupDefinitionAdapter()
+  {
+    if (xsdModelGroupDefinitionAdapter == null)
+    {
+      xsdModelGroupDefinitionAdapter = new XSDModelGroupDefinitionAdapter(this);
+    }
+    return xsdModelGroupDefinitionAdapter;
+  }
+
+  XSDNotationDeclarationAdapter xsdNotationDeclarationAdapter;
+  public Adapter createXSDNotationDeclarationAdapter()
+  {
+    if (xsdNotationDeclarationAdapter == null)
+    {
+      xsdNotationDeclarationAdapter = new XSDNotationDeclarationAdapter(this);
+    }
+    return xsdNotationDeclarationAdapter;
+  }
+
+  XSDWildcardAdapter xsdWildcardAdapter;
+  public Adapter createXSDWildcardAdapter()
+  {
+    if (xsdWildcardAdapter == null)
+    {
+      xsdWildcardAdapter = new XSDWildcardAdapter(this);
+    }
+    return xsdWildcardAdapter;
+  }
+  
+  protected XSDParticleAdapter xsdParticleAdapter;
+  public Adapter createXSDParticleAdapter()
+  {
+    if (xsdParticleAdapter == null)
+    {
+      xsdParticleAdapter = new XSDParticleAdapter(this);
+    }
+    return xsdParticleAdapter;
+  }
+//
+//  protected XSDParticleContentAdapter xsdParticleContentAdapter;
+//  public Adapter createXSDParticleContentAdapter()
+//  {
+//    if (xsdParticleContentAdapter == null)
+//    {
+//      xsdParticleContentAdapter = new XSDParticleContentAdapter(this);
+//    }
+//    return xsdParticleContentAdapter;
+//  }
+
+  protected XSDSchemaAdapter xsdSchemaAdapter;
+  public Adapter createXSDSchemaAdapter()
+  {
+    if (xsdSchemaAdapter == null)
+    {
+      xsdSchemaAdapter = new XSDSchemaAdapter(this);
+    }
+
+    return xsdSchemaAdapter;
+  }
+  
+  protected XSDSchemaDirectiveAdapter xsdSchemaDirectiveAdapter;
+  public Adapter createXSDSchemaDirectiveAdapter()
+  {
+    if (xsdSchemaDirectiveAdapter == null)
+    {
+      xsdSchemaDirectiveAdapter = new XSDSchemaDirectiveAdapter(this);
+    }
+
+    return xsdSchemaDirectiveAdapter;
+  }
+
+  XSDSimpleTypeDefinitionAdapter xsdSimpleTypeDefinitionAdapter;
+  public Adapter createXSDSimpleTypeDefinitionAdapter()
+  {
+    if (xsdSimpleTypeDefinitionAdapter == null)
+    {
+      xsdSimpleTypeDefinitionAdapter = new XSDSimpleTypeDefinitionAdapter(this);
+    }
+    return xsdSimpleTypeDefinitionAdapter;
+  }
+
+  public Adapter createEObjectAdapter()
+  {
+    return null;
+  }
+
+
+  public boolean isFactoryForType(Object type)
+  {
+    return super.isFactoryForType(type) || supportedTypes.contains(type);
+  }
+
+  /**
+   * This implementation substitutes the factory itself as the key for the adapter.
+   */
+  public Adapter adapt(Notifier notifier, Object type)
+  {
+    return super.adapt(notifier, this);
+  }
+
+  public Object adapt(Object object, Object type)
+  {
+    // This is a kludge to deal with enumerators, which crash the doSwitch.
+    //
+    if (object instanceof EObject && ((EObject)object).eClass() == null)
+    {
+      return null;
+    }
+
+    if (isFactoryForType(type))
+    {
+      Object adapter = super.adapt(object, type);
+      if (!(type instanceof Class) || (((Class)type).isInstance(adapter)))
+      {
+        return adapter;
+      }
+    }
+
+    return null;
+  }
+
+  public Adapter adaptNew(Notifier object, Object type)
+  {
+    Adapter result = super.adaptNew(object, type);
+    disposable.add(result);
+    return result;
+  }
+
+  /**
+   * This adds a listener.
+   */
+  public void addListener(INotifyChangedListener notifyChangedListener)
+  {
+    changeNotifier.addListener(notifyChangedListener);
+  }
+
+  /**
+   * This removes a listener.
+   */
+  public void removeListener(INotifyChangedListener notifyChangedListener)
+  {
+    changeNotifier.removeListener(notifyChangedListener);
+  }
+
+  /**
+   * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
+   */
+  public void fireNotifyChanged(Notification notification)
+  {
+    Display display = Display.getDefault();
+    if (display != null)
+    {
+      if (display.getThread() == Thread.currentThread ())
+      {
+        changeNotifier.fireNotifyChanged(notification);
+      }
+    }
+
+//    if (parentAdapterFactory != null)
+//    {
+//      parentAdapterFactory.fireNotifyChanged(notification);
+//    }
+  }
+
+  public void dispose()
+  {
+    disposable.dispose();
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelGroupAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelGroupAdapter.java
new file mode 100644
index 0000000..7fc1719
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelGroupAdapter.java
@@ -0,0 +1,141 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.graph.XSDChildUtility;
+import org.eclipse.xsd.XSDCompositor;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class XSDModelGroupAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDModelGroupAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  public Image getImage(Object element)
+  {
+    XSDModelGroup xsdModelGroup = ((XSDModelGroup)element);
+    if (XSDCompositor.CHOICE_LITERAL == xsdModelGroup.getCompositor())
+    {
+      // return XSDEditorPlugin.getPlugin().getIconImage("full/obj16/XSDModelGroupChoice");
+      return XSDEditorPlugin.getXSDImage("icons/XSDChoice.gif");
+    }
+    else if (XSDCompositor.ALL_LITERAL == xsdModelGroup.getCompositor())
+    {
+      // return XSDEditorPlugin.getPlugin().getIconImage("full/obj16/XSDModelGroupAll");
+      return XSDEditorPlugin.getXSDImage("icons/XSDAll.gif");
+    }
+    else 
+    {
+      // return XSDEditorPlugin.getPlugin().getIconImage("full/obj16/XSDModelGroupSequence");
+      return XSDEditorPlugin.getXSDImage("icons/XSDSequence.gif");
+    }
+  }
+  
+  public String getText(Object object)
+  {
+    XSDModelGroup xsdModelGroup = ((XSDModelGroup)object);
+    
+    StringBuffer result = new StringBuffer();
+    String name = xsdModelGroup.getCompositor().getName();
+    if (name != null)
+    {
+      result.append(name);
+    }
+    
+    Element element = xsdModelGroup.getElement();
+    
+    if (element != null)
+    {
+      boolean hasMinOccurs = element.hasAttribute(XSDConstants.MINOCCURS_ATTRIBUTE);
+      boolean hasMaxOccurs = element.hasAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE);
+      
+      if (hasMinOccurs || hasMaxOccurs)
+      {
+  	    result.append(" [");  
+  	    if (hasMinOccurs)
+  	    {
+  	      int min = ((XSDParticle)xsdModelGroup.getContainer()).getMinOccurs();
+  		    if (min == XSDParticle.UNBOUNDED)
+  		    {
+  		      result.append("*");
+  		    }
+  		    else
+  		    {
+  		      result.append(String.valueOf(min));
+  		    }
+  	    }
+        else // print default
+        {
+          int min = ((XSDParticle)xsdModelGroup.getContainer()).getMinOccurs();
+          result.append(String.valueOf(min));
+        }
+  	    if (hasMaxOccurs)
+  	    {
+  	      int max = ((XSDParticle)xsdModelGroup.getContainer()).getMaxOccurs();
+  		    result.append("..");
+  		    if (max == XSDParticle.UNBOUNDED)
+  		    {
+  		      result.append("*");
+  		    }
+  		    else
+  		    {
+  		      result.append(String.valueOf(max));
+  		    }
+  	    }
+        else // print default
+        {
+          result.append("..");
+          int max = ((XSDParticle)xsdModelGroup.getContainer()).getMaxOccurs();
+          result.append(String.valueOf(max));
+        }
+  	    result.append("]");
+      }
+    }
+    return result.toString();
+  }
+  
+  public Object[] getChildren(Object parentElement)
+  {
+    XSDModelGroup xsdModelGroup = (XSDModelGroup)parentElement;
+    List list = new ArrayList();
+    // list.addAll(xsdModelGroup.getContents());
+    list.addAll(XSDChildUtility.getModelChildren(xsdModelGroup));
+    return list.toArray();
+  }
+  
+  public boolean hasChildren(Object object)
+  {
+    return true;
+  }
+
+  public Object getParent(Object object)
+  {
+    XSDModelGroup element = (XSDModelGroup)object;
+    return element.getContainer();
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelGroupDefinitionAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelGroupDefinitionAdapter.java
new file mode 100644
index 0000000..e622469
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDModelGroupDefinitionAdapter.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+
+
+public class XSDModelGroupDefinitionAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDModelGroupDefinitionAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  public Image getImage(Object object)
+  {
+    XSDModelGroupDefinition xsdModelGroupDefinition = ((XSDModelGroupDefinition)object);
+    XSDModelGroupDefinition resolvedModelGroupDefinition = xsdModelGroupDefinition.getResolvedModelGroupDefinition();
+
+    if (xsdModelGroupDefinition.isModelGroupDefinitionReference())
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDGroupRef.gif");
+    }
+    else
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDGroup.gif");
+    }
+  }
+  
+  public String getText(Object object)
+  {
+    XSDModelGroupDefinition xsdModelGroupDefinition = ((XSDModelGroupDefinition)object);
+    String result = 
+      xsdModelGroupDefinition.isModelGroupDefinitionReference() ?
+        xsdModelGroupDefinition.getQName() :
+        xsdModelGroupDefinition.getName();
+    return result == null ? "'absent'" : result;
+  }
+  
+  boolean hasChildren = false;
+  
+  public Object[] getChildren(Object parentElement)
+  {
+    XSDModelGroupDefinition xsdModelGroupDefinition = (XSDModelGroupDefinition)parentElement;
+    List list = new ArrayList();
+    if (xsdModelGroupDefinition.isModelGroupDefinitionReference())
+    {
+      if (((XSDModelAdapterFactoryImpl)adapterFactory).getShowReferences())
+      {
+        list.add(xsdModelGroupDefinition.getResolvedModelGroupDefinition().getModelGroup());
+        hasChildren = true;
+      }
+    }
+    else
+    {
+      if (xsdModelGroupDefinition.getModelGroup() != null)
+      {
+        list.add(xsdModelGroupDefinition.getModelGroup());
+        hasChildren = true;
+      }
+    }
+    
+    return list.toArray();
+ 
+  }
+  
+  public boolean hasChildren(Object object)
+  {
+    return hasChildren;
+  }
+
+  public Object getParent(Object object)
+  {
+    XSDModelGroupDefinition element = (XSDModelGroupDefinition)object;
+    return element.getContainer();
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDNotationDeclarationAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDNotationDeclarationAdapter.java
new file mode 100644
index 0000000..3c89274
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDNotationDeclarationAdapter.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDNotationDeclaration;
+
+
+public class XSDNotationDeclarationAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDNotationDeclarationAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+  
+  public Image getImage(Object object)
+  {
+    // return XSDEditorPlugin.getPlugin().getIconImage("full/obj16/XSDNotationDeclaration");
+    return XSDEditorPlugin.getXSDImage("icons/XSDNotation.gif");
+  }
+
+  public String getText(Object object)
+  {
+    XSDNotationDeclaration xsdNotationDeclaration = ((XSDNotationDeclaration)object);
+    String result = xsdNotationDeclaration.getName();
+    return result == null ? "" : result;
+  }
+
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDParticleAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDParticleAdapter.java
new file mode 100644
index 0000000..c37e8a7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDParticleAdapter.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationWrapper;
+import org.eclipse.wst.xsd.ui.internal.graph.model.XSDModelAdapterFactory;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDParticleContent;
+import org.eclipse.xsd.XSDWildcard;
+
+
+public class XSDParticleAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDParticleAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  // hack to notify outline and graph view of minOccurs and maxOccurs changes
+  public void notifyChanged(Notification msg) 
+  {
+    XSDParticle xsdParticle = (XSDParticle)msg.getNotifier();
+    XSDParticleContent xsdParticleContent = xsdParticle.getContent();
+    if (xsdParticleContent != null)
+    {
+      if (xsdParticleContent instanceof XSDElementDeclaration)
+      {
+        fireNotifyChanged(new NotificationWrapper((XSDElementDeclaration)xsdParticleContent, msg));
+        XSDModelAdapterFactory.getAdapter(xsdParticleContent).firePropertyChanged(xsdParticleContent, null);
+      }
+      else if (xsdParticleContent instanceof XSDModelGroup)
+      {
+        fireNotifyChanged(new NotificationWrapper((XSDModelGroup)xsdParticleContent, msg));
+        XSDModelAdapterFactory.getAdapter(xsdParticleContent).firePropertyChanged(xsdParticleContent, null);
+      }
+      else if (xsdParticleContent instanceof XSDWildcard)
+      {
+        fireNotifyChanged(new NotificationWrapper((XSDWildcard)xsdParticleContent, msg));
+        XSDModelAdapterFactory.getAdapter(xsdParticleContent).firePropertyChanged(xsdParticleContent, null);
+      }
+    }
+    // super.notifyChanged(msg);
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSchemaAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSchemaAdapter.java
new file mode 100644
index 0000000..36f4fb2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSchemaAdapter.java
@@ -0,0 +1,405 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.ArrayList;
+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.common.util.URI;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNotationDeclaration;
+import org.eclipse.xsd.XSDPackage;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+
+
+public class XSDSchemaAdapter extends XSDAbstractAdapter
+{
+  protected XSDPackage xsdPackage;
+  /**
+   * @param adapterFactory
+   */
+  public XSDSchemaAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+    xsdPackage = XSDPackage.eINSTANCE;
+  }
+
+  public Image getImage(Object element)
+  {
+    return XSDEditorPlugin.getXSDImage("icons/XSDFile.gif");
+  }
+  
+  public String getText(Object element)
+  {
+    XSDSchema xsdSchema = (XSDSchema)element;
+    String result = xsdSchema.getSchemaLocation();
+    if (result == null)
+    {
+      return "";
+    } 
+    else
+    {
+      return URI.createURI(result).lastSegment();
+    }
+  }
+  List children;
+  public Object[] getChildren(Object parentElement)
+  {
+    XSDSchema xsdSchema = ((XSDSchema)parentElement);
+
+    children = new ArrayList();
+    
+    List directivesList = getDirectives(xsdSchema);
+    
+    List elementsList = getGlobalElements(xsdSchema);
+    
+    List attributeGroupList = getAttributeGroupList(xsdSchema);
+    
+    List attributesList = getAttributeList(xsdSchema);
+    
+    List groups = getGroups(xsdSchema);
+    
+    List notations = getNotations(xsdSchema);
+
+    List types = getComplexTypes(xsdSchema);
+    types.addAll(getSimpleTypes(xsdSchema));
+    
+    children.add
+    (new CategoryAdapter
+      ( //XSDEditPlugin.getString("_UI_Elements_label"), 
+        XSDEditorPlugin.getXSDString("_UI_GRAPH_DIRECTIVES"),
+        XSDEditorPlugin.getPlugin().getIconImage("obj16/directivesheader"),
+        directivesList, xsdSchema, CategoryAdapter.DIRECTIVES));
+    children.add
+        (new CategoryAdapter
+          ( //XSDEditPlugin.getString("_UI_Elements_label"), 
+            XSDEditorPlugin.getXSDString("_UI_GRAPH_ELEMENTS"),
+            XSDEditorPlugin.getPlugin().getIconImage("obj16/elementsheader"),
+            elementsList, xsdSchema, CategoryAdapter.ELEMENTS));
+      children.add
+        (new CategoryAdapter
+          ( //XSDEditPlugin.getString("_UI_Attributes_label"),
+            XSDEditorPlugin.getXSDString("_UI_GRAPH_ATTRIBUTES"),
+            XSDEditorPlugin.getPlugin().getIconImage("obj16/attributesheader"),
+            attributesList, xsdSchema, CategoryAdapter.ATTRIBUTES));
+      children.add
+        (new CategoryAdapter
+          (//XSDEditPlugin.getString("_UI_AttributeGroups_label"),
+            XSDEditorPlugin.getXSDString("_UI_GRAPH_ATTRIBUTE_GROUPS"),
+            XSDEditorPlugin.getPlugin().getIconImage("obj16/attributegroupsheader"),
+            attributeGroupList, xsdSchema, CategoryAdapter.ATTRIBUTE_GROUPS));
+      children.add
+        (new CategoryAdapter
+          ( //XSDEditPlugin.getString("_UI_Types_label"), 
+            XSDEditorPlugin.getXSDString("_UI_GRAPH_TYPES"),
+            XSDEditorPlugin.getPlugin().getIconImage("obj16/typesheader"),
+            types, xsdSchema, CategoryAdapter.TYPES));
+      children.add
+        (new CategoryAdapter
+          ( // XSDEditPlugin.getString("_UI_ModelGroups_label"), 
+            XSDEditorPlugin.getXSDString("_UI_GRAPH_GROUPS"),
+            XSDEditorPlugin.getPlugin().getIconImage("obj16/groupsheader"),
+            groups, xsdSchema, CategoryAdapter.GROUPS));
+      children.add
+        (new CategoryAdapter
+          ( // XSDEditPlugin.getString("_UI_Notations_label"), 
+            XSDEditorPlugin.getXSDString("_UI_GRAPH_NOTATIONS"),
+            XSDEditorPlugin.getPlugin().getIconImage("obj16/notationsheader"),
+            notations, xsdSchema, CategoryAdapter.NOTATIONS));
+//      children.add
+//        (new CategoryAdapter
+//          ( //XSDEditPlugin.getString("_UI_IdentityConstraints_label"), 
+//              "Identity Constraints",
+//            XSDEditorPlugin.getPlugin().getIconImage("full/obj16/XSDIdentityConstraintDefinitionKey"),
+//            xsdSchema.getIdentityConstraintDefinitions(), xsdSchema, CategoryAdapter.IDENTITY_CONSTRAINTS));
+//      children.add
+//        (new CategoryAdapter
+//          ( // XSDEditPlugin.getString("_UI_Annotations_label"), 
+//              "Annotations",
+//            XSDEditorPlugin.getPlugin().getIconImage("obj16/annotationsheader"),
+//            xsdSchema.getAnnotations(), xsdSchema, CategoryAdapter.ANNOTATIONS));
+
+    return children.toArray();
+  
+  }
+  
+  public boolean hasChildren(Object object)
+  {
+    return true;
+  }
+
+  public Object getParent(Object object)
+  {
+    return null;
+  }
+  
+  public void notifyChanged(final Notification msg)
+  {
+    class CategoryNotification extends NotificationImpl
+    {
+      protected Object category;
+      public CategoryNotification(Object category)
+      {
+        super(msg.getEventType(), msg.getOldValue(), msg.getNewValue(), msg.getPosition());
+        this.category = category;
+      }
+
+      public Object getNotifier()
+      {
+        return category;
+      }
+      public Object getFeature()
+      {
+        return msg.getFeature();
+      }
+    }
+    
+    if (children == null) {
+    	getChildren(target);
+    }
+
+    if (msg.getFeature() == xsdPackage.getXSDSchema_Contents())
+    {
+      CategoryAdapter adapter = (CategoryAdapter)children.get(0);
+      XSDSchema xsdSchema = adapter.getXSDSchema();
+      adapter.setChildren(getDirectives(xsdSchema));
+      this.fireNotifyChanged(new CategoryNotification(adapter));
+      return;
+    }
+    else if (msg.getFeature() == xsdPackage.getXSDSchema_ElementDeclarations())
+    {
+      CategoryAdapter adapter = (CategoryAdapter)children.get(1);
+      XSDSchema xsdSchema = adapter.getXSDSchema();
+      adapter.setChildren(getGlobalElements(xsdSchema));
+      this.fireNotifyChanged(new CategoryNotification(adapter));
+      return;
+    }
+    else if (msg.getFeature() == xsdPackage.getXSDSchema_AttributeDeclarations())
+    {
+      CategoryAdapter adapter = (CategoryAdapter)children.get(2);
+      XSDSchema xsdSchema = adapter.getXSDSchema();
+      adapter.setChildren(getAttributeList(xsdSchema));
+      this.fireNotifyChanged(new CategoryNotification(adapter));
+      return;
+    }
+    else if (msg.getFeature() == xsdPackage.getXSDSchema_AttributeGroupDefinitions())
+    {
+      CategoryAdapter adapter = (CategoryAdapter)children.get(3);
+      XSDSchema xsdSchema = adapter.getXSDSchema();
+      adapter.setChildren(getAttributeGroupList(xsdSchema));
+      this.fireNotifyChanged(new CategoryNotification(adapter));
+      return;
+    }
+    else if (msg.getFeature() == xsdPackage.getXSDSchema_TypeDefinitions())
+    {
+      CategoryAdapter adapter = (CategoryAdapter)children.get(4);
+      XSDSchema xsdSchema = adapter.getXSDSchema();
+      List types = getComplexTypes(xsdSchema);
+      types.addAll(getSimpleTypes(xsdSchema));
+
+      adapter.setChildren(types);
+      this.fireNotifyChanged(new CategoryNotification(adapter));
+      return;
+    }
+    else if (msg.getFeature() == xsdPackage.getXSDSchema_ModelGroupDefinitions())
+    {
+      CategoryAdapter adapter = (CategoryAdapter)children.get(5);
+      XSDSchema xsdSchema = adapter.getXSDSchema();
+      adapter.setChildren(getGroups(xsdSchema));
+      this.fireNotifyChanged(new CategoryNotification(adapter));
+      return;
+    }
+    else if (msg.getFeature() == xsdPackage.getXSDSchema_NotationDeclarations())
+    {
+      CategoryAdapter adapter = (CategoryAdapter)children.get(6);
+      XSDSchema xsdSchema = adapter.getXSDSchema();
+      adapter.setChildren(getNotations(xsdSchema));
+      this.fireNotifyChanged(new CategoryNotification(adapter));
+      return;
+    }
+//    else if (msg.getFeature() == xsdPackage.getXSDSchema_IdentityConstraintDefinitions())
+//    {
+//      this.fireNotifyChanged(new CategoryNotification(children.get(7)));
+//      return;
+//    }
+    else if (msg.getFeature() == xsdPackage.getXSDSchema_Annotations())
+    {
+//      this.fireNotifyChanged(new CategoryNotification(children.get(7)));
+      return;
+    }
+    else if (msg.getFeature() == xsdPackage.getXSDSchema_SchemaLocation())
+    {
+      this.fireNotifyChanged(msg);
+      return;
+    }
+
+    super.notifyChanged(msg);
+  }
+
+  protected List getDirectives(XSDSchema schema)
+  {                 
+    List list = new ArrayList();
+    for (Iterator i = schema.getContents().iterator(); i.hasNext(); )
+    {
+      Object o = i.next();
+      if (o instanceof XSDSchemaDirective)
+      {
+        list.add(o);
+      }
+    } 
+    return list;
+  }
+  
+  protected List getAttributeGroupList(XSDSchema xsdSchema)
+  {
+    List attributeGroupList = new ArrayList();
+    for (Iterator i = xsdSchema.getAttributeGroupDefinitions().iterator(); i.hasNext(); )
+    {
+      XSDAttributeGroupDefinition attrGroup = (XSDAttributeGroupDefinition)i.next();
+      if (attrGroup.getRootContainer() == xsdSchema)
+      {
+        attributeGroupList.add(attrGroup);
+      }
+    }
+    return attributeGroupList;
+  }
+  
+  protected List getAttributeList(XSDSchema xsdSchema)
+  {
+    List attributesList = new ArrayList();
+    for (Iterator iter = xsdSchema.getAttributeDeclarations().iterator(); iter.hasNext(); )
+    {
+      Object o = iter.next();
+      if (o instanceof XSDAttributeDeclaration)
+      {
+        XSDAttributeDeclaration attr = (XSDAttributeDeclaration)o;
+        if (attr != null)
+        {
+          if (attr.getTargetNamespace() != null)
+          {
+            if (!(attr.getTargetNamespace().equals("http://www.w3.org/2001/XMLSchema-instance")))
+            {
+              if (attr.getRootContainer() == xsdSchema)
+              {
+                attributesList.add(attr);
+              }
+            }
+          }
+          else
+          {
+            if (attr.getRootContainer() == xsdSchema)
+            {
+              attributesList.add(attr);
+            }
+          }
+        }
+      }
+    }
+    return attributesList;
+  }
+  
+  protected List getGlobalElements(XSDSchema schema)
+  {
+    List elements = schema.getElementDeclarations();
+    List list = new ArrayList();
+    for (Iterator i = elements.iterator(); i.hasNext(); )
+    {
+      XSDElementDeclaration elem = (XSDElementDeclaration)i.next();
+      if (elem.getRootContainer() == schema)
+      {
+        list.add(elem);
+      }
+    }                
+    return list;
+  }
+  
+  protected List getComplexTypes(XSDSchema schema)
+  {
+    List allTypes = schema.getTypeDefinitions();
+    List list = new ArrayList();
+    for (Iterator i = allTypes.iterator(); i.hasNext(); )
+    {
+      XSDTypeDefinition td = (XSDTypeDefinition)i.next();
+      if (td instanceof XSDComplexTypeDefinition)
+      {
+        XSDComplexTypeDefinition ct = (XSDComplexTypeDefinition)td;
+        if (ct.getRootContainer() == schema)
+        {
+          list.add(ct);
+        }
+      }
+    }                
+    return list;
+  }
+
+  protected List getSimpleTypes(XSDSchema schema)
+  {
+    List allTypes = schema.getTypeDefinitions();
+    List list = new ArrayList();
+    for (Iterator i = allTypes.iterator(); i.hasNext(); )
+    {
+      XSDTypeDefinition td = (XSDTypeDefinition)i.next();
+      if (td instanceof XSDSimpleTypeDefinition)
+      {
+        XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)td;
+        if (st.getRootContainer() == schema)
+        {
+          list.add(st);
+        }
+      }
+    }                
+    return list;
+  }   
+
+  protected List getGroups(XSDSchema schema)
+  {
+    List groups = schema.getModelGroupDefinitions();
+    List list = new ArrayList();
+    for (Iterator i = groups.iterator(); i.hasNext(); )
+    {
+      XSDModelGroupDefinition group = (XSDModelGroupDefinition)i.next();
+      if (group.getRootContainer() == schema)
+      {
+        list.add(group);
+      }
+    }                
+    return list;
+  }
+  
+  protected List getNotations(XSDSchema schema)
+  {
+    List notations = schema.getNotationDeclarations();
+    List list = new ArrayList();
+    for (Iterator i = notations.iterator(); i.hasNext(); )
+    {
+      XSDNotationDeclaration notation = (XSDNotationDeclaration)i.next();
+      if (notation.getRootContainer() == schema)
+      {
+        list.add(notation);
+      }
+    }                
+    return list;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSchemaDirectiveAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSchemaDirectiveAdapter.java
new file mode 100644
index 0000000..47cf912
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSchemaDirectiveAdapter.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDImport;
+import org.eclipse.xsd.XSDInclude;
+import org.eclipse.xsd.XSDRedefine;
+import org.eclipse.xsd.XSDSchemaDirective;
+
+public class XSDSchemaDirectiveAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDSchemaDirectiveAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  
+  public Image getImage(Object object)
+  {
+    if (object instanceof XSDImport)
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDImport.gif");
+    }
+    else if (object instanceof XSDInclude)
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDInclude.gif");
+    }
+    else if (object instanceof XSDRedefine)
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDRedefine.gif");
+    }
+    return null;
+  }
+
+  public String getText(Object object)
+  {
+    XSDSchemaDirective directive = (XSDSchemaDirective)object;
+    String result = directive.getSchemaLocation();
+    if (result == null) result = "(" + XSDEditorPlugin.getXSDString("_UI_LABEL_NO_LOCATION_SPECIFIED") + ")";
+    if (result.equals("")) result = "(" + XSDEditorPlugin.getXSDString("_UI_LABEL_NO_LOCATION_SPECIFIED")+ ")";
+    return result;
+    
+//    XSDImport xsdImport = ((XSDImport)object);
+//    String result = xsdImport.getSchemaLocation();
+//    return result == null ? "" : result;
+    
+//    XSDInclude xsdInclude = ((XSDInclude)object);
+//    String result = xsdInclude.getSchemaLocation();
+//    return result == null ? "" : result;
+    
+//    XSDRedefine xsdRedefine = ((XSDRedefine)object);
+//    String result = xsdRedefine.getSchemaLocation();
+//    return result == null ? "" : result;
+
+
+  }
+
+  public Object[] getChildren(Object parentElement)
+  {
+    List list = new ArrayList();
+    if (parentElement instanceof XSDRedefine)
+    {
+      XSDRedefine redefine = (XSDRedefine)parentElement;
+      list = redefine.getContents();
+      if (list == null)
+      {
+        list = new ArrayList();
+      }
+    }
+    return list.toArray();
+  }
+  
+  public boolean hasChildren(Object object)
+  {
+    return false;
+  }
+
+  public Object getParent(Object object)
+  {
+    return null;
+    
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSimpleTypeDefinitionAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSimpleTypeDefinitionAdapter.java
new file mode 100644
index 0000000..0d4026a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDSimpleTypeDefinitionAdapter.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDVariety;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class XSDSimpleTypeDefinitionAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDSimpleTypeDefinitionAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  public Image getImage(Object object)
+  {
+    XSDSimpleTypeDefinition xsdSimpleTypeDefinition = ((XSDSimpleTypeDefinition)object);
+    
+    if (xsdSimpleTypeDefinition.getContainer() == null)
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif");
+    }
+    
+    if (XSDVariety.LIST_LITERAL == xsdSimpleTypeDefinition.getVariety())
+    {
+      // return XSDEditorPlugin.getXSDImage("icons/XSDSimpleList.gif");
+      return XSDEditorPlugin.getPlugin().getIconImage("obj16/smpl_list_obj");
+    }
+    else if (XSDVariety.UNION_LITERAL == xsdSimpleTypeDefinition.getVariety())
+    {
+      //return XSDEditorPlugin.getXSDImage("icons/XSDSimpleUnion.gif");
+      return XSDEditorPlugin.getPlugin().getIconImage("obj16/smpl_union_obj");
+    }
+    else if (XSDVariety.ATOMIC_LITERAL == xsdSimpleTypeDefinition.getVariety())
+    {
+      // return XSDEditorPlugin.getXSDImage("icons/XSDSimpleRestrict.gif");
+      Element stElement = xsdSimpleTypeDefinition.getElement();
+      XSDDOMHelper domHelper = new XSDDOMHelper();
+      if (domHelper.getChildNode(stElement, XSDConstants.RESTRICTION_ELEMENT_TAG) != null)
+      {
+        return XSDEditorPlugin.getPlugin().getIconImage("obj16/smpl_restrict_obj");
+      }
+      return XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif");
+    }
+    else if (xsdSimpleTypeDefinition.isSetVariety())
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif");
+    }
+    else
+    {
+      return XSDEditorPlugin.getXSDImage("icons/XSDSimpleType.gif");
+    }
+    
+//    return 
+//      XSDEditorPlugin.getPlugin().getIconImage
+//        (xsdSimpleTypeDefinition.getContainer() == null ?
+//           "full/obj16/XSDSimpleTypeDefinitionUnresolved" :
+//           XSDVariety.LIST_LITERAL == xsdSimpleTypeDefinition.getVariety() ? 
+//             "full/obj16/XSDSimpleTypeDefinitionList" :  
+//              XSDVariety.UNION_LITERAL == xsdSimpleTypeDefinition.getVariety() ? 
+//                "full/obj16/XSDSimpleTypeDefinitionUnion" :
+//                  xsdSimpleTypeDefinition.isSetVariety() ?
+//                    "full/obj16/XSDSimpleTypeDefinitionAtomic"  :
+//                    "full/obj16/XSDSimpleTypeDefinition");
+  }
+  
+  public String getText(Object object)
+  {
+    return getText(object, true);
+  }
+ 
+  public String getText(Object object, boolean showType)
+  {
+    XSDSimpleTypeDefinition xsdSimpleTypeDefinition = ((XSDSimpleTypeDefinition)object);
+
+    StringBuffer result = new StringBuffer();
+
+    result.append
+      (xsdSimpleTypeDefinition.getName() == null ? 
+         // xsdSimpleTypeDefinition.getAliasName() :
+         "local type" :
+         xsdSimpleTypeDefinition.getName());
+
+    if (showType)
+    {
+      XSDSimpleTypeDefinition baseTypeDefinition = xsdSimpleTypeDefinition.getBaseTypeDefinition();
+      if (baseTypeDefinition != null && XSDVariety.ATOMIC_LITERAL == xsdSimpleTypeDefinition.getVariety())
+      {
+        if (baseTypeDefinition.getName() != null && 
+              !xsdSimpleTypeDefinition.getContents().contains(baseTypeDefinition) &&
+              !XSDConstants.isAnySimpleType(baseTypeDefinition)) 
+        {
+          result.append(" : ");
+          result.append(baseTypeDefinition.getQName(xsdSimpleTypeDefinition));
+        }
+      }
+      else
+      {
+        XSDSimpleTypeDefinition itemTypeDefinition = xsdSimpleTypeDefinition.getItemTypeDefinition();
+        if (itemTypeDefinition != null)
+        {
+          if (itemTypeDefinition.getName() != null) 
+          {
+            result.append(" : ");
+            result.append(itemTypeDefinition.getQName(xsdSimpleTypeDefinition));
+          }
+        }
+        else 
+        {
+          List memberTypeDefinitions = xsdSimpleTypeDefinition.getMemberTypeDefinitions();
+          if (!memberTypeDefinitions.isEmpty())
+          {
+            boolean first = true;
+            for (Iterator members = memberTypeDefinitions.iterator(); members.hasNext(); )
+            {
+              XSDSimpleTypeDefinition memberTypeDefinition = (XSDSimpleTypeDefinition)members.next();
+              if (memberTypeDefinition.getName() != null) 
+              {
+                if (first)
+                {
+                  result.append(" : ");
+                  first = false;
+                }
+                else
+                {
+                  result.append(" | ");
+                }
+                result.append(memberTypeDefinition.getQName(xsdSimpleTypeDefinition));
+              }
+              else
+              {
+                break;
+              }
+            }
+          } 
+          else if (result.length() == 0)
+          {
+            result.append("'absent'");
+          }
+        }
+      }
+    }
+
+    return result.toString();
+  }
+
+  public Object[] getChildren(Object parentElement)
+  {
+    XSDSimpleTypeDefinition xsdSimpleTypeDefinition = (XSDSimpleTypeDefinition)parentElement;
+    List list = new ArrayList();
+//    list.addAll(xsdSimpleTypeDefinition.getContents());
+//    list.addAll(xsdSimpleTypeDefinition.getFacetContents());
+//    list.addAll(xsdSimpleTypeDefinition.getFundamentalFacets());
+//    list.addAll(xsdSimpleTypeDefinition.getSyntheticFacets());
+    return list.toArray();
+  
+  }
+  
+  public boolean hasChildren(Object object)
+  {
+    return true;
+  }
+
+  public Object getParent(Object object)
+  {
+    XSDSimpleTypeDefinition element = (XSDSimpleTypeDefinition)object;
+    return element.getContainer();
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDWildcardAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDWildcardAdapter.java
new file mode 100644
index 0000000..b219f6b
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/provider/XSDWildcardAdapter.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.provider;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDWildcard;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class XSDWildcardAdapter extends XSDAbstractAdapter
+{
+
+  /**
+   * @param adapterFactory
+   */
+  public XSDWildcardAdapter(AdapterFactory adapterFactory)
+  {
+    super(adapterFactory);
+  }
+
+  public Image getImage(Object object)
+  {
+    XSDWildcard xsdWildcard = (XSDWildcard)object;
+    return XSDEditorPlugin.getXSDImage
+      (xsdWildcard.eContainer() instanceof XSDParticle ?
+        "icons/XSDAny.gif" :
+        "icons/XSDAnyAttribute.gif");
+  }
+  
+  public String getText(Object object)
+  {
+    XSDWildcard xsdWildcard = ((XSDWildcard)object);
+    
+    StringBuffer result = new StringBuffer();
+    Element element = xsdWildcard.getElement();
+    
+    if (element != null)
+    {
+      result.append(element.getNodeName());
+      boolean hasMinOccurs = element.hasAttribute(XSDConstants.MINOCCURS_ATTRIBUTE);
+      boolean hasMaxOccurs = element.hasAttribute(XSDConstants.MAXOCCURS_ATTRIBUTE);
+      
+      if (hasMinOccurs || hasMaxOccurs)
+      {
+        result.append(" [");   //$NON-NLS-1$
+        if (hasMinOccurs)
+        {
+          
+          int min = ((XSDParticle)xsdWildcard.getContainer()).getMinOccurs();
+          if (min == XSDParticle.UNBOUNDED)
+          {
+            result.append("*");
+          }
+          else
+          {
+            result.append(String.valueOf(min));
+          }
+        }
+        else // print default
+        {
+          int min = ((XSDParticle)xsdWildcard.getContainer()).getMinOccurs();
+          result.append(String.valueOf(min));
+        }
+        if (hasMaxOccurs)
+        {
+          int max = ((XSDParticle)xsdWildcard.getContainer()).getMaxOccurs();
+          result.append("..");
+          if (max == XSDParticle.UNBOUNDED)
+          {
+            result.append("*");
+          }
+          else
+          {
+            result.append(String.valueOf(max));
+          }
+        }
+        else // print default
+        {
+          result.append("..");
+          int max = ((XSDParticle)xsdWildcard.getContainer()).getMaxOccurs();
+          result.append(String.valueOf(max));
+        }
+        result.append("]");
+      }
+    }
+    return result.toString();
+
+  }
+
+  public boolean hasChildren(Object object)
+  {
+    return false;
+  }
+
+  public Object getParent(Object object)
+  {
+    XSDWildcard xsdWildcard = (XSDWildcard)object;
+    return xsdWildcard.getContainer();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/XSDVisitor.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/XSDVisitor.java
new file mode 100644
index 0000000..24bda3f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/XSDVisitor.java
@@ -0,0 +1,217 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor;
+
+import java.util.Iterator;
+
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupContent;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeContent;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDIdentityConstraintDefinition;
+import org.eclipse.xsd.XSDModelGroup;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNotationDeclaration;
+import org.eclipse.xsd.XSDParticle;
+import org.eclipse.xsd.XSDParticleContent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.XSDWildcard;
+
+public class XSDVisitor
+{
+  public XSDVisitor()
+  {
+  }
+  
+  protected XSDSchema schema;
+  
+  public void visitSchema(XSDSchema schema)
+  {
+    this.schema = schema;
+    for (Iterator iterator = schema.getAttributeDeclarations().iterator(); iterator.hasNext();)
+    {
+      XSDAttributeDeclaration attr = (XSDAttributeDeclaration) iterator.next();
+      visitAttributeDeclaration(attr);
+    }
+    for (Iterator iterator = schema.getTypeDefinitions().iterator(); iterator.hasNext();)
+    {
+      XSDTypeDefinition type = (XSDTypeDefinition) iterator.next();
+      visitTypeDefinition(type);
+    }
+    for (Iterator iterator = schema.getElementDeclarations().iterator(); iterator.hasNext();)
+    {
+      XSDElementDeclaration element = (XSDElementDeclaration) iterator.next();
+      visitElementDeclaration(element);
+    }
+    for (Iterator iterator = schema.getIdentityConstraintDefinitions().iterator(); iterator.hasNext();)
+    {
+      XSDIdentityConstraintDefinition identityConstraint = (XSDIdentityConstraintDefinition) iterator.next();
+      visitIdentityConstraintDefinition(identityConstraint);
+    }
+    for (Iterator iterator = schema.getModelGroupDefinitions().iterator(); iterator.hasNext();)
+    {
+      XSDModelGroupDefinition modelGroup = (XSDModelGroupDefinition) iterator.next();
+      visitModelGroupDefinition(modelGroup);
+    }
+    for (Iterator iterator = schema.getAttributeGroupDefinitions().iterator(); iterator.hasNext();)
+    {
+      XSDAttributeGroupDefinition attributeGroup = (XSDAttributeGroupDefinition) iterator.next();
+      visitAttributeGroupDefinition(attributeGroup);
+    }
+    for (Iterator iterator = schema.getNotationDeclarations().iterator(); iterator.hasNext();)
+    {
+      XSDNotationDeclaration element = (XSDNotationDeclaration) iterator.next();
+      visitNotationDeclaration(element);
+    }
+    
+  }
+  
+  public void visitAttributeDeclaration(XSDAttributeDeclaration attr)
+  {
+  }
+  
+  public void visitTypeDefinition(XSDTypeDefinition type)
+  {
+    if (type instanceof XSDSimpleTypeDefinition)
+    {
+      visitSimpleTypeDefinition((XSDSimpleTypeDefinition)type);
+    }
+    else if (type instanceof XSDComplexTypeDefinition)
+    {
+      visitComplexTypeDefinition((XSDComplexTypeDefinition)type);
+    }
+  }
+  
+  public void visitElementDeclaration(XSDElementDeclaration element)
+  {
+    if (element.isElementDeclarationReference())
+    {
+    }
+    else if (element.getAnonymousTypeDefinition() != null)
+    {
+      visitTypeDefinition(element.getAnonymousTypeDefinition());
+    }
+  }
+  
+  public void visitIdentityConstraintDefinition(XSDIdentityConstraintDefinition identityConstraint)
+  {
+  }
+  
+  public void visitModelGroupDefinition(XSDModelGroupDefinition modelGroupDef)
+  {
+    if (!modelGroupDef.isModelGroupDefinitionReference())
+    {
+      if (modelGroupDef.getModelGroup() != null)
+      {
+        visitModelGroup(modelGroupDef.getModelGroup());
+      }
+    }
+  }
+  
+  public void visitAttributeGroupDefinition(XSDAttributeGroupDefinition attributeGroup)
+  {
+    if (attributeGroup.getAttributeUses() != null)
+    {
+      for (Iterator iter = attributeGroup.getAttributeUses().iterator(); iter.hasNext(); )
+      {
+        XSDAttributeUse attrUse = (XSDAttributeUse)iter.next();
+        visitAttributeDeclaration(attrUse.getContent());
+      }
+    }
+  }
+  
+  public void visitNotationDeclaration(XSDNotationDeclaration notation)
+  {
+  }
+  
+  public void visitSimpleTypeDefinition(XSDSimpleTypeDefinition type)
+  {
+  }
+  
+  public void visitComplexTypeDefinition(XSDComplexTypeDefinition type)
+  {
+    if (type.getContentType() != null)
+    {
+      XSDComplexTypeContent complexContent = (XSDComplexTypeContent) type.getContentType();
+      if (complexContent instanceof XSDSimpleTypeDefinition)
+      {
+        visitSimpleTypeDefinition((XSDSimpleTypeDefinition)complexContent);
+      }
+      else if (complexContent instanceof XSDParticle)
+      {
+        visitParticle((XSDParticle) complexContent);
+      }
+    }
+    
+    if (type.getAttributeContents() != null)
+    {
+      for (Iterator iter = type.getAttributeContents().iterator(); iter.hasNext(); )
+      {
+        XSDAttributeGroupContent attrGroupContent = (XSDAttributeGroupContent)iter.next();
+        if (attrGroupContent instanceof XSDAttributeUse)
+        {
+          XSDAttributeUse attrUse = (XSDAttributeUse)attrGroupContent;
+          visitAttributeDeclaration(attrUse.getContent());
+        }
+        else if (attrGroupContent instanceof XSDAttributeGroupDefinition)
+        {
+          visitAttributeGroupDefinition((XSDAttributeGroupDefinition)attrGroupContent);
+        }
+      }
+    }
+  }
+  
+  public void visitParticle(XSDParticle particle)
+  {
+    visitParticleContent(particle.getContent());
+  }
+  
+  public void visitParticleContent(XSDParticleContent particleContent)
+  {
+    if (particleContent instanceof XSDModelGroupDefinition)
+    {
+      visitModelGroupDefinition((XSDModelGroupDefinition) particleContent);
+    }
+    else if (particleContent instanceof XSDModelGroup)
+    {
+      visitModelGroup((XSDModelGroup)particleContent);
+    }
+    else if (particleContent instanceof XSDElementDeclaration)
+    {
+      visitElementDeclaration((XSDElementDeclaration)particleContent);
+    }
+    else if (particleContent instanceof XSDWildcard)
+    {
+      visitWildcard((XSDWildcard)particleContent);
+    }
+  }
+  
+  public void visitModelGroup(XSDModelGroup modelGroup)
+  {
+    if (modelGroup.getContents() != null)
+    {
+      for (Iterator iterator = modelGroup.getContents().iterator(); iterator.hasNext();)
+      {
+        XSDParticle particle = (XSDParticle) iterator.next();
+        visitParticle(particle);
+      }
+    }
+  }
+  
+  public void visitWildcard(XSDWildcard wildcard)
+  {
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/BaseCleanup.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/BaseCleanup.java
new file mode 100644
index 0000000..f45a1e2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/BaseCleanup.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.delete;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.w3c.dom.Element;
+
+public abstract class BaseCleanup extends XSDVisitor
+{
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor#visitSchema(XSDSchema)
+   */
+  public void visitSchema(XSDSchema schema)
+  {
+    super.visitSchema(schema);
+    
+    // now remove all children that were queued up for removal
+    
+    for (Iterator iter = childrenToRemove.iterator(); iter.hasNext(); )
+    {
+      Element domElement = (Element) iter.next();
+      XSDDOMHelper.removeNodeAndWhitespace(domElement);
+//      domElement.getParentNode().removeChild(domElement);
+    }
+  }
+
+
+  protected ArrayList messages = new ArrayList();
+
+  public ArrayList getMessages()
+  {
+  	return messages;
+  }
+  
+
+  protected void addMessage(String msg, XSDConcreteComponent component)
+  {
+////    ErrorMessage message = new ErrorMessage();
+//    
+//    XSDConcreteComponent currComp = component;
+//    while (!(currComp instanceof XSDSchemaContent) && currComp.getContainer() != null)
+//    {
+//      currComp = currComp.getContainer();
+//    }
+//
+//    Element domElement = currComp.getElement();
+//    Node parent = domElement;
+//    while (!(parent instanceof NodeImpl) && parent != null)
+//    {
+//      parent = parent.getParentNode();
+//    }
+//    if (parent instanceof NodeImpl)
+//    {
+//      // message.setModelObject(currComp.getElement());
+//			message.setTargetObject(currComp.getElement());
+//    }
+//    message.setLocalizedMessage(msg);
+//  ???
+//    addMessage(message);
+  }
+    
+
+// // protected void addMessage(ErrorMessage message)
+//	protected void addMessage(Message message)
+//  {
+//    messages.add(message);
+//  }
+  
+
+  protected ArrayList childrenToRemove = new ArrayList();
+  
+
+  protected String getNamedComponentName(XSDConcreteComponent concrete)
+  {
+    String name = null;
+    if (concrete instanceof XSDNamedComponent)
+    {
+      name = ((XSDNamedComponent)concrete).getName();
+    }
+    
+    XSDConcreteComponent comp = concrete;
+    while (comp != null && name == null)
+    {
+      comp = comp.getContainer();
+      if (comp instanceof XSDNamedComponent)
+      {
+        name = ((XSDNamedComponent)comp).getName();
+      }
+    }
+    return name != null ? name : "";
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/BaseGlobalCleanup.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/BaseGlobalCleanup.java
new file mode 100644
index 0000000..6503971
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/BaseGlobalCleanup.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.delete;
+
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDNamedComponent;
+
+public class BaseGlobalCleanup extends BaseCleanup
+{
+  public BaseGlobalCleanup(XSDConcreteComponent deletedItem)
+  {
+    this.deletedItem = deletedItem;
+  }
+  
+  protected XSDConcreteComponent deletedItem;
+  
+  protected String getDeletedQName()
+  {
+    return ((XSDNamedComponent)deletedItem).getQName();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalAttributeCleanup.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalAttributeCleanup.java
new file mode 100644
index 0000000..64c5779
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalAttributeCleanup.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.delete;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupContent;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.util.XSDConstants;
+
+public class GlobalAttributeCleanup extends BaseGlobalCleanup
+{
+  /**
+   * Constructor for GlobalAttributeCleanup.
+   * @param deletedItem
+   */
+  public GlobalAttributeCleanup(XSDConcreteComponent deletedItem)
+  {
+    super(deletedItem);
+  }
+  
+  protected String replacementName = null;
+  
+  protected String getReplacementElementName()
+  {
+    if (replacementName == null)
+    {
+      TypesHelper helper = new TypesHelper(schema);
+      
+      List elements = helper.getGlobalAttributes();
+      
+      String deletedName = getDeletedQName();
+      for (Iterator i = elements.iterator(); i.hasNext();)
+      {
+        String name = (String) i.next();
+        if (!name.equals(deletedName))
+        {
+          replacementName = name;
+          break;
+        }
+      }
+    }
+    return replacementName;
+  }
+
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor#visitComplexTypeDefinition(XSDComplexTypeDefinition)
+   */
+  public void visitComplexTypeDefinition(XSDComplexTypeDefinition type)
+  {
+    super.visitComplexTypeDefinition(type);
+    if (type.getAttributeContents() != null)
+    {
+      for (Iterator iter = type.getAttributeContents().iterator(); iter.hasNext(); )
+      {
+        XSDAttributeGroupContent attrGroupContent = (XSDAttributeGroupContent) iter.next();
+        if (attrGroupContent instanceof XSDAttributeUse)
+        {
+          XSDAttributeUse attrUse = (XSDAttributeUse) attrGroupContent;
+          XSDAttributeDeclaration attrDecl = attrUse.getContent();
+          
+          // now is this a reference?
+          if (attrDecl != null && attrDecl.isAttributeDeclarationReference())
+          {
+            if (deletedItem.equals(attrDecl.getResolvedAttributeDeclaration()))
+            {
+              if (getReplacementElementName() != null)
+              {
+                // String msg = XSDPlugin.getSchemaString("_INFO_RESET_ATTRIBUTE_REFERENCE") + " <" + getReplacementElementName() + ">";
+								String msg = "Reset attribute reference " + " <" + getReplacementElementName() + ">";
+                addMessage(msg, attrUse);
+                attrUse.getElement().setAttribute(XSDConstants.REF_ATTRIBUTE, getReplacementElementName());
+              }
+              else
+              {
+                String name = getNamedComponentName(type);
+                // String msg = XSDPlugin.getSchemaString("_INFO_REMOVE_ATTRIBUTE_REFERENCE") +
+								String msg = "Remove attribute reference " +
+                         " <" + name + ">";
+                addMessage(msg, attrUse.getContainer());
+                
+                childrenToRemove.add(attrDecl.getElement());
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalAttributeGroupCleanup.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalAttributeGroupCleanup.java
new file mode 100644
index 0000000..2d5ed5c
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalAttributeGroupCleanup.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.delete;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDAttributeGroupContent;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.util.XSDConstants;
+
+public class GlobalAttributeGroupCleanup extends BaseGlobalCleanup
+{
+  /**
+   * Constructor for GlobalAttributeGroupCleanup.
+   * @param deletedItem
+   */
+  public GlobalAttributeGroupCleanup(XSDConcreteComponent deletedItem)
+  {
+    super(deletedItem);
+  }
+  
+  
+  protected String replacementName = null;
+  
+  protected String getReplacementElementName()
+  {
+    if (replacementName == null)
+    {
+      TypesHelper helper = new TypesHelper(schema);
+      
+      List elements = helper.getGlobalAttributeGroups();
+      
+      String deletedName = getDeletedQName();
+      for (Iterator i = elements.iterator(); i.hasNext();)
+      {
+        String name = (String) i.next();
+        if (!name.equals(deletedName))
+        {
+          replacementName = name;
+          break;
+        }
+      }
+    }
+    return replacementName;
+  }
+
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor#visitComplexTypeDefinition(XSDComplexTypeDefinition)
+   */
+  public void visitComplexTypeDefinition(XSDComplexTypeDefinition type)
+  {
+    super.visitComplexTypeDefinition(type);
+    if (type.getAttributeContents() != null)
+    {
+      for (Iterator iter = type.getAttributeContents().iterator(); iter.hasNext(); )
+      {
+        XSDAttributeGroupContent attrGroupContent = (XSDAttributeGroupContent) iter.next();
+
+        if (attrGroupContent instanceof XSDAttributeGroupDefinition)
+        {
+          XSDAttributeGroupDefinition attrGroupDef = (XSDAttributeGroupDefinition) attrGroupContent;
+          
+          if (deletedItem.equals(attrGroupDef.getResolvedAttributeGroupDefinition()))
+          {
+            if (getReplacementElementName() != null)
+            {
+              // String msg = XSDPlugin.getSchemaString("_INFO_RESET_ATTRIBUTE_GROUP_REFERENCE") + " <" + getReplacementElementName() + ">";
+							String msg = "Reset attribute group reference " + " <" + getReplacementElementName() + ">";
+              addMessage(msg, attrGroupDef);
+              attrGroupDef.getElement().setAttribute(XSDConstants.REF_ATTRIBUTE, getReplacementElementName());
+            }
+            else
+            {
+              // remove the attribute group reference
+              String name = getNamedComponentName(type);
+              // String msg = XSDPlugin.getSchemaString("_INFO_REMOVE_ATTRIBUTE_GROUP_REFERENCE") + " <" + name + ">";
+							String msg = "Remove attribute group reference " + " <" + name + ">";
+  
+              addMessage(msg, attrGroupDef.getContainer());
+              
+              childrenToRemove.add(attrGroupDef.getElement());
+            }
+          }
+        }
+      }
+    }
+    
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalElementCleanup.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalElementCleanup.java
new file mode 100644
index 0000000..7d2f5d8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalElementCleanup.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.delete;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.util.XSDConstants;
+
+public class GlobalElementCleanup extends BaseGlobalCleanup
+{
+    
+  /**
+   * Constructor for GlobalElementCleanup.
+   * @param deletedItem
+   */
+  public GlobalElementCleanup(XSDConcreteComponent deletedItem)
+  {
+    super(deletedItem);
+  }
+
+  protected String replacementName = null;
+  
+  protected String getReplacementElementName()
+  {
+    if (replacementName == null)
+    {
+      TypesHelper helper = new TypesHelper(schema);
+      
+      List elements = helper.getGlobalElements();
+      
+      String deletedName = getDeletedQName();
+      for (Iterator i = elements.iterator(); i.hasNext();)
+      {
+        String name = (String) i.next();
+        if (!name.equals(deletedName))
+        {
+          replacementName = name;
+          break;
+        }
+      }
+    }
+    return replacementName;
+  }
+  
+  /**
+   * @see XSDVisitor#visitElementDeclaration(XSDElementDeclaration)
+   */
+  public void visitElementDeclaration(XSDElementDeclaration element)
+  {
+    if (element.isElementDeclarationReference())
+    {
+      if (deletedItem.equals(element.getResolvedElementDeclaration()))
+      {
+        if (getReplacementElementName() != null)
+        {
+          // KCPort String msg = XSDPlugin.getSchemaString("_INFO_RESET_ELEMENT_REFERENCE") + " <" + getReplacementElementName() + ">";
+					String msg = "_INFO_RESET_ELEMENT_REFERENCE" + " <" + getReplacementElementName() + ">";
+          addMessage(msg, element);
+          element.getElement().setAttribute(XSDConstants.REF_ATTRIBUTE, getReplacementElementName());
+        }
+        else
+        {
+          // KCPort  String msg = XSDPlugin.getSchemaString("_INFO_REMOVE_ELEMENT_REFERENCE") + " <" + getNamedComponentName(element.getContainer()) + ">";
+					String msg = "_INFO_REMOVE_ELEMENT_REFERENCE" + " <" + getNamedComponentName(element.getContainer()) + ">";
+          addMessage(msg, element.getContainer());
+          childrenToRemove.add(element.getElement());
+        }
+      }
+    }
+    super.visitElementDeclaration(element);
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalGroupCleanup.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalGroupCleanup.java
new file mode 100644
index 0000000..9486ff2
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalGroupCleanup.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.delete;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+
+public class GlobalGroupCleanup extends BaseGlobalCleanup
+{
+  /**
+   * Constructor for GlobalGroupCleanup.
+   * @param deletedItem
+   */
+  public GlobalGroupCleanup(XSDConcreteComponent deletedItem)
+  {
+    super(deletedItem);
+  }
+
+  protected String replacementName = null;
+  
+  protected String getReplacementElementName()
+  {
+    if (replacementName == null)
+    {
+      TypesHelper helper = new TypesHelper(schema);
+      
+      List elements = helper.getModelGroups();
+      
+      String deletedName = getDeletedQName();
+      for (Iterator i = elements.iterator(); i.hasNext();)
+      {
+        String name = (String) i.next();
+        if (!name.equals(deletedName))
+        {
+          replacementName = name;
+          break;
+        }
+      }
+    }
+    return replacementName;
+  }
+
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor#visitModelGroupDefinition(XSDModelGroupDefinition)
+   */
+  public void visitModelGroupDefinition(XSDModelGroupDefinition modelGroup)
+  {
+    super.visitModelGroupDefinition(modelGroup);
+    if (modelGroup.isModelGroupDefinitionReference())
+    {
+      if (deletedItem.equals(modelGroup.getResolvedModelGroupDefinition()))
+      {
+        if (getReplacementElementName() != null)
+        {
+          // KCPort String msg = XSDPlugin.getSchemaString("_INFO_RESET_GROUP_REFERENCE") + " <" + getReplacementElementName() + ">";
+					String msg = "_INFO_RESET_GROUP_REFERENCE" + " <" + getReplacementElementName() + ">";
+          addMessage(msg, modelGroup);
+          modelGroup.getElement().setAttribute(XSDConstants.REF_ATTRIBUTE, getReplacementElementName());
+        }
+        else
+        {
+          String name = getNamedComponentName(modelGroup);
+          // KCPort String msg = XSDPlugin.getSchemaString("_INFO_REMOVE_GROUP_REFERENCE") + " <" + name + ">";
+					String msg = "_INFO_REMOVE_GROUP_REFERENCE" + " <" + name + ">";
+          addMessage(msg, modelGroup.getContainer());
+          childrenToRemove.add(modelGroup.getElement());
+        }
+      }
+    }      
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalSimpleOrComplexTypeCleanup.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalSimpleOrComplexTypeCleanup.java
new file mode 100644
index 0000000..2e8780f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/GlobalSimpleOrComplexTypeCleanup.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.delete;
+
+import java.text.MessageFormat;
+import java.util.Iterator;
+
+import org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupContent;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class GlobalSimpleOrComplexTypeCleanup extends BaseGlobalCleanup
+{
+  /**
+   * Constructor for GlobalSimpleOrComplexTypeCleanup.
+   * @param deletedItem
+   */
+  public GlobalSimpleOrComplexTypeCleanup(XSDConcreteComponent deletedItem)
+  {
+    super(deletedItem);
+  }
+
+  /**
+   * @see XSDVisitor#visitElementDeclaration(XSDElementDeclaration)
+   */
+  public void visitElementDeclaration(XSDElementDeclaration element)
+  {
+    if (!element.isElementDeclarationReference() &&
+        deletedItem.equals(element.getTypeDefinition()))
+    {
+      resetTypeToString(element.getElement());
+      
+      String msg = "";
+      if (element.isGlobal())
+      {
+        // KCPort String pattern = XSDPlugin.getSchemaString("_INFO_RESET_GLOBAL_ELEMENT");
+				String pattern = "_INFO_RESET_GLOBAL_ELEMENT";
+        Object args[] = {element.getName()};
+        msg = MessageFormat.format(pattern, args);
+      }
+      else
+      {
+        // KCPort msg = XSDPlugin.getSchemaString("_INFO_RESET_ELEMENT");
+				msg = "_INFO_RESET_ELEMENT";
+        // KCPort msg += "<" + element.getName() + "> " + XSDPlugin.getSchemaString("_UI_TO_TYPE_STRING");
+				msg += "<" + element.getName() + "> " + "_UI_TO_TYPE_STRING";
+      }
+      addMessage(msg, element);
+    }
+
+
+    super.visitElementDeclaration(element);
+  }
+
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor#visitComplexTypeDefinition(XSDComplexTypeDefinition)
+   */
+  public void visitComplexTypeDefinition(XSDComplexTypeDefinition type)
+  {
+    super.visitComplexTypeDefinition(type);
+    if (type.getAttributeContents() != null)
+    {
+      for (Iterator iter = type.getAttributeContents().iterator(); iter.hasNext(); )
+      {
+        XSDAttributeGroupContent attrGroupContent = (XSDAttributeGroupContent) iter.next();
+        if (attrGroupContent instanceof XSDAttributeUse)
+        {
+          XSDAttributeUse attrUse = (XSDAttributeUse) attrGroupContent;
+          XSDAttributeDeclaration attrDecl = attrUse.getContent();
+          
+          // now is this a reference?
+          if (attrDecl != null &&
+              !attrDecl.isAttributeDeclarationReference() &&
+              deletedItem.equals(attrDecl.getTypeDefinition()))
+          {
+              resetTypeToString(attrDecl.getElement());
+              // reset the type of the attribute decl to string
+              // KCPort String msg = XSDPlugin.getSchemaString("_INFO_RESET_ATTRIBUTE") +
+						  String msg = "_INFO_RESET_ATTRIBUTE" +
+                          " <" + attrDecl.getName() + "> " +
+                          // KCPort XSDPlugin.getSchemaString("_UI_TO_TYPE_STRING");
+						               "_UI_TO_TYPE_STRING"; 
+              addMessage(msg, attrDecl);
+              resetTypeToString(attrDecl.getElement());
+          }
+        }
+      }
+    }
+    XSDTypeDefinition base = type.getBaseTypeDefinition();
+    if (base != null && base.equals(deletedItem))
+    {
+      XSDDOMHelper helper = new XSDDOMHelper();
+      Element derivedByNode = helper.getDerivedByElement(type.getElement());
+
+      // KCPort String msg = XSDPlugin.getSchemaString("_INFO_RESET_COMPLEX_TYPE") +
+			String msg = "_INFO_RESET_COMPLEX_TYPE" +
+              " <" + getNamedComponentName(type) + "> " +
+              // KCPort XSDPlugin.getSchemaString("_UI_DERIVATION");
+			        "_UI_DERIVATION";
+      addMessage(msg, type);
+      
+      type.setBaseTypeDefinition(null);
+
+      java.util.List listOfCT = schema.getTypeDefinitions();
+      XSDTypeDefinition typeDefinition = null;
+      if (listOfCT.size() > 0)
+      {
+        typeDefinition = (XSDTypeDefinition)(listOfCT).get(0);
+        type.setBaseTypeDefinition(typeDefinition);
+      }
+
+//      type.setBaseTypeDefinition(schema.getSchemaForSchema().resolveSimpleTypeDefinition("string"));
+    }
+  }
+
+
+
+  protected void resetTypeToString(Element element)
+  {
+    String prefix = element.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+    
+    element.setAttribute(XSDConstants.TYPE_ATTRIBUTE, prefix + "string"); 
+  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/XSDExternalFileCleanup.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/XSDExternalFileCleanup.java
new file mode 100644
index 0000000..4a2472f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/delete/XSDExternalFileCleanup.java
@@ -0,0 +1,300 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.delete;
+
+import java.text.MessageFormat;
+import java.util.Iterator;
+
+import org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupContent;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaContent;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class XSDExternalFileCleanup extends BaseCleanup
+{
+  /**
+   * Constructor for XSDExternalFileCleanup.
+   */
+  public XSDExternalFileCleanup(String oldFilename)
+  {
+    super();
+    this.oldFilename = oldFilename;
+  }
+  
+  protected XSDSchema deletedSchema;
+  public XSDExternalFileCleanup(XSDSchema deletedSchema)
+  {
+    this.deletedSchema = deletedSchema;
+  }
+
+  protected String oldFilename;
+  
+  /**
+   * @see XSDVisitor#visitElementDeclaration(XSDElementDeclaration)
+   */
+  public void visitElementDeclaration(XSDElementDeclaration element)
+  {
+    boolean addMessage = true;
+    String schemaLocation = element.getSchema().getSchemaLocation();
+    if (schemaLocation!= null)
+    {
+      if (!schemaLocation.equals(schema.getSchemaLocation()))
+      {
+        addMessage = false;
+      }
+    }
+    if (element.isElementDeclarationReference())
+    {
+      if (isFromDeletedSchema(element.getResolvedElementDeclaration()))
+      {
+        if (addMessage)
+        {
+          // String msg = XSDPlugin.getSchemaString("_INFO_REMOVE_ELEMENT_REFERENCE") + " <" + getNamedComponentName(element.getContainer()) + ">";
+					String msg = "_INFO_REMOVE_ELEMENT_REFERENCE" + " <" + getNamedComponentName(element.getContainer()) + ">";
+          addMessage(msg, element.getContainer());
+        }
+        childrenToRemove.add(element.getElement());
+//        Element domElement = element.getElement();
+//        domElement.getParentNode().removeChild(domElement);     
+      }
+    }
+    else if (removeType(element))
+    {
+      String msg = "";
+      if (element.isGlobal())
+      {
+      	// String pattern = XSDPlugin.getSchemaString("_INFO_RESET_GLOBAL_ELEMENT");
+				String pattern = "_INFO_RESET_GLOBAL_ELEMENT";
+        Object args[] = {element.getName()};
+        msg = MessageFormat.format(pattern, args);
+      }
+      else
+      {
+      	// msg = XSDPlugin.getSchemaString("_INFO_RESET_ELEMENT");
+				msg = "_INFO_RESET_ELEMENT";
+      	// msg += "<" + element.getName() + "> " + XSDPlugin.getSchemaString("_UI_TO_TYPE_STRING");
+				msg += "<" + element.getName() + "> " + "_UI_TO_TYPE_STRING";
+      }
+      if (addMessage)
+      {
+        addMessage(msg, element);
+      }
+    }
+
+
+    super.visitElementDeclaration(element);
+  }
+
+  protected void resetTypeToString(Element element)
+  {
+    String prefix = element.getPrefix();
+    prefix = (prefix == null) ? "" : (prefix + ":");
+    
+    element.setAttribute(XSDConstants.TYPE_ATTRIBUTE, prefix + "string"); 
+  }
+  
+  protected boolean removeType(XSDElementDeclaration element)
+  {
+  	if (removeType(element.getTypeDefinition()))
+  	{
+      resetTypeToString(element.getElement());
+  	  return true;
+  	}
+  	return false;
+  }
+  
+  protected boolean isFromDeletedSchema(XSDConcreteComponent component)
+  {
+    if (component == null)
+    {
+      return false;
+    }
+    XSDConcreteComponent root = component.getRootContainer();
+
+    boolean isFromDeletedSchema = false;
+    if (deletedSchema.getContents() != null)
+    {
+      Iterator contents = deletedSchema.getContents().iterator();
+      while (contents.hasNext())
+      {
+        XSDSchemaContent content = (XSDSchemaContent)contents.next();
+        if (content instanceof XSDSchemaDirective)
+        {
+          XSDSchema aSchema = ((XSDSchemaDirective)content).getResolvedSchema();
+          if (root != null && root.equals(aSchema))
+          {
+            isFromDeletedSchema = true;
+          }
+        }
+      }
+    }
+    if (root != null && root.equals(deletedSchema))
+    {
+      isFromDeletedSchema = true;
+    }
+    return isFromDeletedSchema;
+  }
+      
+  /**
+   * Remove the type from the element if it belongs to the external file
+   */
+  protected boolean removeType(XSDTypeDefinition typeDef)
+  {
+    if (typeDef == null)
+    {
+      return false;
+    }
+    return isFromDeletedSchema(typeDef);
+  }
+
+  /**
+   * @see org.eclipse.wst.xsd.utility.XSDVisitor#visitComplexTypeDefinition(XSDComplexTypeDefinition)
+   */
+  public void visitComplexTypeDefinition(XSDComplexTypeDefinition type)
+  {
+    super.visitComplexTypeDefinition(type);
+    if (type.getAttributeContents() != null)
+    {
+      for (Iterator iter = type.getAttributeContents().iterator(); iter.hasNext(); )
+      {
+        XSDAttributeGroupContent attrGroupContent = (XSDAttributeGroupContent) iter.next();
+        if (attrGroupContent instanceof XSDAttributeUse)
+        {
+          XSDAttributeUse attrUse = (XSDAttributeUse) attrGroupContent;
+          XSDAttributeDeclaration attrDecl = attrUse.getContent();
+          
+          // now is this a reference?
+          if (attrDecl.isAttributeDeclarationReference())
+          {
+            if (isFromDeletedSchema(attrDecl.getResolvedAttributeDeclaration()))
+            {
+              String name = getNamedComponentName(type);
+              // String msg = XSDPlugin.getSchemaString("_INFO_REMOVE_ATTRIBUTE_REFERENCE") +
+							String msg = "_INFO_REMOVE_ATTRIBUTE_REFERENCE" +
+                       " <" + name + ">";
+              addMessage(msg, attrDecl.getContainer());
+              
+              childrenToRemove.add(attrDecl.getElement());
+            }
+          }
+          // otherwise check the type of the attribute and see if it is from the deleted schema
+          else
+          {
+            if (removeType(attrDecl.getTypeDefinition()))
+            {
+              // reset the type of the attribute decl to string
+              // String msg = XSDPlugin.getSchemaString("_INFO_RESET_ATTRIBUTE") +
+							String msg = "_INFO_RESET_ATTRIBUTE" +
+                          " <" + attrDecl.getName() + "> " +
+                          // XSDPlugin.getSchemaString("_UI_TO_TYPE_STRING");
+							            "_UI_TO_TYPE_STRING";
+              addMessage(msg, attrDecl);
+              resetTypeToString(attrDecl.getElement());
+
+            }
+          }
+        }
+        else if (attrGroupContent instanceof XSDAttributeGroupDefinition)
+        {
+          XSDAttributeGroupDefinition attrGroupDef = (XSDAttributeGroupDefinition) attrGroupContent;
+          
+          if (isFromDeletedSchema(attrGroupDef.getResolvedAttributeGroupDefinition()))
+          {
+          	// remove the attribute group reference
+            String name = getNamedComponentName(type);
+            // String msg = XSDPlugin.getSchemaString("_INFO_REMOVE_ATTRIBUTE_GROUP_REFERENCE") + " <" + name + ">";
+						String msg = "_INFO_REMOVE_ATTRIBUTE_GROUP_REFERENCE" + " <" + name + ">";
+
+            addMessage(msg, attrGroupDef.getContainer());
+            
+            childrenToRemove.add(attrGroupDef.getElement());
+          }
+        }
+      }
+    }
+
+    // For the complex type with simple content case, see the visitComplexTypeDefinition method
+    XSDTypeDefinition base = type.getBaseTypeDefinition();
+    if (base instanceof XSDSimpleTypeDefinition)
+    {
+      XSDSimpleTypeDefinition baseType = (XSDSimpleTypeDefinition)base;
+      if (isFromDeletedSchema(baseType))
+      {
+        // String msg = XSDPlugin.getSchemaString("_INFO_RESET_COMPLEX_TYPE") +
+				String msg = "_INFO_RESET_COMPLEX_TYPE" +
+                " <" + getNamedComponentName(type) + "> " +
+                // XSDPlugin.getSchemaString("_UI_DERIVATION");
+				        "_UI_DERIVATION";
+        addMessage(msg, type);
+      
+        type.setBaseTypeDefinition(schema.getSchemaForSchema().resolveSimpleTypeDefinition("string"));
+      }
+    }
+  }
+
+  /**
+   * @see org.eclipse.wst.xsd.utility.XSDVisitor#visitModelGroupDefinition(XSDModelGroupDefinition)
+   */
+  public void visitModelGroupDefinition(XSDModelGroupDefinition modelGroup)
+  {
+    super.visitModelGroupDefinition(modelGroup);
+    if (modelGroup.isModelGroupDefinitionReference())
+    {
+      if (isFromDeletedSchema(modelGroup.getResolvedModelGroupDefinition()))
+      {
+        String name = getNamedComponentName(modelGroup);
+        // String msg = XSDPlugin.getSchemaString("_INFO_REMOVE_GROUP_REFERENCE") + " <" + name + ">";
+				String msg = "_INFO_REMOVE_GROUP_REFERENCE" + " <" + name + ">";
+        addMessage(msg, modelGroup.getContainer());
+        childrenToRemove.add(modelGroup.getElement());
+      }
+    }      
+  }
+
+  /**
+   * @see org.eclipse.wst.xsd.utility.XSDVisitor#visitSimpleTypeDefinition(XSDSimpleTypeDefinition)
+   */
+  public void visitSimpleTypeDefinition(XSDSimpleTypeDefinition type)
+  {
+    super.visitSimpleTypeDefinition(type);
+    XSDSimpleTypeDefinition baseType = type.getBaseTypeDefinition();
+    if (isFromDeletedSchema(baseType))
+    {
+      // String msg = XSDPlugin.getSchemaString("_INFO_RESET_SIMPLE_TYPE") +
+			String msg = "_INFO_RESET_SIMPLE_TYPE" +
+              " <" + getNamedComponentName(type) + "> " +
+              // XSDPlugin.getSchemaString("_UI_DERIVATION");
+			        "_UI_DERIVATION";
+      addMessage(msg, type);
+      
+
+    // This will set the simple Type base to string 
+    // For the complex type with simple content case, see the visitComplexTypeDefinition method
+
+      type.getFacetContents().clear();
+      type.getFacets().clear();
+      type.setBaseTypeDefinition(schema.getSchemaForSchema().resolveSimpleTypeDefinition("string"));
+    }
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/BaseRenamer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/BaseRenamer.java
new file mode 100644
index 0000000..1a789e8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/BaseRenamer.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.rename;
+
+import org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.util.XSDConstants;
+
+
+/**
+ * Base class for rename helpers of various named root components.  This is to be used when
+ * the user renames a global element, group, attribute, attribute group, complex/simple type etc
+ */
+public abstract class BaseRenamer extends XSDVisitor
+{
+
+  
+  /**
+   * Method BaseRenamer.
+   * @param globalComponent - this is the component (who's parent is the schema) that has been renamed
+   */
+  public BaseRenamer(XSDNamedComponent globalComponent, String newName)
+  {
+    this.globalComponent = globalComponent;
+    this.newName = newName;
+  }
+  
+  public String getNewQName()
+  {
+    String qName = null;
+    if (newName != null)
+    {
+      qName = XSDConstants.lookupQualifier(globalComponent.getElement(), globalComponent.getTargetNamespace());
+      if (qName != null && qName.length() > 0)
+      {
+        qName += ":" + newName;
+      }
+      else
+      {
+        qName = newName; 
+      }
+    }
+    else
+    {
+      qName = newName;
+    }
+    
+    return qName;
+  }
+  
+  protected String newName;
+  protected XSDNamedComponent globalComponent;
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalAttributeGroupRenamer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalAttributeGroupRenamer.java
new file mode 100644
index 0000000..d01ec4f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalAttributeGroupRenamer.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.rename;
+
+import java.util.Iterator;
+
+import org.eclipse.xsd.XSDAttributeGroupContent;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.util.XSDConstants;
+
+public class GlobalAttributeGroupRenamer extends BaseRenamer
+{
+  /**
+   * Constructor for GlobalAttributeGroupRenamer.
+   * @param globalComponent
+   */
+  public GlobalAttributeGroupRenamer(XSDNamedComponent globalComponent, String newName)
+  {
+    super(globalComponent, newName);
+  }
+
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor#visitComplexTypeDefinition(XSDComplexTypeDefinition)
+   */
+  public void visitComplexTypeDefinition(XSDComplexTypeDefinition type)
+  {
+    super.visitComplexTypeDefinition(type);
+    if (type.getAttributeContents() != null)
+    {
+      for (Iterator iter = type.getAttributeContents().iterator(); iter.hasNext(); )
+      {
+        XSDAttributeGroupContent attrGroupContent = (XSDAttributeGroupContent) iter.next();
+
+        if (attrGroupContent instanceof XSDAttributeGroupDefinition)
+        {
+          XSDAttributeGroupDefinition attrGroupDef = (XSDAttributeGroupDefinition) attrGroupContent;
+          
+          if (globalComponent.equals(attrGroupDef.getResolvedAttributeGroupDefinition()))
+          {
+            attrGroupDef.getElement().setAttribute(XSDConstants.REF_ATTRIBUTE, getNewQName());
+          }
+        }
+      }
+    }
+    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalAttributeRenamer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalAttributeRenamer.java
new file mode 100644
index 0000000..d1b3e68
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalAttributeRenamer.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.rename;
+
+import java.util.Iterator;
+
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupContent;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.util.XSDConstants;
+
+public class GlobalAttributeRenamer extends BaseRenamer
+{
+  /**
+   * Constructor for GlobalAttributeRenamer.
+   * @param globalComponent
+   */
+  public GlobalAttributeRenamer(XSDNamedComponent globalComponent, String newName)
+  {
+    super(globalComponent, newName);
+  }
+  
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor#visitComplexTypeDefinition(XSDComplexTypeDefinition)
+   */
+  public void visitComplexTypeDefinition(XSDComplexTypeDefinition type)
+  {
+    super.visitComplexTypeDefinition(type);
+    if (type.getAttributeContents() != null)
+    {
+      for (Iterator iter = type.getAttributeContents().iterator(); iter.hasNext(); )
+      {
+        XSDAttributeGroupContent attrGroupContent = (XSDAttributeGroupContent) iter.next();
+        if (attrGroupContent instanceof XSDAttributeUse)
+        {
+          XSDAttributeUse attrUse = (XSDAttributeUse) attrGroupContent;
+          XSDAttributeDeclaration attrDecl = attrUse.getContent();
+          
+          // now is this a reference?
+          if (attrDecl != null && attrDecl.isAttributeDeclarationReference())
+          {
+            if (globalComponent.equals(attrDecl.getResolvedAttributeDeclaration()))
+            {
+              attrDecl.getElement().setAttribute(XSDConstants.REF_ATTRIBUTE, getNewQName());           
+            }
+          }
+        }
+      }
+    }
+  }
+
+
+  
+
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalElementRenamer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalElementRenamer.java
new file mode 100644
index 0000000..869d775
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalElementRenamer.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.rename;
+
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.util.XSDConstants;
+
+public class GlobalElementRenamer extends BaseRenamer
+{
+  /**
+   * Constructor for GlobalElementRenamer.
+   * @param globalComponent
+   */
+  public GlobalElementRenamer(XSDNamedComponent globalComponent, String newName)
+  {
+    super(globalComponent, newName);
+  }
+  
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor#visitElementDeclaration(XSDElementDeclaration)
+   */
+  public void visitElementDeclaration(XSDElementDeclaration element)
+  {
+    super.visitElementDeclaration(element);
+    if (element.isElementDeclarationReference() &&
+        globalComponent.equals(element.getResolvedElementDeclaration()))
+    {
+      element.getElement().setAttribute(XSDConstants.REF_ATTRIBUTE, getNewQName());
+    }
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalGroupRenamer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalGroupRenamer.java
new file mode 100644
index 0000000..b29b8e4
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalGroupRenamer.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.rename;
+
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.util.XSDConstants;
+
+public class GlobalGroupRenamer extends BaseRenamer
+{
+
+  /**
+   * Constructor for GlobalGroupRenamer.
+   * @param globalComponent
+   */
+  public GlobalGroupRenamer(XSDNamedComponent globalComponent, String newName)
+  {
+    super(globalComponent, newName);
+  }
+
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor#visitModelGroupDefinition(XSDModelGroupDefinition)
+   */
+  public void visitModelGroupDefinition(XSDModelGroupDefinition modelGroup)
+  {
+    super.visitModelGroupDefinition(modelGroup);
+    if (modelGroup.isModelGroupDefinitionReference())
+    {
+      if (globalComponent.equals(modelGroup.getResolvedModelGroupDefinition()))
+      {
+        modelGroup.getElement().setAttribute(XSDConstants.REF_ATTRIBUTE, getNewQName());
+      }
+    }      
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalSimpleOrComplexTypeRenamer.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalSimpleOrComplexTypeRenamer.java
new file mode 100644
index 0000000..369b562
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/GlobalSimpleOrComplexTypeRenamer.java
@@ -0,0 +1,91 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.rename;
+
+import java.util.Iterator;
+
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupContent;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+public class GlobalSimpleOrComplexTypeRenamer extends BaseRenamer
+{
+  /**
+   * Constructor for GlobalSimpleOrComplexTypeRenamer.
+   * @param globalComponent
+   */
+  public GlobalSimpleOrComplexTypeRenamer(XSDNamedComponent globalComponent, String newName)
+  {
+    super(globalComponent, newName);
+  }
+  
+  
+  /**
+   * @see XSDVisitor#visitElementDeclaration(XSDElementDeclaration)
+   */
+  public void visitElementDeclaration(XSDElementDeclaration element)
+  {
+    if (!element.isElementDeclarationReference() &&
+        globalComponent.equals(element.getTypeDefinition()))
+    {
+      element.getElement().setAttribute(XSDConstants.TYPE_ATTRIBUTE, getNewQName());
+    }
+
+    super.visitElementDeclaration(element);
+  }
+
+
+  /**
+   * @see org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor#visitComplexTypeDefinition(XSDComplexTypeDefinition)
+   */
+  public void visitComplexTypeDefinition(XSDComplexTypeDefinition type)
+  {
+    super.visitComplexTypeDefinition(type);
+    if (type.getAttributeContents() != null)
+    {
+      for (Iterator iter = type.getAttributeContents().iterator(); iter.hasNext(); )
+      {
+        XSDAttributeGroupContent attrGroupContent = (XSDAttributeGroupContent) iter.next();
+        if (attrGroupContent instanceof XSDAttributeUse)
+        {
+          XSDAttributeUse attrUse = (XSDAttributeUse) attrGroupContent;
+          XSDAttributeDeclaration attrDecl = attrUse.getContent();
+          
+          // now is this a reference?
+          if (!attrDecl.isAttributeDeclarationReference() &&
+              globalComponent.equals(attrDecl.getTypeDefinition()))
+          {
+            attrDecl.getElement().setAttribute(XSDConstants.TYPE_ATTRIBUTE, getNewQName());
+          }
+        }
+      }
+    }
+
+    XSDTypeDefinition base = type.getBaseTypeDefinition();
+    if (base.equals(globalComponent))
+    {
+      XSDDOMHelper helper = new XSDDOMHelper();
+      Element derivedByNode = helper.getDerivedByElementFromComplexType(type.getElement());
+      if (derivedByNode != null)
+      {
+        derivedByNode.setAttribute(XSDConstants.BASE_ATTRIBUTE, getNewQName());
+      }
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/SchemaPrefixChangeHandler.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/SchemaPrefixChangeHandler.java
new file mode 100644
index 0000000..62b0eb9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/SchemaPrefixChangeHandler.java
@@ -0,0 +1,212 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.rename;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor;
+import org.eclipse.wst.xsd.ui.internal.util.XSDDOMHelper;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+
+
+public class SchemaPrefixChangeHandler
+{
+  String newPrefix;
+  XSDSchema xsdSchema;
+
+  public SchemaPrefixChangeHandler(XSDSchema xsdSchema, String newPrefix)
+  {
+    this.xsdSchema = xsdSchema;
+    this.newPrefix= newPrefix;
+  }
+  
+  public void resolve()
+  {
+    XSDSchemaPrefixRenamer xsdSchemaPrefixRenamer = new XSDSchemaPrefixRenamer();
+    xsdSchemaPrefixRenamer.visitSchema(xsdSchema);
+  }
+
+  public String getNewQName(XSDTypeDefinition comp, String value, String newXSDPrefix)
+  {
+    String qName = null;
+    if (value != null)
+    {
+      qName = newXSDPrefix;
+      if (qName != null && qName.length() > 0)
+      {
+        qName += ":" + value;
+      }
+      else
+      {
+        qName = value; 
+      }
+    }
+    else
+    {
+      qName = value;
+    }
+    
+    return qName;
+  }
+
+  
+  class XSDSchemaPrefixRenamer extends XSDVisitor
+  {
+    public XSDSchemaPrefixRenamer()
+    {
+      super();
+    }
+    
+    public void visitElementDeclaration(XSDElementDeclaration element)
+    {
+      super.visitElementDeclaration(element);
+      XSDTypeDefinition type = element.getType();
+      if (type != null)
+      {
+        String ns = type.getTargetNamespace();
+        if (ns == null) ns = "";
+//        if (ns.equals(xsdSchema.getSchemaForSchemaNamespace()))
+        if (ns.equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))        
+        {
+          Element domElement = element.getElement();
+          if (domElement != null && domElement instanceof XMLNode)
+          {
+            Attr typeAttr = domElement.getAttributeNode(XSDConstants.TYPE_ATTRIBUTE);
+            if (typeAttr != null)
+            {
+              element.getElement().setAttribute(XSDConstants.TYPE_ATTRIBUTE, getNewQName(type, type.getName(), newPrefix));            
+            }
+          }
+        }
+      }
+    }
+    
+    public void visitSimpleTypeDefinition(XSDSimpleTypeDefinition simpleType)
+    {
+      super.visitSimpleTypeDefinition(simpleType);
+      XSDTypeDefinition baseType = simpleType.getBaseTypeDefinition();
+      
+      if (baseType != null)
+      {
+        String ns = baseType.getTargetNamespace();
+        if (ns == null) ns = "";
+//        if (ns.equals(xsdSchema.getSchemaForSchemaNamespace()))
+//        System.out.println(xsdSchema.getSchemaForSchemaNamespace());
+        if (ns.equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))
+        {
+          XSDDOMHelper domHelper = new XSDDOMHelper();
+          Element derivedBy = domHelper.getDerivedByElement(simpleType.getElement());
+          if (derivedBy != null && derivedBy instanceof XMLNode)
+          {
+            Attr typeAttr = derivedBy.getAttributeNode(XSDConstants.BASE_ATTRIBUTE);
+            if (typeAttr != null)
+            {
+              derivedBy.setAttribute(XSDConstants.BASE_ATTRIBUTE, getNewQName(baseType, baseType.getName(), newPrefix));
+            }
+          }
+        }
+      }
+      
+      XSDSimpleTypeDefinition itemType = simpleType.getItemTypeDefinition();
+      if (itemType != null)
+      {
+        String ns = itemType.getTargetNamespace();
+        if (ns == null) ns = "";
+        if (ns.equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))
+        {
+          XSDDOMHelper domHelper = new XSDDOMHelper();
+          Node listNode = domHelper.getChildNode(simpleType.getElement(), XSDConstants.LIST_ELEMENT_TAG);
+          if (listNode != null && listNode instanceof Element)
+          {
+            Element listElement = (Element)listNode;          
+            if (listElement instanceof XMLNode)
+            {
+              Attr typeAttr = listElement.getAttributeNode(XSDConstants.ITEMTYPE_ATTRIBUTE);
+              if (typeAttr != null)
+              {
+                listElement.setAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE, getNewQName(itemType, itemType.getName(), newPrefix));
+              }
+            }
+          }
+        }
+      }
+      
+      List memberTypes = simpleType.getMemberTypeDefinitions();
+      if (memberTypes.size() > 0)
+      {
+        XSDDOMHelper domHelper = new XSDDOMHelper();
+        Node unionNode = domHelper.getChildNode(simpleType.getElement(), XSDConstants.UNION_ELEMENT_TAG);
+        if (unionNode != null && unionNode instanceof Element)
+        {
+          Element unionElement = (Element)unionNode;          
+          if (unionElement instanceof XMLNode)
+          {
+            Attr typeAttr = unionElement.getAttributeNode(XSDConstants.MEMBERTYPES_ATTRIBUTE);
+            StringBuffer sb = new StringBuffer("");
+            for (Iterator i = memberTypes.iterator(); i.hasNext(); )
+            {
+              XSDSimpleTypeDefinition st = (XSDSimpleTypeDefinition)i.next();
+              String ns = st.getTargetNamespace();
+              if (ns == null) ns = "";
+              if (ns.equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))
+              {
+                sb.append(getNewQName(st, st.getName(), newPrefix));                
+              }
+              else
+              {
+                sb.append(st.getQName(xsdSchema));
+              }
+              if (i.hasNext())
+              {
+                sb.append(" ");
+              }
+            }
+            unionElement.setAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE, sb.toString());
+          }
+        }
+      }
+    }
+
+    public void visitAttributeDeclaration(XSDAttributeDeclaration attr)
+    {
+      super.visitAttributeDeclaration(attr);
+      XSDTypeDefinition type = attr.getType();
+      if (type != null)
+      {
+        String ns = type.getTargetNamespace();
+        if (ns == null) ns = "";
+//        if (ns.equals(xsdSchema.getSchemaForSchemaNamespace()))
+        if (ns.equals(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001))
+        {
+          Element domElement = attr.getElement();
+          if (domElement != null && domElement instanceof XMLNode)
+          {
+            Attr typeAttr = domElement.getAttributeNode(XSDConstants.TYPE_ATTRIBUTE);
+            if (typeAttr != null)
+            {
+              attr.getElement().setAttribute(XSDConstants.TYPE_ATTRIBUTE, getNewQName(type, type.getName(), newPrefix));            
+            }
+          }
+        }
+      }
+    }
+  }    
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/TargetNamespaceChangeHandler.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/TargetNamespaceChangeHandler.java
new file mode 100644
index 0000000..ef996b1
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/refactor/rename/TargetNamespaceChangeHandler.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.refactor.rename;
+
+import java.util.Iterator;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.wst.xsd.ui.internal.refactor.XSDVisitor;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupContent;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDAttributeUse;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDSchema;
+
+
+public class TargetNamespaceChangeHandler
+{
+  String newNS;
+  String oldNS;
+  XSDSchema xsdSchema;
+
+  public TargetNamespaceChangeHandler(XSDSchema xsdSchema, String oldNS, String newNS)
+  {
+    this.xsdSchema = xsdSchema;
+    this.oldNS= oldNS;
+    this.newNS= newNS;
+  }
+  
+  public void resolve()
+  {
+    ElementReferenceRenamer elementReferenceRenamer = new ElementReferenceRenamer();
+    elementReferenceRenamer.visitSchema(xsdSchema);
+    AttributeReferenceRenamer attributeReferenceRenamer = new AttributeReferenceRenamer();
+    attributeReferenceRenamer.visitSchema(xsdSchema);
+  }
+
+  class ElementReferenceRenamer extends XSDVisitor
+  {
+    public ElementReferenceRenamer()
+    {
+      super();
+    }
+    
+    public void visitElementDeclaration(XSDElementDeclaration element)
+    {
+      super.visitElementDeclaration(element);
+      if (element.isElementDeclarationReference())
+      {
+      	if (element.getResolvedElementDeclaration().getTargetNamespace() != null)
+      	{
+      	  if (element.getResolvedElementDeclaration().getTargetNamespace().equals(oldNS))
+          {
+            // set the resolved element's declaration to new ns
+            // this is defect 237518 - target namespace rename creates a new namespace
+            element.getResolvedElementDeclaration().setTargetNamespace(newNS);
+          }
+        }
+        else
+        {
+        	if (oldNS == null || (oldNS != null && oldNS.equals("")))
+        	{
+						element.getResolvedElementDeclaration().setTargetNamespace(newNS);
+        	}
+        }
+      }
+    }
+  }
+  
+  // Similar to defect 237518 but for attributes
+  class AttributeReferenceRenamer extends XSDVisitor
+  {
+    public AttributeReferenceRenamer()
+    {
+      super();
+    }
+    
+    public void visitComplexTypeDefinition(XSDComplexTypeDefinition type)
+    {
+      super.visitComplexTypeDefinition(type);
+      if (type.getAttributeContents() != null)
+      {
+        for (Iterator iter = type.getAttributeContents().iterator(); iter.hasNext(); )
+        {
+          XSDAttributeGroupContent attrGroupContent = (XSDAttributeGroupContent) iter.next();
+          if (attrGroupContent instanceof XSDAttributeUse)
+          {
+            XSDAttributeUse attrUse = (XSDAttributeUse) attrGroupContent;
+            XSDAttributeDeclaration attrDecl = attrUse.getContent();
+            
+            if (attrDecl != null && attrDecl.isAttributeDeclarationReference())
+            {
+							if (attrDecl.getResolvedAttributeDeclaration().getTargetNamespace() != null)
+							{
+                if (attrDecl.getResolvedAttributeDeclaration().getTargetNamespace().equals(oldNS))
+                {
+                  attrDecl.getResolvedAttributeDeclaration().setTargetNamespace(newNS);
+                }
+              }
+              else
+              {
+								if (oldNS == null || (oldNS != null && oldNS.equals("")))
+								{
+									attrDecl.getResolvedAttributeDeclaration().setTargetNamespace(newNS);
+								}
+              }
+            }
+          }
+        }
+      }
+    }
+  
+    public void visitAttributeGroupDefinition(XSDAttributeGroupDefinition attributeGroup)
+    {
+      super.visitAttributeGroupDefinition(attributeGroup);
+      EList list = attributeGroup.getAttributeUses();
+      if (list != null)
+      {
+        for (Iterator iter = list.iterator(); iter.hasNext(); )
+        {
+          XSDAttributeUse attrUse = (XSDAttributeUse)iter.next();
+          XSDAttributeDeclaration attrDecl = attrUse.getContent();
+
+          if (attrDecl != null && attrDecl.isAttributeDeclarationReference())
+          {
+						if (attrDecl.getResolvedAttributeDeclaration().getTargetNamespace() != null)
+						{
+              if (attrDecl.getResolvedAttributeDeclaration().getTargetNamespace().equals(oldNS))
+              {
+                attrDecl.getResolvedAttributeDeclaration().setTargetNamespace(newNS);
+              }
+            }
+            else
+            {
+							if (oldNS == null || (oldNS != null && oldNS.equals("")))
+							{
+								attrDecl.getResolvedAttributeDeclaration().setTargetNamespace(newNS);
+							}
+            }
+          }
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/OpenOnSelectionHelper.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/OpenOnSelectionHelper.java
new file mode 100644
index 0000000..82de07f
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/OpenOnSelectionHelper.java
@@ -0,0 +1,322 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.util;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.wst.sse.core.IndexedRegion;
+import org.eclipse.wst.xml.uriresolver.util.URIHelper;
+import org.eclipse.wst.xsd.ui.internal.XSDEditor;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.XSDTextEditor;
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDConcreteComponent;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDIdentityConstraintDefinition;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDNamedComponent;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaDirective;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+
+
+public class OpenOnSelectionHelper
+{
+  
+  protected XSDTextEditor textEditor;
+  
+  /**
+   * Constructor for OpenOnSelectionHelper.
+   */
+  public OpenOnSelectionHelper(XSDTextEditor textEditor)
+  {
+    this.textEditor = textEditor;
+  }
+
+  boolean lastResult;
+  
+  public static void openXSDEditor(String schemaLocation)
+  {
+		IPath schemaPath = new Path(schemaLocation);
+		
+		final IFile schemaFile = ResourcesPlugin.getWorkspace().getRoot().getFile(schemaPath);
+	
+		Display.getDefault().syncExec(new Runnable()
+		{
+			/**
+			 * @see java.lang.Runnable#run()
+			 */
+			public void run()
+			{
+				final IWorkbenchWindow workbenchWindow = XSDEditorPlugin.getPlugin().getWorkbench().getActiveWorkbenchWindow();
+				if (workbenchWindow != null)
+				{
+					try
+					{
+					  IEditorPart editorPart = workbenchWindow.getActivePage().openEditor(new FileEditorInput(schemaFile), XSDEditorPlugin.XSD_EDITOR_ID);
+					}
+					catch (PartInitException initEx)
+					{
+					  initEx.printStackTrace();
+//						XSDEditorPlugin.getPlugin().getMsgLogger().write(initEx);
+					}
+					catch(Exception e)
+					{
+					  e.printStackTrace();
+					}
+				}          
+			}
+		});
+  }
+  
+  protected boolean revealObject(final XSDConcreteComponent component)
+  {
+    if (component.getRootContainer().equals(textEditor.getXSDSchema()))
+    {
+      Node element = component.getElement();
+      if (element instanceof IndexedRegion)
+      {
+        IndexedRegion indexNode = (IndexedRegion) element;
+        textEditor.getTextViewer().setRangeIndication(indexNode.getStartOffset(), indexNode.getEndOffset() - indexNode.getStartOffset(), true);
+        return true;
+      }
+      return false;
+    }
+    else
+    {
+      lastResult = false;
+      if (component.getSchema() != null)
+      {
+				String schemaLocation = URIHelper.removePlatformResourceProtocol(component.getSchema().getSchemaLocation());
+        IPath schemaPath = new Path(schemaLocation);
+				final IFile schemaFile = ResourcesPlugin.getWorkspace().getRoot().getFile(schemaPath);
+        Display.getDefault().syncExec(new Runnable()
+        {
+	        /**
+	         * @see java.lang.Runnable#run()
+	         */
+	        public void run()
+	        {
+		        final IWorkbenchWindow workbenchWindow = XSDEditorPlugin.getPlugin().getWorkbench().getActiveWorkbenchWindow();
+		        if (workbenchWindow != null)
+		        {
+							try
+							{
+							  IEditorPart editorPart = workbenchWindow.getActivePage().openEditor(new FileEditorInput(schemaFile), textEditor.getXSDEditor().getEditorSite().getId());
+								if (editorPart instanceof XSDEditor)
+								{
+									((XSDEditor)editorPart).openOnGlobalReference(component);
+									lastResult = true;
+								}
+							}
+							catch (PartInitException initEx)
+							{
+//								XSDEditorPlugin.getPlugin().getMsgLogger().write(initEx);
+							}
+						}          
+					}
+				});
+      }
+      return lastResult;
+    }
+  }
+  
+  public void openOnGlobalReference(XSDConcreteComponent comp)
+  {
+    XSDSchema schema = textEditor.getXSDSchema();
+    String name = null;
+    if (comp instanceof XSDNamedComponent)
+    {
+      name = ((XSDNamedComponent) comp).getName();
+    }
+    
+    if (schema == null || name == null)
+    {
+      return;
+    }
+
+    List objects = null;    
+    if (comp instanceof XSDElementDeclaration)
+    {
+      objects = schema.getElementDeclarations();
+    }
+    else if (comp instanceof XSDTypeDefinition)
+    {
+      objects = schema.getTypeDefinitions();
+    }
+
+    if (objects != null)
+    {
+      for (Iterator iter = objects.iterator(); iter.hasNext();)
+      {
+        XSDNamedComponent namedComp = (XSDNamedComponent) iter.next();
+        
+        if (namedComp.getName().equals(name))
+        {
+          revealObject(namedComp);
+        }
+      }
+    }
+  }
+  
+  public boolean openOnSelection()
+  {
+    List selectedNodes = textEditor.getViewerSelectionManager().getSelectedNodes();
+
+    if (!selectedNodes.isEmpty())
+    {
+      for (Iterator i = selectedNodes.iterator(); i.hasNext();)
+      {
+        Object obj = i.next();
+        XSDSchema xsdSchema = textEditor.getXSDSchema();
+        if (xsdSchema != null)
+        {
+          XSDConcreteComponent xsdComp = xsdSchema.getCorrespondingComponent((Node)obj);
+          XSDConcreteComponent objectToReveal = null;
+
+          if (xsdComp instanceof XSDElementDeclaration)
+          {
+            XSDElementDeclaration elementDecl = (XSDElementDeclaration) xsdComp;
+            if (elementDecl.isElementDeclarationReference())
+            {
+              objectToReveal = elementDecl.getResolvedElementDeclaration();
+            }
+            else
+            {
+              XSDConcreteComponent typeDef = null;
+              if (elementDecl.getAnonymousTypeDefinition() == null)
+              {
+                typeDef = elementDecl.getTypeDefinition();
+              }
+              
+              XSDConcreteComponent subGroupAffiliation = elementDecl.getSubstitutionGroupAffiliation();
+              
+              if (typeDef != null && subGroupAffiliation != null)
+              {
+                // we have 2 things we can navigate to, if the cursor is anywhere on the substitution attribute
+                // then jump to that, otherwise just go to the typeDef.
+                if (obj instanceof Attr && ((Attr)obj).getLocalName().equals(XSDConstants.SUBSTITUTIONGROUP_ATTRIBUTE))
+                {
+                  objectToReveal = subGroupAffiliation;
+                }
+                else
+                {
+                  // try to reveal the type now.  On success, then we return true.
+                  // if we fail, set the substitution group as the object to reveal as a backup plan.
+                  if (revealObject(typeDef))
+                  {
+                    return true;
+                  }
+                  else
+                  {
+                    objectToReveal = subGroupAffiliation;
+                  }
+                }
+              }
+              else
+              {
+                // one or more of these is null.  If the typeDef is non-null, use it.  Otherwise
+                // try and use the substitution group
+                objectToReveal = typeDef != null ? typeDef : subGroupAffiliation;
+              }
+            }
+          }
+          else if (xsdComp instanceof XSDModelGroupDefinition)
+          {
+            XSDModelGroupDefinition elementDecl = (XSDModelGroupDefinition) xsdComp;
+            if (elementDecl.isModelGroupDefinitionReference())
+            {
+              objectToReveal = elementDecl.getResolvedModelGroupDefinition();
+            }
+          }
+          else if (xsdComp instanceof XSDAttributeDeclaration)
+          {
+            XSDAttributeDeclaration attrDecl = (XSDAttributeDeclaration) xsdComp;
+            if (attrDecl.isAttributeDeclarationReference())
+            {
+              objectToReveal = attrDecl.getResolvedAttributeDeclaration();
+            }
+            else if (attrDecl.getAnonymousTypeDefinition() == null)
+            {
+              objectToReveal = attrDecl.getTypeDefinition();
+            }              
+          }
+          else if (xsdComp instanceof XSDAttributeGroupDefinition)
+          {
+            XSDAttributeGroupDefinition attrGroupDef = (XSDAttributeGroupDefinition) xsdComp;
+            if (attrGroupDef.isAttributeGroupDefinitionReference())
+            {
+              objectToReveal = attrGroupDef.getResolvedAttributeGroupDefinition();
+            }
+          }
+          else if (xsdComp instanceof XSDIdentityConstraintDefinition)
+          {
+            XSDIdentityConstraintDefinition idConstraintDef = (XSDIdentityConstraintDefinition) xsdComp;
+            if (idConstraintDef.getReferencedKey() != null)
+            {
+              objectToReveal = idConstraintDef.getReferencedKey();
+            }
+          }
+          else if (xsdComp instanceof XSDSimpleTypeDefinition)
+          {
+            XSDSimpleTypeDefinition typeDef = (XSDSimpleTypeDefinition) xsdComp;
+            objectToReveal = typeDef.getItemTypeDefinition();
+            if (objectToReveal == null)
+            {
+              // if itemType attribute is not set, then check for memberType
+              List memberTypes = typeDef.getMemberTypeDefinitions();
+              if (memberTypes != null && memberTypes.size() > 0)
+              {
+                objectToReveal = (XSDConcreteComponent)memberTypes.get(0);
+              }              
+            }
+          }
+          else if (xsdComp instanceof XSDTypeDefinition)
+          {
+            XSDTypeDefinition typeDef = (XSDTypeDefinition) xsdComp;
+            objectToReveal = typeDef.getBaseType();
+          }
+          else if (xsdComp instanceof XSDSchemaDirective)
+          {
+          	XSDSchemaDirective directive = (XSDSchemaDirective) xsdComp;
+//						String schemaLocation = URIHelper.removePlatformResourceProtocol(directive.getResolvedSchema().getSchemaLocation());
+//						openXSDEditor(schemaLocation);
+//						return false;
+            objectToReveal = directive.getResolvedSchema();						          	          	
+          }
+
+          // now reveal the object if this isn't null
+          if (objectToReveal != null)
+          {
+            return revealObject(objectToReveal);
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/SelectionAdapter.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/SelectionAdapter.java
new file mode 100644
index 0000000..2cd1353
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/SelectionAdapter.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.util;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+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;
+
+public abstract class SelectionAdapter implements ISelectionProvider
+{
+  protected List listenerList = new ArrayList();
+  protected ISelection selection = new StructuredSelection();
+  protected ISelectionProvider eventSource;
+
+  public void setEventSource(ISelectionProvider eventSource)
+  {
+    this.eventSource = eventSource;
+  }
+
+  public void addSelectionChangedListener(ISelectionChangedListener listener) 
+  {
+    listenerList.add(listener);
+  }
+
+  public void removeSelectionChangedListener(ISelectionChangedListener listener) 
+  {
+    listenerList.remove(listener);
+  }                    
+
+  public ISelection getSelection() 
+  {
+    return selection;
+  }    
+  
+  /**
+   * This method should be specialized to return the correct object that corresponds to the 'other' model
+   */
+  abstract protected Object getObjectForOtherModel(Object object);
+
+    
+  public void setSelection(ISelection modelSelection)  
+  { 
+    List otherModelObjectList = new ArrayList();
+    if (modelSelection instanceof IStructuredSelection)
+    {
+      for (Iterator i = ((IStructuredSelection)modelSelection).iterator(); i.hasNext(); )
+      {
+        Object modelObject = i.next(); 
+        Object otherModelObject = getObjectForOtherModel(modelObject);       
+        if (otherModelObject != null)
+        { 
+          otherModelObjectList.add(otherModelObject);
+        }
+      }
+    }                
+      
+    StructuredSelection nodeSelection = new StructuredSelection(otherModelObjectList);
+    selection = nodeSelection;
+    SelectionChangedEvent event = new SelectionChangedEvent(eventSource != null ? eventSource : this, nodeSelection);
+
+    for (Iterator i = listenerList.iterator(); i.hasNext(); )
+    {
+      ISelectionChangedListener listener = (ISelectionChangedListener)i.next();
+      listener.selectionChanged(event);
+    }
+  }
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/TypesHelper.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/TypesHelper.java
new file mode 100644
index 0000000..fe313c8
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/TypesHelper.java
@@ -0,0 +1,762 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.util;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
+
+import org.eclipse.xsd.XSDAttributeDeclaration;
+import org.eclipse.xsd.XSDAttributeGroupDefinition;
+import org.eclipse.xsd.XSDComplexTypeDefinition;
+import org.eclipse.xsd.XSDElementDeclaration;
+import org.eclipse.xsd.XSDImport;
+import org.eclipse.xsd.XSDModelGroupDefinition;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.XSDSchemaContent;
+import org.eclipse.xsd.XSDSimpleTypeDefinition;
+import org.eclipse.xsd.XSDTypeDefinition;
+import org.eclipse.xsd.impl.XSDImportImpl;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+public class TypesHelper
+{
+  XSDSchema xsdSchema;
+  Vector list = new Vector();
+
+  public TypesHelper(XSDSchema xsdSchema)
+  {
+    this.xsdSchema = xsdSchema;
+  }
+
+  public void updateExternalImportGlobals()
+  {
+    if (xsdSchema != null)
+    {
+      Iterator contents = xsdSchema.getContents().iterator();
+      while (contents.hasNext())
+      {
+        XSDSchemaContent content = (XSDSchemaContent) contents.next();
+        if (content instanceof XSDImportImpl)
+        {
+          XSDImportImpl anImport = (XSDImportImpl) content;
+          try
+          {
+            if (anImport.getSchemaLocation() != null)
+            {
+              anImport.importSchema();
+            }
+          }
+          catch (Exception e)
+          {
+            
+          }
+        }
+      }
+    }
+  }
+
+  private Vector addExternalImportedUserSimpleTypes(Vector items)
+  {
+    if (xsdSchema != null)
+    {
+      Iterator contents = xsdSchema.getContents().iterator();
+      while (contents.hasNext())
+      {
+        XSDSchemaContent content = (XSDSchemaContent) contents.next();
+        if (content instanceof XSDImportImpl)
+        {
+          XSDImportImpl anImport = (XSDImportImpl) content;
+
+          XSDSchema impSchema = anImport.getResolvedSchema();
+
+          try
+          {
+            if (impSchema == null)
+            {
+              impSchema = anImport.importSchema();
+            }
+          }
+          catch (Exception e)
+          {
+            
+          }
+
+          if (impSchema != null)
+          {
+            Iterator i = impSchema.getTypeDefinitions().iterator();
+            while (i.hasNext())
+            {
+              XSDTypeDefinition typeDefinition = (XSDTypeDefinition) i.next();
+              if (typeDefinition instanceof XSDSimpleTypeDefinition)
+              {
+                if (typeDefinition.getName() != null)
+                {
+                  items.addAll(getPrefixedNames(typeDefinition.getTargetNamespace(), typeDefinition.getName()));
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    return items;
+  }
+
+  private Vector addExternalImportedGlobalElements(Vector items)
+  {
+    if (xsdSchema != null)
+    {
+      Iterator contents = xsdSchema.getContents().iterator();
+      while (contents.hasNext())
+      {
+        XSDSchemaContent content = (XSDSchemaContent) contents.next();
+        if (content instanceof XSDImportImpl)
+        {
+          XSDImportImpl anImport = (XSDImportImpl) content;
+
+          XSDSchema impSchema = anImport.getResolvedSchema();
+
+          try
+          {
+            if (impSchema == null)
+            {
+              impSchema = anImport.importSchema();
+            }
+          }
+          catch (Exception e)
+          {
+            
+          }
+
+          if (impSchema != null)
+          {
+            Iterator i = impSchema.getElementDeclarations().iterator();
+            while (i.hasNext())
+            {
+              XSDElementDeclaration anElement = (XSDElementDeclaration) i.next();
+              if (anElement.getName() != null)
+              {
+                items.addAll(getPrefixedNames(anElement.getTargetNamespace(), anElement.getName()));
+              }
+            }
+          }
+        }
+      }
+    }
+    return items;
+  }
+
+  private Vector addExternalImportedAttributes(Vector items)
+  {
+    if (xsdSchema != null)
+    {
+      Iterator contents = xsdSchema.getContents().iterator();
+      while (contents.hasNext())
+      {
+        XSDSchemaContent content = (XSDSchemaContent) contents.next();
+        if (content instanceof XSDImportImpl)
+        {
+          XSDImportImpl anImport = (XSDImportImpl) content;
+
+          XSDSchema impSchema = anImport.getResolvedSchema();
+
+          try
+          {
+            if (impSchema == null)
+            {
+              impSchema = anImport.importSchema();
+            }
+          }
+          catch (Exception e)
+          {
+            
+          }
+
+          if (impSchema != null)
+          {
+            Iterator i = impSchema.getAttributeDeclarations().iterator();
+            while (i.hasNext())
+            {
+              XSDAttributeDeclaration attrib = (XSDAttributeDeclaration) i.next();
+              if (attrib.getName() != null)
+              {
+                items.addAll(getPrefixedNames(attrib.getTargetNamespace(), attrib.getName()));
+              }
+            }
+          }
+        }
+      }
+    }
+    return items;
+  }
+
+  private Vector addExternalImportedAttributeGroups(Vector items)
+  {
+    if (xsdSchema != null)
+    {
+      Iterator contents = xsdSchema.getContents().iterator();
+      while (contents.hasNext())
+      {
+        XSDSchemaContent content = (XSDSchemaContent) contents.next();
+        if (content instanceof XSDImportImpl)
+        {
+          XSDImportImpl anImport = (XSDImportImpl) content;
+
+          XSDSchema impSchema = anImport.getResolvedSchema();
+
+          try
+          {
+            if (impSchema == null)
+            {
+              impSchema = anImport.importSchema();
+            }
+          }
+          catch (Exception e)
+          {
+            
+          }
+
+          if (impSchema != null)
+          {
+            Iterator i = impSchema.getAttributeGroupDefinitions().iterator();
+            while (i.hasNext())
+            {
+              XSDAttributeGroupDefinition attrib = (XSDAttributeGroupDefinition) i.next();
+              if (attrib.getName() != null)
+              {
+                items.addAll(getPrefixedNames(attrib.getTargetNamespace(), attrib.getName()));
+              }
+            }
+          }
+        }
+      }
+    }
+    return items;
+  }
+
+  private Vector addExternalImportedUserComplexTypes(Vector items)
+  {
+    if (xsdSchema != null)
+    {
+      Iterator contents = xsdSchema.getContents().iterator();
+      while (contents.hasNext())
+      {
+        XSDSchemaContent content = (XSDSchemaContent) contents.next();
+        if (content instanceof XSDImportImpl)
+        {
+          XSDImportImpl anImport = (XSDImportImpl) content;
+
+          XSDSchema impSchema = anImport.getResolvedSchema();
+
+          try
+          {
+            if (impSchema == null)
+            {
+              impSchema = anImport.importSchema();
+            }
+          }
+          catch (Exception e)
+          {
+            
+          }
+
+          if (impSchema != null)
+          {
+            Iterator i = impSchema.getTypeDefinitions().iterator();
+            while (i.hasNext())
+            {
+              XSDTypeDefinition typeDefinition = (XSDTypeDefinition) i.next();
+              if (typeDefinition instanceof XSDComplexTypeDefinition)
+              {
+                if (typeDefinition.getName() != null)
+                {
+                  items.addAll(getPrefixedNames(typeDefinition.getTargetNamespace(), typeDefinition.getName()));
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    return items;
+  }
+
+  private Vector addExternalImportedGroups(Vector items)
+  {
+    if (xsdSchema != null)
+    {
+      Iterator contents = xsdSchema.getContents().iterator();
+      while (contents.hasNext())
+      {
+        XSDSchemaContent content = (XSDSchemaContent) contents.next();
+        if (content instanceof XSDImportImpl)
+        {
+          XSDImportImpl anImport = (XSDImportImpl) content;
+
+          XSDSchema impSchema = anImport.getResolvedSchema();
+
+          try
+          {
+            if (impSchema == null)
+            {
+              impSchema = anImport.importSchema();
+            }
+          }
+          catch (Exception e)
+          {
+          }
+
+          if (impSchema != null)
+          {
+            Iterator i = impSchema.getModelGroupDefinitions().iterator();
+            while (i.hasNext())
+            {
+              XSDModelGroupDefinition aGroup = (XSDModelGroupDefinition) i.next();
+              if (aGroup.getName() != null)
+              {
+                items.addAll(getPrefixedNames(aGroup.getTargetNamespace(), aGroup.getName()));
+              }
+            }
+          }
+        }
+      }
+    }
+    return items;
+  }
+
+  public java.util.List getBuiltInTypeNamesList()
+  {
+    Vector items = new Vector();
+    if (xsdSchema != null)
+    {
+      String xsdForXSDPrefix = xsdSchema.getSchemaForSchemaQNamePrefix();
+      if (xsdForXSDPrefix != null && xsdForXSDPrefix.length() > 0)
+      {
+        xsdForXSDPrefix = xsdForXSDPrefix + ":";
+      }
+      else
+      {
+        xsdForXSDPrefix = "";
+      }
+
+      for (int i = 0; i < XSDDOMHelper.dataType.length; i++)
+      {
+        items.add(xsdForXSDPrefix + XSDDOMHelper.dataType[i][0]);
+      }
+    }
+    return items;
+  }
+  
+  public java.util.List getBuiltInTypeNamesList2()
+  {
+    List result = new ArrayList();
+    if (xsdSchema != null)
+    {
+      List prefixes = getPrefixesForNamespace(xsdSchema.getSchemaForSchemaNamespace());
+      for (int i = 0; i < XSDDOMHelper.dataType.length; i++)
+      {
+        for (Iterator j = prefixes.iterator(); j.hasNext();)
+        {
+          String prefix = (String) j.next();
+          String localName = XSDDOMHelper.dataType[i][0]; 
+          String prefixedName = (prefix != null && prefix.length() > 0) ? prefix + ":" + localName : localName; 
+          result.add(prefixedName);
+        }
+      }
+    }
+    return result;
+  }
+
+  public java.util.List getUserSimpleTypeNamesList()
+  {
+    Vector items = new Vector();
+    if (xsdSchema != null)
+    {
+      updateExternalImportGlobals();
+      Iterator i = xsdSchema.getTypeDefinitions().iterator();
+      while (i.hasNext())
+      {
+        XSDTypeDefinition typeDefinition = (XSDTypeDefinition) i.next();
+        if (typeDefinition instanceof XSDSimpleTypeDefinition)
+        {
+          items.addAll(getPrefixedNames(typeDefinition.getTargetNamespace(), typeDefinition.getName()));
+          //System.out.println(typeDefinition.getQName(xsdSchema));
+          //items.add(typeDefinition.getQName(xsdSchema));
+        }
+      }
+      items.add(getPrefix(xsdSchema.getSchemaForSchemaNamespace(), true) + "anyType");
+      
+      //      items = addExternalImportedUserSimpleTypes(items);
+      items = (Vector) sortList(items);
+    }
+    return items;
+  }
+
+  public java.util.List getUserComplexTypeNamesList()
+  {
+    Vector items = new Vector();
+    if (xsdSchema != null)
+    {
+      updateExternalImportGlobals();
+      Iterator i = xsdSchema.getTypeDefinitions().iterator();
+      while (i.hasNext())
+      {
+        XSDTypeDefinition typeDefinition = (XSDTypeDefinition) i.next();
+        if (typeDefinition instanceof XSDComplexTypeDefinition)
+        {
+			    items.addAll(getPrefixedNames(typeDefinition.getTargetNamespace(), typeDefinition.getName()));         
+        }
+      }
+      // remove anyType since it's not user-defined
+      // items.add(getPrefix(xsdSchema.getSchemaForSchemaNamespace(), true) + "anyType");
+      //      items = addExternalImportedUserComplexTypes(items);
+      items = (Vector) sortList(items);
+    }
+    return items;
+  }
+
+  public String getPrefix(String ns, boolean withColon)
+  {
+    String key = "";
+
+    if (xsdSchema != null)
+    {
+      Map map = xsdSchema.getQNamePrefixToNamespaceMap();
+      Iterator iter = map.keySet().iterator();
+      while (iter.hasNext())
+      {
+        Object keyObj = iter.next();
+        Object value = map.get(keyObj);
+        if (value != null && value.toString().equals(ns))
+        {
+          if (keyObj != null)
+          {
+            key = keyObj.toString();
+          }
+          else
+          {
+            key = "";
+          }
+          break;
+        }
+      }
+      if (!key.equals(""))
+      {
+        if (withColon)
+        {
+          key = key + ":";
+        }
+      }
+    }
+    return key;
+  }
+
+  public java.util.List getGlobalElements()
+  {
+    Vector items = new Vector();
+    if (xsdSchema != null)
+    {
+      updateExternalImportGlobals();
+      if (xsdSchema.getElementDeclarations() != null)
+      {
+        Iterator i = xsdSchema.getElementDeclarations().iterator();
+        while (i.hasNext())
+        {
+          XSDElementDeclaration elementDeclaration = (XSDElementDeclaration) i.next();
+          String name = elementDeclaration.getQName(xsdSchema);
+          if (name != null)
+          {
+            items.add(name);
+          }
+        }
+      }
+      //      items = addExternalImportedGlobalElements(items);
+      items = (Vector) sortList(items);
+    }
+    return items;
+  }
+
+  public String getGlobalElement(XSDSchema relativeComponent)
+  {
+    if (xsdSchema != null)
+    {
+      updateExternalImportGlobals();
+      if (xsdSchema.getElementDeclarations() != null)
+      {
+        Iterator i = xsdSchema.getElementDeclarations().iterator();
+        while (i.hasNext()) // just get the first one
+        {
+          XSDElementDeclaration elementDeclaration = (XSDElementDeclaration) i.next();
+          if (elementDeclaration.getQName(relativeComponent) != null)
+          {
+            return elementDeclaration.getQName(relativeComponent);
+          }
+        }
+      }
+
+      Vector items = new Vector();
+      items = addExternalImportedGlobalElements(items);
+      if (items != null && items.size() > 0)
+      {
+        return items.get(0).toString();
+      }
+    }
+    return null; // for disabling menu
+  }
+
+  public java.util.List getGlobalAttributes()
+  {
+    Vector items = new Vector();
+    if (xsdSchema != null)
+    {
+      updateExternalImportGlobals();
+      if (xsdSchema.getAttributeDeclarations() != null)
+      {
+        Iterator i = xsdSchema.getAttributeDeclarations().iterator();
+        while (i.hasNext())
+        {
+          XSDAttributeDeclaration attributeDeclaration = (XSDAttributeDeclaration) i.next();
+          if (attributeDeclaration.getTargetNamespace() == null || (attributeDeclaration.getTargetNamespace() != null && !attributeDeclaration.getTargetNamespace().equals(XSDConstants.SCHEMA_INSTANCE_URI_2001)))
+          {
+            String name = attributeDeclaration.getQName(xsdSchema);
+            if (name != null)
+            {
+              items.add(name);
+            }
+          }
+        }
+      }
+      //      items = addExternalImportedAttributes(items);
+      items = (Vector) sortList(items);
+    }
+    return items;
+  }
+
+  public String getGlobalAttribute(XSDSchema relativeComponent)
+  {
+    if (xsdSchema != null)
+    {
+      updateExternalImportGlobals();
+      if (xsdSchema.getAttributeDeclarations() != null)
+      {
+        Iterator i = xsdSchema.getAttributeDeclarations().iterator();
+        while (i.hasNext()) // just get the first one
+        {
+          XSDAttributeDeclaration attributeDeclaration = (XSDAttributeDeclaration) i.next();
+          if (attributeDeclaration.getQName(relativeComponent) != null)
+          {
+            return attributeDeclaration.getQName(relativeComponent);
+          }
+        }
+      }
+
+      Vector items = new Vector();
+      items = addExternalImportedAttributes(items);
+      if (items != null && items.size() > 0)
+      {
+        return items.get(0).toString();
+      }
+    }
+    return null; // for disabling menu
+  }
+
+  public java.util.List getGlobalAttributeGroups()
+  {
+    Vector items = new Vector();
+    if (xsdSchema != null)
+    {
+      updateExternalImportGlobals();
+      if (xsdSchema.getAttributeGroupDefinitions() != null)
+      {
+        Iterator i = xsdSchema.getAttributeGroupDefinitions().iterator();
+        while (i.hasNext())
+        {
+          XSDAttributeGroupDefinition attributeGroupDefinition = (XSDAttributeGroupDefinition) i.next();
+          String name = attributeGroupDefinition.getQName(xsdSchema);
+          if (name != null)
+          {
+            items.add(name);
+          }
+        }
+      }
+      //      items = addExternalImportedAttributeGroups(items);
+      items = (Vector) sortList(items);
+    }
+    return items;
+  }
+
+  public String getGlobalAttributeGroup(XSDSchema relativeComponent)
+  {
+    if (xsdSchema != null)
+    {
+      updateExternalImportGlobals();
+      if (xsdSchema.getAttributeGroupDefinitions() != null)
+      {
+        Iterator i = xsdSchema.getAttributeGroupDefinitions().iterator();
+        while (i.hasNext()) // just get the first one
+        {
+          XSDAttributeGroupDefinition attributeGroupDefinition = (XSDAttributeGroupDefinition) i.next();
+          if (attributeGroupDefinition.getQName(relativeComponent) != null)
+          {
+            return attributeGroupDefinition.getQName(relativeComponent);
+          }
+        }
+      }
+
+      Vector items = new Vector();
+      items = addExternalImportedAttributeGroups(items);
+      if (items != null && items.size() > 0)
+      {
+        return items.get(0).toString();
+      }
+    }
+    return null; // for disabling menu
+  }
+
+  public java.util.List getModelGroups()
+  {
+    Vector items = new Vector();
+    if (xsdSchema != null)
+    {
+      updateExternalImportGlobals();
+      if (xsdSchema.getModelGroupDefinitions() != null)
+      {
+        Iterator i = xsdSchema.getModelGroupDefinitions().iterator();
+        while (i.hasNext())
+        {
+          XSDModelGroupDefinition modelGroupDefinition = (XSDModelGroupDefinition) i.next();
+          String name = modelGroupDefinition.getQName(xsdSchema);
+          if (name != null)
+          {
+            items.add(name);
+          }
+        }
+      }
+      //      items = addExternalImportedGroups(items);
+      items = (Vector) sortList(items);
+    }
+    return items;
+  }
+
+  public static java.util.List sortList(java.util.List types)
+  {
+    try
+    {
+      java.util.Collections.sort(types); // performance?  n*log(n)
+    }
+    catch (Exception e)
+    {
+//      XSDEditorPlugin.getPlugin().getMsgLogger().write("Sort failed");
+    }
+    return types;
+  }
+
+  public String getModelGroup(XSDSchema relativeComponent)
+  {
+    if (xsdSchema != null)
+    {
+      updateExternalImportGlobals();
+      if (xsdSchema.getModelGroupDefinitions() != null)
+      {
+        Iterator i = xsdSchema.getModelGroupDefinitions().iterator();
+        while (i.hasNext()) // just get the first one
+        {
+          XSDModelGroupDefinition modelGroupDefinition = (XSDModelGroupDefinition) i.next();
+          if (modelGroupDefinition.getQName(relativeComponent) != null)
+          {
+            return modelGroupDefinition.getQName(relativeComponent);
+          }
+        }
+      }
+
+      Vector items = new Vector();
+      items = addExternalImportedGroups(items);
+      if (items != null && items.size() > 0)
+      {
+        return items.get(0).toString();
+      }
+    }
+    return null; // for disabling menu
+  }
+
+  public void updateMapAfterDelete(XSDImport deletedNode)
+  {
+    String ns = deletedNode.getNamespace();
+    if (ns != null)
+    {
+      String prefix = getPrefix(ns, false);
+      if (prefix != null)
+      {
+        prefix = prefix.trim();
+      }
+      String xmlnsAttr = (prefix == "") ? "xmlns" : "xmlns:" + prefix;
+
+      if (prefix == "")
+      {
+        prefix = null;
+      }
+
+      if (xsdSchema != null)
+      {
+        Map map = xsdSchema.getQNamePrefixToNamespaceMap();
+        map.remove(prefix);
+        Element schemaElement = xsdSchema.getElement();
+        schemaElement.removeAttribute(xmlnsAttr);
+      }
+    }
+  }
+
+  public List getPrefixedNames(String namespace, String localName)
+  {
+    List list = new ArrayList();
+    if (namespace == null)
+    {
+      namespace = "";    			
+    }
+    if (xsdSchema != null && localName != null)
+    {
+      List prefixes = getPrefixesForNamespace(namespace);
+      for (Iterator i = prefixes.iterator(); i.hasNext(); )
+      {
+      	String prefix = (String)i.next();
+      	if (prefix == null) prefix = "";
+        String prefixedName = prefix.length() > 0 ? prefix + ":" + localName : localName;
+        list.add(prefixedName);               
+      }
+      if (prefixes.size() == 0)
+      {
+        list.add(localName);
+      }
+    }
+    return list;
+  }
+  
+  protected List getPrefixesForNamespace(String namespace)
+  {
+    List list = new ArrayList();
+    Map map = xsdSchema.getQNamePrefixToNamespaceMap();
+    boolean atLeastOnePrefixFound = false;
+    for (Iterator iter = map.keySet().iterator(); iter.hasNext();)
+    {
+      String prefix = (String) iter.next();
+      Object value = map.get(prefix);
+      if (value != null && value.toString().equals(namespace))
+      {
+       list.add(prefix);
+      }
+    }
+    return list;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/ViewUtility.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/ViewUtility.java
new file mode 100644
index 0000000..3e71a8a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/ViewUtility.java
@@ -0,0 +1,429 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.util;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.Text;
+
+public class ViewUtility
+{
+  private static Font font;
+
+  public static Font getFont()
+  {
+    if (font == null)
+    {              
+      font = new Font(Display.getCurrent(), "ms sans serif", 8, SWT.NORMAL);  
+    }
+    return font;
+  }
+
+  public static void setFont(Font newFont)
+  {
+    font = newFont;
+  }
+
+  public static void setComposite(Composite comp)
+  {
+    // deprecated.  Remove later
+  }
+  public static Composite createComposite(Composite parent, int numColumns)
+  {
+    Composite composite = new Composite(parent, SWT.NONE);
+
+    composite.setFont(getFont());
+
+    GridLayout layout = new GridLayout();
+    layout.numColumns = numColumns;
+    composite.setLayout(layout);
+
+    GridData data = new GridData();
+    data.verticalAlignment = GridData.FILL;
+    data.horizontalAlignment = GridData.FILL;
+    composite.setLayoutData(data);
+    return composite;
+  }
+
+  public static Composite createComposite(Composite parent, int numColumns, boolean horizontalFill)
+  {
+    if (!horizontalFill)
+    {
+      createComposite(parent, numColumns);
+    }
+
+    Composite composite = new Composite(parent, SWT.NONE);
+
+    composite.setFont(getFont());
+
+    GridLayout layout = new GridLayout();
+    layout.numColumns = numColumns;
+    composite.setLayout(layout);
+
+    GridData data = new GridData();
+    data.verticalAlignment = GridData.FILL;
+    data.horizontalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    composite.setLayoutData(data);
+
+    return composite;
+  }
+
+  public static Composite createComposite(Composite parent, int numColumns, boolean horizontalFill, boolean verticalFill)
+  {
+    if (!horizontalFill && !verticalFill)
+    {
+      createComposite(parent, numColumns);
+    }
+
+    Composite composite = new Composite(parent, SWT.NONE);
+
+    composite.setFont(getFont());
+
+    GridLayout layout = new GridLayout();
+    layout.numColumns = numColumns;
+    composite.setLayout(layout);
+
+    GridData data = new GridData();
+    data.verticalAlignment = GridData.FILL;
+    data.horizontalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    data.grabExcessVerticalSpace = true;
+    composite.setLayoutData(data);
+
+    return composite;
+  }
+
+  public static Label createHorizontalFiller(Composite parent, int horizontalSpan) 
+  {
+    Label label = new Label(parent, SWT.LEFT);
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.horizontalSpan = horizontalSpan;
+    label.setLayoutData(data);
+    return label;
+  }
+
+  /**
+   * Helper method for creating labels.
+   */
+  public static Label createLabel(Composite parent, String text) 
+  {
+    Label label = new Label(parent, SWT.LEFT);
+    label.setText(text);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    label.setLayoutData(data);
+    return label;
+  }
+
+	public Label createLabel(Composite parent, int style, String text)
+	{
+		Label label = new Label(parent, style);
+//		setColor(label);
+		label.setText(text);
+
+		GridData data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		label.setLayoutData(data);
+		return label;
+	}
+  
+  public static Label createLabel(Composite parent, String text, int alignment)
+  {
+    Label label = new Label(parent, SWT.LEFT);
+    label.setText(text);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.verticalAlignment = alignment;
+    label.setLayoutData(data);
+    return label;
+  }
+
+  /**
+   * Helper method for creating buttons.
+   */
+  public static Button createPushButton(Composite parent, String label) 
+  {
+    Button button = new Button(parent, SWT.PUSH);
+    button.setText(label);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    button.setLayoutData(data);
+
+    return button;
+  }
+
+  public static Table createTable(Composite parent)
+  {
+    Table table = new Table(parent, SWT.SINGLE | SWT.BORDER);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    table.setLayoutData(data);
+
+    return table;
+  }
+
+  /**
+   * Create radio button
+   */
+  public static Button createRadioButton(Composite parent, String label)
+  {
+    Button button = new Button(parent, SWT.RADIO);
+    button.setText(label);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    button.setLayoutData(data);
+
+    return button;
+  }
+
+  /**
+   * Helper method for creating check box
+   */
+  public static Button createCheckBox(Composite parent, String label) 
+  {
+    Button button = new Button(parent, SWT.CHECK);
+    button.setText(label);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    button.setLayoutData(data);
+    return button;
+  }
+
+  public static Combo createComboBox(Composite parent)
+  {
+    return createComboBox(parent, true);
+  }
+
+  public static Combo createComboBox(Composite parent, boolean isReadOnly)
+  {
+    int style = isReadOnly == true ? SWT.READ_ONLY : SWT.DROP_DOWN;
+
+    Combo combo = new Combo(parent, style);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    combo.setLayoutData(data);
+    return combo;
+  }
+
+  public static List createListBox(Composite parent, int width, boolean isMultiSelect)
+  {
+    int style = isMultiSelect ? SWT.MULTI : SWT.SINGLE;
+    List list = new List(parent, style | SWT.BORDER);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    data.widthHint = width;
+    list.setLayoutData(data);
+
+    return list;
+  }
+
+  public static List createListBox(Composite parent, int style)
+  {
+    List list = new List(parent, style);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.verticalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    data.grabExcessVerticalSpace = true;
+    list.setLayoutData(data);
+
+    return list;
+  }
+
+	public Text createTextField(Composite parent)
+	{
+		Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
+		GridData data = new GridData();
+		data.horizontalAlignment = GridData.FILL;
+		data.verticalAlignment = GridData.FILL;
+		data.grabExcessHorizontalSpace = true;
+		text.setLayoutData(data);
+//		text.addKeyListener(keyboardHandler);
+		return text;
+	}
+  
+  public static Text createTextField(Composite parent, int width)
+  {
+    Text text = new Text(parent, SWT.SINGLE | SWT.BORDER);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    data.widthHint = width;
+    text.setLayoutData(data);
+
+    return text;
+  }
+
+  /**
+   * <code>createWrappedMultiTextField</code> creates a wrapped multitext field
+   *
+   * @param parent a <code>Composite</code> value
+   * @param width an <code>int</code> value
+   * @param numLines an <code>int</code> value representing number of characters in height
+   * @param verticalFill a <code>boolean</code> value
+   * @return a <code>Text</code> value
+   */
+  public static Text createWrappedMultiTextField(Composite parent, int width, int numLines, boolean verticalFill)
+  {
+    Text text = new Text(parent, SWT.MULTI | SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    if (verticalFill)
+    {
+      data.verticalAlignment = GridData.FILL;
+      data.grabExcessVerticalSpace = true;
+    }      
+    data.widthHint = width;
+    FontData[] fontData = getFont().getFontData();
+    // hack for now where on Windows, only 1 fontdata exists
+    data.heightHint = numLines * fontData[0].getHeight();
+    text.setLayoutData(data);
+
+    return text;
+  }
+
+  public static Text createMultiTextField(Composite parent, int width, int height, boolean verticalFill)
+  {
+    Text text = new Text(parent, SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    if (verticalFill)
+    {
+      data.verticalAlignment = GridData.FILL;
+      data.grabExcessVerticalSpace = true;
+    }      
+    data.widthHint = width;
+    data.heightHint = height;
+    text.setLayoutData(data);
+
+    return text;
+  }
+
+  public static Group createGroup(Composite parent, int numColumns, String text, boolean verticalFill) 
+  {
+    Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+    group.setText(text);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    if (verticalFill)
+    {
+      data.verticalAlignment = GridData.FILL;
+      data.grabExcessVerticalSpace = true;
+    }      
+    group.setLayoutData(data);
+
+    GridLayout layout = new GridLayout();
+    layout.numColumns = numColumns;
+    group.setLayout(layout);
+    return group;
+  }
+
+ public static Group createGroup(Composite parent, int numColumns, String text, boolean verticalFill, int alignment) 
+  {
+    Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
+    group.setText(text);
+
+    GridData data = new GridData();
+    data.horizontalAlignment = GridData.FILL;
+    data.grabExcessHorizontalSpace = true;
+    data.verticalAlignment = alignment;
+    if (verticalFill)
+    {
+      data.verticalAlignment = GridData.FILL;
+      data.grabExcessVerticalSpace = true;
+    }      
+    group.setLayoutData(data);
+
+    GridLayout layout = new GridLayout();
+    layout.numColumns = numColumns;
+    group.setLayout(layout);
+    return group;
+  }
+
+  public static Label createVerticalFiller(Composite parent, int verticalSpan) 
+  {
+    Label label = new Label(parent, SWT.LEFT);
+    label.setFont(getFont());
+
+    GridData data = new GridData();
+    data.verticalAlignment = GridData.FILL;
+    data.verticalSpan = verticalSpan;
+    label.setLayoutData(data);
+
+    return label;
+  }
+
+  /**
+   * Creates a grid data object that occupies vertical and horizontal
+   * space.
+   */
+  static public GridData createFill()
+  {
+    GridData gd= new GridData();
+    gd.horizontalAlignment= GridData.FILL;
+    gd.grabExcessHorizontalSpace= true;
+    gd.verticalAlignment= GridData.FILL;
+    gd.grabExcessVerticalSpace= true;
+    return gd;
+  }
+  /**
+   * Creates a grid data object that occupies horizontal space.
+   */
+  static public GridData createHorizontalFill()
+  {
+    GridData gd= new GridData();
+    gd.horizontalAlignment= GridData.FILL;
+    gd.grabExcessHorizontalSpace= true;
+    return gd;
+  }
+  /**
+   * Creates a grid data object that occupies vertical space.
+   */
+  static public GridData createVerticalFill()
+  {
+    GridData gd= new GridData();
+    gd.verticalAlignment= GridData.FILL;
+    gd.grabExcessVerticalSpace= true;
+    return gd;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/XSDDOMHelper.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/XSDDOMHelper.java
new file mode 100644
index 0000000..4c84c36
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/XSDDOMHelper.java
@@ -0,0 +1,1103 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.util;
+
+import org.eclipse.wst.sse.core.format.IStructuredFormatProcessor;
+import org.eclipse.wst.xml.core.document.XMLModel;
+import org.eclipse.wst.xml.core.document.XMLNode;
+import org.eclipse.wst.xml.core.format.FormatProcessorXML;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+public class XSDDOMHelper
+{
+  public static final int LENGTH_FACET        =  1;
+  public static final int MIN_LENGTH_FACET    =  2;
+  public static final int MAX_LENGTH_FACET    =  3;
+  public static final int PATTERN_FACET       =  4;
+  public static final int ENUM_FACET          =  5;
+  public static final int WHITE_SPACE_FACET   =  6;
+
+  public static final int MAX_INCLUSIVE_FACET =  7;
+  public static final int MAX_EXCLUSIVE_FACET =  8;
+  public static final int MIN_INCLUSIVE_FACET =  9;
+  public static final int MIN_EXCLUSIVE_FACET =  10;
+
+  public static final int TOTAL_DIGITS_FACET     = 11;
+  public static final int FRACTION_DIGITS_FACET  = 12;
+
+  public static final int N_FACETS            = 13;
+
+  public static String[][] dataType =
+  {
+    //
+    // Table format:
+    // Type
+    //  Length, MinLength, MaxLength, Pattern, Enumeration,whiteSpace
+    //  MaxInclusive, MaxExclusive, MinInclusive, MinExclusive, TotalDigits, FractionDigits
+    //
+
+    // 0
+    { "anySimpleType",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 1
+    { "anyType",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+
+    // 2
+    { "anyURI",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 3
+    { "base64Binary",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 4
+    { "boolean",
+        "N", "N", "N", "Y", "N", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 5
+    { "byte",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 6
+    { "date",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "N", "N",
+    },
+
+    // 7
+    { "dateTime",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "N", "N",
+    },
+
+    // 8
+    { "decimal",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+
+    // 9
+    { "double",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "N", "N",
+    },
+
+    // 10
+    { "duration",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "N", "N",
+    },
+
+    // 11
+    { "ENTITY",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 12
+    { "ENTITIES",
+        "Y", "Y", "Y", "N", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 13
+    { "float",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "N", "N",
+    },
+
+    // 14
+    { "gDay",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "N", "N",
+    },
+
+    // 15
+    { "gMonth",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "N", "N",
+    },
+
+    // 16
+    { "gMonthDay",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "N", "N",
+    },
+
+    // 17
+    { "gYear",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "N", "N",
+    },
+
+    // 18
+    { "gYearMonth",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "N", "N",
+    },
+
+    // 19
+    { "hexBinary",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 20
+    { "ID",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 21
+    { "IDREF",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 22
+    { "IDREFS",
+        "Y", "Y", "Y", "N", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 23
+    { "int",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 24
+    { "integer",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 25
+    { "language",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 26
+    { "long",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 27
+    { "Name",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+
+    // 28
+    { "NCName",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 29
+    { "negativeInteger",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 30
+    { "NMTOKEN",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 31
+    { "NMTOKENS",
+        "Y", "Y", "Y", "N", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 32
+    { "nonNegativeInteger",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 33
+    { "nonPositiveInteger",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 34
+    { "normalizedString",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+
+    },
+
+    // 35
+    { "NOTATION",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+
+    },
+
+    // 36
+    { "positiveInteger",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 37
+    { "QName",
+        "N", "N", "N", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 38
+    { "short",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 39
+    { "string",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 40
+    { "time",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "N", "N",
+    },
+
+    // 41
+    { "token",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+        "N", "N", "N", "N", "N", "N",
+    },
+
+    // 42
+    { "unsignedByte",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 43
+    { "unsignedInt",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 44
+    { "unsignedLong",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+    // 45
+    { "unsignedShort",
+        "N", "N", "N", "Y", "Y", "Y",
+        "Y", "Y", "Y", "Y", "Y", "Y",
+    },
+
+  };
+
+  public static String XMLSchemaURI = "http://www.w3.org/2001/XMLSchema";
+
+  /**
+   * Constructor for XSDDOMHelper.
+   */
+  public XSDDOMHelper()
+  {
+    super();
+  }
+
+  public Node getChildNode(Element parent, String childName)
+  {
+/*    NodeList nodeList = parent.getElementsByTagNameNS(XMLSchemaURI, childName);
+    if (nodeList.getLength() > 0)
+      return nodeList.item(0);
+    return null;
+*/
+    NodeList list = null;
+    if (parent != null)
+    {
+      list = parent.getChildNodes();
+    }
+   
+    String name = null;
+    if (list != null)
+    {
+      // Performance issue perhaps?
+      for (int i = 0; i < list.getLength(); i++)
+      {
+        if (list.item(i) instanceof Element)
+        {
+          if (list.item(i).getLocalName().equals(childName))
+          {
+            return list.item(i);
+          }
+        }
+      }
+    }
+    return null;
+  }
+
+  public static String SIMPLE_TYPE = "Simple";
+  public static String USER_SIMPLE_TYPE = "simpleType";
+  public static String USER_COMPLEX_TYPE = "complexType";
+/*
+  public void setElementType(Element element, String type)
+  {
+    Document doc = element.getOwnerDocument();
+    if (type.equals(SIMPLE_TYPE))
+    {
+      removeChild(element, USER_SIMPLE_TYPE);
+      removeChild(element, USER_COMPLEX_TYPE);
+      element.setAttribute("type","xsd:string");
+      return;
+    }
+    else if (type.equals(USER_SIMPLE_TYPE))
+    {
+      removeChild(element, USER_COMPLEX_TYPE);
+    }
+    else
+    {
+      removeChild(element, USER_SIMPLE_TYPE);
+    }
+    element.removeAttribute("type");
+    element.appendChild(doc.createElement("xsd:"+type));
+  }
+
+  public String getElementType(Element element)
+  {
+    String tagName = element.getLocalName();
+
+    if (tagName.equals(XSDConstants.ELEMENT_ELEMENT_TAG) ||
+        tagName.equals(XSDConstants.ATTRIBUTE_ELEMENT_TAG))
+    {
+      if (element.hasAttribute("type"))
+      {
+        return SIMPLE_TYPE;
+      }
+      NodeList nodes = element.getElementsByTagNameNS(XMLSchemaURI, USER_SIMPLE_TYPE);
+      if (nodes.getLength() > 0)
+      {
+        return USER_SIMPLE_TYPE;
+      }
+      nodes = element.getElementsByTagNameNS(XMLSchemaURI, USER_COMPLEX_TYPE);
+      if (nodes.getLength() > 0)
+      {
+        return USER_COMPLEX_TYPE;
+      }
+    }
+    return "";
+  }
+*/
+  public void removeDerivedByElement(Element element)
+  {
+    removeChild(element, XSDConstants.RESTRICTION_ELEMENT_TAG);
+    removeChild(element, XSDConstants.EXTENSION_ELEMENT_TAG);
+  }
+
+  public String getBaseType(Element element) // for SimpleContent and ComplexContent
+  {
+    Node restrictionChild = getChildNode(element, "restriction");
+    Node extensionChild = getChildNode(element, "extension");
+    String baseType = "";
+    if (restrictionChild != null)
+    {
+      if (restrictionChild instanceof Element)
+      {
+        baseType = ((Element)restrictionChild).getAttribute("base");
+//        String prefix = element.getPrefix();
+//        if (prefix != null && prefix.length() > 0)
+//        {
+//          baseType = baseType.substring(baseType.indexOf(prefix) + prefix.length() + 1);
+//        }
+      }
+    }
+    else if (extensionChild != null) // should be one or the other
+    {
+      if (extensionChild instanceof Element)
+      {
+        baseType = ((Element)extensionChild).getAttribute("base");
+//        String prefix = element.getPrefix();
+//        if (prefix != null && prefix.length() > 0)
+//        {
+//          baseType = baseType.substring(baseType.indexOf(prefix) + prefix.length() + 1);
+//        }
+      }
+    }
+    return baseType;
+  }
+
+  public void setDerivedByBaseType(Element element, String derivedByType, String type)
+  {
+    Document doc = element.getOwnerDocument();
+
+    Element derivedByElement = getDerivedByElement(element);
+    if (derivedByElement != null)
+    {
+      derivedByElement.setAttribute("base", type);
+    }
+    else  // there really should be one already...base is required.
+    {
+      Element newElement = doc.createElement(derivedByType);
+      newElement.setAttribute("base", type);
+      element.appendChild(newElement);
+    }
+  }
+
+  public void changeDerivedByType(Element element, String derivedByType, String type)
+  {
+    Document doc = element.getOwnerDocument();
+
+    String prefix = element.getPrefix();
+    prefix = prefix == null ? "" : prefix + ":";
+
+    Element derivedByElement = getDerivedByElement(element);
+    
+    if (derivedByElement.getLocalName().equals(derivedByType))
+    {
+    	return; // it's already the derived by type
+    }
+    Element newNode;
+  	if (derivedByType.equals("restriction"))
+  	{
+    	newNode = doc.createElementNS(XSDDOMHelper.XMLSchemaURI, prefix + XSDConstants.RESTRICTION_ELEMENT_TAG);
+    }
+    else
+    {
+    	newNode = doc.createElementNS(XSDDOMHelper.XMLSchemaURI, prefix + XSDConstants.EXTENSION_ELEMENT_TAG);
+    }
+
+    if (derivedByElement != null)
+    {
+      if (derivedByElement.hasChildNodes())
+      {        
+        NodeList nodes = derivedByElement.getChildNodes();
+        // use clones so we don't have a refresh problem
+        for (int i = 0; i < nodes.getLength(); i++)
+        {
+          Node node = nodes.item(i);       
+          newNode.appendChild(node.cloneNode(true));
+        }
+      }
+      newNode.setAttribute("base", type);
+      element.replaceChild(newNode, derivedByElement);
+
+    }
+  }
+
+  public void setSimpleContentType(Element element, String type)
+  {
+    String contentTypeName = element.getLocalName();
+
+    if (contentTypeName.equals(XSDConstants.UNION_ELEMENT_TAG))
+    {
+      element.setAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE, type);
+    }
+    else if (contentTypeName.equals(XSDConstants.LIST_ELEMENT_TAG))
+    {
+      element.setAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE, type);
+    }
+    else if (contentTypeName.equals(XSDConstants.RESTRICTION_ELEMENT_TAG))
+    {
+      element.setAttribute(XSDConstants.BASE_ATTRIBUTE, type);
+    }
+  }
+
+  public void removeSimpleTypeContent(Element element)
+  {
+    String contentTypeName = element.getLocalName();
+    if (contentTypeName.equals(XSDConstants.UNION_ELEMENT_TAG))
+    {
+      element.removeAttribute(XSDConstants.MEMBERTYPES_ATTRIBUTE);
+    }
+    else if (contentTypeName.equals(XSDConstants.LIST_ELEMENT_TAG))
+    {
+      element.removeAttribute(XSDConstants.ITEMTYPE_ATTRIBUTE);
+    }
+    else if (contentTypeName.equals(XSDConstants.RESTRICTION_ELEMENT_TAG))
+    {
+      element.removeAttribute(XSDConstants.BASE_ATTRIBUTE);
+    }
+  }
+
+  public String getDerivedByName(Element element)
+  {
+    Node restrictionChild = getChildNode(element, "restriction");
+    Node extensionChild = getChildNode(element, "extension");
+    if (restrictionChild != null)
+    {
+      return "restriction";
+    }
+    if (extensionChild != null)
+    {
+      return "extension";
+    }
+    return "";
+  }
+
+  /**
+   * Get the derived by node given the complexContent or simpleContent node
+   */
+  public Element getDerivedByElement(Element element)
+  {
+    Node restrictionChild = getChildNode(element, "restriction");
+    Node extensionChild = getChildNode(element, "extension");
+    if (restrictionChild != null)
+    {
+      if (restrictionChild instanceof Element)
+      {
+        return (Element)restrictionChild;
+      }
+    }
+    
+    if (extensionChild != null)
+    {
+      if (extensionChild instanceof Element)
+      {
+        return (Element)extensionChild;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Get the derived by node given the ComplexType node
+   * Returns the first one, if say, the INVALID schema has more than one
+   */
+  public Element getDerivedByElementFromComplexType(Element element)
+  {
+    NodeList nl = element.getChildNodes();
+    int childNumber = 0;
+    int j = 0;
+    for (j = 0; j < nl.getLength(); j++)
+    {
+      Node aNode = nl.item(j);
+      if (inputEquals(aNode, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+      {
+        break; 
+      }
+      else if (inputEquals(aNode, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+      {
+        break;
+      }
+    }
+    Element derivedByNode = getDerivedByElement((Element)nl.item(j));
+    return derivedByNode;
+  }
+
+  /**
+   * Get the content model given the ComplexType node
+   * Returns the first one, if say, the INVALID schema has more than one
+   */
+  public Element getContentModelFromParent(Element element)
+  {
+    NodeList nl = element.getChildNodes();
+    int childNumber = 0;
+    int j = 0;
+    boolean modelExists = false;
+    int length = nl.getLength();
+    for (j = 0; j < length; j++)
+    {
+      Node aNode = nl.item(j);
+      if (inputEquals(aNode, XSDConstants.COMPLEXCONTENT_ELEMENT_TAG, false))
+      {
+        modelExists = true;
+        break; 
+      }
+      else if (inputEquals(aNode, XSDConstants.SIMPLECONTENT_ELEMENT_TAG, false))
+      {
+        modelExists = true;
+        break;
+      }
+      else if (inputEquals(aNode, XSDConstants.SEQUENCE_ELEMENT_TAG, false))
+      {
+        modelExists = true;
+        break;
+      }
+      else if (inputEquals(aNode, XSDConstants.CHOICE_ELEMENT_TAG, false))
+      {
+        modelExists = true;
+        break;
+      }
+      else if (inputEquals(aNode, XSDConstants.ALL_ELEMENT_TAG, false))
+      {
+        modelExists = true;
+        break;
+      }
+    }
+    if (!modelExists)
+    {
+      return null;
+    }
+
+    Element derivedByNode = (Element)nl.item(j);
+    return derivedByNode;
+  }
+
+  /**
+   * 
+   */
+  public void changeContentModel(Element complexTypeElement, String contentModel, Element sequenceChoiceOrAllElement)
+  {
+    Document doc = complexTypeElement.getOwnerDocument();
+
+    String prefix = complexTypeElement.getPrefix();
+    prefix = prefix == null ? "" : prefix + ":";
+    
+    Element contentModelElement = getContentModelFromParent(complexTypeElement);
+
+    if (contentModelElement.getLocalName().equals(contentModel))
+    {
+      return; // it's already the content model 
+    }
+    Element newNode;
+    newNode = doc.createElementNS(XSDDOMHelper.XMLSchemaURI, prefix + contentModel);
+
+    if (contentModelElement.hasChildNodes())
+    {        
+      NodeList nodes = contentModelElement.getChildNodes();
+      // use clones so we don't have a refresh problem
+      for (int i = 0; i < nodes.getLength(); i++)
+      {
+        Node node = nodes.item(i);
+        if (node instanceof Element)
+        {
+          if (node.getLocalName().equals(XSDConstants.ANNOTATION_ELEMENT_TAG))
+          {
+            if (!(XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.SEQUENCE_ELEMENT_TAG, false) ||
+                XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.CHOICE_ELEMENT_TAG, false) ||
+                XSDDOMHelper.inputEquals(contentModelElement, XSDConstants.ALL_ELEMENT_TAG, false)))
+            {
+              newNode.appendChild(node.cloneNode(true));
+            }
+          }
+          else if (node.getLocalName().equals(XSDConstants.RESTRICTION_ELEMENT_TAG) ||
+                    node.getLocalName().equals(XSDConstants.EXTENSION_ELEMENT_TAG))
+          {
+            newNode.appendChild(node.cloneNode(true));
+            if (sequenceChoiceOrAllElement != null)
+            {
+              node.appendChild(sequenceChoiceOrAllElement);
+            }
+          }
+          else
+          {
+            removeNodeAndWhitespace(node);
+          }
+        }
+        else
+        {
+          newNode.appendChild(node.cloneNode(true)); 
+        }
+      }
+    }
+    complexTypeElement.replaceChild(newNode, contentModelElement);
+  }
+
+  public Element cloneElement(Element parent, Element sourceNode)
+  {
+    Document doc = parent.getOwnerDocument();
+    String prefix = parent.getPrefix();
+    prefix = prefix == null ? "" : prefix + ":";
+    
+    Element newNode = doc.createElementNS(XSDDOMHelper.XMLSchemaURI, prefix + sourceNode.getLocalName());
+
+    if (sourceNode.hasChildNodes())
+    {        
+      NodeList nodes = sourceNode.getChildNodes();
+      // use clones so we don't have a refresh problem
+      for (int i = 0; i < nodes.getLength(); i++)
+      {
+        Node node = nodes.item(i);
+        newNode.appendChild(node.cloneNode(true));
+      }
+    }
+    return newNode;
+//    parent.replaceChild(newNode, sourceNode);
+  }
+
+  public boolean hasElementChildren(Element parentNode)
+  {
+    boolean hasChildrenElements = false;
+    if (parentNode != null && parentNode.hasChildNodes())
+    {
+      NodeList nodes = parentNode.getChildNodes();
+      for (int i = 0; i < nodes.getLength(); i++)
+      {
+        if (nodes.item(i) instanceof Element)
+        {
+          hasChildrenElements = true;
+          break;
+        }
+      }
+    }
+    return hasChildrenElements;
+  }
+
+  public void removeChild(Element node, String childName)
+  {
+    Node child = getChildNode(node,childName);
+    if (child != null)
+    {
+      node.removeChild(child);
+    }
+  }
+
+  public static boolean isFacet(Object obj)
+  {
+    if (XSDDOMHelper.inputEquals(obj, XSDConstants.LENGTH_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(obj, XSDConstants.MINLENGTH_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(obj, XSDConstants.MAXLENGTH_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(obj, XSDConstants.WHITESPACE_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(obj, XSDConstants.MAXINCLUSIVE_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(obj, XSDConstants.MAXEXCLUSIVE_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(obj, XSDConstants.MININCLUSIVE_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(obj, XSDConstants.MINEXCLUSIVE_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(obj, XSDConstants.TOTALDIGITS_ELEMENT_TAG, false) ||
+        XSDDOMHelper.inputEquals(obj, XSDConstants.FRACTIONDIGITS_ELEMENT_TAG, false))
+    {
+      return true;
+    }
+    return false;
+  }
+
+  public static void removeNodeAndWhitespace(Node node)
+  {
+    Node parentNode = node.getParentNode();
+    
+    Node nextElement = getNextElementNode(node);
+    Node previousElement = getPreviousElementNode(node);
+
+    Node nextSibling = node.getNextSibling();
+    if (nextSibling instanceof Text)
+    {
+      parentNode.removeChild(nextSibling);
+    }
+    Node previousSibling = node.getPreviousSibling();
+
+		parentNode.removeChild(node);
+
+    if (nextElement != null)
+    {
+			formatChild(nextElement);
+    }
+
+		if (previousElement != null)
+		{
+			formatChild(previousElement);
+		}
+  }
+
+	public static void formatChild(Node child)
+	{
+    if (child instanceof XMLNode)
+    {
+      XMLModel model = ((XMLNode)child).getModel();
+      try
+      {
+        // tell the model that we are about to make a big model change
+        model.aboutToChangeModel();
+        
+	      IStructuredFormatProcessor formatProcessor = new FormatProcessorXML();
+		    formatProcessor.formatNode(child);
+      }
+      finally
+      {
+        // tell the model that we are done with the big model change
+        model.changedModel(); 
+      }
+    }
+  }
+  
+  public static Node getLastElementNode(Node parent)
+  {
+    Node lastChild = parent.getLastChild();
+    
+    while (!(lastChild instanceof Element) && lastChild != null)
+    {
+      lastChild = lastChild.getPreviousSibling();
+    }
+    return lastChild;
+  }
+
+  public static Node getNextElementNode(Node node)
+  {
+    Node next = node.getNextSibling();
+    
+    while (!(next instanceof Element) && next != null)
+    {
+      next = next.getNextSibling();
+    }
+    if (next instanceof Text)
+    {
+    	return null;
+    }
+    return next;
+  }
+
+	public static Node getPreviousElementNode(Node node)
+	{
+		Node previous = node.getPreviousSibling();
+    
+		while (!(previous instanceof Element) && previous != null)
+		{
+			previous = previous.getPreviousSibling();
+		}
+    if (previous instanceof Text)
+    {
+      return null;
+    }
+    return previous;
+	}
+
+  public static void moveNode(Node referenceNode, Node nodeToMove, boolean isBefore)
+  {
+    // this assumes that the referenceNode and node to move have the same parent
+    Node parent = referenceNode.getParentNode();
+
+    // Get reference nodes next and previous text strings
+    String referenceNodeNextString = "";
+    String referenceNodePreviousString = "";
+    if (referenceNode != null)
+    {
+      Node referenceNodeNextSibling = referenceNode.getNextSibling();
+      Node referenceNodePreviousSibling = referenceNode.getPreviousSibling();
+      if (referenceNodeNextSibling instanceof Text)
+      {
+        referenceNodeNextString = ((Text)referenceNodeNextSibling).getData();
+      }
+      if (referenceNodePreviousSibling instanceof Text)
+      {
+        referenceNodePreviousString = ((Text)referenceNodePreviousSibling).getData();
+      }
+    }
+    // Get the dragged node's next and previous text strings
+    Node nodeToMoveNextSibling = nodeToMove.getNextSibling();
+    Node nodeToMovePreviousSibling = nodeToMove.getPreviousSibling();
+    Node nodeToMoveNextText = null;
+    String nodeToMoveNextString = "";
+    String nodeToMovePreviousString = "";
+    if (nodeToMoveNextSibling instanceof Text)
+    {
+      nodeToMoveNextText = (Text)nodeToMoveNextSibling;
+      nodeToMoveNextString = ((Text)nodeToMoveNextSibling).getData();
+    }
+    if (nodeToMovePreviousSibling instanceof Text)
+    {
+      nodeToMovePreviousString = ((Text)nodeToMovePreviousSibling).getData();
+    }
+
+    // Get the last element's next and previous text strings
+    Node lastElement = getLastElementNode(parent);
+    Node lastElementNextSibling = lastElement.getNextSibling();
+    Node lastElementPreviousSibling = lastElement.getPreviousSibling();
+    String lastElementNextString = "";
+    String lastElementPreviousString = "";		
+    if (lastElementNextSibling instanceof Text)
+    {
+      lastElementNextString = ((Text)lastElementNextSibling).getData();
+    }
+    if (lastElementPreviousSibling instanceof Text)
+    {
+      lastElementPreviousString = ((Text)lastElementPreviousSibling).getData();
+    }
+
+    boolean isLastElement = false; // whether the last element is dragged/moved
+    if (lastElement == nodeToMove)
+    {
+      isLastElement = true;
+    }
+		
+    // defect 221056 this test is required or else the node will
+    // be removed from the tree and the insert will fail
+    if (referenceNode != nodeToMove)
+    {
+      parent.removeChild(nodeToMove);
+      if (referenceNode != null)
+      {
+        if (!isBefore)
+        {
+          referenceNode = getNextElementNode(referenceNode);
+//        referenceNode = referenceNode.getNextSibling();
+        }
+      }
+
+      if (referenceNode != null)
+      {
+        insertBefore(nodeToMove, referenceNode);
+      }
+      else
+      {
+        parent.appendChild(nodeToMove);
+      }
+
+      Node newLastElement = getLastElementNode(parent);
+      if (referenceNode != null)
+      {
+        if (referenceNode != newLastElement) 
+        {
+          if (!isLastElement)
+          {
+            setTextData(referenceNode, nodeToMoveNextString, nodeToMovePreviousString);
+          }
+        }
+        setTextData(nodeToMove, referenceNodeNextString, referenceNodePreviousString);
+      }
+      // Remove the empty space left by the dragged node
+      if (nodeToMoveNextText != null)
+      {
+    	  parent.removeChild(nodeToMoveNextText);
+      }
+      // special case for the last element
+      if ((newLastElement == nodeToMove) || isLastElement)
+      {
+        setTextData(newLastElement, lastElementNextString, lastElementPreviousString);
+      }
+    }
+  }
+
+  public static void setTextData(Node target, String nextText, String previousText)
+  {
+    Node parent = target.getParentNode();
+    Node nextSibling = target.getNextSibling();
+    Node previousSibling = target.getPreviousSibling();
+    if (nextSibling instanceof Text)
+    {
+      ((Text)nextSibling).setData(nextText);	
+    }
+    if (nextSibling == null || nextSibling instanceof Element)
+    {
+      Text textNode = parent.getOwnerDocument().createTextNode("");
+      textNode.setData(nextText);
+      if (nextSibling != null)
+      {
+        parent.insertBefore(textNode, nextSibling);
+      }
+      else
+      {
+        parent.insertBefore(textNode, getNextElementNode(target));
+      }
+    }				
+
+    if (previousSibling instanceof Text)
+    {
+      ((Text)previousSibling).setData(previousText);
+    }
+    if (previousSibling == null || previousSibling instanceof Element)
+    {
+      Text textNode = parent.getOwnerDocument().createTextNode("");
+      textNode.setData(previousText);
+      parent.insertBefore(textNode, target);
+    }				
+  }
+
+  public static void insertBefore(Node nodeToInsert, Node referenceNode)
+  {
+    // this assumes that the referenceNode and node to move have the same parent
+    Node parent = referenceNode.getParentNode();
+
+    Node previousSibling = referenceNode.getPreviousSibling();
+    parent.insertBefore(nodeToInsert, referenceNode);
+  }
+
+  public static boolean inputEquals(Object input, String tagname, boolean isRef)
+  {
+    if (input instanceof Element)
+    {
+      Element element = (Element) input;
+      if (element.getLocalName().equals(tagname))
+      {
+        boolean refPresent = element.hasAttribute("ref");
+
+        return refPresent == isRef;
+      }
+    }
+    return false;
+  }
+
+  public static void updateElementToNotAnonymous(Element element)
+  {
+    if (element != null)
+    {
+      NodeList children = element.getChildNodes();
+      if (children != null)
+      {
+        for (int i = 0; i < children.getLength(); i++)
+        {
+          Node node = (Node)children.item(i);
+          if (node instanceof Element)
+          {
+            if (node.getLocalName().equals(XSDConstants.SIMPLETYPE_ELEMENT_TAG) ||
+                node.getLocalName().equals(XSDConstants.COMPLEXTYPE_ELEMENT_TAG))
+            {
+              XSDDOMHelper.removeNodeAndWhitespace(node);
+              i=0;
+            }
+          }
+        }
+      }
+    }
+  }
+  
+  public static boolean isAttributeRef(Element ct, String attrName, String ns)
+  {
+    NodeList list = ct.getChildNodes();
+    int length = list.getLength();
+    for (int i = 0; i < length; i++)
+    {
+      if (list.item(i) instanceof Element)
+      {
+        Element aChild = (Element)list.item(i);
+        if (aChild.getLocalName().equals(XSDConstants.ATTRIBUTE_ELEMENT_TAG))
+        {
+          if (aChild.hasAttribute(XSDConstants.REF_ATTRIBUTE))
+          {
+            String refValue = aChild.getAttribute(XSDConstants.REF_ATTRIBUTE);
+            if (refValue.equals(attrName))
+            {
+              return true;
+            }
+          }
+        }
+      }
+      
+    }
+    
+    return false;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/XSDSchemaHelper.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/XSDSchemaHelper.java
new file mode 100644
index 0000000..a57e619
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/util/XSDSchemaHelper.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.util;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.xsd.XSDConcreteComponent;
+
+// TODO: KC remove this
+
+public class XSDSchemaHelper
+{
+  /**
+   * Constructor for XSDSchemaHelper.
+   */
+  public XSDSchemaHelper()
+  {
+    super();
+  }
+  
+  public static void updateElement(XSDConcreteComponent concreteComp)
+  {
+    try
+    {
+      concreteComp.updateElement();
+    }
+    catch (Exception e)
+    {
+      for (Iterator containments = concreteComp.eClass().getEAllReferences().iterator(); containments.hasNext(); )
+      {
+        EReference eReference = (EReference)containments.next();
+        if (eReference.isContainment())
+        {
+          if (eReference.isMany())
+          {
+            for (Iterator objects = ((Collection)concreteComp.eGet(eReference)).iterator(); objects.hasNext(); )
+            {
+              XSDConcreteComponent xsdConcreteComponent = (XSDConcreteComponent)objects.next();
+              try
+              {
+                xsdConcreteComponent.updateElement();
+              }
+              catch (Exception ex) {}
+            }
+          }
+          else
+          {
+            XSDConcreteComponent xsdConcreteComponent = (XSDConcreteComponent)concreteComp.eGet(eReference);
+            if (xsdConcreteComponent != null)
+            {
+              try
+              {
+                xsdConcreteComponent.updateElement();
+              }
+              catch (Exception ex) {}
+            }
+          }
+        }
+      }
+    }
+  }    
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/EnumerationsDialog.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/EnumerationsDialog.java
new file mode 100644
index 0000000..eba2c64
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/EnumerationsDialog.java
@@ -0,0 +1,106 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.widgets;
+
+import org.eclipse.jface.dialogs.Dialog;
+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.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+
+
+/**
+ * Dialog to help define a list of enumerations
+ * for a join. This might be replaced once we know how to
+ * initiate a drag tracker
+ */
+
+public class EnumerationsDialog extends org.eclipse.jface.dialogs.Dialog
+{
+  public EnumerationsDialog(Shell shell)
+  {
+    super(shell);
+  }
+
+  protected void configureShell(Shell shell)
+  {
+    super.configureShell(shell);
+    shell.setText(XSDEditorPlugin.getXSDString("_UI_ENUMERATIONS_DIALOG_TITLE"));
+  }
+
+  protected void buttonPressed(int buttonId)
+  {
+    if (buttonId == Dialog.OK)
+    {
+      text = textField.getText();
+      delimiter = delimiterField.getText();
+      isPreserve = preserveWhitespace.getSelection();
+    }
+    super.buttonPressed(buttonId);
+  }
+
+  private String text, delimiter;
+  private boolean isPreserve;
+  public String getText() { return text; }
+  public String getDelimiter() { return delimiter; }
+  public boolean isPreserveWhitespace() { return isPreserve; }
+
+  private Text textField;
+  private Button preserveWhitespace;
+  private Combo delimiterField;
+  //
+  // Create the controls
+  //
+  public Control createDialogArea(Composite parent)
+  {
+    Control[] tabOrder = new Control[3];
+  	int tabIndex = 0;
+    Composite client = (Composite)super.createDialogArea(parent);
+    GridLayout layout = (GridLayout)client.getLayout();
+    layout.numColumns = 2;
+    client.setLayout(layout); 
+
+    textField = ViewUtility.createWrappedMultiTextField(client, 400, 20, true);
+    GridData gd = (GridData) textField.getLayoutData();
+    gd.horizontalSpan = 2;
+    tabOrder[tabIndex++] = textField;
+
+    ViewUtility.createLabel(client, XSDEditorPlugin.getXSDString("_UI_LABEL_DELIMITER_CHAR"));
+    delimiterField = ViewUtility.createComboBox(client, false);
+    gd = (GridData) delimiterField.getLayoutData();
+    gd.grabExcessHorizontalSpace = false;
+    gd.horizontalAlignment = GridData.BEGINNING;
+    gd.widthHint = 30;
+    tabOrder[tabIndex++] = delimiterField;
+
+    // add default delimiters
+    delimiterField.add(":");
+    delimiterField.add(",");
+    delimiterField.add(" ");
+    // set the current one to be ','
+    delimiterField.setText(",");
+
+    preserveWhitespace = ViewUtility.createCheckBox(client, XSDEditorPlugin.getXSDString("_UI_LABEL_PRESERVE_WHITESPACE"));
+    gd = (GridData) preserveWhitespace.getLayoutData();
+    gd.horizontalSpan = 2;
+    tabOrder[tabIndex++] = preserveWhitespace;
+    
+    client.setTabList(tabOrder);
+
+    return client;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/SetBaseTypeDialog.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/SetBaseTypeDialog.java
new file mode 100644
index 0000000..d054648
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/SetBaseTypeDialog.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.widgets;
+
+import java.util.ArrayList;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+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.Shell;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDConstants;
+import org.w3c.dom.Element;
+
+
+
+public class SetBaseTypeDialog extends Dialog implements SelectionListener
+{
+  protected Combo baseTypeCombo;
+  protected Combo derivedByCombo;
+  protected XSDSchema xsdSchema;
+  protected Element element;  // the complex type element
+  private String type = "";
+  private String derivedByString = "";
+  
+  /**
+   * Constructor for SetBaseTypeDialog.
+   * @param arg0
+   */
+  public SetBaseTypeDialog(Shell arg0, XSDSchema xsdSchema, Element element)
+  {
+    super(arg0);
+    this.xsdSchema = xsdSchema;
+    this.element = element;
+  }
+
+  protected void configureShell(Shell shell)
+  {
+    super.configureShell(shell);
+    shell.setText(XSDEditorPlugin.getXSDString("_UI_LABEL_SET_BASE_TYPE"));
+  }
+
+
+  protected void buttonPressed(int buttonId)
+  {
+    if (buttonId == Dialog.OK)
+    {
+      type = baseTypeCombo.getText();
+      derivedByString = derivedByCombo.getText();
+    }
+    super.buttonPressed(buttonId);
+  }
+  
+  public String getBaseType()
+  {
+    return type;
+  }
+
+  public String getDerivedBy()
+  {
+    return derivedByString;
+  }
+  
+  public void setCurrentBaseType(String type)
+  {
+    this.type = type;
+  }
+  
+  public void setCurrentDerivedBy(String derivedByString)
+  {
+    this.derivedByString = derivedByString;
+  }
+
+  //
+  // Create the controls
+  //
+  public Control createDialogArea(Composite parent)
+  {
+    Composite nameComposite = (Composite)super.createDialogArea(parent);
+    GridLayout layout = (GridLayout)nameComposite.getLayout();
+    layout.numColumns = 2;
+    nameComposite.setLayout(layout); 
+
+    ViewUtility utility = new ViewUtility();
+
+    ViewUtility.createLabel(nameComposite, XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE_WITH_COLON"));
+    baseTypeCombo = ViewUtility.createComboBox(nameComposite, true); // readonly
+    baseTypeCombo.addSelectionListener(this);
+    
+    ViewUtility.createLabel(nameComposite, XSDEditorPlugin.getXSDString("_UI_LABEL_DERIVED_BY")); 
+    derivedByCombo = ViewUtility.createComboBox(nameComposite, true); // readonly
+
+    derivedByCombo.add(XSDConstants.EXTENSION_ELEMENT_TAG);
+    derivedByCombo.add(XSDConstants.RESTRICTION_ELEMENT_TAG);
+    derivedByCombo.setText(derivedByString);
+    initializeBaseTypeCombo();
+
+    if (type.equals(""))
+    {
+      derivedByCombo.setText("");
+      derivedByCombo.setEnabled(false);
+    }
+        
+    return nameComposite;
+  }
+
+  private void initializeBaseTypeCombo()
+  {
+    ArrayList list = new ArrayList();
+    TypesHelper helper = new TypesHelper(xsdSchema);
+
+    String prefix = helper.getPrefix(xsdSchema.getTargetNamespace(), true);
+
+    list.add("");
+    list.addAll(helper.getBuiltInTypeNamesList());
+    list.addAll(helper.getUserSimpleTypeNamesList());
+    list.addAll(helper.getUserComplexTypeNamesList());
+
+    // remove the current CT from the list
+    list.remove(prefix + element.getAttribute("name"));
+
+    baseTypeCombo.removeAll();
+    for (int i = 0; i < list.size(); i++)
+    {
+      baseTypeCombo.add(list.get(i).toString());
+    }
+    baseTypeCombo.setText(type);
+    handleBaseTypeComboChange();
+  }
+  
+  private void handleBaseTypeComboChange()
+  {
+    String tempChoice = baseTypeCombo.getText();
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    if (helper.getBuiltInTypeNamesList().contains(tempChoice) ||
+        helper.getUserSimpleTypeNamesList().contains(tempChoice))
+    {
+      derivedByCombo.setText(XSDConstants.EXTENSION_ELEMENT_TAG);
+      derivedByCombo.setEnabled(false);
+    }
+    else if (helper.getUserComplexTypeNamesList().contains(tempChoice))
+    {
+      derivedByCombo.setEnabled(true); 
+    }
+    else
+    {
+      derivedByCombo.setText("");
+      derivedByCombo.setEnabled(false); 
+    }
+  }
+
+  public void widgetSelected(SelectionEvent e)
+  {
+    if (e.widget == baseTypeCombo)
+    {
+      handleBaseTypeComboChange();
+    }
+    
+  }
+
+  public void widgetDefaultSelected(SelectionEvent e)
+  {
+    
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/TypeSection.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/TypeSection.java
new file mode 100644
index 0000000..6a111fb
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/TypeSection.java
@@ -0,0 +1,340 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.widgets;
+
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+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.ui.help.WorkbenchHelp;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorContextIds;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.TypesHelper;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.xsd.XSDSchema;
+
+public class TypeSection
+{
+  /**
+   * Constructor for TypeSection.
+   * @param parent
+   */
+  public TypeSection(Composite parent)
+  {
+  }
+
+  protected Button  simpleType;
+  protected Button  userSimpleType;
+  protected Button  userComplexType;
+  protected Button  noneRadio;
+  protected Combo   typeList;
+  protected Combo   derivedByCombo;
+  protected boolean showUserComplexType = true;
+  protected boolean showUserSimpleType  = true;
+  protected boolean showNone            = false;
+  protected boolean showDerivedBy       = false;
+  protected String  derivedByChoices[]  = { "restriction", "extension" };
+  public final int  NONE                = 1;
+  public final int  BUILT_IN            = 2;
+  public final int  SIMPLE              = 3;
+  public final int  COMPLEX             = 4;
+
+  String            sectionTitle        = XSDEditorPlugin.getXSDString("_UI_LABEL_TYPE_INFORMATION");
+  String            currentObjectUuid   = "";
+
+  /*
+   * @see FlatPageSection#createClient(Composite, WidgetFactory)
+   */
+  public Composite createClient(Composite parent)
+  {
+    //	FlatViewUtility utility = new FlatViewUtility(XSDEditor.isFlatLook());
+    ViewUtility utility = new ViewUtility();
+
+    // Composite client = utility.createComposite(parent, 1);
+    Composite client = new Composite(parent, SWT.NONE);
+    GridLayout gl = new GridLayout(1, true);
+    gl.verticalSpacing = 0;
+    client.setLayout(gl);
+
+    if (showNone)
+    {
+      noneRadio = ViewUtility.createRadioButton(client, XSDEditorPlugin.getXSDString("_UI_RADIO_NONE"));
+      WorkbenchHelp.setHelp(noneRadio, XSDEditorContextIds.XSDE_TYPE_HELPER_NONE);
+    }
+
+    simpleType = ViewUtility.createRadioButton(client, XSDEditorPlugin.getXSDString("_UI_RADIO_BUILT_IN_SIMPLE_TYPE"));
+    WorkbenchHelp.setHelp(simpleType, XSDEditorContextIds.XSDE_TYPE_HELPER_BUILT_IN);
+
+    if (showUserSimpleType)
+    {
+      userSimpleType = ViewUtility.createRadioButton(client, XSDEditorPlugin.getXSDString("_UI_RADIO_USER_DEFINED_SIMPLE_TYPE"));
+      WorkbenchHelp.setHelp(userSimpleType, XSDEditorContextIds.XSDE_TYPE_HELPER_USER_DEFINED_SIMPLE);
+    }
+
+    if (showUserComplexType)
+    {
+      userComplexType = ViewUtility.createRadioButton(client, XSDEditorPlugin.getXSDString("_UI_RADIO_USER_DEFINED_COMPLEX_TYPE"));
+      WorkbenchHelp.setHelp(userComplexType, XSDEditorContextIds.XSDE_TYPE_HELPER_USER_DEFINED_COMPLEX);
+    }
+
+    //	  typeList = utility.createComboBox(client);
+    //	  WorkbenchHelp.setHelp(typeList, XSDEditorContextIds.XSDE_TYPE_HELPER_TYPE);
+    //    utility.createHeadingLabel(client, "Type",null);
+
+    if (showDerivedBy)
+    {
+      Composite derivedByComposite = ViewUtility.createComposite(client, 2);
+      Label derivedByLabel = ViewUtility.createLabel(derivedByComposite, XSDEditorPlugin.getXSDString("_UI_LABEL_DERIVED_BY"));
+      derivedByCombo = ViewUtility.createComboBox(derivedByComposite);
+      populateDerivedByCombo();
+      WorkbenchHelp.setHelp(derivedByCombo, XSDEditorContextIds.XSDE_SIMPLE_CONTENT_DERIVED);
+      derivedByCombo.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_DERIVED_BY"));
+    }
+    // Set the default selection
+    if (showNone)
+    {
+      //		noneRadio.setSelection(true);
+      //		typeList.setEnabled(false);
+    }
+    else
+    {
+      simpleType.setSelection(true);
+    }
+    return client;
+  }
+
+  public void setIsDerivedBy(boolean derive)
+  {
+    if (derive)
+    {
+      sectionTitle = XSDEditorPlugin.getXSDString("_UI_LABEL_BASE_TYPE");
+    }
+    else
+    {
+      sectionTitle = XSDEditorPlugin.getXSDString("_UI_LABEL_TYPE_INFORMATION");
+    }
+    //	setHeaderText(sectionTitle);
+  }
+
+  /**
+   * Set to true if called by Complex Type & Simple Type
+   */
+  public void setShowDerivedBy(boolean derive)
+  {
+    showDerivedBy = derive;
+  }
+
+  /**
+   * Gets the derivedByField
+   * @return Returns a Button
+   */
+  public Combo getDerivedByCombo()
+  {
+    return derivedByCombo;
+  }
+
+  /**
+   * Gets the noneRadio.
+   * @return Returns a Button
+   */
+  public Button getNoneRadio()
+  {
+    return noneRadio;
+  }
+
+  /**
+   * Gets the simpleType.
+   * @return Returns a Button
+   */
+  public Button getSimpleType()
+  {
+    return simpleType;
+  }
+
+  /**
+   * Gets the userComplexType.
+   * @return Returns a Button
+   */
+  public Button getUserComplexType()
+  {
+    return userComplexType;
+  }
+
+  /**
+   * Gets the userSimpleType.
+   * @return Returns a Button
+   */
+  public Button getUserSimpleType()
+  {
+    return userSimpleType;
+  }
+
+  /**
+   * Gets the typeList.
+   * @return Returns a CCombo
+   */
+  public Combo getTypeList()
+  {
+    return typeList;
+  }
+
+  /**
+   * Populate combo box with built-in simple types
+   */
+  public void populateBuiltInType(XSDSchema xsdSchema)
+  {
+    getTypeList().removeAll();
+    List items = getBuiltInTypeNamesList(xsdSchema);
+    for (int i = 0; i < items.size(); i++)
+    {
+      getTypeList().add(items.get(i).toString());
+    }
+  }
+
+  public java.util.List getBuiltInTypeNamesList(XSDSchema xsdSchema)
+  {
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    return helper.getBuiltInTypeNamesList();
+  }
+
+  /**
+   * Populate combo box with user defined complex types
+   */
+  public void populateUserComplexType(XSDSchema xsdSchema, boolean showAnonymous)
+  {
+    getTypeList().removeAll();
+    if (showAnonymous)
+    {
+      getTypeList().add(XSDEditorPlugin.getXSDString("_UI_ANONYMOUS"));
+    }
+
+    List items = getUserComplexTypeNamesList(xsdSchema);
+    for (int i = 0; i < items.size(); i++)
+    {
+      getTypeList().add(items.get(i).toString());
+    }
+  }
+
+  public java.util.List getUserComplexTypeNamesList(XSDSchema xsdSchema)
+  {
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    return helper.getUserComplexTypeNamesList();
+  }
+
+  public void populateUserSimpleType(XSDSchema xsdSchema, boolean showAnonymous)
+  {
+    getTypeList().removeAll();
+    if (showAnonymous)
+    {
+      getTypeList().add(XSDEditorPlugin.getXSDString("_UI_ANONYMOUS"));
+    }
+    List items = getUserSimpleTypeNamesList(xsdSchema);
+    for (int i = 0; i < items.size(); i++)
+    {
+      getTypeList().add(items.get(i).toString());
+    }
+  }
+
+  /**
+   * Populate combo box with user defined simple types
+   */
+  public void populateUserSimpleType(XSDSchema xsdSchema)
+  {
+    getTypeList().removeAll();
+    List items = getUserSimpleTypeNamesList(xsdSchema);
+    for (int i = 0; i < items.size(); i++)
+    {
+      getTypeList().add(items.get(i).toString());
+    }
+  }
+
+  public java.util.List getUserSimpleTypeNamesList(XSDSchema xsdSchema)
+  {
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    return helper.getUserSimpleTypeNamesList();
+  }
+
+  public String getPrefix(String ns, XSDSchema xsdSchema)
+  {
+    TypesHelper helper = new TypesHelper(xsdSchema);
+    String key = helper.getPrefix(ns, true);
+    return key;
+  }
+
+  /**
+   * Populate combo box with derived by choices
+   */
+  protected void populateDerivedByCombo()
+  {
+    for (int i = 0; i < derivedByChoices.length; i++)
+    {
+      getDerivedByCombo().add(derivedByChoices[i]);
+    }
+  }
+
+  /**
+   * Gets the showUserComplexType.
+   * @return Returns a boolean
+   */
+  public boolean getShowUserComplexType()
+  {
+    return showUserComplexType;
+  }
+
+  /**
+   * Gets the showUserSimpleType.
+   * @return Returns a boolean
+   */
+  public boolean getShowUserSimpleType()
+  {
+    return showUserSimpleType;
+  }
+
+  /**
+   * Gets the showNone.
+   * @return Returns a boolean
+   */
+  public boolean getShowNone()
+  {
+    return showNone;
+  }
+
+  /**
+   * Sets the showUserComplexType.
+   * @param showUserComplexType The showUserComplexType to set
+   */
+  public void setShowUserComplexType(boolean showUserComplexType)
+  {
+    this.showUserComplexType = showUserComplexType;
+  }
+
+  /**
+   * Sets the showUserSimpleType.
+   * @param showUserSimpleType The showUserSimpleType to set
+   */
+  public void setShowUserSimpleType(boolean showUserSimpleType)
+  {
+    this.showUserSimpleType = showUserSimpleType;
+  }
+
+  /**
+   * Sets the showNone
+   * @param showUserSimpleType The showNone to set
+   */
+  public void setShowNone(boolean showNone)
+  {
+    this.showNone = showNone;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/XSDEditSchemaInfoDialog.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/XSDEditSchemaInfoDialog.java
new file mode 100644
index 0000000..40b5faf
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/widgets/XSDEditSchemaInfoDialog.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.widgets;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.xml.ui.dialogs.EditSchemaInfoDialog;
+import org.eclipse.wst.xml.ui.nsedit.CommonEditNamespacesTargetFieldDialog;
+
+public class XSDEditSchemaInfoDialog extends EditSchemaInfoDialog {
+	String targetNamespace;
+	CommonEditNamespacesTargetFieldDialog editNamespacesControl;
+	
+	public XSDEditSchemaInfoDialog(Shell parentShell, IPath resourceLocation, String targetNamespace) {
+		super(parentShell, resourceLocation);
+		this.targetNamespace = targetNamespace;
+	}
+
+	protected Control createDialogArea(Composite parent) {
+		Composite dialogArea = (Composite) super.createDialogArea(parent);
+		editNamespacesControl = new CommonEditNamespacesTargetFieldDialog(dialogArea, resourceLocation);
+		editNamespacesControl.setNamespaceInfoList(namespaceInfoList);
+		if (targetNamespace != null)
+			editNamespacesControl.setTargetNamespace(targetNamespace);
+		editNamespacesControl.updateErrorMessage(namespaceInfoList);
+
+		return dialogArea;
+	}
+	
+	public String getTargetNamespace() {
+		return editNamespacesControl.getTargetNamespace();
+	}
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/NewXSDWizard.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/NewXSDWizard.java
new file mode 100644
index 0000000..2073036
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/NewXSDWizard.java
@@ -0,0 +1,168 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.wizards;
+
+import java.io.ByteArrayInputStream;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Preferences;
+import org.eclipse.jface.resource.ImageDescriptor;
+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.swt.widgets.Display;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.ISetSelectionTarget;
+import org.eclipse.wst.sse.core.preferences.CommonModelPreferenceNames;
+import org.eclipse.wst.xml.core.XMLModelPlugin;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+
+
+public class NewXSDWizard extends Wizard implements INewWizard
+{
+  private XSDNewFilePage newFilePage;
+  private IStructuredSelection selection;
+  private IWorkbench workbench;
+
+  public NewXSDWizard()
+  {   
+  }
+
+  public void init(IWorkbench aWorkbench, IStructuredSelection aSelection)
+  {
+    this.selection = aSelection;
+    this.workbench = aWorkbench;
+
+    this.setDefaultPageImageDescriptor(ImageDescriptor.createFromFile(XSDEditorPlugin.class, "icons/NewXSD.gif"));
+    this.setWindowTitle(XSDEditorPlugin.getXSDString("_UI_WIZARD_CREATE_XSD_MODEL_TITLE"));
+  }
+
+  public void addPages()
+  {
+    newFilePage = new XSDNewFilePage(selection);
+    addPage(newFilePage);
+  }
+
+  public boolean performFinish()
+  {
+    IFile file = newFilePage.createNewFile();
+    
+    //
+    // Get the xsd schema name from the full path name
+    //   e.g. f:/b2b/po.xsd => schema name = po
+    //
+    IPath iPath = file.getFullPath().removeFileExtension();
+    // String schemaName = iPath.lastSegment();
+    String schemaName = iPath.lastSegment();
+    String schemaPrefix = "tns";
+    String prefixForSchemaNamespace = "";
+    String schemaNamespaceAttribute = "xmlns";
+    if (XSDEditorPlugin.getPlugin().isQualifyXMLSchemaLanguage())
+    {
+      // Added this if check before disallowing blank prefixes in the preferences...
+      // Can take this out.  See also XSDEditor
+      if (XSDEditorPlugin.getPlugin().getXMLSchemaPrefix().trim().length() > 0)
+      {
+        prefixForSchemaNamespace = XSDEditorPlugin.getPlugin().getXMLSchemaPrefix() + ":";
+        schemaNamespaceAttribute += ":" + XSDEditorPlugin.getPlugin().getXMLSchemaPrefix();
+      }
+    }
+    
+    Preferences preference = XMLModelPlugin.getDefault().getPluginPreferences();
+	String charSet = preference.getString(CommonModelPreferenceNames.OUTPUT_CODESET);
+     if (charSet == null || charSet.trim().equals(""))
+    {
+    	charSet = "UTF-8";
+    }
+
+    String newContents = "<?xml version=\"1.0\" encoding=\"" + charSet + "\"?>\n";
+     
+    String defaultTargetURI = XSDEditorPlugin.getPlugin().getXMLSchemaTargetNamespace();
+    newContents += "<" + prefixForSchemaNamespace + "schema " + schemaNamespaceAttribute + "=\"http://www.w3.org/2001/XMLSchema\" targetNamespace=\"" + defaultTargetURI + schemaName + "\" xmlns:" + schemaPrefix + "=\""+ defaultTargetURI + schemaName + "\">\n</"+prefixForSchemaNamespace+"schema>";
+
+    try
+    {
+      byte[] bytes = newContents.getBytes(charSet);
+      ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
+      
+      file.setContents(inputStream,true,false,null);
+      inputStream.close();
+    }
+    catch (Exception e)
+    {
+//      XSDEditorPlugin.getPlugin().getMsgLogger().write("Error writing default content:\n" + newContents);      
+//      XSDEditorPlugin.getPlugin().getMsgLogger().write(e);
+    }
+
+    if (file != null)
+    {
+      revealSelection(new StructuredSelection(file));
+    }
+    
+    openEditor(file);
+
+    return true;
+  }
+
+  private void revealSelection(final ISelection selection)
+  {
+    if (selection != null)
+    {
+      IWorkbench workbench = XSDEditorPlugin.getPlugin().getWorkbench();
+      final IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+      final IWorkbenchPart focusPart = workbenchWindow.getActivePage().getActivePart();
+      if (focusPart instanceof ISetSelectionTarget)
+      {
+        Display.getCurrent().asyncExec
+        (new Runnable()
+            {
+          public void run()
+          {
+            ((ISetSelectionTarget)focusPart).selectReveal(selection);
+          }
+        });
+      }
+    }
+  }
+
+  public void openEditor(final IFile iFile)
+  {
+    if (iFile != null)
+    {
+      IWorkbench workbench = XSDEditorPlugin.getPlugin().getWorkbench();
+      final IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
+
+      Display.getDefault().asyncExec
+      (new Runnable()
+          {
+        public void run()
+        {
+          try
+          {
+            IEditorPart editorPart = workbenchWindow.getActivePage().openEditor(new FileEditorInput(iFile), XSDEditorPlugin.XSD_EDITOR_ID);
+          }
+          catch (PartInitException ex)
+          {
+          }
+        }
+      });
+    }
+  }
+  
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexCompositionPage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexCompositionPage.java
new file mode 100644
index 0000000..75ea9ae
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexCompositionPage.java
@@ -0,0 +1,965 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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
+ *******************************************************************************/
+// Based on version 1.12 of original xsdeditor
+package org.eclipse.wst.xsd.ui.internal.wizards;
+
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyleRange;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.layout.RowLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.help.WorkbenchHelp;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorContextIds;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.xsd.XSDPatternFacet;
+
+
+
+/*
+-other regex features (eg case sensitivity, ^ or $, |, etc etc)
+-smarter model
+-better keyboard navigation
+-update list of tokens 
+*/
+
+public class RegexCompositionPage extends WizardPage
+{
+  private static final boolean debug = false;
+
+  /* The text representation of our pattern. */
+  private StyledText value; 
+
+  /* The StyleRange used to color code the current parse error. */
+  private StyleRange currentError;
+
+  /* The regex terms we can form tokens from. */
+  private Combo terms;
+
+  /* The checkbox for activating auto-escape mode. */  
+  private Button escapeCheckbox;
+  
+  /* On/off status of auto-escape mode. */ 
+  private boolean autoEscapeStatus;
+
+  /* The Add Token button. */
+  private Button add;
+
+
+  // The following controls are used in the occurrence selection group
+
+  private Text repeatValue;
+
+  private Text rangeMinValue;
+  private Text rangeMaxValue;
+  private Label rangeToLabel;  
+
+  private Button singleRadio;
+  private Button starRadio;
+  private Button plusRadio;
+  private Button optionalRadio; 
+  private Button repeatRadio;
+  private Button rangeRadio;
+
+  
+  // The following variables used as part of the model. 
+
+  /* Our pattern. */
+  private XSDPatternFacet pattern;
+
+  /* Model used to store the current token. */
+  private RegexNode node;    
+
+  /* Validator from the xerces regex package. */
+  //private RegularExpression validator;
+  private Pattern validator;
+
+  /* The flags passed to the new RegularExpression object.  Default value includes:
+      X = XMLSchema mode    */
+  private String regexFlags = "X";
+      
+
+  /* Is the current regex token valid? */
+  private boolean isValidToken;
+
+  /* The label used to indicate the value's caret position when it looses focus. */
+  private Label caretLabel;
+
+  /* The pixel offsets needed to align the label icon with the caret location.
+     These are dependent on the icon used. */
+  private static final int CARET_LABEL_X_OFFSET = -3;
+  private static final int CARET_LABEL_Y_OFFSET = 19;
+
+  
+  /* Enumerated constants for specifying the type of an error message. */
+  private static final int TOKEN = 0;
+  private static final int SELECTION = 1;
+  private static final int PARSE = 2;
+  
+  private static final int NUM_ERROR_MESSAGE_TYPES = 3;
+  
+  /* The current error message for each type of error.  A value of null indicates no message. 
+     The array is indexed according to the above constants.
+  */
+  private String[] currentErrorMessages;
+
+
+  public RegexCompositionPage(XSDPatternFacet pattern)
+  {
+    super(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_COMPOSITION_PAGE_TITLE"));
+    this.pattern = pattern;
+
+    setTitle(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_COMPOSITION_PAGE_TITLE"));
+    setDescription(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_COMPOSITION_PAGE_DESCRIPTION"));
+  }
+
+  public void createControl(Composite parent)
+  {
+    // Set up our model and validator
+    node = new RegexNode();
+    // validator = new RegularExpression("", regexFlags);
+        
+    isValidToken = true;
+
+    currentErrorMessages = new String[NUM_ERROR_MESSAGE_TYPES];
+
+    // The main composite
+    Composite composite= new Composite(parent, SWT.NONE);
+    WorkbenchHelp.setHelp(composite, XSDEditorContextIds.XSDR_COMPOSITION_PAGE);
+    composite.setLayout(new GridLayout());
+
+
+    // The composite for the token combo box, label, and auto-escape checkbox
+    Composite tokenComposite = new Composite (composite, SWT.NONE);
+    GridLayout tokenCompositeLayout = new GridLayout();
+    tokenCompositeLayout.numColumns = 3;
+    tokenCompositeLayout.marginWidth = 0;
+    tokenComposite.setLayout(tokenCompositeLayout);
+
+
+    new Label(tokenComposite, SWT.LEFT).setText(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TOKEN_LABEL"));
+    
+    terms = new Combo(tokenComposite, SWT.DROP_DOWN);
+    WorkbenchHelp.setHelp(terms, XSDEditorContextIds.XSDR_COMPOSITION_TOKEN);
+    for (int i = 0; i < RegexNode.getNumRegexTerms(); i++)
+    {
+      terms.add(RegexNode.getRegexTermText(i));
+    }
+    terms.addListener(SWT.Modify, new ComboListener());
+    terms.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_REGEX_WIZARD_TERMS"));
+
+    escapeCheckbox = new Button(tokenComposite, SWT.CHECK);
+    escapeCheckbox.setText(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_AUTO_ESCAPE_CHECKBOX_LABEL"));
+    escapeCheckbox.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_REGEX_WIZARD_AUTO_ESCAPE_CHECKBOX")); 
+    escapeCheckbox.addSelectionListener(new CheckboxListener());
+    autoEscapeStatus = false;
+    
+    tokenComposite.pack();
+
+
+    // Set up the composites pertaining to the selection of occurrence quantifiers
+
+    Group occurrenceSelectionArea = new Group(composite, SWT.NONE);
+    occurrenceSelectionArea.setText(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_OCCURENCE_LABEL"));
+    WorkbenchHelp.setHelp(occurrenceSelectionArea, XSDEditorContextIds.XSDR_COMPOSITION_OCCURRENCE_GROUP);
+    GridLayout selectionAreaLayout = new GridLayout();
+    selectionAreaLayout.numColumns = 2;
+    occurrenceSelectionArea.setLayout(selectionAreaLayout);
+
+    // Listener used for all of the text fields
+    TextListener textListener = new TextListener();
+    
+
+    // Add the radio buttons
+    RadioSelectListener radioSelectListener = new RadioSelectListener();
+
+    singleRadio = addOccurenceRadioButton(RegexNode.SINGLE, occurrenceSelectionArea, radioSelectListener);
+    WorkbenchHelp.setHelp(singleRadio, XSDEditorContextIds.XSDR_COMPOSITION_JUST_ONCE);
+    ViewUtility.createHorizontalFiller(occurrenceSelectionArea, 1);
+
+    starRadio = addOccurenceRadioButton(RegexNode.STAR, occurrenceSelectionArea, radioSelectListener);
+    WorkbenchHelp.setHelp(starRadio, XSDEditorContextIds.XSDR_COMPOSITION_ZERO_OR_MORE);
+    ViewUtility.createHorizontalFiller(occurrenceSelectionArea, 1);
+
+    plusRadio = addOccurenceRadioButton(RegexNode.PLUS, occurrenceSelectionArea, radioSelectListener);
+    WorkbenchHelp.setHelp(plusRadio, XSDEditorContextIds.XSDR_COMPOSITION_ONE_OR_MORE);
+    ViewUtility.createHorizontalFiller(occurrenceSelectionArea, 1);
+
+    optionalRadio = addOccurenceRadioButton(RegexNode.OPTIONAL, occurrenceSelectionArea, radioSelectListener);
+    WorkbenchHelp.setHelp(optionalRadio, XSDEditorContextIds.XSDR_COMPOSITION_OPTIONAL);
+    ViewUtility.createHorizontalFiller(occurrenceSelectionArea, 1);
+
+    repeatRadio = addOccurenceRadioButton(RegexNode.REPEAT, occurrenceSelectionArea, radioSelectListener);
+    WorkbenchHelp.setHelp(repeatRadio, XSDEditorContextIds.XSDR_COMPOSITION_REPEAT);
+
+    // Add text field for specifying number of repeats
+    Composite repeatWidgets = new Composite(occurrenceSelectionArea, SWT.NONE);
+    RowLayout repeatWidgetsLayout = new RowLayout();
+    repeatWidgetsLayout.marginTop = 0;
+    repeatWidgetsLayout.marginBottom = 0;
+    repeatWidgetsLayout.marginLeft = 0;
+    repeatWidgetsLayout.marginRight = 0;
+    repeatWidgets.setLayout(repeatWidgetsLayout);        
+    
+    repeatValue = new Text(repeatWidgets, SWT.SINGLE | SWT.BORDER);
+    repeatValue.addListener(SWT.Modify, textListener);
+    WorkbenchHelp.setHelp(repeatValue, XSDEditorContextIds.XSDR_COMPOSITION_REPEAT_TEXT);
+    repeatValue.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_REGEX_WIZARD_REPEAT"));
+    setEnabledStatus(RegexNode.REPEAT, false);
+    
+    repeatWidgets.pack();
+    
+    rangeRadio = addOccurenceRadioButton(RegexNode.RANGE, occurrenceSelectionArea, radioSelectListener);
+    WorkbenchHelp.setHelp(rangeRadio, XSDEditorContextIds.XSDR_COMPOSITION_RANGE);
+
+    // Add text fields and labels for specifying the range    
+    Composite rangeWidgets = new Composite(occurrenceSelectionArea, SWT.NONE);
+    RowLayout rangeWidgetsLayout = new RowLayout();
+    rangeWidgetsLayout.marginTop = 0;
+    rangeWidgetsLayout.marginBottom = 0;
+    rangeWidgetsLayout.marginLeft = 0;
+    rangeWidgetsLayout.marginRight = 0;
+    rangeWidgets.setLayout(rangeWidgetsLayout);
+    
+    rangeMinValue = new Text(rangeWidgets, SWT.SINGLE | SWT.BORDER);
+    rangeMinValue.addListener(SWT.Modify, textListener);
+    WorkbenchHelp.setHelp(rangeMinValue, XSDEditorContextIds.XSDR_COMPOSITION_RANGE_MIN);
+    rangeMinValue.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_REGEX_WIZARD_MIN"));
+    
+    rangeToLabel = new Label(rangeWidgets, SWT.NONE);
+    rangeToLabel.setText(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TO_LABEL"));
+    
+    rangeMaxValue = new Text(rangeWidgets, SWT.SINGLE | SWT.BORDER);
+    rangeMaxValue.addListener(SWT.Modify, textListener);
+    rangeMaxValue.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_REGEX_WIZARD_MAX"));
+    WorkbenchHelp.setHelp(rangeMaxValue, XSDEditorContextIds.XSDR_COMPOSITION_RANGE_MAX);
+
+    setEnabledStatus(RegexNode.RANGE, false);
+    rangeWidgets.pack();
+    
+    singleRadio.setSelection(true);
+    
+    occurrenceSelectionArea.pack();
+
+    // The add button
+    add = new Button(composite, SWT.PUSH);
+    add.addSelectionListener(new ButtonSelectListener());
+    add.setText(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_ADD_BUTTON_LABEL"));
+    WorkbenchHelp.setHelp(add, XSDEditorContextIds.XSDR_COMPOSITION_ADD);
+    add.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_REGEX_WIZARD_ADD_BUTTON"));
+
+    
+    Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
+    separator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+    
+    // Our main text box
+
+    Label valueLabel= new Label(composite, SWT.LEFT);
+    valueLabel.setText(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_CURRENT_REGEX_LABEL"));
+    
+    value = new StyledText(composite, SWT.SINGLE | SWT.BORDER);
+    value.addListener(SWT.Modify, textListener);
+    value.addListener(SWT.Selection, textListener);
+    WorkbenchHelp.setHelp(value, XSDEditorContextIds.XSDR_COMPOSITION_CURRENT);
+    value.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_REGEX_WIZARD_CURRENT_REGEX"));
+    value.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+    value.setFocus();
+
+    // StyleRange used for highlighting parse errors
+    currentError = new StyleRange();
+    currentError.length = 1;
+    currentError.foreground = parent.getDisplay().getSystemColor(SWT.COLOR_RED);
+
+    // The caret label
+    caretLabel = new Label(composite, SWT.LEFT);
+    caretLabel.setImage(XSDEditorPlugin.getXSDImage("icons/RegexWizardArrow.gif"));
+    caretLabel.setToolTipText(XSDEditorPlugin.getXSDString("_UI_TOOLTIP_REGEX_WIZARD_CARET_LABEL"));
+    setShowCaretLabel(true);
+
+    value.addFocusListener(new TextFocusListener());
+
+    terms.select(0);
+
+
+    setControl(composite);
+  }
+
+
+  public void setVisible(boolean visible)
+  {
+    super.setVisible(visible);
+
+    value.setText(pattern.getLexicalValue());
+    value.setCaretOffset(value.getCharCount());
+  }
+
+  public void dispose()
+  {
+    super.dispose();
+  }
+
+
+  /**
+   * Sets the visible status of caretLabel to status.  If status is true, then we also update the position
+   * of caretLabel in one of two ways.  If there is no active selection in value, we set caretLabel's
+   * position to correspond with the position of the actual caret.  Alternatively, if there is an active selection
+   * in value, we set caretLabel's position to the beginning of the selection.
+   *
+   * @param The new visibility status of caretLabel.
+   */
+  private void setShowCaretLabel(boolean status)
+  {
+    if (status)
+    {
+  
+      int offset;
+      
+      if (value.getSelectionText().equals(""))
+      {
+        offset = value.getCaretOffset();
+      }
+      else
+      {
+        offset = value.getSelection().x;
+      }
+  
+      Point p = value.getLocationAtOffset(offset);
+      
+      p.x += value.getLocation().x;
+      p.y = value.getLocation().y;
+      
+      // Place the label under value, and make sure it is aligned with the caret.
+      // The offsets are dependent on the icon used.
+      p.x += CARET_LABEL_X_OFFSET;
+      p.y += CARET_LABEL_Y_OFFSET;
+  
+      if (debug)
+      {
+        System.out.println("POINT: " + p);
+      }
+      
+      caretLabel.setLocation(p);
+      caretLabel.setVisible(true);
+    }
+    else
+    {
+      caretLabel.setVisible(false);
+    }
+  }
+
+
+  /**
+   * Adds a new radio button to Composite c with SelectionListener l.  The text of the button is the String associated with
+   * quantifier.
+   *
+   * @param quantifier The desired quantifier, as enumerated in RegexNode.
+   * @param c The Composite to add the buttons to (normally occurrenceRadioButtons).
+   * @param l The SelectionListener (normally radioSelectionListener).
+   * @return The newly created button.
+   */
+  private Button addOccurenceRadioButton(int quantifier, Composite c, SelectionListener l)
+  {
+    Button result = new Button(c, SWT.RADIO);
+    result.setText(RegexNode.getQuantifierText(quantifier));
+    result.addSelectionListener(l);
+    return result;
+  }
+
+
+  /**
+   * Validates the regex in value.  If the regex is valid, clears the Wizard's error message.  If it's not valid,
+   *  sets the Wizard's error message accordingly.
+   *
+   * @return Whether the regex is valid.
+   */
+  private boolean validateRegex()
+  {
+
+    boolean isValid;
+    try
+    {
+      // We validate the regex by checking whether we get a ParseException.
+      // By default, we assume that it's valid unless we determine otherwise.
+      isValid = true;
+      displayRegexErrorMessage(null);
+      value.setStyleRange(null);
+
+      // validator.setPattern(value.getText());
+      validator = Pattern.compile(value.getText());
+    }
+    // catch (ParseException pe)
+    catch (PatternSyntaxException pe)
+    {
+      isValid = false;
+      displayRegexErrorMessage(pe.getMessage());
+
+      // An off-by-one bug in the xerces regex parser will sometimes return a location for the parseError that
+      //  is off the end of the string.  If this is the case, then we want to highlight the last character.
+      if (pe.getIndex() >= value.getText().length())
+      {
+        currentError.start = value.getText().length() - 1;
+      }
+      else
+      {
+        currentError.start = pe.getIndex();
+      }
+
+      if (debug)
+      {
+        System.out.println("Parse Error location: " + pe.getIndex());
+        System.out.println("currentError.start: " + currentError.start);
+      }
+
+      value.setStyleRange(currentError);
+
+    }
+
+    // Another bug in the xerces parser will sometimes throw a RuntimeException instead of a ParseException.
+    //  When we get a RuntimeException, we aren't provided with the additional information we need to highlight
+    //  the parse error.  So, we merely report that there is an error.
+    catch (RuntimeException re)
+    {
+      displayRegexErrorMessage("");
+      value.setStyleRange(null);
+      isValid = false;
+    }
+    
+    setPageComplete(isValid);    
+    return isValid;
+  }
+
+  
+  /**
+   * Manages the display of error messages.
+   * Sets the error message for type to errorMessage.  If errorMessage != null, then we set the Wizard's error message
+   * to errorMessage.  If errorMessage == null, then we check whether we have a pending message of another type.
+   * If we do, then it is displayed as the Wizard's error message.  If we don't, then the Wizard's error message field
+   * is cleared.
+   *
+   * @param errorMessage The text of the new error message.  A value of null indicates that the error message should
+   *  be cleared.
+   * @param type The error type, one of PARSE, TOKEN, or SELECTION.
+   */ 
+  private void displayErrorMessage(String errorMessage, int type)
+  {
+    String messageToDisplay = null;
+
+
+    currentErrorMessages[type] = errorMessage;
+
+    messageToDisplay = errorMessage;
+
+    for (int i = 0; i < NUM_ERROR_MESSAGE_TYPES; i++)
+    {
+      if (messageToDisplay != null)
+      {
+        break;
+      }
+      messageToDisplay = currentErrorMessages[i];
+    }
+
+    setErrorMessage(messageToDisplay);
+  }
+
+
+  /**
+   * Sets the Wizard's error message to message, preceded by a standard prefix.
+   *
+   * @param message The new error message (or null to clear it).
+   */
+  private void displayRegexErrorMessage (String errorMessage)
+  {
+    if (errorMessage == null)
+    {
+      displayErrorMessage(null, PARSE);
+    }
+    else
+    {
+    	if (errorMessage.trim().equals("")) // when there is no error message available.
+    	{
+        displayErrorMessage(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_INVALID_REGEX_ERROR"),
+                           PARSE);
+      }
+      else
+      {
+        displayErrorMessage(errorMessage, PARSE);
+      }
+    }
+  }
+
+
+  /**
+   * Updates the token status.  Sets isValidToken to status && the status of the other error type.
+   * If status is true, we clear the wizard's error message for this type; if it is false, we set it to errorMessage.
+   *
+   * @param status The new isValidToken value.
+   * @param errorMessage The new error message.
+   * @param type The type of the error (either TOKEN or SELECTION).
+   */
+  private void setTokenStatus (boolean status, String errorMessage, int type)
+  {
+    boolean otherTypeStatus =     (type == TOKEN) ? 
+                                  currentErrorMessages[SELECTION] == null :
+                                  currentErrorMessages[TOKEN] == null;
+    
+    isValidToken = status && otherTypeStatus;
+    add.setEnabled(isValidToken);
+
+    if (status)
+    {
+      displayErrorMessage(null, type);
+    }
+    else
+    {
+    	if (errorMessage != null && errorMessage.trim().equals("")) // when there is no error message available.
+    	{
+        displayErrorMessage(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_INVALID_TOKEN_ERROR"),
+                           type);
+      }
+      else
+      {
+        displayErrorMessage(errorMessage, type);
+      }
+    }
+  }
+
+  
+  /**
+   * Updates the token status.  Sets isValidToken to status && the status of the other error type.
+   * Also clears the wizard's error message for this type.
+   * Usually used to set isValidToken to true.
+   *
+   * @param status The new isValidToken value.
+   * @param type The type of the error (either TOKEN or SELECTION).
+   */
+  private void setTokenStatus(boolean status, int type)
+  {
+    setTokenStatus(status, null, type);
+  }
+
+
+
+  /**
+   * Sets the enabled status of the text fields and labels associated with the specified quantifier.
+   * If status is true, then fields and labels associated with other quantifiers are disabled.
+   * @param quantifier The quantifier whose elements' enabled status we wish to change
+   *   (as enumerated in RegexNode).
+   * @param status The new status of the elements.  If true, then all elements associated with other buttons
+   *               are disabled.
+   */    
+  private void setEnabledStatus(int quantifier, boolean status)
+  {
+    switch (quantifier)
+    {
+    
+    case RegexNode.REPEAT:
+      repeatValue.setEnabled(status);
+      if (status)
+      {
+        rangeMinValue.setEnabled(false);
+        rangeMaxValue.setEnabled(false);
+        rangeToLabel.setEnabled(false);
+      }
+      break;
+
+    case RegexNode.RANGE:
+      rangeMinValue.setEnabled(status);
+      rangeMaxValue.setEnabled(status);
+      rangeToLabel.setEnabled(status);
+      if (status)
+      {
+        repeatValue.setEnabled(false);
+      }
+      break;
+
+    }
+  }
+
+  /**
+   * Checks to see if there is a selection in value.  If there is not, we set the Wizard's error message accordingly.
+   * If there is, we update the contents of node.  If "Current Selection" is not the current token, then
+   * we clear the Selection error message.
+   */
+  private void updateCurrentSelectionStatus()
+  {
+    if (terms.getSelectionIndex() == RegexNode.SELECTION)
+    {
+      String selection = value.getSelectionText();
+      if (selection.equals(""))
+      {
+        setTokenStatus(false, XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_INVALID_SELECTION_ERROR"), SELECTION);
+      }
+      else
+      {
+        setTokenStatus(true, SELECTION);
+        node.setContents(selection);
+        node.setHasParens(true);
+      }
+    }
+    else
+    {
+      setTokenStatus(true, SELECTION);
+    }
+  }
+
+  /**
+   * Updates the enabled status of the auto-escape checkbox.  If status is true, we enable the checkbox, and
+   * set its selection status and node's auto-escape status to the value of autoEscapeStatus.  If status is
+   * false, then we disable and deselect the checkbox, and set node's status to false.
+   *
+   * @param status The new enabled status.
+   */
+  private void setEscapeCheckboxEnabledStatus(boolean status)
+  {
+    if (status)
+    {
+      escapeCheckbox.setEnabled(true);
+      escapeCheckbox.setSelection(autoEscapeStatus);
+      node.setAutoEscapeStatus(autoEscapeStatus);
+    }
+    else
+    {
+      escapeCheckbox.setEnabled(false);
+      escapeCheckbox.setSelection(false);
+      node.setAutoEscapeStatus(false);
+    }
+  }
+
+
+  /**
+   * Returns the current regex flags.
+   */
+  String getFlags()
+  {
+    return regexFlags;
+  }
+
+  /**
+   * Returns the current XSDPattern model.
+   */
+  XSDPatternFacet getPattern()
+  {
+    return pattern;
+  }
+
+
+  /**
+   * Returns a string consisting of the values of min, max, and repeat stored in node.
+   * Used for debugging purposes only.
+   */  
+  private String getAllFieldValues()
+  {
+      String result = "";
+      result += "Min: " + node.getMin() + "\n";
+      result += "Max: " + node.getMax() + "\n";
+      result += "Repeat: " + node.getRepeat() + "\n";
+      result += "\n";
+      return result;
+  }
+  
+
+  /* Listener for the add button. */
+  class ButtonSelectListener implements SelectionListener
+  {
+    public void widgetDefaultSelected(SelectionEvent e)
+    {
+    }
+
+    // Precondition: isValidToken == true  
+    public void widgetSelected(SelectionEvent e)
+    {
+      if (!isValidToken) // should never happen
+      {
+        System.out.println("Attempted to add an invalid token.");
+        System.out.println(node.toString());
+        System.out.println(getAllFieldValues());
+        return;
+      }
+
+      // Whether there is anything selected in value.
+      boolean isActiveSelection = value.getSelectionCount() != 0;
+      
+      value.insert(node.toString());
+
+      if (terms.getSelectionIndex() == RegexNode.SELECTION)
+      {
+        updateCurrentSelectionStatus();
+      }
+
+      // If nothing is selected, then we need to advance the caret location.
+      if (!isActiveSelection)
+      {
+        value.setCaretOffset(value.getCaretOffset() + node.toString().length());
+      }
+
+      value.setFocus();
+
+    }
+
+  }
+ 
+
+  /* Listener for the terms combo box. */
+  class ComboListener implements Listener
+  {
+    public void handleEvent(Event e)
+    {
+      
+      updateCurrentSelectionStatus();
+
+      // If the user has typed in a token
+      if (terms.getSelectionIndex() == -1)
+      {
+        setEscapeCheckboxEnabledStatus(true);
+        node.setContents(terms.getText());
+        node.setHasParens(true);
+        
+
+        if (debug)
+        {
+          System.out.println(terms.getText());
+        }
+
+      }
+      else if (terms.getSelectionIndex() == RegexNode.SELECTION)
+      {
+        setEscapeCheckboxEnabledStatus(false);
+      }
+      else
+      {
+        node.setContents(RegexNode.getRegexTermValue(terms.getSelectionIndex()));
+        node.setHasParens(false);
+        setEscapeCheckboxEnabledStatus(false);
+      }
+    }
+  }
+
+
+  /* Listener for enabling/disabling caretLabel. */
+  class TextFocusListener implements FocusListener
+  {
+    public void focusGained(FocusEvent e)
+    {
+      setShowCaretLabel(false);
+    }
+    public void focusLost(FocusEvent e)
+    {
+      setShowCaretLabel(true);
+    }
+  }
+
+
+
+  /* Listener for the text fields. */
+  class TextListener implements Listener
+  {
+    public void handleEvent (Event e)
+    {
+
+      if (debug)
+      {
+        System.out.println("Inside TextListener handler");
+        System.out.println(e);
+        System.out.println(getAllFieldValues());
+      }
+
+
+      if ( (e.widget == value) && (e.type == SWT.Modify) )
+      {
+        pattern.setLexicalValue(value.getText());
+        validateRegex();
+      }
+
+      else if (e.widget == value && e.type == SWT.Selection)
+      {
+        if (terms.getSelectionIndex() == RegexNode.SELECTION)
+        {
+          updateCurrentSelectionStatus();
+        }
+      }
+
+      else if (e.widget == rangeMinValue)
+      {
+        boolean isValid = node.setMin(rangeMinValue.getText());
+
+        if (isValid)
+        {
+          setTokenStatus(true, null, TOKEN);
+        }
+        else
+        {
+          setTokenStatus(false,  XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_INVALID_MIN_ERROR_SUFFIX"), TOKEN);
+        }
+      }
+
+      else if (e.widget == rangeMaxValue)
+      {
+        boolean isValid = node.setMax(rangeMaxValue.getText());
+
+        if (node.getMin() == RegexNode.EMPTY)
+        {
+          setTokenStatus(false, XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_MISSING_MIN_ERROR_SUFFIX"), TOKEN);
+        }
+        else if (isValid)
+        {
+          setTokenStatus(true, null, TOKEN);
+        }
+        else
+        {
+          setTokenStatus(false, XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_INVALID_MAX_ERROR_SUFFIX"), TOKEN);
+        }
+      }
+
+      else  // (e.widget == repeatValue)
+      {
+        boolean isValid = node.setRepeat(repeatValue.getText());
+        if (isValid)
+        {
+          setTokenStatus(true, null, TOKEN);
+        }
+        else
+        {
+          setTokenStatus(false, XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_INVALID_REPEAT_ERROR_SUFFIX"), TOKEN);
+        }
+      }
+    }
+  }
+
+  /* Listener for the auto-escape checkbox. */
+  class CheckboxListener implements SelectionListener
+  {
+    public void widgetDefaultSelected(SelectionEvent e)
+    {
+    }
+
+    public void widgetSelected(SelectionEvent e)
+    {
+      boolean newStatus = !autoEscapeStatus;
+      node.setAutoEscapeStatus(newStatus);
+      autoEscapeStatus = newStatus;
+      
+      if (debug)
+      {
+        System.out.println("AutoEscape Status: " + node.getAutoEscapeStatus());
+      }
+    }
+
+  }
+
+
+  /* Listener for the radio buttons. */
+  class RadioSelectListener implements SelectionListener
+  {
+    public void widgetDefaultSelected(SelectionEvent e)
+    {
+    }
+
+    public void widgetSelected(SelectionEvent e)
+    {
+      if (debug)
+      {
+        System.out.println(getAllFieldValues());
+      }
+
+
+      int currentQuantifier = getQuantifier(e);
+
+      node.setQuantifier(currentQuantifier);
+
+      switch (currentQuantifier)
+      {
+      case RegexNode.SINGLE:                     
+      case RegexNode.STAR:
+      case RegexNode.PLUS:
+      case RegexNode.OPTIONAL:
+        setEnabledStatus(RegexNode.REPEAT, false);
+        setEnabledStatus(RegexNode.RANGE, false);
+        setTokenStatus(true, TOKEN);
+        break; 
+
+      case RegexNode.REPEAT:
+        setEnabledStatus(RegexNode.REPEAT, true);
+        setTokenStatus(node.hasValidRepeat(), XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_INVALID_REPEAT_ERROR_SUFFIX"), TOKEN);
+        repeatValue.setFocus();
+        break;
+
+      case RegexNode.RANGE:
+        setEnabledStatus(RegexNode.RANGE, true);
+        String error = (node.hasValidMin()) ? 
+                            XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_INVALID_MAX_ERROR_SUFFIX") : 
+                            XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_INVALID_MIN_ERROR_SUFFIX");
+
+        setTokenStatus( node.hasValidMin() && node.hasValidMax(), error, TOKEN);
+        rangeMinValue.setFocus();
+        break;
+      }
+    }
+
+    private int getQuantifier(SelectionEvent e)
+    {
+
+      if (e.widget == singleRadio)
+      {
+        return RegexNode.SINGLE;
+      }
+      
+      else if (e.widget == starRadio)
+      {
+        return RegexNode.STAR;
+      }
+      
+      else if (e.widget == plusRadio)
+      {
+        return RegexNode.PLUS;
+      }
+      
+      else if (e.widget == optionalRadio)
+      {
+        return RegexNode.OPTIONAL;
+      }
+      
+      else if (e.widget == repeatRadio)
+      {
+        return RegexNode.REPEAT;
+      }
+      
+      else if (e.widget == rangeRadio)
+      {
+        return RegexNode.RANGE;
+      }
+      
+      else // can't get here
+      { 
+        return RegexNode.EMPTY;
+      }
+    } 
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexNode.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexNode.java
new file mode 100644
index 0000000..2844709
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexNode.java
@@ -0,0 +1,421 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.wizards;
+
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+
+
+class RegexNode
+{
+  private String contents;
+  private int min;
+  private int max;
+  private int repeat;
+  private int quantifier;
+  private boolean hasParens;
+  private boolean autoEscapeStatus;
+
+  
+  /* Quantifiers. */
+  public static final int SINGLE = 0;    
+  public static final int STAR = 1;
+  public static final int PLUS = 2;
+  public static final int OPTIONAL = 3;
+  public static final int REPEAT = 4; 
+  public static final int RANGE = 5;
+
+  /* Regex quantifiers.  First column is the on-screen textual representation, second column is the 
+   on-screen regex representation.  The two are concatenated together to form the on-screen
+   representation.
+   Indexing of this array must correspond to the values of the quantifier constants above.
+  */
+  private static final String[][] regexQuantifiers =
+  { 
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_QUANTIFIER_SINGLE"),   ""  },
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_QUANTIFIER_STAR"),     "*" },
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_QUANTIFIER_PLUS"),     "+" },
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_QUANTIFIER_OPTIONAL"), "?" },
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_QUANTIFIER_REPEAT"),   ""  },
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_QUANTIFIER_RANGE"),    ""  },
+  };
+
+
+  /* Regex tokens.  First column is the on-screen representation, second column is the regex representation. 
+     More tokens can be added, but it is assumed that "Current Selection" is the last element in the array.
+     If this is not the case, then the value of the SELECTION constant below will need to be changed 
+     accordingly.
+     Also note that because these are java Strings, backslashes must be escaped (this is only relevant to the
+     second column of the array).
+   */
+  private static final String[][] regexTerms =
+  { 
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TERM_ANY_CHAR"),   "."     },
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TERM_ALPHANUMERIC_CHAR"),   "\\w"     },
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TERM_WHITESPACE"), "\\s"   },
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TERM_DIGIT"),      "\\d"   },
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TERM_UPPER"),      "[A-Z]" },
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TERM_LOWER"),      "[a-z]" },
+    { XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TERM_SELECTION"),  ""      },
+  };
+
+  /* Token enumerated constants. */
+
+  // SELECTION must correspond to the index in regexTerms of "Current Selection".  This is assumed to be
+  //  the last element.
+  public static final int SELECTION = regexTerms.length - 1;
+
+  public static final int EMPTY = -1;
+
+  /* 
+  The metacharacters recognized by XML Schema.
+  Note that the double backslash ("\\") actually represents an escaped single backslash character ("\").
+  */ 
+  private static final String metacharacters = ".\\?*+{}()[]";
+
+
+  public static String getRegexTermText(int i)
+  {
+    if (i == SELECTION)
+    {
+      return regexTerms[i][0];
+    }
+    else
+    {
+      return regexTerms[i][0] + " ( " + regexTerms[i][1] + " )";
+    }
+  }
+
+  public static String getRegexTermValue(int i)
+  {
+    if (i == SELECTION) // shouldn't happen
+    {
+      return "";
+    }
+    else
+    {
+      return regexTerms[i][1];
+    }
+  }
+
+  public static int getNumRegexTerms()
+  {
+    return regexTerms.length;
+  }
+
+  public static String getQuantifierText(int i)
+  {
+    String result = regexQuantifiers[i][0];
+    
+    if (!regexQuantifiers[i][1].equals(""))
+    {
+      result += " ( ";
+      result += regexQuantifiers[i][1];
+      result += " )";
+    }
+
+    return result;
+  }
+
+  public RegexNode()
+  {
+    this.contents = "";
+    this.quantifier = SINGLE;
+    this.min = EMPTY;
+    this.max = EMPTY;
+    this.repeat = EMPTY;
+    this.hasParens = false;
+
+  }
+
+  
+  public String getContents()
+  {
+    return contents;
+  }
+  
+  public void setContents(String contents)
+  {
+    this.contents = contents;
+  }
+
+
+  public int getQuantifier()
+  {
+    return quantifier;
+  }
+
+  public void setQuantifier(int quantifier)
+  {
+    this.quantifier = quantifier;
+  }
+
+
+  public int getMin()
+  {
+    return min;
+  }
+
+  public void setMin(int min)
+  {
+    this.min = min;
+  }
+
+  /**
+   * Sets this.min to the integer representation of min iff min is a valid value (i.e. greater than 0).
+   * Sets this.min to EMPTY if it is not.
+   *
+   * @param min The new min value
+   * @returns Whether min was a valid value
+   */  
+  public boolean setMin(String min)
+  {
+    this.min = convertToInt(min);
+
+    // min > max is an invalid case, unless max is EMPTY (since EMPTY == -1).
+    if ( (this.max != EMPTY) && (this.min > this.max) )
+    {
+      return false;
+    }
+    
+    return (this.min >= 0);
+  }
+
+  
+  public int getMax()
+  {
+    return max;
+  }
+  
+  public void setMax(int max)
+  {
+    this.max = max;
+  }
+
+  /**
+   * Sets this.max to the integer representation of max iff max is a valid value (i.e. greater than 0).
+   * Sets this.max to EMPTY if it is not.
+   *
+   * @param max The new max value
+   * @returns Whether max was a valid value, or (whether max == the empty string && min has a valid value)
+   */ 
+  public boolean setMax(String max)
+  {
+    this.max = convertToInt(max);
+
+    // The empty string is a valid max value iff min has a valid value.
+    // This is due to the fact that {n,} means "at least n times" in regex parlance.
+    if (max.equals("") && this.min != EMPTY)
+    {
+      return true;
+    }
+    
+    else if (this.max < this.min)
+    {
+      return false;
+    }
+    
+    else
+    {
+      return (this.max >= 0);
+    }
+  }
+
+
+ 
+  public int getRepeat()
+  {
+    return repeat;
+  }
+
+  public void setRepeat(int repeat)
+  {
+    this.repeat = repeat;
+  }
+
+  /**
+   * Sets this.repeat to the integer representation of repeat iff repeat is a valid value (i.e. greater than 0).
+   * Sets this.repeat to EMPTY if it is not.
+   *
+   * @param repeat The new repeat value
+   * @returns Whether repeat was a valid value
+   */
+  public boolean setRepeat(String repeat)
+  {
+    this.repeat = convertToInt(repeat);
+    return (this.repeat >= 0);
+  }
+
+
+
+  /**
+   * Returns the integer representation of s.  If s is less than zero, or if s is not an int
+   * (i.e. if Integer.parseInt would throw a NumberFormatException), then returns EMPTY.
+   *
+   * @param s The String to convert.
+   * @returns The integer representation of s.
+   */
+  private int convertToInt(String s)
+  {
+    int result;
+    try
+    {
+      result = Integer.parseInt(s);
+      if (result < 0)
+      {
+        result = EMPTY;
+      }
+    }
+    catch (NumberFormatException e)
+    {
+      result = EMPTY;
+    }
+
+    return result;
+  }
+
+
+  public boolean getHasParens()
+  {
+    return hasParens;
+  }
+
+  public void setHasParens(boolean status)
+  {
+    this.hasParens = status;
+  }
+
+  public boolean getAutoEscapeStatus()
+  {
+    return autoEscapeStatus;
+  }
+
+  public void setAutoEscapeStatus(boolean status)
+  {
+    this.autoEscapeStatus = status;
+  }
+
+  /**
+   * Returns an escaped version of s.  In other words, each occurrence of a metacharacter ( .\?*+{}()[] )
+   * is replaced by that character preceded by a backslash.
+   *
+   * @param s The String to escape.
+   * @returns An escaped version of s.
+   */
+  private String addEscapeCharacters(String s)
+  {
+    StringBuffer result = new StringBuffer("");
+
+    for (int i = 0; i < s.length(); i++)
+    {
+      char currentChar = s.charAt(i);
+
+      if (isMetachar(currentChar))
+      {
+        result.append("\\"); // Note that this is an escaped backslash, not a double backslash.
+      }
+      result.append(currentChar);
+
+    }
+
+    return result.toString();
+  }
+
+  /**
+   * Checks whether c is a metacharacter as defined in the static variable metacharacters.
+   *
+   * @param c The character to check.
+   * @returns Whether c is a metacharacter.
+   */
+  private boolean isMetachar(char c)
+  {
+    return metacharacters.indexOf(c) != -1;
+  }
+  
+
+  public boolean hasValidMin()
+  {
+    return (min != EMPTY);
+  }
+
+  public boolean hasValidMax()
+  {
+    return(max != EMPTY);
+  }
+
+  public boolean hasValidRepeat()
+  {
+    return(repeat != EMPTY);
+  }
+
+  public String toString()
+  {
+    String result = "";
+    
+    if (hasParens)
+    {
+      result += "(";
+    }
+    
+    if (autoEscapeStatus)
+    {
+       result += addEscapeCharacters(contents);
+    }
+    else 
+    {
+      result += contents;
+    }
+
+
+    if (hasParens)
+    {
+      result += ")";
+    }
+    
+    switch (quantifier)
+    {
+      case STAR:
+        result += "*";
+        break;
+      
+      case PLUS:
+        result += "+";
+        break;
+      
+      case OPTIONAL:
+        result += "?";
+        break;
+      
+      case REPEAT:
+        result += "{" + repeat + "}";
+        break;
+      
+      case RANGE:
+        result += "{" + min + ",";
+        if (max == EMPTY)
+        {
+          result += "";
+        }
+        else
+        {
+          result += max;
+        }       
+        result += "}";
+        break;
+      
+      // SINGLE is a fall through           
+
+    }
+    return result;
+
+  }
+
+
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexTestingPage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexTestingPage.java
new file mode 100644
index 0000000..57601b5
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexTestingPage.java
@@ -0,0 +1,161 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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
+ *******************************************************************************/
+// Based on version 1.6 of original xsdeditor
+package org.eclipse.wst.xsd.ui.internal.wizards;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+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.help.WorkbenchHelp;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorContextIds;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+
+
+public class RegexTestingPage extends WizardPage
+{
+  /* Validator from xerces package. */
+//  private RegularExpression validator;
+  private Pattern validator;
+  
+  /* Displays the status of the match. */
+  private Label matchLabel;
+
+
+  /* The regex. */
+  private Text value;
+  
+  /* The string the user is trying to match against the regex. */
+  private StyledText testString;
+
+  public RegexTestingPage()
+  {
+    super(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TESTING_PAGE_TITLE"));
+
+    setTitle(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TESTING_PAGE_TITLE"));
+    setDescription(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TESTING_PAGE_DESCRIPTION"));
+  }
+
+
+  public void createControl(Composite parent)
+  {
+    Composite composite = ViewUtility.createComposite(parent, 1);
+    WorkbenchHelp.setHelp(composite, XSDEditorContextIds.XSDR_TEST_PAGE);
+
+    matchLabel = new Label(composite, SWT.WRAP);
+    matchLabel.setText(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TESTING_PAGE_DESCRIPTION"));
+    FontData[] fontData = matchLabel.getFont().getFontData();
+    GridData dataF = new GridData();
+    dataF.widthHint = 400;
+    dataF.heightHint = 6 * fontData[0].getHeight();
+    matchLabel.setLayoutData(dataF);
+    
+    Composite controls = new Composite(composite, SWT.NONE);
+    GridLayout controlsLayout = new GridLayout();
+    controlsLayout.numColumns = 2;
+    controls.setLayout(controlsLayout);
+    controls.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+    new Label(controls, SWT.LEFT).setText(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_REGEX_LABEL"));
+    value = new Text(controls, SWT.BORDER | SWT.READ_ONLY);
+    value.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+
+    new Label(controls, SWT.LEFT).setText(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_SAMPLE_TEXT"));
+    testString = new StyledText(controls, SWT.SINGLE | SWT.BORDER);
+    WorkbenchHelp.setHelp(testString, XSDEditorContextIds.XSDR_TEST_SAMPLE);
+    testString.addListener(SWT.Modify, new TestStringListener());
+    testString.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+    
+    controls.pack();
+    
+    Label separator = new Label(composite, SWT.SEPARATOR | SWT.HORIZONTAL);
+    GC gc = new GC(separator);
+    Point pointSize = gc.stringExtent(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TESTING_PAGE_DESCRIPTION"));
+    GridData gd = new GridData();
+    gd.widthHint = (int)(pointSize.x / 2 + gc.getAdvanceWidth('M')*11);
+    gd.horizontalAlignment= GridData.FILL;
+    separator.setLayoutData(gd);
+    
+    composite.pack();
+    
+//    validator = new RegularExpression("", getFlags());
+
+    setControl(composite);
+  }
+
+
+  private String getPatternValue()
+  {
+    return ( (RegexCompositionPage)getPreviousPage() ).getPattern().getLexicalValue();
+  }
+
+  private String getFlags()
+  {
+    return ( (RegexCompositionPage)getPreviousPage() ).getFlags();
+  }
+
+  public void setVisible(boolean visible)
+  {
+    super.setVisible(visible);
+
+    String pattern = getPatternValue();
+    String flags = getFlags();
+
+    value.setText(pattern);
+
+//    try
+//    {
+//      validator.setPattern(pattern, flags);
+//    }
+//    catch (ParseException pe)
+//    {
+//    }
+    
+    updateMatchStatus();
+
+    testString.setFocus();
+  }
+
+  class TestStringListener implements Listener
+  {
+    public void handleEvent(Event e)
+    {
+      updateMatchStatus();
+    }
+  }
+
+  private void updateMatchStatus()
+  {
+    if (Pattern.matches(getPatternValue(), testString.getText()))
+    {
+//      matchLabel.setText(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_MATCHES"));
+      setMessage(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_MATCHES"), 1);
+    }
+    else
+    {
+      setMessage(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_DOES_NOT_MATCH"), 2);
+//      matchLabel.setText(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_DOES_NOT_MATCH"));
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexWizard.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexWizard.java
new file mode 100644
index 0000000..e17cb80
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/RegexWizard.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.wizards;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.xsd.XSDPatternFacet;
+import org.eclipse.xsd.impl.XSDFactoryImpl;
+
+
+public class RegexWizard extends Wizard 
+{
+  private static final boolean debug = false;
+  
+  private RegexCompositionPage compositionPage;
+  private RegexTestingPage testingPage;
+
+  /* The original, unchanged pattern. */  
+  private XSDPatternFacet originalPattern;
+  
+  /* A copy of the original pattern that is passed into the wizard. */
+  private XSDPatternFacet modifiedPattern;
+
+  String pattern;
+
+  public RegexWizard(String expr)
+  {
+    super();
+    setWindowTitle(XSDEditorPlugin.getXSDString("_UI_REGEX_WIZARD_TITLE"));
+    setDefaultPageImageDescriptor(ImageDescriptor.createFromFile(XSDEditorPlugin.class, "icons/regx_wiz.gif"));
+
+    XSDFactoryImpl factory = new XSDFactoryImpl();
+    modifiedPattern = factory.createXSDPatternFacet();
+    modifiedPattern.setLexicalValue(expr);
+
+    originalPattern = factory.createXSDPatternFacet();
+    originalPattern.setLexicalValue(expr);
+
+    compositionPage = new RegexCompositionPage(modifiedPattern);
+    addPage(compositionPage);
+
+    testingPage = new RegexTestingPage();
+    addPage(testingPage);
+  }
+
+  public String getPattern()
+  {
+    return pattern;
+  }
+
+  public boolean performFinish()
+  {
+    pattern = modifiedPattern.getLexicalValue();
+    return true;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDLocationChoicePage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDLocationChoicePage.java
new file mode 100644
index 0000000..ef0110a
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDLocationChoicePage.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.wizards;
+
+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.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+
+
+public class XSDLocationChoicePage extends WizardPage 
+{
+  protected Button radioButton1;
+  protected Button radioButton2;
+    
+  public XSDLocationChoicePage()
+  {
+    super("XSDLocationChoicePage");
+
+    this.setTitle(XSDEditorPlugin.getXSDString("_UI_WIZARD_INCLUDE_FILE_TITLE"));
+    this.setDescription(XSDEditorPlugin.getXSDString("_UI_WIZARD_INCLUDE_FILE_DESC"));
+  }
+    
+  public boolean isPageComplete()
+  {
+    return true;
+  }
+    
+  public void createControl(Composite parent)
+  {
+    Composite base = new Composite(parent, SWT.NONE);
+    base.setLayout(new GridLayout());
+    GridData data;
+      
+    ViewUtility.createLabel(base, XSDEditorPlugin.getXSDString("_UI_LABEL_INCLUDE_URL_FILE"));
+    Composite radioButtonsGroup = ViewUtility.createComposite(base, 1, true);
+
+    radioButton1 = ViewUtility.createRadioButton(radioButtonsGroup, 
+                                                 XSDEditorPlugin.getXSDString("_UI_RADIO_FILE"));
+      
+    radioButton2 = ViewUtility.createRadioButton(radioButtonsGroup,
+                                                 XSDEditorPlugin.getXSDString("_UI_RADIO_URL"));
+
+    radioButton1.setSelection(true);
+
+    setControl(base);
+  }
+
+  // actions on finish
+  public boolean performFinish()
+  {
+    return true;
+  }
+
+  public boolean isURL()
+  {
+    return radioButton2.getSelection();
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDNewFilePage.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDNewFilePage.java
new file mode 100644
index 0000000..d25eea7
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDNewFilePage.java
@@ -0,0 +1,130 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.wizards;
+ 
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IResource;
+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.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+
+
+public class XSDNewFilePage extends WizardNewFileCreationPage
+{
+  public XSDNewFilePage(IStructuredSelection selection) 
+  {
+    super(XSDEditorPlugin.getXSDString("_UI_CREATEXSD"), selection);
+    setTitle(XSDEditorPlugin.getXSDString("_UI_NEW_XML_SCHEMA_TITLE"));
+    setDescription(XSDEditorPlugin.getXSDString("_UI_CREATE_A_NEW_XML_SCHEMA_DESC"));
+  }
+
+  public void createControl(Composite parent) 
+  {
+    // inherit default container and name specification widgets
+    super.createControl(parent);
+
+    this.setFileName(computeDefaultFileName());
+
+    setPageComplete(validatePage());
+  }
+
+  protected boolean validatePage()
+  {
+    Path newName = new Path(getFileName());
+    String fullFileName = getFileName();
+    String extension = newName.getFileExtension();
+    if (extension == null || !extension.equalsIgnoreCase("xsd")) 
+    {
+      setErrorMessage(XSDEditorPlugin.getXSDString("_ERROR_FILENAME_MUST_END_XSD"));
+      return false;
+    }
+    else 
+    {
+      setErrorMessage(null);
+    }
+
+    // check for file should be case insensitive
+    String sameName = existsFileAnyCase(fullFileName);
+    if (sameName != null) 
+    {
+      String qualifiedFileName = getContainerFullPath().toString() + '/' + fullFileName;
+      setErrorMessage(XSDEditorPlugin.getPlugin().getString("_ERROR_FILE_ALREADY_EXISTS", sameName)); //$NON-NLS-1$
+      return false;
+    }
+
+    return super.validatePage();
+  }
+
+  public String defaultName = "NewXMLSchema"; //$NON-NLS-1$
+  public String defaultFileExtension = ".xsd"; //$NON-NLS-1$
+  public String[] filterExtensions = { "*.xsd"}; //$NON-NLS-1$
+
+  protected String computeDefaultFileName()
+  {
+    int count = 0;
+    String fileName = defaultName + defaultFileExtension;
+    IPath containerFullPath = getContainerFullPath();
+    if (containerFullPath != null)
+    {
+      while (true)
+      {
+        IPath path = containerFullPath.append(fileName);
+        if (ResourcesPlugin.getWorkspace().getRoot().exists(path))
+        {
+          count++;
+          fileName = defaultName + count + defaultFileExtension;
+        }
+        else
+        {
+          break;
+        }
+      }
+    }
+    return fileName;
+  }
+
+  // returns true if file of specified name exists in any case for selected container
+  protected String existsFileAnyCase(String fileName)
+  {
+    if ( (getContainerFullPath() != null) && (getContainerFullPath().isEmpty() == false)
+        && (fileName.compareTo("") != 0))
+    {
+      //look through all resources at the specified container - compare in upper case
+      IResource parent = ResourcesPlugin.getWorkspace().getRoot().findMember(getContainerFullPath());
+      if (parent instanceof IContainer)
+      {
+        IContainer container = (IContainer) parent;
+        try
+        {
+          IResource[] members = container.members();
+          String enteredFileUpper = fileName.toUpperCase();
+          for (int i=0; i<members.length; i++)
+          {
+            String resourceUpperName = members[i].getName().toUpperCase();
+            if (resourceUpperName.equals(enteredFileUpper))
+            {  
+              return members[i].getName();    
+            }
+          }
+        }
+        catch (CoreException e)
+        {
+        }
+      }
+    }
+    return null;
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDSelectIncludeFileWizard.java b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDSelectIncludeFileWizard.java
new file mode 100644
index 0000000..35dee94
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/src/org/eclipse/wst/xsd/ui/internal/wizards/XSDSelectIncludeFileWizard.java
@@ -0,0 +1,371 @@
+/*******************************************************************************
+ * Copyright (c) 2001, 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse 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.wst.xsd.ui.internal.wizards;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.ui.viewers.SelectSingleFilePage;
+import org.eclipse.wst.xsd.ui.internal.XSDEditorPlugin;
+import org.eclipse.wst.xsd.ui.internal.util.ViewUtility;
+import org.eclipse.xsd.XSDSchema;
+import org.eclipse.xsd.util.XSDParser;
+
+
+/**
+ * Extend the base wizard to select a file from the project or outside the workbench
+ * and add error handling
+ */
+public class XSDSelectIncludeFileWizard extends Wizard implements INewWizard
+{
+  boolean isInclude;
+  XSDSchema mainSchema;
+  XSDSchema externalSchema;
+
+  XSDLocationChoicePage choicePage;
+  XSDSelectSingleFilePage filePage;
+  XSDURLPage urlPage;
+
+  IFile resultFile;
+  String resultURL;
+  String namespace = "";
+
+  public XSDSelectIncludeFileWizard(XSDSchema mainSchema, boolean isInclude,
+                                    String title, String desc, 
+                                    ViewerFilter filter,
+                                    IStructuredSelection selection)
+  {
+    super();
+    setWindowTitle(title);
+    setDefaultPageImageDescriptor(ImageDescriptor.createFromFile(XSDEditorPlugin.class, "icons/NewXSD.gif"));
+
+    setNeedsProgressMonitor(true);
+
+    // Choice Page
+    choicePage = new XSDLocationChoicePage();
+
+    // Select File Page
+    filePage = new XSDSelectSingleFilePage(PlatformUI.getWorkbench(),  selection, true);
+    filePage.setTitle(title);
+    filePage.setDescription(desc);
+    filePage.addFilter(filter);
+
+    // URL Page
+    urlPage = new XSDURLPage();
+    urlPage.setTitle(title);
+    urlPage.setDescription(XSDEditorPlugin.getXSDString("_UI_FILEDIALOG_SELECT_XML_URL"));
+    
+    this.mainSchema = mainSchema;
+    this.isInclude = isInclude;
+  }
+
+  public void init(IWorkbench aWorkbench, IStructuredSelection aSelection)
+  { 
+  }
+
+  public void addPages()
+  {
+    addPage(choicePage);
+    addPage(filePage);
+    addPage(urlPage);
+  }
+
+  public IWizardPage getNextPage(IWizardPage currentPage)
+  {
+    WizardPage nextPage = null;
+
+    if (currentPage == choicePage)
+    {
+      if (choicePage.isURL()) 
+      {
+        nextPage = urlPage;
+      }
+      else
+      {
+        nextPage = filePage;
+      }
+    }
+    return nextPage;
+  }
+
+  public boolean canFinish()
+  {
+    if (!choicePage.isURL())
+    {
+      return filePage.isPageComplete(); 
+    }
+    return true;
+  }
+
+  public boolean performFinish()
+  { 
+    if (choicePage.isURL())
+    {
+      try 
+      {
+        getContainer().run(false, true, urlPage.getRunnable());
+        resultURL = urlPage.getURL();
+      }
+      catch (Exception e)
+      {
+        return false;
+      }
+      return true;
+    }
+    else
+    {  
+      resultFile = filePage.getFile();
+    }
+    return true;
+  }
+
+  /**
+   * Get the MOF object that represents the external file
+   */
+  public XSDSchema getExternalSchema()
+  {
+    return externalSchema;
+  }
+
+  public IFile getResultFile()
+  {
+    return resultFile;
+  }
+
+  public String getURL()
+  {
+    return resultURL;
+  }
+  
+  public String getNamespace()
+  {
+  	return namespace;
+  }
+
+  /**
+   * Create a MOF model for the imported file
+   */
+  protected String doLoadExternalModel(IProgressMonitor monitor, String xsdModelFile, String xsdFileName)
+  { 
+    String errorMessage = null;
+    String currentNameSpace = mainSchema.getTargetNamespace();
+
+    monitor.beginTask("Loading XML Schema", 100);
+    monitor.worked(50);
+
+    XSDParser parser = new XSDParser();
+    parser.parse(xsdModelFile);
+
+    externalSchema = parser.getSchema();
+    if (externalSchema != null)
+    {
+      String extNamespace = externalSchema.getTargetNamespace();
+      namespace = extNamespace;
+     
+      if (externalSchema.getDiagnostics() != null &&
+          externalSchema.getDiagnostics().size() > 0)
+      {
+        errorMessage = XSDEditorPlugin.getPlugin().getString("_UI_INCORRECT_XML_SCHEMA", xsdFileName);
+      }  
+      else
+      {
+        if (isInclude) 
+        {  
+          // Check the namespace to make sure they are the same as current file
+          if (extNamespace != null)
+          {
+            if (currentNameSpace != null && !extNamespace.equals(currentNameSpace))
+            {
+              errorMessage = XSDEditorPlugin.getPlugin().getString("_UI_DIFFERENT_NAME_SPACE", xsdFileName);
+            }
+          }
+        }
+        else
+        {  
+          // Check the namespace to make sure they are different from the current file
+          if (extNamespace != null)
+          {
+            if (currentNameSpace != null && extNamespace.equals(currentNameSpace))
+            {
+              errorMessage = XSDEditorPlugin.getPlugin().getString("_UI_SAME_NAME_SPACE", xsdFileName);
+            }
+          }
+        }
+      }
+    }
+    else
+    {
+      errorMessage = XSDEditorPlugin.getPlugin().getString("_UI_INCORRECT_XML_SCHEMA", xsdFileName);
+    }
+
+    monitor.subTask("Finish Loading");
+    monitor.worked(80);
+
+    return errorMessage;
+  }
+
+ 
+  /**
+   * URL page
+   */
+  class XSDURLPage extends WizardPage
+  { 
+    Text urlField;
+    String saveString;
+
+    public XSDURLPage()
+    {
+      super("URLPage");
+    }
+
+    public void createControl(Composite parent)
+    {
+      Composite client = ViewUtility.createComposite(parent,2);
+      ViewUtility.setComposite(client);
+
+      ViewUtility.createLabel(client, XSDEditorPlugin.getXSDString("_UI_LABEL_URL"));
+      ViewUtility.createLabel(client, "");
+
+      urlField = ViewUtility.createTextField(client, 50);
+      saveString = "http://";
+      urlField.setText(saveString);
+
+      setControl(client);
+    }
+
+    public String getURL()
+    {
+      return urlField.getText();
+    }
+
+    private boolean openExternalSchema(IProgressMonitor monitor)
+    {
+      String text = urlField.getText();
+//      if (text.equals(saveString)) 
+//      {
+//        return false;
+//      }
+//      saveString = text;
+
+      if (text.equals(""))
+      {
+        setErrorMessage(XSDEditorPlugin.getXSDString("_UI_SPECIFY_URL"));
+        return false;
+      }
+
+      if ( !text.startsWith("http://") )
+      {
+        setErrorMessage(XSDEditorPlugin.getXSDString("_UI_URL_START_WITH"));
+        return false;
+      }
+
+      setErrorMessage(null);
+      String errorMessage = doLoadExternalModel(monitor, text, text);
+      if (errorMessage != null) 
+      {
+        setErrorMessage(errorMessage); 
+        return false;
+      }
+      else
+      {
+        return true;
+      }
+    }
+
+    public IRunnableWithProgress getRunnable()
+    {
+      return new IRunnableWithProgress()
+      {
+        public void run(IProgressMonitor monitor)   
+          throws InvocationTargetException, InterruptedException
+        {
+          if (monitor == null)
+          {
+            monitor= new NullProgressMonitor();
+          }
+          monitor.beginTask("", 6);
+        
+          boolean ok = openExternalSchema(monitor);
+
+          if (!ok) 
+          { 
+            throw new InvocationTargetException(new java.lang.Error());
+          }
+
+          monitor.done();
+        }
+      };
+    }
+  }
+
+  /**
+   * Select XML Schema File
+   */
+  class XSDSelectSingleFilePage extends SelectSingleFilePage
+  {
+    public XSDSelectSingleFilePage(IWorkbench workbench, IStructuredSelection selection, boolean isFileMandatory)
+    {          
+      super(workbench,selection,isFileMandatory);
+    }
+
+    private boolean openExternalSchema()
+    {
+      // Get the fully-qualified file name
+      IFile iFile = getFile();
+      if (iFile == null) 
+        return false;
+
+      setErrorMessage(null);
+
+      String xsdModelFile = iFile.getLocation().toOSString();
+      String xsdFileName = iFile.getName();
+      String errorMessage = doLoadExternalModel(new NullProgressMonitor(), xsdModelFile, xsdFileName);
+
+      if (errorMessage != null) 
+      {
+        setErrorMessage(errorMessage);
+        return false;
+      }
+      else
+      {
+        return true;
+      }
+    }
+
+    public boolean isPageComplete()
+    {  
+      if (choicePage.isURL()) 
+      {
+        return true;
+      }
+
+      if (super.isPageComplete()) 
+      {
+        return openExternalSchema();
+      }
+      return super.isPageComplete();
+    }
+  }
+}
diff --git a/bundles/org.eclipse.wst.xsd.ui/w3c/XMLSchema.dtd b/bundles/org.eclipse.wst.xsd.ui/w3c/XMLSchema.dtd
new file mode 100644
index 0000000..e61dfd0
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/w3c/XMLSchema.dtd
@@ -0,0 +1,402 @@
+<!-- DTD for XML Schemas: Part 1: Structures
+     Public Identifier: "-//W3C//DTD XMLSCHEMA 200102//EN"
+     Official Location: http://www.w3.org/2001/XMLSchema.dtd -->
+<!-- $Id: XMLSchema.dtd,v 1.1 2004/11/24 21:13:41 csalter Exp $ -->
+<!-- Note this DTD is NOT normative, or even definitive. -->           <!--d-->
+<!-- prose copy in the structures REC is the definitive version -->    <!--d-->
+<!-- (which shouldn't differ from this one except for this -->         <!--d-->
+<!-- comment and entity expansions, but just in case) -->              <!--d-->
+<!-- With the exception of cases with multiple namespace
+     prefixes for the XML Schema namespace, any XML document which is
+     not valid per this DTD given redefinitions in its internal subset of the
+     'p' and 's' parameter entities below appropriate to its namespace
+     declaration of the XML Schema namespace is almost certainly not
+     a valid schema. -->
+
+<!-- The simpleType element and its constituent parts
+     are defined in XML Schema: Part 2: Datatypes -->
+<!ENTITY % xs-datatypes PUBLIC 'datatypes' 'datatypes.dtd' >
+
+<!ENTITY % p 'xs:'> <!-- can be overriden in the internal subset of a
+                         schema document to establish a different
+                         namespace prefix -->
+<!ENTITY % s ':xs'> <!-- if %p is defined (e.g. as foo:) then you must
+                         also define %s as the suffix for the appropriate
+                         namespace declaration (e.g. :foo) -->
+<!ENTITY % nds 'xmlns%s;'>
+
+<!-- Define all the element names, with optional prefix -->
+<!ENTITY % schema "%p;schema">
+<!ENTITY % complexType "%p;complexType">
+<!ENTITY % complexContent "%p;complexContent">
+<!ENTITY % simpleContent "%p;simpleContent">
+<!ENTITY % extension "%p;extension">
+<!ENTITY % element "%p;element">
+<!ENTITY % unique "%p;unique">
+<!ENTITY % key "%p;key">
+<!ENTITY % keyref "%p;keyref">
+<!ENTITY % selector "%p;selector">
+<!ENTITY % field "%p;field">
+<!ENTITY % group "%p;group">
+<!ENTITY % all "%p;all">
+<!ENTITY % choice "%p;choice">
+<!ENTITY % sequence "%p;sequence">
+<!ENTITY % any "%p;any">
+<!ENTITY % anyAttribute "%p;anyAttribute">
+<!ENTITY % attribute "%p;attribute">
+<!ENTITY % attributeGroup "%p;attributeGroup">
+<!ENTITY % include "%p;include">
+<!ENTITY % import "%p;import">
+<!ENTITY % redefine "%p;redefine">
+<!ENTITY % notation "%p;notation">
+
+<!-- annotation elements -->
+<!ENTITY % annotation "%p;annotation">
+<!ENTITY % appinfo "%p;appinfo">
+<!ENTITY % documentation "%p;documentation">
+
+<!-- Customisation entities for the ATTLIST of each element type.
+     Define one of these if your schema takes advantage of the
+     anyAttribute='##other' in the schema for schemas -->
+
+<!ENTITY % schemaAttrs ''>
+<!ENTITY % complexTypeAttrs ''>
+<!ENTITY % complexContentAttrs ''>
+<!ENTITY % simpleContentAttrs ''>
+<!ENTITY % extensionAttrs ''>
+<!ENTITY % elementAttrs ''>
+<!ENTITY % groupAttrs ''>
+<!ENTITY % allAttrs ''>
+<!ENTITY % choiceAttrs ''>
+<!ENTITY % sequenceAttrs ''>
+<!ENTITY % anyAttrs ''>
+<!ENTITY % anyAttributeAttrs ''>
+<!ENTITY % attributeAttrs ''>
+<!ENTITY % attributeGroupAttrs ''>
+<!ENTITY % uniqueAttrs ''>
+<!ENTITY % keyAttrs ''>
+<!ENTITY % keyrefAttrs ''>
+<!ENTITY % selectorAttrs ''>
+<!ENTITY % fieldAttrs ''>
+<!ENTITY % includeAttrs ''>
+<!ENTITY % importAttrs ''>
+<!ENTITY % redefineAttrs ''>
+<!ENTITY % notationAttrs ''>
+<!ENTITY % annotationAttrs ''>
+<!ENTITY % appinfoAttrs ''>
+<!ENTITY % documentationAttrs ''>
+
+<!ENTITY % complexDerivationSet "CDATA">
+      <!-- #all or space-separated list drawn from derivationChoice -->
+<!ENTITY % blockSet "CDATA">
+      <!-- #all or space-separated list drawn from
+                      derivationChoice + 'substitution' -->
+
+<!ENTITY % mgs '%all; | %choice; | %sequence;'>
+<!ENTITY % cs '%choice; | %sequence;'>
+<!ENTITY % formValues '(qualified|unqualified)'>
+
+
+<!ENTITY % attrDecls    '((%attribute;| %attributeGroup;)*,(%anyAttribute;)?)'>
+
+<!ENTITY % particleAndAttrs '((%mgs; | %group;)?, %attrDecls;)'>
+
+<!-- This is used in part2 -->
+<!ENTITY % restriction1 '((%mgs; | %group;)?)'>
+
+%xs-datatypes;
+
+<!-- the duplication below is to produce an unambiguous content model
+     which allows annotation everywhere -->
+<!ELEMENT %schema; ((%include; | %import; | %redefine; | %annotation;)*,
+                    ((%simpleType; | %complexType;
+                      | %element; | %attribute;
+                      | %attributeGroup; | %group;
+                      | %notation; ),
+                     (%annotation;)*)* )>
+<!ATTLIST %schema;
+   targetNamespace      %URIref;               #IMPLIED
+   version              CDATA                  #IMPLIED
+   %nds;                %URIref;               #FIXED 'http://www.w3.org/2001/XMLSchema'
+   xmlns                CDATA                  #IMPLIED
+   finalDefault         %complexDerivationSet; ''
+   blockDefault         %blockSet;             ''
+   id                   ID                     #IMPLIED
+   elementFormDefault   %formValues;           'unqualified'
+   attributeFormDefault %formValues;           'unqualified'
+   xml:lang             CDATA                  #IMPLIED
+   %schemaAttrs;>
+<!-- Note the xmlns declaration is NOT in the Schema for Schemas,
+     because at the Infoset level where schemas operate,
+     xmlns(:prefix) is NOT an attribute! -->
+<!-- The declaration of xmlns is a convenience for schema authors -->
+ 
+<!-- The id attribute here and below is for use in external references
+     from non-schemas using simple fragment identifiers.
+     It is NOT used for schema-to-schema reference, internal or
+     external. -->
+
+<!-- a type is a named content type specification which allows attribute
+     declarations-->
+<!-- -->
+
+<!ELEMENT %complexType; ((%annotation;)?,
+                         (%simpleContent;|%complexContent;|
+                          %particleAndAttrs;))>
+
+<!ATTLIST %complexType;
+          name      %NCName;                        #IMPLIED
+          id        ID                              #IMPLIED
+          abstract  %boolean;                       #IMPLIED
+          final     %complexDerivationSet;          #IMPLIED
+          block     %complexDerivationSet;          #IMPLIED
+          mixed (true|false) 'false'
+          %complexTypeAttrs;>
+
+<!-- particleAndAttrs is shorthand for a root type -->
+<!-- mixed is disallowed if simpleContent, overriden if complexContent
+     has one too. -->
+
+<!-- If anyAttribute appears in one or more referenced attributeGroups
+     and/or explicitly, the intersection of the permissions is used -->
+
+<!ELEMENT %complexContent; (%restriction;|%extension;)>
+<!ATTLIST %complexContent;
+          mixed (true|false) #IMPLIED
+          id    ID           #IMPLIED
+          %complexContentAttrs;>
+
+<!-- restriction should use the branch defined above, not the simple
+     one from part2; extension should use the full model  -->
+
+<!ELEMENT %simpleContent; (%restriction;|%extension;)>
+<!ATTLIST %simpleContent;
+          id    ID           #IMPLIED
+          %simpleContentAttrs;>
+
+<!-- restriction should use the simple branch from part2, not the 
+     one defined above; extension should have no particle  -->
+
+<!ELEMENT %extension; (%particleAndAttrs;)>
+<!ATTLIST %extension;
+          base  %QName;      #REQUIRED
+          id    ID           #IMPLIED
+          %extensionAttrs;>
+
+<!-- an element is declared by either:
+ a name and a type (either nested or referenced via the type attribute)
+ or a ref to an existing element declaration -->
+
+<!ELEMENT %element; ((%annotation;)?, (%complexType;| %simpleType;)?,
+                     (%unique; | %key; | %keyref;)*)>
+<!-- simpleType or complexType only if no type|ref attribute -->
+<!-- ref not allowed at top level -->
+<!ATTLIST %element;
+            name               %NCName;               #IMPLIED
+            id                 ID                     #IMPLIED
+            ref                %QName;                #IMPLIED
+            type               %QName;                #IMPLIED
+            minOccurs          %nonNegativeInteger;   #IMPLIED
+            maxOccurs          CDATA                  #IMPLIED
+            nillable           %boolean;              #IMPLIED
+            substitutionGroup  %QName;                #IMPLIED
+            abstract           %boolean;              #IMPLIED
+            final              %complexDerivationSet; #IMPLIED
+            block              %blockSet;             #IMPLIED
+            default            CDATA                  #IMPLIED
+            fixed              CDATA                  #IMPLIED
+            form               %formValues;           #IMPLIED
+            %elementAttrs;>
+<!-- type and ref are mutually exclusive.
+     name and ref are mutually exclusive, one is required -->
+<!-- In the absence of type AND ref, type defaults to type of
+     substitutionGroup, if any, else the ur-type, i.e. unconstrained -->
+<!-- default and fixed are mutually exclusive -->
+
+<!ELEMENT %group; ((%annotation;)?,(%mgs;)?)>
+<!ATTLIST %group; 
+          name        %NCName;               #IMPLIED
+          ref         %QName;                #IMPLIED
+          minOccurs   %nonNegativeInteger;   #IMPLIED
+          maxOccurs   CDATA                  #IMPLIED
+          id          ID                     #IMPLIED
+          %groupAttrs;>
+
+<!ELEMENT %all; ((%annotation;)?, (%element;)*)>
+<!ATTLIST %all;
+          minOccurs   (1)                    #IMPLIED
+          maxOccurs   (1)                    #IMPLIED
+          id          ID                     #IMPLIED
+          %allAttrs;>
+
+<!ELEMENT %choice; ((%annotation;)?, (%element;| %group;| %cs; | %any;)*)>
+<!ATTLIST %choice;
+          minOccurs   %nonNegativeInteger;   #IMPLIED
+          maxOccurs   CDATA                  #IMPLIED
+          id          ID                     #IMPLIED
+          %choiceAttrs;>
+
+<!ELEMENT %sequence; ((%annotation;)?, (%element;| %group;| %cs; | %any;)*)>
+<!ATTLIST %sequence;
+          minOccurs   %nonNegativeInteger;   #IMPLIED
+          maxOccurs   CDATA                  #IMPLIED
+          id          ID                     #IMPLIED
+          %sequenceAttrs;>
+
+<!-- an anonymous grouping in a model, or
+     a top-level named group definition, or a reference to same -->
+
+<!-- Note that if order is 'all', group is not allowed inside.
+     If order is 'all' THIS group must be alone (or referenced alone) at
+     the top level of a content model -->
+<!-- If order is 'all', minOccurs==maxOccurs==1 on element/any inside -->
+<!-- Should allow minOccurs=0 inside order='all' . . . -->
+
+<!ELEMENT %any; (%annotation;)?>
+<!ATTLIST %any;
+            namespace       CDATA                  '##any'
+            processContents (skip|lax|strict)      'strict'
+            minOccurs       %nonNegativeInteger;   '1'
+            maxOccurs       CDATA                  '1'
+            id              ID                     #IMPLIED
+            %anyAttrs;>
+
+<!-- namespace is interpreted as follows:
+                  ##any      - - any non-conflicting WFXML at all
+
+                  ##other    - - any non-conflicting WFXML from namespace other
+                                  than targetNamespace
+
+                  ##local    - - any unqualified non-conflicting WFXML/attribute
+                  one or     - - any non-conflicting WFXML from
+                  more URI        the listed namespaces
+                  references
+
+                  ##targetNamespace ##local may appear in the above list,
+                    with the obvious meaning -->
+
+<!ELEMENT %anyAttribute; (%annotation;)?>
+<!ATTLIST %anyAttribute;
+            namespace       CDATA              '##any'
+            processContents (skip|lax|strict)  'strict'
+            id              ID                 #IMPLIED
+            %anyAttributeAttrs;>
+<!-- namespace is interpreted as for 'any' above -->
+
+<!-- simpleType only if no type|ref attribute -->
+<!-- ref not allowed at top level, name iff at top level -->
+<!ELEMENT %attribute; ((%annotation;)?, (%simpleType;)?)>
+<!ATTLIST %attribute;
+          name      %NCName;      #IMPLIED
+          id        ID            #IMPLIED
+          ref       %QName;       #IMPLIED
+          type      %QName;       #IMPLIED
+          use       (prohibited|optional|required) #IMPLIED
+          default   CDATA         #IMPLIED
+          fixed     CDATA         #IMPLIED
+          form      %formValues;  #IMPLIED
+          %attributeAttrs;>
+<!-- type and ref are mutually exclusive.
+     name and ref are mutually exclusive, one is required -->
+<!-- default for use is optional when nested, none otherwise -->
+<!-- default and fixed are mutually exclusive -->
+<!-- type attr and simpleType content are mutually exclusive -->
+
+<!-- an attributeGroup is a named collection of attribute decls, or a
+     reference thereto -->
+<!ELEMENT %attributeGroup; ((%annotation;)?,
+                       (%attribute; | %attributeGroup;)*,
+                       (%anyAttribute;)?) >
+<!ATTLIST %attributeGroup;
+                 name       %NCName;       #IMPLIED
+                 id         ID             #IMPLIED
+                 ref        %QName;        #IMPLIED
+                 %attributeGroupAttrs;>
+
+<!-- ref iff no content, no name.  ref iff not top level -->
+
+<!-- better reference mechanisms -->
+<!ELEMENT %unique; ((%annotation;)?, %selector;, (%field;)+)>
+<!ATTLIST %unique;
+          name     %NCName;       #REQUIRED
+	  id       ID             #IMPLIED
+	  %uniqueAttrs;>
+
+<!ELEMENT %key;    ((%annotation;)?, %selector;, (%field;)+)>
+<!ATTLIST %key;
+          name     %NCName;       #REQUIRED
+	  id       ID             #IMPLIED
+	  %keyAttrs;>
+
+<!ELEMENT %keyref; ((%annotation;)?, %selector;, (%field;)+)>
+<!ATTLIST %keyref;
+          name     %NCName;       #REQUIRED
+	  refer    %QName;        #REQUIRED
+	  id       ID             #IMPLIED
+	  %keyrefAttrs;>
+
+<!ELEMENT %selector; ((%annotation;)?)>
+<!ATTLIST %selector;
+          xpath %XPathExpr; #REQUIRED
+          id    ID          #IMPLIED
+          %selectorAttrs;>
+<!ELEMENT %field; ((%annotation;)?)>
+<!ATTLIST %field;
+          xpath %XPathExpr; #REQUIRED
+          id    ID          #IMPLIED
+          %fieldAttrs;>
+
+<!-- Schema combination mechanisms -->
+<!ELEMENT %include; (%annotation;)?>
+<!ATTLIST %include;
+          schemaLocation %URIref; #REQUIRED
+          id             ID       #IMPLIED
+          %includeAttrs;>
+
+<!ELEMENT %import; (%annotation;)?>
+<!ATTLIST %import;
+          namespace      %URIref; #IMPLIED
+          schemaLocation %URIref; #IMPLIED
+          id             ID       #IMPLIED
+          %importAttrs;>
+
+<!ELEMENT %redefine; (%annotation; | %simpleType; | %complexType; |
+                      %attributeGroup; | %group;)*>
+<!ATTLIST %redefine;
+          schemaLocation %URIref; #REQUIRED
+          id             ID       #IMPLIED
+          %redefineAttrs;>
+
+<!ELEMENT %notation; (%annotation;)?>
+<!ATTLIST %notation;
+	  name        %NCName;    #REQUIRED
+	  id          ID          #IMPLIED
+	  public      CDATA       #REQUIRED
+	  system      %URIref;    #IMPLIED
+	  %notationAttrs;>
+
+<!-- Annotation is either application information or documentation -->
+<!-- By having these here they are available for datatypes as well
+     as all the structures elements -->
+
+<!ELEMENT %annotation; (%appinfo; | %documentation;)*>
+<!ATTLIST %annotation; %annotationAttrs;>
+
+<!-- User must define annotation elements in internal subset for this
+     to work -->
+<!ELEMENT %appinfo; ANY>   <!-- too restrictive -->
+<!ATTLIST %appinfo;
+          source     %URIref;      #IMPLIED
+          id         ID         #IMPLIED
+          %appinfoAttrs;>
+<!ELEMENT %documentation; ANY>   <!-- too restrictive -->
+<!ATTLIST %documentation;
+          source     %URIref;   #IMPLIED
+          id         ID         #IMPLIED
+          xml:lang   CDATA      #IMPLIED
+          %documentationAttrs;>
+
+<!NOTATION XMLSchemaStructures PUBLIC
+           'structures' 'http://www.w3.org/2001/XMLSchema.xsd' >
+<!NOTATION XML PUBLIC
+           'REC-xml-1998-0210' 'http://www.w3.org/TR/1998/REC-xml-19980210' >
diff --git a/bundles/org.eclipse.wst.xsd.ui/w3c/XMLSchema.xsd b/bundles/org.eclipse.wst.xsd.ui/w3c/XMLSchema.xsd
new file mode 100644
index 0000000..12c2209
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/w3c/XMLSchema.xsd
@@ -0,0 +1,2534 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- XML Schema schema for XML Schemas: Part 1: Structures -->
+<!-- Note this schema is NOT the normative structures schema. -->
+<!-- The prose copy in the structures REC is the normative -->
+<!-- version (which shouldn't differ from this one except for -->
+<!-- this comment and entity expansions, but just in case -->
+<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" [
+
+<!-- provide ID type information even for parsers which only read the
+     internal subset -->
+<!ATTLIST xs:schema          id  ID  #IMPLIED>
+<!ATTLIST xs:complexType     id  ID  #IMPLIED>
+<!ATTLIST xs:complexContent  id  ID  #IMPLIED>
+<!ATTLIST xs:simpleContent   id  ID  #IMPLIED>
+<!ATTLIST xs:extension       id  ID  #IMPLIED>
+<!ATTLIST xs:element         id  ID  #IMPLIED>
+<!ATTLIST xs:group           id  ID  #IMPLIED> 
+<!ATTLIST xs:all             id  ID  #IMPLIED>
+<!ATTLIST xs:choice          id  ID  #IMPLIED>
+<!ATTLIST xs:sequence        id  ID  #IMPLIED>
+<!ATTLIST xs:any             id  ID  #IMPLIED>
+<!ATTLIST xs:anyAttribute    id  ID  #IMPLIED>
+<!ATTLIST xs:attribute       id  ID  #IMPLIED>
+<!ATTLIST xs:attributeGroup  id  ID  #IMPLIED>
+<!ATTLIST xs:unique          id  ID  #IMPLIED>
+<!ATTLIST xs:key             id  ID  #IMPLIED>
+<!ATTLIST xs:keyref          id  ID  #IMPLIED>
+<!ATTLIST xs:selector        id  ID  #IMPLIED>
+<!ATTLIST xs:field           id  ID  #IMPLIED>
+<!ATTLIST xs:include         id  ID  #IMPLIED>
+<!ATTLIST xs:import          id  ID  #IMPLIED>
+<!ATTLIST xs:redefine        id  ID  #IMPLIED>
+<!ATTLIST xs:notation        id  ID  #IMPLIED>
+<!--
+     keep this schema XML1.0 DTD valid
+  -->
+        <!ENTITY % schemaAttrs 'xmlns:hfp CDATA #IMPLIED'>
+
+        <!ELEMENT hfp:hasFacet EMPTY>
+        <!ATTLIST hfp:hasFacet
+                name NMTOKEN #REQUIRED>
+
+        <!ELEMENT hfp:hasProperty EMPTY>
+        <!ATTLIST hfp:hasProperty
+                name NMTOKEN #REQUIRED
+                value CDATA #REQUIRED>
+<!--
+        Make sure that processors that do not read the external
+        subset will know about the various IDs we declare
+  -->
+        <!ATTLIST xs:simpleType id ID #IMPLIED>
+        <!ATTLIST xs:maxExclusive id ID #IMPLIED>
+        <!ATTLIST xs:minExclusive id ID #IMPLIED>
+        <!ATTLIST xs:maxInclusive id ID #IMPLIED>
+        <!ATTLIST xs:minInclusive id ID #IMPLIED>
+        <!ATTLIST xs:totalDigits id ID #IMPLIED>
+        <!ATTLIST xs:fractionDigits id ID #IMPLIED>
+        <!ATTLIST xs:length id ID #IMPLIED>
+        <!ATTLIST xs:minLength id ID #IMPLIED>
+        <!ATTLIST xs:maxLength id ID #IMPLIED>
+        <!ATTLIST xs:enumeration id ID #IMPLIED>
+        <!ATTLIST xs:pattern id ID #IMPLIED>
+        <!ATTLIST xs:appinfo id ID #IMPLIED>
+        <!ATTLIST xs:documentation id ID #IMPLIED>
+        <!ATTLIST xs:list id ID #IMPLIED>
+        <!ATTLIST xs:union id ID #IMPLIED>
+        ]>
+<xs:schema targetNamespace="http://www.w3.org/2001/XMLSchema" blockDefault="#all" elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="EN" xmlns:hfp="http://www.w3.org/2001/XMLSchema-hasFacetAndProperty">
+ <xs:annotation>
+  <xs:documentation>
+    Part 1 version: Id: structures.xsd,v 1.2 2004/01/15 11:34:25 ht Exp 
+    Part 2 version: Id: datatypes.xsd,v 1.3 2004/01/23 18:11:13 ht Exp 
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/2004/PER-xmlschema-1-20040318/structures.html">
+   The schema corresponding to this document is normative,
+   with respect to the syntactic constraints it expresses in the
+   XML Schema language.  The documentation (within &lt;documentation> elements)
+   below, is not normative, but rather highlights important aspects of
+   the W3C Recommendation of which this is a part</xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+   <xs:documentation>
+   The simpleType element and all of its members are defined
+      towards the end of this schema document</xs:documentation>
+ </xs:annotation>
+
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd">
+   <xs:annotation>
+     <xs:documentation>
+       Get access to the xml: attribute groups for xml:lang
+       as declared on 'schema' and 'documentation' below
+     </xs:documentation>
+   </xs:annotation>
+ </xs:import>
+
+ <xs:complexType name="openAttrs">
+   <xs:annotation>
+     <xs:documentation>
+       This type is extended by almost all schema types
+       to allow attributes from other namespaces to be
+       added to user schemas.
+     </xs:documentation>
+   </xs:annotation>
+   <xs:complexContent>
+     <xs:restriction base="xs:anyType">
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+     </xs:restriction>
+   </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="annotated">
+   <xs:annotation>
+     <xs:documentation>
+       This type is extended by all types which allow annotation
+       other than &lt;schema&gt; itself
+     </xs:documentation>
+   </xs:annotation>
+   <xs:complexContent>
+     <xs:extension base="xs:openAttrs">
+       <xs:sequence>
+         <xs:element ref="xs:annotation" minOccurs="0"/>
+       </xs:sequence>
+       <xs:attribute name="id" type="xs:ID"/>
+     </xs:extension>
+   </xs:complexContent>
+ </xs:complexType>
+
+ <xs:group name="schemaTop">
+  <xs:annotation>
+   <xs:documentation>
+   This group is for the
+   elements which occur freely at the top level of schemas.
+   All of their types are based on the "annotated" type by extension.</xs:documentation>
+  </xs:annotation>
+  <xs:choice>
+   <xs:group ref="xs:redefinable"/>
+   <xs:element ref="xs:element"/>
+   <xs:element ref="xs:attribute"/>
+   <xs:element ref="xs:notation"/>
+  </xs:choice>
+ </xs:group>
+ 
+ <xs:group name="redefinable">
+  <xs:annotation>
+   <xs:documentation>
+   This group is for the
+   elements which can self-redefine (see &lt;redefine> below).</xs:documentation>
+  </xs:annotation>
+  <xs:choice>
+   <xs:element ref="xs:simpleType"/>
+   <xs:element ref="xs:complexType"/>
+   <xs:element ref="xs:group"/>
+   <xs:element ref="xs:attributeGroup"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:simpleType name="formChoice">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:NMTOKEN">
+   <xs:enumeration value="qualified"/>
+   <xs:enumeration value="unqualified"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="reducedDerivationControl">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:derivationControl">
+   <xs:enumeration value="extension"/>
+   <xs:enumeration value="restriction"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="derivationSet">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+   <xs:documentation>
+   #all or (possibly empty) subset of {extension, restriction}</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>    
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="#all"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list itemType="xs:reducedDerivationControl"/>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:simpleType name="typeDerivationControl">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:derivationControl">
+   <xs:enumeration value="extension"/>
+   <xs:enumeration value="restriction"/>
+   <xs:enumeration value="list"/>
+   <xs:enumeration value="union"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+  <xs:simpleType name="fullDerivationSet">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+   <xs:documentation>
+   #all or (possibly empty) subset of {extension, restriction, list, union}</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>    
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="#all"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list itemType="xs:typeDerivationControl"/>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:element name="schema" id="schema">
+  <xs:annotation>
+    <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-schema"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:openAttrs">
+     <xs:sequence>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+       <xs:element ref="xs:include"/>
+       <xs:element ref="xs:import"/>
+       <xs:element ref="xs:redefine"/>
+       <xs:element ref="xs:annotation"/>
+      </xs:choice>
+      <xs:sequence minOccurs="0" maxOccurs="unbounded">
+       <xs:group ref="xs:schemaTop"/>
+       <xs:element ref="xs:annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+     </xs:sequence>
+     <xs:attribute name="targetNamespace" type="xs:anyURI"/>
+     <xs:attribute name="version" type="xs:token"/>
+     <xs:attribute name="finalDefault" type="xs:fullDerivationSet" use="optional" default=""/>
+     <xs:attribute name="blockDefault" type="xs:blockSet" use="optional" default=""/>
+     <xs:attribute name="attributeFormDefault" type="xs:formChoice" use="optional" default="unqualified"/>
+     <xs:attribute name="elementFormDefault" type="xs:formChoice" use="optional" default="unqualified"/>
+     <xs:attribute name="id" type="xs:ID"/>
+     <xs:attribute ref="xml:lang"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+
+  <xs:key name="element">
+   <xs:selector xpath="xs:element"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+  <xs:key name="attribute">
+   <xs:selector xpath="xs:attribute"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+  <xs:key name="type">
+   <xs:selector xpath="xs:complexType|xs:simpleType"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+ 
+  <xs:key name="group">
+   <xs:selector xpath="xs:group"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+ 
+  <xs:key name="attributeGroup">
+   <xs:selector xpath="xs:attributeGroup"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+ 
+  <xs:key name="notation">
+   <xs:selector xpath="xs:notation"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+  <xs:key name="identityConstraint">
+   <xs:selector xpath=".//xs:key|.//xs:unique|.//xs:keyref"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+ </xs:element>
+
+ <xs:simpleType name="allNNI">
+  <xs:annotation><xs:documentation>
+   for maxOccurs</xs:documentation></xs:annotation>
+  <xs:union memberTypes="xs:nonNegativeInteger">
+   <xs:simpleType>
+    <xs:restriction base="xs:NMTOKEN">
+     <xs:enumeration value="unbounded"/>
+    </xs:restriction>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:attributeGroup name="occurs">
+  <xs:annotation><xs:documentation>
+   for all particles</xs:documentation></xs:annotation>
+  <xs:attribute name="minOccurs" type="xs:nonNegativeInteger" use="optional" default="1"/>
+  <xs:attribute name="maxOccurs" type="xs:allNNI" use="optional" default="1"/>
+ </xs:attributeGroup>
+
+ <xs:attributeGroup name="defRef">
+  <xs:annotation><xs:documentation>
+   for element, group and attributeGroup,
+   which both define and reference</xs:documentation></xs:annotation>
+  <xs:attribute name="name" type="xs:NCName"/>
+  <xs:attribute name="ref" type="xs:QName"/>
+ </xs:attributeGroup>
+
+ <xs:group name="typeDefParticle">
+  <xs:annotation>
+    <xs:documentation>
+   'complexType' uses this</xs:documentation></xs:annotation>
+  <xs:choice>
+   <xs:element name="group" type="xs:groupRef"/>
+   <xs:element ref="xs:all"/>
+   <xs:element ref="xs:choice"/>
+   <xs:element ref="xs:sequence"/>
+  </xs:choice>
+ </xs:group>
+ 
+ 
+
+ <xs:group name="nestedParticle">
+  <xs:choice>
+   <xs:element name="element" type="xs:localElement"/>
+   <xs:element name="group" type="xs:groupRef"/>
+   <xs:element ref="xs:choice"/>
+   <xs:element ref="xs:sequence"/>
+   <xs:element ref="xs:any"/>
+  </xs:choice>
+ </xs:group>
+ 
+ <xs:group name="particle">
+  <xs:choice>
+   <xs:element name="element" type="xs:localElement"/>
+   <xs:element name="group" type="xs:groupRef"/>
+   <xs:element ref="xs:all"/>
+   <xs:element ref="xs:choice"/>
+   <xs:element ref="xs:sequence"/>
+   <xs:element ref="xs:any"/>
+  </xs:choice>
+ </xs:group>
+ 
+ <xs:complexType name="attribute">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:element name="simpleType" minOccurs="0" type="xs:localSimpleType"/>
+    </xs:sequence>
+    <xs:attributeGroup ref="xs:defRef"/>
+    <xs:attribute name="type" type="xs:QName"/>
+    <xs:attribute name="use" use="optional" default="optional">
+     <xs:simpleType>
+      <xs:restriction base="xs:NMTOKEN">
+       <xs:enumeration value="prohibited"/>
+       <xs:enumeration value="optional"/>
+       <xs:enumeration value="required"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="default" type="xs:string"/>
+    <xs:attribute name="fixed" type="xs:string"/>
+    <xs:attribute name="form" type="xs:formChoice"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="topLevelAttribute">
+  <xs:complexContent>
+   <xs:restriction base="xs:attribute">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:element name="simpleType" minOccurs="0" type="xs:localSimpleType"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:attribute name="form" use="prohibited"/>
+    <xs:attribute name="use" use="prohibited"/>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:group name="attrDecls">
+  <xs:sequence>
+   <xs:choice minOccurs="0" maxOccurs="unbounded">
+    <xs:element name="attribute" type="xs:attribute"/>
+    <xs:element name="attributeGroup" type="xs:attributeGroupRef"/>
+   </xs:choice>
+   <xs:element ref="xs:anyAttribute" minOccurs="0"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:element name="anyAttribute" type="xs:wildcard" id="anyAttribute">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-anyAttribute"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:group name="complexTypeModel">
+  <xs:choice>
+      <xs:element ref="xs:simpleContent"/>
+      <xs:element ref="xs:complexContent"/>
+      <xs:sequence>
+       <xs:annotation>
+        <xs:documentation>
+   This branch is short for
+   &lt;complexContent>
+   &lt;restriction base="xs:anyType">
+   ...
+   &lt;/restriction>
+   &lt;/complexContent></xs:documentation>
+       </xs:annotation>
+       <xs:group ref="xs:typeDefParticle" minOccurs="0"/>
+       <xs:group ref="xs:attrDecls"/>
+      </xs:sequence>
+  </xs:choice>
+ </xs:group>
+
+ <xs:complexType name="complexType" abstract="true">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:group ref="xs:complexTypeModel"/>
+    <xs:attribute name="name" type="xs:NCName">
+     <xs:annotation>
+      <xs:documentation>
+      Will be restricted to required or forbidden</xs:documentation>
+     </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="mixed" type="xs:boolean" use="optional" default="false">
+     <xs:annotation>
+      <xs:documentation>
+      Not allowed if simpleContent child is chosen.
+      May be overriden by setting on complexContent child.</xs:documentation>
+    </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="abstract" type="xs:boolean" use="optional" default="false"/>
+    <xs:attribute name="final" type="xs:derivationSet"/>
+    <xs:attribute name="block" type="xs:derivationSet"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="topLevelComplexType">
+  <xs:complexContent>
+   <xs:restriction base="xs:complexType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:complexTypeModel"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:NCName" use="required"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="localComplexType">
+  <xs:complexContent>
+   <xs:restriction base="xs:complexType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:complexTypeModel"/>
+    </xs:sequence>
+    <xs:attribute name="name" use="prohibited"/>
+    <xs:attribute name="abstract" use="prohibited"/>
+    <xs:attribute name="final" use="prohibited"/>
+    <xs:attribute name="block" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="restrictionType">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:choice minOccurs="0">
+      <xs:group ref="xs:typeDefParticle"/>
+      <xs:group ref="xs:simpleRestrictionModel"/>
+     </xs:choice>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:attribute name="base" type="xs:QName" use="required"/>
+   </xs:extension>
+  </xs:complexContent>       
+ </xs:complexType>
+
+ <xs:complexType name="complexRestrictionType">
+  <xs:complexContent>
+   <xs:restriction base="xs:restrictionType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:annotation>
+       <xs:documentation>This choice is added simply to
+                   make this a valid restriction per the REC</xs:documentation>
+      </xs:annotation>
+      <xs:group ref="xs:typeDefParticle"/>
+     </xs:choice>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>       
+ </xs:complexType>
+
+ <xs:complexType name="extensionType">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:group ref="xs:typeDefParticle" minOccurs="0"/>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:attribute name="base" type="xs:QName" use="required"/>
+   </xs:extension>
+  </xs:complexContent>       
+ </xs:complexType>
+
+ <xs:element name="complexContent" id="complexContent">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-complexContent"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:choice>
+      <xs:element name="restriction" type="xs:complexRestrictionType"/>
+      <xs:element name="extension" type="xs:extensionType"/>
+     </xs:choice>     
+     <xs:attribute name="mixed" type="xs:boolean">
+      <xs:annotation>
+       <xs:documentation>
+       Overrides any setting on complexType parent.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:complexType name="simpleRestrictionType">
+  <xs:complexContent>
+   <xs:restriction base="xs:restrictionType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:annotation>
+       <xs:documentation>This choice is added simply to
+                   make this a valid restriction per the REC</xs:documentation>
+      </xs:annotation>
+      <xs:group ref="xs:simpleRestrictionModel"/>
+     </xs:choice>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="simpleExtensionType">
+  <xs:complexContent>
+   <xs:restriction base="xs:extensionType">
+    <xs:sequence>
+     <xs:annotation>
+      <xs:documentation>
+      No typeDefParticle group reference</xs:documentation>
+     </xs:annotation>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="simpleContent" id="simpleContent">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-simpleContent"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:choice>
+      <xs:element name="restriction" type="xs:simpleRestrictionType"/>
+      <xs:element name="extension" type="xs:simpleExtensionType"/>
+     </xs:choice>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+ 
+ <xs:element name="complexType" type="xs:topLevelComplexType" id="complexType">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-complexType"/>
+  </xs:annotation>
+ </xs:element>
+
+
+  <xs:simpleType name="blockSet">
+   <xs:annotation>
+    <xs:documentation>
+    A utility type, not for public use</xs:documentation>
+    <xs:documentation>
+    #all or (possibly empty) subset of {substitution, extension,
+    restriction}</xs:documentation>
+   </xs:annotation>
+   <xs:union>
+    <xs:simpleType>    
+     <xs:restriction base="xs:token">
+      <xs:enumeration value="#all"/>
+     </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType>
+     <xs:list>
+      <xs:simpleType>
+       <xs:restriction base="xs:derivationControl">
+        <xs:enumeration value="extension"/>
+        <xs:enumeration value="restriction"/>
+        <xs:enumeration value="substitution"/>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:list>
+    </xs:simpleType>
+   </xs:union>  
+  </xs:simpleType>
+
+ <xs:complexType name="element" abstract="true">
+  <xs:annotation>
+   <xs:documentation>
+   The element element can be used either
+   at the top level to define an element-type binding globally,
+   or within a content model to either reference a globally-defined
+   element or type or declare an element-type binding locally.
+   The ref form is not allowed at the top level.</xs:documentation>
+  </xs:annotation>
+
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attributeGroup ref="xs:defRef"/>
+    <xs:attribute name="type" type="xs:QName"/>
+    <xs:attribute name="substitutionGroup" type="xs:QName"/>
+    <xs:attributeGroup ref="xs:occurs"/>
+    <xs:attribute name="default" type="xs:string"/>
+    <xs:attribute name="fixed" type="xs:string"/>
+    <xs:attribute name="nillable" type="xs:boolean" use="optional" default="false"/>
+    <xs:attribute name="abstract" type="xs:boolean" use="optional" default="false"/>
+    <xs:attribute name="final" type="xs:derivationSet"/>
+    <xs:attribute name="block" type="xs:blockSet"/>
+    <xs:attribute name="form" type="xs:formChoice"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="topLevelElement">
+  <xs:complexContent>
+   <xs:restriction base="xs:element">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:attribute name="form" use="prohibited"/>
+    <xs:attribute name="minOccurs" use="prohibited"/>
+    <xs:attribute name="maxOccurs" use="prohibited"/>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="localElement">
+  <xs:complexContent>
+   <xs:restriction base="xs:element">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="substitutionGroup" use="prohibited"/>
+    <xs:attribute name="final" use="prohibited"/>
+    <xs:attribute name="abstract" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="element" type="xs:topLevelElement" id="element">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-element"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:complexType name="group" abstract="true">
+  <xs:annotation>
+   <xs:documentation>
+   group type for explicit groups, named top-level groups and
+   group references</xs:documentation>
+  </xs:annotation>
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:group ref="xs:particle" minOccurs="0" maxOccurs="unbounded"/>
+    <xs:attributeGroup ref="xs:defRef"/>
+    <xs:attributeGroup ref="xs:occurs"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="realGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:group">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0" maxOccurs="1">
+      <xs:element ref="xs:all"/>
+      <xs:element ref="xs:choice"/>
+      <xs:element ref="xs:sequence"/>
+     </xs:choice>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="namedGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:realGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="1" maxOccurs="1">
+      <xs:element name="all">
+       <xs:complexType>
+        <xs:complexContent>
+         <xs:restriction base="xs:all">
+          <xs:group ref="xs:allModel"/>
+          <xs:attribute name="minOccurs" use="prohibited"/>
+          <xs:attribute name="maxOccurs" use="prohibited"/>
+          <xs:anyAttribute namespace="##other" processContents="lax"/>
+         </xs:restriction>
+        </xs:complexContent>
+       </xs:complexType>
+      </xs:element>
+      <xs:element name="choice" type="xs:simpleExplicitGroup"/>
+      <xs:element name="sequence" type="xs:simpleExplicitGroup"/>
+     </xs:choice>
+    </xs:sequence>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:attribute name="minOccurs" use="prohibited"/>
+    <xs:attribute name="maxOccurs" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="groupRef">
+  <xs:complexContent>
+   <xs:restriction base="xs:realGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="required" type="xs:QName"/>
+    <xs:attribute name="name" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="explicitGroup">
+  <xs:annotation>
+   <xs:documentation>
+   group type for the three kinds of group</xs:documentation>
+  </xs:annotation>
+  <xs:complexContent>
+   <xs:restriction base="xs:group">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:nestedParticle" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:NCName" use="prohibited"/>
+    <xs:attribute name="ref" type="xs:QName" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="simpleExplicitGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:explicitGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:nestedParticle" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="minOccurs" use="prohibited"/>
+    <xs:attribute name="maxOccurs" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:group name="allModel">
+  <xs:sequence>
+      <xs:element ref="xs:annotation" minOccurs="0"/>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+       <xs:annotation>
+        <xs:documentation>This choice with min/max is here to
+                          avoid a pblm with the Elt:All/Choice/Seq
+                          Particle derivation constraint</xs:documentation>
+       </xs:annotation>
+       <xs:element name="element" type="xs:narrowMaxMin"/>
+      </xs:choice>
+     </xs:sequence>
+ </xs:group>
+ 
+ 
+ <xs:complexType name="narrowMaxMin">
+  <xs:annotation>
+   <xs:documentation>restricted max/min</xs:documentation>
+  </xs:annotation>
+  <xs:complexContent>
+   <xs:restriction base="xs:localElement">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="minOccurs" use="optional" default="1">
+     <xs:simpleType>
+      <xs:restriction base="xs:nonNegativeInteger">
+       <xs:enumeration value="0"/>
+       <xs:enumeration value="1"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="maxOccurs" use="optional" default="1">
+     <xs:simpleType>
+      <xs:restriction base="xs:allNNI">
+       <xs:enumeration value="0"/>
+       <xs:enumeration value="1"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+  <xs:complexType name="all">
+   <xs:annotation>
+    <xs:documentation>
+   Only elements allowed inside</xs:documentation>
+   </xs:annotation>
+   <xs:complexContent>
+    <xs:restriction base="xs:explicitGroup">
+     <xs:group ref="xs:allModel"/>
+     <xs:attribute name="minOccurs" use="optional" default="1">
+      <xs:simpleType>
+       <xs:restriction base="xs:nonNegativeInteger">
+        <xs:enumeration value="0"/>
+        <xs:enumeration value="1"/>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+     <xs:attribute name="maxOccurs" use="optional" default="1">
+      <xs:simpleType>
+       <xs:restriction base="xs:allNNI">
+        <xs:enumeration value="1"/>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+     <xs:anyAttribute namespace="##other" processContents="lax"/>
+    </xs:restriction>
+   </xs:complexContent>
+  </xs:complexType>
+
+ <xs:element name="all" id="all" type="xs:all">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-all"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="choice" type="xs:explicitGroup" id="choice">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-choice"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="sequence" type="xs:explicitGroup" id="sequence">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-sequence"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="group" type="xs:namedGroup" id="group">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-group"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:complexType name="wildcard">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:attribute name="namespace" type="xs:namespaceList" use="optional" default="##any"/>
+    <xs:attribute name="processContents" use="optional" default="strict">
+     <xs:simpleType>
+      <xs:restriction base="xs:NMTOKEN">
+       <xs:enumeration value="skip"/>
+       <xs:enumeration value="lax"/>
+       <xs:enumeration value="strict"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="any" id="any">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-any"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:wildcard">
+     <xs:attributeGroup ref="xs:occurs"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+  <xs:annotation>
+   <xs:documentation>
+   simple type for the value of the 'namespace' attr of
+   'any' and 'anyAttribute'</xs:documentation>
+  </xs:annotation>
+  <xs:annotation>
+   <xs:documentation>
+   Value is
+              ##any      - - any non-conflicting WFXML/attribute at all
+
+              ##other    - - any non-conflicting WFXML/attribute from
+                              namespace other than targetNS
+
+              ##local    - - any unqualified non-conflicting WFXML/attribute 
+
+              one or     - - any non-conflicting WFXML/attribute from
+              more URI        the listed namespaces
+              references
+              (space separated)
+
+    ##targetNamespace or ##local may appear in the above list, to
+        refer to the targetNamespace of the enclosing
+        schema or an absent targetNamespace respectively</xs:documentation>
+  </xs:annotation>
+
+ <xs:simpleType name="namespaceList">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="##any"/>
+     <xs:enumeration value="##other"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list>
+     <xs:simpleType>
+      <xs:union memberTypes="xs:anyURI">
+       <xs:simpleType>
+        <xs:restriction base="xs:token">
+         <xs:enumeration value="##targetNamespace"/>
+         <xs:enumeration value="##local"/>
+        </xs:restriction>
+       </xs:simpleType>
+      </xs:union>
+     </xs:simpleType>
+    </xs:list>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:element name="attribute" type="xs:topLevelAttribute" id="attribute">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-attribute"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:complexType name="attributeGroup" abstract="true">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:group ref="xs:attrDecls"/>
+    <xs:attributeGroup ref="xs:defRef"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="namedAttributeGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:attributeGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="attributeGroupRef">
+  <xs:complexContent>
+   <xs:restriction base="xs:attributeGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="required" type="xs:QName"/>
+    <xs:attribute name="name" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="attributeGroup" type="xs:namedAttributeGroup" id="attributeGroup">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-attributeGroup"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="include" id="include">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-include"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:attribute name="schemaLocation" type="xs:anyURI" use="required"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="redefine" id="redefine">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-redefine"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:openAttrs">
+     <xs:choice minOccurs="0" maxOccurs="unbounded">
+      <xs:element ref="xs:annotation"/>
+      <xs:group ref="xs:redefinable"/>
+     </xs:choice>
+     <xs:attribute name="schemaLocation" type="xs:anyURI" use="required"/>
+     <xs:attribute name="id" type="xs:ID"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="import" id="import">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-import"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:attribute name="namespace" type="xs:anyURI"/>
+     <xs:attribute name="schemaLocation" type="xs:anyURI"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="selector" id="selector">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-selector"/>
+  </xs:annotation>
+  <xs:complexType>
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+     <xs:attribute name="xpath" use="required">
+      <xs:simpleType>
+       <xs:annotation>
+        <xs:documentation>A subset of XPath expressions for use
+in selectors</xs:documentation>
+        <xs:documentation>A utility type, not for public
+use</xs:documentation>
+       </xs:annotation>
+       <xs:restriction base="xs:token">
+        <xs:annotation>
+         <xs:documentation>The following pattern is intended to allow XPath
+                           expressions per the following EBNF:
+          Selector    ::=    Path ( '|' Path )*  
+          Path    ::=    ('.//')? Step ( '/' Step )*  
+          Step    ::=    '.' | NameTest  
+          NameTest    ::=    QName | '*' | NCName ':' '*'  
+                           child:: is also allowed
+         </xs:documentation>
+        </xs:annotation>
+        <xs:pattern value="(\.//)?(((child::)?((\i\c*:)?(\i\c*|\*)))|\.)(/(((child::)?((\i\c*:)?(\i\c*|\*)))|\.))*(\|(\.//)?(((child::)?((\i\c*:)?(\i\c*|\*)))|\.)(/(((child::)?((\i\c*:)?(\i\c*|\*)))|\.))*)*">
+        </xs:pattern>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="field" id="field">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-field"/>
+  </xs:annotation>
+  <xs:complexType>
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+     <xs:attribute name="xpath" use="required">
+      <xs:simpleType>
+       <xs:annotation>
+        <xs:documentation>A subset of XPath expressions for use
+in fields</xs:documentation>
+        <xs:documentation>A utility type, not for public
+use</xs:documentation>
+       </xs:annotation>
+       <xs:restriction base="xs:token">
+        <xs:annotation>
+         <xs:documentation>The following pattern is intended to allow XPath
+                           expressions per the same EBNF as for selector,
+                           with the following change:
+          Path    ::=    ('.//')? ( Step '/' )* ( Step | '@' NameTest ) 
+         </xs:documentation>
+        </xs:annotation>
+        <xs:pattern value="(\.//)?((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)/)*((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)|((attribute::|@)((\i\c*:)?(\i\c*|\*))))(\|(\.//)?((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)/)*((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)|((attribute::|@)((\i\c*:)?(\i\c*|\*)))))*">
+        </xs:pattern>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:complexType name="keybase">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:element ref="xs:selector"/>
+     <xs:element ref="xs:field" minOccurs="1" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:NCName" use="required"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:group name="identityConstraint">
+  <xs:annotation>
+   <xs:documentation>The three kinds of identity constraints, all with
+                     type of or derived from 'keybase'.
+   </xs:documentation>
+  </xs:annotation>
+  <xs:choice>
+   <xs:element ref="xs:unique"/>
+   <xs:element ref="xs:key"/>
+   <xs:element ref="xs:keyref"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:element name="unique" type="xs:keybase" id="unique">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-unique"/>
+  </xs:annotation>
+ </xs:element>
+ <xs:element name="key" type="xs:keybase" id="key">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-key"/>
+  </xs:annotation>
+ </xs:element>
+ <xs:element name="keyref" id="keyref">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-keyref"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:keybase">
+     <xs:attribute name="refer" type="xs:QName" use="required"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="notation" id="notation">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-notation"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:attribute name="name" type="xs:NCName" use="required"/>
+     <xs:attribute name="public" type="xs:public"/>
+     <xs:attribute name="system" type="xs:anyURI"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:simpleType name="public">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+   <xs:documentation>
+   A public identifier, per ISO 8879</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:token"/>
+ </xs:simpleType>
+
+ <xs:element name="appinfo" id="appinfo">
+   <xs:annotation>
+     <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-appinfo"/>
+   </xs:annotation>
+   <xs:complexType mixed="true">
+    <xs:sequence minOccurs="0" maxOccurs="unbounded">
+     <xs:any processContents="lax"/>
+    </xs:sequence>
+    <xs:attribute name="source" type="xs:anyURI"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:element name="documentation" id="documentation">
+   <xs:annotation>
+     <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-documentation"/>
+   </xs:annotation>
+   <xs:complexType mixed="true">
+    <xs:sequence minOccurs="0" maxOccurs="unbounded">
+     <xs:any processContents="lax"/>
+    </xs:sequence>
+    <xs:attribute name="source" type="xs:anyURI"/>
+    <xs:attribute ref="xml:lang"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:element name="annotation" id="annotation">
+   <xs:annotation>
+     <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-annotation"/>
+   </xs:annotation>
+   <xs:complexType>
+    <xs:complexContent>
+     <xs:extension base="xs:openAttrs">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+       <xs:element ref="xs:appinfo"/>
+       <xs:element ref="xs:documentation"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:ID"/>
+     </xs:extension>
+    </xs:complexContent>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:annotation>
+  <xs:documentation>
+   notations for use within XML Schema schemas</xs:documentation>
+ </xs:annotation>
+
+ <xs:notation name="XMLSchemaStructures" public="structures" system="http://www.w3.org/2000/08/XMLSchema.xsd"/>
+ <xs:notation name="XML" public="REC-xml-19980210" system="http://www.w3.org/TR/1998/REC-xml-19980210"/>
+  
+ <xs:complexType name="anyType" mixed="true">
+  <xs:annotation>
+   <xs:documentation>
+   Not the real urType, but as close an approximation as we can
+   get in the XML representation</xs:documentation>
+  </xs:annotation>
+  <xs:sequence>
+   <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
+  </xs:sequence>
+  <xs:anyAttribute processContents="lax"/>
+ </xs:complexType>
+
+  <xs:annotation>
+    <xs:documentation>
+      First the built-in primitive datatypes.  These definitions are for
+      information only, the real built-in definitions are magic.
+    </xs:documentation>
+
+    <xs:documentation>
+      For each built-in datatype in this schema (both primitive and
+      derived) can be uniquely addressed via a URI constructed
+      as follows:
+        1) the base URI is the URI of the XML Schema namespace
+        2) the fragment identifier is the name of the datatype
+
+      For example, to address the int datatype, the URI is:
+
+        http://www.w3.org/2001/XMLSchema#int
+
+      Additionally, each facet definition element can be uniquely
+      addressed via a URI constructed as follows:
+        1) the base URI is the URI of the XML Schema namespace
+        2) the fragment identifier is the name of the facet
+
+      For example, to address the maxInclusive facet, the URI is:
+
+        http://www.w3.org/2001/XMLSchema#maxInclusive
+
+      Additionally, each facet usage in a built-in datatype definition
+      can be uniquely addressed via a URI constructed as follows:
+        1) the base URI is the URI of the XML Schema namespace
+        2) the fragment identifier is the name of the datatype, followed
+           by a period (".") followed by the name of the facet
+
+      For example, to address the usage of the maxInclusive facet in
+      the definition of int, the URI is:
+
+        http://www.w3.org/2001/XMLSchema#int.maxInclusive
+
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:simpleType name="string" id="string">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+                source="http://www.w3.org/TR/xmlschema-2/#string"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="preserve" id="string.preserve"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="boolean" id="boolean">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#boolean"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true"
+        id="boolean.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="float" id="float">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="total"/>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+        <hfp:hasProperty name="numeric" value="true"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#float"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true"
+        id="float.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="double" id="double">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="total"/>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+        <hfp:hasProperty name="numeric" value="true"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#double"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="double.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="decimal" id="decimal">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="totalDigits"/>
+        <hfp:hasFacet name="fractionDigits"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="total"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="true"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#decimal"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="decimal.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+   <xs:simpleType name="duration" id="duration">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#duration"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="duration.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+ <xs:simpleType name="dateTime" id="dateTime">
+    <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#dateTime"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="dateTime.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="time" id="time">
+    <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#time"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="time.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="date" id="date">
+   <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#date"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="date.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="gYearMonth" id="gYearMonth">
+   <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#gYearMonth"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="gYearMonth.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="gYear" id="gYear">
+    <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#gYear"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="gYear.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+ <xs:simpleType name="gMonthDay" id="gMonthDay">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+       <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#gMonthDay"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+         <xs:whiteSpace value="collapse" fixed="true"
+                id="gMonthDay.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="gDay" id="gDay">
+    <xs:annotation>
+  <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#gDay"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+         <xs:whiteSpace value="collapse"  fixed="true"
+                id="gDay.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+ <xs:simpleType name="gMonth" id="gMonth">
+    <xs:annotation>
+  <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#gMonth"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+         <xs:whiteSpace value="collapse"  fixed="true"
+                id="gMonth.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+   <xs:simpleType name="hexBinary" id="hexBinary">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#binary"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true"
+        id="hexBinary.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+ <xs:simpleType name="base64Binary" id="base64Binary">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+                source="http://www.w3.org/TR/xmlschema-2/#base64Binary"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true"
+        id="base64Binary.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+   <xs:simpleType name="anyURI" id="anyURI">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#anyURI"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="anyURI.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+  <xs:simpleType name="QName" id="QName">
+    <xs:annotation>
+        <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#QName"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="QName.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+   <xs:simpleType name="NOTATION" id="NOTATION">
+    <xs:annotation>
+        <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#NOTATION"/>
+      <xs:documentation>
+        NOTATION cannot be used directly in a schema; rather a type
+        must be derived from it by specifying at least one enumeration
+        facet whose value is the name of a NOTATION declared in the
+        schema.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse"  fixed="true"
+        id="NOTATION.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:annotation>
+    <xs:documentation>
+      Now the derived primitive types
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:simpleType name="normalizedString" id="normalizedString">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#normalizedString"/>
+    </xs:annotation>
+    <xs:restriction base="xs:string">
+      <xs:whiteSpace value="replace"
+        id="normalizedString.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="token" id="token">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#token"/>
+    </xs:annotation>
+    <xs:restriction base="xs:normalizedString">
+      <xs:whiteSpace value="collapse" id="token.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="language" id="language">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#language"/>
+    </xs:annotation>
+    <xs:restriction base="xs:token">
+      <xs:pattern
+        value="[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*"
+                id="language.pattern">
+        <xs:annotation>
+          <xs:documentation
+                source="http://www.ietf.org/rfc/rfc3066.txt">
+            pattern specifies the content of section 2.12 of XML 1.0e2
+            and RFC 3066 (Revised version of RFC 1766).
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="IDREFS" id="IDREFS">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#IDREFS"/>
+    </xs:annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list itemType="xs:IDREF"/>
+      </xs:simpleType>
+        <xs:minLength value="1" id="IDREFS.minLength"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="ENTITIES" id="ENTITIES">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#ENTITIES"/>
+    </xs:annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list itemType="xs:ENTITY"/>
+      </xs:simpleType>
+        <xs:minLength value="1" id="ENTITIES.minLength"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="NMTOKEN" id="NMTOKEN">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#NMTOKEN"/>
+    </xs:annotation>
+    <xs:restriction base="xs:token">
+      <xs:pattern value="\c+" id="NMTOKEN.pattern">
+        <xs:annotation>
+          <xs:documentation
+                source="http://www.w3.org/TR/REC-xml#NT-Nmtoken">
+            pattern matches production 7 from the XML spec
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="NMTOKENS" id="NMTOKENS">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality"
+                value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#NMTOKENS"/>
+    </xs:annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list itemType="xs:NMTOKEN"/>
+      </xs:simpleType>
+        <xs:minLength value="1" id="NMTOKENS.minLength"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="Name" id="Name">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#Name"/>
+    </xs:annotation>
+    <xs:restriction base="xs:token">
+      <xs:pattern value="\i\c*" id="Name.pattern">
+        <xs:annotation>
+          <xs:documentation
+                        source="http://www.w3.org/TR/REC-xml#NT-Name">
+            pattern matches production 5 from the XML spec
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="NCName" id="NCName">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#NCName"/>
+    </xs:annotation>
+    <xs:restriction base="xs:Name">
+      <xs:pattern value="[\i-[:]][\c-[:]]*" id="NCName.pattern">
+        <xs:annotation>
+          <xs:documentation
+                source="http://www.w3.org/TR/REC-xml-names/#NT-NCName">
+            pattern matches production 4 from the Namespaces in XML spec
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+   <xs:simpleType name="ID" id="ID">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#ID"/>
+    </xs:annotation>
+    <xs:restriction base="xs:NCName"/>
+   </xs:simpleType>
+
+   <xs:simpleType name="IDREF" id="IDREF">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#IDREF"/>
+    </xs:annotation>
+    <xs:restriction base="xs:NCName"/>
+   </xs:simpleType>
+
+   <xs:simpleType name="ENTITY" id="ENTITY">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#ENTITY"/>
+    </xs:annotation>
+    <xs:restriction base="xs:NCName"/>
+   </xs:simpleType>
+
+  <xs:simpleType name="integer" id="integer">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#integer"/>
+    </xs:annotation>
+    <xs:restriction base="xs:decimal">
+      <xs:fractionDigits value="0" fixed="true" id="integer.fractionDigits"/>
+      <xs:pattern value="[\-+]?[0-9]+"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="nonPositiveInteger" id="nonPositiveInteger">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#nonPositiveInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:integer">
+      <xs:maxInclusive value="0" id="nonPositiveInteger.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="negativeInteger" id="negativeInteger">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#negativeInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:nonPositiveInteger">
+      <xs:maxInclusive value="-1" id="negativeInteger.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="long" id="long">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#long"/>
+    </xs:annotation>
+    <xs:restriction base="xs:integer">
+      <xs:minInclusive value="-9223372036854775808" id="long.minInclusive"/>
+      <xs:maxInclusive value="9223372036854775807" id="long.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="int" id="int">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#int"/>
+    </xs:annotation>
+    <xs:restriction base="xs:long">
+      <xs:minInclusive value="-2147483648" id="int.minInclusive"/>
+      <xs:maxInclusive value="2147483647" id="int.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="short" id="short">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#short"/>
+    </xs:annotation>
+    <xs:restriction base="xs:int">
+      <xs:minInclusive value="-32768" id="short.minInclusive"/>
+      <xs:maxInclusive value="32767" id="short.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="byte" id="byte">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#byte"/>
+    </xs:annotation>
+    <xs:restriction base="xs:short">
+      <xs:minInclusive value="-128" id="byte.minInclusive"/>
+      <xs:maxInclusive value="127" id="byte.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="nonNegativeInteger" id="nonNegativeInteger">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#nonNegativeInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:integer">
+      <xs:minInclusive value="0" id="nonNegativeInteger.minInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedLong" id="unsignedLong">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+      </xs:appinfo>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#unsignedLong"/>
+    </xs:annotation>
+    <xs:restriction base="xs:nonNegativeInteger">
+      <xs:maxInclusive value="18446744073709551615"
+        id="unsignedLong.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedInt" id="unsignedInt">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#unsignedInt"/>
+    </xs:annotation>
+    <xs:restriction base="xs:unsignedLong">
+      <xs:maxInclusive value="4294967295"
+        id="unsignedInt.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedShort" id="unsignedShort">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#unsignedShort"/>
+    </xs:annotation>
+    <xs:restriction base="xs:unsignedInt">
+      <xs:maxInclusive value="65535"
+        id="unsignedShort.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedByte" id="unsignedByte">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#unsignedByte"/>
+    </xs:annotation>
+    <xs:restriction base="xs:unsignedShort">
+      <xs:maxInclusive value="255" id="unsignedByte.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="positiveInteger" id="positiveInteger">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#positiveInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:nonNegativeInteger">
+      <xs:minInclusive value="1" id="positiveInteger.minInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+ <xs:simpleType name="derivationControl">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:NMTOKEN">
+   <xs:enumeration value="substitution"/>
+   <xs:enumeration value="extension"/>
+   <xs:enumeration value="restriction"/>
+   <xs:enumeration value="list"/>
+   <xs:enumeration value="union"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:group name="simpleDerivation">
+  <xs:choice>
+    <xs:element ref="xs:restriction"/>
+    <xs:element ref="xs:list"/>
+    <xs:element ref="xs:union"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:simpleType name="simpleDerivationSet">
+  <xs:annotation>
+   <xs:documentation>
+   #all or (possibly empty) subset of {restriction, union, list}
+   </xs:documentation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="#all"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list>
+     <xs:simpleType>
+      <xs:restriction base="xs:derivationControl">
+       <xs:enumeration value="list"/>
+       <xs:enumeration value="union"/>
+       <xs:enumeration value="restriction"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:list>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+  <xs:complexType name="simpleType" abstract="true">
+    <xs:complexContent>
+      <xs:extension base="xs:annotated">
+        <xs:group ref="xs:simpleDerivation"/>
+        <xs:attribute name="final" type="xs:simpleDerivationSet"/>
+        <xs:attribute name="name" type="xs:NCName">
+          <xs:annotation>
+            <xs:documentation>
+              Can be restricted to required or forbidden
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="topLevelSimpleType">
+    <xs:complexContent>
+      <xs:restriction base="xs:simpleType">
+        <xs:sequence>
+          <xs:element ref="xs:annotation" minOccurs="0"/>
+          <xs:group ref="xs:simpleDerivation"/>
+        </xs:sequence>
+        <xs:attribute name="name" use="required"
+             type="xs:NCName">
+          <xs:annotation>
+            <xs:documentation>
+              Required at the top level
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="localSimpleType">
+    <xs:complexContent>
+      <xs:restriction base="xs:simpleType">
+        <xs:sequence>
+          <xs:element ref="xs:annotation" minOccurs="0"/>
+          <xs:group ref="xs:simpleDerivation"/>
+        </xs:sequence>
+        <xs:attribute name="name" use="prohibited">
+          <xs:annotation>
+            <xs:documentation>
+              Forbidden when nested
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="final" use="prohibited"/>
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:element name="simpleType" type="xs:topLevelSimpleType" id="simpleType">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-simpleType"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:group name="facets">
+   <xs:annotation>
+    <xs:documentation>
+       We should use a substitution group for facets, but
+       that's ruled out because it would allow users to
+       add their own, which we're not ready for yet.
+    </xs:documentation>
+   </xs:annotation>
+   <xs:choice>
+    <xs:element ref="xs:minExclusive"/>
+    <xs:element ref="xs:minInclusive"/>
+    <xs:element ref="xs:maxExclusive"/>
+    <xs:element ref="xs:maxInclusive"/>
+    <xs:element ref="xs:totalDigits"/>
+    <xs:element ref="xs:fractionDigits"/>
+    <xs:element ref="xs:length"/>
+    <xs:element ref="xs:minLength"/>
+    <xs:element ref="xs:maxLength"/>
+    <xs:element ref="xs:enumeration"/>
+    <xs:element ref="xs:whiteSpace"/>
+    <xs:element ref="xs:pattern"/>
+   </xs:choice>
+  </xs:group>
+
+  <xs:group name="simpleRestrictionModel">
+   <xs:sequence>
+    <xs:element name="simpleType" type="xs:localSimpleType" minOccurs="0"/>
+    <xs:group ref="xs:facets" minOccurs="0" maxOccurs="unbounded"/>
+   </xs:sequence>
+  </xs:group>
+
+  <xs:element name="restriction" id="restriction">
+   <xs:complexType>
+    <xs:annotation>
+      <xs:documentation
+                source="http://www.w3.org/TR/xmlschema-2/#element-restriction">
+          base attribute and simpleType child are mutually
+          exclusive, but one or other is required
+        </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+        <xs:extension base="xs:annotated">
+         <xs:group ref="xs:simpleRestrictionModel"/>
+         <xs:attribute name="base" type="xs:QName" use="optional"/>
+        </xs:extension>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="list" id="list">
+   <xs:complexType>
+    <xs:annotation>
+      <xs:documentation
+                source="http://www.w3.org/TR/xmlschema-2/#element-list">
+          itemType attribute and simpleType child are mutually
+          exclusive, but one or other is required
+        </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+        <xs:extension base="xs:annotated">
+          <xs:sequence>
+            <xs:element name="simpleType" type="xs:localSimpleType"
+                minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="itemType" type="xs:QName" use="optional"/>
+        </xs:extension>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="union" id="union">
+   <xs:complexType>
+    <xs:annotation>
+      <xs:documentation
+                source="http://www.w3.org/TR/xmlschema-2/#element-union">
+          memberTypes attribute must be non-empty or there must be
+          at least one simpleType child
+        </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+        <xs:extension base="xs:annotated">
+          <xs:sequence>
+            <xs:element name="simpleType" type="xs:localSimpleType"
+                minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="memberTypes" use="optional">
+            <xs:simpleType>
+              <xs:list itemType="xs:QName"/>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:extension>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:complexType name="facet">
+    <xs:complexContent>
+      <xs:extension base="xs:annotated">
+        <xs:attribute name="value" use="required"/>
+        <xs:attribute name="fixed" type="xs:boolean" use="optional"
+                      default="false"/>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+ <xs:complexType name="noFixedFacet">
+  <xs:complexContent>
+   <xs:restriction base="xs:facet">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="fixed" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+  <xs:element name="minExclusive" id="minExclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-minExclusive"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="minInclusive" id="minInclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-minInclusive"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="maxExclusive" id="maxExclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-maxExclusive"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="maxInclusive" id="maxInclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-maxInclusive"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:complexType name="numFacet">
+    <xs:complexContent>
+      <xs:restriction base="xs:facet">
+       <xs:sequence>
+         <xs:element ref="xs:annotation" minOccurs="0"/>
+       </xs:sequence>
+       <xs:attribute name="value" type="xs:nonNegativeInteger" use="required"/>
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:element name="totalDigits" id="totalDigits">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-totalDigits"/>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:complexContent>
+        <xs:restriction base="xs:numFacet">
+          <xs:sequence>
+            <xs:element ref="xs:annotation" minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="value" type="xs:positiveInteger" use="required"/>
+         <xs:anyAttribute namespace="##other" processContents="lax"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="fractionDigits" id="fractionDigits" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-fractionDigits"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="length" id="length" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-length"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="minLength" id="minLength" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-minLength"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="maxLength" id="maxLength" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-maxLength"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="enumeration" id="enumeration" type="xs:noFixedFacet">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-enumeration"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="whiteSpace" id="whiteSpace">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-whiteSpace"/>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:complexContent>
+        <xs:restriction base="xs:facet">
+          <xs:sequence>
+            <xs:element ref="xs:annotation" minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="value" use="required">
+            <xs:simpleType>
+              <xs:restriction base="xs:NMTOKEN">
+                <xs:enumeration value="preserve"/>
+                <xs:enumeration value="replace"/>
+                <xs:enumeration value="collapse"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+         <xs:anyAttribute namespace="##other" processContents="lax"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="pattern" id="pattern">
+    <xs:annotation>
+      <xs:documentation
+        source="http://www.w3.org/TR/xmlschema-2/#element-pattern"/>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:complexContent>
+        <xs:restriction base="xs:noFixedFacet">
+          <xs:sequence>
+            <xs:element ref="xs:annotation" minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="value" type="xs:string" use="required"/>
+         <xs:anyAttribute namespace="##other" processContents="lax"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+</xs:schema>
diff --git a/bundles/org.eclipse.wst.xsd.ui/w3c/datatypes.dtd b/bundles/org.eclipse.wst.xsd.ui/w3c/datatypes.dtd
new file mode 100644
index 0000000..6d51aea
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/w3c/datatypes.dtd
@@ -0,0 +1,203 @@
+<!--
+        DTD for XML Schemas: Part 2: Datatypes
+        $Id: datatypes.dtd,v 1.1 2004/11/24 21:13:41 csalter Exp $
+        Note this DTD is NOT normative, or even definitive. - - the
+        prose copy in the datatypes REC is the definitive version
+        (which shouldn't differ from this one except for this comment
+        and entity expansions, but just in case)
+  -->
+
+<!--
+        This DTD cannot be used on its own, it is intended
+        only for incorporation in XMLSchema.dtd, q.v.
+  -->
+
+<!-- Define all the element names, with optional prefix -->
+<!ENTITY % simpleType "%p;simpleType">
+<!ENTITY % restriction "%p;restriction">
+<!ENTITY % list "%p;list">
+<!ENTITY % union "%p;union">
+<!ENTITY % maxExclusive "%p;maxExclusive">
+<!ENTITY % minExclusive "%p;minExclusive">
+<!ENTITY % maxInclusive "%p;maxInclusive">
+<!ENTITY % minInclusive "%p;minInclusive">
+<!ENTITY % totalDigits "%p;totalDigits">
+<!ENTITY % fractionDigits "%p;fractionDigits">
+<!ENTITY % length "%p;length">
+<!ENTITY % minLength "%p;minLength">
+<!ENTITY % maxLength "%p;maxLength">
+<!ENTITY % enumeration "%p;enumeration">
+<!ENTITY % whiteSpace "%p;whiteSpace">
+<!ENTITY % pattern "%p;pattern">
+
+<!--
+        Customisation entities for the ATTLIST of each element
+        type. Define one of these if your schema takes advantage
+        of the anyAttribute='##other' in the schema for schemas
+  -->
+
+<!ENTITY % simpleTypeAttrs "">
+<!ENTITY % restrictionAttrs "">
+<!ENTITY % listAttrs "">
+<!ENTITY % unionAttrs "">
+<!ENTITY % maxExclusiveAttrs "">
+<!ENTITY % minExclusiveAttrs "">
+<!ENTITY % maxInclusiveAttrs "">
+<!ENTITY % minInclusiveAttrs "">
+<!ENTITY % totalDigitsAttrs "">
+<!ENTITY % fractionDigitsAttrs "">
+<!ENTITY % lengthAttrs "">
+<!ENTITY % minLengthAttrs "">
+<!ENTITY % maxLengthAttrs "">
+<!ENTITY % enumerationAttrs "">
+<!ENTITY % whiteSpaceAttrs "">
+<!ENTITY % patternAttrs "">
+
+<!-- Define some entities for informative use as attribute
+        types -->
+<!ENTITY % URIref "CDATA">
+<!ENTITY % XPathExpr "CDATA">
+<!ENTITY % QName "NMTOKEN">
+<!ENTITY % QNames "NMTOKENS">
+<!ENTITY % NCName "NMTOKEN">
+<!ENTITY % nonNegativeInteger "NMTOKEN">
+<!ENTITY % boolean "(true|false)">
+<!ENTITY % simpleDerivationSet "CDATA">
+<!--
+        #all or space-separated list drawn from derivationChoice
+  -->
+
+<!--
+        Note that the use of 'facet' below is less restrictive
+        than is really intended:  There should in fact be no
+        more than one of each of minInclusive, minExclusive,
+        maxInclusive, maxExclusive, totalDigits, fractionDigits,
+        length, maxLength, minLength within datatype,
+        and the min- and max- variants of Inclusive and Exclusive
+        are mutually exclusive. On the other hand,  pattern and
+        enumeration may repeat.
+  -->
+<!ENTITY % minBound "(%minInclusive; | %minExclusive;)">
+<!ENTITY % maxBound "(%maxInclusive; | %maxExclusive;)">
+<!ENTITY % bounds "%minBound; | %maxBound;">
+<!ENTITY % numeric "%totalDigits; | %fractionDigits;">
+<!ENTITY % ordered "%bounds; | %numeric;">
+<!ENTITY % unordered
+   "%pattern; | %enumeration; | %whiteSpace; | %length; |
+   %maxLength; | %minLength;">
+<!ENTITY % facet "%ordered; | %unordered;">
+<!ENTITY % facetAttr 
+        "value CDATA #REQUIRED
+        id ID #IMPLIED">
+<!ENTITY % fixedAttr "fixed %boolean; #IMPLIED">
+<!ENTITY % facetModel "(%annotation;)?">
+<!ELEMENT %simpleType;
+        ((%annotation;)?, (%restriction; | %list; | %union;))>
+<!ATTLIST %simpleType;
+    name      %NCName; #IMPLIED
+    final     %simpleDerivationSet; #IMPLIED
+    id        ID       #IMPLIED
+    %simpleTypeAttrs;>
+<!-- name is required at top level -->
+<!ELEMENT %restriction; ((%annotation;)?,
+                         (%restriction1; |
+                          ((%simpleType;)?,(%facet;)*)),
+                         (%attrDecls;))>
+<!ATTLIST %restriction;
+    base      %QName;                  #IMPLIED
+    id        ID       #IMPLIED
+    %restrictionAttrs;>
+<!--
+        base and simpleType child are mutually exclusive,
+        one is required.
+
+        restriction is shared between simpleType and
+        simpleContent and complexContent (in XMLSchema.xsd).
+        restriction1 is for the latter cases, when this
+        is restricting a complex type, as is attrDecls.
+  -->
+<!ELEMENT %list; ((%annotation;)?,(%simpleType;)?)>
+<!ATTLIST %list;
+    itemType      %QName;             #IMPLIED
+    id        ID       #IMPLIED
+    %listAttrs;>
+<!--
+        itemType and simpleType child are mutually exclusive,
+        one is required
+  -->
+<!ELEMENT %union; ((%annotation;)?,(%simpleType;)*)>
+<!ATTLIST %union;
+    id            ID       #IMPLIED
+    memberTypes   %QNames;            #IMPLIED
+    %unionAttrs;>
+<!--
+        At least one item in memberTypes or one simpleType
+        child is required
+  -->
+
+<!ELEMENT %maxExclusive; %facetModel;>
+<!ATTLIST %maxExclusive;
+        %facetAttr;
+        %fixedAttr;
+        %maxExclusiveAttrs;>
+<!ELEMENT %minExclusive; %facetModel;>
+<!ATTLIST %minExclusive;
+        %facetAttr;
+        %fixedAttr;
+        %minExclusiveAttrs;>
+
+<!ELEMENT %maxInclusive; %facetModel;>
+<!ATTLIST %maxInclusive;
+        %facetAttr;
+        %fixedAttr;
+        %maxInclusiveAttrs;>
+<!ELEMENT %minInclusive; %facetModel;>
+<!ATTLIST %minInclusive;
+        %facetAttr;
+        %fixedAttr;
+        %minInclusiveAttrs;>
+
+<!ELEMENT %totalDigits; %facetModel;>
+<!ATTLIST %totalDigits;
+        %facetAttr;
+        %fixedAttr;
+        %totalDigitsAttrs;>
+<!ELEMENT %fractionDigits; %facetModel;>
+<!ATTLIST %fractionDigits;
+        %facetAttr;
+        %fixedAttr;
+        %fractionDigitsAttrs;>
+
+<!ELEMENT %length; %facetModel;>
+<!ATTLIST %length;
+        %facetAttr;
+        %fixedAttr;
+        %lengthAttrs;>
+<!ELEMENT %minLength; %facetModel;>
+<!ATTLIST %minLength;
+        %facetAttr;
+        %fixedAttr;
+        %minLengthAttrs;>
+<!ELEMENT %maxLength; %facetModel;>
+<!ATTLIST %maxLength;
+        %facetAttr;
+        %fixedAttr;
+        %maxLengthAttrs;>
+
+<!-- This one can be repeated -->
+<!ELEMENT %enumeration; %facetModel;>
+<!ATTLIST %enumeration;
+        %facetAttr;
+        %enumerationAttrs;>
+
+<!ELEMENT %whiteSpace; %facetModel;>
+<!ATTLIST %whiteSpace;
+        %facetAttr;
+        %fixedAttr;
+        %whiteSpaceAttrs;>
+
+<!-- This one can be repeated -->
+<!ELEMENT %pattern; %facetModel;>
+<!ATTLIST %pattern;
+        %facetAttr;
+        %patternAttrs;>
diff --git a/bundles/org.eclipse.wst.xsd.ui/w3c/xml.xsd b/bundles/org.eclipse.wst.xsd.ui/w3c/xml.xsd
new file mode 100644
index 0000000..ff8add9
--- /dev/null
+++ b/bundles/org.eclipse.wst.xsd.ui/w3c/xml.xsd
@@ -0,0 +1,81 @@
+<?xml version='1.0'?>
+<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" >
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
+
+ <xs:annotation>
+  <xs:documentation>
+   See http://www.w3.org/XML/1998/namespace.html and
+   http://www.w3.org/TR/REC-xml for information about this namespace.
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>This schema defines attributes and an attribute group
+        suitable for use by
+        schemas wishing to allow xml:base, xml:lang or xml:space attributes
+        on elements they define.
+
+        To enable this, such a schema must import this schema
+        for the XML namespace, e.g. as follows:
+        &lt;schema . . .>
+         . . .
+         &lt;import namespace="http://www.w3.org/XML/1998/namespace"
+                    schemaLocation="http://www.w3.org/2001/03/xml.xsd"/>
+
+        Subsequently, qualified reference to any of the attributes
+        or the group defined below will have the desired effect, e.g.
+
+        &lt;type . . .>
+         . . .
+         &lt;attributeGroup ref="xml:specialAttrs"/>
+ 
+         will define a type which will schema-validate an instance
+         element with any of those attributes</xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>In keeping with the XML Schema WG's standard versioning
+   policy, this schema document will persist at
+   http://www.w3.org/2001/03/xml.xsd.
+   At the date of issue it can also be found at
+   http://www.w3.org/2001/xml.xsd.
+   The schema document at that URI may however change in the future,
+   in order to remain compatible with the latest version of XML Schema
+   itself.  In other words, if the XML Schema namespace changes, the version
+   of this document at
+   http://www.w3.org/2001/xml.xsd will change
+   accordingly; the version at
+   http://www.w3.org/2001/03/xml.xsd will not change.
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:attribute name="lang" type="xs:language">
+  <xs:annotation>
+   <xs:documentation>In due course, we should install the relevant ISO 2- and 3-letter
+         codes as the enumerated possible values . . .</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attribute name="space" default="preserve">
+  <xs:simpleType>
+   <xs:restriction base="xs:NCName">
+    <xs:enumeration value="default"/>
+    <xs:enumeration value="preserve"/>
+   </xs:restriction>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="base" type="xs:anyURI">
+  <xs:annotation>
+   <xs:documentation>See http://www.w3.org/TR/xmlbase/ for
+                     information about this attribute.</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+  <xs:attribute ref="xml:base"/>
+  <xs:attribute ref="xml:lang"/>
+  <xs:attribute ref="xml:space"/>
+ </xs:attributeGroup>
+
+</xs:schema>
