8.2.4 and 9.0.4 releases
diff --git a/releases/8.2.4/_index.html b/releases/8.2.4/_index.html
new file mode 100644
index 0000000..7596bc8
--- /dev/null
+++ b/releases/8.2.4/_index.html
@@ -0,0 +1,30 @@
+<div id="midcolumn">
+
+  <h3>Release 8.2.4</h3>
+  
+  <p>This release includes a fix for an invalid thread access exception in TextOverlayPainter. It is a sibling release
+   to the <a href="../9.0.4">9.0.4</a> release and is intended for adopters who are not yet able to require Java 8.</p>
+  
+  <p>Released on 2015-11-20.</p>
+
+  <p>
+    <a href="http://download.eclipse.org/sapphire/8.2.4/repository">Repository</a></br>
+    <a href="http://www.eclipse.org/downloads/download.php?file=/sapphire/8.2.4/sapphire-repository-8.2.4.zip">Offline Repository</a><br/>
+    <a href="http://www.eclipse.org/downloads/download.php?file=/sapphire/8.2.4/sapphire-samples-8.2.4.zip">Samples</a><br/>
+  </p>
+
+  <p>
+    <a href="documentation/index.html">Developer Guide</a>
+  </p>
+
+  <p>
+    <a href="https://bugs.eclipse.org/bugs/report.cgi?x_axis_field=bug_status&y_axis_field=bug_severity&z_axis_field=&query_format=report-table&short_desc_type=allwordssubstr&short_desc=&classification=Technology&product=Sapphire&target_milestone=8.2.4&longdesc_type=allwordssubstr&longdesc=&bug_file_loc_type=allwordssubstr&bug_file_loc=&status_whiteboard_type=allwordssubstr&status_whiteboard=&keywords_type=allwords&keywords=&emailtype1=substring&email1=&emailtype2=substring&email2=&bug_id_type=anyexact&bug_id=&votes=&chfieldfrom=&chfieldto=Now&chfieldvalue=&format=table&action=wrap&field0-0-0=noop&type0-0-0=noop&value0-0-0=">Bugzilla</a><br/>
+  </p>
+
+</div>
+
+<div id="rightcolumn">
+
+  <center><img src="http://www.eclipse.org/sapphire/images/SapphireLogo-150.png" border="0" alt="Sapphire Logo"/></center>
+
+</div>
diff --git a/releases/8.2.4/documentation/ExtensiblePersistentState/index.html b/releases/8.2.4/documentation/ExtensiblePersistentState/index.html
new file mode 100644
index 0000000..8ff550e
--- /dev/null
+++ b/releases/8.2.4/documentation/ExtensiblePersistentState/index.html
@@ -0,0 +1,355 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Extensible Persistent State</title>
+  <link rel="StyleSheet" href="../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > </div>
+
+
+<h1>Extensible Persistent State</h1>
+
+<p>Editor pages are able to persist user interface state between sessions independent of the data 
+that is being edited. What state is persisted is dependent on editor page type. Two common examples of
+persistent state are sizing of resizable elements and selection. The persistent state is now extensible,
+allowing adopters to persist custom data.</p>
+
+<p>The recommended approach is to extend the page's persistent state element type to add custom properties.
+The custom element type for persistent state is specified in sdef.</p> 
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In the catalog sample, a toggle action controls whether the manufacturer name is shown
+in the catalog item label. The state of this toggle is persisted by extending the state of the editor page. The
+persistent state is also used for communication between the toggle and the item label.</p>
+
+<pre class="source-code"><code>public interface CatalogEditorPageState extends MasterDetailsEditorPageState
+{
+    ElementType TYPE = new ElementType( CatalogEditorPageState.class );
+
+    // *** ShowManufacturer ***
+
+    @Type( base = Boolean.class )
+    @DefaultValue( text = "false" )
+
+    ValueProperty PROP_SHOW_MANUFACTURER = new ValueProperty( TYPE, "ShowManufacturer" );
+
+    Value&lt;Boolean> getShowManufacturer();
+    void setShowManufacturer( String value );
+    void setShowManufacturer( Boolean value );
+}</code></pre>
+
+<p style="margin-left: 20px;">The custom state element type is attached to the editor page in sdef.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;editor-page></font>
+    &lt;persistent-state-element-type>org.eclipse.sapphire.samples.catalog.CatalogEditorPageState&lt;/persistent-state-element-type>
+<font color="#888888">&lt;/editor-page></font></code></pre>
+
+<p style="margin-left: 20px;">The toggle action handler only interacts with the editor page state.</p>
+
+<pre class="source-code"><code>public final class ShowManufacturerActionHandler extends SapphireActionHandler 
+{
+    private CatalogEditorPageState state;
+
+    @Override
+    public void init( final SapphireAction action, final ActionHandlerDef def )
+    {
+        super.init( action, def );
+
+        this.state = (CatalogEditorPageState) getPart().nearest( SapphireEditorPagePart.class ).state();
+
+        final Listener listener = new FilteredListener&lt;PropertyContentEvent>()
+        {
+            @Override
+            protected void handleTypedEvent( final PropertyContentEvent event )
+            {
+                setChecked( ShowManufacturerActionHandler.this.state.getShowManufacturer().getContent() );
+            }
+        };
+
+        this.state.attach( listener, CatalogEditorPageState.PROP_SHOW_MANUFACTURER );
+
+        setChecked( this.state.getShowManufacturer().getContent() );
+
+        attach
+        (
+            new FilteredListener&lt;DisposeEvent>()
+            {
+                @Override
+                protected void handleTypedEvent( final DisposeEvent event )
+                {
+                    ShowManufacturerActionHandler.this.state.detach( listener, CatalogEditorPageState.PROP_SHOW_MANUFACTURER );
+                }
+            }
+        );
+    }
+
+    @Override
+    protected Object run( final SapphireRenderingContext context )
+    {
+        this.state.setShowManufacturer( ! this.state.getShowManufacturer().getContent() );
+
+        return null;
+    }
+}</code></pre>
+
+<p style="margin-left: 20px;">The toggle action and its handler are defined in sdef.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;editor-page></font>
+    &lt;action>
+        &lt;id>Sample.ShowManufacturer&lt;/id>
+        &lt;label>Show Manufacturer&lt;/label>
+        &lt;image>ShowManufacturer.png&lt;/image>
+        &lt;type>TOGGLE&lt;/type>
+        &lt;context>Sapphire.EditorPage&lt;/context>
+        &lt;location>before:Sapphire.Outline.Hide&lt;/location>
+    &lt;/action>
+    &lt;action-handler>
+        &lt;action>Sample.ShowManufacturer&lt;/action>
+        &lt;id>Sample.ShowManufacturer&lt;/id>
+        &lt;impl>ShowManufacturerActionHandler&lt;/impl>
+    &lt;/action-handler>
+<font color="#888888">&lt;/editor-page></font></code></pre>
+
+<p style="margin-left: 20px;">Finally, the content outline node label for a catalog item is defined using an expression that reads
+the editor page state to determine whether to include the manufacturer in the label. The label automatically updates when any
+of the properties utilized in the expression are changed.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;node-factory>
+    &lt;property>Items&lt;/property>
+    &lt;case>
+        &lt;label></font>${ Name == null ? &quot;&lt;item&gt;&quot; : ( State().ShowManufacturer &amp;&amp; Manufacturer != null ? Concat( Manufacturer, &quot; &quot;, Name ) : Name ) }<font color="#888888">&lt;/label>
+    &lt;/case>
+&lt;/node-factory></font></code></pre>
+
+<p>Alternatively, custom state can be stored as arbitrary key-value pairs without extending the persistent state element.
+All of the system-provided state element types include an Attributes property for this purpose. To make it easier to
+work with the Attributes property, methods are provided to read and write attributes by name. These methods leverage
+<a href="../services/ConversionService.html">all conversions known to Sapphire</a>, so it is typically not necessary
+to manually convert the values to and from a string.</p>
+
+<p>This approach should only be used in situations when extending the persistent state element is not practical
+or possible. State stored as attributes is harder to access. For instance, unlike actual properties, attributes
+cannot be directly accessed from EL.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In the catalog sample, a toggle action controls whether the catalog items
+are color-coded by manufacturer. The state of this toggle is persisted as an attribute.</p>
+
+<pre class="source-code"><code>public final class ShowManufacturerColorActionHandler extends SapphireActionHandler 
+{
+    public static final String ATTRIBUTE = "ColorCode";
+
+    private CatalogEditorPageState state;
+
+    @Override
+    public void init( final SapphireAction action, final ActionHandlerDef def )
+    {
+        super.init( action, def );
+
+        this.state = (CatalogEditorPageState) getPart().nearest( SapphireEditorPagePart.class ).state();
+
+        final Listener listener = new FilteredListener&lt;PropertyContentEvent>()
+        {
+            @Override
+            protected void handleTypedEvent( final PropertyContentEvent event )
+            {
+                setChecked( ShowManufacturerColorActionHandler.this.state.getAttribute( ATTRIBUTE, false ) );
+            }
+        };
+
+        this.state.attach( listener, CatalogEditorPageState.PROP_ATTRIBUTES.getName() + "/*" );
+
+        setChecked( this.state.getAttribute( ATTRIBUTE, false ) );
+
+        attach
+        (
+            new FilteredListener&lt;DisposeEvent>()
+            {
+                @Override
+                protected void handleTypedEvent( final DisposeEvent event )
+                {
+                    ShowManufacturerColorActionHandler.this.state.detach( listener, CatalogEditorPageState.PROP_ATTRIBUTES.getName() + "/*" );
+                }
+            }
+        );
+    }
+
+    @Override
+    protected Object run( final SapphireRenderingContext context )
+    {
+        this.state.setAttribute( ATTRIBUTE, ! this.state.getAttribute( ATTRIBUTE, false ) );
+
+        return null;
+    }
+}</code></pre>
+
+<p style="margin-left: 20px;">The toggle action and its handler are defined in sdef.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;editor-page></font>
+    &lt;action>
+        &lt;id>Sample.ShowManufacturerColor&lt;/id>
+        &lt;label>Color Code Manufacturers&lt;/label>
+        &lt;image>ItemPurple.png&lt;/image>
+        &lt;type>TOGGLE&lt;/type>
+        &lt;context>Sapphire.EditorPage&lt;/context>
+        &lt;location>after:Sample.ShowManufacturer&lt;/location>
+        &lt;location>before:Sapphire.Outline.Hide&lt;/location>
+    &lt;/action>
+    &lt;action-handler>
+        &lt;action>Sample.ShowManufacturerColor&lt;/action>
+        &lt;id>Sample.ShowManufacturerColor&lt;/id>
+        &lt;impl>ShowManufacturerColorActionHandler&lt;/impl>
+    &lt;/action-handler>
+<font color="#888888">&lt;/editor-page></font></code></pre>
+
+<p style="margin-left: 20px;">A custom EL function is used to read the state attribute and to derive a color code item image
+based on the manufacturer.</p>
+
+<pre class="source-code"><code>public final class ItemImageFunction extends Function
+{
+    private final ImageData IMAGE_GENERIC = ImageData.createFromClassLoader( ItemImageFunction.class, "Item.png" );
+
+    private final ImageData[] IMAGES =
+    {
+        ImageData.createFromClassLoader( ItemImageFunction.class, "ItemBlue.png" ),
+        ImageData.createFromClassLoader( ItemImageFunction.class, "ItemGreen.png" ),
+        ImageData.createFromClassLoader( ItemImageFunction.class, "ItemOrange.png" ),
+        ImageData.createFromClassLoader( ItemImageFunction.class, "ItemPurple.png" ),
+        ImageData.createFromClassLoader( ItemImageFunction.class, "ItemRed.png" ),
+        ImageData.createFromClassLoader( ItemImageFunction.class, "ItemTurquoise.png" ),
+        ImageData.createFromClassLoader( ItemImageFunction.class, "ItemYellow.png" )
+    };
+
+    @Override
+    public String name()
+    {
+        return "CatalogItemImage";
+    }
+
+    @Override
+    public FunctionResult evaluate( final FunctionContext context )
+    {
+        if( context instanceof PartFunctionContext )
+        {
+            final SapphirePart part = ( (PartFunctionContext) context ).part();
+            final MasterDetailsEditorPagePart page = part.nearest( MasterDetailsEditorPagePart.class );
+
+            if( page != null )
+            {
+                final Element element = part.getLocalModelElement();
+
+                if( element instanceof Item )
+                {
+                    final Item item = (Item) element;
+                    final MasterDetailsEditorPageState state = page.state();
+
+                    return new FunctionResult( this, context )
+                    {
+                        private Listener listener;
+
+                        @Override
+                        protected void init()
+                        {
+                            this.listener = new FilteredListener&lt;PropertyContentEvent>()
+                            {
+                                @Override
+                                protected void handleTypedEvent( final PropertyContentEvent event )
+                                {
+                                    refresh();
+                                }
+                            };
+
+                            state.attach( this.listener, MasterDetailsEditorPageState.PROP_ATTRIBUTES.getName() + "/*" );
+                            element.attach( this.listener, Item.PROP_MANUFACTURER );
+                        }
+
+                        @Override
+                        protected Object evaluate()
+                        {
+                            final boolean color = state.getAttribute( ShowManufacturerColorActionHandler.ATTRIBUTE, false );
+
+                            if( color )
+                            {
+                                final String manufacturer = item.getManufacturer().getContent();
+                                final int hashCode = ( manufacturer == null ? 0 : manufacturer.hashCode() );
+                                final int index = abs( hashCode ) % IMAGES.length;
+
+                                return IMAGES[ index ];
+                            }
+                            else
+                            {
+                                return IMAGE_GENERIC;
+                            }
+                        }
+
+                        @Override
+                        public void dispose()
+                        {
+                            super.dispose();
+
+                            if( this.listener != null )
+                            {
+                                state.detach( this.listener, MasterDetailsEditorPageState.PROP_ATTRIBUTES.getName() + "/*" );
+                                element.detach( this.listener, Item.PROP_MANUFACTURER );
+
+                                this.listener = null;
+                            }
+                        }
+                    };
+                }
+            }
+        }
+
+        throw new FunctionException( "CatalogItemImage() function cannot be used in this context.");
+    }
+}</code></pre>
+
+<p style="margin-left: 20px;">The CatalogItemImage() function is registered as a Sapphire extension.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;extension></font>
+    &lt;function>
+        &lt;name>CatalogItemImage&lt;/name>
+        &lt;impl>org.eclipse.sapphire.samples.catalog.ItemImageFunction&lt;/impl>
+    &lt;/function>
+<font color="#888888">&lt;/extension></font></code></pre>
+
+<p style="margin-left: 20px;">Finally, the content outline node image for a catalog item is defined using a simple expression 
+that references the CatalogItemImage() function.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;node-factory>
+    &lt;property>Items&lt;/property>
+    &lt;case>
+        &lt;image></font>${ CatalogItemImage() }<font color="#888888">&lt;/image>
+    &lt;/case>
+&lt;/node-factory></font></code></pre>
+
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
diff --git a/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Horizontal-1.png b/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Horizontal-1.png
new file mode 100644
index 0000000..42564bc
--- /dev/null
+++ b/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Horizontal-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Horizontal-2.png b/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Horizontal-2.png
new file mode 100644
index 0000000..8f7805e
--- /dev/null
+++ b/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Horizontal-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Vertical-1.png b/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Vertical-1.png
new file mode 100644
index 0000000..c0e6236
--- /dev/null
+++ b/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Vertical-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Vertical-2.png b/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Vertical-2.png
new file mode 100644
index 0000000..dcdf104
--- /dev/null
+++ b/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/Example-Vertical-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/index.html b/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/index.html
new file mode 100644
index 0000000..0ebd5f9
--- /dev/null
+++ b/releases/8.2.4/documentation/Forms/SWT/CheckBoxGroup/index.html
@@ -0,0 +1,84 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Check Box Group</title>
+  <link rel="StyleSheet" href="../../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Forms</a> > <a href="index.html">SWT</a></div>
+
+
+<h1>Check Box Group</h1>
+
+<p>The check box group is one of the presentation alternatives for a possible values list. This
+presentation has the advantage of being compact, but should only be used in cases where the set
+of possible values is known to always be small.</p>
+
+<p>The check boxes can be arranged either horizontally or vertically.</p>
+
+<p style="margin-left: 20px;"><img src="Example-Horizontal-1.png"/></p>
+
+<p style="margin-left: 20px;"><img src="Example-Vertical-1.png"/></p>
+
+<p>The presentation will utilize ValueImageService and ValueLabelService, if present on the list entry's
+value property. The services must be attached to the value property's global service context.</p>
+
+<p style="margin-left: 20px;"><img src="Example-Horizontal-2.png"/></p>
+
+<p style="margin-left: 20px;"><img src="Example-Vertical-2.png"/></p>
+
+<h2>Applicability</h2>
+
+<ol>
+  <li>The property is a list property</li>
+  <li>The list property has a PossibleValuesService</li>
+  <li>There is exactly one possible member type</li>
+  <li>The member type has exactly one property and that property is a value property</li>
+  <li>The value property has @Unique annotation</li>
+</ol>
+
+<h2>Automatic Activation</h2>
+
+<p>This presentation does not activate automatically.</p>
+
+<h2>Manual Activation</h2>
+
+<p>The following style codes will activate this presentation as long as the applicability conditions are met.</p>
+
+<ul>
+  <li>Sapphire.PropertyEditor.CheckBoxGroup <span class="deemphasized">- <i>produces horizontal presentation</i></span></li>
+  <li>Sapphire.PropertyEditor.CheckBoxGroup.Horizontal</li>
+  <li>Sapphire.PropertyEditor.CheckBoxGroup.Vertical</li>
+</ul>
+
+<pre class="source-code"><code><span class="deemphasized">&lt;property-editor>
+    &lt;property>Colors&lt;/property></span>
+    &lt;style>Sapphire.PropertyEditor.CheckBoxGroup.Vertical&lt;/style>
+<span class="deemphasized">&lt;/property-editor></span></code></pre>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/Forms/SWT/index.html b/releases/8.2.4/documentation/Forms/SWT/index.html
new file mode 100644
index 0000000..342f9a8
--- /dev/null
+++ b/releases/8.2.4/documentation/Forms/SWT/index.html
@@ -0,0 +1,44 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>SWT</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Forms</a></div>
+
+
+<h1>SWT</h1>
+
+<ul>
+  <li><a href="CheckBoxGroup/index.html">Check Box Group</a></li>
+</ul>
+
+<br/><br/>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/Forms/index.html b/releases/8.2.4/documentation/Forms/index.html
new file mode 100644
index 0000000..04ada42
--- /dev/null
+++ b/releases/8.2.4/documentation/Forms/index.html
@@ -0,0 +1,44 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>SWT</title>
+  <link rel="StyleSheet" href="../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > </div>
+
+
+<h1>Forms</h1>
+
+<ul>
+  <li><a href="SWT/index.html">SWT</a></li>
+</ul>
+
+<br/><br/>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/actions/images/action-link.png b/releases/8.2.4/documentation/actions/images/action-link.png
new file mode 100644
index 0000000..8ee4fbe
--- /dev/null
+++ b/releases/8.2.4/documentation/actions/images/action-link.png
Binary files differ
diff --git a/releases/8.2.4/documentation/actions/index.html b/releases/8.2.4/documentation/actions/index.html
new file mode 100644
index 0000000..537d9d0
--- /dev/null
+++ b/releases/8.2.4/documentation/actions/index.html
@@ -0,0 +1,660 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Actions</title>
+  <link rel="StyleSheet" href="../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > </div>
+
+
+<h1>Actions</h1>
+
+<p>Every Sapphire UI part can expose operations that the user can invoke. These operations are called actions. While
+Sapphire does not prescribe how actions are surfaced to the user, a typical presentation would use buttons, menu items
+or links.</p>
+
+<p>This documents covers the API for defining actions, contributing handlers and other related topics.</p>
+
+<p>Table of Contents</p>
+
+<ol>
+  <li><a href="#actions">Actions</a></li>
+  <li><a href="#handlers">Handlers</a></li>
+  <li><a href="#handler-factories">Handler Factories</a></li>
+  <li><a href="#filters">Filters</a></li>
+  <li><a href="#links">Links</a></li>
+  <li><a href="#contexts">Contexts</a></li>
+  <li><a href="#extensions">Extensions</a></li>
+</ol>
+
+<a name="actions"><h2>Actions</h2></a>
+
+<p>An action is an abstract definition of an operation that a user may want to perform. It does not have a concrete
+implementation. That is provided by handlers that are attached separately. An action simply defines appearance,
+applicability and access.</p>
+
+<p>An action that does not have at least one active handler will not be presented to the user. This makes it possible
+to define actions fairly widely and only provide handlers in situations where it makes sense. By defining the action
+once instead of on every use, we are guaranteed the consistency of presentation.</p>
+
+<p><b>Example</b></p>
+
+<p>In this example, a message box action is declared. Note that the definition includes appearance (label and image)
+and presentation (location hints and key binding), but no sign of the implementation. The handler would need to be
+contributed separately. The handler definition would reference action id.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;action>
+        &lt;id>MessageBoxAction&lt;/id>
+        &lt;label>message&lt;/label>
+        &lt;image>org/eclipse/sapphire/samples/gallery/BalloonYellow.png&lt;/image>
+        &lt;location>after:Sapphire.Browse&lt;/location>
+        &lt;location>before:Sapphire.Create&lt;/location>
+        &lt;key-binding>SHIFT+CONTROL+ALT+m&lt;/key-binding>
+    &lt;/action>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<p><b>Details</b></p>
+
+<table>
+  <tr>
+    <th>Element</th>
+    <th>Cardinality</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>condition</td>
+    <td>0 or 1</td>
+    <td>
+A condition allows use of arbitrary logic to control whether the action is going to be available or not in a given situation. Conditions must extends SapphireCondition class.
+    </td>
+  </tr>
+  <tr>
+    <td>context</td>
+    <td>0 or more</td>
+    <td>
+Every UI part that supports actions will define one or more context. An action can be constrained to apply only to the specified contexts. If no context is specified, the action will be treated as applicable to all contexts.
+    </td>
+  </tr>
+  <tr>
+    <td>description</td>
+    <td>0 or 1</td>
+    <td>
+Provides more information about the action than what is available in the label. The description should be in the form of properly capitalized and punctuated sentences.
+    </td>
+  </tr>
+  <tr>
+    <td>group</td>
+    <td>0 or 1</td>
+    <td>
+Specifies the ID of the group that this action belongs to, if any. Groups are used to visually segregate actions. Groups are created on first use. They do not need to be explicitly defined.<br/><br/>The exact way to segregate groups is dependent on the presentation, but typical presentations use separator lines.
+    </td>
+  </tr>
+  <tr>
+    <td>hint</td>
+    <td>0 or more</td>
+    <td>
+&nbsp;
+<br/><br/>
+<table>
+  <tr>
+    <th>Element</th>
+    <th>Cardinality</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>name</td>
+    <td>1</td>
+    <td>
+&nbsp;
+    </td>
+  </tr>
+  <tr>
+    <td>value</td>
+    <td>1</td>
+    <td>
+&nbsp;
+    </td>
+  </tr>
+</table>
+
+<br/>
+    </td>
+  </tr>
+  <tr>
+    <td>id</td>
+    <td>1</td>
+    <td>
+An action ID serves to uniquely identify an action for a variety of purposes, such as defining an action handler or controlling ordering of actions via location hints. An ID only needs to be unique in the contexts where the action is expected to be used. To help avoid conflicts with other extensions, prefix the ID with company, organization or product name.
+    </td>
+  </tr>
+  <tr>
+    <td>image</td>
+    <td>0 or more</td>
+    <td>
+One or more images can be associated with an action to be used by the presentation as appropriate. If an image is necessary, the presentation will look for an image of the appropriate size.
+    </td>
+  </tr>
+  <tr>
+    <td>key-binding</td>
+    <td>0 or 1</td>
+    <td>
+A key binding defines how an action is accessed via the keyboard as a sequence of key presses. Separate multiple keys in a sequence with a '+' (plus) character.<br/><br/>Example: CONTROL+SHIFT+A<br/><br/>Legal Keys<ul><li>Any character from ASCII.</li><li>ALT</li><li>CONTROL</li><li>SHIFT</li><li>DEL</li><li>ARROW_UP</li><li>ARROW_DOWN</li></ul>
+    </td>
+  </tr>
+  <tr>
+    <td>key-binding-behavior</td>
+    <td>0 or 1</td>
+    <td>
+A key binding can be restricted to the action's part (local) or propagated to child parts. Key bindings on local actions take priority over propagated actions.
+    </td>
+  </tr>
+  <tr>
+    <td>label</td>
+    <td>1</td>
+    <td>
+An action label is used when presenting the action to the user.<br/><br/>The exact way that the label is used is dependent on the presentation, but typical presentations use labels for menu item names and as tooltips.<br/><br/>A label should only capitalize words that must remain capitalized regardless of context (proper nouns and acronyms). Words that are not already capitalized will be capitalized as necessary depending on how the label is used by the presentation.
+    </td>
+  </tr>
+  <tr>
+    <td>tooltip</td>
+    <td>0 or 1</td>
+    <td>
+&nbsp;
+    </td>
+  </tr>
+  <tr>
+    <td>type</td>
+    <td>0 or 1</td>
+    <td>
+An action can be a push action or a toggle action. Unlike a push action, a toggle action has distinct on/off states that are made visible by the presentation.<br/><br/>The exact method for how a toggle is presented is dependent on the presentation, but typical presentations use check marks next to menu items or recessed state for buttons.
+    </td>
+  </tr>
+</table>
+
+
+
+<a name="handlers"><h2>Handlers</h2></a>
+
+<p>An action handler is what performs the actual work for an action. Handlers can be contributed by multiple parties
+and multiple handlers can be active at the same time. If multiple handlers are active, the user will typically be
+given a choice of which handler to invoke. Exactly how the choice is presented is dependent on the presentation
+layer, but a common approach is to use a cascading menu or a popup menu that is activated when user clicks on an action 
+button.</p>
+
+<p><b>Example</b></p>
+
+<p>In this example, a handler is contributed for a browse action. The handler simply opens a dialog with a message.</p> 
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;action-handler>
+        &lt;action>Sapphire.Browse&lt;/action>
+        &lt;impl>MessageBoxActionHandler&lt;/impl>
+    &lt;/action-handler>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<pre class="source-code"><code>public class MessageBoxActionHandler extends SapphireActionHandler
+{
+    @Override
+    protected Object run( SapphireRenderingContext context )
+    {
+        MessageDialog.openInformation( context.getShell(), "Message", "Hello World!" );
+        return null;
+    }
+}</code></pre>
+
+<p><b>Details</b></p>
+
+<table>
+  <tr>
+    <th>Element</th>
+    <th>Cardinality</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>action</td>
+    <td>1</td>
+    <td>
+The ID of the action that this handler is for.
+    </td>
+  </tr>
+  <tr>
+    <td>condition</td>
+    <td>0 or 1</td>
+    <td>
+A condition allows use of arbitrary logic to control whether the action handler is going to be available or not in a given situation. Conditions must extends SapphireCondition class.
+    </td>
+  </tr>
+  <tr>
+    <td>context</td>
+    <td>0 or more</td>
+    <td>
+Every UI part that supports actions will define one or more context. An action handler can be constrained to apply only to the specified contexts. If no context is specified, the action handler will be treated as applicable to all contexts.
+    </td>
+  </tr>
+  <tr>
+    <td>description</td>
+    <td>0 or 1</td>
+    <td>
+Provides more information about the action handler than what is available in the label. The description should be in the form of properly capitalized and punctuated sentences.
+    </td>
+  </tr>
+  <tr>
+    <td>id</td>
+    <td>0 or 1</td>
+    <td>
+An action handler ID serves to uniquely identify an action for a variety of purposes, such as controlling ordering of action handlers via location hints. An ID only needs to be unique in the contexts where the action handler is expected to be used. To help avoid conflicts with other extensions, prefix the ID with company, organization or product name.<br/><br/>Note that action handler ID can also be set in the implementation.
+    </td>
+  </tr>
+  <tr>
+    <td>image</td>
+    <td>0 or more</td>
+    <td>
+One or more images can be associated with an action handler to be used by the presentation as appropriate. If an image is necessary, the presentation will look for an image of the appropriate size.<br/><br/>Note that images can also be set in the implementation.
+    </td>
+  </tr>
+  <tr>
+    <td>impl</td>
+    <td>1</td>
+    <td>
+The action handler implementation class. Must extend SapphireActionHandler.
+    </td>
+  </tr>
+  <tr>
+    <td>label</td>
+    <td>0 or 1</td>
+    <td>
+An action handler label is used when presenting the action handler to the user.<br/><br/>The exact way that the label is used is dependent on the presentation, but typical presentations use labels for menu item names and as tooltips.<br/><br/>A label should only capitalize words that must remain capitalized regardless of context (proper nouns and acronyms). Words that are not already capitalized will be capitalized as necessary depending on how the label is used by the presentation.<br/><br/>Note that action handler label can also be set in the implementation.
+    </td>
+  </tr>
+  <tr>
+    <td>param</td>
+    <td>0 or more</td>
+    <td>
+Parameters that can be interpreted by the action handler.
+<br/><br/>
+<table>
+  <tr>
+    <th>Element</th>
+    <th>Cardinality</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>name</td>
+    <td>1</td>
+    <td>
+The name of the parameter.
+    </td>
+  </tr>
+  <tr>
+    <td>value</td>
+    <td>1</td>
+    <td>
+The value of the parameter.
+    </td>
+  </tr>
+</table>
+
+<br/>
+    </td>
+  </tr>
+  <tr>
+    <td>tooltip</td>
+    <td>0 or 1</td>
+    <td>
+&nbsp;
+    </td>
+  </tr>
+</table>
+
+
+
+<a name="handler-factories"><h2>Handler Factories</h2></a>
+
+<p>Sometimes it is necessary to be able to create handlers dynamically based on information that isn't known until
+runtime. When you contribute a handler, that handler is either activated or not depending on the provided condition. 
+When you contribute a handler factory, the factory can decide at runtime how many handlers to contribute.</p>
+
+<p><b>Example</b></p>
+
+<p>In this example, a handler factory is contribute for a browse action. The factory in turn contributes a handler for every
+file in the specified folder. Activating one of these handlers sets the property value to the absolute path of the file.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;action-handler-factory>
+        &lt;action>Sapphire.Browse&lt;/action>
+        &lt;impl>KeyFolderBrowseHandlerFactory&lt;/impl>
+        &lt;param>
+            &lt;name>folder&lt;/name>
+            &lt;value>c:\samples&lt;/value>
+        &lt;/param>
+    &lt;/action-handler-factory>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<pre class="source-code"><code>public class KeyFolderBrowseHandlerFactory extends SapphireActionHandlerFactory
+{
+    private File folder;
+
+    @Override
+    public void init( SapphireAction action, ISapphireActionHandlerFactoryDef def )
+    {
+        super.init( action, def );
+        this.folder = new File( def.getParam( "folder" ) );
+    }
+
+    @Override
+    public List<SapphireActionHandler> create()
+    {
+        List<SapphireActionHandler> handlers = new ArrayList<SapphireActionHandler>();
+
+        for( File file : this.folder.listFiles() )
+        {
+            if( file.isFile() )
+            {
+                handlers.add( new Handler( file ) );
+            }
+        }
+
+        return handlers;
+    }
+
+    private static class Handler extends SapphireBrowseActionHandler
+    {
+        private final File file;
+
+        public Handler( File file )
+        {
+            this.file = file;
+            setLabel( this.file.getName() );
+        }
+
+        @Override
+        protected String browse( Presentation context )
+        {
+            return this.file.getAbsolutePath();
+        }
+    }
+}</code></pre>
+
+<p><b>Details</b></p>
+
+<table>
+  <tr>
+    <th>Element</th>
+    <th>Cardinality</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>action</td>
+    <td>1</td>
+    <td>
+The ID of the action that this factory is to provide handlers for.
+    </td>
+  </tr>
+  <tr>
+    <td>condition</td>
+    <td>0 or 1</td>
+    <td>
+A condition allows use of arbitrary logic to control whether the action handler factory is going to be available or not in a given situation. Conditions must extends SapphireCondition class.
+    </td>
+  </tr>
+  <tr>
+    <td>context</td>
+    <td>0 or more</td>
+    <td>
+Every UI part that supports actions will define one or more context. An action handler factory can be constrained to apply only to the specified contexts. If no context is specified, the action handler factory will be treated as applicable to all contexts.
+    </td>
+  </tr>
+  <tr>
+    <td>description</td>
+    <td>0 or 1</td>
+    <td>
+Provides information about the action handler factory. The description should be in the form of properly capitalized and punctuated sentences.
+    </td>
+  </tr>
+  <tr>
+    <td>impl</td>
+    <td>1</td>
+    <td>
+The action handler factory implementation class. Must extend SapphireActionHandlerFactory.
+    </td>
+  </tr>
+  <tr>
+    <td>param</td>
+    <td>0 or more</td>
+    <td>
+Parameters that can be interpreted by the action handler factory.
+<br/><br/>
+<table>
+  <tr>
+    <th>Element</th>
+    <th>Cardinality</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>name</td>
+    <td>1</td>
+    <td>
+The name of the parameter.
+    </td>
+  </tr>
+  <tr>
+    <td>value</td>
+    <td>1</td>
+    <td>
+The value of the parameter.
+    </td>
+  </tr>
+</table>
+
+<br/>
+    </td>
+  </tr>
+</table>
+
+
+
+<a name="filters"><h2>Filters</h2></a>
+
+<p>In some scenarios it is useful to be able to suppress an action handler for a particular UI part 
+that might otherwise be relevant. The action handler in question may have been contributed globally via
+Sapphire's extensions mechanism, but it just doesn't make sense in a given context. The mechanism 
+for accomplishing this is action handler filters.</p>
+
+<p>Filters are specified when defining a UI part. A filter implementation must extend SapphireActionHandlerFilter
+class. Note that a filter returns true for what should be kept, so false should be returned for handlers
+that should be filtered out.</p>
+
+<p><b>Example</b></p>
+
+<p>In this example, a very simple filter is applied that removes all browse action handlers. Since an action
+will not be surfaced unless it has active handlers, this is equivalent to removing the browse action.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;action-handler-filter>
+        &lt;impl>MyFilter&lt;/impl>
+    &lt;/property-editor>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<pre class="source-code"><code>public class MyFilter extends SapphireActionHandlerFilter
+{
+    @Override
+    public boolean check( SapphireActionHandler handler )
+    {
+        return ( ! handler.getAction().getId().equals( "Sapphire.Browse" ) );
+    }
+}</code></pre>
+
+<p><b>Details</b></p>
+
+<table>
+  <tr>
+    <th>Element</th>
+    <th>Cardinality</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>context</td>
+    <td>0 or more</td>
+    <td>
+Every UI part that supports actions will define one or more context. An action handler filter can be constrained to apply only to the specified contexts. If no context is specified, the action handler filter will be treated as applicable to all contexts.
+    </td>
+  </tr>
+  <tr>
+    <td>impl</td>
+    <td>1</td>
+    <td>
+The action handler filter implementation class. Must extend SapphireActionHandlerFilter.
+    </td>
+  </tr>
+</table>
+
+
+
+<a name="links"><h2>Links</h2></a>
+
+<p>Sometimes it is useful to present an adhoc link that is wired a specific action. This can be done with an action
+link, which is a UI part in its own right. An action link specifies the ID of the action that should be invoked when
+user clicks on the link. The action and its handler can be defined locally in the action link's definition. 
+Alternatively, the part hierarchy above the action link is searched until the action is found.</p>
+
+<p><b>Example</b></p>
+
+<p>In this example from the contacts sample, an "Add a contact" link is placed in the section associated with the
+"Contacts" node in the content outline. The Contacts node has the add action due to the way its child nodes are
+defined. Since the Contacts node is the nearest ancestor part to the action link that defines the add action, that is
+the action that ends up bound to the link.</p>
+
+<pre class="source-code"><code>&lt;action-link>
+    &lt;action-id>Sapphire.Add&lt;/action-id>
+    &lt;label>Add a contact&lt;/label>
+&lt;/action-link></code></pre>
+
+<img src="images/action-link.png" style="margin-left: 20px;"/>
+
+<a name="contexts"><h2>Contexts</h2></a>
+
+<p>Every UI part that supports actions must define one or more context. Actions are contributed to a context
+and the UI part displays all actions contributed to a context at the appropriate location.</p>
+
+<p>The following context are currently available:</p>
+
+<table>
+  <tr>
+    <th>Context</th>
+    <th>Typical Presentation</th>
+  </tr>
+  <tr>
+    <td>Sapphire.Actuator</td>
+    <td>A stand-alone link or button.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.EditorPage</td>
+    <td>Buttons in the editor page header.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.EditorPage.Outline</td>
+    <td>Menu items in the content outline's context menu.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.EditorPage.Outline.Header</td>
+    <td>Buttons directly above the content outline.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.EditorPage.Outline.Node</td>
+    <td>Menu items in the content outline's context menu.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ElementPropertyEditor</td>
+    <td>Buttons next to the property editor.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ListPropertyEditor</td>
+    <td>Buttons next to the property editor.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Section</td>
+    <td>Buttons in the section header.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValuePropertyEditor</td>
+    <td>Buttons next to the property editor.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Editor</td>
+    <td>Menu items in the diagram editor's context menu.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Node</td>
+    <td>Menu items in the diagram node's context menu.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Connection</td>
+    <td>Menu items in the diagram connection's context menu.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.WithDirective</td>
+    <td>Key binding in the with directive.</td>
+  </tr>
+</table>
+
+<a name="extensions"><h2>Extensions</h2></a>
+
+<p>While actions, handlers and handler factories can be contributed directly in a part's definition, sometimes
+it is more useful to contribute them in a system-wide fashion. This can be done using Sapphire's extension
+system.</p>
+
+<p>To contribute an extension, create sapphire-extension.xml file in the META-INF folder. The extension must
+be located in the same classloader as Sapphire. On an OSGi system this is done by creating a fragment to
+the org.eclipse.sapphire.ui bundle.</p>
+
+<p>The semantics and syntax of the contribution is identical to what is used in a part's definition. The biggest
+difference is that there is no implied scope, so it is very important to specify context and condition. If neither
+is specified, the contribution will be active for all UI parts, which is not very useful.</p>
+
+<p>The listing of <a href="../extensions/index.html">all extensions</a> currently contributed can be found in the 
+documentation.</p>
+
+<p><b>Example</b></p>
+
+<p>In this example, a message box action is contributed to all value property editors.</p>
+
+<pre class="source-code"><code>&lt;extension xmlns="http://www.eclipse.org/sapphire/xmlns/extension">
+    &lt;action>
+        &lt;id>MessageBoxAction&lt;/id>
+        &lt;label>message&lt;/label>
+        &lt;image>org/eclipse/sapphire/samples/gallery/BalloonYellow.png&lt;/image>
+        &lt;location>after:Sapphire.Browse&lt;/location>
+        &lt;location>before:Sapphire.Create&lt;/location>
+        &lt;key-binding>SHIFT+CONTROL+ALT+m&lt;/key-binding>
+        &lt;context>Sapphire.ValuePropertyEditor&lt;/context>
+    &lt;/action>
+&lt;/extension></code></pre>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/el/index.html b/releases/8.2.4/documentation/el/index.html
new file mode 100644
index 0000000..9b8b66b
--- /dev/null
+++ b/releases/8.2.4/documentation/el/index.html
@@ -0,0 +1,789 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Sapphire Expression Language</title>
+  <link rel="StyleSheet" href="../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > </div>
+
+
+<h1>Sapphire Expression Language</h1>
+
+<p>The expression language provides a convenient way to embed a bit of custom logic in various
+  parts of Sapphire without resorting to Java. Expressions can be used in some of the modeling
+  annotations as well as in UI definitions.</p>
+
+<p>The syntax and semantics borrow extensively from JSP expression language and its precursors,
+  however there are a number of deviations. This document is the definitive reference.</p>
+
+<ul>
+  <li><a href="#expressions">Expressions</a></li>
+  <li><a href="#literals">Literals</a></li>
+  <li><a href="#child-prop">Child Property Operator</a></li>
+  <li><a href="#arith">Arithmetic Operators</a></li>
+  <li><a href="#rel">Relational Operators</a></li>
+  <li><a href="#logical">Logical Operators</a></li>
+  <li><a href="#empty">Empty Operator</a></li>
+  <li><a href="#conditional">Conditional Operator</a></li>
+  <li><a href="#parentheses">Parentheses</a></li>
+  <li><a href="#precedence">Operator Precedence</a></li>
+  <li><a href="#functions">Functions</a></li>
+  <li><a href="#enums">Enums</a></li>
+  <li><a href="#conversion">Type Conversion</a></li>
+  <li><a href="#concat">String Concatenation</a></li>
+</ul>
+
+<a name="expressions"><h2>Expressions</h2></a>
+
+<p>There are three types of expressions: <i>literal expressions</i>, <i>eval expressions</i>
+and <i>composite expressions</i>. A literal expression is simply a string such
+as <code>Abc</code>. No quotation is necessary. An eval expression is anything
+enclosed between <code>${</code> and <code>}</code>. The syntax and semantics of 
+eval expressions is discussed in detail in the following sections. A composite
+expression is one that combines zero or more literal expressions with one or more eval
+expressions.</p>
+
+<p>The following are all examples of valid expressions:</p>
+
+<ul>
+  <li><code>Marry had a little lamb.</code></li>
+  <li><code>${ Name }</code></li>  
+  <li><code>${ Name } had a little ${ Animal }.</code></li>
+  <li><code>${ Name == null ? "[contact]" : Name }</code></li>
+  <li><code>${ ( Month == 'February' ? ( LeapYear ? 29 : 28 ) : 30 ) * EmployeeCount }</code></li>
+</ul>
+
+<a name="literals"><h2>Literals</h2></a>
+
+<p>There are literals for boolean, integer, floating point, string, and null in the expression
+language.<p>
+
+<ul>
+  <li>Boolean</li>
+  <ul>
+    <li><code>BooleanLiteral ::= 'true' | 'false'</code></li>
+  </ul>
+  <li>Integer</li>
+  <ul>
+    <li><code>IntegerLiteral ::= ['0'-'9']+</code></li>
+  </ul>
+  <li>Floating Point</li>
+  <ul>
+    <li><code>FloatingPointLiteral ::= (['0'-'9'])+ '.' (['0'-'9'])* Exponent? | '.' (['0'-'9'])+ Exponent? | (['0'-'9'])+ Exponent?</code></li>
+    <li><code>Exponent ::= ['e','E'] (['+','-'])? (['0'-'9'])+</code></li>
+  </ul>
+  <li>String</li>
+  <ul>
+    <li><code>StringLiteral ::= '([^'\]|\'|\\)*' | "([^"\]|\"|\\)*"</code></li>
+    <li>With single and double quotes - <code>"</code> is escaped as <code>\"</code>, 
+      <code>'</code> is escaped as <code>\'</code>, and <code>\</code> is escaped as <code>\\</code>. 
+      Quotes only need to be escaped in a string value enclosed in the same type of quote.</li>
+  </ul>
+  <li>Null</li>
+  <ul>
+    <li><code>NullLiteral ::= 'null'</code></li>
+  </ul>
+</ul>
+
+<a name="child-prop"><h2>Child Property Operator : A.B and A["B"]</h2></a>
+
+<p>The expression language follows ECMAScript in unifying the treatment of the <code>.</code> 
+and <code>[]</code> operators. So <code>expr-a.identifier-b</code> is equivalent to 
+<code>expr-a["identifier-b"]</code>.</p>
+
+<a name="arith"><h2>Arithmetic Operators</h2></a>
+
+<p>Arithmetic operators are provided to act on integer (<code>BigInteger</code> and 
+  <code>Long</code>) and floating point (<code>BigDecimal</code> and <code>Double</code>) 
+  values.</p>
+
+<ul>
+  <li><a href="#arith-addition">Addition</a></li>
+  <li><a href="#arith-subtraction">Subtraction</a></li>
+  <li><a href="#arith-multiplication">Multiplication</a></li>
+  <li><a href="#arith-division">Division</a></li>
+  <li><a href="#arith-remainder">Remainder (Modulo)</a></li>
+  <li><a href="#arith-unary-minus">Unary Minus</a></li>
+</ul>
+
+<p>The evaluation of arithmetic operators is described in the following sections. A and B
+are the evaluation of subexpressions.</p>
+
+<a name="arith-addition"><h3>Addition : A + B</h3></a>
+
+<ul>
+  <li>If A and B are <code>null</code>, return <code>(Long) 0</code>.</li>
+  <li>If A or B is a <code>BigDecimal</code>, coerce both to <code>BigDecimal</code> and return 
+    <code>A.add( B )</code>.</li>
+  <li>If A or B is a <code>Float</code>, <code>Double</code>, or <code>String</code> containing 
+    <code>.</code>, <code>e</code>, or <code>E</code>:</li>
+  <ul>
+    <li>If A or B is <code>BigInteger</code>, coerce both A and B to <code>BigDecimal</code> 
+      and apply operator.</li>
+    <li>Otherwise, coerce both A and B to <code>Double</code> and apply operator.</li>
+  </ul>
+  <li>If A or B is <code>BigInteger</code>, coerce both to <code>BigInteger</code> and return 
+    <code>A.add( B )</code>.</li>
+  <li>Otherwise coerce both A and B to <code>Long</code> and apply operator.</li>
+</ul>
+
+<a name="arith-subtraction"><h3>Subtraction : A - B</h3></a>
+
+<ul>
+  <li>If A and B are <code>null</code>, return <code>(Long) 0</code>.</li>
+  <li>If A or B is a <code>BigDecimal</code>, coerce both to <code>BigDecimal</code> and return 
+    <code>A.subtract( B )</code>.</li>
+  <li>If A or B is a <code>Float</code>, <code>Double</code>, or <code>String</code> containing 
+    <code>.</code>, <code>e</code>, or <code>E</code>:</li>
+  <ul>
+    <li>If A or B is <code>BigInteger</code>, coerce both A and B to <code>BigDecimal</code> 
+      and apply operator.</li>
+    <li>Otherwise, coerce both A and B to <code>Double</code> and apply operator.</li>
+  </ul>
+  <li>If A or B is <code>BigInteger</code>, coerce both to <code>BigInteger</code> and return 
+    <code>A.subtract( B )</code>.</li>
+  <li>Otherwise coerce both A and B to <code>Long</code> and apply operator.</li>
+</ul>
+
+<a name="arith-multiplication"><h3>Multiplication : A * B</h3></a>
+
+<ul>
+  <li>If A and B are <code>null</code>, return <code>(Long) 0</code>.</li>
+  <li>If A or B is a <code>BigDecimal</code>, coerce both to <code>BigDecimal</code> and return 
+    <code>A.multiply( B )</code>.</li>
+  <li>If A or B is a <code>Float</code>, <code>Double</code>, or <code>String</code> containing 
+    <code>.</code>, <code>e</code>, or <code>E</code>:</li>
+  <ul>
+    <li>If A or B is <code>BigInteger</code>, coerce both A and B to <code>BigDecimal</code> 
+      and apply operator.</li>
+    <li>Otherwise, coerce both A and B to <code>Double</code> and apply operator.</li>
+  </ul>
+  <li>If A or B is <code>BigInteger</code>, coerce both to <code>BigInteger</code> and return 
+    <code>A.multiply( B )</code>.</li>
+  <li>Otherwise coerce both A and B to <code>Long</code> and apply operator.</li>
+</ul>
+
+<a name="arith-division"><h3>Division : A { /, div } B</h3></a>
+
+<ul>
+  <li>If A and B are <code>null</code>, return <code>(Long) 0</code>.</li>
+  <li>If A or B is a <code>BigDecimal</code> or a <code>BigInteger</code>, coerce both to 
+    <code>BigDecimal</code> and return <code>A.divide( B, BigDecimal.ROUND_HALF_UP )</code>.</li>
+  <li>Otherwise, coerce both A and B to <code>Double</code> and apply operator.</li>
+</ul>
+
+<a name="arith-remainder"><h3>Remainder (Modulo) : A { %, mod } B</h3></a>
+
+<ul>
+  <li>If A and B are <code>null</code>, return <code>(Long) 0</code>.</li>
+  <li>If A or B is a <code>BigDecimal</code>, <code>Float</code>, <code>Double</code>, or 
+    <code>String</code> containing <code>.</code>, <code>e</code>, or <code>E</code>,
+    coerce both A and B to <code>Double</code> and apply operator.</li>
+  <li>If A or B is a <code>BigInteger</code>, coerce both to <code>BigInteger</code> and 
+    return <code>A.remainder( B )</code>.</li>
+  <li>Otherwise coerce both A and B to <code>Long</code> and apply operator.</li>
+</ul>
+
+<a name="arith-unary-minus"><h3>Unary Minus : -A</h3></a>
+
+<ul>
+  <li>If A is <code>null</code>, return <code>(Long) 0</code>.</li>
+  <li>If A is a <code>BigDecimal</code> or <code>BigInteger</code>, return <code>A.negate()</code>.</li>
+  <li>If A is a <code>String</code>:</li>
+  <ul>
+    <li>If A contains <code>.</code>, <code>e</code>, or <code>E</code>, coerce to a 
+      <code>Double</code> and apply operator.</li>
+    <li>Otherwise, coerce to a <code>Long</code> and apply operator.</li>
+  </ul>
+  <li>If A is <code>Byte</code>, <code>Short</code>, <code>Integer</code>, <code>Long</code>, 
+    <code>Float</code>, or <code>Double</code>, retain type and apply operator.</li>
+  <li>Otherwise, error.</li>
+</ul>
+
+<a name="rel"><h2>Relational Operators</h2></a>
+
+<p>Relational operators are provided to compare two values.</p>
+
+<ul>
+  <li><a href="#rel-equal">Equal</a></li>
+  <li><a href="#rel-not-equal">Not Equal</a></li>
+  <li><a href="#rel-less-than">Less Than</a></li>
+  <li><a href="#rel-less-than-or-equal">Less Than or Equal</a></li>
+  <li><a href="#rel-greater-than">Greater Than</a></li>
+  <li><a href="#rel-greater-than-or-equal">Greater Than or Equal</a></li>
+  <li><a href="#rel-in">In</a></li>
+</ul>
+
+<p>The evaluation of relational operators is described in the following sections. A and B
+  are the evaluation of subexpressions.</p>
+
+<a name="rel-equal"><h3>Equal : A { ==, eq } B</h3></a>
+
+<ul>
+  <li>If A <code>==</code> B, return <code>true</code>.</li>
+  <li>If A is <code>null</code> or B is <code>null</code> return <code>false</code>.</li>
+  <li>If A or B is <code>BigDecimal</code>, coerce both A and B to <code>BigDecimal</code> 
+    and return <code>A.equals( B )</code>.</li> 
+  <li>If A or B is <code>Float</code> or <code>Double</code> coerce both A and B to 
+    <code>Double</code>, apply operator.</li>
+  <li>If A or B is <code>BigInteger</code>, coerce both A and B to <code>BigInteger</code> 
+    and return <code>A.equals( B )</code>.</li>
+  <li>If A or B is <code>Byte</code>, <code>Short</code>, <code>Character</code>, 
+    <code>Integer</code>, or <code>Long</code> coerce both A and B to <code>Long</code>, 
+    apply operator.</li>
+  <li>If A or B is <code>Boolean</code> coerce both A and B to <code>Boolean</code>, 
+    apply operator.</li>
+  <li>If A or B is an enum, coerce both A and B to enum, apply operator.</li>
+  <li>If A or B is <code>String</code> coerce both A and B to <code>String</code>, compare 
+    lexically.</li>
+  <li>Otherwise, return <code>A.equals( B )</code>.</li>
+</ul>
+
+<a name="rel-not-equal"><h3>Not Equal : A { !=, ne } B</h3></a>
+
+<ul>
+  <li>If A <code>==</code> B, return <code>false</code>.</li>
+  <li>If A is <code>null</code> or B is <code>null</code> return <code>true</code>.</li>
+  <li>If A or B is <code>BigDecimal</code>, coerce both A and B to <code>BigDecimal</code> 
+    and return <code>! A.equals( B )</code>.</li> 
+  <li>If A or B is <code>Float</code> or <code>Double</code> coerce both A and B to 
+    <code>Double</code>, apply operator.</li>
+  <li>If A or B is <code>BigInteger</code>, coerce both A and B to <code>BigInteger</code> 
+    and return <code>! A.equals( B )</code>.</li>
+  <li>If A or B is <code>Byte</code>, <code>Short</code>, <code>Character</code>, 
+    <code>Integer</code>, or <code>Long</code> coerce both A and B to <code>Long</code>, 
+    apply operator.</li>
+  <li>If A or B is <code>Boolean</code> coerce both A and B to <code>Boolean</code>, 
+    apply operator.</li>
+  <li>If A or B is an enum, coerce both A and B to enum, apply operator.</li>
+  <li>If A or B is <code>String</code> coerce both A and B to <code>String</code>, compare 
+    lexically.</li>
+  <li>Otherwise, return <code>! A.equals( B )</code>.</li>
+</ul>
+
+<a name="rel-less-than"><h3>Less Than : A { &lt;, lt } B</h3></a>
+
+<ul>
+  <li>If A is <code>null</code> or B is <code>null</code>, return <code>false</code>.</li>
+  <li>If A or B is <code>BigDecimal</code>, coerce both A and B to <code>BigDecimal</code> 
+    and use the return value of <code>A.compareTo( B )</code>.</li>
+  <li>If A or B is <code>Float</code> or <code>Double</code> coerce both A and B to 
+    <code>Double</code> apply operator.</li>
+  <li>If A or B is <code>BigInteger</code>, coerce both A and B to <code>BigInteger</code> 
+    and use the return value of <code>A.compareTo( B )</code>.</li>
+  <li>If A or B is <code>Byte</code>, <code>Short</code>, <code>Character</code>, 
+    <code>Integer</code>, or <code>Long</code> coerce both A and B to <code>Long</code> 
+    and apply operator.</li>
+  <li>If A or B is <code>String</code> coerce both A and B to <code>String</code>, compare 
+    lexically.</li>
+  <li>If A is <code>Comparable</code>, then use result of <code>A.compareTo( B )</code>.</li>
+  <li>If B is Comparable, then use result of <code>B.compareTo( A )</code>.</li>
+  <li>Otherwise, error.</li>
+</ul>
+
+<a name="rel-less-than-or-equal"><h3>Less Than or Equal : A { &lt;=, le } B</h3></a>
+
+<ul>
+  <li>If A <code>==</code> B, return <code>true</code>.</li>
+  <li>If A is <code>null</code> or B is <code>null</code>, return <code>false</code>.</li>
+  <li>If A or B is <code>BigDecimal</code>, coerce both A and B to <code>BigDecimal</code> 
+    and use the return value of <code>A.compareTo( B )</code>.</li>
+  <li>If A or B is <code>Float</code> or <code>Double</code> coerce both A and B to 
+    <code>Double</code> apply operator.</li>
+  <li>If A or B is <code>BigInteger</code>, coerce both A and B to <code>BigInteger</code> 
+    and use the return value of <code>A.compareTo( B )</code>.</li>
+  <li>If A or B is <code>Byte</code>, <code>Short</code>, <code>Character</code>, 
+    <code>Integer</code>, or <code>Long</code> coerce both A and B to <code>Long</code> 
+    and apply operator.</li>
+  <li>If A or B is <code>String</code> coerce both A and B to <code>String</code>, compare 
+    lexically.</li>
+  <li>If A is <code>Comparable</code>, then use result of <code>A.compareTo( B )</code>.</li>
+  <li>If B is Comparable, then use result of <code>B.compareTo( A )</code>.</li>
+  <li>Otherwise, error.</li>
+</ul>
+
+<a name="rel-greater-than"><h3>Greater Than : A { &gt;, gt } B</h3></a>
+
+<ul>
+  <li>If A is <code>null</code> or B is <code>null</code>, return <code>false</code>.</li>
+  <li>If A or B is <code>BigDecimal</code>, coerce both A and B to <code>BigDecimal</code> 
+    and use the return value of <code>A.compareTo( B )</code>.</li>
+  <li>If A or B is <code>Float</code> or <code>Double</code> coerce both A and B to 
+    <code>Double</code> apply operator.</li>
+  <li>If A or B is <code>BigInteger</code>, coerce both A and B to <code>BigInteger</code> 
+    and use the return value of <code>A.compareTo( B )</code>.</li>
+  <li>If A or B is <code>Byte</code>, <code>Short</code>, <code>Character</code>, 
+    <code>Integer</code>, or <code>Long</code> coerce both A and B to <code>Long</code> 
+    and apply operator.</li>
+  <li>If A or B is <code>String</code> coerce both A and B to <code>String</code>, compare 
+    lexically.</li>
+  <li>If A is <code>Comparable</code>, then use result of <code>A.compareTo( B )</code>.</li>
+  <li>If B is Comparable, then use result of <code>B.compareTo( A )</code>.</li>
+  <li>Otherwise, error.</li>
+</ul>
+
+<a name="rel-greater-than-or-equal"><h3>Greater Than or Equal : A { &gt;=, ge } B</h3></a>
+
+<ul>
+  <li>If A <code>==</code> B, return <code>true</code>.</li>
+  <li>If A is <code>null</code> or B is <code>null</code>, return <code>false</code>.</li>
+  <li>If A or B is <code>BigDecimal</code>, coerce both A and B to <code>BigDecimal</code> 
+    and use the return value of <code>A.compareTo( B )</code>.</li>
+  <li>If A or B is <code>Float</code> or <code>Double</code> coerce both A and B to 
+    <code>Double</code> apply operator.</li>
+  <li>If A or B is <code>BigInteger</code>, coerce both A and B to <code>BigInteger</code> 
+    and use the return value of <code>A.compareTo( B )</code>.</li>
+  <li>If A or B is <code>Byte</code>, <code>Short</code>, <code>Character</code>, 
+    <code>Integer</code>, or <code>Long</code> coerce both A and B to <code>Long</code> 
+    and apply operator.</li>
+  <li>If A or B is <code>String</code> coerce both A and B to <code>String</code>, compare 
+    lexically.</li>
+  <li>If A is <code>Comparable</code>, then use result of <code>A.compareTo( B )</code>.</li>
+  <li>If B is Comparable, then use result of <code>B.compareTo( A )</code>.</li>
+  <li>Otherwise, error.</li>
+</ul>
+
+<a name="rel-in"><h3>In : A in B</h3></a>
+
+<ul>
+  <li>If A is <code>null</code> or B is <code>null</code> return <code>false</code>.</li>
+  <li>Otherwise, return <code>true</code> if <code>A == B[ i ]</code> for any value of <code>i</code>
+    between <code>0</code> and <code>B.Size - 1</code>.  
+</ul>
+
+<a name="logical"><h2>Logical Operators</h2></a>
+
+<p>Logical operators are provided to perform boolean logic.</p>
+
+<ul>
+  <li><a href="#logical-and">And</a></li>
+  <li><a href="#logical-or">Or</a></li>
+  <li><a href="#logical-not">Not</a></li>
+</ul>
+
+<p>The evaluation of logical operators is described in the following sections. A and B
+  are the evaluation of subexpressions.</p>
+
+<a name="logical-and"><h3>And : A { &amp;&amp;, and } B</h3></a>
+
+<ul>
+  <li>Coerce both A and B to <code>Boolean</code>, apply operator.</li>
+</ul>
+
+<a name="logical-or"><h3>Or : A { ||, or } B</h3></a>
+
+<ul>
+  <li>Coerce both A and B to <code>Boolean</code>, apply operator.</li>
+</ul>
+
+<a name="logical-not"><h3>Not : A { !, not } B</h3></a>
+
+<ul>
+  <li>Coerce A to <code>Boolean</code>, apply operator.</li>
+</ul>
+
+<a name="empty"><h2>Empty Operator : empty A</h2></a>
+
+<p>The empty operator is a prefix operator that can be used to determine if a value is
+  <code>null</code> or empty.</p>
+
+<ul>  
+  <li>If A is <code>null</code>, return <code>true</code>.</li>
+  <li>if A is the empty <code>String</code>, then return <code>true</code>.</li>
+  <li>if A is an empty array, then return <code>true</code>.</li>
+  <li>if A is an empty <code>Collection</code>, return <code>true</code>.</li>
+  <li>Otherwise, return <code>false</code>.</li>
+</ul>
+
+<a name="conditional"><h2>Conditional Operator : A ? B : C</h2></a>
+
+<p>Return B or C, depending on the result of the evaluation of A.</code>
+
+<ul>
+  <li>Coerce A to <code>Boolean</code>:</li>
+  <ul>
+    <li>If A is <code>true</code>, return B.</li>
+    <li>If A is <code>false</code>, return C.</li>
+  </ul>
+</ul>
+
+<a name="parentheses"><h2>Parentheses</h2></a>
+
+<p>Parentheses can be used to change precedence, as in: <code>${(a*(b+c))}</code>.</p>
+
+<a name="precedence"><h2>Operator Precedence</h2></a>
+
+<p>Highest to lowest, left to right.</p>
+
+<ul>
+  <li><code>[] .</code></li>
+  <li><code>()</code></li>
+  <li><code>- (unary) not ! empty</code></li>
+  <li><code>* / div % mod</code></li>
+  <li><code>+ - (binary)</code></li>
+  <li><code>&lt; &gt; &lt;= &gt;= lt gt le ge</code></li>
+  <li><code>== != eq ne in</code></li>
+  <li><code>&amp;&amp; and</code></li>
+  <li><code>|| or</code></li>
+  <li><code>? :</code></li>
+</ul>
+
+<p>Qualified functions with a namespace prefix have precedence over the operators.
+  Thus the expression <code>${c?b:f()}</code> is illegal because <code>b:f()</code> 
+  is being parsed as a qualified function instead of part of a conditional expression. 
+  As usual, <code>()</code> can be used to make the precedence explicit, 
+  e.g <code>${c?b:(f())}</code>.</p>
+
+<a name="functions"><h2>Functions</h2></a>
+
+<p>The expression language supports functions, whose names can be qualified
+with a namespace.</p>
+
+<p>The full syntax of qualified n-ary function is as follows:</p>
+
+<p><code>[ns:]f([a<sub>1</sub>[,a<sub>2</sub>[,...[,a<sub>n</sub>]]]])</code></p>
+
+<p>Where <code>ns</code> is the namespace prefix, <code>f</code> is the name of the 
+function, and <code>a</code> is an argument.</p>
+
+<p>The following functions are available for use:</p>
+
+
+<table>
+  <tr>
+    <th>Name</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>Absolute</td>
+    <td>Returns the absolute path of a value for properties with a RelativePathService.</td>
+  </tr>
+  <tr>
+    <td>Avg</td>
+    <td>Computes the average of numbers in a collection. Typically, this function takes the collection as the sole parameter. However, when the collection is a model element list, a second parameter may be necessary to specify the name (in the form of a string) of the list entry's value property to use in aggregation. If the the collection is a model element list and the second parameter is not specified, this function will use list entry's first value property for aggregation. An average of an empty collection is 0.</td>
+  </tr>
+  <tr>
+    <td>Concat</td>
+    <td>Concatenates two or more strings into a single string. Particularly useful in contexts where composite expressions cannot be used, such as where the result of concatenation needs to feed into another function or operator.</td>
+  </tr>
+  <tr>
+    <td>Content</td>
+    <td>Returns the content of a value or a transient. For value properties, the default is taken into account, if applicable.</td>
+  </tr>
+  <tr>
+    <td>Enabled</td>
+    <td>Returns the enablement of a property.</td>
+  </tr>
+  <tr>
+    <td>Enabled</td>
+    <td>Determines if the property associated with the property editor is enabled. Can only be used in the context of a property editor.</td>
+  </tr>
+  <tr>
+    <td>EncodeToXml</td>
+    <td>Encodes text for use as XML element content or an attribute value.</td>
+  </tr>
+  <tr>
+    <td>EndsWith</td>
+    <td>Tests if a string ends with the specified suffix.</td>
+  </tr>
+  <tr>
+    <td>FirstSegment</td>
+    <td>Breaks a string into segments using the provided separators and returns the first segment. If no separators are found in the string, the entire string is returned. This function takes two string operands. The first is the string to tokenize. The second is a sequence of characters that individually should be treated as valid separators.</td>
+  </tr>
+  <tr>
+    <td>Fragment</td>
+    <td>Returns a fragment of a string. The fragment starts at the index specified by the second argument and extends to the character before the index specified by the third argument. The length of the fragment is end index minus start index. A negative start index is normalized to zero. A start index exceeding the length of the input is normalized to the length of the input. An end index exceeding the length of the input is normalized to the length of the input. An end index that is smaller than the start index is normalized to the start index.</td>
+  </tr>
+  <tr>
+    <td>Global</td>
+    <td>Returns a map of global objects maintained through Sapphire.global() API.</td>
+  </tr>
+  <tr>
+    <td>Head</td>
+    <td>Returns a fragment of a string starting at the beginning and not exceeding the specified length. A negative fragment length is normalized to zero. A fragment length exceeding the length of the input is normalized to the length of the input.</td>
+  </tr>
+  <tr>
+    <td>Image</td>
+    <td>Returns the image associated with the context model element.</td>
+  </tr>
+  <tr>
+    <td>Index</td>
+    <td>Determines the index of a model element within its parent list.</td>
+  </tr>
+  <tr>
+    <td>InstanceOf</td>
+    <td>Determines if an object is of specified type. The object to be checked is the first operand and the type is the second operand. The type must be a fully-qualified Java class name.</td>
+  </tr>
+  <tr>
+    <td>LastSegment</td>
+    <td>Breaks a string into segments using the provided separators and returns the last segment. If no separators are found in the string, the entire string is returned. This function takes two string operands. The first is the string to tokenize. The second is a sequence of characters that individually should be treated as valid separators.</td>
+  </tr>
+  <tr>
+    <td>List</td>
+    <td>Constructs a list from arbitrary number of operands.</td>
+  </tr>
+  <tr>
+    <td>LowerCase</td>
+    <td>Converts a string to lower case. Can be used either as LowerCase( Name ) or as Name.LowerCase().</td>
+  </tr>
+  <tr>
+    <td>Matches</td>
+    <td>Determines whether a string matches a regular expression. The full semantics are specified by Java's String.matches() function.</td>
+  </tr>
+  <tr>
+    <td>Max</td>
+    <td>Finds the largest number in a collection. Typically, this function takes the collection as the sole parameter. However, when the collection is a model element list, a second parameter may be necessary to specify the name (in the form of a string) of the list entry's value property to use in aggregation. If the the collection is a model element list and the second parameter is not specified, this function will use list entry's first value property for aggregation.</td>
+  </tr>
+  <tr>
+    <td>Message</td>
+    <td>Returns the message from a validation result.</td>
+  </tr>
+  <tr>
+    <td>Min</td>
+    <td>Finds the smallest number in a collection. Typically, this function takes the collection as the sole parameter. However, when the collection is a model element list, a second parameter may be necessary to specify the name (in the form of a string) of the list entry's value property to use in aggregation. If the the collection is a model element list and the second parameter is not specified, this function will use list entry's first value property for aggregation.</td>
+  </tr>
+  <tr>
+    <td>Parent</td>
+    <td>Returns the parent of the current model element.</td>
+  </tr>
+  <tr>
+    <td>Parent</td>
+    <td>Returns the parent of the given part.</td>
+  </tr>
+  <tr>
+    <td>Part</td>
+    <td>Returns the context part.</td>
+  </tr>
+  <tr>
+    <td>Replace</td>
+    <td>Replaces all occurrences of a regular expression pattern with the provided replacement text. The full semantics are specified by Java's String.replaceAll( String, String ) function.</td>
+  </tr>
+  <tr>
+    <td>Root</td>
+    <td>Returns the root of the model.</td>
+  </tr>
+  <tr>
+    <td>SapphireVersionMatches</td>
+    <td>Determines whether Sapphire version matches a version constraint. A version constraint is a comma-separated list of specific versions, closed ranges (expressed using "[1.2.3-4.5)" syntax and open ranges (expressed using "[1.2.3" or "4.5)" syntax). The square brackets indicate that the range includes the specified version. The parenthesis indicate that the range goes up to, but does not actually include the specified version.</td>
+  </tr>
+  <tr>
+    <td>Scale</td>
+    <td>Changes the scale of a decimal.</td>
+  </tr>
+  <tr>
+    <td>Severity</td>
+    <td>Returns the severity of a validation result.</td>
+  </tr>
+  <tr>
+    <td>Size</td>
+    <td>Determines the size of a collection, a map, an array or a string.</td>
+  </tr>
+  <tr>
+    <td>StartsWith</td>
+    <td>Tests if a string starts with the specified prefix.</td>
+  </tr>
+  <tr>
+    <td>State</td>
+    <td>Returns the root element of editor page's persisted state, allowing access to various state properties. This is particularly useful when the persisted state is extended with custom properties wired to custom actions, as it allows any EL-enabled facility to integrate with the custom state property.</td>
+  </tr>
+  <tr>
+    <td>Sum</td>
+    <td>Computes the sum of numbers in a collection. Typically, this function takes the collection as the sole parameter. However, when the collection is a model element list, a second parameter may be necessary to specify the name (in the form of a string) of the list entry's value property to use in aggregation. If the the collection is a model element list and the second parameter is not specified, this function will use list entry's first value property for aggregation. A sum of an empty collection is 0.</td>
+  </tr>
+  <tr>
+    <td>Tail</td>
+    <td>Returns a fragment of a string starting at the end and not exceeding the specified length. A negative fragment length is normalized to zero. A fragment length exceeding the length of the input is normalized to the length of the input.</td>
+  </tr>
+  <tr>
+    <td>Text</td>
+    <td>Returns the text of a value, taking into account the default, if applicable.</td>
+  </tr>
+  <tr>
+    <td>UpperCase</td>
+    <td>Converts a string to upper case. Can be used either as UpperCase( Name ) or as Name.UpperCase().</td>
+  </tr>
+  <tr>
+    <td>Validation</td>
+    <td>Returns the validation result of a property.</td>
+  </tr>
+  <tr>
+    <td>Validation</td>
+    <td>Returns the validation result of a part.</td>
+  </tr>
+  <tr>
+    <td>VersionMatches</td>
+    <td>Determines whether a version matches a version constraint. A version constraint is a comma-separated list of specific versions, closed ranges (expressed using "[1.2.3-4.5)" syntax and open ranges (expressed using "[1.2.3" or "4.5)" syntax). The square brackets indicate that the range includes the specified version. The parenthesis indicate that the range goes up to, but does not actually include the specified version.</td>
+  </tr>
+</table>
+
+
+<p>Custom functions can be contributed via <a href="../extensions/contributing.html">Sapphire 
+Extension System</a>.</p>
+
+<a name="enums"><h2>Enums</h2></a>
+
+<p>The expression language supports Java enumerations. Coercion rules for dealing
+  with enumerated types are included in the following section. Also, when referring
+  to values that are instances of an enumerated type from within an expression, use
+  the literal string value to cause coercion to happen via the below rules. For example,
+  Let's say we have an enum called Suit that has members Heart, Diamond, Club, and
+  Spade. Furthermore, let's say we have a reference in the expression, mySuit, that is a Spade.
+  If you want to test for equality with the Spade enum, you would say 
+  <code>${mySuit == 'Spade'}</code>. The type of the mySuit will trigger the invocation of
+  <code>Enum.valueOf( Suit.class, "Spade" )</code>.</p>
+
+<a name="conversion"><h2>Type Conversion</h2></a>
+
+<p>Every expression is evaluated in the context of an expected type. The result of the
+  expression evaluation may not match the expected type exactly, so the rules
+  described in the following sections are applied.</p>
+
+<h3>Coerce A to String</h3>
+
+<ul>
+  <li>If A is <code>String</code>, return A.</li>
+  <li>If A is <code>null</code>, return <code>""</code>.</li>
+  <li>If A is <code>Enum</code>, return <code>A.name()</code>.</li>
+  <li>If A is <code>array</code>, <code>List</code> or <code>Set</code>, return concatenation of
+    items separated by a comma (,) character.</li> 
+  <li>Otherwise, return <code>A.toString()</code>.</li>
+</ul>
+
+<h3>Coerce A to Number type N</h3>
+
+<ul>
+  <li>If A is <code>null</code> or <code>""</code>, return <code>0</code>.</li>
+  <li>If A is <code>Character</code>, convert A to <code>new Short( (short) a.charValue() )</code>, 
+    and apply the following rules.</li>
+  <li>If A is <code>Boolean</code>, then error.</li>
+  <li>If A is <code>Number</code> type N, return A.</li>
+  <li>If A is <code>Number</code>, coerce quietly to type N using the following algorithm:</li>
+  <ul>
+    <li>If N is <code>BigInteger</code>:</li>
+    <ul>
+      <li>If A is a <code>BigDecimal</code>, return <code>A.toBigInteger()</code>.</li>
+      <li>Otherwise, return <code>BigInteger.valueOf( A.longValue() )</code>.</li>
+    </ul>
+    <li>If N is <code>BigDecimal</code>:</li>
+    <ul>
+      <li>If A is a <code>BigInteger</code>, return <code>new BigDecimal( A )</code>.</li>
+      <li>Otherwise, return <code>new BigDecimal( A.doubleValue() )</code>.</li>
+    </ul>
+    <li>If N is <code>Byte</code>, return <code>new Byte( A.byteValue() )</code>.</li>
+    <li>If N is <code>Short</code>, return <code>new Short( A.shortValue() )</code>.</li>
+    <li>If N is <code>Integer</code>, return <code>new Integer( A.intValue() )</code>.</li>
+    <li>If N is <code>Long</code>, return <code>new Long( A.longValue() )</code>.</li>
+    <li>If N is <code>Float</code>, return <code>new Float( A.floatValue() )</code>.</li>
+    <li>If N is <code>Double</code>, return <code>new Double( A.doubleValue() )</code>.</li>
+    <li>Otherwise, error.</li>
+  </ul>
+  <li>If A is <code>String</code>, then:</li>
+  <ul>
+    <li>If N is <code>BigDecimal</code> then return <code>new BigDecimal( A )</code>.</li>
+    <li>If N is <code>BigInteger</code> then return <code>new BigInteger( A )</code>.</li>
+    <li>Otherwise, return <code>N.valueOf( A )</code>.</li>
+  </ul>
+  <li>Otherwise, error.</li>
+</ul>
+
+<h3>Coerce A to Character</h3>
+
+<ul>
+  <li>If A is <code>null</code> or <code>""</code>, return <code>(char) 0</code>.</li>
+  <li>If A is <code>Character</code>, return A.</li>
+  <li>If A is <code>Number</code>, coerce quietly to type <code>Short</code>, then return 
+    a <code>Character</code> whose numeric value is equivalent to that of a <code>Short</code>.</li>
+  <li>If A is <code>String</code>, return <code>A.charAt( 0 )</code>.</li>
+  <li>Otherwise, error.</li>
+</ul>
+
+<h3>Coerce A to Boolean</h3>
+
+<ul>
+  <li>If A is <code>null</code> or <code>""</code>, return <code>false</code>.</li>
+  <li>If A is a <code>Boolean</code>, return A.</li>
+  <li>If A is a <code>String</code>, return <code>Boolean.valueOf( A )</code>.</li>
+  <li>Otherwise, error.</li>
+</ul>
+
+<h3>Coerce A to an Enum Type T</h3>
+
+<ul>
+  <li>If A is <code>null</code>, return <code>null</code>.</li>
+  <li>If A is assignable to T, return A.</li>
+  <li>If A is <code>""</code>, return <code>null</code>.</li>
+  <li>If A is a <code>String</code>, return <code>Enum.valueOf( T.getClass(), A )</code>.</li>
+  <li>Otherwise, error.</li>
+</ul>
+
+<h3>Coerce A to List</h3>
+
+<ul>
+  <li>If A is <code>null</code>, return <code>null</code>.</li>
+  <li>If A is <code>List</code>, return A.</li>
+  <li>If A is <code>Collection</code>, return list of collection items.</li>
+  <li>If A is <code>array</code>, return list of array items.</li>
+  <li>If A is <code>String</code>, then:</li>
+  <ul>
+    <li>If A is <code>""</code>, return empty list.</li>
+    <li>Otherwise, break A into segments on comma (,) character and return list of these segments.</li>
+  </ul>
+  <li>Otherwise, return singleton list containing A.</li>
+</ul>
+
+<h3>Coerce A to Any Other Type T</h3>
+
+<ul>
+  <li>If A is <code>null</code>, return <code>null</code>.</li>
+  <li>If A is assignable to T, return A.</li>
+  <li>If A is <code>""</code>, return <code>null</code>.</li>
+  <li>If A is convertable to T using <a href="../services/MasterConversionService.html">MasterConversionService</a>, return the result.</li>
+  <li>Otherwise, error.</li>
+</ul>
+
+<a name="concat"><h2>String Concatenation</h2></a>
+
+<p>The subject of string concatenation in an expression can be a source of confusion. In particular,
+expressions like <code>${ "A" + "B" }</code> cause an error during evaluation. That's
+because the <code>+</code> operator is exclusively <a href="#arith-addition">arithmetic 
+addition</a>. It is not overloaded to also mean string concatenation, like it is in 
+some other languages such as Java.</p>
+
+<p>String concatenation in an expression can be accomplished in one of 
+two ways:</p>
+
+<ul>
+  <li>Composite expressions: <code>On the year ${ Year % 100 } of ${ Year / 100 } century.</code></li>
+  <li>Using the included concat function: <code>${ OnlyShowYear ? Year : concat( Year, "-", Month, "-" Day ) }</code>
+</ul>
+
+<p>Using the <code>concat</code> function is particularly necessary in cases where
+the result of concatenation should feed into another function or operator.</p>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/extensions/contributing.html b/releases/8.2.4/documentation/extensions/contributing.html
new file mode 100644
index 0000000..ecd9ee6
--- /dev/null
+++ b/releases/8.2.4/documentation/extensions/contributing.html
@@ -0,0 +1,170 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Contributing Sapphire Extensions</title>
+  <link rel="StyleSheet" href="../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Extension System</a></div>
+
+
+<h1>Contributing Sapphire Extensions</h1>
+
+<p>Many aspects of Sapphire can be extended by third parties.</p>
+
+<ul>
+  <li><a href="#getting-started">Getting Started</a></li>
+  <li><a href="#functions">Functions</a></li>
+</ul>
+
+<a name="getting-started"><h2>Getting Started</h2></a>
+
+<p>The first step is to create sapphire-extension.xml 
+file in your plugin's META-INF folder. If your Eclipse includes Sapphire SDK, you should see the following editor. This
+editor will help you define extensions without dealing with XML details.</p>
+
+<img src="images/editor-1.png" style="margin-left: 20px;"/>
+
+<p>The editor also includes a summary view, which is handy to see all of the contributions at a glance.</p>
+
+<img src="images/editor-2.png" style="margin-left: 20px;"/>
+
+<p>The rest of this document will cover writing specific extensions.</p>
+
+<a name="functions"><h2>Functions</h2></a>
+
+<p>Custom functions can be contributed to Sapphire Expression Language. Functions are named using qualified
+form with a colon (":") separating namespace from local name. Contributed 
+functions should be qualified with a namespace corresponding to a company,
+an organization or a project. Functions without a namespace are reserved for
+Sapphire use. New functions may be added to Sapphire framework in future releases.
+The best way to avoid conflicts is to use a unique namespace.</p> 
+
+<p>Function names are not case sensitive.</p>
+
+<p>All function implementations must extend Function class.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">A simple function with one operand.</p>
+
+<pre class="source-code"><code>public class FactorialFunction extends Function
+{
+    private static final BigInteger ZERO = BigInteger.valueOf( 0 );
+    private static final BigInteger ONE = BigInteger.valueOf( 1 );
+
+    public String name()
+    {
+        return "Test:Factorial";
+    }
+
+    public FunctionResult evaluate( FunctionContext context )
+    {
+        return new FunctionResult( this, context )
+        {
+            protected Object evaluate()
+            {
+                BigInteger x = cast( operand( 0 ).value(), BigInteger.class );
+
+                if( x.intValue() == 0 )
+                {
+                    return BigInteger.valueOf( 1 );
+                }
+                else
+                {
+                    BigInteger res = x;
+
+                    for( BigInteger i = x.subtract( ONE ); i.compareTo( ZERO ) > 0; i = i.subtract( ONE ) )
+                    {
+                        res = res.multiply( i );
+                    }
+
+                    return res;
+                }
+            }
+        };
+    }
+}</code></pre>
+
+<p>It is important to understand that functions operate on publish-subscribe model. That is,
+Sapphire will not re-evaluate the function every time its result is needed. It is responsibility
+of the function to know when its result could change and trigger re-evaluation, which in turn
+will notify parties listening on the result of the function.</p>
+
+<p>Most function implementations do not need to be concerned with this detail as the base
+class already listens on its operands and triggers re-evaluation. Only functions that bring
+an external source of data into the expression need to do something different.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">A function that counts projects in an Eclipse workspace. Note that
+it is a terrible implementation as it doesn't properly filter resource change events.</p>
+
+<pre class="source-code"><code>public class ProjectCountFunction extends Function
+{
+    public String name()
+    {
+        return "Test:ProjectCount";
+    }
+
+    public FunctionResult evaluate( FunctionContext context )
+    {
+        return new FunctionResult( this, context )
+        {
+            private IResourceChangeListener listener;
+
+            protected void init()
+            {
+                super.init();
+
+                this.listener = new IResourceChangeListener()
+                {
+                    public void resourceChanged( IResourceChangeEvent event )
+                    {
+                        refresh();
+                    }
+                };
+
+                ResourcesPlugin.getWorkspace().addResourceChangeListener( this.listener );
+            }
+
+            protected Object evaluate()
+            {
+                return ResourcesPlugin.getWorkspace().getRoot().getProjects().length;
+            }
+
+            public void dispose()
+            {
+                super.dispose();
+                ResourcesPlugin.getWorkspace().removeResourceChangeListener( this.listener );
+            }
+        };
+    }
+}</code></pre>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/extensions/existing.html b/releases/8.2.4/documentation/extensions/existing.html
new file mode 100644
index 0000000..d9bfe3a
--- /dev/null
+++ b/releases/8.2.4/documentation/extensions/existing.html
@@ -0,0 +1,1453 @@
+<html>
+
+<head>
+  <title>Sapphire Extensions</title>
+<style type="text/css">
+p
+{
+  font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
+}
+
+li
{
  font: 14px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
+  margin: .4em 0
}
+
pre.source-code 
{
  font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; 
  color: #000000;
  background-color: #fafafa;
  font-size: 12px;
  border: 1px dashed #999999;
  line-height: 14px;
  padding: 5px;
  margin-left: 20px;
  margin-right: 20px;
  overflow: auto
}
+
table
{
  border-collapse: collapse;
  margin-left: 20px;
  margin-right: 20px;
}
+
th
{    
  vertical-align:top;
  border: 1px solid #000000;
  padding: 5px;
  text-align: left;
  font: 12px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
  background-color: #eee;
}
+
td
{    
  vertical-align:top;
  border: 1px solid #000000;
  padding: 5px;
  text-align: left;
  font: 12px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
}

h1
{
  font: 24px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
  border-bottom: 1px solid #000000;
  padding-bottom: 2px;
}
+
h2
{
  font: 20px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
  border-bottom: 1px solid #000000;
  padding-bottom: 2px;
}
+
h3
{
  font: 16px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
  border-bottom: 1px solid #000000;
  padding-bottom: 2px;
}
+
+div.copyright
+{
+  font: 12px "Trebuchet MS", Verdana, Arial, Helvetica, sans-serif;
+  text-align: center;
+  border-top: 1px solid #000000;
+  padding-top: 5px;
+  margin-top: 50px;
+  margin-bottom: 50px;
+}
+
+.help_breadcrumbs 
+{
+    font: message-box;
+    margin-bottom: 10px;
+}
+
+.deemphasized
+{
+   color: #888888
+}
+
+</style>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Extension System</a></div>
+
+<h1>Sapphire Extensions</h1>
+
+<a name="Services"><h2>Service</h2></a>
+
+<table>
+  <tr>
+    <th>ID</th>
+    <th>Description</th>
+    <th>Contexts</th>
+  </tr>
+  <tr>
+    <td>DiagramLayoutPersistenceService.Project</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Part</td>
+  </tr>
+  <tr>
+    <td>DiagramLayoutPersistenceService.SideBySide</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Part</td>
+  </tr>
+  <tr>
+    <td>DiagramLayoutPersistenceService.Workspace</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Part</td>
+  </tr>
+  <tr>
+    <td>Sapphire.CollationService.Declarative.Global</td>
+    <td>A CollationService implementation that derives its behavior from @Collation annotation.</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.CollationService.Declarative.Instance</td>
+    <td>A CollationService implementation that derives its behavior from @Collation annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.CollationService.Default</td>
+    <td>A CollationService implementation that is active when an explicit collation is not specified. The provided collation matches Java's default string comparison.</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.CollationService.ListFromValue</td>
+    <td>Implementation of CollationService for list properties based on CollationService implementation of list member's value property. This service implementation will only activate if the list property has one possible type, and that type has a single property, and that property is a value property.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ContentProposalService.PossibleValues</td>
+    <td>Implementation of ContentProposalService based on PossibleValuesService.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.DateToString</td>
+    <td>ConversionService implementation for Date to String conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.DateToString.Property</td>
+    <td>ConversionService implementation for Date to String conversions specified at property level using @Serialization annotation.</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.EnumToString</td>
+    <td>ConversionService implementation for Enum to String conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.IFileToWorkspaceFileResourceStore</td>
+    <td>ConversionService implementation for IFile to WorkspaceFileResourceStore conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.ModelElementToDomDocument</td>
+    <td>ConversionService implementation for ModelElement to DOM Document conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.ModelElementToDomElement</td>
+    <td>ConversionService implementation for ModelElement to DOM Element conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.ModelElementToXmlElement</td>
+    <td>ConversionService implementation for ModelElement to XmlElement conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.ObjectToRootXmlResource</td>
+    <td>ConversionService implementation for Object to RootXmlResource conversions. Conversion is only performed if the object can be converted to ByteArrayResourceStore and if the resource store corresponds to a file with "xml" extension or if the context element type has XML binding annotations.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.ObjectToString</td>
+    <td>ConversionService implementation for Object to String conversions that uses object's toString() method.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.ResourceStoreToFile</td>
+    <td>ConversionService implementation for WorkspaceFileResourceStore to File conversions via IFile.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.ResourceStoreToFile</td>
+    <td>ConversionService implementation for ResourceStore to File conversions via FileStoreEditorInput. Used in the case where an editor is open to a file outside of the workspace.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.ResourceStoreToIContainer</td>
+    <td>ConversionService implementation for ResourceStore to IContainer conversions via IFile.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.ResourceStoreToIFile</td>
+    <td>ConversionService implementation for ResourceStore to IFile conversions via FileEditorInput.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.ResourceStoreToIJavaProject</td>
+    <td>ConversionService implementation for ResourceStore to IJavaProject conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.ResourceStoreToIProject</td>
+    <td>ConversionService implementation for ResourceStore to IProject conversions via IFile.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToBigDecimal</td>
+    <td>ConversionService implementation for String to BigDecimal conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToBigInteger</td>
+    <td>ConversionService implementation for String to BigInteger conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToBoolean</td>
+    <td>ConversionService implementation for String to Boolean conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToByte</td>
+    <td>ConversionService implementation for String to Byte conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToColor</td>
+    <td>ConversionService implementation for String to Color conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToDate</td>
+    <td>ConversionService implementation for String to Date conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToDate.Property</td>
+    <td>ConversionService implementation for String to Date conversions specified at property level using @Serialization annotation.</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToDouble</td>
+    <td>ConversionService implementation for String to Double conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToEnum</td>
+    <td>ConversionService implementation for String to Enum conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToFileName</td>
+    <td>ConversionService implementation for String to FileName conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToFloat</td>
+    <td>ConversionService implementation for String to Float conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToFunction</td>
+    <td>ConversionService implementation for String to Function conversions.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToImageData</td>
+    <td>ConversionService implementation for String to ImageData conversions.</td>
+    <td>Sapphire.Element.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToInteger</td>
+    <td>ConversionService implementation for String to Integer conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToJavaIdentifier</td>
+    <td>ConversionService implementation for String to JavaIdentifier conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToJavaPackageName</td>
+    <td>ConversionService implementation for String to JavaPackageName conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToJavaTypeName</td>
+    <td>ConversionService implementation for String to JavaTypeName conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToLong</td>
+    <td>ConversionService implementation for String to Long conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToPath</td>
+    <td>ConversionService implementation for String to Path conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToShort</td>
+    <td>ConversionService implementation for String to Short conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToUri</td>
+    <td>ConversionService implementation for String to URI conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToUrl</td>
+    <td>ConversionService implementation for String to URL conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToVersion</td>
+    <td>ConversionService implementation for String to Version conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.StringToVersionConstraint</td>
+    <td>ConversionService implementation for String to VersionConstraint conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.WorkspaceFileResourceStoreToIFile</td>
+    <td>ConversionService implementation for WorkspaceFileResourceStore to IFile conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.XmlEditorResourceStoreToIEditorInputConversionService</td>
+    <td>ConversionService implementation for XmlEditorResourceStore to IEditorInput conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.XmlResourceToDomDocument</td>
+    <td>ConversionService implementation for XmlResource to DOM Document conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.XmlResourceToDomElement</td>
+    <td>ConversionService implementation for XmlResource to DOM Element conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ConversionService.XmlResourceToXmlElement</td>
+    <td>ConversionService implementation for XmlResource to XmlElement conversions.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.DefaultValueService.Standard</td>
+    <td>Implementation of DefaultValueService that draws the default value from @DefaultValue annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.DependenciesService.Declarative</td>
+    <td>Implementation of DependenciesService that exposes dependencies specified by the @DependsOn annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.DerivedValueService.Standard</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagrams.ConnectionService.Standard</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Part</td>
+  </tr>
+  <tr>
+    <td>Sapphire.DocumentationService.Element.Standard</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Element.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.DocumentationService.Property.Standard</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.EnablementService.FunctionBased</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.EnablementService.ParentPropertyState</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.EnablementService.VersionCompatibility</td>
+    <td>Implementation of EnablementService that determines property's enablement state based on property's compatibility with the version compatibility target.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsAggregationService</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.AbsolutePath</td>
+    <td>Creates fact statements about property's absolute path requirement by using semantical information specified by @AbsolutePath annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.DefaultValue</td>
+    <td>Creates fact statements about property's default value by using semantical information specified by DefaultValueService and @DefaultValue annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.Deprecated</td>
+    <td>Creates fact statements about property's deprecated state by using semantical information specified by @Deprecated annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.FileExtensions</td>
+    <td>Creates fact statements about valid file extensions for property's value by using semantical information specified by @FileExtensions annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.InitialValue</td>
+    <td>Creates fact statements about property's initial value by using semantical information specified by InitialValueService and @InitialValue annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.JavaTypeConstraint</td>
+    <td>Creates fact statements about Java type property's constraints by using semantical information specified by @JavaTypeConstraints annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.Length.List</td>
+    <td>An implementation of FactsService that creates fact statements about a list property's item count constraints by using the semantical information specified by the @Length annotation or the deprecated @CountConstraint annotation.</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.Length.Value</td>
+    <td>An implementation of FactsService that creates fact statements about a value property's text length constraints by using the semantical information specified by the @Length annotation.</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.MustExist</td>
+    <td>Creates fact statements about existence requirement on the entity referenced by property's value by using semantical information specified by @MustExist annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.NumericRange</td>
+    <td>Creates fact statements about numeric value property's range by using semantical information specified by @NumericRange annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.PreferDefaultValue</td>
+    <td>Creates fact statements about property's recommended value by using semantical information specified by @PreferDefaultValue annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.ProjectRelativePath</td>
+    <td>Creates fact statements about property's relative to the project path requirement by using semantical information specified by @ProjectRelativePath annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.ReadOnly</td>
+    <td>Creates fact statements about property's read-only state by using semantical information specified by @ReadOnly annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.Required</td>
+    <td>FactsService implementation that contributes fact statements based on semantics specified by RequiredConstraintService.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.Serialization</td>
+    <td>Creates fact statements about property's serialization by using semantical information specified by the @Serialization annotation.</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.Static</td>
+    <td>Creates fact statements about property by using static content specified in @Fact and @Facts annotations.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.Unique</td>
+    <td>Creates fact statements about value property's uniqueness constraint by using semantical information specified by @Unique annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.ValidFileSystemResourceType</td>
+    <td>Creates fact statements about valid file system resource type (file or folder) for property's value by using semantical information specified by @ValidFileSystemResourceType annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.VersionCompatibility</td>
+    <td>Creates fact statements about property's version compatibility by using semantic information specified by @Since and @VersionCompatibility annotations.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FactsService.WorkspaceRelativePath</td>
+    <td>Creates fact statements about property's relative to the workspace path requirement by using semantical information specified by @WorkspaceRelativePath annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.FileExtensionsService.Declarative</td>
+    <td>Implementation of FileExtensionsService that derives its behavior from @FileExtensions annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ImageService.Static</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Element.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.InitialValueService.Standard</td>
+    <td>Implementation of InitialValueService that draws the initial value from @InitialValue annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Java.JDT.ConversionService.ElementToContext</td>
+    <td>ConversionService implementation for Element to Context conversions when the resource is inside a Java project.</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Java.JDT.TypeReferenceService</td>
+    <td>Resolves Java types visible to the Java project that the model is loaded from.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Java.TypeConstraintService</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Java.TypeReferenceService</td>
+    <td>Resolves Java types visible to the class loader that contains a given model element type interface.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Java.TypeValidationService</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ListSelectionService</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Part</td>
+  </tr>
+  <tr>
+    <td>Sapphire.LoggingService.Platform</td>
+    <td>&nbsp;</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.LoggingService.Standard</td>
+    <td>&nbsp;</td>
+    <td>Sapphire</td>
+  </tr>
+  <tr>
+    <td>Sapphire.MasterConversionService</td>
+    <td>Converts an object to the specified type by delegating to available ConversionService and UniversalConversionService implementations. If object is null or is already of desired type, the object is returned unchanged.</td>
+    <td>Sapphire<br/>Sapphire.Element.MetaModel<br/>Sapphire.Element.Instance<br/>Sapphire.Property.MetaModel<br/>Sapphire.Property.Instance<br/>Sapphire.Part</td>
+  </tr>
+  <tr>
+    <td>Sapphire.MasterVersionCompatibilityService</td>
+    <td>Aggregates the data from all applicable version compatibility services in order to produce a single statement about version compatibility. An implementation of this service is provided with Sapphire. This service is not intended to be implemented by adopters.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PossibleTypesService.Standard</td>
+    <td>Implementation of PossibleTypesService using information specified by @Type annotation.</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PossibleValuesService.ElementReference</td>
+    <td>PossibleValuesService implementation that derives its behavior from ElementReferenceService.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PossibleValuesService.Enum</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PossibleValuesService.ListFromValue</td>
+    <td>Implementation of PossibleValuesService for list properties based on PossibleValuesService implementation of list member's value property. This service implementation will only activate if the list property has one possible type, and that type has a single property, and that property is a value property, and that value property has a PossibleValuesService implementation in the property metamodel context.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PossibleValuesService.ModelBased</td>
+    <td>PossibleValuesService implementation that derives its behavior from @PossibleValues annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PossibleValuesService.Static.List</td>
+    <td>Implementation of PossibleValuesService based on @PossibleValues annotation's values attribute..</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PossibleValuesService.Static.Value</td>
+    <td>Implementation of PossibleValuesService based on @PossibleValues annotation's values attribute..</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PossibleValuesService.ValueFromList</td>
+    <td>Implementation of PossibleValuesService for value properties based on PossibleValuesService implementation of the containing list property. This service implementation will only activate if the value property is the sole property in its type, and the element is contained by a list property, and the list property has a PossibleValueService implementation in the property instance context.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ProblemsTraversalService</td>
+    <td>Produces a problem-annotated traversal order through the content outline, which can be used to find the next error or warning from any location in the content outline. An implementation of this service is provided with Sapphire. This service is not intended to be implemented by adopters.</td>
+    <td>Sapphire.Part</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ReferenceService.ElementReference</td>
+    <td>ReferenceService implementation that derives its behavior from @ElementReference annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.RelativePathService.Model</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.RelativePathService.Project</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.RelativePathService.Workspace</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.RequiredConstraintService.Declarative</td>
+    <td>RequiredConstraintService implementation that derives its behavior from @Required annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.SDK.UI.Definition.Java.TypeReferenceService</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.UI.Definition.Java.TypeReferenceService</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.AbsolutePath</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.Declarative</td>
+    <td>ValidationService implementation that derives its behavior from @Validation annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.Length.List</td>
+    <td>An implementation of ValidationService that produces a validation error when a list property's item count is outside of the constraints specified by the @Length annotation or the deprecated @CountConstraint annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.Length.Value</td>
+    <td>An implementation of ValidationService that produces a validation error when a value property's text length is outside of the constraints specified by the @Length annotation.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.MalformedValue</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.NumericRange</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.PossibleValues</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.PreferDefaultValue</td>
+    <td>Implementation of ValidationService that produces a validation warning when property value doesn't match its default.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.ProjectRelativePath</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.Reference</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.RelativePath</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.Required</td>
+    <td>ValidationService implementation that validates whether the property conforms to semantics specified by RequiredConstraintService.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.UniqueValue</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValidationService.VersionCompatibility</td>
+    <td>An implementation of ValidationService that produces a validation error when a property is not compatible with the version compatibility target yet contains data.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValueImageService.Default</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValueImageService.Enum</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValueLabelService.Default</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValueLabelService.Enum</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.MetaModel</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValueNormalizationService</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ValueNormalizationService.FileName</td>
+    <td>Implementation of ValueNormalizationService for value properties of type FileName.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.VersionCompatibilityService.Declarative</td>
+    <td>Implementation of VersionCompatibilityService that derives its behavior from @VersionCompatibility and @Since annotations.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.VersionCompatibilityService.ParentBased</td>
+    <td>Implementation of VersionCompatibilityService that derives its behavior from version compatibility of the containing element's parent property.</td>
+    <td>Sapphire.Property.Instance</td>
+  </tr>
+  <tr>
+    <td>Sapphire.VersionCompatibilityTargetService.Declarative</td>
+    <td>Implementation of VersionCompatibilityTargetService that derives its behavior from @VersionCompatibilityTarget annotation.</td>
+    <td>Sapphire.Element.Instance<br/>Sapphire.Property.Instance</td>
+  </tr>
+</table>
+
+<a name="Functions"><h2>Functions</h2></a>
+
+<table>
+  <tr>
+    <th>Name</th>
+    <th>Description</th>
+    <th>Implementation Class</th>
+  </tr>
+  <tr>
+    <td>Absolute</td>
+    <td>Returns the absolute path of a value for properties with a RelativePathService.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.AbsolutePathFunction</td>
+  </tr>
+  <tr>
+    <td>Avg</td>
+    <td>Computes the average of numbers in a collection. Typically, this function takes the collection as the sole parameter. However, when the collection is a model element list, a second parameter may be necessary to specify the name (in the form of a string) of the list entry's value property to use in aggregation. If the the collection is a model element list and the second parameter is not specified, this function will use list entry's first value property for aggregation. An average of an empty collection is 0.</td>
+    <td>org.eclipse.sapphire.modeling.el.AvgFunction</td>
+  </tr>
+  <tr>
+    <td>Concat</td>
+    <td>Concatenates two or more strings into a single string. Particularly useful in contexts where composite expressions cannot be used, such as where the result of concatenation needs to feed into another function or operator.</td>
+    <td>org.eclipse.sapphire.modeling.el.ConcatFunction</td>
+  </tr>
+  <tr>
+    <td>Content</td>
+    <td>Returns the content of a value or a transient. For value properties, the default is taken into account, if applicable.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.ContentFunction</td>
+  </tr>
+  <tr>
+    <td>Enabled</td>
+    <td>Returns the enablement of a property.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.EnabledFunction</td>
+  </tr>
+  <tr>
+    <td>Enabled</td>
+    <td>Determines if the property associated with the property editor is enabled. Can only be used in the context of a property editor.</td>
+    <td>org.eclipse.sapphire.ui.internal.PropertyEditorEnabledFunction</td>
+  </tr>
+  <tr>
+    <td>EncodeToXml</td>
+    <td>Encodes text for use as XML element content or an attribute value.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.EncodeToXmlFunction</td>
+  </tr>
+  <tr>
+    <td>EndsWith</td>
+    <td>Tests if a string ends with the specified suffix.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.EndsWithFunction</td>
+  </tr>
+  <tr>
+    <td>FirstSegment</td>
+    <td>Breaks a string into segments using the provided separators and returns the first segment. If no separators are found in the string, the entire string is returned. This function takes two string operands. The first is the string to tokenize. The second is a sequence of characters that individually should be treated as valid separators.</td>
+    <td>org.eclipse.sapphire.modeling.el.FirstSegmentFunction</td>
+  </tr>
+  <tr>
+    <td>Fragment</td>
+    <td>Returns a fragment of a string. The fragment starts at the index specified by the second argument and extends to the character before the index specified by the third argument. The length of the fragment is end index minus start index. A negative start index is normalized to zero. A start index exceeding the length of the input is normalized to the length of the input. An end index exceeding the length of the input is normalized to the length of the input. An end index that is smaller than the start index is normalized to the start index.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.FragmentFunction</td>
+  </tr>
+  <tr>
+    <td>Global</td>
+    <td>Returns a map of global objects maintained through Sapphire.global() API.</td>
+    <td>org.eclipse.sapphire.modeling.el.GlobalFunction</td>
+  </tr>
+  <tr>
+    <td>Head</td>
+    <td>Returns a fragment of a string starting at the beginning and not exceeding the specified length. A negative fragment length is normalized to zero. A fragment length exceeding the length of the input is normalized to the length of the input.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.HeadFunction</td>
+  </tr>
+  <tr>
+    <td>Image</td>
+    <td>Returns the image associated with the context model element.</td>
+    <td>org.eclipse.sapphire.modeling.el.ImageFunction</td>
+  </tr>
+  <tr>
+    <td>Index</td>
+    <td>Determines the index of a model element within its parent list.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.IndexFunction</td>
+  </tr>
+  <tr>
+    <td>InstanceOf</td>
+    <td>Determines if an object is of specified type. The object to be checked is the first operand and the type is the second operand. The type must be a fully-qualified Java class name.</td>
+    <td>org.eclipse.sapphire.modeling.el.InstanceOfFunction</td>
+  </tr>
+  <tr>
+    <td>LastSegment</td>
+    <td>Breaks a string into segments using the provided separators and returns the last segment. If no separators are found in the string, the entire string is returned. This function takes two string operands. The first is the string to tokenize. The second is a sequence of characters that individually should be treated as valid separators.</td>
+    <td>org.eclipse.sapphire.modeling.el.LastSegmentFunction</td>
+  </tr>
+  <tr>
+    <td>List</td>
+    <td>Constructs a list from arbitrary number of operands.</td>
+    <td>org.eclipse.sapphire.modeling.el.ListFunction</td>
+  </tr>
+  <tr>
+    <td>LowerCase</td>
+    <td>Converts a string to lower case. Can be used either as LowerCase( Name ) or as Name.LowerCase().</td>
+    <td>org.eclipse.sapphire.modeling.el.LowerCaseFunction</td>
+  </tr>
+  <tr>
+    <td>Matches</td>
+    <td>Determines whether a string matches a regular expression. The full semantics are specified by Java's String.matches() function.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.MatchesFunction</td>
+  </tr>
+  <tr>
+    <td>Max</td>
+    <td>Finds the largest number in a collection. Typically, this function takes the collection as the sole parameter. However, when the collection is a model element list, a second parameter may be necessary to specify the name (in the form of a string) of the list entry's value property to use in aggregation. If the the collection is a model element list and the second parameter is not specified, this function will use list entry's first value property for aggregation.</td>
+    <td>org.eclipse.sapphire.modeling.el.MaxFunction</td>
+  </tr>
+  <tr>
+    <td>Message</td>
+    <td>Returns the message from a validation result.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.MessageFunction</td>
+  </tr>
+  <tr>
+    <td>Min</td>
+    <td>Finds the smallest number in a collection. Typically, this function takes the collection as the sole parameter. However, when the collection is a model element list, a second parameter may be necessary to specify the name (in the form of a string) of the list entry's value property to use in aggregation. If the the collection is a model element list and the second parameter is not specified, this function will use list entry's first value property for aggregation.</td>
+    <td>org.eclipse.sapphire.modeling.el.MinFunction</td>
+  </tr>
+  <tr>
+    <td>Parent</td>
+    <td>Returns the parent of the current model element.</td>
+    <td>org.eclipse.sapphire.modeling.el.ParentElementFunction</td>
+  </tr>
+  <tr>
+    <td>Parent</td>
+    <td>Returns the parent of the given part.</td>
+    <td>org.eclipse.sapphire.ui.internal.PartParentFunction</td>
+  </tr>
+  <tr>
+    <td>Part</td>
+    <td>Returns the context part.</td>
+    <td>org.eclipse.sapphire.ui.internal.PartFunction</td>
+  </tr>
+  <tr>
+    <td>Replace</td>
+    <td>Replaces all occurrences of a regular expression pattern with the provided replacement text. The full semantics are specified by Java's String.replaceAll( String, String ) function.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.ReplaceFunction</td>
+  </tr>
+  <tr>
+    <td>Root</td>
+    <td>Returns the root of the model.</td>
+    <td>org.eclipse.sapphire.modeling.el.RootElementFunction</td>
+  </tr>
+  <tr>
+    <td>SapphireVersionMatches</td>
+    <td>Determines whether Sapphire version matches a version constraint. A version constraint is a comma-separated list of specific versions, closed ranges (expressed using "[1.2.3-4.5)" syntax and open ranges (expressed using "[1.2.3" or "4.5)" syntax). The square brackets indicate that the range includes the specified version. The parenthesis indicate that the range goes up to, but does not actually include the specified version.</td>
+    <td>org.eclipse.sapphire.modeling.el.SapphireVersionMatchesFunction</td>
+  </tr>
+  <tr>
+    <td>Scale</td>
+    <td>Changes the scale of a decimal.</td>
+    <td>org.eclipse.sapphire.modeling.el.ScaleFunction</td>
+  </tr>
+  <tr>
+    <td>Severity</td>
+    <td>Returns the severity of a validation result.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.SeverityFunction</td>
+  </tr>
+  <tr>
+    <td>Size</td>
+    <td>Determines the size of a collection, a map, an array or a string.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.SizeFunction</td>
+  </tr>
+  <tr>
+    <td>StartsWith</td>
+    <td>Tests if a string starts with the specified prefix.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.StartsWithFunction</td>
+  </tr>
+  <tr>
+    <td>State</td>
+    <td>Returns the root element of editor page's persisted state, allowing access to various state properties. This is particularly useful when the persisted state is extended with custom properties wired to custom actions, as it allows any EL-enabled facility to integrate with the custom state property.</td>
+    <td>org.eclipse.sapphire.ui.internal.StateFunction</td>
+  </tr>
+  <tr>
+    <td>Sum</td>
+    <td>Computes the sum of numbers in a collection. Typically, this function takes the collection as the sole parameter. However, when the collection is a model element list, a second parameter may be necessary to specify the name (in the form of a string) of the list entry's value property to use in aggregation. If the the collection is a model element list and the second parameter is not specified, this function will use list entry's first value property for aggregation. A sum of an empty collection is 0.</td>
+    <td>org.eclipse.sapphire.modeling.el.SumFunction</td>
+  </tr>
+  <tr>
+    <td>Tail</td>
+    <td>Returns a fragment of a string starting at the end and not exceeding the specified length. A negative fragment length is normalized to zero. A fragment length exceeding the length of the input is normalized to the length of the input.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.TailFunction</td>
+  </tr>
+  <tr>
+    <td>Text</td>
+    <td>Returns the text of a value, taking into account the default, if applicable.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.TextFunction</td>
+  </tr>
+  <tr>
+    <td>UpperCase</td>
+    <td>Converts a string to upper case. Can be used either as UpperCase( Name ) or as Name.UpperCase().</td>
+    <td>org.eclipse.sapphire.modeling.el.UpperCaseFunction</td>
+  </tr>
+  <tr>
+    <td>Validation</td>
+    <td>Returns the validation result of a property.</td>
+    <td>org.eclipse.sapphire.modeling.el.internal.ValidationFunction</td>
+  </tr>
+  <tr>
+    <td>Validation</td>
+    <td>Returns the validation result of a part.</td>
+    <td>org.eclipse.sapphire.ui.internal.PartValidationFunction</td>
+  </tr>
+  <tr>
+    <td>VersionMatches</td>
+    <td>Determines whether a version matches a version constraint. A version constraint is a comma-separated list of specific versions, closed ranges (expressed using "[1.2.3-4.5)" syntax and open ranges (expressed using "[1.2.3" or "4.5)" syntax). The square brackets indicate that the range includes the specified version. The parenthesis indicate that the range goes up to, but does not actually include the specified version.</td>
+    <td>org.eclipse.sapphire.modeling.el.VersionMatchesFunction</td>
+  </tr>
+</table>
+
+<a name="Actions"><h2>Action</h2></a>
+
+<table>
+  <tr>
+    <th>Action ID</th>
+    <th>Description</th>
+    <th>Key Binding</th>
+    <th>Contexts</th>
+  </tr>
+  <tr>
+    <td>Sapphire.Add</td>
+    <td>Adds an entity. A common use is to add a new element to the model.</td>
+    <td>SHIFT+CONTROL+ALT+n</td>
+    <td>Sapphire.ListPropertyEditor<br/>Sapphire.EditorPage.Outline.Node<br/>Sapphire.Diagram.Editor<br/>Sapphire.Diagram.Node<br/>Sapphire.Diagram.Node.Shape</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Assist</td>
+    <td>Shows property editor assistance popup. The popup can also be accessed by clicking on the small decorator image (either a light builb, an error marker or a warning marker) that appears next to the property editor.</td>
+    <td>SHIFT+CONTROL+ALT+i</td>
+    <td>Sapphire.ValuePropertyEditor<br/>Sapphire.ElementPropertyEditor<br/>Sapphire.ListPropertyEditor<br/>Sapphire.WithDirective</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Browse</td>
+    <td>Browses among possible values for a property.</td>
+    <td>SHIFT+CONTROL+ALT+l</td>
+    <td>Sapphire.ValuePropertyEditor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Create</td>
+    <td>Creates the entity referenced by the property value.</td>
+    <td>SHIFT+CONTROL+ALT+c</td>
+    <td>Sapphire.ValuePropertyEditor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Delete</td>
+    <td>Deletes an entity. A common use is to delete an element from the model.</td>
+    <td>DEL</td>
+    <td>Sapphire.ListPropertyEditor<br/>Sapphire.EditorPage.Outline<br/>Sapphire.EditorPage.Outline.Node<br/>Sapphire.Diagram.Node<br/>Sapphire.Diagram.Node.Shape<br/>Sapphire.Diagram.Connection<br/>Sapphire.Diagram.MultipleParts</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.DeleteAllBendPoints</td>
+    <td>Deletes all bend points from a connection.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Connection<br/>Sapphire.Diagram.MultipleParts</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.DirectEdit</td>
+    <td>Direct edit a node, shape or connection</td>
+    <td>F2</td>
+    <td>Sapphire.Diagram.Node.Hidden<br/>Sapphire.Diagram.Connection.Hidden<br/>Sapphire.Diagram.Node.Shape.Hidden</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Grid.Toggle</td>
+    <td>Show or hide the grid</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Editor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Guides.Toggle</td>
+    <td>Show or hide the guides</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Editor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Layout</td>
+    <td>Apply auto layout to diagram</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Editor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Node.Default</td>
+    <td>&nbsp;</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Node</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Print</td>
+    <td>Print the diagram.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Editor<br/>Sapphire.Diagram.Header</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.SaveAsImage</td>
+    <td>Save the diagram as an image.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Editor<br/>Sapphire.Diagram.Header</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.SelectAll</td>
+    <td>Select all edit parts in the diagram</td>
+    <td>CONTROL+a</td>
+    <td>Sapphire.Diagram.Editor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.SelectAllNodes</td>
+    <td>Select all node edit parts in the diagram</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Editor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Zoom.Actual</td>
+    <td>Zoom the diagram to actual size.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Editor<br/>Sapphire.Diagram.Header</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Zoom.In</td>
+    <td>Zoom in the diagram.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Editor<br/>Sapphire.Diagram.Header</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Zoom.Out</td>
+    <td>Zoom out the diagram.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Editor<br/>Sapphire.Diagram.Header</td>
+  </tr>
+  <tr>
+    <td>Sapphire.DoubleTap</td>
+    <td>&nbsp;</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Node.Shape.Hidden</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Help</td>
+    <td>Shows help content for the entity.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.EditorPage<br/>Sapphire.Section</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Jump</td>
+    <td>Shows the entity referenced by the property value. A common use is to open a file or another resource type referenced by a path held by the property.</td>
+    <td>SHIFT+CONTROL+ALT+j</td>
+    <td>Sapphire.ValuePropertyEditor<br/>Sapphire.ListPropertyEditor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Move.Down</td>
+    <td>Moves an entity down, from the perspective of how the entity appears on the screen. A common use is to move a model element one position towards the end of the list, swapping places with the following element.</td>
+    <td>SHIFT+CONTROL+ALT+ARROW_DOWN</td>
+    <td>Sapphire.ListPropertyEditor<br/>Sapphire.EditorPage.Outline.Node<br/>Sapphire.Diagram.Node.Shape</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Move.Left</td>
+    <td>Moves an entity to the left, from the perspective of how the entity appears on the screen.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.ListPropertyEditor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Move.Right</td>
+    <td>Moves an entity to the right, from the perspective of how the entity appears on the screen.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.ListPropertyEditor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Move.Up</td>
+    <td>Moves an entity up, from the perspective of how the entity appears on the screen. A common use is to move a model element one position towards the beginning of the list, swapping places with the preceding element.</td>
+    <td>SHIFT+CONTROL+ALT+ARROW_UP</td>
+    <td>Sapphire.ListPropertyEditor<br/>Sapphire.EditorPage.Outline.Node<br/>Sapphire.Diagram.Node.Shape</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Outline.CollapseAll</td>
+    <td>Collapses all nodes in the content outline.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.EditorPage.Outline.Header</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Outline.ExpandAll</td>
+    <td>Expands all nodes in the content outline.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.EditorPage.Outline.Header</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Outline.Hide</td>
+    <td>Hides the content outline that is embedded in an editor page. This is a toggle action. It can be used to show the embedded outline after it has been hidden.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.EditorPage</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Restore.Defaults</td>
+    <td>Restores properties in a section to their default values. For value properties, it means setting the property to null. For list properties, it means clearing the list.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Section</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ShowInPropertiesView</td>
+    <td>&nbsp;</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.Diagram.Editor<br/>Sapphire.Diagram.Node<br/>Sapphire.Diagram.Node.Shape<br/>Sapphire.Diagram.Connection</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ShowInSource</td>
+    <td>Shows the model element associated with a given part in the corresponding source editor.</td>
+    <td>&nbsp;</td>
+    <td>Sapphire.EditorPage.Outline.Node<br/>Sapphire.Diagram.Node<br/>Sapphire.Diagram.Connection<br/>Sapphire.Diagram.Node.Shape</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ShowNextError</td>
+    <td>Shows the next validation error.</td>
+    <td>SHIFT+CONTROL+ALT+e</td>
+    <td>Sapphire.EditorPage.Outline.Node</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ShowNextWarning</td>
+    <td>Shows the next validation warning.</td>
+    <td>SHIFT+CONTROL+ALT+w</td>
+    <td>Sapphire.EditorPage.Outline.Node</td>
+  </tr>
+</table>
+
+<a name="ActionHandlers"><h2>Action Handlers</h2></a>
+
+<table>
+  <tr>
+    <th>Action</th>
+    <th>Action Handler ID</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>Sapphire.Browse</td>
+    <td>Sapphire.Browse.Calendar</td>
+    <td>Opens a calendar to allow date selection. Activates if the property is a value property of type Date.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Browse</td>
+    <td>Sapphire.Browse.Color</td>
+    <td>Opens a color browse dialog. Activates if the property is a value property of type Color.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Browse</td>
+    <td>Sapphire.Browse.File.Absolute</td>
+    <td>Opens the native file browse dialog. Activates if the property is a value property, has @AbsolutePath annotation and has @ValidFileSystemResourceType annotation that specifies file type.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Browse</td>
+    <td>Sapphire.Browse.Folder.Absolute</td>
+    <td>Opens the native folder browse dialog. Activates if the property is a value property, has @AbsolutePath annotation and has @ValidFileSystemResourceType annotation that specifies folder type.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Browse</td>
+    <td>Sapphire.Browse.Java.Package</td>
+    <td>Opens a browse dialog listing applicable Java packages of the current project. Activates if the property is a value property and of type JavaPackageName.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Browse</td>
+    <td>Sapphire.Browse.Java.Type</td>
+    <td>Opens a browse dialog listing applicable Java types. Activates if the property is a reference value property from JavaTypeName to JavaType.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Browse</td>
+    <td>Sapphire.Browse.Path.Relative</td>
+    <td>Opens a browse dialog for a relative path to a file or a folder. Activates if the property is a value property and has a RelativePathService.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Browse</td>
+    <td>Sapphire.Browse.Possible</td>
+    <td>Opens a browse dialog listing possible values for the property. Activates if the property is a value property and has either @PossibleValuesProvider, @PossibleValues or @PossibleValuesFromModel annotation.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Create</td>
+    <td>Sapphire.Create.Java.Annotation</td>
+    <td>Creates the specified Java type and opens the created type using Eclipse Java Editor. Activates if the property is a reference value property from JavaTypeName to JavaType, has a @JavaTypeConstraint and specifies ANNOTATION among type kinds.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Create</td>
+    <td>Sapphire.Create.Java.Class</td>
+    <td>Creates the specified Java type and opens the created type using Eclipse Java Editor. Activates if the property is a reference value property from JavaTypeName to JavaType, has a @JavaTypeConstraint and specifies CLASS or ABSTRACT_CLASS among type kinds.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Create</td>
+    <td>Sapphire.Create.Java.Enum</td>
+    <td>Creates the specified Java type and opens the created type using Eclipse Java Editor. Activates if the property is a reference value property from JavaTypeName to JavaType, has a @JavaTypeConstraint and specifies ENUM among type kinds.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Create</td>
+    <td>Sapphire.Create.Java.Interface</td>
+    <td>Creates the specified Java type and opens the created type using Eclipse Java Editor. Activates if the property is a reference value property from JavaTypeName to JavaType, has a @JavaTypeConstraint and specifies INTERFACE among type kinds.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Delete</td>
+    <td>Sapphire.Diagram.Delete</td>
+    <td>Deletes the model element associated with a given diagram node or connection.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Delete</td>
+    <td>Sapphire.Outline.Delete</td>
+    <td>Deletes the model element associated with a given content outline node. Activates if the UI part is a content outline or a content outline node. All affected nodes must have the same parent and that parent must be a list property.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.DeleteAllBendPoints</td>
+    <td>Sapphire.Diagram.DeleteAllBendPoints.Connection</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.DeleteAllBendPoints</td>
+    <td>Sapphire.Diagram.DeleteAllBendPoints.MultipleParts</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.DirectEdit</td>
+    <td>Sapphire.Diagram.DirectEdit</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Grid.Toggle</td>
+    <td>Sapphire.Diagram.Grid.Toggle</td>
+    <td>Show/Hide diagram grid</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Guides.Toggle</td>
+    <td>Sapphire.Diagram.Guides.Toggle</td>
+    <td>Show/Hide guides</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Layout</td>
+    <td>Sapphire.Diagram.Layout.Horizontal</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Layout</td>
+    <td>Sapphire.Diagram.Layout.Vertical</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Print</td>
+    <td>Sapphire.Diagram.Print</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.SaveAsImage</td>
+    <td>Sapphire.Diagram.SaveAsImage</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.SelectAll</td>
+    <td>Sapphire.Diagram.SelectAll</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.SelectAllNodes</td>
+    <td>Sapphire.Diagram.SelectAllNodes</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Zoom.Actual</td>
+    <td>Sapphire.Diagram.Zoom.Actual</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Zoom.In</td>
+    <td>Sapphire.Diagram.Zoom.In</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Diagram.Zoom.Out</td>
+    <td>Sapphire.Diagram.Zoom.Out</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Help</td>
+    <td>Sapphire.Help</td>
+    <td>Shows the documentation associated with a given UI part using Eclipse context help view.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Jump</td>
+    <td>Sapphire.Jump.Java.Type</td>
+    <td>Opens the specified Java type using Eclipse Java Editor. Activates if the property is a reference value property from JavaTypeName to JavaType.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Jump</td>
+    <td>Sapphire.Jump.Path.Relative</td>
+    <td>Opens the file specified by a relative path using the associated Eclipse editor. Activates if the property is a value property and has a RelativePathService.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Jump</td>
+    <td>Sapphire.Jump.URL</td>
+    <td>Opens the specified URL using an external web browser. Activates if the property is of type URL.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Move.Down</td>
+    <td>Sapphire.Diagram.MoveShapeDown</td>
+    <td>Moves the model element one position towards the end of the containing list, swapping places with the following element. Activates if selected part is a child of a shape factory.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Move.Down</td>
+    <td>Sapphire.Outline.Move.Down</td>
+    <td>Moves the model element one position towards the end of the containing list, swapping places with the following element. Activates if the UI part is a content outline node. The affected node must have a list property parent.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Move.Up</td>
+    <td>Sapphire.Diagram.MoveShapeUp</td>
+    <td>Moves the model element one position towards the beginning of the containing list, swapping places with the preceding element. Activates if selected part is a child of a shape factory.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Move.Up</td>
+    <td>Sapphire.Outline.Move.Up</td>
+    <td>Moves the model element one position towards the beginning of the containing list, swapping places with the preceding element. Activates if the UI part is a content outline node. The affected node must have a list property parent.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Outline.CollapseAll</td>
+    <td>Sapphire.Outline.CollapseAll</td>
+    <td>Collapses all nodes in the content outline.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Outline.ExpandAll</td>
+    <td>Sapphire.Outline.ExpandAll</td>
+    <td>Expands all nodes in the content outline.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Restore.Defaults</td>
+    <td>Sapphire.Restore.Defaults</td>
+    <td>Opens a dialog showing all properties in the section with non-default values. The user can select which of those properties to restore to their default state.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ShowInPropertiesView</td>
+    <td>Sapphire.Diagram.ShowInPropertiesView</td>
+    <td>&nbsp;</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ShowInSource</td>
+    <td>Sapphire.Diagram.ShowInSource</td>
+    <td>Shows the model element associated with a given diagram node in the corresponding source editor.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ShowInSource</td>
+    <td>Sapphire.Outline.ShowInSource</td>
+    <td>Shows the model element associated with a given content outline node in the corresponding source editor.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ShowNextError</td>
+    <td>Sapphire.ShowNextError.Outline</td>
+    <td>Shows the next validation error.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.ShowNextWarning</td>
+    <td>Sapphire.ShowNextWarning.Outline</td>
+    <td>Shows the next validation warning</td>
+  </tr>
+</table>
+
+<a name="ActionHandlerFactories"><h2>Action Handler Factories</h2></a>
+
+<table>
+  <tr>
+    <th>Action</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>Sapphire.Add</td>
+    <td>Creates an add action handler for every node type.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Add</td>
+    <td>Creates an add action handler for every shape factory.</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Add</td>
+    <td>Creates an add action handler for every possible member element type for all lists whose members are shown as child nodes beneath the content outline node in question.</td>
+  </tr>
+</table>
+
+<a name="PresentationStyles"><h2>Presentation Styles</h2></a>
+
+<table>
+  <tr>
+    <th>ID</th>
+    <th>Part Type</th>
+  </tr>
+  <tr>
+    <td>Sapphire.Actuator.Button</td>
+    <td>Sapphire.Actuator</td>
+  </tr>
+  <tr>
+    <td>Sapphire.Actuator.Link</td>
+    <td>Sapphire.Actuator</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PropertyEditor.PopUpListField</td>
+    <td>Sapphire.PropertyEditor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PropertyEditor.PopUpListField.Editable</td>
+    <td>Sapphire.PropertyEditor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PropertyEditor.PopUpListField.Strict</td>
+    <td>Sapphire.PropertyEditor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PropertyEditor.RadioButtonGroup</td>
+    <td>Sapphire.PropertyEditor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PropertyEditor.RadioButtonGroup.Horizontal</td>
+    <td>Sapphire.PropertyEditor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PropertyEditor.RadioButtonGroup.Vertical</td>
+    <td>Sapphire.PropertyEditor</td>
+  </tr>
+  <tr>
+    <td>Sapphire.PropertyEditor.Scale</td>
+    <td>Sapphire.PropertyEditor</td>
+  </tr>
+</table>
+<br/><br/>
+
+</body>
+
+</html>
diff --git a/releases/8.2.4/documentation/extensions/images/editor-1.png b/releases/8.2.4/documentation/extensions/images/editor-1.png
new file mode 100644
index 0000000..aca37cf
--- /dev/null
+++ b/releases/8.2.4/documentation/extensions/images/editor-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/extensions/images/editor-2.png b/releases/8.2.4/documentation/extensions/images/editor-2.png
new file mode 100644
index 0000000..216a026
--- /dev/null
+++ b/releases/8.2.4/documentation/extensions/images/editor-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/extensions/index.html b/releases/8.2.4/documentation/extensions/index.html
new file mode 100644
index 0000000..63c3175
--- /dev/null
+++ b/releases/8.2.4/documentation/extensions/index.html
@@ -0,0 +1,43 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Sapphire Extension System</title>
+  <link rel="StyleSheet" href="../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > </div>
+
+
+<h1>Sapphire Extension System</h1>
+
+<ul>
+  <li><a href="existing.html">Existing Extensions</a></li>
+  <li><a href="contributing.html">Contributing Extensions</a></li>
+</ul>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/focus/browsing/images/browse-buttons.png b/releases/8.2.4/documentation/focus/browsing/images/browse-buttons.png
new file mode 100644
index 0000000..ccffa3c
--- /dev/null
+++ b/releases/8.2.4/documentation/focus/browsing/images/browse-buttons.png
Binary files differ
diff --git a/releases/8.2.4/documentation/focus/browsing/images/java-type.png b/releases/8.2.4/documentation/focus/browsing/images/java-type.png
new file mode 100644
index 0000000..7ef0edf
--- /dev/null
+++ b/releases/8.2.4/documentation/focus/browsing/images/java-type.png
Binary files differ
diff --git a/releases/8.2.4/documentation/focus/browsing/images/multi-way-1.png b/releases/8.2.4/documentation/focus/browsing/images/multi-way-1.png
new file mode 100644
index 0000000..2b6ee32
--- /dev/null
+++ b/releases/8.2.4/documentation/focus/browsing/images/multi-way-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/focus/browsing/images/multi-way-2.png b/releases/8.2.4/documentation/focus/browsing/images/multi-way-2.png
new file mode 100644
index 0000000..17ad14b
--- /dev/null
+++ b/releases/8.2.4/documentation/focus/browsing/images/multi-way-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/focus/browsing/images/multi-way-3.png b/releases/8.2.4/documentation/focus/browsing/images/multi-way-3.png
new file mode 100644
index 0000000..0efa281
--- /dev/null
+++ b/releases/8.2.4/documentation/focus/browsing/images/multi-way-3.png
Binary files differ
diff --git a/releases/8.2.4/documentation/focus/browsing/images/multi-way-sapphire.png b/releases/8.2.4/documentation/focus/browsing/images/multi-way-sapphire.png
new file mode 100644
index 0000000..d1fac89
--- /dev/null
+++ b/releases/8.2.4/documentation/focus/browsing/images/multi-way-sapphire.png
Binary files differ
diff --git a/releases/8.2.4/documentation/focus/browsing/images/possible-values.png b/releases/8.2.4/documentation/focus/browsing/images/possible-values.png
new file mode 100644
index 0000000..c61d021
--- /dev/null
+++ b/releases/8.2.4/documentation/focus/browsing/images/possible-values.png
Binary files differ
diff --git a/releases/8.2.4/documentation/focus/browsing/images/relative-path.png b/releases/8.2.4/documentation/focus/browsing/images/relative-path.png
new file mode 100644
index 0000000..3ceb3f3
--- /dev/null
+++ b/releases/8.2.4/documentation/focus/browsing/images/relative-path.png
Binary files differ
diff --git a/releases/8.2.4/documentation/focus/browsing/index.html b/releases/8.2.4/documentation/focus/browsing/index.html
new file mode 100644
index 0000000..bd6fd64
--- /dev/null
+++ b/releases/8.2.4/documentation/focus/browsing/index.html
@@ -0,0 +1,276 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Focus on Browsing</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > </div>
+
+
+<h1>Focus on Browsing</h1>
+
+<p>One of the most enduring UI patterns is a browse button next to the text box for selecting among
+possible values. Very frequently the scenario is to browse for files or folders, but the pattern
+is more generic than that and has been used to browse for arbitrary items especially when the set
+of possible values can be large.</p>
+
+<p>In Sapphire, developers are not creating and wiring up individual UI widgets. This makes it
+possible to implement the browse button pattern at a higher level of abstraction. If a browse
+action handler is active for a property, a browse button will be automatically created. The framework
+will even register a keyboard shortcut (Ctrl+L, 'L' is for locate) which can be used to open the 
+browse dialog while focus is on the text field.</p>
+
+<p>Sapphire uses image-based buttons for compactness and to create a more modern look-n-feel. In the following 
+screen capture you can see how the browse buttons appear to the user. Note a tiny browse image
+in the table cell editor. That's a browse button too.</p>
+
+<img src="images/browse-buttons.png"/>
+
+<h2>File System Paths</h2>
+
+<p>Sapphire provides a set of annotations that make it easier to deal with file system paths. The
+developer uses these annotations to specify the semantics of the property and Sapphire
+automatically adds validation and browsing support.</p>
+
+<p>Consider the case where a property must hold an absolute path to a file that must exist and must
+have "jar" or "zip" extension. Such a property could be declared as follows:</p>
+
+<pre class="source-code"><code>@Type( base = Path.class )
+@AbsolutePath
+@ValidFileSystemResourceType( FileSystemResourceType.FILE )
+@FileExtensions( expr = "jar,zip" )
+@MustExist
+
+ValueProperty PROP_ABSOLUTE_FILE_PATH = new ValueProperty( TYPE, "AbsoluteFilePath" );
+
+Value&lt;Path> getAbsoluteFilePath();
+void setAbsoluteFilePath( String value );
+void setAbsoluteFilePath( Path value );</code></pre>
+
+<p>Based on the above specification, the framework will attach validation that will make sure
+that the entered path is absolute, that it references a file, that the referenced file exists and 
+that it has the appropriate extension. That happens in the model layer. The UI framework will 
+see these annotations and supply a browse button wired to open the operating system's native file 
+browse dialog pre-filtered to only show jar and zip files.</p>
+
+<p>Similar support is available for absolute folder paths. Just remove @FileExtensions
+and change @ValidFileSystemResourceType.</p>
+
+<p>Or maybe you are writing an extension to Eclipse IDE and your property needs to hold a 
+workspace path instead of an absolute path... Just replace @AbsolutePath with @WorkspaceRelativePath
+in the above example. The validation will change to use Eclipse resources API and the native
+browse dialog will be replaced with the standard Eclipse workspace resources dialog.</p>
+
+<p>Or maybe you need to deal with relative paths, but you have custom requirements for how
+these relative paths are to be resolved. Sapphire still got you covered. Just implement
+RelativePathService that returns all possible roots...</p>
+
+<pre class="source-code"><code>@Type( base = Path.class )
+@Service( impl = CustomRelativePathService.class )
+@ValidFileSystemResourceType( FileSystemResourceType.FILE )
+@FileExtensions( expr = "dll" )
+@MustExist
+
+ValueProperty PROP_RELATIVE_FILE_PATH = new ValueProperty( TYPE, "RelativeFilePath" );
+
+Value&lt;Path> getRelativeFilePath();
+void setRelativeFilePath( String value );
+void setRelativeFilePath( Path value );</code></pre>
+
+<pre class="source-code"><code>public class CustomRelativePathService extends RelativePathService
+{
+    public List&lt;Path> roots()
+    {
+        List&lt;Path> roots = new ArrayList&lt;Path>();
+
+        roots.add( new Path( "c:/Windows" ) );
+        roots.add( new Path( "c:/Program Files" ) );
+
+        return roots;
+    }
+}</code></pre>
+
+<p>You will still get all the validation that you would get with an absolute path, including
+validation for existence which will try to locate your path using the roots returned by your base paths
+provider. On the UI side you will get a custom browse dialog box that lets you browse for resources
+in all the roots simultaneously. This can be very powerful in many contexts where the system that UI
+is being built for searches for the specified file in a set of defined locations.</p>
+
+<img src="images/relative-path.png"/>
+
+<h2>String Values</h2>
+
+<p>Another common scenario is the case where the value must come from a list of possible values not
+necessarily tied to something specific like file system resources. For instance, consider the case
+where a property must reference an entity name from the set of entities defined elsewhere.</p>
+
+<p>Simply implement a PossibleValueService and attach it to the property...</p>
+
+<pre class="source-code"><code>@Service( impl = CityNamePossibleValuesService.class )
+
+ValueProperty PROP_CITY = new ValueProperty( TYPE, "City" );
+
+Value&lt;String> getCity();
+void setCity( String value );</code></pre>
+
+<pre class="source-code"><code>public class CityNameValuesProvider extends PossibleValuesProviderImpl
+{
+    protected abstract void fillPossibleValues( SortedSet<String> values )
+    {
+        // Your logic goes here.
+    }
+}</code></pre>
+
+<p>If you find that in your scenario the set of possible values is static you can use the @PossibleValues
+annotation instead. This annotation lets you specify the set of possible values right in the annotation instead
+of implementing a custom service.</p>
+
+<p>Or maybe your scenario calls for a property to draw its possible values from another property in the model.
+The @PossibleValues annotation still has you covered. It lets you specify a path through the model where
+possible values should be harvested.</p>
+
+<pre class="source-code"><code>@PossibleValues( property = "/Contacts/Name", caseSensitive = false ) 
+
+ValueProperty PROP_ASSISTANT = new ValueProperty( TYPE, "Assistant" );
+
+Value&lt;String> getAssistant();
+void setAssistant( String value );</code></pre>
+
+<p>Regardless of whether you use @PossibleValues annotation or implement a custom PossibleValuesService, 
+you will get validation that will check that the
+specified value is in the set of possible values. Additional attributes are available on all three of
+these annotations that let you customize the validation. For instance, you can change the problem severity to
+a warning or even disable validation completely. You can even specify whether the comparison should be
+case sensitive. On the UI front, you will get browse button wired to the standard list item selection
+dialog.</p>
+
+<img src="images/possible-values.png"/>
+
+<h2>Java Types</h2>
+
+<p>Sapphire even integrates with JDT to support properties that reference classes or interfaces visible 
+to a given Java project. The developer uses the supplied JavaTypeName class as the type for a value
+property and then tunes the semantics using @JavaTypeConstraint and @MustExist annotations. Sapphire
+takes care of the rest. You get validation for type existence, kind of type (interface, class, etc.) and
+even whether type derives from another type. On the UI side, you get a browse button wired to JDT's
+type selection dialog.</p>
+
+<p>In the following example, the property is specified to take a name of a non-abstract class that
+must extend AbstractList class while also implementing Cloneable interface.</p>
+
+<pre class="source-code"><code>@Type( base = JavaTypeName.class )
+@Reference( target = JavaType.class )
+@JavaTypeConstraint( kind = JavaTypeKind.CLASS, type = { "java.util.AbstractList", "java.lang.Cloneable" } )
+@MustExist
+
+ValueProperty PROP_CUSTOM_LIST_CLASS = new ValueProperty( TYPE, "CustomListClass" );
+
+ReferenceValue&lt;JavaTypeName,JavaType> getCustomListClass();
+void setCustomListClass( String value );
+void setCustomListClass( JavaTypeName value );</code></pre>
+
+<img src="images/java-type.png"/>
+
+<h2>Completely Custom</h2>
+
+<p>Sapphire browse handling support is extensible to support cases that do not fit one of the above
+molds. To do this, you create a custom class that extends SapphireActionHandler. You can then register your
+browse action handler globally (to activate under a condition that you specify) or locally for a specific
+property editor in the UI definition. The second case is more common.</p>
+
+<p>Here is an example:</p> 
+
+<pre class="source-code"><code>&lt;property-editor>
+  &lt;property>Photo&lt;/property>
+  &lt;action-handler>
+    &lt;action>Sapphire.Browse&lt;/action>
+    &lt;impl>PhotosCatalogBrowseActionHandler&lt;/impl>
+  &lt;/action-handler>
+&lt;/property-handler></code></pre>
+
+<h2>Multi-Way</h2>
+
+<p>One variant of the browse button pattern has baffled UI writers for years. In some cases, the
+semantics of the property require the use of more than one browse dialog. For instance, consider the
+case where the property can take an absolute path to an archive file or a folder. No established
+convention exists for how to handle this case and developers have tried a number of different
+options. Here are a few examples from Eclipse itself.</p>
+
+<img src="images/multi-way-1.png"/>
+
+<br/><br/>
+
+<img src="images/multi-way-2.png"/>
+
+<br/><br/>
+
+<img src="images/multi-way-3.png"/>
+
+<p>Sapphire adopts the convention of using a drop-down menu from the browse button when multiple
+browse action handlers are active concurrently. Here is what that looks like:</p> 
+
+<img src="images/multi-way-sapphire.png"/>
+
+<p>Currently, there are no model annotations that can fully describe the complex semantics of
+such scenarios. The developer must register the browse action handlers in the UI definition. Validation
+should be done in a custom validator class attached via @Validator annotation.</p>
+
+<p>Here is the UI definition from the above screen capture. All the system-provided browse action handlers
+that activate when certain annotations are used are also available for direct reference from
+the UI definitions as can be seen in this example.</p>
+
+<pre class="source-code"><code>&lt;property-editor>
+  &lt;property>MultiOptionPath&lt;/property>
+  &lt;action-handler>
+    &lt;action>Sapphire.Browse&lt;/action>
+    &lt;impl>AbsoluteFilePathBrowseActionHandler&lt;/impl>
+    &lt;param>
+      &lt;name>extensions&lt;/name>
+      &lt;value>jar,zip&lt;/value>
+    &lt;/param>
+  &lt;/action-handler>
+  &lt;action-handler>
+    &lt;action>Sapphire.Browse&lt;/action>
+    &lt;impl>AbsoluteFolderPathBrowseActionHandler&lt;/impl>
+  &lt;/action-handler>
+  &lt;action-handler>
+    &lt;action>Sapphire.Browse&lt;/action>
+    &lt;impl>WorkspaceRelativePathBrowseActionHandler&lt;/impl>
+    &lt;param>
+      &lt;name>extensions&lt;/name>
+      &lt;value>jar,zip&lt;/value>
+    &lt;/param>
+    &lt;param>
+      &lt;name>leading-slash&lt;/name>
+      &lt;value>true&lt;/value>
+    &lt;/param>
+  &lt;/action-handler>
+&lt;/property-editor></code></pre>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/focus/localization/index.html b/releases/8.2.4/documentation/focus/localization/index.html
new file mode 100644
index 0000000..80188f8
--- /dev/null
+++ b/releases/8.2.4/documentation/focus/localization/index.html
@@ -0,0 +1,93 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Focus on Localization</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > </div>
+
+
+<h1>Focus on Localization</h1>
+
+<p>Localization is like build systems, something that most developers prefer not to think about. 
+Unfortunately, the developer must take explicit steps to manually externalize all user-visible 
+strings for the software to be localizable. The localizable strings go into a separate file and 
+the code references them by a key. The developer must come up with a key and then must manage the 
+list of externalized strings so that it stays in sync with the code. Some tools have been developed 
+to make this a little easier, but two types of problems remain very common:</p>
+
+<ol>
+  <li>Strings that should be externalized are not. It's too easy for the developer to put the string 
+    directly into code and then forget to externalize it later.</li>
+  <li>The string resource files get out of sync with code. The case where the resource file is 
+    missing a string is easy enough to catch at runtime. The case where resource files contain 
+    orphaned strings not referenced in code is much harder to detect.</li>
+</ol>
+
+<p>Since Sapphire is a UI framework, localization is very important. Since Sapphire is focused on 
+ease of use and developer productivity, relying on current methods of localization is not 
+satisfactory.</p> 
+
+<p>Localizable strings largely occur in two places in Sapphire. You see them in the model 
+annotations (such as the @Label annotation) and you see them throughout the UI definition files. 
+Sapphire's approach is to allow the developer to leave the strings in their original language at 
+point of use. The string resource files that will be translated are created at build time. The 
+build system takes the original string and applies a function to it to generate a key for the 
+string resources file. At runtime, the system loads the original string resources file along
+with the localized version and matches original strings to translations by using the 
+resource keys. Once matching is completed, the resource keys are discarded from memory.</p> 
+
+<p>The critical concept is that the developer does not take any explicit steps to enable 
+localization. It just happens under the covers.</p>
+
+<p>The nature of the function that is used to derive the string resources file key is not 
+particularly important as long as the resulting key is not overly long, is free 
+from collisions and doesn't change if the string itself hasn't changed (important for
+re-using prior work of translators). The current implementation uses SHA-256 algorithm. It is
+important to note that the key is only computed at build-time, thus the performance of the
+key creation algorith is not particularly important.</p>
+
+<p>On top of the automatic externalization, Sapphire is architected to minimize the number of 
+strings that must be externalized in the first place. In particular, when the developer specifies 
+a property label, the string is expected to be all in lower case (except where acronyms or proper 
+nouns are used). Sapphire is able to transform the capitalization of the label to make it suitable 
+for different contexts. Three modes of capitalization are supported:</p>
+
+<ol>
+  <li>NO_CAPS:  Basically the original string as specified by developer. This is most frequently 
+    used for embedding inside validation messages.</li>
+  <li>FIRST_WORD_ONLY:  This is your typical label in the UI. The colon is added by the UI renderer 
+    where appropriate.</li>
+  <li>TITLE_STYLE:  This is typically used in column headers, section headers, dialog titles, etc.</li>
+</ol>
+
+<p>The current capitalization algorithm works well for English and reasonably well for other 
+languages, but it will need to be made pluggable in the future.</p>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/index.html b/releases/8.2.4/documentation/index.html
new file mode 100644
index 0000000..13730b6
--- /dev/null
+++ b/releases/8.2.4/documentation/index.html
@@ -0,0 +1,179 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Sapphire Developer Guide</title>
+  <link rel="StyleSheet" href="style.css" TYPE="text/css"/>
+
+
+
+</head>
+
+<body>
+
+<h1>Sapphire Developer Guide</h1>
+
+<p>Sapphire is a user interface development framework that improves productivity. Instead of 
+focusing on individual widgets, layouts and data binding, the developers focus on modeling the 
+semantics of the data and declaring the general intent of how the data it to be presented.</p>
+
+<ul>
+  <li><a href="introduction/index.html">Introduction</a></li>
+  <li><a href="focus/browsing/index.html">Focus on Browsing</a></li>
+  <li><a href="focus/localization/index.html">Focus on Localization</a></li>
+  <li><a href="xml/binding/index.html">XML Binding</a></li>
+  <li><a href="el/index.html">Expression Language</a></li>
+  <li><a href="actions/index.html">Actions</a></li>
+  <li><a href="ExtensiblePersistentState/index.html">Extensible Persistent State</a></li>
+  <li><a href="java/index.html">Working with Java Types</a></li>
+  <li><a href="versions/index.html">Versions and Version Constraints</a></li>
+  <li><a href="extensions/index.html">Extension System</a></li>
+  <ul>
+    <li><a href="extensions/existing.html">Existing Extensions</a></li>
+    <li><a href="extensions/contributing.html">Contributing Extensions</a></li>
+  </ul>
+  <li><a href="services/index.html">Services</a></li>
+  <ul>
+    <li><a href="services/CollationService.html">CollationService</a></li>
+    <li><a href="services/ConnectionService.html">ConnectionService</a></li>
+    <li><a href="services/ContentProposalService.html">ContentProposalService</a></li>
+    <li><a href="services/ConversionService.html">ConversionService</a></li>
+    <li><a href="services/DependenciesService.html">DependenciesService</a></li>
+    <li><a href="services/DiagramLayoutPersistenceService.html">DiagramLayoutPersistenceService</a></li>
+    <li><a href="services/DragAndDropService.html">DragAndDropService</a></li>
+    <li><a href="services/ElementReferenceService.html">ElementReferenceService</a></li>
+    <li><a href="services/EqualityService.html">EqualityService</a></li>
+    <li><a href="services/FactsAggregationService.html">FactsAggregationService</a></li>
+    <li><a href="services/FactsService.html">FactsService</a></li>
+    <li><a href="services/FileExtensionsService.html">FileExtensionsService</a></li>
+    <li><a href="services/InitialValueService.html">InitialValueService</a></li>
+    <li><a href="services/JavaTypeConstraintService.html">JavaTypeConstraintService</a></li>
+    <li><a href="services/ListSelectionService.html">ListSelectionService</a></li>
+    <li><a href="services/LoggingService.html">LoggingService</a></li>
+    <li><a href="services/MasterConversionService.html">MasterConversionService</a></li>
+    <li><a href="services/PossibleTypesService.html">PossibleTypesService</a></li>
+    <li><a href="services/ProblemsTraversalService.html">ProblemsTraversalService</a></li>
+    <li><a href="services/RequiredConstraintService.html">RequiredConstraintService</a></li>
+    <li><a href="services/UniversalConversionService.html">UniversalConversionService</a></li>
+    <li><a href="services/VersionCompatibilityService.html">VersionCompatibilityService</a></li>
+    <li><a href="services/VersionCompatibilityTargetService.html">VersionCompatibilityTargetService</a></li>
+  </ul>
+  <li><a href="Forms/index.html">Forms</a></li>
+  <ul>
+    <li><a href="Forms/SWT/index.html">SWT</a></li>
+    <ul>
+      <li><a href="Forms/SWT/CheckBoxGroup/index.html">Check Box Group</a></li>
+    </ul>
+  </ul>
+  <li><a href="samples/index.html">Samples</a></li>
+  <ul>
+    <li><a href="samples/catalog.html">Catalog Editor</a> - a two page editor that primarily demonstrates grouping of flat data</li>
+  </ul>
+  <li><a href="releases/index.html">Releases</a></li>
+  <ul>
+    <li><a href="releases/8.2/index.html">8.2</a></li>
+    <ul>
+      <li><a href="releases/8.2/enhancements.html">Enhancements</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/8.1/index.html">8.1</a></li>
+    <ul>
+      <li><a href="releases/8.1/enhancements.html">Enhancements</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/8/index.html">8</a></li>
+    <ul>
+      <li><a href="releases/8/enhancements.html">Enhancements</a></li>
+      <li><a href="releases/8/migration.html">Migration Guide</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/0.7.2/index.html">0.7.2</a></li>
+    <ul>
+      <li><a href="releases/0.7.2/enhancements.html">Enhancements</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/0.7.1/index.html">0.7.1</a></li>
+    <ul>
+      <li><a href="releases/0.7.1/enhancements.html">Enhancements</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/0.7/index.html">0.7</a></li>
+    <ul>
+      <li><a href="releases/0.7/enhancements.html">Enhancements</a></li>
+      <li><a href="releases/0.7/migration.html">Migration Guide</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/0.6.1/index.html">0.6.1</a></li>
+    <ul>
+      <li><a href="releases/0.6.1/enhancements.html">Enhancements</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/0.6/index.html">0.6</a></li>
+    <ul>
+      <li><a href="releases/0.6/enhancements.html">Enhancements</a></li>
+      <li><a href="releases/0.6/migration.html">Migration Guide</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/0.5/index.html">0.5</a></li>
+    <ul>
+      <li><a href="releases/0.5/enhancements.html">Enhancements</a></li>
+      <li><a href="releases/0.5/migration.html">Migration Guide</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/0.4/index.html">0.4</a></li>
+    <ul>
+      <li><a href="releases/0.4/enhancements.html">Enhancements</a></li>
+      <li><a href="releases/0.4/migration.html">Migration Guide</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/0.3.1/index.html">0.3.1</a></li>
+    <ul>
+      <li><a href="releases/0.3.1/enhancements.html">Enhancements</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/0.3/index.html">0.3</a></li>
+    <ul>
+      <li><a href="releases/0.3/enhancements.html">Enhancements</a></li>
+      <li><a href="releases/0.3/migration.html">Migration Guide</a></li>
+    </ul>
+  </ul>
+  <ul>
+    <li><a href="releases/0.2/index.html">0.2</a></li>
+    <ul>
+      <li><a href="releases/0.2/enhancements.html">Enhancements</a></li>
+      <li><a href="releases/0.2/migration.html">Migration Guide</a></li>
+    </ul>
+  </ul>
+</ul>
+
+<br/><br/>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
diff --git a/releases/8.2.4/documentation/introduction/images/dialog.png b/releases/8.2.4/documentation/introduction/images/dialog.png
new file mode 100644
index 0000000..7d10251
--- /dev/null
+++ b/releases/8.2.4/documentation/introduction/images/dialog.png
Binary files differ
diff --git a/releases/8.2.4/documentation/introduction/images/editor.png b/releases/8.2.4/documentation/introduction/images/editor.png
new file mode 100644
index 0000000..8426c96
--- /dev/null
+++ b/releases/8.2.4/documentation/introduction/images/editor.png
Binary files differ
diff --git a/releases/8.2.4/documentation/introduction/images/wizard.png b/releases/8.2.4/documentation/introduction/images/wizard.png
new file mode 100644
index 0000000..7a43734
--- /dev/null
+++ b/releases/8.2.4/documentation/introduction/images/wizard.png
Binary files differ
diff --git a/releases/8.2.4/documentation/introduction/index.html b/releases/8.2.4/documentation/introduction/index.html
new file mode 100644
index 0000000..28a6efc
--- /dev/null
+++ b/releases/8.2.4/documentation/introduction/index.html
@@ -0,0 +1,652 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Sapphire</title>
+  <link rel="StyleSheet" href="../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > </div>
+
+
+<h1>Sapphire</h1>
+
+<p>Little has changed in the way Java desktop UI is written since the original Java release. 
+Technologies have changed (AWT, Swing, SWT, etc.), but fundamentals remain the same. The developer 
+must choose which widgets to use, how to lay those widgets out, how to store the data being edited 
+and how to synchronize the model with the UI. Even the best developers fall into traps of having UI 
+components talk directly to other UI components rather than through the model. Inordinate amount of 
+time is spent debugging layout and data-binding issues.</p>
+
+<p>Sapphire aims to raise UI writing to a higher level of abstraction. The core premise is that the 
+basic building block of UI should not be a widget (text box, label, button, etc.), but rather a 
+property editor. Unlike a widget, a property editor analyzes metadata associated with a given 
+property, renders the appropriate widgets to edit that property and wires up data binding. Data is 
+synchronized, validation is passed from the model to the UI, content assistance is made 
+available, etc.</p>
+
+<p>This fundamentally changes the way developers interact with a UI framework. Instead of writing 
+UI by telling the system how to do something, the developer tells the system what they intend to 
+accomplish. When using Sapphire, the developer says "I want to edit LastName property of the person 
+object". When using widget toolkits like SWT, the developer says "create label, create text box, 
+lay them out like so, configure their settings, setup data binding and so on". By the time the 
+developer is done, it is hard to see the original goal in the code that's produced. This results 
+in UI that is inconsistent, brittle and difficult to maintain.</p>
+
+<h2>First, The Model</h2>
+
+<p>Sapphire includes a modeling framework that is tuned to the needs of the Sapphire UI
+framework and is designed to be easy to learn. It is also optimized for iterative development.
+A Sapphire model is defined by writing Java interfaces and using annotations to attach metadata.
+An annotation processor that is part of Sapphire SDK then generates the implementation classes.
+Sapphire leverages Eclipse Java compiler to provide quick and transparent code generation that
+runs in the background while you work on the model. The generated classes are treated as build
+artifacts and are not source controlled. In fact, you will rarely have any reason to look at
+them. All model authoring and consumption happens through the interfaces.</p>
+
+<p>In this article we will walk through a Sapphire sample called EzBug. The sample is based
+around a scenario of building a bug reporting system. Let's start by looking at BugReport.</p>
+
+<pre class="source-code"><code>public interface BugReport extends Element
+{
+    ElementType TYPE = new ElementType( BugReport.class );
+
+    // *** CustomerId ***
+
+    @XmlBinding( path = "customer" )
+    @Label( standard = "customer ID" )
+
+    ValueProperty PROP_CUSTOMER_ID = new ValueProperty( TYPE, "CustomerId" );
+
+    Value&lt;String> getCustomerId();
+    void setCustomerId( String value );
+
+    // *** Title ***
+
+    @XmlBinding( path = "title" )
+    @Label( standard = "title" )
+    @Required
+
+    ValueProperty PROP_TITLE = new ValueProperty( TYPE, "Title" );
+
+    Value&lt;String> getTitle();
+    void setTitle( String value );
+
+    // *** Details ***
+
+    @XmlBinding( path = "details" )
+    @Label( standard = "details" )
+    @LongString
+    @Required
+
+    ValueProperty PROP_DETAILS = new ValueProperty( TYPE, "Details" );
+
+    Value&lt;String> getDetails();
+    void setDetails( String value );
+
+    // *** ProductVersion ***
+
+    @Type( base = ProductVersion.class )
+    @XmlBinding( path = "version" )
+    @Label( standard = "version" )
+    @DefaultValue( text = "2.5" )
+
+    ValueProperty PROP_PRODUCT_VERSION = new ValueProperty( TYPE, "ProductVersion" );
+
+    Value&lt;ProductVersion> getProductVersion();
+    void setProductVersion( String value );
+    void setProductVersion( ProductVersion value );
+
+    // *** ProductStage ***
+
+    @Type( base = ProductStage.class )
+    @XmlBinding( path = "stage" )
+    @Label( standard = "stage" )
+    @DefaultValue( text = "final" )
+
+    ValueProperty PROP_PRODUCT_STAGE = new ValueProperty( TYPE, "ProductStage" );
+
+    Value&lt;ProductStage> getProductStage();
+    void setProductStage( String value );
+    void setProductStage( ProductStage value );
+
+    // *** Hardware ***
+
+    @Type( base = HardwareItem.class )
+    @XmlListBinding( mappings = { @XmlListBinding.Mapping( element = "hardware-item", type = HardwareItem.class ) } )
+    @Label( standard = "hardware" )
+
+    ListProperty PROP_HARDWARE = new ListProperty( TYPE, "Hardware" );
+
+    ElementList&lt;HardwareItem> getHardware();
+}</code></pre>
+
+<p>As you can see in the above code listing, a model element definition in Sapphire is composed of a series
+of blocks. These blocks define properties of the model element. Each property block has a PROP_* field that declares
+the property, the metadata in the form of annotations and the accessor methods. All metadata about the
+model element is stored in the interface. There are no external files. When this interface is
+compiled, Java persists these annotation in the .class file and Sapphire is able to read them
+at runtime.</p>
+
+<p>Sapphire has four types of properties: value, element, list and transient. Value properties hold simple data,
+such as strings, integers, enums, etc. Any object that is immutable and can be serialized to a string can
+be stored in a value property. An element property holds a reference to another model element. You can
+specify whether this nested model element should always exist (implied element property) or if it should be possible to create and 
+delete it. A list property holds zero or more model elements. A list can be homogeneous (only holds one
+type of elements) or heterogeneous (holds elements of various specified types). A transient property holds an
+arbitrary object reference that does not need to be persisted to permanent storage.</p>
+
+<p>Using a combination of list and element properties, it is possible to create an arbitrary model hierarchy. In the
+above listing, there is one list property. It is homogeneous and references HardwareItem element type. Let's
+look at that type next.</p>
+
+<pre class="source-code"><code>public interface HardwareItem extends Element
+{
+    ElementType TYPE = new ElementType( HardwareItem.class );
+
+    // *** Type ***
+
+    @Type( base = HardwareType.class )
+    @XmlBinding( path = "type" )
+    @Label( standard = "type" )
+    @Required
+
+    ValueProperty PROP_TYPE = new ValueProperty( TYPE, "Type" );
+
+    Value&lt;HardwareType> getType();
+    void setType( String value );
+    void setType( HardwareType value );
+
+    // *** Make ***
+
+    @XmlBinding( path = "make" )
+    @Label( standard = "make" )
+    @Required
+
+    ValueProperty PROP_MAKE = new ValueProperty( TYPE, "Make" );
+
+    Value&lt;String> getMake();
+    void setMake( String value );
+
+    // *** ItemModel ***
+
+    @XmlBinding( path = "model" )
+    @Label( standard = "model" )
+
+    ValueProperty PROP_ITEM_MODEL = new ValueProperty( TYPE, "ItemModel" );
+
+    Value&lt;String> getItemModel();
+    void setItemModel( String value );
+
+    // *** Description ***
+
+    @XmlBinding( path = "description" )
+    @Label( standard = "description" )
+    @LongString
+
+    ValueProperty PROP_DESCRIPTION = new ValueProperty( TYPE, "Description" );
+
+    Value&lt;String> getDescription();
+    void setDescription( String value );
+}</code></pre>
+
+<p>The HardwareItem listing should look very similar to BugReport and that's the point. A Sapphire model
+is just a collection of Java interfaces that are annotated in a certain way and reference each other.</p>
+
+<p>A bug report is contained in FileBugReportOp, which serves as the top level type in the model.</p>
+
+<pre class="source-code"><code>@XmlBinding( path = "report" )
+
+public interface FileBugReportOp extends Element
+{
+    ElementType TYPE = new ElementType( FileBugReportOp.class );
+
+    // *** BugReport ***
+
+    @Type( base = BugReport.class )
+    @Label( standard = "bug report" )
+    @XmlBinding( path = "bug" )
+
+    ImpliedElementProperty PROP_BUG_REPORT = new ImpliedElementProperty( TYPE, "BugReport" );
+
+    BugReport getBugReport();
+}</code></pre>
+
+<p>Let's now look at the last bit of code that goes with this model, which is the enums.</p> 
+
+<pre class="source-code"><code>@Label( standard = "type", full = "hardware type" )
+
+public enum HardwareType
+{
+    @Label( standard = "CPU" )
+
+    CPU,
+
+    @Label( standard = "main board" )
+    @EnumSerialization( primary = "Main Board" )
+
+    MAIN_BOARD,
+
+    @Label( standard = "RAM" )
+
+    RAM,
+
+    @Label( standard = "video controller" )
+    @EnumSerialization( primary = "Video Controller" )
+
+    VIDEO_CONTROLLER,
+
+    @Label( standard = "storage" )
+    @EnumSerialization( primary = "Storage" )
+
+    STORAGE,
+
+    @Label( standard = "other" )
+    @EnumSerialization( primary = "Other" )
+
+    OTHER
+}
+
+@Label( standard = "product stage" )
+
+public enum ProductStage
+{
+    @Label( standard = "alpha" )
+
+    ALPHA,
+
+    @Label( standard = "beta" )
+
+    BETA,
+
+    @Label( standard = "final" )
+
+    FINAL
+}
+
+@Label( standard = "product version" )
+
+public enum ProductVersion
+{
+    @Label( standard = "1.0" )
+    @EnumSerialization( primary = "1.0" )
+
+    V_1_0,
+
+    @Label( standard = "1.5" )
+    @EnumSerialization( primary = "1.5" )
+
+    V_1_5,
+
+    @Label( standard = "1.6" )
+    @EnumSerialization( primary = "1.6" )
+
+    V_1_6,
+
+    @Label( standard = "2.0" )
+    @EnumSerialization( primary = "2.0" )
+
+    V_2_0,
+
+    @Label( standard = "2.3" )
+    @EnumSerialization( primary = "2.3" )
+
+    V_2_3,
+
+    @Label( standard = "2.4" )
+    @EnumSerialization( primary = "2.4" )
+
+    V_2_4,
+
+    @Label( standard = "2.5" )
+    @EnumSerialization( primary = "2.5" )
+
+    V_2_5
+}</code></pre>
+
+<p>You can use any enum as a type for a Sapphire value property. Here, once again, you 
+see Sapphire pattern of using Java annotations to attach metadata to model particles.
+In this case the annotations are specifying how Sapphire should present enum items
+to the user and how these items should be serialized to string form.</p> 
+
+<h2>Then, The UI</h2>
+
+<p>The bulk of the work in writing UI using Sapphire is modeling the data that you want to
+present to the user. Once the model is done, defining the UI is simply a matter of
+arranging the properties on the screen. This is done via an XML file.</p>
+
+<pre class="source-code"><code>&lt;definition>
+
+    &lt;import>
+        &lt;package>org.eclipse.sapphire.samples.ezbug&lt;/package>
+    &lt;/import>
+
+    &lt;composite>
+        &lt;id>BugReportForm&lt;/id>
+        &lt;documentation>
+            &lt;title>EzBug&lt;/title>
+            &lt;content>This would be the help content for the EzBug system.&lt;/content>
+        &lt;/documentation>
+        &lt;content>
+            &lt;property-editor>CustomerId&lt;/property-editor>
+            &lt;property-editor>Title&lt;/property-editor>
+            &lt;property-editor>
+                &lt;property>Details&lt;/property>
+                &lt;scale-vertically>true&lt;/scale-vertically>
+            &lt;/property-editor>
+            &lt;property-editor>ProductVersion&lt;/property-editor>
+            &lt;property-editor>ProductStage&lt;/property-editor>
+            &lt;property-editor>
+                &lt;property>Hardware&lt;/property>
+                &lt;child-property>
+                    &lt;property>Type&lt;/property>
+                &lt;/child-property>
+                &lt;child-property>
+                    &lt;property>Make&lt;/property>
+                &lt;/child-property>
+                &lt;child-property>
+                    &lt;property>ItemModel&lt;/property>
+                &lt;/child-property>
+            &lt;/property-editor>
+            &lt;composite>
+                &lt;indent>true&lt;/indent>
+                &lt;content>
+                    &lt;separator>
+                        &lt;label>description&lt;/label>
+                    &lt;/separator>
+                    &lt;switching-panel>
+                        &lt;list-selection-controller>
+                            &lt;property>Hardware&lt;/property>
+                        &lt;/list-selection-controller>
+                        &lt;panel>
+                            &lt;key>HardwareItem&lt;/key>
+                            &lt;content>
+                                &lt;property-editor>
+                                    &lt;property>Description&lt;/property>
+                                    &lt;span>true&lt;/span>
+                                    &lt;height>75&lt;/height>
+                                    &lt;show-label>false&lt;/show-label>
+                                &lt;/property-editor>
+                            &lt;/content>
+                        &lt;/panel>
+                    &lt;/switching-panel>
+                &lt;/content>
+            &lt;/composite>
+        &lt;/content>
+        &lt;scale-vertically>true&lt;/scale-vertically>
+        &lt;width>600&lt;/width>
+        &lt;height>500&lt;/height>
+    &lt;/composite>
+
+    &lt;dialog>
+        &lt;id>FileBugReportDialog&lt;/id>
+        &lt;label>file bug report (sapphire sample)&lt;/label>
+        &lt;initial-focus>Title&lt;/initial-focus>
+        &lt;content>
+            &lt;include>BugReportForm&lt;/include>
+        &lt;/content>
+        &lt;scale-vertically>true&lt;/scale-vertically>
+    &lt;/dialog>
+
+&lt;/definition></code></pre>
+
+<p>A Sapphire UI definition is a hierarchy of parts. At the lowest level we have the property editor and a few other basic
+parts like separators. These are aggregated together into various kinds of composities until the entire part hierarchy 
+is defined. Some hinting here and there to guide the UI renderer and the UI definition is complete. Note the top-level
+composite and dialog elements. These are parts that you can re-use to build more complex UI definitions or reference
+externally from Java code.</p>
+
+<p>Next we will write a little bit of Java code to open the dialog that we defined.</p>
+
+<pre class="source-code"><code>FileBugReportOp operation = FileBugReportOp.TYPE.instantiate();
+
+try
+{
+    SapphireDialog dialog = new SapphireDialog
+    (
+        shell, operation.getBugReport(),
+        DefinitionLoader.context( FileBugReportOp.class ).sdef( "EzBug.sdef" ).dialog( "FileBugReportDialog" )
+    );
+
+    if( dialog.open() == Dialog.OK )
+    {
+        // Do something. User input is found in the bug report model.
+    }
+}
+finally
+{
+    operation.dispose();
+}</code></pre>
+
+<p>Pretty simple, right? We create the model and then use the provided SapphireDialog class to instantiate the UI by
+referencing the model instance and the UI definition.</p> 
+
+<p>Let's run it and see what we get...</p>
+
+<img src="images/dialog.png"/>
+
+<p>There you have it. Professional rich UI backed by your model with none of the fuss of configuring widgets,
+trying to get layouts to do what you need them to do or debugging data binding issues.</p>
+
+<h2>One Step Further</h2>
+
+<p>A dialog is nice, but really a wizard would be better suited for filing a bug report. Can Sapphire do that?
+Sure. Let's first go back to the model. A wizard is a UI pattern for configuring and then executing an operation.
+Our model is not really an operation yet. We can create and populate a bug report, but then we don't know what to do
+with it.</p>
+
+<p>Any Sapphire model element can be turned into an operation by adding an execute method. We will do that
+now with FileBugReportOp. In particular, FileBugReportOp will be changed to extend IExecutableModelElement
+and will acquire the following method definition:</p>
+
+<pre class="source-code"><code>// *** Method: execute ***
+
+@DelegateImplementation( FileBugReportOpMethods.class )
+
+Status execute( ProgressMonitor monitor );</code></pre>
+
+<p>Note how the execute method is specified. We don't want to modify the generated code to implement it, so we use
+delegation instead. The @DelegateImplementation annotation can be used to delegate any method on a model
+element to an implementation located in another class. The Sapphire annotation processor will do the necessary
+hookup.</p>
+
+<pre class="source-code"><code>public class FileBugReportOpMethods
+{
+    public static final Status execute( FileBugReportOp context, ProgressMonitor monitor )
+    {
+        // Do something here.
+
+        return Status.createOkStatus();
+    }
+}</code></pre>
+
+<p>The delegate method implementation must match the method being delegated with two changes:
+(a) it must be static, and (b) it must take the model element as the first parameter.</p> 
+
+<p>Now that we have completed the bug reporting operation, we can return to the UI definition file and add the following:</p>
+
+<pre class="source-code"><code>&lt;wizard>
+    &lt;id>wizard&lt;/id>
+    &lt;element-type>FileBugReportOp&lt;/element-type>
+    &lt;label>file bug report (sapphire sample)&lt;/label>
+    &lt;page>
+        &lt;id>main.page&lt;/id>
+        &lt;label>file bug report&lt;/label>
+        &lt;description>Create and submit a bug report.&lt;/description>
+        &lt;initial-focus>Title&lt;/initial-focus>
+        &lt;content>
+            &lt;with>
+                &lt;path>BugReport&lt;/path>
+                &lt;panel>
+                    &lt;content>
+                        &lt;include>BugReportForm&lt;/include>
+                    &lt;/content>
+                &lt;/panel>
+            &lt;/with>
+        &lt;/content>
+        &lt;scale-vertically>true&lt;/scale-vertically>
+    &lt;/page>
+&lt;/wizard></code></pre>
+
+<p>The above defines a one page wizard by re-using the composite definition created earlier. Now back to Java
+to use the wizard...</p>
+
+<pre class="source-code"><code>SapphireWizard&lt;FileBugReportOp> wizard = new SapphireWizard&lt;FileBugReportOp>
+(
+    FileBugReportOp.TYPE, 
+    DefinitionLoader.context( FileBugReportOp.class ).sdef( "EzBug.sdef" ).wizard( "wizard" )
+);
+
+WizardDialog dialog = new WizardDialog( shell, wizard );
+
+dialog.open();</code></pre>
+
+<p>SapphireWizard will invoke the operation's execute method when the wizard is finished. That means we don't have
+to act based on the result of the open call. The execute method will have completed by the time the open method returns
+to the caller.</p>
+
+<p>The above code pattern works well if you are launching the wizard from a custom action, but if you need to contribute 
+a wizard to an extension point, you can extend SapphireWizard to give your wizard a zero-argument constructor that creates 
+the operation and references the correct UI definition.</p>
+
+<p>Let's run it...</p>
+
+<img src="images/wizard.png"/>
+
+<h2>One More Step</h2>
+
+<p>Now that we have a system for submitting bug reports, it would be nice to have a way to maintain a collection of these reports.
+Even better if we can re-use some of our existing code to do this. Back to the model.</p>
+
+<p>The first step is to create BugRepository type which will hold a collection of bug reports. By now you should
+have a pretty good idea of what that will look like.</p>
+
+<pre class="source-code"><code>@XmlBinding( path = "bugs" )
+
+public interface BugRepository extends Element
+{
+    ElementType TYPE = new ElementType( BugRepository.class );
+
+    // *** BugReports ***
+
+    @Type( base = BugReport.class )
+    @Label( standard = "bug report" )
+    @XmlListBinding( mappings = { @XmlListBinding.Mapping( element = "bug", type = BugReport.class ) } )
+
+    ListProperty PROP_BUG_REPORTS = new ListProperty( TYPE, "BugReports" );
+
+    ElementList&lt;BugReport> getBugReports();
+}</code></pre>
+
+<p>That was easy. Now let's go back to the UI definition file.</p>
+
+<p>Sapphire simplifies creation of multi-page editors. It also has very good integration with WTP XML editor that makes it easy 
+to create the very typical two-page editor with a form-based page and a linked source page showing the underlying XML. The 
+linkage is fully bi-directional.</p>
+
+<p>To create an editor, we start by defining the structure of the pages that will be rendered by Sapphire. Sapphire currently
+only supports one editor page layout, but it is a very flexible layout that works for a lot scenarios. You get a tree outline
+of content on the left and a series of sections on the right that change depending on the selection in the outline.</p>
+
+<pre class="source-code"><code>&lt;editor-page>
+    &lt;id>BugRepositoryEditorPage&lt;/id>
+    &lt;element-type>BugRepository&lt;/element-type>
+    &lt;page-name>bug repository&lt;/page-name>
+    &lt;page-header-text>bug repository (sapphire sample)&lt;/page-header-text>
+    &lt;initial-selection>bug reports&lt;/initial-selection>
+    &lt;root-node>
+        &lt;node>
+            &lt;label>bug reports&lt;/label>
+            &lt;section>
+                &lt;content>
+                    &lt;label>Use this editor to manage your bug repository.&lt;/label>
+                    &lt;spacer/>
+                    &lt;action-link>
+                        &lt;action-id>Sapphire.Add&lt;/action-id>
+                        &lt;label>add a bug report&lt;/label>
+                    &lt;/action-link>
+                &lt;/content>
+            &lt;/section>
+            &lt;node-factory>
+                &lt;property>BugReports&lt;/property>
+                &lt;case>
+                    &lt;label>${ Title == null ? "&lt;bug&gt;" : Title }&lt;/label>
+                    &lt;section>
+                        &lt;label>bug report&lt;/label>
+                        &lt;content>
+                            &lt;include>BugReportForm&lt;/include>
+                        &lt;/content>
+                    &lt;/section>
+                &lt;/case>
+            &lt;/node-factory>
+        &lt;/node>
+    &lt;/root-node>
+&lt;/editor-page></code></pre>
+
+<p>You can see that the definition centers around the outline. The definition traverses the model as the
+outline is defined with sections attached to various nodes acquiring the context model element from their node.
+The outline can nest arbitrarily deep and you can even define recursive structures by factoring out
+node definitions, assigning ids to them and then referencing those definitions similarly to how this
+sample references an existing composite definition.</p>
+
+<p>The next step is to add an editor declaration to the plugin.xml file. Note that the declaration references
+an editor class provided by Sapphire and specifies sdef via a parameter. For simplicity of the example, the editor is
+registered as the default choice for files named "bugs.xml".</p>
+
+<pre class="source-code"><code>&lt;extension point="org.eclipse.ui.editors">
+  &lt;editor
+    id="org.eclipse.sapphire.samples.ezbug.BugRepositoryEditor"
+    name="Bug Repository Editor (Sapphire Sample)"
+    filenames="bugs.xml"
+    default="true">
+    &lt;class class="org.eclipse.sapphire.ui.swt.xml.editor.SapphireEditorForXml">
+      &lt;parameter name="sdef" value="org.eclipse.sapphire.samples.ezbug.EzBug"/>
+    &lt;/class>
+  &lt;/editor>
+&lt;/extension></code></pre>
+
+<p>That's it. We have created a two page editor with a Sapphire form page and an XML source page.</p>
+
+<p style="margin-left: 20px;"><img src="images/editor.png"/></p>
+
+<p>Sapphire really shines in complex cases like this where form UI is sitting on top a source file that users
+might edit by hand. In the above screen capture, what happened is that the user manually entered "BETA2" for the
+product stage in the source view. There is a problem marker next to the property editor and the blue 
+assistance popup is accessible by clicking on that marker. The problem message is displayed along with additional
+information about the property and available actions. The "Show in source" action, for instance, will immediately
+jump to the editor's source page and highlight the text region associated with this property. This is very
+valuable when you must deal with large files. These facilities and many others are available out of the box with
+Sapphire with no extra effort from the developer.</p>
+
+<h2>Conclusion</h2>
+
+<p>Now that you've been introduced to what Sapphire can do, compare it to how you are currently writing UI
+code. All of the code presented in this article can be written by a developer with just a few weeks of
+Sapphire experience in an hour or two. How long would it take you to create something comparable using 
+your current method of choice?</p>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/java/images/Capture-1.png b/releases/8.2.4/documentation/java/images/Capture-1.png
new file mode 100644
index 0000000..02cf4bd
--- /dev/null
+++ b/releases/8.2.4/documentation/java/images/Capture-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/java/images/Capture-2.png b/releases/8.2.4/documentation/java/images/Capture-2.png
new file mode 100644
index 0000000..18824ca
--- /dev/null
+++ b/releases/8.2.4/documentation/java/images/Capture-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/java/images/Capture-3.png b/releases/8.2.4/documentation/java/images/Capture-3.png
new file mode 100644
index 0000000..7e069c3
--- /dev/null
+++ b/releases/8.2.4/documentation/java/images/Capture-3.png
Binary files differ
diff --git a/releases/8.2.4/documentation/java/images/Capture-4.png b/releases/8.2.4/documentation/java/images/Capture-4.png
new file mode 100644
index 0000000..38927c6
--- /dev/null
+++ b/releases/8.2.4/documentation/java/images/Capture-4.png
Binary files differ
diff --git a/releases/8.2.4/documentation/java/images/Capture-5.png b/releases/8.2.4/documentation/java/images/Capture-5.png
new file mode 100644
index 0000000..bf25481
--- /dev/null
+++ b/releases/8.2.4/documentation/java/images/Capture-5.png
Binary files differ
diff --git a/releases/8.2.4/documentation/java/images/Capture-6.png b/releases/8.2.4/documentation/java/images/Capture-6.png
new file mode 100644
index 0000000..8f6a23d
--- /dev/null
+++ b/releases/8.2.4/documentation/java/images/Capture-6.png
Binary files differ
diff --git a/releases/8.2.4/documentation/java/images/Capture-7.png b/releases/8.2.4/documentation/java/images/Capture-7.png
new file mode 100644
index 0000000..0752a1d
--- /dev/null
+++ b/releases/8.2.4/documentation/java/images/Capture-7.png
Binary files differ
diff --git a/releases/8.2.4/documentation/java/index.html b/releases/8.2.4/documentation/java/index.html
new file mode 100644
index 0000000..74d72d0
--- /dev/null
+++ b/releases/8.2.4/documentation/java/index.html
@@ -0,0 +1,111 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Working with Java Types</title>
+  <link rel="StyleSheet" href="../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > </div>
+
+
+<h1>Working with Java Types</h1>
+
+<p>When implementing Eclipse tooling that works with Java projects, a frequent requirement is to
+deliver models and UI that reference Java types (classes, interfaces, enumerations and annotations). 
+Implementing this from scratch, even using the excellent API provided by JDT is a challenge. Fortunately,
+Sapphire's JDT integration makes this quite easy.</p>
+
+<p>The first step is the model.</p>
+
+<pre class="source-code"><code>@Type( base = JavaTypeName.class )
+@Reference( target = JavaType.class )
+@Label( standard = "filter" )
+@JavaTypeConstraint( kind = { JavaTypeKind.CLASS, JavaTypeKind.INTERFACE }, type = "java.io.FileFilter" )
+@MustExist
+@Required
+
+ValueProperty PROP_FILTER = new ValueProperty( TYPE, "Filter" );
+
+ReferenceValue&lt;JavaTypeName,JavaType> getFilter();
+void setFilter( String value );
+void setFilter( JavaTypeName value );</code></pre>
+
+<p>Here we utilize reference value construct which states
+that the property holds a JavaTypeName which is resolvable to a JavaType. The resolution is provided
+by the framework and works as long as the model is loaded in the context of a Java project.</p>
+
+<p>The @JavaTypeConstraint annotation specifies that the referenced type must be a class or an interface and that
+it must derive from java.io.FileFilter type.</p>
+
+<p>The @MustExist annotation specifies that the named type must be present in the project.</p>
+
+<p>The @Required annotation specifies that the property must have a value (null is not ok).</p>
+
+<p>The next step is the UI definition. Here we create an editor section with a single property editor, 
+but the property editor is, of course, not limited to editor sections. It can be used in any form context.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;section>
+    &lt;content></font>
+        &lt;property-editor>Filter&lt;/property-editor>
+    <font color="#888888">&lt;/content>
+&lt;/section></font></code></pre>
+
+<p>That is all that is necessary to define a model property that references a Java type and to present that
+property in the UI. Once this example is executed, you will see a property editor that is composed of 
+a label, a text box, two action buttons and a validation feedback marker.</p>
+
+<p style="margin-left: 20px;"><img src="images/Capture-1.png"/></p>
+
+<p>Clicking on the validation feedback marker shows the problem message along with wealth of semantic
+information about the property.</p>
+
+<p style="margin-left: 20px;"><img src="images/Capture-2.png"/></p>
+
+<p>The browse button provides the means to select from among existing Java types using JDT's type selection
+dialog. The framework automatically constraints the contents of the dialog based on @JavaTypeConstraint annotation.<p>
+
+<p style="margin-left: 20px;"><img src="images/Capture-3.png"/></p>
+
+<p style="margin-left: 20px;"><img src="images/Capture-4.png"/></p>
+
+<p>The create button provides the means to define a new Java type if the specified type name cannot be resolved.</p>
+
+<p style="margin-left: 20px;"><img src="images/Capture-5.png"/></p>
+
+<p>Since @JavaTypeConstraint annotation in this example specifies that the property can reference either a class or an interface,
+the user is presented with a choice after clicking on the create button.</p>
+
+<p style="margin-left: 20px;"><img src="images/Capture-6.png"/></p>
+
+<p>Once the appropriate option is selected, the new type is created and opened in the Java editor. The created
+type derives from the type specified in @JavaTypeConstraint annotation and is formatted according to user's
+format preferences.</p>
+
+<p style="margin-left: 20px;"><img src="images/Capture-7.png"/></p>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.2/enhancements.html b/releases/8.2.4/documentation/releases/0.2/enhancements.html
new file mode 100644
index 0000000..974f41f
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/enhancements.html
@@ -0,0 +1,482 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Enhancements in Sapphire 0.2</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a> > <a href="index.html">0&#46;2</a></div>
+
+
+<h1>Enhancements in Sapphire 0.2</h1>
+
+<ol>
+  <li><a href="#common">Common</a></li>
+  <ol type="A">
+    <li><a href="#el">Expression Language</a></li>
+    <li><a href="#localization">Localization</a></li>
+  </ol>
+  <li><a href="#modeling">Modeling</a></li>
+  <ol type="A">
+    <li><a href="#transient">Transient Properties</a></li>
+    <li><a href="#derived">Derived Properties</a></li>
+    <li><a href="#element">Improved Element Properties</a></li>
+    <li><a href="#default-xml-binding">Default XML Binding</a></li>
+    <li><a href="#element-without-resource">Model Element Without Resource</a></li>
+  </ol>
+  <li><a href="#ui">UI</a></li>
+  <ol type="A">
+    <li><a href="#actions">Better Actions API</a></li>
+    <li><a href="#create-action">Create Action</a></li>
+    <li><a href="#html">HTML Content Presentation</a></li>
+    <li><a href="#vertical-radio-buttons">More Options for Vertical Radio Buttons</a></li>
+  </ol>
+  <li><a href="#sdk">SDK</a></li>
+  <ol type="A">
+    <li><a href="#extensions-editor">Extensions Editor</a></li>
+    <li><a href="#extensions-doc">Extensions Documentation</a></li>
+  </ol>
+</ol>
+
+<h2><a name="common"><a name="el">Expression Language</a></a></h2>
+
+<p>An expression language can now be used to specify custom behavior without having to write
+a new Java class every time. Expressions can be used in many modeling annotations such as @Enablement 
+and in UI definitions. The number of contexts where expressions can be used will expand
+in future releases.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example, the enablement of a property is defined by an expression over two other 
+properties.</p>
+
+<pre class="source-code"><code>@Enablement( expr = "${ ! ControllingPropBoolean && ( ControllingPropEnum == 'YES' || ControllingPropEnum == 'MAYBE' ) }" )
+
+ValueProperty PROP_SOME_PROP = new ValueProperty( TYPE, "SomeProp" );</code></pre>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example snippet from a UI definition, a content outline node label is defined
+by an expression that allows alternative text to be used if the Name property is null.</p>
+
+<pre class="source-code"><code>&lt;node-template>
+  &lt;label>${ Name == null ? "[contact]" : Name }&lt;/label>
+  ...
+&lt;/node-template></code></pre>
+
+<p><a href="../../el/index.html">See Documentation</a></p>
+
+<h2><a name="localization">Localization</a></h2>
+
+<p>Localization support has been significantly improved. Without going too deep into API changes,
+there is a new @Localizable annotation that can be applied to fields of annotations or model properties.
+This annotation serves as a signal at build-time to the automatic externalizer. The improves 
+extensibility of the externalizer as the items to externalize are no longer hardcodded.</p>
+
+<p>The externalizer now use SHA-256 algorithm for generating resource file keys. This replaces two
+separate less effective approaches.</p>
+
+<p>The samples now include localization fragments for a non-existing language that can be used
+to test localizability. The fragments are generated during Sapphire build by reversing all externalized
+strings. To test localizability, install samples, launch Eclipse with "-nl re" switch and open
+any sample editor or dialog (such as the contacts database editor).</p>
+
+<h2><a name="modeling"><a name="transient">Transient Properties</a></a></h2>
+
+<p>In certain situations, it is necessary to be able to attach arbitrary objects to a model.
+The nature of these objects could make it awkward or difficult to implement string serialization 
+necessary to do this via a value property.</p>
+
+<p>One case where this comes up is when using Sapphire inside a larger UI. In these situations, it 
+is frequently necessary to give the model access to some non-serializable objects to provide 
+context.</p>
+
+<p>Transient properties have the following characteristics:</p>
+
+<ul>
+  <li>No support for persistence.</li>
+  <li>No support for UI presentation.</li>
+  <li>No support for higher-order semantic annotations, such as @DefaultValue, @PossibleValue, etc.</li>
+</ul>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example from the contacts sample, a transient property is used to hold IContact object
+in ISendContactOp model element which is initialized by an editor action.</p>
+
+<pre class="source-code"><code>@Type( base = IContact.class )
+
+TransientProperty PROP_CONTACT = new TransientProperty( TYPE, "Contact" );
+
+Transient&lt;IContact> getContact();
+void setContact( IContact value );</code></pre>
+
+<h2><a name="derived">Derived Properties</a></h2>
+
+<p>In certain situations, it is useful to define a property whose value is derived from other
+properties in the model or external information. A derived property is read-only, although its
+value can change as inputs change.</p>
+
+<p>Derived properties have the following characteristics:</p>
+
+<ul>
+  <li>No support for persistence.</li>
+  <li>No support for annotations that only make sense for writable properties.</li>
+</ul>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example from the contacts sample, a derived property holds message body with content
+derived from contact object held by another property.</p> 
+
+<pre class="source-code"><code>@DerivedValue( service = SendContactOpContentProvider.class )
+@DependsOn( "Contact" )
+
+ValueProperty PROP_MESSAGE_BODY = new ValueProperty( TYPE, "MessageBody" );
+
+Value&lt;String> getMessageBody();</code></pre>
+
+<pre class="source-code"><code>public class SendContactOpContentProvider extends DerivedValueService
+{
+    @Override
+    public String getDerivedValue()
+    {
+        final ISendContactOp op = (ISendContactOp) element();
+        final IContact contact = op.getContact().content();
+        final StringBuilder buf = new StringBuilder();
+
+        ...
+
+        return buf.toString();
+    }
+}</code></pre>
+
+<h2><a name="element">Improved Element Properties</a></h2>
+
+<p>The capabilities of element properties have been revisited for this release. The most
+important improvement is ability to handle heterogeneous content. This means that the
+element property can hold multiple element types that derive from the same element type.
+This capability was already present for list properties and now it is available for
+element properties.</p>
+
+<p>The second major improvement is formalizing the distinction between explicit and implied
+element properties. In the case of an explicit element property, the contained element must
+be explicitly created and it can be deleted. For implied element properties, the contained
+element always exists. The implied element properties are most frequently used to organize
+elements with high number of properties. Since the element doesn't need to be created and
+cannot be deleted, there is no UI manifestation for implied properties. Contrast this with
+explicit element properties which typically require a UI control such a checkbox, a radio 
+buttons group or a combo to manage their state.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example from the <code>IContact</code> element in the contacts sample, the 
+<code>Address</code> property is an implied element property, the <code>Assistant</code> is 
+an explicit homogeneous element property and the <code>PrimaryOccupation</code> is an explicit
+heterogeneous element property.</p>
+
+<p style="margin-left: 20px;">Note the difference in the getter return type between explicit and implied element
+properties. Also notice the difference in property object type.</p>
+
+<p style="margin-left: 20px;">Heterogeneous properties must use the long form of XML binding specification
+(@XmlElementBinding), while homogeneous properties can use either the long or the 
+short form (@XmlBinding).</p> 
+
+<pre class="source-code"><code>// *** Address ***
+
+@Type( base = IAddress.class )
+@XmlBinding( path = "address" )
+
+ImpliedElementProperty PROP_ADDRESS = new ImpliedElementProperty( TYPE, "Address" );
+
+IAddress getAddress();
+
+// *** Assistant ***
+
+@Type( base = IAssistant.class )
+@XmlBinding( path = "assistant" )
+
+ElementProperty PROP_ASSISTANT = new ElementProperty( TYPE, "Assistant" );
+
+ModelElementHandle<IAssistant> getAssistant();
+
+// *** PrimaryOccupation ***
+
+@Type
+( 
+    base = IOccupation.class, 
+    possible = 
+    { 
+        IJobOccupation.class, 
+        IStudentOccupation.class, 
+        IHomemakerOccupation.class 
+    }
+)
+
+@Label( standard = "primary occupation" )
+
+@XmlElementBinding
+( 
+    path = "primary-occupation",
+    mappings = 
+    {
+        @XmlElementBinding.Mapping( element = "job", type = IJobOccupation.class ),
+        @XmlElementBinding.Mapping( element = "student", type = IStudentOccupation.class ),
+        @XmlElementBinding.Mapping( element = "homemaker", type = IHomemakerOccupation.class )
+    }
+)
+
+ElementProperty PROP_PRIMARY_OCCUPATION = new ElementProperty( TYPE, "PrimaryOccupation" );
+
+ModelElementHandle<IOccupation> getPrimaryOccupation();</code></pre>
+
+<p>The UI definition side was improved accordingly. In past releases, "with" construct
+was used for dealing with implied element properties, while a separate "element-property-composite"
+construct was used for dealing explicit element properties. In this release, both are handled
+with the improved "with" construct.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">These are the UI definition snippets from the contacts sample
+for properties shown in the first example. Note how only in the case of the implied
+<code>Address</code> property we can get away with using the <code>default-panel</code>
+short-hand. In other cases, there are at least two cases (the element is present and is not present), so it
+would not work to apply the same definition across the board.</p>
+
+<pre class="source-code"><code>&lt;with>
+  &lt;property>Address&lt;/property>
+  &lt;default-panel>
+    &lt;content>
+      &lt;property-editor>Street&lt;/property-editor>
+      &lt;property-editor>City&lt;/property-editor>
+      &lt;property-editor>State&lt;/property-editor>
+      &lt;property-editor>ZipCode&lt;/property-editor>
+    &lt;/content>
+  &lt;/default-panel>
+&lt;/with></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/element-1.png"/></p>
+
+<pre class="source-code"><code>&lt;with>
+  &lt;property>Assistant&lt;/property>
+  &lt;label>delegate some tasks to an assistant&lt;/label>
+  &lt;panel>
+    &lt;key>IAssistant&lt;/key>
+    &lt;content>
+      &lt;property-editor>Name&lt;/property-editor>
+      &lt;property-editor>Notes&lt;/property-editor>
+      &lt;property-editor>DelegatedTasks&lt;/property-editor>
+    &lt;/content>
+  &lt;/panel>
+&lt;/with></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/element-2.png"/></p>
+<p style="margin-left: 20px;"><img src="images/element-3.png"/></p>
+
+<pre class="source-code"><code>&lt;with>
+  &lt;property>PrimaryOccupation&lt;/property>
+  &lt;panel>
+    &lt;key>IJobOccupation&lt;/key>
+    &lt;content>
+      &lt;property-editor>Employer&lt;/property-editor>
+      &lt;property-editor>Title&lt;/property-editor>
+      &lt;property-editor>Manager&lt;/property-editor>
+    &lt;/content>
+  &lt;/panel>
+  &lt;panel>
+    &lt;key>IStudentOccupation&lt;/key>
+    &lt;content>
+      &lt;property-editor>EducationalInstitution&lt;/property-editor>
+      &lt;property-editor>Program&lt;/property-editor>
+    &lt;/content>
+  &lt;/panel>
+&lt;/with></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/element-4.png"/></p>
+<p style="margin-left: 20px;"><img src="images/element-5.png"/></p>
+
+<p><a href="migration.html#element">See Migration Guide</a></p>
+
+<h2><a name="default-xml-binding">Default XML Binding</a></h2>
+
+<p>There are cases when it is convenient to be able to take a model or a part of a model and
+serialize it as XML without spending time specifying detailed binding. This comes up, for
+instance, when debugging or writing unit tests. To address this requirement, Sapphire now supports 
+default XML binding that doesn't require any XML binding annotations to be used.</p>
+
+<p><a href="../../xml/binding/index.html#default-binding">See Documentation</a></p>
+
+<h2><a name="element-without-resource">Model Element Without Resource</a></h2>
+
+<p>There are cases where a model does not need to be persisted. It could be
+transient in nature, for instance used to back a dialog or a wizard. Sapphire now supports
+easy creation of model elements without a backing resource. Technically, an in-memory 
+resource is still created under the covers, but that's transparent to the developer.</p>
+
+<p>This is an example from the contacts sample. Normally, the instantiate method takes a 
+resource.</p>
+
+<pre class="source-code"><code>final ISendContactOp op = ISendContactOp.TYPE.instantiate();</code></pre>
+
+<h2><a name="ui"><a name="actions">Better Actions API</a></a></h2>
+
+<p>The actions API has been redesigned to make it more flexible and to allow it to be extended 
+to property editors. This replaces an existing facility for registering browse and jump handlers.
+The improved API provides a consistent method for defining actions and handlers for any 
+UI part. In particular, it is now possible to add arbitrary actions to a property editor.</p>
+
+<p>An example of adding a custom action to value and list property editors:</p>
+
+<img src="images/actions-property-editor.png" style="margin-left: 20px;"/>
+
+<p><a href="../../actions/index.html">See Documentation</a><br/>
+<a href="migration.html">See Migration Guide</a></p>
+
+<h2><a name="create-action">Create Action</a></h2>
+
+<p>A new action has been defined to capture the common pattern of creating an entity
+that is referenced by a value property.</p> 
+
+<table>
+  <tr>
+    <th>ID</th>
+    <th>Description</th>
+    <th>Key Binding</th>
+    <th>Contexts</th>
+  </tr>
+  <tr>
+    <td>Sapphire.Create</td>
+    <td>Creates the entity referenced by the property value.</td>
+    <td>SHIFT+CONTROL+ALT+c</td>
+    <td>Sapphire.ValuePropertyEditor</td>
+  </tr>
+</table>
+
+<p>Currently there are no corresponding action handlers registered by the system. To use this feature, the
+developer would register a custom handler at the level of a property editor.</p>
+
+<p>In the following example from the contacts sample, a create action handler is added to assistant name property.
+When the action is activated, a new contact is created using assistant name property value.</p>
+
+<img src="images/create-action.png" style="margin-left: 20px;"/>
+
+<pre class="source-code"><code>&lt;property-editor>
+  &lt;property>Name&lt;/property>
+  &lt;action-handler>
+    &lt;action>Sapphire.Create&lt;/action>
+    &lt;impl>AssistantCreateActionHandler&lt;/impl>
+  &lt;/action-handler>
+&lt;/property-editor></code></pre>
+
+<h2><a name="html">HTML Content Presentation</a></h2>
+
+<p>It is now simple to display HTML content held by a value property. Simply add @HtmlContent 
+annotation to the property. The SWT presentation layer will detect this annotation and render
+property value in a browser control. Currently, there is no support for resolving external 
+resources (CSS, images, etc.) unless absolute URLs are used.</p> 
+
+<h2><a name="vertical-radio-buttons">More Options for Vertical Radio Buttons</a></h2>
+
+<p>It is now possible to suppress the property label when editing an enum property with a 
+vertical radio buttons property editor. This is particularly useful when enclosing the
+radio buttons in an explanatory context, such as a group.</p>
+
+<img src="images/vertical-radio-buttons-1.png" style="margin-left: 20px;"/>
+
+<pre class="source-code"><code>&lt;group>
+  &lt;label>No Label (in Group)&lt;/label>
+  &lt;content>
+    &lt;property-editor>
+      &lt;property>CustomSerializedWithDefault&lt;/property>
+      &lt;hint>
+        &lt;name>prefer.vertical.radio.buttons&lt;/name>
+        &lt;value>true&lt;/value>
+      &lt;/hint>
+      &lt;hint>
+        &lt;name>show.label&lt;/name>
+        &lt;value>false&lt;/value>
+      &lt;/hint>
+    &lt;/property-editor>
+  &lt;/content>
+&lt;/group></code></pre>
+
+<p>Another useful new facility is attaching auxiliary text to individual enum items. This can
+be used to further explain the choices to the user.</p>
+
+<img src="images/vertical-radio-buttons-2.png" style="margin-left: 20px;"/>
+
+<pre class="source-code"><code>&lt;group>
+  &lt;label>No Label (in Group with Aux Text)&lt;/label>
+  &lt;content>
+    &lt;property-editor>
+      &lt;property>CustomSerializedWithDefault&lt;/property>
+      &lt;hint>
+        &lt;name>prefer.vertical.radio.buttons&lt;/name>
+        &lt;value>true&lt;/value>
+      &lt;/hint>
+      &lt;hint>
+        &lt;name>show.label&lt;/name>
+        &lt;value>false&lt;/value>
+      &lt;/hint>
+      &lt;hint>
+        &lt;name>aux.text.yes&lt;/name>
+        &lt;value>Shows agreement or acceptance.&lt;/value>
+      &lt;/hint>
+      &lt;hint>
+        &lt;name>aux.text.maybe&lt;/name>
+        &lt;value>Indicating a lack of certainty. Expressing no commitment to a decision or a neutral viewpoint to a statement.&lt;/value>
+      &lt;/hint>
+      &lt;hint>
+        &lt;name>aux.text.no&lt;/name>
+        &lt;value>Not any possibility or allowance of doing something.&lt;/value>
+      &lt;/hint>
+    &lt;/property-editor>
+  &lt;/content>
+&lt;/group></code></pre>
+
+<h2><a name="sdk"><a name="extensions-editor">Extensions Editor</a></a></h2>
+
+<p>The SDK now includes an editor for sapphire-extension.xml file that is used for contributing
+extensions to Sapphire. The editor is built using Sapphire, of course.</p>
+
+<p><img src="images/extensions-editor-1.png" style="margin-left: 20px;"/></p>
+
+<p>The editor includes a rather unique summary view where the important attributes of all
+contributions are summarized in document format.</p>
+
+<p><img src="images/extensions-editor-2.png" style="margin-left: 20px;"/></p>
+
+<h2><a name="extensions-doc">Extensions Documentation</a></h2>
+
+<p>Documentation now includes a live listing of all extensions contributed to Sapphire. This
+is similar to the summary view in the extension editor, but documentation presents consolidated
+listing of all contributions.</p>
+
+<img src="images/extensions-doc.png" style="margin-left: 20px;"/>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.2/images/actions-property-editor.png b/releases/8.2.4/documentation/releases/0.2/images/actions-property-editor.png
new file mode 100644
index 0000000..515f1aa
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/actions-property-editor.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/images/create-action.png b/releases/8.2.4/documentation/releases/0.2/images/create-action.png
new file mode 100644
index 0000000..dfa66d0
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/create-action.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/images/element-1.png b/releases/8.2.4/documentation/releases/0.2/images/element-1.png
new file mode 100644
index 0000000..8e0bf11
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/element-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/images/element-2.png b/releases/8.2.4/documentation/releases/0.2/images/element-2.png
new file mode 100644
index 0000000..69211f0
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/element-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/images/element-3.png b/releases/8.2.4/documentation/releases/0.2/images/element-3.png
new file mode 100644
index 0000000..2e9d577
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/element-3.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/images/element-4.png b/releases/8.2.4/documentation/releases/0.2/images/element-4.png
new file mode 100644
index 0000000..e956c16
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/element-4.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/images/element-5.png b/releases/8.2.4/documentation/releases/0.2/images/element-5.png
new file mode 100644
index 0000000..6988820
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/element-5.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/images/extensions-doc.png b/releases/8.2.4/documentation/releases/0.2/images/extensions-doc.png
new file mode 100644
index 0000000..322ec30
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/extensions-doc.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/images/extensions-editor-1.png b/releases/8.2.4/documentation/releases/0.2/images/extensions-editor-1.png
new file mode 100644
index 0000000..12ed316
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/extensions-editor-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/images/extensions-editor-2.png b/releases/8.2.4/documentation/releases/0.2/images/extensions-editor-2.png
new file mode 100644
index 0000000..5a38f61
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/extensions-editor-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/images/vertical-radio-buttons-1.png b/releases/8.2.4/documentation/releases/0.2/images/vertical-radio-buttons-1.png
new file mode 100644
index 0000000..dae0069
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/vertical-radio-buttons-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/images/vertical-radio-buttons-2.png b/releases/8.2.4/documentation/releases/0.2/images/vertical-radio-buttons-2.png
new file mode 100644
index 0000000..c97b6eb
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/images/vertical-radio-buttons-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.2/index.html b/releases/8.2.4/documentation/releases/0.2/index.html
new file mode 100644
index 0000000..b6b139a
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/index.html
@@ -0,0 +1,45 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Sapphire 0.2</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a></div>
+
+
+<h1>Sapphire 0.2</h1>
+
+<ul>
+  <li><a href="enhancements.html">Enhancements</a></li>
+  <li><a href="migration.html">Migration Guide</a></li>
+</ul>
+
+<br/><br/>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.2/migration.html b/releases/8.2.4/documentation/releases/0.2/migration.html
new file mode 100644
index 0000000..2ae59cd
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.2/migration.html
@@ -0,0 +1,971 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Migration Guide for Sapphire 0.2</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+  <style type="text/css">
+    pre.source-code 
+    {
+      font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; 
+      color: #000000;
+      background-color: #ffffff;
+      font-size: 12px;
+      border: 0px;
+      line-height: 14px;
+      padding: 5px;
+      margin-left: 0px;
+      margin-right: 0px;
+      overflow: auto
+    }
+  </style>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a> > <a href="index.html">0&#46;2</a></div>
+
+
+<h1>Migration Guide for Sapphire 0.2</h1>
+
+<p>This documents covers changes that need to be made by Sapphire adopters as part of migrating 
+to Sapphire 0.2 from a prior release. Only changes from the previous major release are covered.</p>
+
+<p>Table of Contents</p>
+
+<ol>
+  <li><a href="#annotations">Annotations</a></li>
+  <li><a href="#element">Element Properties</a></li>
+  <li><a href="#no-duplicates">NoDuplicates and UniqueValueValidator</a></li>
+  <li><a href="#editor-for-xml">SapphireEditorForXml</a></li>
+  <li><a href="#condition">SapphireCondition</a></li>
+  <li><a href="#browse-handlers">Browse Handlers</a></li>
+  <li><a href="#jump-handlers">Jump Handlers</a></li>
+  <li><a href="#action-links">Action Links</a></li>
+  <li><a href="#dynamic-label">Dynamic Label</a></li>
+  <li><a href="#project-metadata">Project Metadata</a></li>
+  <li><a href="#misc">Miscellaneous</a></li>
+</ol>
+
+<a name="annotations"><h2>Annotations</h2></a>
+
+<p>Annotations on model elements:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@DefaultValue( "something" )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@DefaultValue( text = "something" )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@DefaultValueProvider( impl = CustomImpl.class )
+
+public class CustomImpl extends DefaultValueProviderImpl
+{
+    ...
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@DefaultValue( service = CustomImpl.class )
+
+public class CustomImpl extends DefaultValueService
+{
+    ...
+}</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@PossibleValuesFromModel( path = "/SomeProperty" )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@PossibleValues( property = "/SomeProperty" )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@PossibleValuesProvider( impl = CustomImpl.class )
+
+public class CustomImpl extends PossibleValuesProviderImpl
+{
+    ...
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@PossibleValues( service = CustomImpl.class )
+
+public class CustomImpl extends PossibleValuesService
+{
+    ...
+}</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@ValueSerializer( impl = CustomImpl.class )
+
+public class CustomImpl extends ValueSerializerImpl
+{
+    ...
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@ValueSerialization( service = CustomImpl.class )
+
+public class CustomImpl extends ValueSerializationService
+{
+    ...
+}</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@Enabler( impl = CustomImpl.class )
+
+public class CustomImpl extends EnablerImpl
+{
+    ...
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Enablement( service = CustomImpl.class )
+
+public class CustomImpl extends EnablementService
+{
+    ...
+}</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@EnabledWhen( "..." )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Enablement( expr = "..." )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@EnabledByBooleanProperty( "SomeProperty" )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Enablement( expr = "${ SomeProperty }" )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@EnabledByEnumProperty( property = "SomeProperty", values = { "A", "B", "C" } )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Enablement( expr = "${ SomeProperty == 'A' || SomeProperty == 'B' || SomeProperty == 'C' }" )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@Reference( target = Object.class, resolver = CustomImpl.class )
+
+public class CustomImpl extends ReferenceResolverImpl
+{
+    ...
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Reference( target = Object.class, service = CustomImpl.class )
+
+public class CustomImpl extends ReferenceService
+{
+    ...
+}</code></pre>
+    </td>
+  </tr>
+</table>
+
+<a name="element"><h2>Element Properties</h2></a>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = IAddress.class )</font>
+
+ElementProperty <font color="#888888">PROP_ADDRESS = new </font>ElementProperty<font color="#888888">( TYPE, "Address" );</font>
+
+<font color="#888888">IAddress getAddress();</font>
+
+...
+
+@GenerateXmlBinding( elementPath = "address" )
+
+<font color="#888888">public interface IAddress extends </font>IModelElementForXml
+<font color="#888888">{
+    ...
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = IAddress.class )</font>
+@XmlBinding( path = "address" )
+
+ImpliedElementProperty <font color="#888888">PROP_ADDRESS = new </font>ImpliedElementProperty<font color="#888888">( TYPE, "Address" );</font>
+
+<font color="#888888">IAddress getAddress();</font>
+
+...
+
+@GenerateImpl
+
+<font color="#888888">public interface IAddress extends </font>IModelElement
+<font color="#888888">{
+    ...
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = IAssistant.class )
+@XmlBinding( path = "assistant" )
+
+ElementProperty PROP_ASSISTANT = new ElementProperty( TYPE, "Assistant" );</font>
+
+IAssistant <font color="#888888">getAssistant();</font>
+IAssistant getAssistant( boolean createIfNecessary );</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = IAssistant.class )
+@XmlBinding( path = "assistant" )
+
+ElementProperty PROP_ASSISTANT = new ElementProperty( TYPE, "Assistant" );</font>
+
+ModelElementHandle&lt;IAssistant> <font color="#888888">getAssistant();</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;with>
+  &lt;property>Address&lt;/property></font>
+  &lt;content>
+    ...
+  &lt;/content>
+<font color="#888888">&lt;/with></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;with>
+  &lt;property>Address&lt;/property></font>
+  &lt;default-panel>
+    &lt;content>
+      ...
+    &lt;/content>
+  &lt;/default-panel>
+<font color="#888888">&lt;/with></font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>&lt;element-property-composite>
+  <font color="#888888">&lt;property>Assistant&lt;/property></font>
+  &lt;conditional><font color="#888888">delegate some tasks to an assistant</font>&lt;/conditional>
+  &lt;default-panel>
+    <font color="#888888">&lt;content>
+      ...
+    &lt;/content></font>
+  &lt;/default-panel>
+&lt;/element-property-composite></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>&lt;with>
+  <font color="#888888">&lt;property>Assistant&lt;/property></font>
+  &lt;label><font color="#888888">delegate some tasks to an assistant</font>&lt;/label>
+  &lt;panel>
+    &lt;key>IAbc&lt;/key>
+    <font color="#888888">&lt;content>
+      ...
+    &lt;/content></font>
+  &lt;/panel>
+&lt;/with></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>The following Eclipse search/replace regular expressions can be used to perform the last migration
+migration in the table:</p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)&lt;element-property-composite>(.*?)&lt;conditional>(.*?)&lt;/conditional>(.*?)&lt;default-panel>(.*?)&lt;/default-panel>(.*?)&lt;/element-property-composite></nobr><br/>
+<nobr>Replace: &nbsp;&lt;with>\1&lt;label>\2&lt;/label>\3&lt;panel>&lt;key>?????&lt;/key>\4&lt;/panel>\5&lt;/with></nobr></p>
+
+<p>After applying the above search and replace, look for &lt;key>?????&lt/key> in your sdef files and specify
+the actual key. In this case, it would be the type name of the element held by the property.</p>
+
+<a name="no-duplicates"><h2>NoDuplicates and UniqueValueValidator</h2></a>
+
+<p>The <code>@NoDuplicates</code> annotation is now applied to a value property (for elements
+contained in a list) rather than the list property. It can be used any place where 
+<code>UniqueValueValidator</code> class has previously been used.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@DependsOn( "*/Name" )
+@Validator( impl = UniqueValueValidator.class )
+
+<font color="#888888">ValueProperty PROP_NAME = new ValueProperty( TYPE, "Name" );</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@NoDuplicates
+
+<font color="#888888">ValueProperty PROP_NAME = new ValueProperty( TYPE, "Name" );</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = IConnection.class )</font>
+@NoDuplicates
+
+<font color="#888888">ListProperty PROP_CONNECTIONS = new ListProperty( TYPE, "Connections" );
+
+ModelElementList&lt;IConnection> getConnections();
+
+...
+
+public interface IConnection extends IModelElement
+{</font>
+    @DependsOn( "*/Name" )
+    @Validator( impl = UniqueValueValidator.class )
+
+    <font color="#888888">ValueProperty PROP_NAME = new ValueProperty( TYPE, "Name" );
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = IConnection.class )</font>
+
+<font color="#888888">ListProperty PROP_CONNECTIONS = new ListProperty( TYPE, "Connections" );
+
+ModelElementList&lt;IConnection> getConnections();
+
+...
+
+public interface IConnection extends IModelElement
+{</font>
+    @NoDuplicates
+
+    <font color="#888888">ValueProperty PROP_NAME = new ValueProperty( TYPE, "Name" );
+}</font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<a name="editor-for-xml"><h2>SapphireEditorForXml</h2></a>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>public class SampleEditor extends SapphireEditorForXml 
+{
+    public SampleEditor() 
+    {
+        super( "org.something.ui" );
+        setEditorDefinitionPath( "org.something.ui/sdef/SampleEditor.sdef/main" );
+    }
+
+    @Override
+    protected IModel createModel( ModelStore modelStore ) 
+    {
+        ...
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>public class SampleEditor extends SapphireEditorForXml 
+{
+    public SampleEditor() 
+    {
+        super( "org.something.ui" );
+        setRootModelElementType( ISampleModel.TYPE );
+        setEditorDefinitionPath( "org.something.ui/sdef/SampleEditor.sdef/main" );
+    }
+}</code></pre>
+    </td>
+  </tr>
+</table>
+
+<a name="condition"><h2>SapphireCondition</h2></a>
+
+<p>Any existing implementations of SapphireCondition that override getDependencies() method should be
+changed to override SapphireModelCondition instead.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class SampleCondition extends</font> SapphireCondition 
+<font color="#888888">{
+    @Override
+    public boolean evaluate() 
+    {
+        ...
+    }
+
+    @Override
+    public List<String> getDependencies()
+    {
+        ...
+    }    
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class SampleCondition extends</font> SapphireModelCondition 
+<font color="#888888">{
+    @Override
+    public boolean evaluate() 
+    {
+        ...
+    }
+
+    @Override
+    public List<String> getDependencies()
+    {
+        ...
+    }    
+}</font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>It is important that any subclass of SapphireModelCondition that overrides initCondition() method,
+also calls the super implementation of this method. Failing to do that will prevent the condition from
+refreshing on dependent property changes.</p> 
+
+<a name="browse-handlers"><h2>Browse Handlers</h2></a>
+
+<p>Browse handler definition in the UI definition file:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;browse-handler>
+        &lt;class>MyBrowseHandler&lt;/class>
+    &lt;/browse-handler>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;action-handler>
+        &lt;action>Sapphire.Browse&lt;/action>
+        &lt;impl>MyBrowseHandler&lt;/impl>
+    &lt;/action-handler>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;&lt;browse-handler>(\s*)&lt;class>(.*?)&lt;/class>(\s*)&lt;/browse-handler></nobr><br/>
+<nobr>Replace: &nbsp;&lt;action-handler>\1&lt;action>Sapphire.Browse&lt;/action>\1&lt;impl>\2&lt;/impl>\3&lt;/action-handler></nobr></p>
+
+<p>Browse handler definition in an extension:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;plugin></font>
+    &lt;extension point="org.eclipse.sapphire.ui.browseHandlers">
+        &lt;browse-handler factory="org.something.MyBrowseHandlerFactory"/>
+    &lt/extension>
+<font color="#888888">&lt;/plugin></font></code></pre>
+    </td>
+    <td>
+      <p>Sapphire no longer uses Eclipse extension system. Instead, create 
+        sapphire-extension.xml file in the META-INF folder. The extension must be located in the 
+        same classloader as Sapphire. On an OSGi system this is done by creating a fragment to
+        the org.eclipse.sapphire.ui bundle.</p>
+
+      <p>Note that the factory concept has been removed. The browse handler implementation class
+        is specified directly. Applicability is controlled by a separate condition class that
+        must extends SapphireCondition.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;extension xmlns="http://www.eclipse.org/sapphire/xmlns/extension"></font>
+    &lt;action-handler>
+        &lt;action>Sapphire.Browse&lt;/action>
+        &lt;impl>org.something.MyBrowseHandler&lt;/impl>
+        &lt;condition>org.something.MyBrowseHandlerCondition&lt;/condition>
+    &lt;/action-handler>
+<font color="#888888">&lt;/extension></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>Browse handler implementation:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>public class MyBrowseHandler extends BrowseHandler
+{
+    @Override
+    public String browse( SapphireRenderingContext context )
+    {
+        ...
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>public class MyBrowseHandler extends SapphireBrowseActionHandler
+{
+    @Override
+    public String browse( SapphireRenderingContext context )
+    {
+        ...
+    }
+}</code></pre>
+    </td>
+  </tr>
+</table>    
+
+<a name="jump-handlers"><h2>Jump Handlers</h2></a>
+
+<p>Jump handler definition in the UI definition file:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;jump-handler>MyJumpHandler&lt;/jump-handler>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;action-handler>
+        &lt;action>Sapphire.Jump&lt;/action>
+        &lt;impl>MyJumpHandler&lt;/impl>
+    &lt;/action-handler>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;([&nbsp;\t]*)&lt;jump-handler>(.*?)&lt;/jump-handler></nobr><br/>
+<nobr>Replace: &nbsp;\1&lt;action-handler>\n\1&nbsp;&nbsp;&lt;action>Sapphire.Jump&lt;/action>\n\1&nbsp;&nbsp;&lt;impl>\2&lt;/impl>\n\1&lt;/action-handler></nobr></p>
+
+<p>Jump handler definition in an extension:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;plugin></font>
+    &lt;extension point="org.eclipse.sapphire.ui.jumpHandlers">
+        &lt;jump-handler class="org.something.MyJumpHandler"/>
+    &lt/extension>
+<font color="#888888">&lt;/plugin></font></code></pre>
+    </td>
+    <td>
+      <p>Sapphire no longer uses Eclipse extension system. Instead, create 
+        sapphire-extension.xml file in the META-INF folder. The extension must be located in the 
+        same classloader as Sapphire. On an OSGi system this is done by creating a fragment to
+        the org.eclipse.sapphire.ui bundle.</p>
+
+      <p>Note that the logic from the isApplicable method needs to be extracted into a separate
+        condition class. The condition class must extend SapphireCondition.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;extension xmlns="http://www.eclipse.org/sapphire/xmlns/extension"></font>
+    &lt;action-handler>
+        &lt;action>Sapphire.Jump&lt;/action>
+        &lt;impl>org.something.MyJumpHandler&lt;/impl>
+        &lt;condition>org.something.MyJumpHandlerCondition&lt;/condition>
+    &lt;/action-handler>
+<font color="#888888">&lt;/extension></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>Jump handler implementation:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>public class MyJumpHandler extends JumpHandler
+{
+    @Override
+    public boolean isApplicable( ValueProperty property )
+    {
+        return true;
+    }
+
+    @Override
+    public int getPriority()
+    {
+        return 0;
+    }
+
+    @Override
+    public boolean canLocateJumpTarget( SapphirePart part,
+                                        SapphireRenderingContext context,
+                                        IModelElement element,
+                                        ValueProperty property )
+    {
+        // Logic for evaluating whether the jump handler is active goes here.
+
+        return false
+    }
+
+    @Override
+    public void jump( SapphirePart part,
+                      SapphireRenderingContext context,
+                      IModelElement element,
+                      ValueProperty property )
+    {
+        // Logic for executing the jump goes here.
+    }
+}</code></pre>
+    </td>
+    <td>
+      <p>The isApplicable method has been replaced with a separate condition class that
+        is specified as part of handler definition. This is usually only necessary when
+        a jump handler is contributed in an extension (as opposed to locally as part of
+        a property editor definition).</p>
+      <p>The getPriority method has been replaced with location hints specified as part of
+        handler definition.</p>
+<pre class="source-code"><code>public class MyJumpHandler extends SapphireJumpActionHandler
+{
+    @Override
+    public void init( SapphireAction action,
+                      ISapphireActionHandlerDef def )
+    {
+        super.init( def );
+
+        // Setup listeners on external resources relevant in determining whether
+        // the jump handler is active. The listeners should call refreshEnablementState
+        // method. If a listener infrastructure is not available, a polling thread
+        // can be used instead.
+
+        // If all relevant resources are other properties in the same model, skip
+        // overriding this method and override initDependencies method instead.
+    }
+
+    @Override
+    protected void initDependencies( List&lt;String> dependencies )
+    {
+        super.initDependencies( dependencies );
+
+        // The default implementation will add the property whose editor the jump handler
+        // is attached to. If the enablement state of the jump handler is dependent on other
+        // properties in the model, paths to those properties should be added here.
+    }
+
+    @Override
+    protected void refreshEnablementState()
+    {
+        // Logic for evaluating whether the jump handler is active goes here.
+
+        setEnabled( false );
+    }
+
+    @Override
+    protected Object run( SapphireRenderingContext context )
+    {
+        // Logic for executing the jump goes here.
+
+        return null;
+    }
+
+    @Override    
+    public void dispose()
+    {
+        super.dispose();
+
+        // Remove listeners and stop threads configured in the init method.
+    }
+}</code></pre>
+    </td>
+  </tr>
+</table>    
+
+<a name="action-links"><h2>Action Links</h2></a>
+
+<p>Defined by referencing existing action:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;content></font>
+    &lt;action-link>
+        &lt;action-id>node:add&lt;/action-id>
+        &lt;label>Add a contact&lt;/label>
+    &lt;/action-link>
+<font color="#888888">&lt;/content></font></code></pre>
+    </td>
+    <td>
+      <p>While the XML markup for definining action links hasn't changed for this
+        scenario, the IDs for all system actions have changed. The appropriate
+        system action ID can be found <a href="../../extensions/existing.html#actions">here</a>.</p>
+<pre class="source-code"><code><font color="#888888">&lt;content></font>
+    &lt;action-link>
+        &lt;action-id>Sapphire.Add&lt;/action-id>
+        &lt;label>Add a contact&lt;/label>
+    &lt;/action-link>
+<font color="#888888">&lt;/content></font></code></pre>
+    </td>
+  </tr>
+</table>    
+
+<p>Defined by referencing existing action handler:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;content></font>
+    &lt;action-link>
+        &lt;action-id>node:add:IListItemWithInteger&lt;/action-id>
+        &lt;label>Add a list item with integer&lt;/label>
+    &lt;/action-link>
+<font color="#888888">&lt;/content></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;content></font>
+    &lt;action-link>
+        &lt;action-id>Sapphire.Add&lt;/action-id>
+        &lt;action-handler-id>Sapphire.Add.IListItemWithInteger&lt;/action-handler-id>
+        &lt;label>Add a list item with integer&lt;/label>
+    &lt;/action-link>
+<font color="#888888">&lt;/content></font></code></pre>
+    </td>
+  </tr>
+</table>    
+
+<p>Defined with inline action implementation:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;content></font>
+    &lt;action-link>
+        &lt;action-class>MyAction&lt;/action-class>
+        &lt;label>Link&lt;/label>
+    &lt;/action-link>
+<font color="#888888">&lt;/content></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;content></font>
+    &lt;action-link>
+        &lt;action-id>MyAction&lt;/action-id>
+        &lt;label>Link&lt;/label>
+        &lt;action>
+            &lt;id>MyAction&lt;/id>
+        &lt;/action>
+        &lt;action-handler>
+            &lt;action>MyAction&lt;/action>
+            &lt;impl>MyActionHandler&lt;/impl>
+        &lt;/action-handler>
+    &lt;/action-link>
+<font color="#888888">&lt;/content></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<a name="dynamic-label"><h2>Dynamic Label</h2></a>
+
+<p>With the new support for expressions, some old workarounds have been retired. One of these
+is the "dynamic-label" used for specifying label for the content outline. You must now use
+an expression to achieve the same affect.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;node-list>
+  &lt;node-template></font>
+    &lt;dynamic-label>
+      &lt;property>Name&lt;/property>
+      &lt;null-value-label>&amp;lt;contact&amp;gt;&lt;/null-value-label>
+    &lt;/dynamic-label>
+  <font color="#888888">&lt;/node-template>
+&lt;/node-list></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;node-list>
+  &lt;node-template></font>
+    &lt;label>${ Name == null ? "&amp;lt;contact&amp;gt;" : Name }&lt;/label>
+  <font color="#888888">&lt;/node-template>
+&lt;/node-list></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>The following Eclipse search/replace regular expressions can be used to perform this
+migration:</p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;&lt;dynamic-label>\s*&lt;property>(.*)&lt;/property>\s*&lt;null-value-label>(.*)&lt;/null-value-label>\s*&lt;/dynamic-label></nobr><br/>
+<nobr>Replace: &nbsp;&lt;label>\$\{ \1 == null \? \"\2\" \: \1 \}&lt;/label></nobr></p>
+
+<a name="project-metadata"><h2>Project Metadata</h2></a>
+
+<p>In the .project file:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>&lt;buildCommand>
+    &lt;name>org.eclipse.sapphire.ui.builder&lt;/name>
+    &lt;arguments>
+        &lt;dictionary>
+            &lt;key>input&lt;/key>
+            &lt;value>sdef&lt;/value>
+        &lt;/dictionary>
+        &lt;dictionary>
+            &lt;key>output&lt;/key>
+            &lt;value>.resources/sdef&lt;/value>
+        &lt;/dictionary>
+    &lt;/arguments>
+&lt;/buildCommand></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>&lt;buildCommand>
+    &lt;name>org.eclipse.sapphire.sdk.builder&lt;/name>
+    &lt;arguments>
+    &lt;/arguments>
+&lt;/buildCommand></code></pre>
+    </td>
+  </tr>
+</table>    
+
+<p>In the customBuildCallbacks.xml file:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>&lt;taskdef 
+  resource="org/eclipse/sapphire/ui/build/antlib.xml"
+  classpathref="sapphire.classpath"/>
+
+&lt;sapphire.extract-string-resources src="sdef" dest=".resources/sdef"/></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>&lt;taskdef 
+  resource="org/eclipse/sapphire/sdk/build/antlib.xml"
+  classpathref="sapphire.classpath"/>
+
+&lt;sapphire src="." dest=".resources"/></code></pre>
+    </td>
+  </tr>
+</table>    
+
+<a name="misc"><h2>Miscellaneous</h2></a>
+
+<p>Child property editor definition:</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;child-property>
+        &lt;name>MyChildProperty&lt;/name>
+    &lt;/child-property>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;child-property>
+        &lt;property>MyChildProperty&lt;/property>
+    &lt;/child-property>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+  </tr>
+</table>    
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.3.1/enhancements.html b/releases/8.2.4/documentation/releases/0.3.1/enhancements.html
new file mode 100644
index 0000000..18d0cd5
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3.1/enhancements.html
@@ -0,0 +1,389 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Enhancements in Sapphire 0.3.1</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a> > <a href="index.html">0&#46;3&#46;1</a></div>
+
+
+<h1>Enhancements in Sapphire 0.3.1</h1>
+
+<ol>
+  <li><a href="#ExpressionLanguage">Expression Language</a></li>
+  <ol type="A">
+    <li><a href="#CastBetweenCollectionsAndStrings">Cast Between Collections and Strings</a></li>
+    <li><a href="#InstanceOf">InstanceOf Function</a></li>
+  </ol>
+  <li><a href="#Services">Services</a></li>
+  <ol type="A">
+    <li><a href="#DependenciesService">DependenciesService</a></li>
+    <li><a href="#FileExtensionsService">FileExtensionsService</a></li>
+  </ol>
+  <li><a href="#DiagramEditor">Diagram Editor</a></li>
+  <ol type="A">
+    <li><a href="#DiagramGuidesToggle">Guides Toggle</a></li>
+    <li><a href="#DiagramLayout">Diagram Layout</a></li>
+    <li><a href="#DiagramPalette">Diagram Tool Palette Customization</a></li>
+    <li><a href="#VisibleWhenForDiagramNodes">Visible When Condition for Diagram Nodes</a></li>
+  </ol>
+  <li><a href="#JavaDeveloperToolsSupport">Java Developer Tools Support</a></li>
+  <ol type="A">
+    <li><a href="#CreateAction">Create Action</a></li>
+  </ol>
+  <li><a href="#Miscellaneous">Miscellaneous</a></li>
+  <ol type="A">
+    <li><a href="#ByteShortDate">Byte, Short and Date Values</a></li>
+    <li><a href="#ModelElementTypeWithoutPrefix">Optional 'I' Prefix</a></li>
+    <li><a href="#VisibleWhenForPropertiesViewPages">Visible When Condition for Properties View Pages</a></li>
+    <li><a href="#ContentOutlineToolTip">Content Outline Validation Message Tool Tip</a></li>
+  </ol>
+</ol>
+
+<h2><a name="ExpressionLanguage"><a name="CastBetweenCollectionsAndStrings">Cast Between Collections and Strings</a></a></h2>
+
+<p>Transparently cast between collections and strings. The following rules have been added:</p>
+
+<ul>
+  <li>String to List</li>
+  <li>List to String</li>
+  <li>Set to String</li>
+  <li>Array to String</li>
+</ul>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">The following two expressions are equivalent.</p>
+
+<pre class="source-code"><code>${ "z" IN List( "x", "y", "z" ) }
+${ "z" IN "x,y,z" }</code></pre>
+
+<p><a href="../../el/index.html#conversion">See Documentation</a></p>
+
+<h2><a name="InstanceOf">InstanceOf Function</a></h2>
+
+<p>Determines if an object is of specified type. The object to be checked is the first operand and the
+type is the second operand. The type must be a fully-qualified Java class name.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>${ InstanceOf( 12345, "java.lang.Number" ) }
+${ InstanceOf( SampleProperty, "org.eclipse.sapphire.samples.ISampleModelElement" ) }</code></pre>
+
+<h2><a name="Services"><a name="DependenciesService">DependenciesService</a></a></h2>
+
+<p>Use services infrastructure to specify dependencies between properties. Existing annotations such as @DependsOn and @NoDuplicates
+are now backed by DependenciesService implementations.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>@DependsOn( "Name" )
+
+<font color="#888888">ValueProperty PROP_ID = new ValueProperty( TYPE, "Id" );
+
+Value&lt;String> getId();
+void setId( String value );</font></code></pre>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>public class CustomDependenciesService extends DependenciesService
+{
+    @Override
+    protected void compute( Set&lt;ModelPath> dependencies )
+    {
+        // Compute the list of extensions.
+    }
+}</code></pre>
+
+<pre class="source-code"><code>@Service( impl = CustomDependenciesService.class )
+
+<font color="#888888">ValueProperty PROP_NAME = new ValueProperty( TYPE, "Name" );
+
+Value&lt;String> getName();
+void setName( String value );</font></code></pre>
+
+<p><a href="../../services/index.html#DependenciesService">See Documentation</a></p>
+
+<h2><a name="FileExtensionsService">FileExtensionsService</a></h2>
+
+<p>Specify file extensions with expression language capable @FileExtensions annotation or with a completely custom implementation
+of FileExtensionsService.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">@Type( base = Path.class )
+@AbsolutePath
+@MustExist
+@ValidFileSystemResourceType( FileSystemResourceType.FILE )</font>
+@FileExtensions( expr = "${ LossyFormat ? "jpeg,jpg" : "png,gif" }" )
+
+<font color="#888888">ValueProperty PROP_FILE_PATH = new ValueProperty( TYPE, "FilePath" );
+
+Value&lt;Path> getFilePath();
+void setFilePath( String value );
+void setFilePath( Path value );</font></code></pre>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>public class CustomFileExtensionsService extends FileExtensionsService
+{
+    @Override
+    public void initFileExtensionsService( IModelElement element,
+                                           ModelProperty property,
+                                           String[] params )
+    {
+        // Optionally register listeners to invoke refresh method when the list of extensions
+        // may need to be updated.
+    }
+
+    @Override
+    protected void compute( List&lt;String> extensions )
+    {
+        // Compute the list of extensions.
+    }
+
+    @Override
+    public void dispose()
+    {
+        super.dispose();
+
+        // Remove any listeners that were added during initialization.
+    }
+}</code></pre>
+
+<pre class="source-code"><code><font color="#888888">@Type( base = Path.class )
+@AbsolutePath
+@MustExist
+@ValidFileSystemResourceType( FileSystemResourceType.FILE )</font>
+@Service( impl = CustomFileExtensionsService.class )
+
+<font color="#888888">ValueProperty PROP_FILE_PATH = new ValueProperty( TYPE, "FilePath" );
+
+Value&lt;Path> getFilePath();
+void setFilePath( String value );
+void setFilePath( Path value );</font></code></pre>
+
+<p><a href="../../services/index.html#FileExtensionsService">See Documentation</a></p>
+
+<h2><a name="DiagramEditor"><a name="DiagramGuidesToggle">Diagram Guides Toggle</a></a></h2>
+
+<p>The alignment guides can be toggled by the user via a context menu and the default state can be
+specified by the developer in the diagram definition.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">&lt;diagram-page></font>
+    &lt;guides>
+        &lt;visible>true&lt;/visible>
+    &lt;/guides>        
+<font color="#888888">&lt;/diagram-page></font></code></pre>
+
+<h2><a name="DiagramLayout">Diagram Layout</a></h2>
+
+<p>Users can now trigger diagram layout when necessary via the context menu. Two modes are supported: horizontal layout and vertical
+lyout. In addition to manually triggering layout, when the diagram editor is opened, if the corresponding layout file cannot be
+found, horizontal layout will be used.</p>
+
+<h2><a name="DiagramPalette">Diagram Tool Palette Customization</a></a></h2>
+
+<p>The diagram tool palette compartments can be customized in the diagram definition.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">&lt;diagram-page></font>
+    &lt;palette>
+        &lt;compartment>
+            &lt;id>connections&lt;/id>
+            &lt;label>my connections&lt;/label>
+        &lt;/compartment>
+        &lt;compartment>
+            &lt;id>nodes&lt;/id>
+            &lt;label>my objects&lt;/label>
+        &lt;/compartment>
+    &lt;/palette>        
+<font color="#888888">&lt;/diagram-page></font></code></pre>
+
+<p>Developer can also control which compartment of the tool palette to place each node or connection creation tool in the node 
+or connection definition.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">&lt;node></font>
+    &lt;tool-palette-compartment>connections&lt;/tool-palette-compartment>
+<font color="#888888">&lt;/node></font></code></pre>
+
+<p>If no compartments are defined in diagram page definition, there'll be two default compartments:
+one for connections and one for nodes. The default compartment label for connections is "Connections"
+and the default id is "Sapphire.Diagram.Palette.Connections". The default compartment label for nodes
+is "Objects" and the default id is "Sapphire.Diagram.Palette.Nodes".</p>
+
+<h2><a name="VisibleWhenForDiagramNodes">Visible When Condition for Diagram Nodes</a></a></h2>
+
+<p>Use Sapphire Expression Language to specify when diagram nodes of certain type should be shown. When the condition
+evaluates to false, the palette will not show the node entry and any existing nodes of this type will be hidden.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;diagram-page>
+    &lt;node></font>
+        &lt;visible-when>${ Root().DetailLevel GE 2 }&lt;/visible-when>
+    <font color="#888888">&lt;/node>
+&lt;diagram-page></font></code></pre>
+
+<h2><a name="JavaDeveloperToolsSupport"><a name="CreateAction">Java Type Create Action</a></a></h2>
+
+<p>The Java type support has been further improved with addition of an action that can create a new
+Java type if the specified type name cannot be resolved.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>@Type( base = JavaTypeName.class )
+@Reference( target = JavaType.class )
+@Label( standard = "filter" )
+@JavaTypeConstraint( kind = { JavaTypeKind.CLASS, JavaTypeKind.INTERFACE }, type = "java.io.FileFilter" )
+@MustExist
+@Required
+
+ValueProperty PROP_FILTER = new ValueProperty( TYPE, "Filter" );
+
+ReferenceValue&lt;JavaTypeName,JavaType> getFilter();
+void setFilter( String value );
+void setFilter( JavaTypeName value );</code></pre>
+
+<p style="margin-left: 20px;">Since @JavaTypeConstraint annotation in this example specifies that the property can reference either a class or an interface,
+the user is presented with a choice after clicking on the create button.</p>
+
+<p style="margin-left: 20px;"><img src="images/JavaCreateAction-1.png"/></p>
+
+<p style="margin-left: 20px;">Once the appropriate option is selected, the new type is created and opened in the Java editor. The created
+type derives from the type specified in @JavaTypeConstraint annotation and is formatted according to user's
+format preferences.</p>
+
+<p style="margin-left: 20px;"><img src="images/JavaCreateAction-2.png"/></p>
+
+<h2><a name="Miscellaneous"><a name="ByteShortDate">Byte, Short and Date Values</a></a></h2>
+
+<p>Use Byte, Short and Date types for value properties without writing a custom serialization service. The serialization
+service for Date is configurable and can be subclassed to meet the date format requirements.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example, the framework's default Date serialization logic is used.</p>
+
+<pre class="source-code"><code>@Type( base = Date.class )
+
+ValueProperty PROP_DATE = new ValueProperty( TYPE, "Date" );
+
+Value&lt;Date> getDate();
+void setDate( String value );
+void setDate( JavaTypeName value );</code></pre>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example, the framework's DateSerializationService implementation is used,
+but is configured with specific formats.</p>
+
+<pre class="source-code"><code>@Type( base = Date.class )
+@ValueSerialization( service = DateSerializationService.class, params = { "yyyy.MM.dd", "MM/dd/yyyy" } )
+
+ValueProperty PROP_DATE = new ValueProperty( TYPE, "Date" );
+
+Value&lt;Date> getDate();
+void setDate( String value );
+void setDate( JavaTypeName value );</code></pre>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example, the framework's DateSerializationService is subclassed to
+create a custom serialization service..</p>
+
+<pre class="source-code"><code>public class CustomDateSerializationService extends DateSerializationService
+{
+    private final static List&lt;DateFormat> FORMATS;
+
+    static 
+    {
+        final List&lt;DateFormat> formats = new ArrayList&lt;DateFormat>();
+        formats.add( new SimpleDateFormat( "dd.MM.yyyy" ) );
+        formats.add( new SimpleDateFormat( "yyyy/MM/dd" ) );
+
+        FORMATS = Collections.unmodifiableList(formats);
+    };
+
+    @Override
+    public List&lt;? extends DateFormat> formats()
+    {
+        return FORMATS;
+    }
+
+}</code></pre>
+
+<pre class="source-code"><code>@Type( base = Date.class )
+@ValueSerialization( service = CustomDateSerializationService.class )
+
+ValueProperty PROP_DATE = new ValueProperty( TYPE, "Date" );
+
+Value&lt;Date> getDate();
+void setDate( String value );
+void setDate( JavaTypeName value );</code></pre>
+
+<h2><a name="ModelElementTypeWithoutPrefix">Optional 'I' Prefix</a></h2>
+
+<p>Sapphire adopters are no longer required to utilize the convention of prefixing 'I' in front of interface names
+when defining model elements. The @GenerateImpl annotation has a new className attribute for explicitly controlling
+the implementation class name. The default implementation class name is now defined as follows:</p>
+
+<pre class="source-code"><code>if( using 'I' prefix convention )
+{
+    default implementation class name is typeClassName.substring( 1 )
+}
+else
+{
+    default implementation class name is typeClassName + "Impl"
+}</code></pre>
+
+<h2><a name="VisibleWhenForPropertiesViewPages">Visible When Condition for Properties View Pages</a></h2>
+
+<p>Use Sapphire Expression Language to specify when contributed properties view pages should be shown.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;properties-view>
+    &lt;page>
+        &lt;label>provider&lt;/label></font>
+        &lt;visible-when>${ Root().DetailLevel GE 2 }&lt;/visible-when>
+        <font color="#888888">&lt;content>
+            ...
+        &lt;/content>
+    &lt;/page>
+&lt;/properties-view></font></code></pre>
+
+<h2><a name="ContentOutlineToolTip">Content Outline Validation Message Tool Tip</a></h2>
+
+<p>Easily see the aggregate validation messages by hovering over a node in the content outline.</p>
+
+<p style="margin-left: 20px;"><img src="images/ContentOutlineToolTip.png"/></p>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.3.1/images/ContentOutlineToolTip.png b/releases/8.2.4/documentation/releases/0.3.1/images/ContentOutlineToolTip.png
new file mode 100644
index 0000000..dec5673
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3.1/images/ContentOutlineToolTip.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3.1/images/JavaCreateAction-1.png b/releases/8.2.4/documentation/releases/0.3.1/images/JavaCreateAction-1.png
new file mode 100644
index 0000000..8f6a23d
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3.1/images/JavaCreateAction-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3.1/images/JavaCreateAction-2.png b/releases/8.2.4/documentation/releases/0.3.1/images/JavaCreateAction-2.png
new file mode 100644
index 0000000..0752a1d
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3.1/images/JavaCreateAction-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3.1/index.html b/releases/8.2.4/documentation/releases/0.3.1/index.html
new file mode 100644
index 0000000..31f8e55
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3.1/index.html
@@ -0,0 +1,44 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Sapphire 0.3.1</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a></div>
+
+
+<h1>Sapphire 0.3.1</h1>
+
+<ul>
+  <li><a href="enhancements.html">Enhancements</a></li>
+</ul>
+
+<br/><br/>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.3/enhancements.html b/releases/8.2.4/documentation/releases/0.3/enhancements.html
new file mode 100644
index 0000000..cf41080
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/enhancements.html
@@ -0,0 +1,1175 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle and Liferay
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ *    Greg Amerson - [342771] Support "image+label" hint for when actions are presented in a toolbar
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Enhancements in Sapphire 0.3</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a> > <a href="index.html">0&#46;3</a></div>
+
+
+<h1>Enhancements in Sapphire 0.3</h1>
+
+<ol>
+  <li><a href="#el">Expression Language</a></li>
+  <ol type="A">
+    <li><a href="#el-general">General Improvements</a></li>
+    <li><a href="#list-function">List Function</a></li>
+    <li><a href="#in-operator">IN Operator</a></li>
+    <li><a href="#el-type-casts">Custom Type Casts</a></li>
+  </ol>
+  <li><a href="#modeling">Modeling</a></li>
+  <ol type="A">
+    <li><a href="#ref">ReferenceValue Improvements</a></li>
+    <li><a href="#folding">Folding XML Element Binding</a></li>
+    <li><a href="#relative">Relative Path Support Improvements</a></li>
+    <li><a href="#image-handling">Image Handling</a></li>
+    <li><a href="#value-label-image-services">Value Label and Image Services</a></li>
+    <li><a href="#required-annotation">Required Annotation</a></li>
+    <li><a href="#whitespace-handling">Whitespace Handling and Value Normalization</a></li>
+    <li><a href="#clear-on-disable">Clear Property on Disable</a></li>
+    <li><a href="#java-base-type">More Control Over Java Type Constraint Required Base Type</a></li>
+  </ol>
+  <li><a href="#ui">UI</a></li>
+  <ol type="A">
+    <li><a href="#html">HTML Content Presentation</a></li>
+    <li><a href="#related-content">Related Content</a></li>
+    <li><a href="#action-label-el">Expressions in Action Labels</a></li>
+    <li><a href="#checkbox-layouts">Checkbox Layouts</a></li>
+    <li><a href="#properties-view">Properties View</a></li>
+    <li><a href="#image-el">Image Expressions</a></li>
+    <li><a href="#ancestor-access">Ancestor Access</a></li>
+    <li><a href="#with">Improved With Directive Presentation</a></li>
+    <li><a href="#master-details-element-properties">Element Properties in Master Details Content Outline</a></li>
+    <li><a href="#action-style-hint">Action Style Hint</a></li>
+    <li><a href="#page-header-image">Page Header Image</a></li>
+    <li><a href="#checkbox-list-for-enum">Checkbox List as Default Enum List Presentation</a></li>
+    <li><a href="#collapsible-sections">Collapsible Sections</a></li>
+  </ol>
+</ol>
+
+<h2><a name="el"><a name="el-general">Expression Language Improvements</a></a></h2>
+
+<p>Index into any list or array using array notation.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>${ Contacts[ 0 ].Name }</code></pre>
+
+<p>Retrieve the size of any collection or array using Size property.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>${ Contacts.Size }</code></pre>
+
+<p>Take advantage of actual conditional evaluation of the conditional operator. In the 0.2 release,
+the conditional operator would always evaluate both alternatives, which made it impossible to use
+it in cases where evaluating the unused alternative results in an error.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example, evaluating the true alternative when the size of the contacts list is zero would
+produce an error.</p>
+
+<pre class="source-code"><code>${ Contacts.Size == 1 ? Contacts[ 0 ].Name : "multiple contacts" }</code></pre>
+
+<p>The expression language in the 0.2 release supported navigating down the model hierarchy
+using Foo.Bar.Xyz syntax, but in certain cases it is useful to navigate up the model hierarchy. To
+support these scenarios, Parent and Root functions have been added.</p>
+
+<p style="margin-left: 20px;"><b>Examples</b></p>
+
+<pre class="source-code"><code>${ Parent().Name == "John" }
+${ Parent().Parent().Name == "John" }
+${ Root().Name == "John" }
+</code></pre>
+
+<h2><a name="list-function">List Function</a></h2>
+
+<p>Construct a list from arbitrary number of operands using List function.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>${ List( 'TRIANGLE', 'RECTANGLE', 'SQUARE' ) }</code></pre>
+
+<h2><a name="in-operator">IN Operator</a></h2>
+
+<p>The new IN operator allows for a compact check to see if a given value is represented in a collection of values. The
+comparison semantics are the same as the '==' operator. </p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>${ ShapeType IN List( 'TRIANGLE', 'RECTANGLE', 'SQUARE' ) }</code></pre>
+
+<p style="margin-left: 20px;">The IN operator is largely semantically equivalent to multiple equality comparisons joined 
+together with an OR operator.</p>
+
+<pre class="source-code"><code>${ ShapeType == 'TRIANGLE' || ShapeType == 'RECTANGLE' || ShapeType == 'SQUARE' }</code></pre>
+
+<h2><a name="el-type-casts">Custom Type Casts</a></h2>
+
+<p>Contribute custom type casts to handle data type conversion in expressions. Custom type casts are
+registered in sapphire-extension.xml file.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">&lt;extension></font>
+    &lt;type-cast>
+        &lt;source>java.lang.String&lt;/source>
+        &lt;target>org.example.FooBar&lt;/target>
+        &lt;impl>org.example.StringToFooBarTypeCast&lt;/impl>
+    &lt;/type-cast>
+<font color="#888888">&lt;/extension></font></code></pre>
+
+<pre class="source-code"><code>public class StringToFooBarTypeCast extends TypeCast
+{
+    @Override
+    public Object evaluate( final FunctionContext context,
+                            final Function requestor,
+                            final Object value,
+                            final Class&lt;?> target )
+    {
+        return new FooBar( (String) value );
+    }
+}</code></pre>
+
+<h2><a name="modeling"><a name="ref">ReferenceValue Improvements</a></a></h2>
+
+<p>In the past releases, the reference value properties were assumed to always use string as the reference
+type. The developer could only specify the reference target type. In this release, you can use a type other
+than a string for the reference.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">Use string as reference type, similar to what was possible in past releases.<p>
+
+<pre class="source-code"><code>@Reference( target = JavaType.class )
+
+ValueProperty PROP_IMPL_CLASS = new ValueProperty( TYPE, "ImplClass" );
+
+ReferenceValue&lt;String,JavaType> getImplClass();
+void setImplClass( String value );</code></pre>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">Use a non-string type as reference type.<p>
+
+<pre class="source-code"><code>@Type( base = JavaTypeName.class )
+@Reference( target = JavaType.class )
+
+ValueProperty PROP_IMPL_CLASS = new ValueProperty( TYPE, "ImplClass" );
+
+ReferenceValue&lt;JavaTypeName,JavaType> getImplClass();
+void setImplClass( String value );
+void setImplClass( JavaTypeName value );
+</code></pre>
+
+<h2><a name="folding">Folding XML Element Binding</a></h2>
+
+<p>In certain cases, while a given XML element can have a number of child
+elements, one of the child elements occurs by itself with high frequency. In
+these cases, it useful to reduce the verbosity of XML by folding the child
+element into the parent.</p>
+
+<p>Using the folding binding, it is possible to have the same value property
+bind to "xyz" string in both of the following examples. If a child element
+is added, first form will automatically transform into the second. Similarly,
+if all child element except the folding one are removed, the second form
+will automatically transform into the first.</p>
+
+<pre class="source-code"><code>&lt;root>xyz&lt;/root></code></pre>
+
+<pre class="source-code"><code>&lt;root>
+  &lt;a>xyz&lt;/a>
+  ...
+&lt;/root></code></pre>
+
+<p>To use this feature, specify XML binding as follows:</p>
+
+<pre class="source-code"><code>@CustomXmlValueBinding( impl = FoldingXmlValueBindingImpl.class, params = "a" )</code></pre>
+
+<p>Set params attribute to the name of the folding element. Take care not to
+apply this binding to more than one child element in a given parent.</p>
+
+<h2><a name="relative">Relative Path Support Improvements</a></h2>
+
+<p>Similar to the existing @WorkspaceRelativePath annotation, you can now use 
+@ProjectRelativePath annotation to support paths relative to the
+root of the context project. Use this annotation in conjunction with @MustExist, @ValidFileSystemResourceType
+and @ValidFileExtensions annotations to gain validation, browse dialog and jump action (ctrl+click on path 
+to open file). For this feature to work, the model must be based on a resource contained in a project.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>// *** WorkspaceRelativePath ***
+
+@Type( base = Path.class )
+@WorkspaceRelativePath
+@MustExist
+
+ValueProperty PROP_WORKSPACE_RELATIVE_PATH = new ValueProperty( TYPE, "WorkspaceRelativePath" );
+
+Value&lt;Path> getWorkspaceRelativePath();
+void setWorkspaceRelativePath( String value );
+void setWorkspaceRelativePath( Path value );
+
+// *** ProjectRelativePath ***
+
+@Type( base = Path.class )
+@ProjectRelativePath
+@MustExist
+
+ValueProperty PROP_PROJECT_RELATIVE_PATH = new ValueProperty( TYPE, "ProjectRelativePath" );
+
+Value&lt;Path> getProjectRelativePath();
+void setProjectRelativePath( String value );
+void setProjectRelativePath( Path value );</code></pre>
+
+<p>Relative path support now can handle both enclosed paths and those that use parent navigation "../"
+to reach outside. Override RelativePathService.enclosed() method as necessary. The default implementation
+returns true.</p>
+
+<p>A common scenario for relative paths that reach outside the root is where the paths in the model should be
+relative to the location where the model is stored. Use the new @ModelRelativePath annotation to handle
+this case.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>// *** RelativePath ***
+
+@Type( base = Path.class )
+@ModelRelativePath
+@MustExist
+
+ValueProperty PROP_RELATIVE_PATH = new ValueProperty( TYPE, "RelativePath" );
+
+Value&lt;Path> getRelativePath();
+void setRelativePath( String value );
+void setRelativePath( Path value );</code></pre>
+
+<p>The service implementation backing @ModelRelativePath may be instructive for those looking to implement
+a custom relative path service.</p>
+
+<pre class="source-code"><code>public class ModelRelativePathService extends RelativePathService
+{
+    public List&lt;Path> roots()
+    {
+        final File file = element().adapt( File.class );
+
+        if( file == null )
+        {
+            return Collections.emptyList();
+        }
+        else
+        {
+            return Collections.singletonList( new Path( file.getParent() ) );
+        }
+    }
+
+    public boolean enclosed()
+    {
+        return false;
+    }
+}</code></pre>
+
+<p>The new RelativePathService also exposes convertToRelative() and convertToAbsolute() methods. While the
+default implementation should be sufficient for most cases, the conversion methods can be overridden to
+support custom requirements. Some examples of such requirements include leading slash in front of a relative
+path and path variables.</p>
+
+<h2><a name="image-handling">Image Handling</a></h2>
+
+<p>The @Image annotation now resolves images straight from the class loader of the annotated type. When specifying an 
+image, either use full path from class loader root (with '/' as the segment separator) or just the image file name
+if the image is located in the same package as the annotated type.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">The following declarations are equivalent.</p>
+
+<pre class="source-code"><code><font color="#888888">package org.eclipse.sapphire.samples.contacts;
+
+...</font>
+
+@Image( path = "Contact.png" )
+<font color="#888888">@GenerateImpl
+
+public interface IContact extends IModelElement
+{
+    ...
+}</font></code></pre>
+
+<pre class="source-code"><code><font color="#888888">package org.eclipse.sapphire.samples.contacts;
+
+...</font>
+
+@Image( path = "org/eclipse/sapphire/samples/contacts/Contact.png" )
+<font color="#888888">@GenerateImpl
+
+public interface IContact extends IModelElement
+{
+    ...
+}</font></code></pre>
+
+<p>The API for model element image provider has been changed to unify it with the model element services
+API and to support notification of image changes.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">This following code is taken from the calendar sample. The event attendee
+image varies based on whether or not attendee is found in the contacts directory.</p>
+
+<pre class="source-code"><code>@Image( path = "org/eclipse/sapphire/samples/contacts/Contact.png" )
+@Service( impl = AttendeeImageService.class )
+
+public interface IAttendee extends IModelElement
+{
+    ...
+}
+
+...
+
+public class AttendeeImageService extends ImageService
+{
+    private static final ImageData IMG_PERSON 
+        = ImageData.readFromClassLoader( IContact.class, "Contact.png" );
+
+    private static final ImageData IMG_PERSON_FADED 
+        = ImageData.readFromClassLoader( IContact.class, "ContactFaded.png" );
+
+    private ModelPropertyListener listener;
+
+    @Override
+    public void init( IModelElement element, String[] params )
+    {
+        super.init( element, params );
+
+        this.listener = new ModelPropertyListener()
+        {
+            @Override
+            public void handlePropertyChangedEvent( final ModelPropertyChangeEvent event )
+            {
+                notifyListeners( new ImageChangedEvent( AttendeeImageProviderService.this ) );
+            }
+        };
+
+        element.addListener( this.listener, IAttendee.PROP_IN_CONTACTS_DATABASE.getName() );
+    }
+
+    @Override
+    public ImageData provide()
+    {
+        if( ( (IAttendee) element() ).isInContactsDatabase().getContent() )
+        {
+            return IMG_PERSON;
+        }
+        else
+        {
+            return IMG_PERSON_FADED;
+        }
+    }
+
+    @Override
+    public void dispose()
+    {
+        super.dispose();
+        element().removeListener( this.listener, IAttendee.PROP_IN_CONTACTS_DATABASE.getName() );
+    }
+}</code></pre>
+
+<p>Use @Image annotation on enumeration items. The images will be shown where appropriate, such when a
+list of enumeration values is presented using a checkbox list.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>public enum DispatcherEvent
+{
+    @Label( standard = "forward" )
+    @Image( path = "CircleBlue.png" )
+
+    FORWARD,
+
+    @Label( standard = "include" )
+    @Image( path = "CircleCyan.png" )
+
+    INCLUDE,
+
+    @Label( standard = "request" )
+    @Image( path = "CircleGreen.png" )
+
+    REQUEST,
+
+    @Label( standard = "error" )
+    @Image( path = "CircleRed.png" )
+
+    ERROR
+}
+
+public interface IDispatcherEventRef extends IModelElement
+{
+    ModelElementType TYPE = new ModelElementType( IDispatcherEventRef.class );
+
+    // *** DispatcherEvent ***
+
+    @Type( base = DispatcherEvent.class )
+    @Required
+    @NoDuplicates
+
+    ValueProperty PROP_DISPATCHER_EVENT = new ValueProperty( TYPE, "DispatcherEvent" );
+
+    Value&lt;DispatcherEvent> getDispatcherEvent();
+    void setDispatcherEvent( String value );
+    void setDispatcherEvent( DispatcherEvent value );
+}
+
+public interface IFilterMapping extends IModelElement
+{
+    ModelElementType TYPE = new ModelElementType( IFilterMapping .class );
+
+    // *** DispatcherEvents ***
+
+    @Type( base = IDispatcherEventRef.class )
+
+    ListProperty PROP_DISPATCHER_EVENTS = new ListProperty( TYPE, "DispatcherEvents" );
+
+    ModelElementList&lt;IDispatcherEventRef> getDispatcherEvents();
+
+    ...
+
+}</code></pre>
+
+<p style="margin-left: 20px;"><img src="images/checkbox-list-with-images.png"/></p>
+
+<h2><a name="value-label-image-services">Value Label and Image Services</a></h2>
+
+<p>Provide custom labels and images for values. These will be used where possible when presenting the
+value to the user. Some examples include list property editor, checkbox list property editor, slush bucket 
+property editor and possible values browse dialog.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>public class ColorValueLabelService extends ValueLabelService
+{
+    @Override
+    public String provide( String value )
+    {
+        if( value != null )
+        {
+            if( value.equals( "red" ) )
+            {
+                return "Red [FF0000]";
+            }
+            else if( value.equals( "orange" ) )
+            {
+                return "Orange [FF8A00]";
+            }
+            else if( value.equals( "yellow" ) )
+            {
+                return "Yellow [FFF200]";
+            }
+            else if( value.equals( "green" ) )
+            {
+                return "Green [00BC00]";
+            }
+            else if( value.equals( "blue" ) )
+            {
+                return "Blue [0000FF]";
+            }
+            else if( value.equals( "violet" ) )
+            {
+                return "Violet [8A00FF]";
+            }
+        }
+
+        return value;
+    }
+}
+
+public class ColorValueImageService extends ValueImageService
+{
+    private final Map&lt;String,ImageData> images = new HashMap&lt;String,ImageData>();
+
+    @Override
+    public ImageData provide( String value )
+    {
+        ImageData image = this.images.get( value );
+
+        if( image == null )
+        {
+            String imageResourceName = null;
+
+            if( value != null )
+            {
+                if( value.equals( "red" ) )
+                {
+                    imageResourceName = "SquareRed.png";
+                }
+                else if( value.equals( "orange" ) )
+                {
+                    imageResourceName = "SquareOrange.png";
+                }
+                else if( value.equals( "yellow" ) )
+                {
+                    imageResourceName = "SquareYellow.png";
+                }
+                else if( value.equals( "green" ) )
+                {
+                    imageResourceName = "SquareGreen.png";
+                }
+                else if( value.equals( "blue" ) )
+                {
+                    imageResourceName = "SquareBlue.png";
+                }
+                else if( value.equals( "violet" ) )
+                {
+                    imageResourceName = "SquareViolet.png";
+                }
+            }
+
+            if( imageResourceName != null )
+            {
+                final String imageResourcePath = "org/eclipse/sapphire/samples/" + imageResourceName;
+                image = readFromClassLoader( ColorValueImageService.class, imageResourcePath );
+            }
+        }
+
+        return image;
+    }
+}
+
+public interface IColor extends IModelElement
+{
+    ModelElementType TYPE = new ModelElementType( IColor.class );
+
+    // *** Code ***
+
+    @Label( standard = "color code" )
+    @NoDuplicates
+    @PossibleValues( values = { "red", "orange", "yellow", "green", "blue", "violet" }, invalidValueMessage = "{0} is not a valid color." )
+    @Services( { @Service( impl = ColorValueLabelService.class ), @Service( impl = ColorValueImageService.class ) } )
+
+    ValueProperty PROP_CODE = new ValueProperty( TYPE, "Code" );
+
+    Value&lt;String> getCode();
+    void setCode( String value );
+}
+
+public interface ICustomModel extends IModelElement
+{
+    ...
+
+    // *** Colors ***
+
+    @Type( base = IColor.class )
+    @Label( standard = "colors" )
+
+    ListProperty PROP_COLORS = new ListProperty( TYPE, "Colors" );
+
+    ModelElementList&lt;IColor> getColors();
+}</code></pre>
+
+<p style="margin-left: 20px;"><img src="images/checkbox-list-with-images.png"/></p>
+
+<h2><a name="required-annotation">Required Annotation</a></h2>
+
+<p>Use @Required (formerly @NonNullValue) on both value properties and element properties. If a required property
+is not set, a validation error will be shown.</p>
+
+<p style="margin-left: 20px;"><b>Examples</b></p>
+
+<pre class="source-code"><code>@Required
+
+ValueProperty PROP_NAME = new ValueProperty( TYPE, "Name" );
+
+Value&lt;String> getName();
+void setName( String name );</code></pre>
+
+<pre class="source-code"><code>@Type( base = IOccupation.class, possible = { IJobOccupation.class, IStudentOccupation.class, IHomemakerOccupation.class } )
+@Required
+
+ElementProperty PROP_PRIMARY_OCCUPATION = new ElementProperty( TYPE, "PrimaryOccupation" );
+
+ModelElementHandle&lt;IOccupation> getPrimaryOccupation();</code></pre>
+
+<h2><a name="whitespace-handling">Whitespace Handling and Value Normalization</a></h2>
+
+<p>Use the new @Whitespace annotation on value properties to control exactly how whitespace 
+in property values is normalized. By default, leading and trailing whitespace is removed.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">Preserve all whitespace, including leading and trailing.</p>
+
+<pre class="source-code"><code>@Whitespace( trim = false )
+
+ValueProperty PROP_TEXT = new ValueProperty( TYPE, "Text" );
+
+Value&lt;String> getText();
+void setName( String value );</code></pre>
+
+<p style="margin-left: 20px;">Remove leading and trailing whitespace. Further, replace all sequences
+of one or more whitespace characters with a single space character.</p>
+
+<pre class="source-code"><code>@Whitespace( trim = true, collapse = true )
+
+ValueProperty PROP_TEXT = new ValueProperty( TYPE, "Text" );
+
+Value&lt;String> getText();
+void setName( String value );</code></pre>
+
+<p>Implement custom value normalization via ValueNormalizationService.</p> 
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>@Service( impl = CustomValueNormalizationService.class )
+
+ValueProperty PROP_TEXT = new ValueProperty( TYPE, "Text" );
+
+Value&lt;String> getText();
+void setName( String value );</code></pre>
+
+<pre class="source-code"><code>public class CustomValueNormalizationService extends ValueNormalizationService
+{
+    public String normalize( String str )
+    {
+        ...
+    }
+}</code></pre>
+
+<p>Extend StandardValueNormalizationService to add custom normalization logic to what is provided by the system.</p> 
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>@Whitespace( trim = true, collapse = true )
+@Service( impl = CustomValueNormalizationService.class )
+
+ValueProperty PROP_TEXT = new ValueProperty( TYPE, "Text" );
+
+Value&lt;String> getText();
+void setName( String value );</code></pre>
+
+<pre class="source-code"><code>public class CustomValueNormalizationService extends StandardValueNormalizationService
+{
+    public String normalize( String str )
+    {
+        str = super.normalize( str );
+
+        ...
+    }
+}</code></pre>
+
+<h2><a name="clear-on-disable">Clear Property on Disable</a></h2>
+
+<p>Use the new @ClearOnDisable annotation to specify that the property value should be cleared when the
+property transitions from enabled to disabled state. This can be useful for pruning unnecessary data from the
+model and persistent storage, but can make it more difficult for users to return to the prior state as data is erased.</p> 
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>@Type( base = Integer.class )
+@Enablement( expr = "${ ShapeType IN List( 'CIRCLE', 'PENTAGON', 'HEXAGON', 'HEPTAGON', 'OCTAGON' ) }" )
+@ClearOnDisable
+
+ValueProperty PROP_RADIUS = new ValueProperty( TYPE, "Radius" );
+
+Value&lt;Integer> getRadius();
+void setRadius( String value );
+void setRadius( Integer value );</code></pre>
+
+<p><b>WARNING:</b> Avoid using the @ClearOnDisable annotation with expressions that are not atomic in evaluation
+as the property enablement can briefly go through <nobr>true->false->true</nobr> sequence causing inappropriate property clearing.</p>
+
+<p>Consider the following two enablement expressions:</p>
+
+<pre class="source-code"><code>${ ShapeType IN List( 'TRIANGLE', 'RECTANGLE', 'SQUARE' ) }
+${ ShapeType == 'TRIANGLE' || ShapeType == 'RECTANGLE' || ShapeType == 'SQUARE' }</code></pre>
+
+<p>While these two expressions are semantically equivalent, when ShapeType changes, the first expression is re-evaluates 
+once while the second expressions is re-evaluated three times. Depending on the starting and ending value of ShapeType,
+the enablement state can briefly go through <nobr>true->false->true</nobr> sequence. Normally, this is not an issue and would not
+be observable, but @ClearOnDisable feature is specifically designed to trigger clearing on enablement's <nobr>true->false</nobr> 
+transition.</p> 
+
+<h2><a name="java-base-type">More Control Over Java Type Constraint Required Base Type</a></h2>
+
+<p>When specifying @JavaTypeConstraint, one can list zero or more base types that the type must extend or implement. Prior to 0.3
+release, the semantics were always such that the type must extend or implement all of the specified types. This is still the
+default behavior, but you can now override it to specify that the type only need to extend or implement one of the specified types.</p>
+
+<pre class="source-code"><code><font color="#888888">@Type( base = JavaTypeName.class )
+@Reference( target = JavaType.class )
+@JavaTypeConstraint( kind = JavaTypeKind.CLASS, type = { "java.util.List", "java.util.Map" }</font>, behavior = JavaTypeConstraintBehavior.AT_LEAST_ONE <font color="#888888">)
+@MustExist
+@Required
+
+ValueProperty PROP_CLASS = new ValueProperty( TYPE, "Class" );
+
+ReferenceValue&lt;JavaTypeName,JavaType> getClass();
+void setClass( String value );
+void setClass( JavaTypeName value );</font></code></pre> 
+
+<h2><a name="html">HTML Content Presentation</a></h2>
+
+<p>It is hard to beat the simplicity and flexibility of HTML for presenting formatted
+text content. Now it is even easier to weave in a bit of HTML into a Sapphire UI. The new
+HTML part can display static HTML content embedded in an sdef file, content retrieved
+from a URL or content retrieved from the model.</p>
+
+<p>Frequently, it is easier to specify HTML content in the form of a fragment rather than a
+finished document. Sapphire will automatically turn a fragment into a legal document and apply
+default style that is designed to match the look of surrounding UI elements.</p>
+
+<pre class="source-code"><code>&lt;html>
+  &lt;fragment>true&lt;/fragment>
+  &lt;content>
+    Here is the list of ${ Name }'s favorite colors:&amp;lt;br/>&amp;lt;br/>
+    &amp;lt;ol>
+      &amp;lt;li>Red&amp;lt;/li>
+      &amp;lt;li>Orange&amp;lt;/li>
+      &amp;lt;li>Blue&amp;lt;/li>
+    &amp;lt;/ol>
+  &lt;/content>
+&lt;/html></code></pre>
+
+<p>Note how HTML tags have to be escaped in order to not be treated as part of the XML
+markup of the sdef file. Also note that you are able to use expressions in the body of the
+content to enhance the content with data from the model or external sources.</p>
+
+<h2><a name="related-content">Related Content</a></h2>
+
+<p>It is now possible to put related content to the right of a property
+editor.</p> 
+
+<p>The space for related content is carved out from the space reserved for
+the main property editor. As such, it is bound by the height of that property editor, but
+multiple parts can be added to related content as long as vertical space allows. This
+can happen if the main property editor is a table or a multi-line text box.</p>
+
+<p>Horizontal space between the main property editor and related content is divided by 
+an adjustable splitter. You get to set the initial width allocation for the related 
+content in the sdef file. The default is 40, which stands for 40% of available space.</p>  
+
+<p>Use related content to display two property editors on one line. This pattern is especially
+powerful when the relationship of two properties is such that a single label will suffice.</p>
+
+<p style="margin-left: 20px;"><img src="images/related-content-1.png"/></p>
+
+<p>Display more than two parts on one line by nesting related content inside related content. 
+Use sparingly.</p>
+
+<p style="margin-left: 20px;"><img src="images/related-content-2.png"/></p>
+
+<p>Related content isn't limited to property editors. Any part can be placed into related
+content. This is particularly useful when the main property editor spans more than one
+vertical line, such as a list property editor or a multi-line text box. In this example,
+related content is used to display explanatory text.</p>
+
+<p style="margin-left: 20px;"><img src="images/related-content-3.png"/></p>
+
+<p>Multiple parts can be placed into related content. They will be arranged vertically.</p>
+
+<p style="margin-left: 20px;"><img src="images/related-content-4.png"/></p>
+
+<h2><a name="action-label-el">Expressions in Action Labels</a></h2>
+
+<p>Labels for actions and action handlers can now be specified using expressions. This is currently
+mostly useful for action labels, where you can reference active handlers while composing the label.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">This following is the actual label definition for the Sapphire.Add action. It is designed to include
+handler label in the action label when there is only one handler.</p>
+
+<pre class="source-code"><code>${ Handlers.Size == 1 ? Concat( "add ", Handlers[ 0 ].Label ) : "add" }</code></pre>
+
+<h2><a name="checkbox-layouts">Checkbox Layouts</a></h2>
+
+<p>More control over the presentation of the boolean property is possible with the new "checkbox.layout"
+property editor hint. The various values for this hint are explained in this screen capture from
+the gallery sample:</p>
+
+<p style="margin-left: 20px;"><img src="images/checkbox.png"/></p>
+
+<h2><a name="properties-view">Properties View</a></h2>
+
+<p>You can now easily contribute content to the properties view based on the current context in a Sapphire
+form or diagram editor page. The following contexts can currently host properties view content:</p>
+
+<ul>
+  <li>Diagram Editor Page</li>
+  <li>Diagram Node</li>
+  <li>Diagram Connection</li>
+  <li>Master Details Content Outline Node</li>
+</ul>
+
+<p>Multiple pages of content can be defined for the properties view. The pages are accessible via tabs on
+the left side of the properties view. The content of properties view pages is defined and rendered by Sapphire.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this screen capture, the architecture sample is shown with focus on one
+of the components. The details of the component are shown in the properties view.</p>
+
+<p style="margin-left: 20px;"><img src="images/properties-view-1.png"/></p>
+
+<p>If no content is contributed to the properties view for a given context,
+the view will state as much.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;"><img src="images/properties-view-2.png"/></p>
+
+<p>You can also specify an image to be used for a content page. This not only makes it easier for users to
+visually differentiate pages, but the system will also add a problem badge if any of the page's
+content has validation problems.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;"><img src="images/properties-view-3.png"/></p>
+
+<p>Define the properties view contribution right in the sdef file as part of the definition of the
+context part.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;node>
+    ...</font>
+    &lt;properties-view>
+        &lt;page>
+            &lt;label>general&lt;/label>
+            &lt;content>
+                &lt;property-editor>Name&lt;/property-editor>
+                &lt;property-editor>Description&lt;/property-editor>
+            &lt;/content>
+        &lt;/page>
+        &lt;page>
+            &lt;label>dependencies&lt;/label>
+            &lt;image>Dependencies.png&lt;/image>
+            &lt;content>
+                &lt;property-editor>Dependencies&lt;/property-editor>
+            &lt;/content>
+        &lt;/page>
+    &lt;/properties-view>
+<font color="#888888">&lt;/node></font></code></pre>
+
+<h2><a name="image-el">Image Expressions</a></h2>
+
+<p>Use expressions to specify images for content outline nodes and other parts. This allows the image
+to vary based on a condition, such as a property value.</p>
+
+<P>When specifying an image in an expression, either use full path from class loader root (with '/' as the segment separator) or
+import the package where the image is located.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example from the architecture sample, parent node image is defined
+statically, while child node image varies based on the number dependencies.<p>
+
+<pre class="source-code"><code>&lt;import>
+    &lt;package>org.eclipse.sapphire.samples.architecture&lt;/package>
+&lt;/import>
+
+<font color="#888888">...
+
+&lt;node>
+    &lt;label>components&lt;/label></font>
+    &lt;image>Components.png&lt;/image>
+    <font color="#888888">&lt;node-list>
+        &lt;property>Components&lt;/property>
+        &lt;node-template>
+            &lt;model-element-type>IComponent&lt;/model-element-type>
+            &lt;label>${ Name == null ? "&amp;lt;component&amp;gt;" : Name }&lt;/label></font>
+            &lt;image>${ Dependencies.Size == 0 ? "ComponentLeaf.png" : "Component.png" }&lt;/image>
+            <font color="#888888">...
+        &lt;/node-template>
+    &lt;/node-list>
+    ...
+&lt;/node></font></code></pre>
+
+<h2><a name="ancestor-access">Ancestor Access</a></h2>
+
+<p>Use ancestor access path syntax (leading "/" for root and ".." for parent) when specifying a property
+editor or using the with directive. The path used in a property editor definition must end with a property name,
+while the path used in a with directive can end with an element or an element property name.</p>
+
+<p style="margin-left: 20px;"><b>Examples</b></p>
+
+<p style="margin-left: 20px;">Edit property Text of the context element.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>Text<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<p style="margin-left: 20px;">Edit property Text of the parent of the context element.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>../Text<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<p style="margin-left: 20px;">Edit property Text of the grandparent of the context element.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>../../Text<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<p style="margin-left: 20px;">Edit property Text of the root element.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>/Text<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<p style="margin-left: 20px;">Shift context to the element held by Child property.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;with>
+    &lt;path></font>Child<font color="#888888">&lt;/path>
+    &lt;default-panel>
+        &lt;content>
+            ...
+        &lt;/content>
+    &lt;/default-panel>
+&lt;/with></font></code></pre>
+
+<p style="margin-left: 20px;">Shift context to the parent element.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;with>
+    &lt;path></font>..<font color="#888888">&lt;/path>
+    &lt;default-panel>
+        &lt;content>
+            ...
+        &lt;/content>
+    &lt;/default-panel>
+&lt;/with></font></code></pre>
+
+<p style="margin-left: 20px;">Shift context to the grandparent element.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;with>
+    &lt;path></font>../..<font color="#888888">&lt;/path>
+    &lt;default-panel>
+        &lt;content>
+            ...
+        &lt;/content>
+    &lt;/default-panel>
+&lt;/with></font></code></pre>
+
+<h2><a name="with">Improved With Directive Presentation</a></h2>
+
+<p>The presentation of the with directive has been enhanced to better support the case where an element
+property has a large number of possible types. The presentation will now use a drop down list instead of
+radio buttons if there are more than three possible types. You can also use the new style hint to suggest
+the desired presentation.</p>
+
+<p>The new hint name is "style" and it has three possible values for the with directive: "checkbox", "radio.buttons"
+and "drop.down.list". If a particular style is not appropriate for the situation, the hint will be ignored. For
+instance, selecting "checkbox" style for an element property with more than one possible type is not valid.</p>
+
+<p style="margin-left: 20px;"><b>Examples</b></p>
+
+<p style="margin-left: 20px;">Default presentation when the element property has one possible type.</p>
+
+<p style="margin-left: 20px;"><img src="images/with-1.png"/></p>
+
+<p style="margin-left: 20px;">The same property as above, but with style hint set to "radio.buttons".</p>
+
+<p style="margin-left: 20px;"><img src="images/with-2.png"/></p>
+
+<p style="margin-left: 20px;">Default presentation when the element property has three possible types.</p>
+
+<p style="margin-left: 20px;"><img src="images/with-3.png"/></p>
+
+<p style="margin-left: 20px;">The same property as above, but with style hint set to "drop.down.list".</p>
+
+<p style="margin-left: 20px;"><img src="images/with-4.png"/></p>
+
+<h2><a name="master-details-element-properties">Element Properties in Master Details Content Outline</a></h2>
+
+<p>The master details editor page has been made more flexible by allowing nodes in the content outline based
+on element properties. The syntax and semantics are identical to how list properties are handled.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>&lt;node-factory>
+    &lt;property>Heterogeneous&lt;/property>
+    &lt;case>
+        &lt;model-element-type>IChildElementWithInteger&lt;/model-element-type>
+        &lt;label>${ StringValue == null ? "&amp;lt;child-with-integer&amp;gt;" : StringValue }&lt;/label>
+        &lt;section>
+            &lt;label>child element with integer&lt;/label>
+            &lt;content>
+                &lt;property-editor>StringValue&lt;/property-editor>
+                &lt;property-editor>IntegerValue&lt;/property-editor>
+            &lt;/content>
+        &lt;/section>
+    &lt;/case>
+    &lt;case>
+        &lt;model-element-type>IChildElementWithEnum&lt;/model-element-type>
+        &lt;label>${ StringValue == null ? "&amp;lt;child-with-enum&amp;gt;" : StringValue }&lt;/label>
+        &lt;section>
+            &lt;label>child element with enum&lt;/label>
+            &lt;content>
+                &lt;property-editor>StringValue&lt;/property-editor>
+                &lt;property-editor>EnumValue&lt;/property-editor>
+            &lt;/content>
+        &lt;/section>
+    &lt;/case>
+    &lt;case>
+        &lt;model-element-type>IChildElement&lt;/model-element-type>
+        &lt;label>${ StringValue == null ? "&amp;lt;child&amp;gt;" : StringValue }&lt;/label>
+        &lt;section>
+            &lt;label>child element&lt;/label>
+            &lt;content>
+                &lt;property-editor>StringValue&lt;/property-editor>
+            &lt;/content>
+        &lt;/section>
+    &lt;/case>
+&lt;/node-factory></code></pre>
+
+<h2><a name="action-style-hint">Action Style Hint</a></h2>
+
+<p>Use action style hint to control how actions are presented. The style hint will be respected if feasible.</p>
+
+<table>
+<tr><td>image</td><td>Only image is presented.</td></tr>
+<tr><td>image+text</td><td>Text will be presented to the right of the image.</td></tr>
+<tr><td>text</td><td>Only text is presented.</td></tr>
+</table>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">The following example is taken from the gallery sample.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;action&gt;
+    &lt;id&gt;Sapphire.Gallery.Open.Homepage&lt;/id&gt;
+    &lt;label&gt;Sapphire Homepage&lt;/label&gt;
+    &lt;image&gt;Web.png&lt;/image&gt;
+    &lt;description&gt;Open Sapphire project homepage&lt;/description&gt;
+    &lt;context&gt;Sapphire.EditorPage&lt;/context&gt;</font>
+    &lt;hint&gt;
+        &lt;name>style&lt;/name&gt;
+        &lt;value>image+text&lt;/value&gt;
+    &lt;/hint&gt;
+<font color="#888888">&lt;/action&gt;</font></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/action-style.png"/></p>
+
+<h2><a name="page-header-image">Page Header Image</a></h2>
+
+<p>Specify an image to appear on the left side of the editor page header.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">The following example is taken from the gallery sample.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;editor-page>
+    ...</font>
+    &lt;page-header-image>SapphireFile.png&lt;/page-header-image>
+    <font color="#888888">...
+&lt;/editor-page></font></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/page-header-image.png"/></p>
+
+<h2><a name="checkbox-list-for-enum">Checkbox List as Default Enum List Presentation</a></h2>
+
+<p>The checkbox list property editor is now the default presentation for enum lists. An enum list
+is defined as follows:</p>
+
+<ol>
+  <li>A list property with exactly one possible child element type.</li>
+  <li>The child element type has exactly one property and it is a value property.</li>
+  <li>The value property is of enum type and has @NoDuplicates annotation.</li>
+</ol>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>public enum DispatcherEvent
+{
+    FORWARD,
+    INCLUDE,
+    REQUEST,
+    ERROR
+}
+
+public interface IDispatcherEventRef extends IModelElement
+{
+    ModelElementType TYPE = new ModelElementType( IDispatcherEventRef.class );
+
+    // *** DispatcherEvent ***
+
+    @Type( base = DispatcherEvent.class )
+    @Required
+    @NoDuplicates
+
+    ValueProperty PROP_DISPATCHER_EVENT = new ValueProperty( TYPE, "DispatcherEvent" );
+
+    Value&lt;DispatcherEvent> getDispatcherEvent();
+    void setDispatcherEvent( String value );
+    void setDispatcherEvent( DispatcherEvent value );
+}
+
+public interface IFilterMapping extends IModelElement
+{
+    ModelElementType TYPE = new ModelElementType( IFilterMapping .class );
+
+    // *** DispatcherEvents ***
+
+    @Type( base = IDispatcherEventRef.class )
+
+    ListProperty PROP_DISPATCHER_EVENTS = new ListProperty( TYPE, "DispatcherEvents" );
+
+    ModelElementList&lt;IDispatcherEventRef> getDispatcherEvents();
+
+    ...
+
+}</code></pre>
+
+<p style="margin-left: 20px;"><img src="images/checkbox-list-with-no-images.png"/></p>
+
+<h2><a name="collapsible-sections">Collapsible Sections</a></h2>
+
+<p>Define collapsible sections. This is one approach for handling too much content to fit on the 
+screen. Another, typically more effective, approach is to break up content between more nodes in 
+the content outline. A collapsible section can be defined to be showed initially in the collapsed
+state. This can be effective for very infrequently used content.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">&lt;section>
+    &lt;label>collapsible section&lt;/label>
+    &lt;content>
+        &lt;label>A section can be collapsible... [snip]&lt;/label>
+        &lt;spacer>&lt;/spacer>
+        &lt;property-editor>Text&lt;/property-editor>
+        &lt;property-editor>ThreeChoiceAnswer&lt;/property-editor>
+    &lt;/content></font>
+    &lt;collapsible>true&lt;/collapsible>
+<font color="#888888">&lt;/section>
+&lt;section>
+    &lt;label>collapsed initially section&lt;/label>
+    &lt;content>
+        &lt;label>A collapsible section can be specified to be showed collapsed initially.&lt;/label>
+        &lt;spacer>&lt;/spacer>
+        &lt;property-editor>Text&lt;/property-editor>
+        &lt;property-editor>ThreeChoiceAnswer&lt;/property-editor>
+    &lt;/content></font>
+    &lt;collapsible>true&lt;/collapsible>
+    &lt;collapsed-initially>true&lt;/collapsed-initially>
+<font color="#888888">&lt;/section></font></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/collapsible-sections.png"/></p>
+
+<div class="copyright">Copyright (c) 2015 Oracle and Liferay<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.3/images/action-style.png b/releases/8.2.4/documentation/releases/0.3/images/action-style.png
new file mode 100644
index 0000000..390505d
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/action-style.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/checkbox-list-with-images.png b/releases/8.2.4/documentation/releases/0.3/images/checkbox-list-with-images.png
new file mode 100644
index 0000000..415f6da
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/checkbox-list-with-images.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/checkbox-list-with-no-images.png b/releases/8.2.4/documentation/releases/0.3/images/checkbox-list-with-no-images.png
new file mode 100644
index 0000000..6c8c182
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/checkbox-list-with-no-images.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/checkbox.png b/releases/8.2.4/documentation/releases/0.3/images/checkbox.png
new file mode 100644
index 0000000..12c6e5d
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/checkbox.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/collapsible-sections.png b/releases/8.2.4/documentation/releases/0.3/images/collapsible-sections.png
new file mode 100644
index 0000000..b618d31
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/collapsible-sections.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/page-header-image.png b/releases/8.2.4/documentation/releases/0.3/images/page-header-image.png
new file mode 100644
index 0000000..af6019e
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/page-header-image.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/properties-view-1.png b/releases/8.2.4/documentation/releases/0.3/images/properties-view-1.png
new file mode 100644
index 0000000..2dfecec
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/properties-view-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/properties-view-2.png b/releases/8.2.4/documentation/releases/0.3/images/properties-view-2.png
new file mode 100644
index 0000000..74cb668
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/properties-view-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/properties-view-3.png b/releases/8.2.4/documentation/releases/0.3/images/properties-view-3.png
new file mode 100644
index 0000000..b9d4150
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/properties-view-3.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/related-content-1.png b/releases/8.2.4/documentation/releases/0.3/images/related-content-1.png
new file mode 100644
index 0000000..cafb3fd
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/related-content-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/related-content-2.png b/releases/8.2.4/documentation/releases/0.3/images/related-content-2.png
new file mode 100644
index 0000000..533cc4b
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/related-content-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/related-content-3.png b/releases/8.2.4/documentation/releases/0.3/images/related-content-3.png
new file mode 100644
index 0000000..3e8d2ce
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/related-content-3.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/related-content-4.png b/releases/8.2.4/documentation/releases/0.3/images/related-content-4.png
new file mode 100644
index 0000000..fd49974
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/related-content-4.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/with-1.png b/releases/8.2.4/documentation/releases/0.3/images/with-1.png
new file mode 100644
index 0000000..3e220d0
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/with-1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/with-2.png b/releases/8.2.4/documentation/releases/0.3/images/with-2.png
new file mode 100644
index 0000000..c7f4e9e
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/with-2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/with-3.png b/releases/8.2.4/documentation/releases/0.3/images/with-3.png
new file mode 100644
index 0000000..0e8a61f
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/with-3.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/images/with-4.png b/releases/8.2.4/documentation/releases/0.3/images/with-4.png
new file mode 100644
index 0000000..ab63d01
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/images/with-4.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.3/index.html b/releases/8.2.4/documentation/releases/0.3/index.html
new file mode 100644
index 0000000..3c3c7da
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/index.html
@@ -0,0 +1,45 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Sapphire 0.3</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a></div>
+
+
+<h1>Sapphire 0.3</h1>
+
+<ul>
+  <li><a href="enhancements.html">Enhancements</a></li>
+  <li><a href="migration.html">Migration Guide</a></li>
+</ul>
+
+<br/><br/>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.3/migration.html b/releases/8.2.4/documentation/releases/0.3/migration.html
new file mode 100644
index 0000000..032f42f
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.3/migration.html
@@ -0,0 +1,1387 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Migration Guide for Sapphire 0.3</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+  <style type="text/css">
+    pre.source-code 
+    {
+      font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; 
+      color: #000000;
+      background-color: #ffffff;
+      font-size: 12px;
+      border: 0px;
+      line-height: 14px;
+      padding: 5px;
+      margin-left: 0px;
+      margin-right: 0px;
+      overflow: auto
+    }
+  </style>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a> > <a href="index.html">0&#46;3</a></div>
+
+
+<h1>Migration Guide for Sapphire 0.3</h1>
+
+<p>This documents covers changes that need to be made by Sapphire adopters as part of migrating 
+to Sapphire 0.3 from a prior release. Only changes from the previous major release are covered.</p>
+
+<p>Table of Contents</p>
+
+<ol>
+  <li><a href="#modularity">Modularity Changes</a></li>
+  <li><a href="#ref">ReferenceValue Changes</a></li>
+  <li><a href="#services">Services</a></li>
+  <li><a href="#validation">Validation</a></li>
+  <li><a href="#enablement">Enablement</a></li>
+  <li><a href="#whitespace">Whitespace Handling</a></li>
+  <li><a href="#java">Java Support</a></li>
+  <li><a href="#html">HTML Content Presentation</a></li>
+  <li><a href="#related-content">Related Content</a></li>
+  <li><a href="#composite-ref">Composite Reference</a></li>
+  <li><a href="#section-description">Section Description</a></li>
+  <li><a href="#function">Function Name Method</a></li>
+  <li><a href="#with">With Directive</a></li>
+  <li><a href="#element-image">Model Element Image</a></li>
+  <li><a href="#required-annotation">Required Annotation</a></li>
+  <li><a href="#master-details-content-node-factory">Master Details Content Node Factory</a></li>
+  <li><a href="#jump-action-handle">Jump Action Handler</a></li>
+  <li><a href="#show-in-source">Show In Source Action</a></li>
+</ol>
+
+<h2><a name="modularity">Modularity Changes</a></h2>
+
+<p>The contents of some bundles have changes and several new bundles have been created. These changes
+may require adopters to modify Requite-Bundle declarations and import statements.</p>
+
+<table>
+  <tr>
+    <th>Old Bundle</th>
+    <th>Old Classes</th>
+    <th>New Bundle</th>
+    <th>New Classes</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.modeling</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.modeling.xml.*<br/>org.eclipse.sapphire.modeling.xml.annotations.*<br/>org.eclipse.sapphire.modeling.xml.schema.*</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.modeling.xml</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>unchanged</code></pre>
+    </td>
+  </tr>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.modeling</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.modeling.java.*</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.java</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.java.*</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.modeling</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.modeling.WorkspaceFileResourceStore</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.workspace</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.workspace.WorkspaceFileResourceStore</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.modeling</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.modeling.annotations.EclipseWorkspacePath</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.workspace</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.workspace.WorkspaceRelativePath</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.ui</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.ui.xml.*</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.ui.swt.xml.editor</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>org.eclipse.sapphire.ui.swt.xml.editor.*</code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>The core dependency on IStatus, IPath and IProgressMonitor types from org.eclipse.core.runtime bundle
+has been eliminated. These classes have been replaced with Status, Path and ProgressMonitor classes in
+org.eclipse.sapphire.modeling bundle. StatusBridge, PathBridge and ProgressMonitorBridge classes are available
+in org.eclipse.sapphire.platform bundle when back-n-forth conversion is necessary.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomValidationService extends ModelPropertyValidationService&lt;Value&lt;String>> 
+{
+    public</font> IStatus <font color="#888888">validate() 
+    {
+        if( ... )
+        {
+            return</font> createErrorStatus( Resources.errorMessage );
+        <font color="#888888">}
+
+        return</font> Status.OK_STATUS;
+    <font color="#888888">}
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomValidationService extends ModelPropertyValidationService&lt;Value&lt;String>> 
+{
+    public</font> Status <font color="#888888">validate() 
+    {
+        if( ... )
+        {
+            return</font> Status.createErrorStatus( Resources.errorMessage );
+        <font color="#888888">}
+
+        return</font> Status.createOkStatus();
+    <font color="#888888">}
+}</font></code></pre>
+
+<p>When necessary, use StatusBridge class from org.eclipse.sapphire.platform bundle to convert back-n-forth between Sapphire's Status object and
+Eclipse's IStatus object.</p> 
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><font color="#888888">@PossibleValues( service = CustomPossibleValuesService.class, invalidValueSeverity = </font>IStatus.OK <font color="#888888">)</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><font color="#888888">@PossibleValues( service = CustomPossibleValuesService.class, invalidValueSeverity = </font>Status.Severity.OK <font color="#888888">)</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomPossibleValuesService extends PossibleValuesService
+{
+    ...
+
+    public</font> int <font color="#888888">getInvalidValueSeverity( String value ) 
+    {
+        if( ... )
+        {
+            return</font> IStatus.ERROR<font color="#888888">;
+        }
+        else if( ... )
+        {
+            return</font> IStatus.WARNING<font color="#888888">;
+        }
+
+        return</font> IStatus.OK<font color="#888888">;
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomPossibleValuesService extends PossibleValuesService
+{
+    ...
+
+    public</font> Status.Severity <font color="#888888">getInvalidValueSeverity( String value ) 
+    {
+        if( ... )
+        {
+            return</font> Status.Severity.ERROR<font color="#888888">;
+        }
+        else if( ... )
+        {
+            return</font> Status.Severity.WARNING<font color="#888888">;
+        }
+
+        return</font> Status.Severity.OK<font color="#888888">;
+    }
+}</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><font color="#888888">@Type( base =</font> IPath<font color="#888888">.class )
+@Required
+@MustExist
+@WorkspaceRelativePath
+@ValidFileSystemResourceType( FileSystemResourceType.FILE )
+@ValidFileExtensions( "xml" )
+
+ValueProperty PROP_LOCATION = new ValueProperty( TYPE, "Location" );
+
+Value&lt;</font>IPath<font color="#888888">&gt; getLocation();
+void setLocation( String location );
+void setLocation( </font>IPath<font color="#888888"> location );</font></code></pre>
+
+<p>These migration sites will not be obvious via problems at compile times. Search for "Value&lt;IPath&gt;".</p>
+    </td>
+    <td>
+<pre class="source-code"><font color="#888888">@Type( base =</font> Path<font color="#888888">.class )
+@Required
+@MustExist
+@WorkspaceRelativePath
+@ValidFileSystemResourceType( FileSystemResourceType.FILE )
+@ValidFileExtensions( "xml" )
+
+ValueProperty PROP_LOCATION = new ValueProperty( TYPE, "Location" );
+
+Value&lt;</font>Path<font color="#888888">&gt; getLocation();
+void setLocation( String location );
+void setLocation( </font>Path<font color="#888888"> location );</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><font color="#888888">public class CustomBasePathsProvider extends BasePathsProviderImpl
+{
+    public List&lt;</font>IPath<font color="#888888">&gt; getBasePaths( IModelElement element )
+    {
+        ...
+    }
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><font color="#888888">public class CustomRelativePathService extends RelativePathService
+{
+    public List&lt;</font>Path<font color="#888888">&gt; roots()
+    {
+        ...
+    }
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><font color="#888888">public class ProjectRootsBasePathsProvider extends BasePathsProviderImpl
+{
+    public List&lt;</font>IPath<font color="#888888">&gt; getBasePaths( IModelElement element )
+    {
+        final List&lt;</font>IPath<font color="#888888">&gt; paths = new ArrayList&lt;</font>IPath<font color="#888888">&gt;();
+
+        for( IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects() )
+        {
+            paths.add(</font> project.getLocation() <font color="#888888">);
+        }
+
+        return paths;
+    }
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><font color="#888888">public class ProjectRootsRelativePathService extends RelativePathService
+{
+    public List&lt;</font>Path<font color="#888888">&gt; roots()
+    {
+        final List&lt;</font>Path<font color="#888888">&gt; paths = new ArrayList&lt;</font>Path<font color="#888888">&gt;();
+
+        for( IProject project : ResourcesPlugin.getWorkspace().getRoot().getProjects() )
+        {
+            paths.add(</font> PathBridge.create( project.getLocation() ) <font color="#888888">);
+        }
+
+        return paths;
+    }
+}</font></code></pre>
+
+<p>When necessary, use PathBridge class from org.eclipse.sapphire.platform bundle to convert back-n-forth between Sapphire's Path object and
+Eclipse's IPath object.</p> 
+    </td>
+  </tr>
+</table>
+
+<p>Sapphire extension system no longer requires a flag from Eclipse extension system in order to discover extensions.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;plugin>
+
+    ...</font>
+
+    &lt;extension point="org.eclipse.sapphire.modeling.extension"/>
+
+<font color="#888888">&lt;/plugin></font></code></pre>
+    </td>
+    <td>
+      <i>remove</i>
+    </td>
+  </tr>
+</table>
+
+<p>Sapphire now loads all resources (such as images and sdef files) from the class loader. To access resources from another
+bundle use standard OSGi facilities to require another bundle or to import packages. To make re-use from other bundles
+easier, place images and sdef files into exported packages along with Java source code.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;definition></font>
+
+    &lt;import>
+      &lt;bundle>org.sample.foo&lt;/bundle>
+      &lt;package>org.sample.foo&lt;/package>
+      &lt;package>org.sample.foo.xyz&lt;/package>
+      &lt;definition>sdef/Foo.sdef&lt;/definition>
+    &lt;/import>
+
+    &lt;import>
+      &lt;bundle>org.sample.bar&lt;/bundle>
+      &lt;package>org.sample.bar&lt;/package>
+    &lt;/import>
+
+    <font color="#888888">...
+
+&lt;/definition></font>
+</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;definition></font>
+
+    &lt;import>
+      &lt;package>org.sample.foo&lt;/package>
+      &lt;package>org.sample.foo.xyz&lt;/package>
+      &lt;definition>org/sample/foo/Foo.sdef&lt;/definition>
+      &lt;package>org.sample.bar&lt;/package>
+    &lt;/import>
+
+    <font color="#888888">...
+
+&lt;/definition></font></code></pre>
+
+      <p>Note that multiple import elements are no longer supported.</p>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Image( path = "</font>org.sample.foo/images/something.png<font color="#888888">" )</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Image( path = "</font>images/something.png<font color="#888888">" )</font></code></pre>
+
+      <p>The above migration is sufficient if the annotated type is located in the same plugin as the image. If the image is located
+      in a different plugin, then you need to arrange to place the image in an exported package and adjust the path in the annotation
+      accordingly.</p>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="ref">ReferenceValue Changes</a></h2>
+
+<p>The ReferenceValue class now takes two type parameters instead of one. The first is the 
+type of the reference. This used to be assumed to always be a string. The second is the type 
+of what the reference resolves to.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>ReferenceValue&lt;ImageDescriptor> getImage();</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>ReferenceValue&lt;String,ImageDescriptor> getImage();</code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="services">Services</a></h2>
+
+<p>A few changes have been made to the services API.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>public class MyService extends ModelElementService
+{
+    public void init( final IModelElement element )
+    {
+        super.init( element );
+
+        ...
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>public class MyService extends ModelElementService
+{
+    public void init( final IModelElement element,
+                      final String[] params )
+    {
+        super.init( element, params );
+
+        ...
+    }
+}</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@Reference( target = IComponent.class, service = ComponentReferenceService.class )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Reference( target = IComponent.class )
+@Service( impl = ComponentReferenceService.class )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@PossibleValues( service = CustomPossibleValuesService.class )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Service( impl = CustomPossibleValuesService.class )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@DefaultValue( service = CustomDefaultValueService.class )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Service( impl = CustomDefaultValueService.class )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@BasePathsProvider( CustomBasePathsProvider.class )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Service( impl = CustomRelativePathService.class )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>public class CustomBasePathsProvider extends BasePathsProviderImpl
+{
+    public List&lt;Path> getBasePaths( IModelElement element )
+    {
+        ...
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>public class CustomRelativePathService extends RelativePathService
+{
+    public List&lt;Path> roots()
+    {
+        ...
+    }
+}</code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="validation">Validation</a></h2>
+
+<p>Validators are now model element services. They can be registered globaly via the extension
+system or at the level of an individual property using the @Service annotation.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@Validator( service = MyValidator.class )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Service( impl = MyValidationService.class )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@Validators
+(
+    @Validator( impl = MyValidator1.class ),
+    @Validator( impl = MyValidator2.class )
+)</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Services
+(
+    @Service( impl = MyValidationService1.class ),
+    @Service( impl = MyValidationService2.class )
+)</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>public class CustomValidator extends ModelPropertyValidator&lt;Value&lt;?>>
+{
+    @Override
+    public void init( String[] params )
+    {
+        ...
+    }
+
+    public IStatus validate( Value&lt;?> value )
+    {
+        ...
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>public class CustomValidationService extends ModelPropertyValidationService&lt;Value&lt;?>>
+{
+    @Override
+    public void init( IModelElement element,
+                      ModelProperty property,
+                      String[] params )
+    {
+        ...
+    }
+
+    public Status validate()
+    {
+        final Value&lt;?> value = target();
+
+        ...
+    }
+}</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@Validator( impl = UniqueValueValidator.class )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@NoDuplicates</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>public class CustomValidator extends UniqueValueValidator
+{
+    ...
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>public class CustomValidationService extends UniqueValueValidationService
+{
+    ...
+}</code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="enablement">Enablement</a></h2>
+
+<p>Enablement is now handled by true model element services. They can be registered globaly via the extension
+system or at the level of an individual property using the @Service annotation.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@Enablement( service = CustomEnablementService.class )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Service( impl = CustomEnablementService.class )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>public class CustomEnablementService extends EnablementService
+{
+    @Override
+    public void init( IModelElement element,
+                      ModelProperty property,
+                      String[] params )
+    {
+        super.init( element, property, params );
+
+        ...
+    }
+
+    @Override
+    public boolean isEnabled() 
+    {
+        ...
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>public class CustomEnablementService extends EnablementService
+{
+    @Override
+    protected void initEnablementService( IModelElement element,
+                                          ModelProperty property,
+                                          String[] params )
+    {
+        super.initEnablementService( element, property, params );
+
+        ...
+    }
+
+    @Override
+    public boolean state()
+    {
+        refresh();
+        return super.state();
+    }
+
+    @Override
+    protected boolean compute() 
+    {
+        ...
+    }
+}
+</code></pre>
+
+<p>The above represents the quickest way to migrate an existing enablement service, but is far from
+ideal. A better solution would be to not override the state() method with a refresh on every invocation.
+To do that, the service would need to listen on changes to data used in the compute() method and call
+refresh() method when that data changes.</p>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="whitespace">Whitespace Handling</a></h2>
+
+<p>Whitespace handling has been made more flexible via the new @Whitespace annotation and the 
+ValueNormalizationService API. The collapseWhitespace attribute on @XmlValueBinding annotation
+is no longer supported.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@XmlValueBinding( <font color="#888888">path = "description",</font> collapseWhitespace = true )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@XmlValueBinding( <font color="#888888">path = "description"</font> )
+@Whitespace( collapse = true )</code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="java">Java Support</a></h2>
+
+<p>Support for writing models that reference Java types has been improved. All properties that that hold
+Java type names should now be modeled as a reference from JavaTypeName to JavaType in order to receive validation
+and content assist support.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = JavaTypeName.class )</font>
+@JavaTypeConstraint<u>s</u>( ... )
+<font color="#888888">@MustExist
+
+ValueProperty PROP_IMPL_CLASS = new ValueProperty( TYPE, "ImplClass" );</font>
+
+Value&lt;JavaTypeName> <font color="#888888">getImplClass();
+void setImplClass( String value );
+void setImplClass( JavaTypeName value );</font>
+</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = JavaTypeName.class )</font>
+@Reference( target = JavaType.class )
+@JavaTypeConstraint( ... )
+<font color="#888888">@MustExist
+
+ValueProperty PROP_IMPL_CLASS = new ValueProperty( TYPE, "ImplClass" );</font>
+
+ReferenceValue&lt;JavaTypeName,JavaType> <font color="#888888">getImplClass();
+void setImplClass( String value );
+void setImplClass( JavaTypeName value );</font>
+</code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="html">HTML Content Presentation</a></h2>
+
+<p>Support for presenting HTML content in Sapphire UI was introduced in the 0.2 release in
+the form of @HtmlContent annotation and a read-only property editor. This approach proved
+to be too inflexible and has been replaced with a dedicated HTML UI part that can display
+HTML content that's statically specified, drawn from the model or even fetched remotely.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@HtmlContent</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><i>remove</i></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>&lt;property-editor>
+  &lt;property>MessageBody&lt;/property>
+  &lt;hint>
+    &lt;name>show.label&lt;/name>
+    &lt;value>false&lt;/value>
+  &lt;/hint>
+&lt;/property-editor></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>&lt;html>
+  &lt;content>${ MessageBody }&lt;/content>
+  &lt;show-border/>
+&lt;/html></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p><a href="enhancements.html#html">See New Feature Documentation</a></p>
+
+<h2><a name="related-content">Related Content</a></h2>
+
+<p>The ability to augment a property editor with an auxiliary property editor has been generalized
+into a more powerful related content feature.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor>
+  &lt;property>MainProperty&lt;/property></font>
+  &lt;aux-property-editor>RelatedProperty&lt;/aux-property-editor>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor>
+  &lt;property>MainProperty&lt;/property></font>
+  &lt;related-content>
+    &lt;property-editor>RelatedProperty&lt;/property-editor>
+  &lt;/related-content>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor>
+  &lt;property>MainProperty&lt;/property></font>
+  &lt;aux-property-editor>RelatedProperty1&lt;/aux-property-editor>
+  &lt;aux-property-editor>RelatedProperty2&lt;/aux-property-editor>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor>
+  &lt;property>MainProperty&lt;/property></font>
+  &lt;related-content>
+    &lt;property-editor>
+      &lt;property>RelatedProperty1&lt;/property>
+      &lt;related-content>
+        &lt;property>RelatedProperty2&lt;/property>
+      &lt;/related-content>
+    &lt;/property-editor>
+  &lt;/related-content>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p><a href="enhancements.html#related-content">See New Feature Documentation</a></p>
+
+<h2><a name="composite-ref">Composite Reference</a></h2>
+
+<p>The composite-ref construct has been replaced with a more flexible include construct which allows
+any form part to be included.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>&lt;composite-ref>
+  &lt;id>bug.report&lt;/id>
+&lt;/composite-ref></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>&lt;include>bug.report&lt;/include></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>&lt;composite-ref>
+  &lt;id>bug.report&lt;/id>
+  &lt;param>
+    &lt;name>SomeParam&lt;/name>
+    &lt;value>SomeValue&lt;/value>
+  &lt;/param>
+&lt;/composite-ref></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>&lt;include>
+  &lt;part>bug.report&lt;/part>
+  &lt;param>
+    &lt;name>SomeParam&lt;/name>
+    &lt;value>SomeValue&lt;/value>
+  &lt;/param>
+&lt;/include></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>The following Eclipse search/replace regular expression can be used to perform this
+migration (only works when there are no params):</p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)&lt;composite-ref>.*?&lt;id>(.*?)&lt;/id>.*?&lt;/composite-ref></nobr><br/>
+<nobr>Replace: &nbsp;&lt;include>\1&lt;/include></nobr></p>
+
+<h2><a name="section-description">Section Description</a></h2>
+
+<p>The description construct under section has been removed. Use label and spacer to achieve the same result.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>&lt;section>
+  &lt;description>description&lt;/description></id>
+&lt;/section></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>&lt;section>
+  &lt;content>
+    &lt;label>description&lt;/label>
+    &lt;spacer/>
+  &lt;/content>
+&lt;/section></code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="function">Function Name Method</a></h2>
+
+<p>Implementations of custom expression language functions (classes that extend Function) need to be updated
+to implement the required new name method. The returned name should be consistent with the name used when
+registering the function in sapphire-extension.xml file. The new method is used during toString() execution
+on a parsed expression.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>public class CustomFunction extends Function
+{
+    @Override
+    public FunctionResult evaluate( FunctionContext context )
+    {
+        ...
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>public class CustomFunction extends Function
+{
+    @Override
+    public String name()
+    {
+        return "Custom";
+    }
+
+    @Override
+    public FunctionResult evaluate( FunctionContext context )
+    {
+        ...
+    }
+}</code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="with">With Directive</a></h2>
+
+<p>The with directive capabilities have been expanded to allow ancestor element access via a path. To
+accommodate this feature, the "property" XML element in the sdef syntax has been renamed to "path".</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;with></font>
+    &lt;property><font color="#888888">SomeProperty</font>&lt;/property>
+    <font color="#888888">&lt;default-panel>
+        &lt;content>
+            ...
+        &lt;/content>
+    &lt;/default-panel>
+&lt;/with></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;with></font>
+    &lt;path><font color="#888888">SomeProperty</font>&lt;/path>
+    <font color="#888888">&lt;default-panel>
+        &lt;content>
+            ...
+        &lt;/content>
+    &lt;/default-panel>
+&lt;/with></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>The following Eclipse search/replace regular expression can be used to perform this
+migration:</p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)&lt;with>(.*?)&lt;property>(.*?)&lt;/property>(.*?)&lt;/with></nobr><br/>
+<nobr>Replace: &nbsp;&lt;with>\1&lt;path>\2&lt;/path>\3&lt;/with></nobr></p>
+
+<h2><a name="element-image">Model Element Image</a></h2>
+
+<p>The API for model element image provider has been changed to unify it with the model element services
+API and to support notification of image changes.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Image( </font>small<font color="#888888"> = "..." )</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Image( </font>path<font color="#888888"> = "..." )</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@Image( provider = AttendeeImageProvider.class )
+
+public interface IAttendee extends IModelElement
+{
+    ...
+}
+
+...
+
+public class AttendeeImageProvider extends ImageProvider
+{
+    private static final String IMG_PERSON 
+        = SapphireSamplesPlugin.PLUGIN_ID + "/org/eclipse/sapphire/samples/contacts/Contact.png";
+
+    private static final String IMG_PERSON_FADED 
+        = SapphireSamplesPlugin.PLUGIN_ID + "/org/eclipse/sapphire/samples/contacts/ContactFaded.png";
+
+    @Override
+    public String getSmallImagePath( IModelElement element )
+    {
+        if( ( (IAttendee) element ).isInContactsDatabase().getContent() )
+        {
+            return IMG_PERSON;
+        }
+        else
+        {
+            return IMG_PERSON_FADED;
+        }
+    }
+
+    @Override
+    public String getSmallImagePath( ModelElementType type )
+    {
+        return IMG_PERSON;
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Image( path = "Contact.png" )
+@Service( impl = AttendeeImageService.class )
+
+public interface IAttendee extends IModelElement
+{
+    ...
+}
+
+...
+
+public class AttendeeImageService extends ImageService
+{
+    private static final ImageData IMG_PERSON 
+        = ImageData.readFromClassLoader( IContact.class, "Contact.png" );
+
+    private static final ImageData IMG_PERSON_FADED 
+        = ImageData.readFromClassLoader( IContact.class, "ContactFaded.png" );
+
+    private ModelPropertyListener listener;
+
+    @Override
+    public void init( IModelElement element, String[] params )
+    {
+        super.init( element, params );
+
+        this.listener = new ModelPropertyListener()
+        {
+            @Override
+            public void handlePropertyChangedEvent( final ModelPropertyChangeEvent event )
+            {
+                notifyListeners( new ImageChangedEvent( AttendeeImageProviderService.this ) );
+            }
+        };
+
+        element.addListener( this.listener, IAttendee.PROP_IN_CONTACTS_DATABASE.getName() );
+    }
+
+    @Override
+    public ImageData provide()
+    {
+        if( ( (IAttendee) element() ).isInContactsDatabase().getContent() )
+        {
+            return IMG_PERSON;
+        }
+        else
+        {
+            return IMG_PERSON_FADED;
+        }
+    }
+
+    @Override
+    public void dispose()
+    {
+        super.dispose();
+        element().removeListener( this.listener, IAttendee.PROP_IN_CONTACTS_DATABASE.getName() );
+    }
+}</code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>The following Eclipse search/replace regular expression can be used to perform some of this
+migration:</p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.java<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)@Image\((.*?)small(.*?)=(.*?)"(.*?)"(.*?)\)</nobr><br/>
+<nobr>Replace: &nbsp;@Image\(\1path\2=\3"\4"\5\)</nobr></p>
+
+<h2><a name="required-annotation">Required Annotation</a></h2>
+
+<p>The NonNullValue annotation has been renamed to Required to better reflect its broader usage
+with both value and element properties.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@NonNullValue
+
+<font color="#888888">ValueProperty PROP_NAME = new ValueProperty( TYPE, "Name" );
+
+Value<String> getName();
+void setName( String name );</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Required
+
+<font color="#888888">ValueProperty PROP_NAME = new ValueProperty( TYPE, "Name" );
+
+Value<String> getName();
+void setName( String name );</font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>The following Eclipse search/replace regular expressions can be used to perform this
+migration:</p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.java<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)@NonNullValue</nobr><br/>
+<nobr>Replace: &nbsp;@Required</nobr></p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.java<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)import org\.eclipse\.sapphire\.modeling\.annotations\.NonNullValue;</nobr><br/>
+<nobr>Replace: &nbsp;import org\.eclipse\.sapphire\.modeling\.annotations\.Required;</nobr></p>
+
+<h2><a name="master-details-content-node-factory">Master Details Content Node Factory</a></h2>
+
+<p>The syntax of master details content node factory has been modified to better reflect its
+broader usage with both list and element properties.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>&lt;node-list>
+    <font color="#888888">&lt;property>HeterogeneousList&lt;/property></font>
+    &lt;node-template>
+        <font color="#888888">&lt;model-element-type>IChildElementWithInteger&lt;/model-element-type>
+        &lt;label>${ StringValue == null ? "&amp;lt;child-with-integer&amp;gt;" : StringValue }&lt;/label>
+        &lt;section>
+            &lt;label>child element with integer&lt;/label>
+            &lt;content>
+                &lt;property-editor>StringValue&lt;/property-editor>
+                &lt;property-editor>IntegerValue&lt;/property-editor>
+            &lt;/content>
+        &lt;/section></font>
+    &lt;/node-template>
+    &lt;node-template>
+        <font color="#888888">&lt;model-element-type>IChildElementWithEnum&lt;/model-element-type>
+        &lt;label>${ StringValue == null ? "&amp;lt;child-with-enum&amp;gt;" : StringValue }&lt;/label>
+        &lt;section>
+            &lt;label>child element with enum&lt;/label>
+            &lt;content>
+                &lt;property-editor>StringValue&lt;/property-editor>
+                &lt;property-editor>EnumValue&lt;/property-editor>
+            &lt;/content>
+        &lt;/section></font>
+    &lt;/node-template>
+    &lt;node-template>
+        <font color="#888888">&lt;model-element-type>IChildElement&lt;/model-element-type>
+        &lt;label>${ StringValue == null ? "&amp;lt;child&amp;gt;" : StringValue }&lt;/label>
+        &lt;section>
+            &lt;label>child element&lt;/label>
+            &lt;content>
+                &lt;property-editor>StringValue&lt;/property-editor>
+            &lt;/content>
+        &lt;/section></font>
+    &lt;/node-template>
+&lt;/node-list></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>&lt;node-factory>
+    <font color="#888888">&lt;property>HeterogeneousList&lt;/property></font>
+    &lt;case>
+        <font color="#888888">&lt;model-element-type>IChildElementWithInteger&lt;/model-element-type>
+        &lt;label>${ StringValue == null ? "&amp;lt;child-with-integer&amp;gt;" : StringValue }&lt;/label>
+        &lt;section>
+            &lt;label>child element with integer&lt;/label>
+            &lt;content>
+                &lt;property-editor>StringValue&lt;/property-editor>
+                &lt;property-editor>IntegerValue&lt;/property-editor>
+            &lt;/content>
+        &lt;/section></font>
+    &lt;/case>
+    &lt;case>
+        <font color="#888888">&lt;model-element-type>IChildElementWithEnum&lt;/model-element-type>
+        &lt;label>${ StringValue == null ? "&amp;lt;child-with-enum&amp;gt;" : StringValue }&lt;/label>
+        &lt;section>
+            &lt;label>child element with enum&lt;/label>
+            &lt;content>
+                &lt;property-editor>StringValue&lt;/property-editor>
+                &lt;property-editor>EnumValue&lt;/property-editor>
+            &lt;/content>
+        &lt;/section></font>
+    &lt;/case>
+    &lt;case>
+        <font color="#888888">&lt;model-element-type>IChildElement&lt;/model-element-type>
+        &lt;label>${ StringValue == null ? "&amp;lt;child&amp;gt;" : StringValue }&lt;/label>
+        &lt;section>
+            &lt;label>child element&lt;/label>
+            &lt;content>
+                &lt;property-editor>StringValue&lt;/property-editor>
+            &lt;/content>
+        &lt;/section></font>
+    &lt;/case>
+&lt;/node-factory></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>&lt;node-ref><font color="#888888">CommonNode</font>&lt;/node-ref></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>&lt;node-include><font color="#888888">CommonNode</font>&lt;/node-include></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>&lt;node-list-ref><font color="#888888">CommonNodeFactory</font>&lt;/node-list-ref></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>&lt;node-include><font color="#888888">CommonNodeFactory</font>&lt;/node-include></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>The following Eclipse search/replace regular expressions can be used to perform this
+migration:</p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)&lt;node-list></nobr><br/>
+<nobr>Replace: &nbsp;&lt;node-factory></nobr></p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)&lt;/node-list></nobr><br/>
+<nobr>Replace: &nbsp;&lt;/node-factory></nobr></p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)&lt;node-template></nobr><br/>
+<nobr>Replace: &nbsp;&lt;case></nobr></p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)&lt;/node-template></nobr><br/>
+<nobr>Replace: &nbsp;&lt;/case></nobr></p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)&lt;node-ref></nobr><br/>
+<nobr>Replace: &nbsp;&lt;node-include></nobr></p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)&lt;/node-ref></nobr><br/>
+<nobr>Replace: &nbsp;&lt;/node-include></nobr></p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)&lt;node-list-ref></nobr><br/>
+<nobr>Replace: &nbsp;&lt;node-include></nobr></p>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;(?s)&lt;/node-list-ref></nobr><br/>
+<nobr>Replace: &nbsp;&lt;/node-include></nobr></p>
+
+<h2><a name="jump-action-handle">Jump Action Handler</a></h2>
+
+<p>Jump action handler API has been improved slightly to make it less likely that a subclass will override
+enablement logic from the parent class rather than augmenting it.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>public class CustomJumpActionHandler extends SapphireJumpActionHandler
+{
+    @Override
+    public void refreshEnablementState()
+    {
+        setEnabled( ... );
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>public class CustomJumpActionHandler extends SapphireJumpActionHandler
+{
+    @Override
+    protected boolean computeEnablementState()
+    {
+        if( super.computeEnablementState() == true )
+        {
+            return ...
+        }
+
+        return false;
+    }
+}</code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="show-in-source">Show In Source Action</a></h2>
+
+<p>The "show in source" action has been generalized to apply to other contexts besides the content outline. 
+This necessitated change of the id.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>Sapphire.Outline.ShowInSource</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>Sapphire.ShowInSource</code></pre>
+    </td>
+  </tr>
+</table>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.4/enhancements.html b/releases/8.2.4/documentation/releases/0.4/enhancements.html
new file mode 100644
index 0000000..41545e9
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.4/enhancements.html
@@ -0,0 +1,610 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle, Accenture and Liferay
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ *    Kamesh Sampath - [355457] Improve DTD doctype specification in XML binding
+ *    Kamesh Sampath - [355751] General improvement of XML root binding API
+ *    Gregory Amerson - [363551] JavaTypeConstraintService
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Enhancements in Sapphire 0.4</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a> > <a href="index.html">0&#46;4</a></div>
+
+
+<h1>Enhancements in Sapphire 0.4</h1>
+
+<ol>
+  <li><a href="#ExpressionLanguage">Expression Language</a></li>
+  <ol type="A">
+    <li><a href="#ScaleFunction">Scale Function</a></li>
+    <li><a href="#AggregateFunctions">Aggregate Functions</a></li>
+    <li><a href="#ExprInDerived">Use in @Derived</a></li>
+    <li><a href="#ExprDefaultValue">Use in @DefaultValue</a></li>
+    <li><a href="#ExprInitialValue">Use in @InitialValue</a></li>
+  </ol>
+  <li><a href="#Services">Services</a></li>
+  <ol type="A">
+    <li><a href="#FactsService">FactsService</a></li>
+    <li><a href="#InitialValueService">InitialValueService and @InitialValue</a></li>
+    <li><a href="#PossibleTypesService">PossibleTypesService</a></li>
+    <li><a href="#ContentProposalService">ContentProposalService</a></li>
+    <li><a href="#JavaTypeConstraintService">JavaTypeConstraintService</a></li>
+  </ol>
+  <li><a href="#UI">User Interface</a></li>
+  <ol type="A">
+    <li><a href="#SplitForm">Split Form</a></li>
+    <li><a href="#MultiSectionFormEditorPage">Multi-Section Form Editor Page</a></li>
+  </ol>
+  <li><a href="#XML">XML</a></li>
+  <ol type="A">
+    <li><a href="#XmlDocumentType">@XmlDocumentType Annotation</a></li>
+    <li><a href="#XmlSchema">@XmlSchema Annotation</a></li>
+    <li><a href="#ListElementPropertyBindingNoMappings">List and Element Property Binding Without Mappings</a></li>
+  </ol>
+  <li><a href="#Miscellaneous">Miscellaneous</a></li>
+  <ol type="A">
+    <li><a href="#Copy">Model Copy Method</a></li>
+  </ol>
+</ol>
+
+<h2><a name="ExpressionLanguage"><a name="ScaleFunction">Scale Function</a></a></h2>
+
+<p>When working with decimals, controlling the scale of the number is very
+important, whether to decrease the scale in order to round the number or to
+increase the scale ahead of arithmetic operations.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>${ Scale( UnitPrice * Scale( Quantity, 2 ), 2 ) }</code></pre>
+
+<h2><a name="AggregateFunctions">Aggregate Functions</a></h2>
+
+<p>Compute the sum, the average, the min or the max of numbers in a collection. Typically, these function 
+takes the collection as the sole parameter. However, when the collection is a model element list, a second 
+parameter may be necessary to specify the name (in the form of a string) of the list entry's value property 
+to use in aggregation. If the the collection is a model element list and the second parameter is not 
+specified, these functions will use list entry's first value property for aggregation.</p>
+
+<p style="margin-left: 20px;"><b>Examples</b></p>
+
+<pre class="source-code"><code>${ Sum( Entries, 'Total' ) }
+${ Avg( Entries, 'Total' ) }
+${ Min( Entries, 'Total' ) }
+${ Max( Entries, 'Total' ) }
+${ Sum( List( 1.2, 3.4, 5.6, 7.8 ) ) }</code></pre>
+
+<h2><a name="ExprInDerived">Use in @Derived</a></h2>
+
+<p>Use expression language when specifying derived value in @Derived annotation.</p>
+
+<pre class="source-code"><code><font color="#888888">@Type( base = BigDecimal.class )</font>
+@Derived( text = "${ Scale( UnitPrice * Scale( Quantity, 2 ), 2 ) }" )
+
+<font color="#888888">ValueProperty PROP_TOTAL = new ValueProperty( TYPE, "Total" );
+
+Value&lt;BigDecimal> getTotal();</font></code></pre>
+
+<h2><a name="ExprDefaultValue">Use in @DefaultValue</a></h2>
+
+<p>Use expression language when specifying default value in @DefaultValue annotation.</p>
+
+<pre class="source-code"><code>@DefaultValue( text = "${ Parent().BillingInformation.Street }" )
+
+<font color="#888888">ValueProperty PROP_STREET = new ValueProperty( TYPE, "Street" );
+
+Value<String> getStreet();
+void setStreet( String street );</font></code></pre>
+
+<h2><a name="ExprInitialValue">Use in @InitialValue</a></h2>
+
+<p>Use expression language when specifying initial value in @InitialValue annotation.</p>
+
+<pre class="source-code"><code>@InitialValue( text = "${ Parent().BillingInformation.Street }" )
+
+<font color="#888888">ValueProperty PROP_STREET = new ValueProperty( TYPE, "Street" );
+
+Value<String> getStreet();
+void setStreet( String street );</font></code></pre>
+
+<h2><a name="Services"><a name="FactsService">FactsService</a></a></h2>
+<p>When a property is described to a user in documentation one does it with a series of short statements that
+define its semantics, such as "must be specified" or "maximum value is 100". When a property is
+described to Sapphire one does it with a series of annotations, such as @Required or
+@NumericRange. This duplicate specification is a maintenance problem.</p>
+
+<p>A FactsService provides a means to dynamically derive statements about property's semantics
+based on property's metadata. The derived facts can then be presented to the user as part of documentation,
+property editor information popup and in other relevant places.</p>
+
+<p style="margin-left: 20px;"><img src="images/FactsService.png"/></p>
+
+<p>The concept of deriving facts from metadata has existed in limited capacity in past releases.
+New for 0.4 is formalization of this system via FactsService API that allows adopters to participate
+in generation of facts on equal footing with the framework. Also new for 0.4 is a much longer list
+of annotations that generate corresponding facts.</p>
+
+<p><a href="../../services/index.html#FactsService">See Documentation</a></p>
+
+<h2><a name="InitialValueService">InitialValueService and @InitialValue</a></h2>
+
+<p>The InitialValueService produces a value to assign to a property when the containing model element is
+created.</p>
+
+<p>The concept of an initial value is different from a default value. The initial value is explicitly
+assigned to the property during containing model element's creation. This includes writing to the backing resource
+(such as an XML document). In comparison, the default value is used when null is read for a property from the 
+backing resource. As such, the default value is only visible to model consumers (such as the user interface), 
+while the initial value is persisted.</p> 
+
+<p>Whether you use an initial value or a default value is frequently dictated by the requirements of the 
+backing resource. As an example, let's consider an XML document that stores phone numbers. In this XML document, 
+the phone number element has a type child element which contains a value like home, mobile, work, etc.
+Let's further say that semantically, we wish to use mobile phone number type unless specified differently.
+Now, if the XML schema dictates that the phone number type element is required, we would need to specify 
+"mobile" as the initial value. If the phone number type element is optional, it would be better to specify
+"mobile" as the default value.</p>
+
+<p><a href="../../services/index.html#InitialValueService">See Documentation</a></p>
+
+<h2><a name="PossibleTypesService">PossibleTypesService</a></h2>
+
+<p>The set of possible types for a list or an element property is usually static and as such can be
+specified using @Type annotation. However, when the model needs to be extensible or the set of possible
+types needs to vary due to runtime conditions, a custom PossibleTypesService implementation can now
+be supplied.</p>
+
+<p><a href="../../services/index.html#PossibleTypesService">See Documentation</a></p>
+
+<h2><a name="ContentProposalService">ContentProposalService</a></h2>
+
+<p>The ContentProposalService provides a conduit for content assist in property editors. If a property
+has this service, content assist will be automatically enabled in the property editor. The manner in which
+content assist is presented is specific to the presentation, but usually involves a popup window with
+proposals, activated by some combination of key strokes (such as CTRL+SPACE).</p>
+
+<p>The framework provides an implementation of ContentProposalService for properties with @PossibleValues 
+annotation or a custom PossibleValuesService, but this service can also be implemented directly by
+adopters.</p> 
+
+<p style="margin-left: 20px;"><img src="images/ContentProposalService.png"/></p>
+
+<p><a href="../../services/index.html#ContentProposalService">See Documentation</a></p>
+
+<h2><a name="JavaTypeConstraintService">JavaTypeConstraintService</a></h2>
+
+<p>The JavaTypeConstraintService describes constraints on the Java type that a property can reference, such as the kind of
+type (class, interface, etc.) and the types that the type must extend or implement. The information provided by this
+service is used for validation, content assist and other needs.</p>
+
+<p>The framework provides an implementation of JavaTypeConstraintService for properties with @JavaTypeConstraint 
+annotation, but this service can also be implemented directly by adopters. This is particularly useful when Java
+type constraint can vary at runtime.</p> 
+
+<p><a href="../../services/index.html#JavaTypeConstraintService">See Documentation</a></p>
+
+<h2><a name="UI"><a name="SplitForm">Split Form</a></a></h2>
+
+<p>Use available screen real estate more efficiently by splitting a form into two or more sections. The
+sections can be arranged vertically or horizontally. The developer can specify the desired initial distribution of
+available space among the sections and the provided sashes allow the user to adjust the space allocation
+as necessary at runtime.</p> 
+
+<p>A split form can nest inside another split form. This is particularly useful when the two split forms 
+use different split orientation.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example, a dialog is split vertically into two sections. The top section
+holds a list property editor while the bottom section holds the editor for the description property linked to
+the selection in the list property editor. The split form allows the user to control the amount of space allocated
+to the list property editor versus the description text field.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;dialog>
+    &lt;id>SplitFormDialog&lt;/id>
+    &lt;label>split form dialog&lt;/label>
+    &lt;width>600&lt;/width>
+    &lt;height>400&lt;/height>
+    &lt;scale-vertically>true&lt;/scale-vertically>
+    &lt;content></font>
+        &lt;split-form>
+            &lt;orientation>vertical&lt;/orientation>
+            &lt;scale-vertically>true&lt;/scale-vertically>
+            &lt;block>
+                &lt;weight>7&lt;/weight>
+                &lt;content><font color="#888888">
+                    &lt;property-editor>
+                        &lt;property>List1&lt;/property>
+                        &lt;span>true&lt;/span>
+                        &lt;show-label>false&lt;/show-label>
+                        &lt;child-property>Entity&lt;/child-property>
+                        &lt;child-property>Size&lt;/child-property>
+                        &lt;scale-vertically>true&lt;/scale-vertically>
+                    &lt;/property-editor></font>
+                &lt;/content>
+            &lt;/block>
+            &lt;block>
+                &lt;weight>3&lt;/weight>
+                &lt;content>
+                    <font color="#888888">&lt;separator>
+                        &lt;label>description&lt;/label>
+                    &lt;/separator>
+                    &lt;switching-panel>
+                        &lt;list-selection-controller>
+                            &lt;property>List1&lt;/property>
+                        &lt;/list-selection-controller>
+                        &lt;default-panel>
+                            &lt;content>
+                                &lt;label>Select an entry above to view or edit description.&lt;/label>
+                            &lt;/content>
+                        &lt;/default-panel>
+                        &lt;panel>
+                            &lt;key>SplitFormGalleryListEntry&lt;/key>
+                            &lt;content>
+                                &lt;property-editor>
+                                    &lt;property>Description&lt;/property>
+                                    &lt;span>true&lt;/span>
+                                    &lt;show-label>false&lt;/show-label>
+                                    &lt;scale-vertically>true&lt;/scale-vertically>
+                                &lt;/property-editor>
+                            &lt;/content>
+                        &lt;/panel>
+                        &lt;scale-vertically>true&lt;/scale-vertically>
+                    &lt;/switching-panel></font>
+                &lt;/content>
+            &lt;/block>
+        &lt;/split-form>
+    <font color="#888888">&lt;/content>
+&lt;/dialog></font></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/SplitForm.png"/></p>
+
+<h2><a name="MultiSectionFormEditorPage">Multi-Section Form Editor Page</a></h2>
+
+<p>Create form editor pages with highly configurable section layouts. The feature is used in conjunction
+with split form feature to break the page into resizable blocks where sections are places.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example, two multi-section form editor pages are used to organize
+purchase order entry fields.</p>
+
+<pre class="source-code"><code>&lt;form-editor-page>
+    &lt;id>GeneralPage&lt;/id>
+    &lt;page-name>general&lt;/page-name>
+    &lt;page-header-text>purchase order&lt;/page-header-text>
+    &lt;content>
+        &lt;split-form>
+            &lt;orientation>horizontal&lt;/orientation>
+            &lt;scale-vertically>true&lt;/scale-vertically>
+            &lt;block>
+                &lt;content>
+                    &lt;section>
+                        &lt;label>general&lt;/label>
+                        &lt;content>
+                            <font color="#888888">&lt;property-editor>Id&lt;/property-editor>
+                            &lt;property-editor>Customer&lt;/property-editor>
+                            &lt;property-editor>InitialQuoteDate&lt;/property-editor>
+                            &lt;property-editor>OrderDate&lt;/property-editor>
+                            &lt;property-editor>FulfillmentDate&lt;/property-editor></font>
+                        &lt;/content>
+                    &lt;/section>
+                &lt;/content>
+            &lt;/block>
+            &lt;block>
+                &lt;content>
+                    &lt;section>
+                        &lt;label>billing information&lt;/label>
+                        &lt;content>
+                            <font color="#888888">&lt;with>
+                                &lt;path>BillingInformation&lt;/path>
+                                &lt;default-panel>
+                                    &lt;content>
+                                        &lt;property-editor>Name&lt;/property-editor>
+                                        &lt;property-editor>Organization&lt;/property-editor>
+                                        &lt;property-editor>Street&lt;/property-editor>
+                                        &lt;property-editor>City&lt;/property-editor>
+                                        &lt;property-editor>State&lt;/property-editor>
+                                        &lt;property-editor>ZipCode&lt;/property-editor>
+                                    &lt;/content>
+                                &lt;/default-panel>
+                            &lt;/with></font>
+                        &lt;/content>
+                    &lt;/section>
+                    &lt;section>
+                        &lt;label>shipping information&lt;/label>
+                        &lt;content>
+                            <font color="#888888">&lt;with>
+                                &lt;path>ShippingInformation&lt;/path>
+                                &lt;default-panel>
+                                    &lt;content>
+                                        &lt;property-editor>Name&lt;/property-editor>
+                                        &lt;property-editor>Organization&lt;/property-editor>
+                                        &lt;property-editor>Street&lt;/property-editor>
+                                        &lt;property-editor>City&lt;/property-editor>
+                                        &lt;property-editor>State&lt;/property-editor>
+                                        &lt;property-editor>ZipCode&lt;/property-editor>
+                                    &lt;/content>
+                                &lt;/default-panel>
+                            &lt;/with></font>
+                        &lt;/content>
+                    &lt;/section>
+                &lt;/content>
+            &lt;/block>
+        &lt;/split-form>
+    &lt;/content>
+&lt;/form-editor-page>
+&lt;form-editor-page>
+    &lt;id>EntriesPage&lt;/id>
+    &lt;page-name>entries&lt;/page-name>
+    &lt;page-header-text>purchase order&lt;/page-header-text>
+    &lt;content>
+        &lt;split-form>
+            &lt;orientation>horizontal&lt;/orientation>
+            &lt;scale-vertically>true&lt;/scale-vertically>
+            &lt;block>
+                &lt;content>
+                    &lt;section>
+                        &lt;label>entries&lt;/label>
+                        &lt;content>
+                            <font color="#888888">&lt;property-editor>
+                                &lt;property>Entries&lt;/property>
+                                &lt;scale-vertically>true&lt;/scale-vertically>
+                                &lt;show-label>false&lt;/show-label>
+                                &lt;span>true&lt;/span>
+                                &lt;child-property>Item&lt;/child-property>
+                                &lt;child-property>Description&lt;/child-property>
+                                &lt;child-property>Quantity&lt;/child-property>
+                                &lt;child-property>UnitPrice&lt;/child-property>
+                                &lt;hint>
+                                    &lt;name>column.widths&lt;/name>
+                                    &lt;value>100:1,100:6,100:1,100:1,100:1&lt;/value>
+                                &lt;/hint>
+                                &lt;child-property>Total&lt;/child-property>
+                            &lt;/property-editor></font>
+                        &lt;/content>
+                        &lt;scale-vertically>true&lt;/scale-vertically>
+                    &lt;/section>
+                &lt;/content>
+                &lt;weight>7&lt;/weight>
+            &lt;/block>
+            &lt;block>
+                &lt;weight>3&lt;/weight>
+                &lt;content>
+                    &lt;section>
+                        &lt;label>summary&lt;/label>
+                        &lt;content>
+                            <font color="#888888">&lt;property-editor>Subtotal&lt;/property-editor>
+                            &lt;property-editor>Discount&lt;/property-editor>
+                            &lt;property-editor>Delivery&lt;/property-editor>
+                            &lt;property-editor>Total&lt;/property-editor></font>
+                        &lt;/content>
+                    &lt;/section>
+                &lt;/content>
+            &lt;/block>
+        &lt;/split-form>
+    &lt;/content>
+&lt;/form-editor-page></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/MultiSectionFormEditorPage1.png"/></p>
+
+<p style="margin-left: 20px;"><img src="images/MultiSectionFormEditorPage2.png"/></p>
+
+<h2><a name="XML"><a name="XmlDocumentType">@XmlDocumentType Annotation</a></a></h2>
+
+<p>The new @XmlDocumentType annotation can be used when working with DTD-based documents to easily specify systemId or
+publicId/systemId pair. Sapphire XML binding will manage the XML DOCTYPE declaration.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>@XmlDocumentType( publicId = "-//Sapphire//DTD Root 1.0.0//EN", systemId = "http://www.eclipse.org/sapphire/example.dtd" )
+@XmlBinding( path = "root" )
+
+public interface Root extends IModelElement
+{
+    ...
+}</code></pre>
+
+<p style="margin-left: 20px;">The above declaration will create an XML document like the following.</p>
+
+<pre class="source-code"><code>&lt;?xml version="1.0" encoding="UTF-8"?>
+&lt;!DOCTYPE country PUBLIC "-//Sapphire//DTD Country 1.0.0//EN" "http://www.eclipse.org/sapphire/example.dtd"&gt;
+&lt;root>
+    ...
+&lt;/root></code></pre>
+
+<h2><a name="XmlSchema">@XmlSchema Annotation</a></h2>
+
+<p>The new @XmlSchema annotation can be used when working with XSD-based documents to easily specify schema location for a
+given namespace. Sapphire XML binding will manage the xsi:schemaLocation declaration.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>@XmlNamespace( uri = "http://www.eclipse.org/sapphire/example", prefix = "e" )
+@XmlSchema( namespace = "http://www.eclipse.org/sapphire/example", location = "http://www.eclipse.org/sapphire/example/1.0" )
+@XmlBinding( path = "e:root" )
+
+public interface Root extends IModelElement
+{
+    ...
+}</code></pre>
+
+<p style="margin-left: 20px;">The above declaration will create an XML document like the following.</p>
+
+<pre class="source-code"><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
+&lt;e:root 
+    xmlns:e="http://www.eclipse.org/sapphire/example"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xsi:schemaLocation="http://www.eclipse.org/sapphire/example http://www.eclipse.org/sapphire/example/1.0"&gt;
+    ...
+&lt;/e:root&gt;</code></pre>
+
+<p>To specify locations of multiple schemas, use @XmlSchemas annotation.</p>
+
+<h2><a name="ListElementPropertyBindingNoMappings">List and Element Property Binding Without Mappings</a></h2>
+
+<p>When declaratively specifying XML binding for a list or an element property, the adopter must tell the framework
+what XML element name to use for a given child model element type. In the past, the only way to do that was via
+the mappings attribute of @XmlListBinding or @XmlElementBinding annotation. These declarations can now be made
+via @XmlBinding annotations placed on the model element type. If the property's mappings do not contain
+a declaration for a given model element type, the framework will look for the type's @XmlBinding annotation.</p>
+
+<p>Which approach you choose to use depends on the requirements. Explicitly specifying mappings is useful when
+the same model element type is used in different properties where it must bind to different XML element names.
+Using @XmlBinding on model element type instead of mappings is less verbose and is particularly useful in cases
+where a custom PossibleTypesService is provided. In those situations, list or element property's author may
+not be able to enumerate possible types at design time, so explicitly specifying mappings is not possible.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">The following two listings are equivalent.</p>
+
+<pre class="source-code"><code><font color="#888888">@GenerateImpl</font>
+@XmlBinding( path = "root" )
+
+<font color="#888888">public interface Root extends IModelElement
+{
+    ModelElementType TYPE = new ModelElementType( Root.class );
+
+    // *** List ***
+
+    @Type( base = Child.class, possible = { ChildA.class, ChildB.class } )</font>
+    @XmlListBinding( path = "" )
+
+    <font color="#888888">ListProperty PROP_LIST = new ListProperty( TYPE, "List" );
+
+    ModelElementList&lt;Child> getList();
+
+    ...
+}
+
+public interface Child extends IModelElement
+{
+    ModelElementType TYPE = new ModelElementType( Child.class );
+
+    ...
+}
+
+@GenerateImpl</font>
+@XmlBinding( path = "a" )
+
+<font color="#888888">public interface ChildA extends Child
+{
+    ModelElementType TYPE = new ModelElementType( Child.class );
+
+    ...
+}
+
+@GenerateImpl</font>
+@XmlBinding( path = "b" )
+
+<font color="#888888">public interface ChildB extends Child
+{
+    ModelElementType TYPE = new ModelElementType( Child.class );
+
+    ...
+}</font></code></pre>
+
+<pre class="source-code"><code><font color="#888888">@GenerateImpl</font>
+@XmlBinding( path = "root" )
+
+<font color="#888888">public interface Root extends IModelElement
+{
+    ModelElementType TYPE = new ModelElementType( Root.class );
+
+    // *** List ***
+
+    @Type( base = Child.class, possible = { ChildA.class, ChildB.class } )</font>
+
+    @XmlListBinding
+    (
+        mappings = 
+        {
+            @XmlListBinding.Mapping( element = "a", type = ChildA.class ),
+            @XmlListBinding.Mapping( element = "b", type = ChildB.class )
+        }
+    )
+
+    <font color="#888888">ListProperty PROP_LIST = new ListProperty( TYPE, "List" );
+
+    ModelElementList&lt;Child> getList();
+
+    ...
+}
+
+public interface Child extends IModelElement
+{
+    ModelElementType TYPE = new ModelElementType( Child.class );
+
+    ...
+}
+
+@GenerateImpl
+
+public interface ChildA extends Child
+{
+    ModelElementType TYPE = new ModelElementType( Child.class );
+
+    ...
+}
+
+@GenerateImpl
+
+public interface ChildB extends Child
+{
+    ModelElementType TYPE = new ModelElementType( Child.class );
+
+    ...
+}</font></code></pre>
+
+<h2><a name="Miscellaneous"><a name="Copy">Model Copy Method</a></a></h2>
+
+<p>Easily copy content of model elements using the new copy method. Copy a few model elements or the
+entire model. Even copy across different resource stores.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example, the copy method is used to duplicate the entities held in a list
+property.</p>
+
+<pre class="source-code"><code>ModelElementList&lt;Entity> entities = model.getEntities();
+
+for( int i = 0, n = entities.size; i < n; i++ )
+{
+    final Entity original = entities.get( i );
+    final Entity duplicate = entities.addNewElement();
+    duplicate.copy( original );
+}</code></pre>
+
+<p style="margin-left: 20px;">Here, an entire model is copied to a memory resource. Perhaps the original model
+instance was loaded from disk via an XML resource.</p>
+
+<pre class="source-code"><code>Model original = ...
+Model duplicate = Model.TYPE.instantiate();
+duplicate.copy( original );</code></pre>
+
+<div class="copyright">Copyright (c) 2015 Oracle, Accenture and Liferay<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.4/images/ContentProposalService.png b/releases/8.2.4/documentation/releases/0.4/images/ContentProposalService.png
new file mode 100644
index 0000000..c352c7b
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.4/images/ContentProposalService.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.4/images/FactsService.png b/releases/8.2.4/documentation/releases/0.4/images/FactsService.png
new file mode 100644
index 0000000..a75ab98
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.4/images/FactsService.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.4/images/MultiSectionFormEditorPage1.png b/releases/8.2.4/documentation/releases/0.4/images/MultiSectionFormEditorPage1.png
new file mode 100644
index 0000000..568d271
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.4/images/MultiSectionFormEditorPage1.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.4/images/MultiSectionFormEditorPage2.png b/releases/8.2.4/documentation/releases/0.4/images/MultiSectionFormEditorPage2.png
new file mode 100644
index 0000000..7dc5bb5
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.4/images/MultiSectionFormEditorPage2.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.4/images/SplitForm.png b/releases/8.2.4/documentation/releases/0.4/images/SplitForm.png
new file mode 100644
index 0000000..83c66fd
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.4/images/SplitForm.png
Binary files differ
diff --git a/releases/8.2.4/documentation/releases/0.4/index.html b/releases/8.2.4/documentation/releases/0.4/index.html
new file mode 100644
index 0000000..81668fd
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.4/index.html
@@ -0,0 +1,45 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Sapphire 0.4</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a></div>
+
+
+<h1>Sapphire 0.4</h1>
+
+<ul>
+  <li><a href="enhancements.html">Enhancements</a></li>
+  <li><a href="migration.html">Migration Guide</a></li>
+</ul>
+
+<br/><br/>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.4/migration.html b/releases/8.2.4/documentation/releases/0.4/migration.html
new file mode 100644
index 0000000..ff177d3
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.4/migration.html
@@ -0,0 +1,1489 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Migration Guide for Sapphire 0.4</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+  <style type="text/css">
+    pre.source-code 
+    {
+      font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; 
+      color: #000000;
+      background-color: #ffffff;
+      font-size: 12px;
+      border: 0px;
+      line-height: 14px;
+      padding: 5px;
+      margin-left: 0px;
+      margin-right: 0px;
+      overflow: auto
+    }
+  </style>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a> > <a href="index.html">0&#46;4</a></div>
+
+
+<h1>Migration Guide for Sapphire 0.4</h1>
+
+<p>This documents covers changes that need to be made by Sapphire adopters as part of migrating 
+to Sapphire 0.4 from a prior release. Only changes from the previous major release are covered.</p>
+
+<p>Table of Contents</p>
+
+<ol>
+  <li><a href="#Documentation">Documentation</a></li>
+  <li><a href="#Hints">Hints</a></li>
+  <li><a href="#ValidFileExtensions">ValidFileExtensions</a></li>
+  <li><a href="#Services">Services</a></li>
+  <li><a href="#PossibleTypes">Possible Types</a></li>
+  <li><a href="#ActionHandlerDispose">Action Handler Dispose</a></li>
+  <li><a href="#XmlRootBinding">@XmlRootBinding</a></li>
+  <li><a href="#PropertyEditorAssistContribution">PropertyEditorAssistContribution</a></li>
+</ol>
+
+<h2><a name="Documentation">Documentation</a></h2>
+
+<p>The "href" attribute of the @Documentation.Topic has been renamed to "url" for consistency with
+other API.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Documentation
+( 
+    content = "Sample 32-bit integer property.",
+    topics = 
+    {
+        @Topic( label = "wikipedia",</font> href <font color="#888888">= "http://en.wikipedia.org/wiki/Integer" )
+    }
+)
+
+ValueProperty PROP_INTEGER = new ValueProperty( TYPE, "Integer" );
+
+Value<Integer> getInteger();
+void setInteger( String val );
+void setInteger( Integer val );</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Documentation
+( 
+    content = "Sample 32-bit integer property.",
+    topics = 
+    {
+        @Topic( label = "wikipedia",</font> url <font color="#888888">= "http://en.wikipedia.org/wiki/Integer" )
+    }
+)
+
+ValueProperty PROP_INTEGER = new ValueProperty( TYPE, "Integer" );
+
+Value<Integer> getInteger();
+void setInteger( String val );
+void setInteger( Integer val );</font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>The method for attaching custom code to produce documentation content has changed to align with Sapphire services architecture
+and for general API consistency.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>public class IntegerDocumentationProvider extends DocumentationProviderImpl 
+{
+    @Override
+    public DocumentationData getDocumentationData() 
+    {
+        return new DocumentationData() 
+        {
+            @Override
+            public String getContent() 
+            {
+                return "Sample 32-bit integer property.";
+            }
+
+            @Override
+            public List&lt;DocumentationResource> getTopics() 
+            {
+                final DocumentationResource resource 
+                    = new DocumentationResource( "wikipedia", "http://en.wikipedia.org/wiki/Integer" );
+
+                return Collections.singletonList( resource );
+            }
+        };
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>public class IntegerDocumentationService extends DocumentationService 
+{
+    @Override
+    public String content()
+    {
+        return "Sample 32-bit integer property.";
+    }
+
+    @Override
+    public List&lt;Topic> topics()
+    {
+        final Topic topic = new Topic( "wikipedia", "http://en.wikipedia.org/wiki/Integer" );
+        return Collections.singletonList( topic );
+    }
+}</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@DocumentationProvider( impl = IntegerDocumentationProvider.class )
+
+<font color="#888888">ValueProperty PROP_INTEGER = new ValueProperty( TYPE, "Integer" );
+
+Value<Integer> getInteger();
+void setInteger( String val );
+void setInteger( Integer val );</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@Service( impl = IntegerDocumentationService.class )
+
+<font color="#888888">ValueProperty PROP_INTEGER = new ValueProperty( TYPE, "Integer" );
+
+Value<Integer> getInteger();
+void setInteger( String val );
+void setInteger( Integer val );</font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="Hints">Hints</a></h2>
+
+<p>Some of the hints used to customize behavior in the UI definitions have been turned into explicit
+properties.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;hint>
+        &lt;name>show.label&lt;/name>
+        &lt;value>false&lt;/value>
+    &lt;/hint>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;show-label>false&lt;/show-label>
+    &lt;span>true&lt;/span>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;([ \t]*)&lt;hint>\s*&lt;name>\s*show.label\s*&lt;/name>\s*&lt;value>\s*false\s*&lt;/value>\s*&lt;/hint></nobr><br/>
+<nobr>Replace: &nbsp;\1&lt;show-label>false&lt;/show-label>\n\1&lt;span>true&lt;/span></nobr></p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;hint>
+        &lt;name>show.label.above&lt;/name>
+        &lt;value>true&lt;/value>
+    &lt;/hint>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;span>true&lt;/span>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;([ \t]*)&lt;hint>\s*&lt;name>\s*show.label.above\s*&lt;/name>\s*&lt;value>\s*true\s*&lt;/value>\s*&lt;/hint></nobr><br/>
+<nobr>Replace: &nbsp;\1&lt;span>true&lt;/span></nobr></p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;hint>
+        &lt;name>width&lt;/name>
+        &lt;value>100&lt;/value>
+    &lt;/hint>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;width>100&lt;/width>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;composite></font>
+    &lt;hint>
+        &lt;name>width&lt;/name>
+        &lt;value>100&lt;/value>
+    &lt;/hint>
+<font color="#888888">&lt;/composite></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;composite></font>
+    &lt;width>100&lt;/width>
+<font color="#888888">&lt;/composite></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;([ \t]*)&lt;hint>\s*&lt;name>\s*width\s*&lt;/name>\s*&lt;value>\s*([0-9]*)\s*&lt;/value>\s*&lt;/hint></nobr><br/>
+<nobr>Replace: &nbsp;\1&lt;width>\2&lt;/width></nobr></p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;hint>
+        &lt;name>height&lt;/name>
+        &lt;value>5&lt;/value>
+    &lt;/hint>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;height>75&lt;/height>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+
+      <p>Multiply the old height hint value by 15 to get the same effect. Only do this conversion
+      for the height hint and only for property editors.</p>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;composite></font>
+    &lt;hint>
+        &lt;name>height&lt;/name>
+        &lt;value>100&lt;/value>
+    &lt;/hint>
+<font color="#888888">&lt;/composite></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;composite></font>
+    &lt;height>100&lt;/height>
+<font color="#888888">&lt;/composite></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;([ \t]*)&lt;hint>\s*&lt;name>\s*height\s*&lt;/name>\s*&lt;value>\s*([0-9]*)\s*&lt;/value>\s*&lt;/hint></nobr><br/>
+<nobr>Replace: &nbsp;\1&lt;height>\2&lt;/height></nobr></p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;hint>
+        &lt;name>margin.left&lt;/name>
+        &lt;value>1u&lt;/value>
+    &lt;/hint>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;margin-left>20&lt;/margin-left>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+
+      <p>The margin.left hint supported two suffixes to designate units. The "px" suffix
+      designated pixels, while "u" suffix designated units of 20 pixels. The new property
+      takes a number of pixels with no units suffix.</p>
+    </td>
+  </tr>
+</table>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;([ \t]*)&lt;hint>\s*&lt;name>\s*margin.left\s*&lt;/name>\s*&lt;value>\s*([0-9a-z]*)\s*&lt;/value>\s*&lt;/hint></nobr><br/>
+<nobr>Replace: &nbsp;\1&lt;margin-left>\2&lt;/margin-left></nobr></p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;hint>
+        &lt;name>expand.vertically&lt;/name>
+        &lt;value>true&lt;/value>
+    &lt;/hint>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;property-editor></font>
+    &lt;scale-vertically>true&lt;/scale-vertically>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;([ \t]*)&lt;hint>\s*&lt;name>\s*expand.vertically\s*&lt;/name>\s*&lt;value>\s*([a-z]*)\s*&lt;/value>\s*&lt;/hint></nobr><br/>
+<nobr>Replace: &nbsp;\1&lt;scale-vertically>\2&lt;/scale-vertically></nobr></p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;html></font>
+    &lt;expand-vertically/>
+<font color="#888888">&lt;/html></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;html></font>
+    &lt;scale-vertically>true&lt;/scale-vertically>
+<font color="#888888">&lt;/html></font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p style="margin-left: 20px;"><code>Scope: &nbsp;&nbsp;&nbsp;*.sdef<br/>
+<nobr>Search: &nbsp;&nbsp;&lt;expand-vertically */></nobr><br/>
+<nobr>Replace: &nbsp;&lt;scale-vertically>true&lt;/scale-vertically></nobr></p>
+
+<h2><a name="ValidFileExtensions">ValidFileExtensions</a></h2>
+
+<p>The @ValidFileExtensions annotation has been replaced with @FileExtensions annotation that supports Sapphire
+expression language.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = Path.class )
+@ValidFileSystemResourceType( FileSystemResourceType.FILE )</font>
+@ValidFileExtensions( { "png", "gif", "jpeg" } )
+
+<font color="#888888">ValueProperty PROP_FILE_PATH = new ValueProperty( TYPE, "FilePath" );
+
+Value&lt;Path> getFilePath();
+void setFilePath( String value );
+void setFilePath( Path value );</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = Path.class )
+@ValidFileSystemResourceType( FileSystemResourceType.FILE )</font>
+@FileExtensions( expr = "png,gif,jpeg" )
+
+<font color="#888888">ValueProperty PROP_FILE_PATH = new ValueProperty( TYPE, "FilePath" );
+
+Value&lt;Path> getFilePath();
+void setFilePath( String value );
+void setFilePath( Path value );</font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p><a href="../../services/index.html#FileExtensionsService">See Documentation</a></p>
+
+<h2><a name="Services">Services</a></h2>
+
+<p>The services API has undergone changes to make it more general and to cleanup various inconsistencies.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomService extends</font> ModelElementService
+<font color="#888888">{
+    @Override</font>
+    public <font color="#888888">void init</font>( IModelElement element, String[] params )
+    <font color="#888888">{
+        super.init</font>( element, params )<font color="#888888">;
+
+        String p1 = </font>params[ 0 ]<font color="#888888">;
+        String p2 = </font>params[ 1 ]<font color="#888888">;
+
+        ...
+    }
+
+    public Object perform()
+    {
+        IModelElement element = </font>element()<font color="#888888">;
+
+        ...
+    }
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomService extends</font> Service
+<font color="#888888">{
+    @Override</font>
+    protected <font color="#888888">void init</font>()
+    <font color="#888888">{
+        super.init</font>()<font color="#888888">;
+
+        IModelElement element = </font>context( IModelElement.class )<font color="#888888">;
+
+        String p1 = </font>params( "p1" )<font color="#888888">;
+        String p2 = </font>params( "p2" )<font color="#888888">;
+
+        ...
+    }
+
+    public Object perform()
+    {
+        IModelElement element = </font>context( IModelElement.class )<font color="#888888">;
+
+        ...
+    }
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomServiceFactory extends</font> ModelElementServiceFactory
+<font color="#888888">{
+    @Override
+    public boolean applicable(</font> IModelElement element,
+                               Class&lt;? extends ModelElementService> service <font color="#888888">)
+    {
+        ...
+    }
+
+    @Override
+    public</font> ModelElementService <font color="#888888">create(</font> IModelElement element,
+                                       Class&lt;? extends ModelElementService> service <font color="#888888">)
+    {
+        ...
+    }
+}</font></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomServiceFactory extends</font> ServiceFactory
+<font color="#888888">{
+    @Override
+    public boolean applicable(</font> ServiceContext context,
+                               Class&lt;? extends Service> service <font color="#888888">)
+    {</font>
+        IModelElement element = context.find( IModelElement.class );
+
+        <font color="#888888">...
+    }
+
+    @Override
+    public</font> Service <font color="#888888">create(</font> ServiceContext context,
+                           Class&lt;? extends Service> service <font color="#888888">)
+    {</font>
+        IModelElement element = context.find( IModelElement.class );
+
+        <font color="#888888">...
+    }
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;extension></font>
+    &lt;model-element-service>
+        <font color="#888888">&lt;id>Sample.CustomService&lt;/id>
+        &lt;type>org.eclipse.sapphire.samples.CustomService&lt;/type>
+        &lt;factory>org.eclipse.sapphire.samples.internal.CustomServiceFactory&lt;/factory></font>
+    &lt;/model-element-service>
+<font color="#888888">&lt;/extension></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;extension></font>
+    &lt;service>
+        <font color="#888888">&lt;id>Sample.CustomService&lt;/id>
+        &lt;type>org.eclipse.sapphire.samples.CustomService&lt;/type>
+        &lt;factory>org.eclipse.sapphire.samples.internal.CustomServiceFactory&lt;/factory></font>
+        &lt;context>Sapphire.Element.Instance&lt;/context></font>
+    &lt;/service>
+<font color="#888888">&lt;/extension></font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomService extends</font> ModelPropertyService
+<font color="#888888">{
+    @Override</font>
+    public <font color="#888888">void init</font>( IModelElement element, ModelProperty property, String[] params )
+    <font color="#888888">{
+        super.init</font>( element, property, params )<font color="#888888">;
+
+        String p1 = </font>params[ 0 ]<font color="#888888">;
+        String p2 = </font>params[ 1 ]<font color="#888888">;
+
+        ...
+    }
+
+    public Object perform()
+    {
+        IModelElement element = </font>element()<font color="#888888">;
+        ModelProperty property = </font>property()<font color="#888888">;
+
+        ...
+    }
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomService extends</font> Service
+<font color="#888888">{
+    @Override</font>
+    protected <font color="#888888">void init</font>()
+    <font color="#888888">{
+        super.init</font>()<font color="#888888">;
+
+        IModelElement element = </font>context( IModelElement.class )<font color="#888888">;
+        ModelProperty property = </font>context( ModelProperty.class )<font color="#888888">;
+
+        String p1 = </font>params( "p1" )<font color="#888888">;
+        String p2 = </font>params( "p2" )<font color="#888888">;
+
+        ...
+    }
+
+    public Object perform()
+    {
+        IModelElement element = </font>context( IModelElement.class )<font color="#888888">;
+        ModelProperty property = </font>context( ModelProperty.class )<font color="#888888">;
+
+        ...
+    }
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomServiceFactory extends</font> ModelPropertyServiceFactory
+<font color="#888888">{
+    @Override
+    public boolean applicable(</font> IModelElement element,
+                               ModelProperty property,
+                               Class&lt;? extends ModelPropertyService> service <font color="#888888">)
+    {
+        ...
+    }
+
+    @Override
+    public</font> ModelPropertyService <font color="#888888">create(</font> IModelElement element,
+                                        ModelProperty property,
+                                        Class&lt;? extends ModelPropertyService> service <font color="#888888">)
+    {
+        ...
+    }
+}</font></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomServiceFactory extends</font> ServiceFactory
+<font color="#888888">{
+    @Override
+    public boolean applicable(</font> ServiceContext context,
+                               Class&lt;? extends Service> service <font color="#888888">)
+    {</font>
+        IModelElement element = context.find( IModelElement.class );
+        ModelProperty property = context.find( ModelProperty.class );
+
+        <font color="#888888">...
+    }
+
+    @Override
+    public</font> Service <font color="#888888">create(</font> ServiceContext context,
+                           Class&lt;? extends Service> service <font color="#888888">)
+    {</font>
+        IModelElement element = context.find( IModelElement.class );
+        ModelProperty property = context.find( ModelProperty.class );
+
+        <font color="#888888">...
+    }
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;extension></font>
+    &lt;model-property-service>
+        <font color="#888888">&lt;id>Sample.CustomService&lt;/id>
+        &lt;type>org.eclipse.sapphire.samples.CustomService&lt;/type>
+        &lt;factory>org.eclipse.sapphire.samples.internal.CustomServiceFactory&lt;/factory></font>
+    &lt;/model-property-service>
+<font color="#888888">&lt;/extension></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;extension></font>
+    &lt;service>
+        <font color="#888888">&lt;id>Sample.CustomService&lt;/id>
+        &lt;type>org.eclipse.sapphire.samples.CustomService&lt;/type>
+        &lt;factory>org.eclipse.sapphire.samples.internal.CustomServiceFactory&lt;/factory></font>
+        &lt;context>Sapphire.Property.Instance&lt;/context></font>
+    &lt;/service>
+<font color="#888888">&lt;/extension></font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">ValueProperty PROP_SAMPLE = new ValueProperty( TYPE, "Sample" );
+
+@Service( impl = CustomService.class, params = {</font> "a", "b" <font color="#888888">} )
+
+Value&lt;String> getSample();
+void setSample( String value );</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">ValueProperty PROP_SAMPLE = new ValueProperty( TYPE, "Sample" );
+
+@Service
+(
+    impl = CustomService.class, 
+    params = 
+    {</font> 
+        @Service.Param( name = "p1", value = "a" ), 
+        @Service.Param( name = "p2", value = "b" ) 
+    <font color="#888888">}
+)
+
+Value&lt;String> getSample();
+void setSample( String value );</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;extension></font>
+    &lt;value-serialization-service>
+        &lt;type>org.eclipse.sapphire.samples.Circle&lt;/type>
+        &lt;impl>org.eclipse.sapphire.samples.internal.CircleSerializationService&lt;/impl>
+    &lt;/value-serialization-service>
+<font color="#888888">&lt;/extension></font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">&lt;extension></font>
+    &lt;service>
+        &lt;id>Sample.ValueSerializationService.Circle&lt;/id>
+        &lt;type>org.eclipse.sapphire.services.ValueSerializationService&lt;/type>
+        &lt;context>Sapphire.Property.Instance&lt;/context>
+        &lt;factory>org.eclipse.sapphire.samples.internal.CircleSerializationServiceFactory&lt;/factory>
+    &lt;/service>
+<font color="#888888">&lt;/extension></font>
+
+public class CircleSerializationServiceFactory extends ServiceFactory
+{
+    @Override
+    public boolean applicable( ServiceContext context,
+                               Class&lt;? extends Service> service )
+    {
+        ValueProperty property = context.find( ValueProperty.class ); 
+        return ( property != null && property.isOfType( Circle.class ) );
+    }
+
+    @Override
+    public Service create( ServiceContext context,
+                           Class&lt;? extends Service> service )
+    {
+        return new CircleSerializationService();
+    }
+}</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">ValueProperty PROP_SAMPLE = new ValueProperty( TYPE, "Sample" );
+
+@Type( base = Circle.class )
+</font>@ValueSerialization( service = <font color="#888888">CircleSerializationService.class</font> )
+
+<font color="#888888">Value&lt;Circle> getSample();
+void setSample( String value );
+void setSample( Circle value );</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">ValueProperty PROP_SAMPLE = new ValueProperty( TYPE, "Sample" );
+
+@Type( base = Circle.class )
+</font>@Service( impl = <font color="#888888">CircleSerializationService.class</font> )
+
+<font color="#888888">Value&lt;Circle> getSample();
+void setSample( String value );
+void setSample( Circle value );</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">ValueProperty PROP_SAMPLE = new ValueProperty( TYPE, "Sample" );
+
+</font>@DerivedValue( service = <font color="#888888">SampleDerivedValueService.class</font> )
+
+<font color="#888888">Value&lt;String> getSample();</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">ValueProperty PROP_SAMPLE = new ValueProperty( TYPE, "Sample" );
+
+</font>@Derived
+@Service( impl = <font color="#888888">SampleDerivedValueService.class</font> )
+
+<font color="#888888">Value&lt;String> getSample();</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomValidationService extends</font> ModelPropertyValidationService&lt;Value&lt;String>>
+<font color="#888888">{
+    @Override
+    public Status validate()
+    {
+        final Value&lt;String> value = </font>target()<font color="#888888">;
+
+        ...
+    }
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomValidationService extends</font> ValidationService
+<font color="#888888">{
+    @Override
+    public Status validate()
+    {
+        final Value&lt;String> value = </font>context( IModelElement.class ).read( context( ValueProperty.class ) )<font color="#888888">;
+
+        ...
+    }
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomDefaultValueService extends DefaultValueService
+{
+    @Override</font>
+    public String getDefaultValue<font color="#888888">()
+    {
+        String value;
+
+        ...
+
+        return</font> value<font color="#888888">;
+    }
+
+    ...
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomDefaultValueService extends DefaultValueService
+{</font>
+    @Override
+    protected DefaultValueServiceData data()
+    {
+        refresh();
+        return super.data();
+    }
+
+    <font color="#888888">@Override</font>
+    protected DefaultValueServiceData compute<font color="#888888">()
+    {
+        String value;
+
+        ...
+
+        return</font> new DefaultValueServiceData( value )<font color="#888888">;
+    }
+
+    ...
+}</font></code></pre>
+
+<p>The above represents the quickest way to migrate an existing default value service, but is far from
+ideal. A better solution would be to not override the data() method with a refresh on every invocation.
+To do that, the service would need to listen on changes to data used in the compute() method and call
+refresh() method when that data changes.</p>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomDependenciesService extends DependenciesService
+{
+    @Override
+    protected</font> void <font color="#888888">compute</font>( Set&lt;ModelPath> dependencies )
+    <font color="#888888">{
+        dependencies.add( ... );
+        dependencies.add( ... );
+
+        ...
+    }
+
+    ...
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomDependenciesService extends DependenciesService
+{
+    @Override
+    protected</font> DependenciesServiceData <font color="#888888">compute</font>()
+    <font color="#888888">{</font>
+        List&lt;ModelPath> dependencies = new ArrayList&lt;ModelPath>();
+
+        <font color="#888888">dependencies.add( ... );
+        dependencies.add( ... );
+
+        ...</font>
+
+        return new DependenciesServiceData( dependencies );
+    <font color="#888888">}
+
+    ...
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomDerivedValueService extends DerivedValueService
+{
+    @Override</font>
+    public String getDerivedValue<font color="#888888">()
+    {
+        String value;
+
+        ...
+
+        return</font> value<font color="#888888">;
+    }
+
+    ...
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomDerivedValueService extends DerivedValueService
+{
+    @Override</font>
+    protected DerivedValueServiceData compute<font color="#888888">()
+    {
+        String value;
+
+        ...
+
+        return</font> new DerivedValueServiceData( value )<font color="#888888">;
+    }
+
+    ...
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomEnablementService extends EnablementService
+{
+    @Override
+    protected void initEnablementService</font>( IModelElement element,
+                                          ModelProperty property,
+                                          String[] params )<font color="#888888">
+    {
+        ...
+    }
+
+    @Override
+    protected</font> boolean <font color="#888888">compute()
+    {
+        boolean enablement;
+
+        ...
+
+        return</font> enablement<font color="#888888">;
+    }
+
+    ...
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomEnablementService extends EnablementService
+{
+    @Override
+    protected void initEnablementService</font>()<font color="#888888">
+    {</font>
+        final IModelElement element = context( IModelElement.class );
+        final ModelProperty property = context( ModelProperty.class );
+        final String p1 = param( "p1" );
+        final String p2 = param( "p2" );
+
+        <font color="#888888">...
+    }
+
+    @Override
+    protected</font> EnablementServiceData <font color="#888888">compute()
+    {
+        boolean enablement;
+
+        ...
+
+        return</font> new EnablementServiceData( enablement )<font color="#888888">;
+    }
+
+    ...
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomFileExtensionsService extends FileExtensionsService
+{
+    @Override
+    protected void initFileExtensionsService</font>( IModelElement element,
+                                              ModelProperty property,
+                                              String[] params )<font color="#888888">
+    {
+        ...
+    }
+
+    @Override
+    protected</font> void <font color="#888888">compute</font>( List&lt;String> extensions )
+    <font color="#888888">{
+        extensions.add( ... );
+        extensions.add( ... );
+
+        ...
+    }
+
+    ...
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomFileExtensionsService extends FileExtensionsService
+{
+    @Override
+    protected void initFileExtensionsService</font>()<font color="#888888">
+    {</font>
+        final IModelElement element = context( IModelElement.class );
+        final ModelProperty property = context( ModelProperty.class );
+        final String p1 = param( "p1" );
+        final String p2 = param( "p2" );
+
+        <font color="#888888">...
+    }
+
+    @Override
+    protected</font> FileExtensionsServiceData <font color="#888888">compute</font>()
+    <font color="#888888">{</font>
+        List&lt;String> extensions = new ArrayList&lt;String>();
+
+        <font color="#888888">extensions.add( ... );
+        extensions.add( ... );
+
+        ...</font>
+
+        return new FileExtensionsServiceData( extensions );
+    <font color="#888888">}
+
+    ...
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomImageService extends ImageService
+{
+    @Override
+    protected void</font> init<font color="#888888">()
+    {</font>
+        super.init();
+
+        <font color="#888888">// Listen on entities that influence image choice.
+        // Call </font>broadcast<font color="#888888">() when something has changed.
+
+        ...
+    }
+
+    @Override</font>
+    public ImageData provide<font color="#888888">()
+    {
+        ImageData image;
+
+        ...
+
+        return</font> image<font color="#888888">;
+    }
+
+    ...
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomImageService extends ImageService
+{</font>
+    @Override
+    protected void</font> initImageService<font color="#888888">()
+    {</font>
+        <font color="#888888">// Listen on entities that influence image choice.
+        // Call </font>refresh<font color="#888888">() when something has changed.
+
+        ...
+    }
+
+    <font color="#888888">@Override</font>
+    protected ImageServiceData compute<font color="#888888">()
+    {
+        ImageData image;
+
+        ...
+
+        return</font> new ImageServiceData( image )<font color="#888888">;
+    }
+
+    ...
+}</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>ModelService.Listener <font color="#888888">listener = new </font>ModelService.Listener<font color="#888888">()
+{
+    public void</font> handleEvent<font color="#888888">(</font> ModelService.Event <font color="#888888">event )
+    {
+        ...
+    }
+}
+
+service.</font>addListener<font color="#888888">( listener );
+
+...
+
+service.</font>removeListener<font color="#888888">( listener );
+
+...
+
+while inside service
+{</font>
+    notifyListeners( new ModelService.Event( this ) );
+<font color="#888888">}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>Listener <font color="#888888">listener = new </font>Listener<font color="#888888">()
+{
+    public void</font> handle<font color="#888888">(</font> Event <font color="#888888">event )
+    {
+        ...
+    }
+}
+
+service.</font>attach<font color="#888888">( listener );
+
+...
+
+service.</font>detach<font color="#888888">( listener );
+
+...
+
+while inside service
+{</font>
+    broadcast();
+}<font color="#888888"></font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = Date.class )</font>
+
+@ValueSerialization
+(
+    service = DateSerializationService.class, 
+    params = { "yyyy.MM.dd", "MM/dd/yyyy" }
+)
+
+<font color="#888888">ValueProperty PROP_DATE = new ValueProperty( TYPE, "Date" );
+
+Value<Date> getDate();
+void setDate( String value );
+void setDate( Date value );</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">@Type( base = Date.class )</font>
+
+@Service
+(
+    impl = DateSerializationService.class, 
+    params =
+    { 
+        @Service.Param( name = "format-1", value = "yyyy.MM.dd" ), 
+        @Service.Param( name = "format-2", value = "MM/dd/yyyy" )
+    }
+)
+
+<font color="#888888">ValueProperty PROP_DATE = new ValueProperty( TYPE, "Date" );
+
+Value<Date> getDate();
+void setDate( String value );
+void setDate( Date value );</font></code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomValidationService extends UniqueValueValidationService</font>&lt;String>
+<font color="#888888">{
+    @Override
+    protected boolean isUniqueValue( Value&lt;</font>String<font color="#888888">> value )
+    {
+        ...
+    }
+}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomValidationService extends UniqueValueValidationService
+{
+    @Override
+    protected boolean isUniqueValue( Value&lt;</font>?<font color="#888888">> value )
+    {
+        ...
+    }
+}</font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<p>All core services have been consolidated in a single package. Some of them were renamed in the process.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling<font color="#888888">.DefaultValueService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.DefaultValueService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling<font color="#888888">.DerivedValueService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.DerivedValueService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling<font color="#888888">.EnablementService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.EnablementService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling<font color="#888888">.ImageService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.ImageService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling<font color="#888888">.PossibleValuesService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.PossibleValuesService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling<font color="#888888">.ReferenceService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.ReferenceService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling<font color="#888888">.RelativePathService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.RelativePathService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling<font color="#888888">.StandardValueNormalizationService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.StandardValueNormalizationService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling.ModelPropertyValidationService</code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services.ValidationService</code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling<font color="#888888">.ValueImageService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.ValueImageService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling<font color="#888888">.ValueLabelService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.ValueLabelService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling<font color="#888888">.ValueNormalizationService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.ValueNormalizationService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling.serialization<font color="#888888">.DateSerializationService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.DateSerializationService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling.serialization<font color="#888888">.ValueSerializationService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.ValueSerializationService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling.validation<font color="#888888">.PathValidationService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.PathValidationService</font></code></td>
+  </tr>
+  <tr>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>modeling.validation<font color="#888888">.UniqueValueValidationService</font></code></td>
+    <td><code><font color="#888888">org.eclipse.sapphire.</font>services<font color="#888888">.UniqueValueValidationService</font></code></td>
+  </tr>
+</table>
+
+<h2><a name="PossibleTypes">Possible Types</a></h2>
+
+<p>The set of possible types for a list or an element property is no longer restricted to be static. As such, previous API for
+retrieving possible types for a property has been replaced with a more flexible service API.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>List&lt;ModelElementType> types = property.getAllPossibleTypes();</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>SortedSet&lt;ModelElementType> types = element.service( property, PossibleTypesService.class ).types();</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>List&lt;Class&lt;?>> types = property.getAllPossibleTypeClasses();</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>List&lt;Class&lt;?>> types = new ArrayList&lt;Class&lt;?>>();
+
+for( ModelElementType type : element.service( property, PossibleTypesService.class ).types() )
+{
+    types.add( type.getModelElementClass() );
+}</code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="ActionHandlerDispose">Action Handler Dispose</a></h2>
+
+<p>The pattern of overriding the dispose method on SapphireActionHandler has been replaced with a dispose event. This
+architecture eliminates resource leaks caused by failing to call super.dispose() when overriding the dispose method.</p>  
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class ExampleActionHandler extends SapphireActionHandler
+{
+    ...</font>
+
+    @Override
+    public void dispose()
+    {
+        super.dispose();
+
+        // Dispose logic goes here.
+    }
+<font color="#888888">}</font></code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class ExampleActionHandler extends SapphireActionHandler
+{
+    ...</font>
+
+    @Override
+    public void init( SapphireAction action, ISapphireActionHandlerDef def )
+    {
+        super.init( action, def );
+
+        attach
+        (
+            new Listener()
+            {
+                @Override
+                public void handle( Event event )
+                {
+                    if( event instanceof DisposeEvent )
+                    {
+                        // Dispose logic goes here.
+                    }
+                }
+            }
+        );
+    }
+<font color="#888888">}</font></code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="XmlRootBinding">@XmlRootBinding</a></h2>
+
+<p>The @XmlRootBinding annotation has been re-worked to reduce functional overlap with other annotations and to allow 
+the XML binding API to more easily adapt to different kinds of XML document type specification technologies. Scenarios
+previously handled by @XmlRootBinding annotation are now handled by different combinations of @XmlBinding, @XmlNamespace,
+@XmlSchema and @XmlDocumentType annotations.</p> 
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@XmlRootBinding( elementName = "root" )</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@XmlBinding( path = "root" )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@XmlRootBinding
+(
+    elementName = "root",
+    namespace = "http://www.eclipse.org/sapphire/example"
+)</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@XmlNamespace( uri = "http://www.eclipse.org/sapphire/example" )
+@XmlBinding( path = "root" )</code></pre>
+    </td>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code>@XmlRootBinding
+(
+    elementName = "root",
+    namespace = "http://www.eclipse.org/sapphire/example",
+    schemaLocation = "http://www.eclipse.org/sapphire/example/1.0",
+    defaultPrefix = "e"
+)</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code>@XmlNamespace( uri = "http://www.eclipse.org/sapphire/example", prefix = "e" )
+
+@XmlSchema
+(
+    namespace = "http://www.eclipse.org/sapphire/example",
+    location = "http://www.eclipse.org/sapphire/example/1.0"
+)
+
+@XmlBinding( path = "e:root" )</code></pre>
+    </td>
+  </tr>
+</table>
+
+<h2><a name="PropertyEditorAssistContribution">PropertyEditorAssistContribution</a></h2>
+
+<p>The PropertyEditorAssistContribution API has changed to remove dependencies on SWT/JFace and to make contribution
+immutable once created.</p>
+
+<table>
+  <tr>
+    <th>Before</th>
+    <th>After</th>
+  </tr>
+  <tr>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomContributor extends PropertyEditorAssistContributor
+{
+    @Override
+    public void contribute( PropertyEditorAssistContext context )
+    {</font>
+        PropertyEditorAssistContribution <font color="#888888">contribution = </font>new PropertyEditorAssistContribution<font color="#888888">();
+
+        contribution.</font>setText<font color="#888888">( ... );
+        contribution.</font>setImage<font color="#888888">( "CustomImageId", </font>(Image) <font color="#888888">... );</font>
+
+        contribution.setHyperlinkListener
+        (
+            new HyperlinkAdapter()
+            {
+                @Override
+                public void linkActivated( HyperlinkEvent event )
+                {
+                    ...
+                }
+            }
+        );
+
+        <font color="#888888">PropertyEditorAssistSection section = context.getSection( ... );
+        section.addContribution( </font>contribution<font color="#888888"> );
+    }
+}</code></pre>
+    </td>
+    <td>
+<pre class="source-code"><code><font color="#888888">public class CustomContributor extends PropertyEditorAssistContributor
+{
+    @Override
+    public void contribute( PropertyEditorAssistContext context )
+    {</font>
+        PropertyEditorAssistContribution.Factory <font color="#888888">contribution = </font>PropertyEditorAssistContribution.factory<font color="#888888">();
+
+        contribution.</font>text<font color="#888888">( ... );
+        contribution.</font>image<font color="#888888">( "CustomImageId", </font>(ImageData) <font color="#888888">... );</font>
+
+        contribution.link
+        (
+            "CustomActionId",
+            new Runnable()
+            {
+                public void run()
+                {
+                    ...
+                }
+            }
+        );
+
+        <font color="#888888">PropertyEditorAssistSection section = context.getSection( ... );
+        section.addContribution( </font>contribution.create()<font color="#888888"> );
+    }
+}</code></pre>
+    </td>
+  </tr>
+</table>
+
+<div class="copyright">Copyright (c) 2015 Oracle<br/>
+Content made available under the terms of <a href="http://www.eclipse.org/legal/epl-v10.html">Eclipse Public License</a>.</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/releases/8.2.4/documentation/releases/0.5/enhancements.html b/releases/8.2.4/documentation/releases/0.5/enhancements.html
new file mode 100644
index 0000000..d00f577
--- /dev/null
+++ b/releases/8.2.4/documentation/releases/0.5/enhancements.html
@@ -0,0 +1,803 @@
+<!-- 
+ ******************************************************************************
+ * Copyright (c) 2015 Oracle and Liferay
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    Konstantin Komissarchik - initial implementation and ongoing maintenance
+ *    Gregory Amerson - [372359] Provide means to extend the behavior of adapt methods
+ *    Gregory Amerson - [358295] Need access to selection in list property editor
+ *    Gregory Amerson - [346172] Support zoom, print and save as image actions
+ ******************************************************************************
+-->
+
+<html>
+
+<head>
+  <title>Enhancements in Sapphire 0.5</title>
+  <link rel="StyleSheet" href="../../style.css" TYPE="text/css"/>
+
+
+
+
+
+
+</head>
+
+<body>
+<div class="help_breadcrumbs"><a href="index.html">Sapphire Developer Guide</a> > <a href="index.html">Releases</a> > <a href="index.html">0&#46;5</a></div>
+
+
+<h1>Enhancements in Sapphire 0.5</h1>
+
+<ol>
+  <li><a href="#Diagrams">Diagrams</a></li>
+  <ol type="a">
+    <li><a href="#Diagrams-GEF">Straight to GEF</a></li>
+    <li><a href="#Diagrams-FlexibleLayoutPersistence">Flexible Layout Persistence</a></li>
+    <li><a href="#Diagrams-ContextHelp">Context Help</a></li>
+    <li><a href="#Diagrams-Header">Header</a></li>
+    <li><a href="#Diagrams-NewActions">New Actions</a></li>
+    <li><a href="#Diagrams-MultiSelectActions">Multi-Select Actions</a></li>
+    <li><a href="#Diagrams-FloatingToolBar">Floating Tool Bar</a></li>
+  </ol>
+  <li><a href="#Forms">Forms</a></li>
+  <ol type="a">
+    <li><a href="#Forms-DragAndDrop">Drag-n-Drop</a></li>
+    <li><a href="#Forms-PopUpListFieldForPossibleValues">Pop-Up List Field Presentation for Possible Value Properties</a></li>
+    <li><a href="#Forms-FlexibleActuatorPresentation">Flexible Actuator Presentation</a></li>
+    <li><a href="#Forms-ExprForPropertyEditorLabel">Expression for Property Editor Label</a></li>
+  </ol>
+  <li><a href="#Services">Services</a></li>
+  <ol type="A">
+    <li><a href="#Services-PartServices">Part Services</a></li>
+    <li><a href="#Services-AdapterService">AdapterService</a></li>
+    <li><a href="#Services-DiagramLayoutPersistenceService">DiagramLayoutPersistenceService</a></li>
+    <li><a href="#Services-DragAndDropService">DragAndDropService</a></li>
+    <li><a href="#Services-EqualityService">EqualityService</a></li>
+    <li><a href="#Services-ListSelectionService">ListSelectionService</a></li>
+    <li><a href="#Services-ValidationServiceAtElementLevel">ValidationService at Element Level</a></li>
+  </ol>
+  <li><a href="#Miscellaneous">Miscellaneous</a></li>
+  <ol type="A">
+    <li><a href="#Miscellaneous-ModelElementDisposed">IModelElement.disposed()</a></li>
+    <li><a href="#Miscellaneous-ImageFunction">Image Function</a></li>
+    <li><a href="#Miscellaneous-PropagatedKeyBindings">Propagated Key Bindings</a></li>
+    <li><a href="#Miscellaneous-ActionToolTips">Action Tool Tips</a></li>
+  </ol>
+</ol>
+
+<h2><a name="Diagrams"><a name="Diagrams-GEF">Straight to GEF</a></a></h2>
+
+<p>The Graphiti-based diagram presentation (introduced in 0.4 release) has been replaced with a presentation 
+written directly on top of GEF. This has significantly reduced Sapphire's dependencies and enabled diagram 
+support to more tightly integrate with the rest of Sapphire.</p> 
+
+<h2><a name="Diagrams-FlexibleLayoutPersistence">Flexible Diagram Layout Persistence</a></h2>
+
+<p>Customize how diagram layout is persisted by implementing 
+<a href="../../services/index.html#DiagramLayoutPersistenceService">DiagramLayoutPersistenceService</a>
+or take advantage of one of the provided implementations:</p>
+
+<ol>
+  <li><b>side-by-side</b> - Layout is persisted in a separate file alongside the file being edited.</li>
+  <li><b>project</b> - Layout is persisted in a semi-hidden file in project's .settings folder.</li>
+  <li><b>workspace (default)</b> - Layout is persisted in workspace's .metadata folder.</li>
+</ol>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">&lt;diagram-page></font>
+  &lt;layout-persistence>project&lt;/layout-persistence>                
+<font color="#888888">&lt;/diagram-page></font></code></pre>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">The architecture sample provides a comprehensive example of a custom 
+<a href="../../services/index.html#DiagramLayoutPersistenceService">DiagramLayoutPersistenceService</a> 
+implementation that persists layout in the same file as data.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;diagram-page></font>
+  &lt;layout-persistence>custom&lt;/layout-persistence>
+  &lt;service>
+    &lt;implementation>ArchitectureDiagramLayoutPersistenceService&lt;/implementation>
+  &lt;/service>
+<font color="#888888">&lt;/diagram-page></font></code></pre>
+
+<h2><a name="Diagrams-ContextHelp">Diagram Context Help</a></h2>
+
+<p>Expose context sensitive help in a diagram by annotating the model being edited with @Documentation
+annotations. When "F1" is pressed in a diagram, context help will come from the model element associated
+with the selected node or connection. If nothing is selected, the context help will come from the model element
+associated with the diagram.</p>
+
+<h2><a name="Diagrams-Header">Diagram Header</a></h2>
+
+<p>Diagram editor page now displays a header just like the form editor page. The header shows page title and provides 
+another place for page-level actions. To contribute actions to the header, use Sapphire.Diagram.Header context at
+diagram page level.</p>
+
+<p style="margin-left: 20px;"><img src="images/DiagramHeader.png"/></p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">&lt;diagram-page>
+  &lt;action>
+    &lt;id>Sample.OpenSapphireWebSite&lt;/id>
+    &lt;label>Sapphire Web Site&lt;/label>
+    &lt;tooltip>Open Sapphire Web Site (Ctrl+Alt+Shift+S)&lt;/tooltip>
+    &lt;key-binding>CONTROL+ALT+SHIFT+s&lt;/key-binding>
+    &lt;key-binding-behavior>propagated&lt;/key-binding-behavior>
+    &lt;context>Sapphire.Diagram.Editor&lt;/context></font>
+    &lt;context>Sapphire.Diagram.Header&lt;/context>
+    <font color="#888888">&lt;location>after:Sapphire.Diagram.Print&lt;/location>
+    &lt;group>Sample.OpenSapphireWebSite&lt;/group>
+    &lt;image>Web.png&lt;/image>
+    &lt;hint>
+      &lt;name>style&lt;/name>
+      &lt;value>image+text&lt;/value>
+    &lt;/hint>
+  &lt;/action>
+  &lt;action-handler>
+    &lt;action>Sample.OpenSapphireWebSite&lt;/action>
+    &lt;id>Sample.OpenSapphireWebSite&lt;/id>
+    &lt;label>Sapphire Web Site&lt;/label>
+    &lt;impl>OpenSapphireWebSiteActionHandler&lt;/impl>
+  &lt;/action-handler>
+&lt;/diagram-page></font></code></pre>
+
+<h2><a name="Diagrams-NewActions">New Diagram Actions</a></h2>
+
+<p>Easily delete all bend points for one or more connections.</p>
+
+<p>Select all diagram parts or just the nodes using a pair of new actions. Alternatively, use
+Ctrl + A key binding to select everything.</p>
+
+<p>Use zoom actions to magnify or shrink the diagram for a better view. The zoom level is persisted between
+editing sessions.</p>
+
+<p>Print the diagram or save it as an image to share with others.</p>
+
+<p style="margin-left: 20px;"><img src="images/DiagramActions.png"/></p>
+
+<h2><a name="Diagrams-MultiSelectActions">Multi-Select Actions in Diagrams</a></h2>
+
+<p>Develop actions that work in the context where multiple nodes and/or connections are selected. Such
+actions should specify Sapphire.Diagram.MultipleParts context and be contributed at diagram page level.</P>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>public class ExampleActionHandler extends SapphireActionHandler
+{
+    @Override
+    protected Object run( SapphireRenderingContext context ) 
+    {
+        final SapphireDiagramEditorPagePart page = (SapphireDiagramEditorPagePart) getPart();
+
+        for( ISapphirePart selectedPart : page.getSelections() )
+        {
+            if( selectedPart instanceof DiagramNodePart )
+            {
+                ...
+            }
+            else if( selectedPart instanceof DiagramConnectionPart )
+            {
+                ...
+            }
+        }
+
+        ...
+
+        return null;
+    }
+}</code></pre>
+
+<pre class="source-code"><code><font color="#888888">&lt;diagram-page>
+    &lt;action>
+        &lt;id>Example&lt;/id>
+        &lt;label>example&lt;/label></font>
+        &lt;context>Sapphire.Diagram.MultipleParts&lt;/context>
+    <font color="#888888">&lt;/action>
+    &lt;action-handler>
+        &lt;action>Example&lt;/action>
+        &lt;impl>ExampleActionHandler&lt;/impl>
+    &lt;/action-handler>
+&lt;/diagram-page></font></code></pre>
+
+<h2><a name="Diagrams-FloatingToolBar">Floating Tool Bar on Diagram Nodes</a></h2>
+
+<p>A floating toolbar is now displayed around a diagram node when the mouse hovers
+over it. It contains all the actions that are applicable to the node.</p>
+
+<p style="margin-left: 20px;"><img src="images/DiagramFloatingToolBar.png"/></p>
+
+<h2><a name="Forms"><a name="Forms-DragAndDrop">Drag-n-Drop in Forms</a></a></h2>
+
+<p>Use drag-n-drop to arrange the elements in the content outline and in table property editors.</p>
+
+<p style="margin-left: 20px;"><img src="images/FormDragAndDrop.png"/></p>
+
+<h2><a name="Forms-PopUpListFieldForPossibleValues">Pop-Up List Field Presentation for Possible Value Properties</a></h2>
+
+<p>Two pop-up list field presentations (editable and strict) have been added for properties with a possible
+values constraint. The default presentation remains a text field with a browse button and content
+assist. The new presentations are available for both stand-alone property editors and when a property is
+edited within a table.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example, two properties are used to illustrate the different options. The Color property 
+specifies an error for the severity of deviation from the possible values constraint, while the Shape 
+property specifies a warning.</p>
+
+<p style="margin-left: 20px;">The default presentation is a text field with a browse button and content assist.</p>
+
+<p style="margin-left: 20px;"><img src="images/PopUpListFieldForPossibleValues-1.png"/></p>
+
+<p style="margin-left: 20px;">An editable pop-up list field presentation can be used by specifying <nobr><i>Sapphire.PropertyEditor.PopUpListField.Editable</i></nobr> as 
+the presentation style. This presentation is most appropriate when the severity of deviation from the possible values 
+constraint is something other than an error.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor>
+    &lt;property>Color&lt;/property></font>
+    &lt;style>Sapphire.PropertyEditor.PopUpListField.Editable&lt;/style>
+<font color="#888888">&lt;/property-editor>
+&lt;property-editor>
+    &lt;property>Shape&lt;/property></font>
+    &lt;style>Sapphire.PropertyEditor.PopUpListField.Editable&lt;/style>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/PopUpListFieldForPossibleValues-2.png"/></p>
+
+<p style="margin-left: 20px;">A strict pop-up list field presentation can be used by specifying <nobr><i>Sapphire.PropertyEditor.PopUpListField.Strict</i></nobr> as 
+the presentation style. This presentation is most appropriate when the severity of deviation from the possible 
+values constraint is an error.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor>
+    &lt;property>Color&lt;/property></font>
+    &lt;style>Sapphire.PropertyEditor.PopUpListField.Strict&lt;/style>
+<font color="#888888">&lt;/property-editor>
+&lt;property-editor>
+    &lt;property>Shape&lt;/property></font>
+    &lt;style>Sapphire.PropertyEditor.PopUpListField.Strict&lt;/style>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/PopUpListFieldForPossibleValues-3.png"/></p>
+
+<p style="margin-left: 20px;">Alternatively, let the framework choose between editable and strict pop-up list field styles depending on the property's 
+possible values constraint by specifying <nobr><i>Sapphire.PropertyEditor.PopUpListField</i></nobr> as the presentation style.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor>
+    &lt;property>Color&lt;/property></font>
+    &lt;style>Sapphire.PropertyEditor.PopUpListField&lt;/style>
+<font color="#888888">&lt;/property-editor>
+&lt;property-editor>
+    &lt;property>Shape&lt;/property></font>
+    &lt;style>Sapphire.PropertyEditor.PopUpListField&lt;/style>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/PopUpListFieldForPossibleValues-4.png"/></p>
+
+<p style="margin-left: 20px;">The new presentations are accessible in a similar manner when properties are edited within
+a table.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor>
+    &lt;property>ColoredShapes&lt;/property>
+    &lt;show-label>false&lt;/show-label>
+    &lt;span>true&lt;/span>
+    &lt;child-property>
+        &lt;property>Color&lt;/property></font>
+        &lt;style>Sapphire.PropertyEditor.PopUpListField&lt;/style>
+    <font color="#888888">&lt;/child-property>
+    &lt;child-property>
+        &lt;property>Shape&lt;/property></font>
+        &lt;style>Sapphire.PropertyEditor.PopUpListField&lt;/style>
+    <font color="#888888">&lt;/child-property>
+&lt;/property-editor></font></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/PopUpListFieldForPossibleValues-5.png"/></p>
+
+<h2><a name="Forms-FlexibleActuatorPresentation">Flexible Actuator Presentation</a></h2>
+
+<p>An actuator provides means to invoke an action. The action could be drawn from the context where actuator 
+is placed or provided as part of actuator's definition. Actuators were formerly limited to links and were
+referred to as action links. New for this release is the ability to choose either link or button presentation
+along with ability to control horizontal alignment.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">&lt;actuator>
+    &lt;action-id>Sapphire.Gallery.Actuators.DoubleTheNumber&lt;/action-id>
+    &lt;action>
+        &lt;id>Sapphire.Gallery.Actuators.DoubleTheNumber&lt;/id>
+        &lt;label>double the number&lt;/label>
+    &lt;/action>
+    &lt;action-handler>
+        &lt;id>Sapphire.Gallery.Actuators.DoubleTheNumber&lt;/id>
+        &lt;action>Sapphire.Gallery.Actuators.DoubleTheNumber&lt;/action>
+        &lt;impl>ActuatorsGalleryDoubleTheNumberActionHandler&lt;/impl>
+    &lt;/action-handler></font>
+    &lt;span>false&lt;/span>
+    &lt;horizontal-align>right&lt;/horizontal-align>
+    &lt;style>Sapphire.Actuator.Button&lt;/style>
+<font color="#888888">&lt;/actuator></font></code></pre>
+
+<p style="margin-left: 20px;"><img src="images/MoreFlexibleActuatorPresentation.png"/></p>
+
+<h2><a name="Forms-ExprForPropertyEditorLabel">Expression for Property Editor Label</a></h2>
+
+<p>Use the expression language when overriding the label in a property editor.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">&lt;property-editor>
+    &lt;property>Name&lt;/property></font>
+    &lt;label>${ Type == "Business" ? "company" : "name" }&lt;/label>
+<font color="#888888">&lt;/property-editor></font></code></pre>
+
+<h2><a name="Services"><a name="Services-PartServices">Part Services</a></a></h2>
+
+<p>Services can now be attached to parts. This enhancement allows extensibility for parts to be handled with
+the same API that adopters should already be familiar with from the model layer.</p>
+
+<p>To attach a part service via the extension system, use Sapphire.Part context.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">&lt;extension></font>
+    &lt;service>
+        &lt;id>Example.CustomLayoutPersistenceService&lt;/id>
+        &lt;context>Sapphire.Part&lt;/context>
+        &lt;type>org.eclipse.sapphire.ui.diagram.layout.DiagramLayoutPersistenceService&lt;/type>
+        &lt;factory>org.example.CustomLayoutPersistenceService$Factory&lt;/factory>
+    &lt;/service>
+<code><font color="#888888">&lt;/extension></font></code></pre>
+
+<p>Services can also be attached to parts at the local level in sdef.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">&lt;definition>
+    &lt;diagram-page></font>
+        &lt;service>            
+            &lt;implementation>CustomLayoutPersistenceService&lt;/implementation>
+        &lt;/service>
+    <font color="#888888">&lt;/diagram-page>
+&lt;/definition></font></code></pre>
+
+<h2><a name="Services-AdapterService">AdapterService</a></h2>
+
+<p>The AdapterService provides means to extend the behavior of the adapt method in a given context.</p>
+
+<p>For example, out of the box, Sapphire can adapt IModelElement to IProject assuming that the model is using
+an IFile for the underlying resource store.  However, in some cases there may be no underlying IFile, so the
+default logic will no be able to find IProject. To solve this problem, we can introduce an adapter service to 
+provide a custom method for adopting IModelElement to IProject.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code><font color="#888888">@GenerateImpl</font>
+@Service( impl = NewProjectFileOpAdapterService.class )
+
+<font color="#888888">public interface INewProjectFileOp extends IModelElement
+{
+    ...
+}</font></code></pre>
+
+<pre class="source-code"><code>public class NewProjectFileOpAdapterService extends AdapterService
+{
+    @Override
+    public &lt;A&gt; A adapt( Class&lt;A&gt; adapterType )
+    {
+        if( IProject.class == adapterType )
+        {
+            INewProjectFileOp op = context( INewProjectFileOp.class );
+            IProject project = op.getProject().resolve();
+
+            if( project != null )
+            {
+                return adapterType.cast( project );
+            }
+        }
+
+        return null;
+    }
+}</code></pre>
+
+<a name="Services-DiagramLayoutPersistenceService"><h2>DiagramLayoutPersistenceService</h2></a>
+
+<p>The DiagramLayoutPersistenceService is responsible for persisting layout of the diagram, such a location and
+size of nodes, connection bend points, etc.</p>
+
+<p>Unlike other services, DiagramLayoutPersistenceService is not defined by methods that must be
+implemented, but rather by its expected behavior.</p>
+
+<ol>
+  <li>During service initialization, the implementation is expected to load layout information and transfer it to
+    diagram parts using API such as DiagramNodePart.setNodeBounds().</li>
+  <li>After initialization, the implementation is expected to listen for changes to diagram parts and persist
+    layout information. Persistence can happen immediately or be deferred until the save event is received.</li>
+  <li>If implementation defers layout persistence until save, it is expected to implement dirty() method and to
+   issue DirtyStateEvent when this state changes.</li>
+ </ol>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">The architecture sample provides a comprehensive example of a custom 
+implementation that persists layout in the same file as data.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;diagram-page></font>
+  &lt;layout-persistence>custom&lt;/layout-persistence>
+  &lt;service>
+    &lt;implementation>ArchitectureDiagramLayoutPersistenceService&lt;/implementation>
+  &lt;/service>
+<font color="#888888">&lt;/diagram-page></font></code></pre>
+
+<a name="Services-DragAndDropService"><h2>DragAndDropService</h2></a>
+
+<p>The DragAndDropService provides means to implement drag-n-drop behavior in a diagram editor.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>public class MapDragAndDropService extends DragAndDropService 
+{
+    @Override
+    public boolean droppable( DropContext context ) 
+    {
+        return context.object() instanceof IFile;
+    }
+
+    @Override
+    public void drop( DropContext context ) 
+    {
+        IFile file = (IFile) context.object();
+        List<String> locations = new ArrayList<String>();
+
+        InputStream in = null;
+
+        try
+        {
+            in = file.getContents();
+            final BufferedReader br = new BufferedReader( new InputStreamReader( in ) );
+
+            for( String line = br.readLine(); line != null; line = br.readLine() )
+            {
+                if( line != null )
+                {
+                    line = line.trim();
+
+                    if( line.length() > 0 )
+                    {
+                        locations.add( line );
+                    }
+                }
+            }
+        }
+        catch( CoreException e )
+        {
+            LoggingService.log( e );
+        }
+        catch( IOException e )
+        {
+            LoggingService.log( e );
+        }
+        finally
+        {
+            if( in != null )
+            {
+                try
+                {
+                    in.close();
+                }
+                catch( IOException e ) {}
+            }
+        }
+
+        if( ! locations.isEmpty() )
+        {
+            SapphireDiagramEditorPagePart diagram = context( SapphireDiagramEditorPagePart.class );
+            Map map = context( Map.class );
+
+            Point initialDropPosition = context.position();
+
+            int x = initialDropPosition.getX();
+            int y = initialDropPosition.getY();
+
+            for( String locationName : locations )
+            {
+                if( ! map.hasLocation( locationName ) )
+                {
+                    Location location = map.getLocations().insert();
+                    location.setName( locationName );
+
+                    DiagramNodePart locationNodePart = diagram.getDiagramNodePart(location);
+                    locationNodePart.setNodeBounds( x, y );
+
+                    x += 50;
+                    y += 50;
+                }
+            }
+        }
+    }
+}</code></pre>
+
+<p style="margin-left: 20px;">The DragAndDropService is typically registered as part of diagram page
+definition in the sdef file.</p>
+
+<pre class="source-code"><code><font color="#888888">&lt;diagram-page></font>
+    &lt;service>
+        &lt;implementation>MapDropService&lt;/implementation>
+    &lt;/service>
+<font color="#888888">&lt;/diagram-page></font></code></pre>
+
+<h2><a name="Services-EqualityService">EqualityService</a></h2>
+
+<p>The EqualityService provides means to implement equals() and hashCode() methods when the context object doesn't support
+implementing these methods directly. One such context is model elements, where the framework does not rely on a particular
+implementation of these methods, but having these methods behave in a way consistent with semantics of the data being modeled
+can be useful for other purposes.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<pre class="source-code"><code>public class ContactEqualityService extends EqualityService
+{
+    @Override
+    public boolean doEquals( Object obj )
+    {
+        Contact c1 = context( Contact.class );
+        Contact c2 = (Contact) obj;
+
+        return equal( c1.getLastName().getText(), c2.getLastName().getText() ) &&
+               equal( c1.getFirstName().getText(), c2.getFirstName().getText() );
+    }
+
+    @Override
+    public int doHashCode()
+    {
+        Contact c = context( Contact.class );
+        String lastName = c.getLastName().getText();
+        String firstName = c.getFirstName().getText();
+
+        return ( lastName == null ? 1 : lastName.hashCode() ) ^ ( firstName == null ? 1 : firstName.hashCode() );
+    }
+
+    private static boolean equal( Object obj1, Object obj2 )
+    {
+        if( obj1 == obj2 )
+        {
+            return true;
+        }
+        else if( obj1 != null && obj2 != null )
+        {
+            return obj1.equals( obj2 );
+        }
+
+        return false;
+    }
+}</code></pre>
+
+<pre class="source-code"><code><font color="#888888">@Services( {</font> @Service( impl = ContactEqualityService.class )<font color="#888888">, ... } )
+
+public interface Contact extends IModelElement
+{
+    ModelElementType TYPE = new ModelElementType( Contact.class );
+
+    ...
+}</font></code></pre>
+
+<a name="Services-ListSelectionService"><h2>ListSelectionService</h2></a>
+
+<p>The ListSelectionService functions as a conduit between the presentation layer and anything that may want to see or 
+change the selection. The presentation layer pushes selection changes made by the user to ListSelectionService and at
+the same time listens for changes to selection coming from ListSelectionService.</p>
+
+<p>An implementation of this service is provided with Sapphire. This service is not intended to be implemented by adopters.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example, an action handler attaches a listener to the ListSelectionService to 
+refresh action handler's enablement state when selection changes.</p>
+
+<pre class="source-code"><code>
+<font color="#888888">public class ExampleActionHandler extends SapphireActionHandler
+{
+    @Override
+    public void init( SapphireAction action, ActionHandlerDef def )
+    {
+        super.init( action, def );</font>
+
+        final ListSelectionService selectionService = action.getPart().service( ListSelectionService.class );
+
+        final Listener selectionListener = new Listener()
+        {
+            @Override
+            public void handle( Event event )
+            {
+                refreshEnablementState();
+            }
+        };
+
+        selectionService.attach( selectionListener );
+
+        attach
+        (
+            new Listener()
+            {
+                @Override
+                public void handle( Event event )
+                {
+                    if( event instanceof DisposeEvent )
+                    {
+                        selectionService.detach( selectionListener );
+                    }
+                }
+            }
+        );
+    <font color="#888888">}
+}</font></code></pre>
+
+<a name="Services-ValidationServiceAtElementLevel"><h2>ValidationService at Element Level</h2></a>
+
+<p>The ValidationService provides means to check integrity constraints and to communicate problems to the user. In
+prior releases, the developer could only attach a ValidationService to properties. Now, a ValidationService can also be
+attached to elements.</p>
+
+<p style="margin-left: 20px;"><b>Example</b></p>
+
+<p style="margin-left: 20px;">In this example, a validation service is used for detecting likely duplicate contacts. Two
+contacts are defined as duplicates of each other if e-mail and at least one of the phone numbers matches.</p>
+
+<pre class="source-code"><code>public class DuplicateContactValidationService extends ValidationService
+{
+    private Listener listener;
+
+    @Override
+    protected void init()
+    {
+        final ContactsDatabase contacts = context( Contact.class ).nearest( ContactsDatabase.class );
+
+        if( contacts != null )
+        {
+            this.listener = new FilteredListener&lt;PropertyContentEvent>()
+            {
+                @Override
+                protected void handleTypedEvent( PropertyContentEvent event )
+                {
+                    broadcast();
+                }
+            };
+
+            contacts.attach( this.listener, "Contacts/EMail" );
+            contacts.attach( this.listener, "Contacts/PhoneNumbers/*" );
+        }
+    }
+
+    @Override
+    public Status validate() 
+    {
+        Contact contact = context( Contact.class );
+        ContactsDatabase contacts = contact.nearest( ContactsDatabase.c