diff --git a/bundles/runtime/org.eclipse.fx.core.databinding/src/org/eclipse/fx/core/databinding/JFXBeanProperties.java b/bundles/runtime/org.eclipse.fx.core.databinding/src/org/eclipse/fx/core/databinding/JFXBeanProperties.java
index bbe773c..8c75dd4 100755
--- a/bundles/runtime/org.eclipse.fx.core.databinding/src/org/eclipse/fx/core/databinding/JFXBeanProperties.java
+++ b/bundles/runtime/org.eclipse.fx.core.databinding/src/org/eclipse/fx/core/databinding/JFXBeanProperties.java
@@ -19,8 +19,6 @@
 import org.eclipse.fx.core.databinding.internal.FXBeanPropertyHelper;
 import org.eclipse.fx.core.databinding.internal.FXBeanValueProperty;
 import org.eclipse.fx.core.databinding.internal.FXBeanValuePropertyDecorator;
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
 
 /**
  * Factory to create property descriptions
@@ -33,7 +31,7 @@
 	 *            the name of the property (nested properties are separated with a .)
 	 * @return the property
 	 */
-	public static @NonNull IJFXBeanValueProperty value(@NonNull String propertyName) {
+	public static IJFXBeanValueProperty value(String propertyName) {
 		return value(null, propertyName, null);
 	}
 
@@ -46,7 +44,7 @@
 	 *            the type
 	 * @return the property
 	 */
-	public static @NonNull IJFXBeanValueProperty value(@NonNull String propertyName, Class<?> valueType) {
+	public static IJFXBeanValueProperty value(String propertyName, Class<?> valueType) {
 		return value(null, propertyName, valueType);
 	}
 
@@ -61,9 +59,9 @@
 	 *            the type
 	 * @return the property
 	 */
-	public static @NonNull IJFXBeanValueProperty value(@Nullable Class<?> beanClass, @NonNull String propertyName, @Nullable Class<?> _valueType) {
+	public static IJFXBeanValueProperty value(Class<?> beanClass, String propertyName, Class<?> _valueType) {
 		Class<?> valueType = _valueType;
-		@NonNull String[] propertyNames = split(propertyName);
+		String[] propertyNames = split(propertyName);
 		if (propertyNames.length > 1) {
 			valueType = null;
 		}
@@ -78,7 +76,6 @@
 			property = new FXBeanValueProperty(propertyDescriptor, valueType);
 		}
 
-		@NonNull
 		IJFXBeanValueProperty beanProperty = new FXBeanValuePropertyDecorator(property, propertyDescriptor);
 		for (int i = 1; i < propertyNames.length; i++) {
 			beanProperty = beanProperty.value(propertyNames[i]);
@@ -86,8 +83,7 @@
 		return beanProperty;
 	}
 
-	@SuppressWarnings("null")
-	private static @NonNull String[] split(@NonNull String _propertyName) {
+	private static String[] split(String _propertyName) {
 		String propertyName = _propertyName;
 		if (propertyName.indexOf('.') == -1)
 			return new String[] { propertyName };
diff --git a/bundles/runtime/org.eclipse.fx.emf.databinding/src/org/eclipse/fx/emf/databinding/edit/EMFEditFXProperties.java b/bundles/runtime/org.eclipse.fx.emf.databinding/src/org/eclipse/fx/emf/databinding/edit/EMFEditFXProperties.java
index fcda9b5..1cbcdb2 100755
--- a/bundles/runtime/org.eclipse.fx.emf.databinding/src/org/eclipse/fx/emf/databinding/edit/EMFEditFXProperties.java
+++ b/bundles/runtime/org.eclipse.fx.emf.databinding/src/org/eclipse/fx/emf/databinding/edit/EMFEditFXProperties.java
@@ -129,6 +129,7 @@
 			return this.feature.getName();
 		}
 
+		
 	}
 
 }
diff --git a/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/internal/lifecycle/LifecycleContextFunction.class b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/internal/lifecycle/LifecycleContextFunction.class
new file mode 100644
index 0000000..a3862dc
--- /dev/null
+++ b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/internal/lifecycle/LifecycleContextFunction.class
Binary files differ
diff --git a/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/internal/lifecycle/LifecycleServiceImpl.class b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/internal/lifecycle/LifecycleServiceImpl.class
new file mode 100644
index 0000000..417ac8d
--- /dev/null
+++ b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/internal/lifecycle/LifecycleServiceImpl.class
Binary files differ
diff --git a/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/ELifecycleService.class b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/ELifecycleService.class
new file mode 100644
index 0000000..c26a27f
--- /dev/null
+++ b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/ELifecycleService.class
Binary files differ
diff --git a/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/LifecycleAddon.class b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/LifecycleAddon.class
new file mode 100644
index 0000000..432f2d3
--- /dev/null
+++ b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/LifecycleAddon.class
Binary files differ
diff --git a/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/annotations/PreClose.class b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/annotations/PreClose.class
new file mode 100644
index 0000000..f4fc94c
--- /dev/null
+++ b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/annotations/PreClose.class
Binary files differ
diff --git a/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/annotations/PreShow.class b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/annotations/PreShow.class
new file mode 100644
index 0000000..9d4186c
--- /dev/null
+++ b/bundles/runtime/org.eclipse.fx.ui.lifecycle/bin/org/eclipse/fx/ui/lifecycle/annotations/PreShow.class
Binary files differ
diff --git a/bundles/runtime/org.eclipse.fx.ui.workbench.base/src/org/eclipse/fx/ui/workbench/base/.gitignore b/bundles/runtime/org.eclipse.fx.ui.workbench.base/src/org/eclipse/fx/ui/workbench/base/.gitignore
new file mode 100644
index 0000000..95542a1
--- /dev/null
+++ b/bundles/runtime/org.eclipse.fx.ui.workbench.base/src/org/eclipse/fx/ui/workbench/base/.gitignore
@@ -0,0 +1 @@
+/AbstractE4Application.java
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/.project b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/.project
new file mode 100644
index 0000000..d015a07
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.fx.ide.gradient.app.feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/build.properties b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/build.properties
new file mode 100644
index 0000000..b045d39
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
\ No newline at end of file
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/feature.xml b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/feature.xml
new file mode 100644
index 0000000..909bf37
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/feature.xml
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.fx.ide.gradient.app.feature"
+      label="e(fx)clipse Gradient editor Application Feature"
+      version="1.0.0.qualifier"
+      provider-name="${BundleProject_bundleVendor}">
+
+   <description url="http://www.efxclipse.org">
+      TODO FILL WITH CONTENT
+   </description>
+
+   <copyright url="http://www.efxclipse.org">
+      TODO FILL WITH CONTENT
+   </copyright>
+
+   <license url="http://www.efxclipse.org">
+      TODO FILL WITH CONTENT
+   </license>
+
+   <plugin
+         id="org.eclipse.fx.ide.gradient.app"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.fx.osgi"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         fragment="true"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.fx.javafx"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.fx.core.databinding"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.core.databinding"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.core.databinding.observable"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.core.databinding.property"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.equinox.app"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osgi"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.equinox.common"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.equinox.launcher"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.equinox.registry"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.equinox.ds"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.equinox.event"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.equinox.util"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.osgi.services"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="com.ibm.icu"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.core.runtime"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.core.jobs"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.equinox.preferences"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.core.contenttype"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.fx.ide.gradient.core"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.fx.ide.gradient.model"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.fx.ide.gradient.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/pom.xml b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/pom.xml
new file mode 100644
index 0000000..1a45a13
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.feature/pom.xml
@@ -0,0 +1,16 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<name>e(fx)clipse Gradient editor - application feature</name>
+	<groupId>org.eclipse.fx.ide.gradient</groupId>
+	<artifactId>org.eclipse.fx.ide.gradient.app.feature</artifactId>
+	<packaging>eclipse-feature</packaging>
+
+	<parent>
+		<groupId>org.eclipse.fx.ide.gradient</groupId>
+		<artifactId>org.eclipse.fx.ide.gradient.app.releng</artifactId>
+		<relativePath>../org.eclipse.fx.ide.gradient.app.releng/pom.xml</relativePath>
+		<version>1.0.0-SNAPSHOT</version>
+	</parent>
+
+</project>
\ No newline at end of file
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/.project b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/.project
new file mode 100644
index 0000000..b2d1843
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.fx.ide.gradient.app.product</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/org.eclipse.fx.ide.gradient.app.product.product b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/org.eclipse.fx.ide.gradient.app.product.product
new file mode 100644
index 0000000..3a703a5
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/org.eclipse.fx.ide.gradient.app.product.product
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product name="e(fx)clipse Gradient editor" uid="org.eclipse.fx.ide.gradient.app.product" id="org.eclipse.fx.ide.gradient.app.product" application="org.eclipse.fx.ide.gradient.app.application" version="1.0.0" useFeatures="true" includeLaunchers="false">
+
+	<configIni use="default">
+	</configIni>
+	<launcherArgs>
+		<programArgs>-nosplash</programArgs>
+		<vmArgs>-Dosgi.framework.extensions=org.eclipse.fx.osgi</vmArgs>
+	</launcherArgs>
+	
+	<windowImages/>
+	
+	<features>
+		<feature id="org.eclipse.fx.ide.gradient.app.feature" version="1.0.0.qualifier"/>
+	</features>
+	<configurations>
+		<plugin id="org.eclipse.core.runtime" autoStart="true" startLevel="0" />
+		<plugin id="org.eclipse.equinox.common" autoStart="true" startLevel="2" />
+		<plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="1" />
+		<plugin id="org.eclipse.osgi" autoStart="true" startLevel="-1" />
+	</configurations>
+</product>
+   
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/org.eclipse.fx.ide.gradient.app.product.product.launch b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/org.eclipse.fx.ide.gradient.app.product.product.launch
new file mode 100644
index 0000000..977a102
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/org.eclipse.fx.ide.gradient.app.product.product.launch
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.RuntimeWorkbench">
+<setAttribute key="additional_plugins"/>
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="askclear" value="true"/>
+<booleanAttribute key="automaticAdd" value="false"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="false"/>
+<booleanAttribute key="clearws" value="false"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/org.eclipse.fx.ide.gradient.app.product.product"/>
+<booleanAttribute key="default" value="false"/>
+<stringAttribute key="featureDefaultLocation" value="workspace"/>
+<stringAttribute key="featurePluginResolution" value="workspace"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/../runtime-org.eclipse.fx.ide.gradient.app.product"/>
+<stringAttribute key="org.eclipse.debug.core.source_locator_id" value="org.eclipse.pde.ui.launcher.PDESourceLookupDirector"/>
+<stringAttribute key="org.eclipse.debug.core.source_locator_memento" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;sourceLookupDirector&gt;&#10;&lt;sourceContainers duplicates=&quot;false&quot;&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;archive detectRoot=&amp;quot;true&amp;quot; path=&amp;quot;/opt/jdk1.8.0_05/javafx-src.zip&amp;quot;/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.externalArchive&quot;/&gt;&#10;&lt;container memento=&quot;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;no&amp;quot;?&amp;gt;&amp;#10;&amp;lt;default/&amp;gt;&amp;#10;&quot; typeId=&quot;org.eclipse.debug.core.containerType.default&quot;/&gt;&#10;&lt;/sourceContainers&gt;&#10;&lt;/sourceLookupDirector&gt;&#10;"/>
+<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-nl ${target.nl} -consoleLog -nosplash"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dosgi.framework.extensions=org.eclipse.fx.osgi"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.fx.ide.gradient.app.product"/>
+<stringAttribute key="productFile" value="/org.eclipse.fx.ide.gradient.app.product/org.eclipse.fx.ide.gradient.app.product.product"/>
+<setAttribute key="selected_features">
+<setEntry value="org.eclipse.fx.ide.gradient.app.feature:default"/>
+</setAttribute>
+<booleanAttribute key="show_selected_only" value="false"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useCustomFeatures" value="true"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="true"/>
+<booleanAttribute key="useProduct" value="true"/>
+<booleanAttribute key="usefeatures" value="false"/>
+</launchConfiguration>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/pom.xml b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/pom.xml
new file mode 100644
index 0000000..67aac90
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.product/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<name>e(fx)clipse Gradient editor - application product</name>
+	<groupId>org.eclipse.fx.ide.gradient</groupId>
+	<artifactId>org.eclipse.fx.ide.gradient.app.product</artifactId>
+	<packaging>eclipse-repository</packaging>
+
+	<parent>
+		<groupId>org.eclipse.fx.ide.gradient</groupId>
+		<artifactId>org.eclipse.fx.ide.gradient.app.releng</artifactId>
+		<relativePath>../org.eclipse.fx.ide.gradient.app.releng/pom.xml</relativePath>
+		<version>1.0.0-SNAPSHOT</version>
+	</parent>
+	
+	<build>
+  	<plugins>
+    	<plugin>
+      		<groupId>org.eclipse.tycho</groupId>
+      		<artifactId>tycho-p2-director-plugin</artifactId>
+      		<version>${tycho-version}</version>
+      		<executions>
+        		<execution>
+          			<id>materialize-products</id>
+          			<goals>
+            			<goal>materialize-products</goal>
+          			</goals>
+        		</execution>
+        		<execution>
+          			<id>archive-products</id>
+          			<goals>
+            			<goal>archive-products</goal>
+          			</goals>
+        		</execution>
+      		</executions>
+    	</plugin>
+	</plugins>
+	</build>
+</project>
\ No newline at end of file
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/.project b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/.project
new file mode 100644
index 0000000..ffb0919
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.fx.ide.gradient.app.releng</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/build.xml b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/build.xml
new file mode 100644
index 0000000..799a3e6
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/build.xml
@@ -0,0 +1,51 @@
+<project name="native-build" default="do-deploy" basedir="."  xmlns:fx="javafx:com.sun.javafx.tools.ant">
+	<property name="eclipse-app-dir" value="../org.eclipse.fx.ide.gradient.app.product/target/products/org.eclipse.fx.ide.gradient.app.product/noenv/noenv/noenv" />
+	
+	<target name="init-fx-tasks">
+		<taskdef name="fxosgilauncher" classpath="org.eclipse.fx.ide.ant.jar" classname="org.eclipse.fx.ide.ant.FXOsgiLaunchTask" />
+		<path id="fxant">
+			<filelist>
+				<file name="${java.home}\..\lib\ant-javafx.jar"/>
+				<file name="${java.home}\lib\ant-jfxrt.jar"/>
+			</filelist>
+		</path>
+		<taskdef resource="com/sun/javafx/tools/ant/antlib.xml"      
+					uri="javafx:com.sun.javafx.tools.ant"
+					classpathref="fxant"/>
+	</target>
+		
+	<target name="do-deploy" depends="init-fx-tasks">
+		<fileset id="equinox-launcher" dir="../org.eclipse.fx.ide.gradient.app.product/target/products/org.eclipse.fx.ide.gradient.app.product/noenv/noenv/noenv">
+			<filename name="plugins/org.eclipse.equinox.launcher_*.jar"/>
+		</fileset>
+		<fxosgilauncher classpathref="fxant" equinoxlauncherjarref="equinox-launcher"/>
+	
+		<fx:resources id="appRes">
+			<fx:fileset dir="." includes="fx-osgi-launch.jar"/>
+			<fx:fileset dir="${eclipse-app-dir}" includes="**/*"/>
+		</fx:resources>
+		
+		<fx:application id="fxApplication"
+								name="e(fx)clipse Gradient editor"
+								mainClass="org.eclipse.equinox.launcher.Main"
+								toolkit="swing"
+						
+							/>
+		
+		<fx:deploy
+			embedJNLP="false"
+			extension="false"
+			includeDT="false"
+			offlineAllowed="true"
+			outdir="${basedir}/deploy"
+			outfile="fix-ide" 
+			nativeBundles="all"
+			updatemode="background"
+			>
+			
+			<fx:info title="e(fx)clipse Gradient editor" vendor=""/>
+			<fx:application refid="fxApplication"/>
+			<fx:resources refid="appRes"/>
+		</fx:deploy>
+	</target>
+</project>
\ No newline at end of file
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/org.eclipse.fx.ide.ant.jar b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/org.eclipse.fx.ide.ant.jar
new file mode 100644
index 0000000..45ddf03
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/org.eclipse.fx.ide.ant.jar
Binary files differ
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/pom.xml b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/pom.xml
new file mode 100644
index 0000000..1d2cce2
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app.releng/pom.xml
@@ -0,0 +1,154 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<name>e(fx)clipse Gradient editor - releng</name>
+
+	<prerequisites>
+		<maven>3.0</maven>
+	</prerequisites>
+
+	<groupId>org.eclipse.fx.ide.gradient</groupId>
+	<artifactId>org.eclipse.fx.ide.gradient.app.releng</artifactId>
+	<version>1.0.0-SNAPSHOT</version>
+	<packaging>pom</packaging>
+	<properties>
+		<tycho-version>0.18.0</tycho-version>
+		<junit-version>4.8.1</junit-version>
+		<mockito-version>1.8.4</mockito-version>
+		<platform-version>4.2</platform-version>
+		<efx-version>0.9.0</efx-version>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<modules>
+		<module>../org.eclipse.fx.ide.gradient.app</module>
+		<module>../org.eclipse.fx.ide.gradient.app.feature</module>
+		<module>../org.eclipse.fx.ide.gradient.app.product</module>
+	</modules>
+
+	<repositories>
+		<repository>
+			<id>efxclipse-repo</id>
+			<layout>p2</layout>
+			<url>http://download.eclipse.org/efxclipse/runtime-nightly/site</url>
+		</repository>
+		<repository>
+			<id>efxclipse-addons</id>
+			<layout>p2</layout>
+			<url>http://downloads.efxclipse.org/efxclipse.bestsolution.at/p2-repos/runtime/nightly/site/</url>
+		</repository>
+
+	</repositories>
+
+	<pluginRepositories>
+		<pluginRepository>
+			<id>tycho</id>
+			<url>http://repository.sonatype.org/content/groups/sonatype-public-grid</url>
+			<snapshots>
+				<enabled>true</enabled>
+			</snapshots>
+		</pluginRepository>
+	</pluginRepositories>
+
+	<build>
+
+		<!-- build plugins -->
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-maven-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<extensions>true</extensions>
+			</plugin>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>target-platform-configuration</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<resolver>p2</resolver>
+					<pomDependencies>consider</pomDependencies>
+					<environments>
+						<environment>
+							<os>noenv</os>
+							<ws>noenv</ws>
+							<arch>noenv</arch>
+						</environment>
+					</environments>
+				</configuration>
+			</plugin>
+		</plugins>
+
+
+		<!-- defines the default settings for the used plugins -->
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.eclipse.tycho</groupId>
+					<artifactId>tycho-compiler-plugin</artifactId>
+					<version>${tycho-version}</version>
+					<configuration>
+						<encoding>UTF-8</encoding>
+						<source>1.7</source>
+						<target>1.7</target>
+						<extraClasspathElements>
+							<extraClasspathElement>
+								<groupId>javafx</groupId>
+								<artifactId>javafx.mvn</artifactId>
+								<version>2.2.0-SNAPSHOT</version> 
+							</extraClasspathElement>
+						</extraClasspathElements>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.eclipse.tycho</groupId>
+					<artifactId>tycho-source-plugin</artifactId>
+					<version>${tycho-version}</version>
+					<executions>
+						<execution>
+							<id>plugin-source</id>
+							<goals>
+								<goal>plugin-source</goal>
+							</goals>
+						</execution>
+					</executions>
+				</plugin>
+				<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-packaging-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<archiveSite>true</archiveSite>
+				</configuration>
+			</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+
+	<dependencyManagement>
+		<dependencies>
+			<dependency>
+				<groupId>junit</groupId>
+				<artifactId>junit</artifactId>
+				<version>${junit-version}</version>
+				<scope>test</scope>
+			</dependency>
+		</dependencies>
+	</dependencyManagement>
+
+	<dependencies>
+		<dependency>
+			<groupId>org.mockito</groupId>
+			<artifactId>mockito-core</artifactId>
+			<version>${mockito-version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+
+</project>
\ No newline at end of file
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/.classpath b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/.classpath
new file mode 100644
index 0000000..22f3064
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/.project b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/.project
new file mode 100644
index 0000000..d8b9f05
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/.project
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.fx.ide.gradient.app</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ds.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+	</natures>
+</projectDescription>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/META-INF/MANIFEST.MF b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..455c8b0
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/META-INF/MANIFEST.MF
@@ -0,0 +1,48 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Gradient Editor
+Bundle-SymbolicName: org.eclipse.fx.ide.gradient.app; singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.eclipse.fx.javafx,
+ org.eclipse.fx.osgi.util,
+ org.eclipse.fx.core.databinding,
+ org.eclipse.fx.ui.databinding,
+ org.eclipse.equinox.app,
+ org.eclipse.fx.ide.gradient.model,
+ org.eclipse.fx.emf.databinding;bundle-version="1.0.0",
+ org.eclipse.emf.edit;bundle-version="2.10.0",
+ org.eclipse.emf.databinding,
+ org.eclipse.core.databinding.property;bundle-version="1.4.200",
+ org.eclipse.fx.ide.css.cssext,
+ org.eclipse.fx.ide.css;bundle-version="1.0.0",
+ org.eclipse.fx.ide.css.ui
+Import-Package: javafx.animation;version="2.0.0",
+ javafx.application;version="2.0.0",
+ javafx.beans;version="2.0.0",
+ javafx.beans.binding;version="2.0.0",
+ javafx.beans.property;version="2.0.0",
+ javafx.beans.value;version="2.0.0",
+ javafx.collections;version="2.0.0",
+ javafx.concurrent;version="2.0.0",
+ javafx.event;version="2.0.0",
+ javafx.fxml;version="2.0.0",
+ javafx.geometry;version="2.0.0",
+ javafx.scene;version="2.0.0",
+ javafx.scene.chart;version="2.0.0",
+ javafx.scene.control;version="2.0.0",
+ javafx.scene.control.cell;version="2.0.0",
+ javafx.scene.effect;version="2.0.0",
+ javafx.scene.image;version="2.0.0",
+ javafx.scene.input;version="2.0.0",
+ javafx.scene.layout;version="2.0.0",
+ javafx.scene.media;version="2.0.0",
+ javafx.scene.paint;version="2.0.0",
+ javafx.scene.shape;version="2.0.0",
+ javafx.scene.text;version="2.0.0",
+ javafx.scene.transform;version="2.0.0",
+ javafx.scene.web;version="2.0.0",
+ javafx.stage;version="2.0.0",
+ javafx.util;version="2.0.0",
+ org.eclipse.fx.core
+Service-Component: OSGI-INF/*.xml,
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/OSGI-INF/GradientProposalContributor.xml b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/OSGI-INF/GradientProposalContributor.xml
new file mode 100755
index 0000000..9e00753
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/OSGI-INF/GradientProposalContributor.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="org.eclipse.fx.ide.gradient.app.GradientProposalContributer">
+   <implementation class="org.eclipse.fx.ide.gradient.app.GradientProposalContributer"/>
+   <service>
+      <provide interface="org.eclipse.fx.ide.css.cssext.proposal.CssExtProposalContributor"/>
+   </service>
+</scr:component>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/bin/.gitignore b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/bin/.gitignore
new file mode 100644
index 0000000..cf1db2e
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/bin/.gitignore
@@ -0,0 +1 @@
+/org/
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/build.properties b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/build.properties
new file mode 100644
index 0000000..f71a1b5
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/build.properties
@@ -0,0 +1,6 @@
+bin.includes = .,\
+ META-INF/,\
+ plugin.xml,\
+css/
+
+source.. = src/
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/css/default.css b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/css/default.css
new file mode 100644
index 0000000..a38730e
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/css/default.css
@@ -0,0 +1 @@
+/* Main CSS-File */
\ No newline at end of file
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/plugin.xml b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/plugin.xml
new file mode 100644
index 0000000..5d80540
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/plugin.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+<extension id="application" point="org.eclipse.core.runtime.applications">
+	<application thread="any" cardinality="*" visible="true" >
+		<run class="org.eclipse.fx.ide.gradient.app.MainApplication" />
+		
+	</application>
+	
+</extension>
+<extension id="product" point="org.eclipse.core.runtime.products">
+	<product application="org.eclipse.fx.ide.gradient.app.application" name="e(fx)clipse Gradient editor" >
+		<property name="appName" value="e(fx)clipse Gradient editor" />
+		
+	</product>
+	
+</extension>
+</plugin>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/pom.xml b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/pom.xml
new file mode 100644
index 0000000..f28d4e7
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/pom.xml
@@ -0,0 +1,33 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<name>e(fx)clipse Gradient editor - application bundle</name>
+	<groupId>org.eclipse.fx.ide.gradient</groupId>
+	<artifactId>org.eclipse.fx.ide.gradient.app</artifactId>
+	<packaging>eclipse-plugin</packaging>
+
+	<parent>
+		<groupId>org.eclipse.fx.ide.gradient</groupId>
+		<artifactId>org.eclipse.fx.ide.gradient.app.releng</artifactId>
+		<relativePath>../org.eclipse.fx.ide.gradient.app.releng/pom.xml</relativePath>
+		<version>1.0.0-SNAPSHOT</version>
+	</parent>
+
+	<build>
+		<resources>
+			<resource>
+				<directory>.</directory>
+				<includes>
+					<include>META-INF/</include>
+				</includes>
+			</resource>
+		</resources>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/GradientProposal.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/GradientProposal.java
new file mode 100755
index 0000000..86224c8
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/GradientProposal.java
@@ -0,0 +1,75 @@
+package org.eclipse.fx.ide.gradient.app;
+
+import org.eclipse.fx.ide.css.ui.extapi.UIProposal;
+
+public class GradientProposal implements UIProposal {
+
+	private String proposal;
+	
+	
+	@Override
+	public Object getAdditionalInfo() {
+		return null;
+	}
+
+	@Override
+	public String getProposal() {
+		return proposal;
+	}
+
+	@Override
+	public String getImageUrl() {
+		return null;
+	}
+
+	@Override
+	public String getLabel() {
+		return "Pick Color...";
+	}
+
+	@Override
+	public int getPriority() {
+		return 3;
+	}
+
+	@Override
+	public boolean show() {
+		System.err.println("start mal den editor");
+		MainApplication app = new MainApplication();
+		
+			proposal = "blabla";
+			return true;
+//		}
+//		else {
+//			return false;
+//		}
+	}
+
+	@Override
+	public boolean hide() {
+		return false;
+	}
+
+	@Override
+	public Type getType() {
+		return Type.Value;
+	}
+	
+//	ConfigurableCompletionProposal dialogProposal = (ConfigurableCompletionProposal) createCompletionProposal("Pick color ...",context);
+//	if( dialogProposal != null ) {
+//		dialogProposal.setTextApplier(new ReplacementTextApplier() {
+//			
+//			@Override
+//			public String getActualReplacementString(
+//					ConfigurableCompletionProposal proposal) {
+//				ColorDialog dialog = new ColorDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
+//				RGB rgb = dialog.open();
+//				if( rgb != null ) {
+//					return "rgb("+rgb.red+","+rgb.green+","+rgb.blue+")";
+//				}
+//				return null;
+//			}
+//		});
+//	}
+//	acceptor.accept(dialogProposal); 
+}
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/GradientProposalContributer.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/GradientProposalContributer.java
new file mode 100755
index 0000000..fe683f4
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/GradientProposalContributer.java
@@ -0,0 +1,19 @@
+package org.eclipse.fx.ide.gradient.app;
+
+import org.eclipse.fx.ide.css.cssext.proposal.CssExtProposalContributor;
+import org.eclipse.fx.ide.css.extapi.Proposal;
+
+
+public class GradientProposalContributer implements CssExtProposalContributor {
+
+	@Override
+	public String getRule() {
+		return "javafx.paint";
+	}
+
+	@Override
+	public Proposal getProposal() {
+		return new GradientProposal();
+	}
+
+}
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/GradientViewer.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/GradientViewer.java
new file mode 100644
index 0000000..fa9e5d8
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/GradientViewer.java
@@ -0,0 +1,14 @@
+package org.eclipse.fx.ide.gradient.app;
+
+import javafx.beans.value.ObservableValue;
+import javafx.scene.layout.Pane;
+
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.fx.ide.gradient.model.gradient.FxGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.FxStop;
+
+public interface GradientViewer {
+	Pane getControl();
+	
+	void bind(EditingDomain editingDomain, ObservableValue<FxGradient> gradient);
+}
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/MainApplication.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/MainApplication.java
new file mode 100644
index 0000000..78fee18
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/MainApplication.java
@@ -0,0 +1,126 @@
+package org.eclipse.fx.ide.gradient.app;
+
+import javafx.application.Application;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.scene.Scene;
+import javafx.scene.control.Button;
+import javafx.scene.control.TabPane;
+import javafx.scene.layout.GridPane;
+import javafx.scene.paint.Color;
+import javafx.stage.Stage;
+
+import org.eclipse.emf.common.command.BasicCommandStack;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.equinox.app.IApplicationContext;
+import org.eclipse.fx.ide.gradient.app.impl.LinearGradientDetailTab;
+import org.eclipse.fx.ide.gradient.app.impl.RadialGradientDetailTab;
+import org.eclipse.fx.ide.gradient.app.util.GradientConverter;
+import org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod;
+import org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.FxStop;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientFactory;
+import org.eclipse.fx.osgi.util.AbstractJFXApplication;
+
+public class MainApplication extends AbstractJFXApplication {
+
+	protected void jfxStart(IApplicationContext applicationContext,
+			Application jfxApplication, Stage primaryStage) {
+		primaryStage.setTitle("Gradient Editor");
+
+		ComposedAdapterFactory f = new ComposedAdapterFactory(
+				ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
+		EditingDomain editingDomain = new AdapterFactoryEditingDomain(f,
+				new BasicCommandStack());
+
+		FxLinearGradient gLin = GradientFactory.eINSTANCE
+				.createFxLinearGradient();
+		FxStop s1 = GradientFactory.eINSTANCE.createFxStop();
+		s1.setOffset(0.22);
+		s1.setColor(GradientConverter.convertRgbColor(new Color(1.0, 0.0, 0.0,
+				0.5)));
+		gLin.getStops().add(s1);
+		FxStop s2 = GradientFactory.eINSTANCE.createFxStop();
+		s2.setOffset(0.33);
+		s2.setColor(GradientConverter.convertRgbColor(new Color(0.0, 1.0, 0.0,
+				0.5)));
+		gLin.getStops().add(s2);
+		FxStop s3 = GradientFactory.eINSTANCE.createFxStop();
+		s3.setOffset(0.44);
+		s3.setColor(GradientConverter.convertRgbColor(new Color(0.0, 0.0, 1.0,
+				0.5)));
+		gLin.getStops().add(s3);
+
+		gLin.setStartX(0.2);
+		gLin.setEndX(0.8);
+		gLin.setStartY(0.2);
+		gLin.setEndY(0.8);
+		gLin.setCycleMethod(FxCycleMethod.REFLECT);
+		gLin.setProportional(true);
+
+		FxRadialGradient gRad = GradientFactory.eINSTANCE
+				.createFxRadialGradient();
+		gRad.getStops().add(EcoreUtil.copy(s1));
+
+		// TODO OSGI
+
+		GridPane root = new GridPane();
+
+		TabPane tabPane = new TabPane();
+		root.add(tabPane, 0, 0);
+		LinearGradientDetailTab linearDetail = new LinearGradientDetailTab();
+		linearDetail.initUI();
+		tabPane.getTabs().add(linearDetail);
+		RadialGradientDetailTab radialDetail = new RadialGradientDetailTab();
+		radialDetail.initUI();
+		tabPane.getTabs().add(radialDetail);
+
+		linearDetail.bind(editingDomain, gLin);
+		radialDetail.bind(editingDomain, gRad);
+
+		GridPane buttons = new GridPane();
+		Button bApply = new Button();
+		bApply.setText("Apply");
+		bApply.setMinWidth(0.3);
+		buttons.add(bApply, 1, 0);
+
+		bApply.setOnAction(new EventHandler<ActionEvent>() {
+			@Override
+			public void handle(ActionEvent t) {
+				try {
+					primaryStage.close();
+					jfxApplication.stop();
+				} catch (Exception e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		});
+
+		Button bCancel = new Button();
+		bCancel.setText("Cancel");
+		bCancel.setMinWidth(0.3);
+		buttons.add(bCancel, 0, 0);
+		bCancel.setOnAction(new EventHandler<ActionEvent>() {
+			@Override
+			public void handle(ActionEvent t) {
+				try {
+					primaryStage.close();
+					jfxApplication.stop();
+				} catch (Exception e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+		});
+
+		root.add(buttons, 0, 1, 2, 1);
+
+		primaryStage.setScene(new Scene(root, 600, 350));
+		primaryStage.show();
+	}
+}
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/StopEditor.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/StopEditor.java
new file mode 100644
index 0000000..ace7ca0
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/StopEditor.java
@@ -0,0 +1,13 @@
+package org.eclipse.fx.ide.gradient.app;
+
+import javafx.collections.ObservableList;
+import javafx.scene.layout.Pane;
+
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.fx.ide.gradient.model.gradient.FxStop;
+
+public interface StopEditor {
+	Pane getControl();
+	
+	void bind(EditingDomain editingDomain, ObservableList<FxStop> stops);
+}
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/DefaultGradientPreview.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/DefaultGradientPreview.java
new file mode 100644
index 0000000..10b31a2
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/DefaultGradientPreview.java
@@ -0,0 +1,45 @@
+package org.eclipse.fx.ide.gradient.app.impl;
+
+import java.util.Arrays;
+
+import javafx.beans.property.Property;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.beans.value.ObservableValue;
+import javafx.geometry.Insets;
+import javafx.scene.layout.GridPane;
+import javafx.scene.paint.Paint;
+import javafx.scene.shape.Rectangle;
+
+import org.eclipse.emf.ecore.change.util.ChangeRecorder;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.fx.ide.gradient.app.util.GradientConverter;
+import org.eclipse.fx.ide.gradient.model.gradient.FxGradient;
+
+public class DefaultGradientPreview extends GridPane {
+	private Rectangle rect;
+
+	public DefaultGradientPreview() {
+		setHgap(10);
+		setVgap(10);
+		setPadding(new Insets(0, 10, 0, 10));
+		initUI();
+	}
+
+	private void initUI() {
+		// TODO flex size
+		
+		rect = new Rectangle(200, 200);
+		add(rect, 0, 0);
+	}
+
+	public void bind(EditingDomain editingDomain, FxGradient gradient) {
+
+		Property<Paint> v = new SimpleObjectProperty<Paint>();
+		Paint convertedGradient = GradientConverter.convertGradient(gradient);
+		v.setValue(convertedGradient);
+		rect.fillProperty().bindBidirectional(v);
+
+		ChangeRecorder cr = new ChangeRecorder();
+		cr.beginRecording(Arrays.asList(gradient));
+	}
+}
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/DefaultStopEditor.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/DefaultStopEditor.java
new file mode 100644
index 0000000..59425b4
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/DefaultStopEditor.java
@@ -0,0 +1,260 @@
+package org.eclipse.fx.ide.gradient.app.impl;
+
+import javafx.beans.property.Property;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+import javafx.collections.ObservableList;
+import javafx.event.ActionEvent;
+import javafx.event.EventHandler;
+import javafx.geometry.Insets;
+import javafx.scene.control.Button;
+import javafx.scene.control.ColorPicker;
+import javafx.scene.control.ListCell;
+import javafx.scene.control.ListView;
+import javafx.scene.control.TextField;
+import javafx.scene.layout.GridPane;
+import javafx.scene.layout.Pane;
+import javafx.scene.paint.Color;
+import javafx.scene.shape.Rectangle;
+import javafx.util.Callback;
+import javafx.util.converter.DoubleStringConverter;
+
+import org.eclipse.core.databinding.UpdateValueStrategy;
+import org.eclipse.core.databinding.conversion.Converter;
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.core.databinding.observable.value.WritableValue;
+import org.eclipse.emf.databinding.EMFDataBindingContext;
+import org.eclipse.emf.databinding.EMFProperties;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.fx.core.databinding.AdapterFactory;
+import org.eclipse.fx.core.databinding.ObservableWritableValue;
+import org.eclipse.fx.emf.databinding.edit.EMFEditFXProperties;
+import org.eclipse.fx.ide.gradient.app.StopEditor;
+import org.eclipse.fx.ide.gradient.app.util.GradientConverter;
+import org.eclipse.fx.ide.gradient.model.gradient.FxColor;
+import org.eclipse.fx.ide.gradient.model.gradient.FxStop;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientFactory;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientPackage;
+import org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor;
+
+public class DefaultStopEditor extends GridPane implements StopEditor {
+	private final IObservableValue selectedStop = new WritableValue();
+
+	private ListView<FxStop> stops;
+	private Button bAdd;
+	private Button bUp;
+	private Button bDown;
+	private Button bRemove;
+	private ColorPicker colorPicker;
+	private TextField offset;
+
+	public DefaultStopEditor() {
+		setHgap(10);
+		setVgap(10);
+		setPadding(new Insets(0, 10, 0, 10));
+		initUI();
+	}
+
+	private void initUI() {
+		stops = new ListView<>();
+		add(stops, 0, 0, 1, 5);
+		stops.setCellFactory(new Callback<ListView<FxStop>, ListCell<FxStop>>() {
+			@Override
+			public ListCell<FxStop> call(ListView<FxStop> list) {
+				return new ColorRectCell();
+			}
+		});
+
+		bAdd = new Button();
+		bAdd.setText("Add");
+		bAdd.setMinWidth(0.3);
+		add(bAdd, 1, 0);
+		bUp = new Button();
+		bUp.setText("Up");
+		add(bUp, 1, 1);
+		bDown = new Button();
+		bDown.setText("Down");
+		add(bDown, 1, 2);
+		bRemove = new Button();
+		bRemove.setText("Remove");
+		add(bRemove, 1, 3);
+
+		colorPicker = new ColorPicker();
+		add(colorPicker, 2, 0);
+
+		offset = new TextField();
+		add(offset, 2, 1);
+	}
+
+	@Override
+	public Pane getControl() {
+		return this;
+	}
+
+	@Override
+	public void bind(EditingDomain editingDomain, ObservableList<FxStop> data) {
+		stops.setItems(data);
+		if (!data.isEmpty()) {
+			selectedStop.setValue(data.get(0));
+			// colorVal.setValue(GradientConverter.convertColor(data.get(0).getColor()));
+		}
+		stops.getSelectionModel().selectedItemProperty()
+				.addListener(new ChangeListener<FxStop>() {
+					@Override
+					public void changed(
+							ObservableValue<? extends FxStop> observable,
+							FxStop oldValue, FxStop newValue) {
+						if (oldValue!= null)
+						System.err.println("old " + oldValue.getOffset());
+						if (newValue!= null)
+						System.err.println("new " + newValue.getOffset());
+
+						selectedStop.setValue(newValue);
+					}
+				});
+
+		bAdd.setOnAction(new EventHandler<ActionEvent>() {
+			@Override
+			public void handle(ActionEvent t) {
+				FxStop newStop = GradientFactory.eINSTANCE.createFxStop();
+				newStop.setOffset(1.33);
+				RgbFxColor c = GradientFactory.eINSTANCE.createRgbFxColor();
+				c.setBlue(1);
+				c.setGreen(0);
+				c.setOpacity(1);
+				c.setRed(0);
+				newStop.setColor(c);
+				data.add(newStop);
+				stops.getSelectionModel().select(newStop);
+			}
+		});
+
+		bRemove.setOnAction(new EventHandler<ActionEvent>() {
+			@Override
+			public void handle(ActionEvent t) {
+				FxStop toDel = stops.getSelectionModel().getSelectedItem();
+				if (toDel != null) {
+					if (toDel == data.get(0)) {
+						stops.getSelectionModel().selectNext();
+					} else {
+						stops.getSelectionModel().selectPrevious();
+					}
+					data.remove(toDel);
+				}
+			}
+		});
+
+		bUp.setOnAction(new EventHandler<ActionEvent>() {
+			@Override
+			public void handle(ActionEvent t) {
+				FxStop sel = stops.getSelectionModel().getSelectedItem();
+				data.toString();
+			}
+		});
+		bDown.setOnAction(new EventHandler<ActionEvent>() {
+			@Override
+			public void handle(ActionEvent t) {
+				FxStop sel = stops.getSelectionModel().getSelectedItem();
+				data.toString();
+			}
+		});
+		bindOffset(editingDomain);
+		bindColorPicker();
+	}
+
+	private void bindColorPicker() {
+		IObservableValue colorVal = new WritableValue();
+		IObservableValue fxcolorVal = EMFProperties.value(
+				GradientPackage.Literals.FX_STOP__COLOR).observeDetail(
+				selectedStop);
+
+		UpdateValueStrategy t2m = new UpdateValueStrategy();
+		t2m.setConverter(new Converter(Color.class, FxColor.class) {
+			@Override
+			public Object convert(Object fromObject) {
+				System.err.println("convert t 2 m "
+						+ GradientConverter.convertRgbColor((Color) fromObject));
+				return GradientConverter.convertRgbColor((Color) fromObject);
+			}
+		});
+		UpdateValueStrategy m2t = new UpdateValueStrategy();
+		m2t.setConverter(new Converter(FxColor.class, Color.class) {
+			@Override
+			public Object convert(Object fromObject) {
+				System.err.println("convert m 2 t "
+						+ GradientConverter.convertColor((FxColor) fromObject));
+				return GradientConverter.convertColor((FxColor) fromObject);
+			}
+		});
+		new EMFDataBindingContext().bindValue(colorVal, fxcolorVal, t2m, m2t);
+
+		Property<Color> colorProperty = new SimpleObjectProperty<Color>();
+		ObservableWritableValue<Color> adapted = AdapterFactory.<Color> adapt(colorVal);
+		colorProperty.bind(adapted);
+
+		adapted.addListener(new ChangeListener<Color>() {
+			@Override
+			public void changed(ObservableValue<? extends Color> observable,
+					Color oldValue, Color newValue) {
+				System.err.println("old color: " + oldValue);
+				System.err.println("new color: " + newValue);
+
+			}
+		});
+		
+		colorProperty.addListener(new ChangeListener<Color>() {
+			@Override
+			public void changed(ObservableValue<? extends Color> observable,
+					Color oldValue, Color newValue) {
+				System.err.println("colorProperty old color: " + oldValue);
+				System.err.println("colorProperty new color: " + newValue);
+			}
+		});
+
+		colorPicker.valueProperty().bindBidirectional(colorProperty);
+		
+		colorPicker.valueProperty().addListener(new ChangeListener<Color>() {
+			@Override
+			public void changed(ObservableValue<? extends Color> observable,
+					Color oldValue, Color newValue) {
+				System.err.println("colorPicker old color: " + oldValue);
+				System.err.println("colorPicker new color: " + newValue);
+				// FIXME binding does not work here
+				colorProperty.setValue(newValue);
+			}
+		});
+		
+//		colorPicker.setOnAction(new EventHandler<ActionEvent>() {
+//			@Override
+//			public void handle(ActionEvent t) {
+//				stops.getCellFactory().call(stops).updateListView(stops);
+//			}
+//		});
+	}
+
+	private void bindOffset(EditingDomain editingDomain) {
+		Property<Double> offsetProperty = EMFEditFXProperties.value(
+				editingDomain, (EObject) selectedStop.getValue(),
+				GradientPackage.Literals.FX_STOP__OFFSET);
+		offset.textProperty().bindBidirectional(offsetProperty,
+				new DoubleStringConverter());
+	}
+
+	static class ColorRectCell extends ListCell<FxStop> {
+		@Override
+		public void updateItem(FxStop item, boolean empty) {
+			super.updateItem(item, empty);
+			Rectangle rect = new Rectangle(20, 20);
+			if (item != null) {
+				rect.setFill(GradientConverter.convertColor(item.getColor()));
+				setGraphic(rect);
+				setText(item.getOffset() + ""); //$NON-NLS-1$
+			} else {
+				setGraphic(null);
+				setText(null); //$NON-NLS-1$
+			}
+		}
+	}
+}
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/LinearGradientDetailTab.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/LinearGradientDetailTab.java
new file mode 100644
index 0000000..8e4e527
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/LinearGradientDetailTab.java
@@ -0,0 +1,159 @@
+package org.eclipse.fx.ide.gradient.app.impl;
+
+import javafx.beans.property.Property;
+import javafx.beans.value.ObservableValue;
+import javafx.scene.control.ComboBox;
+import javafx.scene.control.Label;
+import javafx.scene.control.Slider;
+import javafx.scene.control.Tab;
+import javafx.scene.control.TextField;
+import javafx.scene.layout.GridPane;
+import javafx.util.converter.NumberStringConverter;
+
+import org.eclipse.core.databinding.observable.list.IObservableList;
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.core.databinding.observable.value.WritableValue;
+import org.eclipse.emf.databinding.EMFProperties;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.fx.core.databinding.AdapterFactory;
+import org.eclipse.fx.emf.databinding.edit.EMFEditFXProperties;
+import org.eclipse.fx.ide.gradient.app.StopEditor;
+import org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod;
+import org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientPackage;
+
+import com.sun.javafx.collections.ImmutableObservableList;
+
+public class LinearGradientDetailTab extends Tab {
+	private StopEditor stopEditor = null;
+	private DefaultGradientPreview preview = null;
+
+	private TextField startX;
+	private TextField endX;
+	private TextField startY;
+	private TextField endY;
+	private ComboBox<FxCycleMethod> cycleMethod;
+
+	private Slider sStartX;
+	private Slider sEndX;
+	private Slider sStartY;
+	private Slider sEndY;
+
+	public void initUI() {
+		setClosable(false);
+		setText("Linear");
+
+		GridPane contentPane = new GridPane();
+		setContent(contentPane);
+
+		preview = new DefaultGradientPreview();
+		contentPane.add(preview, 0, 0);
+		GridPane detailPane = new GridPane();
+		contentPane.add(detailPane, 0, 1);
+		stopEditor = new DefaultStopEditor();
+		contentPane.add(stopEditor.getControl(), 1, 0, 1, 2);
+
+		Label lStartX = new Label();
+		lStartX.setText("Start X");
+		detailPane.add(lStartX, 0, 1);
+
+		startX = new TextField();
+		detailPane.add(startX, 1, 1);
+
+		sStartX = new Slider();
+		sStartX.setMin(0);
+		sStartX.setMax(1);
+		detailPane.add(sStartX, 2, 1);
+
+		Label lEndX = new Label();
+		lEndX.setText("End X");
+		detailPane.add(lEndX, 0, 2);
+
+		endX = new TextField();
+		detailPane.add(endX, 1, 2);
+
+		sEndX = new Slider();
+		sEndX.setMin(0);
+		sEndX.setMax(1);
+		detailPane.add(sEndX, 2, 2);
+
+		Label lStartY = new Label();
+		lStartY.setText("Start Y");
+		detailPane.add(lStartY, 0, 3);
+
+		startY = new TextField();
+		detailPane.add(startY, 1, 3);
+
+		sStartY = new Slider();
+		sStartY.setMin(0);
+		sStartY.setMax(1);
+		detailPane.add(sStartY, 2, 3);
+
+		Label lEndY = new Label();
+		lEndY.setText("End Y");
+		detailPane.add(lEndY, 0, 4);
+
+		endY = new TextField();
+		detailPane.add(endY, 1, 4);
+
+		sEndY = new Slider();
+		sEndY.setMin(0);
+		sEndY.setMax(1);
+		detailPane.add(sEndY, 2, 4);
+
+		Label lCycleMethod = new Label();
+		lCycleMethod.setText("Cycle Method");
+		detailPane.add(lCycleMethod, 0, 5);
+
+		cycleMethod = new ComboBox<>();
+		detailPane.add(cycleMethod, 1, 5);
+		cycleMethod.setItems(new ImmutableObservableList<FxCycleMethod>(
+				FxCycleMethod.values()));
+
+	}
+
+	public void bind(EditingDomain editingDomain, FxLinearGradient gradient) {
+		Property<Number> propertyStartX = EMFEditFXProperties.value(
+				editingDomain, gradient,
+				GradientPackage.Literals.FX_LINEAR_GRADIENT__START_X);
+		startX.textProperty().bindBidirectional(propertyStartX,
+				new NumberStringConverter());
+		Property<Number> propertyStartY = EMFEditFXProperties.value(
+				editingDomain, gradient,
+				GradientPackage.Literals.FX_LINEAR_GRADIENT__START_Y);
+		startY.textProperty().bindBidirectional(propertyStartY,
+				new NumberStringConverter());
+		Property<Number> propertyEndX = EMFEditFXProperties.value(
+				editingDomain, gradient,
+				GradientPackage.Literals.FX_LINEAR_GRADIENT__END_X);
+		endX.textProperty().bindBidirectional(propertyEndX,
+				new NumberStringConverter());
+		Property<Number> propertyEndY = EMFEditFXProperties.value(
+				editingDomain, gradient,
+				GradientPackage.Literals.FX_LINEAR_GRADIENT__END_Y);
+		endY.textProperty().bindBidirectional(propertyEndY,
+				new NumberStringConverter());
+
+		IObservableValue v = new WritableValue();
+		v.setValue(gradient);
+		IObservableList stopList = EMFProperties.list(
+				GradientPackage.Literals.FX_GRADIENT__STOPS).observeDetail(v);
+		stopEditor.bind(editingDomain, AdapterFactory.adapt(stopList));
+		preview.bind(editingDomain, gradient);
+
+		// TODO bind cyclemethod, proportional
+
+		// IObservableValue mProp = EMFProperties.value(
+		// GradientPackage.Literals.FX_GRADIENT__CYCLE_METHOD).observe(
+		// gradient);
+		// IObservableValue vProp =
+		// JFXUIProperties.singleViewSelection().observe(
+		// cycleMethod);
+		// new EMFDataBindingContext().bindValue(vProp, mProp);
+
+		sStartX.valueProperty().bindBidirectional(propertyStartX);
+		sEndX.valueProperty().bindBidirectional(propertyEndX);
+		sStartY.valueProperty().bindBidirectional(propertyStartY);
+		sEndY.valueProperty().bindBidirectional(propertyEndY);
+	}
+}
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/RadialGradientDetailTab.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/RadialGradientDetailTab.java
new file mode 100644
index 0000000..a4176c2
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/impl/RadialGradientDetailTab.java
@@ -0,0 +1,168 @@
+package org.eclipse.fx.ide.gradient.app.impl;
+
+import javafx.beans.property.Property;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.ComboBox;
+import javafx.scene.control.Label;
+import javafx.scene.control.Slider;
+import javafx.scene.control.Tab;
+import javafx.scene.control.TextField;
+import javafx.scene.layout.GridPane;
+import javafx.util.converter.NumberStringConverter;
+
+import org.eclipse.core.databinding.observable.list.IObservableList;
+import org.eclipse.core.databinding.observable.value.IObservableValue;
+import org.eclipse.core.databinding.observable.value.WritableValue;
+import org.eclipse.emf.databinding.EMFProperties;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.fx.core.databinding.AdapterFactory;
+import org.eclipse.fx.emf.databinding.edit.EMFEditFXProperties;
+import org.eclipse.fx.ide.gradient.app.StopEditor;
+import org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod;
+import org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientPackage;
+
+import com.sun.javafx.collections.ImmutableObservableList;
+
+public class RadialGradientDetailTab extends Tab {
+	private StopEditor stopEditor = null;
+	private DefaultGradientPreview preview = null;
+	private TextField centerX;
+	private TextField centerY;
+	private TextField focusAngle;
+	private TextField focusDistance;
+	private TextField radius;
+	private CheckBox proportional;
+	private ComboBox<FxCycleMethod> cycleMethod;
+
+	private Slider sCenterX;
+	private Slider sCenterY;
+	private Slider sFocusAngle;
+	private Slider sFocusDistance;
+
+	public void initUI() {
+		setClosable(false);
+		setText("Radial");
+		
+		
+		
+		GridPane contentPane = new GridPane();
+		setContent(contentPane);
+
+		preview = new DefaultGradientPreview();
+		contentPane.add(preview, 0, 0);
+		GridPane detailPane = new GridPane();
+		contentPane.add(detailPane, 0, 1);
+		stopEditor = new DefaultStopEditor();
+		contentPane.add(stopEditor.getControl(), 1,0, 1, 2);
+
+		Label lCenterX = new Label();
+		lCenterX.setText("Center X");
+		detailPane.add(lCenterX, 0, 1);
+
+		centerX = new TextField();
+		detailPane.add(centerX, 1, 1);
+
+		sCenterX = new Slider();
+		sCenterX.setMin(0);
+		sCenterX.setMax(1);
+		detailPane.add(sCenterX, 2, 1);
+
+		Label lCenterY = new Label();
+		lCenterY.setText("Center Y");
+		detailPane.add(lCenterY, 0, 2);
+
+		centerY = new TextField();
+		detailPane.add(centerY, 1, 2);
+
+		sCenterY = new Slider();
+		sCenterY.setMin(0);
+		sCenterY.setMax(1);
+		detailPane.add(sCenterY, 2, 2);
+
+		Label lFocusAngle = new Label();
+		lFocusAngle.setText("Focus Angle");
+		detailPane.add(lFocusAngle, 0, 3);
+
+		focusAngle = new TextField();
+		detailPane.add(focusAngle, 1, 3);
+
+		sFocusAngle = new Slider();
+		sFocusAngle.setMin(0);
+		sFocusAngle.setMax(360); // in degrees
+		detailPane.add(sFocusAngle, 2, 3);
+
+		Label lFocusDistance = new Label();
+		lFocusDistance.setText("Focus Distance");
+		detailPane.add(lFocusDistance, 0, 4);
+
+		focusDistance = new TextField();
+		detailPane.add(focusDistance, 1, 4);
+
+		sFocusDistance = new Slider();
+		sFocusDistance.setMin(-1);
+		sFocusDistance.setMax(1);
+		detailPane.add(sFocusDistance, 2, 4);
+
+		Label lRadius = new Label();
+		lRadius.setText("Radius");
+		detailPane.add(lRadius, 0, 5);
+
+		radius = new TextField();
+		detailPane.add(radius, 1, 5);
+
+		proportional = new CheckBox();
+		proportional.setText("Proportional");
+		detailPane.add(proportional, 1, 6);
+
+		Label lCycleMethod = new Label();
+		lCycleMethod.setText("Cycle Method");
+		detailPane.add(lCycleMethod, 0, 7);
+
+		cycleMethod = new ComboBox<>();
+		detailPane.add(cycleMethod, 1, 7);
+		cycleMethod.setItems(new ImmutableObservableList<FxCycleMethod>(
+				FxCycleMethod.values()));
+	}
+
+	public void bind(EditingDomain editingDomain, FxRadialGradient gradient) {
+		Property<Number> propertyCenterX = EMFEditFXProperties.value(
+				editingDomain, gradient,
+				GradientPackage.Literals.FX_RADIAL_GRADIENT__CENTER_X);
+		centerX.textProperty().bindBidirectional(propertyCenterX,
+				new NumberStringConverter());
+		Property<Number> propertyCenterY = EMFEditFXProperties.value(
+				editingDomain, gradient,
+				GradientPackage.Literals.FX_RADIAL_GRADIENT__CENTER_Y);
+		centerY.textProperty().bindBidirectional(propertyCenterY,
+				new NumberStringConverter());
+		Property<Number> propertyFocusAngle = EMFEditFXProperties.value(
+				editingDomain, gradient,
+				GradientPackage.Literals.FX_RADIAL_GRADIENT__FOCUS_ANGLE);
+		focusAngle.textProperty().bindBidirectional(propertyFocusAngle,
+				new NumberStringConverter());
+		Property<Number> propertyFocusDistance = EMFEditFXProperties.value(
+				editingDomain, gradient,
+				GradientPackage.Literals.FX_RADIAL_GRADIENT__FOCUS_DISTANCE);
+		focusDistance.textProperty().bindBidirectional(propertyFocusDistance,
+				new NumberStringConverter());
+		Property<Number> propertyRadius = EMFEditFXProperties.value(
+				editingDomain, gradient,
+				GradientPackage.Literals.FX_RADIAL_GRADIENT__RADIUS);
+		radius.textProperty().bindBidirectional(propertyRadius,
+				new NumberStringConverter());
+
+		IObservableValue v = new WritableValue();
+		v.setValue(gradient);
+		IObservableList stopList = EMFProperties.list(
+				GradientPackage.Literals.FX_GRADIENT__STOPS).observeDetail(v);
+		stopEditor.bind(editingDomain, AdapterFactory.adapt(stopList));
+		preview.bind(editingDomain, gradient);
+		// TODO bind cyclemethod, proportional
+
+		sCenterX.valueProperty().bindBidirectional(propertyCenterX);
+		sCenterY.valueProperty().bindBidirectional(propertyCenterY);
+		sFocusAngle.valueProperty().bindBidirectional(propertyFocusAngle);
+		sFocusDistance.valueProperty().bindBidirectional(propertyFocusDistance);
+	}
+}
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/util/GradientConverter.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/util/GradientConverter.java
new file mode 100644
index 0000000..0b6eb93
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.app/src/org/eclipse/fx/ide/gradient/app/util/GradientConverter.java
@@ -0,0 +1,147 @@
+package org.eclipse.fx.ide.gradient.app.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javafx.scene.paint.Color;
+import javafx.scene.paint.CycleMethod;
+import javafx.scene.paint.LinearGradient;
+import javafx.scene.paint.Paint;
+import javafx.scene.paint.RadialGradient;
+import javafx.scene.paint.Stop;
+
+import org.eclipse.fx.ide.gradient.model.gradient.FxColor;
+import org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod;
+import org.eclipse.fx.ide.gradient.model.gradient.FxGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.FxStop;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientFactory;
+import org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor;
+
+public class GradientConverter {
+	public static Paint convertGradient(FxGradient g) {
+		if (g == null) {
+			return null;
+		}
+		if (g instanceof FxLinearGradient) {
+			return convertLinearGradient((FxLinearGradient) g);
+		} else if (g instanceof FxRadialGradient) {
+			return convertRadialGradient((FxRadialGradient) g);
+		} else {
+			throw new UnsupportedOperationException(
+					"Gradient conversion not implemented for type " + g.getClass()); //$NON-NLS-1$
+		}
+	}
+
+	public static LinearGradient convertLinearGradient(FxLinearGradient g) {
+		if (g == null) {
+			return null;
+		}
+		return new LinearGradient(g.getStartX(), g.getStartY(), g.getEndX(),
+				g.getEndY(), g.isProportional(),
+				convertCycleMethod(g.getCycleMethod()),
+				convertFxStops(g.getStops()));
+	}
+
+	public static RadialGradient convertRadialGradient(FxRadialGradient g) {
+		if (g == null) {
+			return null;
+		}
+		return new RadialGradient(g.getFocusAngle(), g.getFocusDistance(),
+				g.getCenterX(), g.getCenterY(), g.getRadius(),
+				g.isProportional(), convertCycleMethod(g.getCycleMethod()),
+				convertFxStops(g.getStops()));
+	}
+
+	public static List<Stop> convertFxStops(List<FxStop> stops) {
+		List<Stop> fxStops = new ArrayList<Stop>();
+		if (stops != null) {
+			for (FxStop s : stops) {
+				fxStops.add(convertStop(s));
+			}
+		}
+		return fxStops;
+	}
+
+	public static List<FxStop> convertStops(List<Stop> stops) {
+		List<FxStop> fxStops = new ArrayList<FxStop>();
+		if (stops != null) {
+			for (Stop s : stops) {
+				fxStops.add(convertStop(s));
+			}
+		}
+		return fxStops;
+	}
+
+	public static Stop convertStop(FxStop s) {
+		if (s == null) {
+			return null;
+		}
+		return new Stop(s.getOffset(), convertColor(s.getColor()));
+	}
+
+	public static FxStop convertStop(Stop s) {
+		if (s == null) {
+			return null;
+		}
+		FxStop stop = GradientFactory.eINSTANCE.createFxStop();
+		stop.setOffset(s.getOffset());
+		stop.setColor(convertRgbColor(s.getColor()));
+		return stop;
+	}
+
+	public static Color convertColor(FxColor color) {
+		if (color == null) {
+			return null;
+		}
+		if (color instanceof RgbFxColor) {
+			RgbFxColor rgb = (RgbFxColor) color;
+			return new Color(rgb.getRed(), rgb.getGreen(), rgb.getBlue(),
+					rgb.getOpacity());
+		} else {
+			throw new UnsupportedOperationException(
+					"Color conversion not implemented for type " + color.getClass()); //$NON-NLS-1$
+		}
+	}
+
+	public static RgbFxColor convertRgbColor(Color color) {
+		if (color == null) {
+			return null;
+		}
+		RgbFxColor rgb = GradientFactory.eINSTANCE.createRgbFxColor();
+		rgb.setRed(color.getRed());
+		rgb.setGreen(color.getGreen());
+		rgb.setBlue(color.getBlue());
+		rgb.setOpacity(color.getOpacity());
+		return rgb;
+	}
+
+	public static CycleMethod convertCycleMethod(FxCycleMethod cycleMethod) {
+		switch (cycleMethod) {
+		case NO_CYCLE:
+			return CycleMethod.NO_CYCLE;
+		case REFLECT:
+			return CycleMethod.REFLECT;
+		case REPEAT:
+			return CycleMethod.REPEAT;
+		default:
+			throw new UnsupportedOperationException(
+					"unknown cycle method: " + cycleMethod); //$NON-NLS-1$
+		}
+	}
+
+	public static FxCycleMethod convertCycleMethod(CycleMethod cycleMethod) {
+		switch (cycleMethod) {
+		case NO_CYCLE:
+			return FxCycleMethod.NO_CYCLE;
+		case REFLECT:
+			return FxCycleMethod.REFLECT;
+		case REPEAT:
+			return FxCycleMethod.REPEAT;
+		default:
+			throw new UnsupportedOperationException(
+					"unknown cycle method: " + cycleMethod); //$NON-NLS-1$
+		}
+	}
+}
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.classpath b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.gitignore b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.project b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.project
new file mode 100644
index 0000000..0b7ffcb
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.fx.ide.gradient.model</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.settings/org.eclipse.jdt.core.prefs b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/META-INF/MANIFEST.MF b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b0aecfd
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-SymbolicName: org.eclipse.fx.ide.gradient.model;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.emf.ecore;visibility:=reexport
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.fx.ide.gradient.model.gradient,
+ org.eclipse.fx.ide.gradient.model.gradient.impl,
+ org.eclipse.fx.ide.gradient.model.gradient.util
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/OSGI-INF/l10n/bundle.properties b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/OSGI-INF/l10n/bundle.properties
new file mode 100755
index 0000000..56a22cc
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/OSGI-INF/l10n/bundle.properties
@@ -0,0 +1,3 @@
+#Properties file for org.eclipse.fx.ide.gradient.model
+Bundle-Vendor = BestSolution.at
+Bundle-Name = JavaFX Eclipse Databinding
\ No newline at end of file
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/about.html b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/about.html
new file mode 100644
index 0000000..c258ef5
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>June 5, 2006</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org/">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/build.properties b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/build.properties
new file mode 100644
index 0000000..9af4c1f
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/build.properties
@@ -0,0 +1,10 @@
+#
+
+bin.includes = .,\
+               model/,\
+               META-INF/,\
+               plugin.xml,\
+               OSGI-INF/
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/model/Gradient.ecore b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/model/Gradient.ecore
new file mode 100644
index 0000000..4eb4758
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/model/Gradient.ecore
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="gradient" nsURI="http://www.eclipse.org/efxclipse/tooling/fxgraph/Gradient"
+    nsPrefix="gradient">
+  <eClassifiers xsi:type="ecore:EClass" name="FxGradient" abstract="true">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="proportional" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="cycleMethod" eType="#//FxCycleMethod"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="stops" upperBound="-1"
+        eType="#//FxStop" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FxLinearGradient" eSuperTypes="#//FxGradient">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startX" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="startY" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="endX" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="endY" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FxRadialGradient" eSuperTypes="#//FxGradient">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="focusAngle" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="focusDistance" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="centerX" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="centerY" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="radius" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FxStop">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="color" eType="#//FxColor"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="offset" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="FxColor" abstract="true"/>
+  <eClassifiers xsi:type="ecore:EClass" name="RgbFxColor" eSuperTypes="#//FxColor">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="red" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="green" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="blue" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="opacity" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDouble"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EEnum" name="FxCycleMethod">
+    <eLiterals name="noCycle" literal="noCycle"/>
+    <eLiterals name="reflect" value="1" literal="reflect"/>
+    <eLiterals name="repeat" value="2" literal="repeat"/>
+  </eClassifiers>
+</ecore:EPackage>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/model/Gradient.genmodel b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/model/Gradient.genmodel
new file mode 100644
index 0000000..bfb1b24
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/model/Gradient.genmodel
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="" modelDirectory="/org.eclipse.fx.ide.gradient.model/src"
+    modelPluginID="org.eclipse.fx.ide.gradient.model" modelName="Gradient" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
+    importerID="org.eclipse.emf.importer.ecore" complianceLevel="7.0" copyrightFields="false"
+    operationReflection="true" importOrganizing="true">
+  <foreignModel>Gradient.ecore</foreignModel>
+  <genPackages prefix="Gradient" basePackage="org.eclipse.fx.ide.gradient.model" disposableProviderFactory="true"
+      ecorePackage="Gradient.ecore#/">
+    <genEnums typeSafeEnumCompatible="false" ecoreEnum="Gradient.ecore#//CycleMethod">
+      <genEnumLiterals ecoreEnumLiteral="Gradient.ecore#//CycleMethod/noCycle"/>
+      <genEnumLiterals ecoreEnumLiteral="Gradient.ecore#//CycleMethod/reflect"/>
+      <genEnumLiterals ecoreEnumLiteral="Gradient.ecore#//CycleMethod/repeat"/>
+    </genEnums>
+    <genClasses image="false" ecoreClass="Gradient.ecore#//Gradient">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//Gradient/proportional"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//Gradient/cycleMethod"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Gradient.ecore#//Gradient/stops"/>
+    </genClasses>
+    <genClasses ecoreClass="Gradient.ecore#//LinearGradient">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//LinearGradient/startX"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//LinearGradient/startY"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//LinearGradient/endX"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//LinearGradient/endY"/>
+    </genClasses>
+    <genClasses ecoreClass="Gradient.ecore#//RadialGradient">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//RadialGradient/focusAngle"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//RadialGradient/focusDistance"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//RadialGradient/centerX"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//RadialGradient/centerY"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//RadialGradient/radius"/>
+    </genClasses>
+    <genClasses ecoreClass="Gradient.ecore#//Stop">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference Gradient.ecore#//Stop/color"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//Stop/offset"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="Gradient.ecore#//Color"/>
+    <genClasses ecoreClass="Gradient.ecore#//RGBColor">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//RGBColor/red"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//RGBColor/green"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//RGBColor/blue"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute Gradient.ecore#//RGBColor/opacity"/>
+    </genClasses>
+  </genPackages>
+</genmodel:GenModel>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/plugin.properties b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/plugin.properties
new file mode 100644
index 0000000..07a9e76
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/plugin.properties
@@ -0,0 +1,4 @@
+#
+
+pluginName = Gradient Model
+providerName = www.example.org
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/plugin.xml b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/plugin.xml
new file mode 100644
index 0000000..749c5ed
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/plugin.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+-->
+
+<plugin>
+
+   <extension point="org.eclipse.emf.ecore.generated_package">
+      <!-- @generated Gradient -->
+      <package
+            uri="http://www.eclipse.org/efxclipse/tooling/fxgraph/Gradient"
+            class="org.eclipse.fx.ide.gradient.model.gradient.GradientPackage"
+            genModel="model/Gradient.genmodel"/>
+   </extension>
+
+</plugin>
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/pom.xml b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/pom.xml
new file mode 100755
index 0000000..d1690cb
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/pom.xml
@@ -0,0 +1,34 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<name>e(fx)clipse - IDE - Gradient model</name>
+	<groupId>org.eclipse.fx.ide</groupId>
+	<artifactId>org.eclipse.fx.ide.gradient.model</artifactId>
+	<packaging>eclipse-plugin</packaging>
+
+	<parent>
+		<groupId>org.eclipse.fx.ide</groupId>
+		<artifactId>releng</artifactId>
+		<relativePath>../../../releng/org.eclipse.fx.ide.releng/pom.xml</relativePath>
+		<version>1.0.0-SNAPSHOT</version>
+	</parent>
+
+	<build>
+		<resources>
+			<!-- to ensure that the feature lookup of the ui test works -->
+			<resource>
+				<directory>.</directory>
+				<includes>
+					<include>META-INF/</include>
+				</includes>
+			</resource>
+		</resources>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-source-plugin</artifactId>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
\ No newline at end of file
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxColor.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxColor.java
new file mode 100644
index 0000000..bca4028
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxColor.java
@@ -0,0 +1,18 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Fx Color</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxColor()
+ * @model abstract="true"
+ * @generated
+ */
+public interface FxColor extends EObject {
+} // FxColor
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxCycleMethod.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxCycleMethod.java
new file mode 100644
index 0000000..4e2e46e
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxCycleMethod.java
@@ -0,0 +1,235 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.emf.common.util.Enumerator;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the literals of the enumeration '<em><b>Fx Cycle Method</b></em>',
+ * and utility methods for working with them.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxCycleMethod()
+ * @model
+ * @generated
+ */
+public enum FxCycleMethod implements Enumerator {
+	/**
+	 * The '<em><b>No Cycle</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #NO_CYCLE_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	NO_CYCLE(0, "noCycle", "noCycle"),
+
+	/**
+	 * The '<em><b>Reflect</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #REFLECT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	REFLECT(1, "reflect", "reflect"),
+
+	/**
+	 * The '<em><b>Repeat</b></em>' literal object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #REPEAT_VALUE
+	 * @generated
+	 * @ordered
+	 */
+	REPEAT(2, "repeat", "repeat");
+
+	/**
+	 * The '<em><b>No Cycle</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>No Cycle</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #NO_CYCLE
+	 * @model name="noCycle"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int NO_CYCLE_VALUE = 0;
+
+	/**
+	 * The '<em><b>Reflect</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Reflect</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #REFLECT
+	 * @model name="reflect"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int REFLECT_VALUE = 1;
+
+	/**
+	 * The '<em><b>Repeat</b></em>' literal value.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of '<em><b>Repeat</b></em>' literal object isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @see #REPEAT
+	 * @model name="repeat"
+	 * @generated
+	 * @ordered
+	 */
+	public static final int REPEAT_VALUE = 2;
+
+	/**
+	 * An array of all the '<em><b>Fx Cycle Method</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static final FxCycleMethod[] VALUES_ARRAY =
+		new FxCycleMethod[] {
+			NO_CYCLE,
+			REFLECT,
+			REPEAT,
+		};
+
+	/**
+	 * A public read-only list of all the '<em><b>Fx Cycle Method</b></em>' enumerators.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static final List<FxCycleMethod> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+
+	/**
+	 * Returns the '<em><b>Fx Cycle Method</b></em>' literal with the specified literal value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static FxCycleMethod get(String literal) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			FxCycleMethod result = VALUES_ARRAY[i];
+			if (result.toString().equals(literal)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Fx Cycle Method</b></em>' literal with the specified name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static FxCycleMethod getByName(String name) {
+		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
+			FxCycleMethod result = VALUES_ARRAY[i];
+			if (result.getName().equals(name)) {
+				return result;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the '<em><b>Fx Cycle Method</b></em>' literal with the specified integer value.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static FxCycleMethod get(int value) {
+		switch (value) {
+			case NO_CYCLE_VALUE: return NO_CYCLE;
+			case REFLECT_VALUE: return REFLECT;
+			case REPEAT_VALUE: return REPEAT;
+		}
+		return null;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final int value;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String name;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private final String literal;
+
+	/**
+	 * Only this class can construct instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private FxCycleMethod(int value, String name, String literal) {
+		this.value = value;
+		this.name = name;
+		this.literal = literal;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getValue() {
+	  return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+	  return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLiteral() {
+	  return literal;
+	}
+
+	/**
+	 * Returns the literal value of the enumerator, which is its string representation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		return literal;
+	}
+	
+} //FxCycleMethod
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxGradient.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxGradient.java
new file mode 100644
index 0000000..6d0e22e
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxGradient.java
@@ -0,0 +1,99 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Fx Gradient</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxGradient#isProportional <em>Proportional</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxGradient#getCycleMethod <em>Cycle Method</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxGradient#getStops <em>Stops</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxGradient()
+ * @model abstract="true"
+ * @generated
+ */
+public interface FxGradient extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Proportional</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Proportional</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Proportional</em>' attribute.
+	 * @see #setProportional(boolean)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxGradient_Proportional()
+	 * @model
+	 * @generated
+	 */
+	boolean isProportional();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxGradient#isProportional <em>Proportional</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Proportional</em>' attribute.
+	 * @see #isProportional()
+	 * @generated
+	 */
+	void setProportional(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Cycle Method</b></em>' attribute.
+	 * The literals are from the enumeration {@link org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Cycle Method</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Cycle Method</em>' attribute.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod
+	 * @see #setCycleMethod(FxCycleMethod)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxGradient_CycleMethod()
+	 * @model
+	 * @generated
+	 */
+	FxCycleMethod getCycleMethod();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxGradient#getCycleMethod <em>Cycle Method</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Cycle Method</em>' attribute.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod
+	 * @see #getCycleMethod()
+	 * @generated
+	 */
+	void setCycleMethod(FxCycleMethod value);
+
+	/**
+	 * Returns the value of the '<em><b>Stops</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.fx.ide.gradient.model.gradient.FxStop}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Stops</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Stops</em>' containment reference list.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxGradient_Stops()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<FxStop> getStops();
+
+} // FxGradient
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxLinearGradient.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxLinearGradient.java
new file mode 100644
index 0000000..afb0528
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxLinearGradient.java
@@ -0,0 +1,131 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Fx Linear Gradient</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getStartX <em>Start X</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getStartY <em>Start Y</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getEndX <em>End X</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getEndY <em>End Y</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxLinearGradient()
+ * @model
+ * @generated
+ */
+public interface FxLinearGradient extends FxGradient {
+
+	/**
+	 * Returns the value of the '<em><b>Start X</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Start X</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Start X</em>' attribute.
+	 * @see #setStartX(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxLinearGradient_StartX()
+	 * @model
+	 * @generated
+	 */
+	double getStartX();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getStartX <em>Start X</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Start X</em>' attribute.
+	 * @see #getStartX()
+	 * @generated
+	 */
+	void setStartX(double value);
+
+	/**
+	 * Returns the value of the '<em><b>Start Y</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Start Y</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Start Y</em>' attribute.
+	 * @see #setStartY(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxLinearGradient_StartY()
+	 * @model
+	 * @generated
+	 */
+	double getStartY();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getStartY <em>Start Y</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Start Y</em>' attribute.
+	 * @see #getStartY()
+	 * @generated
+	 */
+	void setStartY(double value);
+
+	/**
+	 * Returns the value of the '<em><b>End X</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>End X</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>End X</em>' attribute.
+	 * @see #setEndX(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxLinearGradient_EndX()
+	 * @model
+	 * @generated
+	 */
+	double getEndX();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getEndX <em>End X</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>End X</em>' attribute.
+	 * @see #getEndX()
+	 * @generated
+	 */
+	void setEndX(double value);
+
+	/**
+	 * Returns the value of the '<em><b>End Y</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>End Y</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>End Y</em>' attribute.
+	 * @see #setEndY(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxLinearGradient_EndY()
+	 * @model
+	 * @generated
+	 */
+	double getEndY();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getEndY <em>End Y</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>End Y</em>' attribute.
+	 * @see #getEndY()
+	 * @generated
+	 */
+	void setEndY(double value);
+
+} // FxLinearGradient
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxRadialGradient.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxRadialGradient.java
new file mode 100644
index 0000000..d4c8c11
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxRadialGradient.java
@@ -0,0 +1,158 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Fx Radial Gradient</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getFocusAngle <em>Focus Angle</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getFocusDistance <em>Focus Distance</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getCenterX <em>Center X</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getCenterY <em>Center Y</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getRadius <em>Radius</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxRadialGradient()
+ * @model
+ * @generated
+ */
+public interface FxRadialGradient extends FxGradient {
+
+	/**
+	 * Returns the value of the '<em><b>Focus Angle</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Focus Angle</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Focus Angle</em>' attribute.
+	 * @see #setFocusAngle(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxRadialGradient_FocusAngle()
+	 * @model
+	 * @generated
+	 */
+	double getFocusAngle();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getFocusAngle <em>Focus Angle</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Focus Angle</em>' attribute.
+	 * @see #getFocusAngle()
+	 * @generated
+	 */
+	void setFocusAngle(double value);
+
+	/**
+	 * Returns the value of the '<em><b>Focus Distance</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Focus Distance</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Focus Distance</em>' attribute.
+	 * @see #setFocusDistance(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxRadialGradient_FocusDistance()
+	 * @model
+	 * @generated
+	 */
+	double getFocusDistance();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getFocusDistance <em>Focus Distance</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Focus Distance</em>' attribute.
+	 * @see #getFocusDistance()
+	 * @generated
+	 */
+	void setFocusDistance(double value);
+
+	/**
+	 * Returns the value of the '<em><b>Center X</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Center X</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Center X</em>' attribute.
+	 * @see #setCenterX(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxRadialGradient_CenterX()
+	 * @model
+	 * @generated
+	 */
+	double getCenterX();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getCenterX <em>Center X</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Center X</em>' attribute.
+	 * @see #getCenterX()
+	 * @generated
+	 */
+	void setCenterX(double value);
+
+	/**
+	 * Returns the value of the '<em><b>Center Y</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Center Y</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Center Y</em>' attribute.
+	 * @see #setCenterY(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxRadialGradient_CenterY()
+	 * @model
+	 * @generated
+	 */
+	double getCenterY();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getCenterY <em>Center Y</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Center Y</em>' attribute.
+	 * @see #getCenterY()
+	 * @generated
+	 */
+	void setCenterY(double value);
+
+	/**
+	 * Returns the value of the '<em><b>Radius</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Radius</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Radius</em>' attribute.
+	 * @see #setRadius(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxRadialGradient_Radius()
+	 * @model
+	 * @generated
+	 */
+	double getRadius();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getRadius <em>Radius</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Radius</em>' attribute.
+	 * @see #getRadius()
+	 * @generated
+	 */
+	void setRadius(double value);
+
+} // FxRadialGradient
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxStop.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxStop.java
new file mode 100644
index 0000000..14c7cbe
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/FxStop.java
@@ -0,0 +1,77 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Fx Stop</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxStop#getColor <em>Color</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.FxStop#getOffset <em>Offset</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxStop()
+ * @model
+ * @generated
+ */
+public interface FxStop extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Color</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Color</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Color</em>' containment reference.
+	 * @see #setColor(FxColor)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxStop_Color()
+	 * @model containment="true"
+	 * @generated
+	 */
+	FxColor getColor();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxStop#getColor <em>Color</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Color</em>' containment reference.
+	 * @see #getColor()
+	 * @generated
+	 */
+	void setColor(FxColor value);
+
+	/**
+	 * Returns the value of the '<em><b>Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Offset</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Offset</em>' attribute.
+	 * @see #setOffset(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getFxStop_Offset()
+	 * @model
+	 * @generated
+	 */
+	double getOffset();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxStop#getOffset <em>Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Offset</em>' attribute.
+	 * @see #getOffset()
+	 * @generated
+	 */
+	void setOffset(double value);
+
+} // FxStop
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/GradientFactory.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/GradientFactory.java
new file mode 100644
index 0000000..73de04e
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/GradientFactory.java
@@ -0,0 +1,69 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient;
+
+import org.eclipse.emf.ecore.EFactory;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Factory</b> for the model.
+ * It provides a create method for each non-abstract class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage
+ * @generated
+ */
+public interface GradientFactory extends EFactory {
+	/**
+	 * The singleton instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	GradientFactory eINSTANCE = org.eclipse.fx.ide.gradient.model.gradient.impl.GradientFactoryImpl.init();
+
+	/**
+	 * Returns a new object of class '<em>Fx Linear Gradient</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Fx Linear Gradient</em>'.
+	 * @generated
+	 */
+	FxLinearGradient createFxLinearGradient();
+
+	/**
+	 * Returns a new object of class '<em>Fx Radial Gradient</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Fx Radial Gradient</em>'.
+	 * @generated
+	 */
+	FxRadialGradient createFxRadialGradient();
+
+	/**
+	 * Returns a new object of class '<em>Fx Stop</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Fx Stop</em>'.
+	 * @generated
+	 */
+	FxStop createFxStop();
+
+	/**
+	 * Returns a new object of class '<em>Rgb Fx Color</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Rgb Fx Color</em>'.
+	 * @generated
+	 */
+	RgbFxColor createRgbFxColor();
+
+	/**
+	 * Returns the package supported by this factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the package supported by this factory.
+	 * @generated
+	 */
+	GradientPackage getGradientPackage();
+
+} //GradientFactory
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/GradientPackage.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/GradientPackage.java
new file mode 100644
index 0000000..c781c61
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/GradientPackage.java
@@ -0,0 +1,961 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.eclipse.fx.ide.gradient.model.gradient.GradientFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface GradientPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "gradient";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.eclipse.org/efxclipse/tooling/fxgraph/Gradient";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "gradient";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	GradientPackage eINSTANCE = org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxGradientImpl <em>Fx Gradient</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.FxGradientImpl
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxGradient()
+	 * @generated
+	 */
+	int FX_GRADIENT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Proportional</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_GRADIENT__PROPORTIONAL = 0;
+
+	/**
+	 * The feature id for the '<em><b>Cycle Method</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_GRADIENT__CYCLE_METHOD = 1;
+
+	/**
+	 * The feature id for the '<em><b>Stops</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_GRADIENT__STOPS = 2;
+
+	/**
+	 * The number of structural features of the '<em>Fx Gradient</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_GRADIENT_FEATURE_COUNT = 3;
+
+	/**
+	 * The number of operations of the '<em>Fx Gradient</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_GRADIENT_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxLinearGradientImpl <em>Fx Linear Gradient</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.FxLinearGradientImpl
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxLinearGradient()
+	 * @generated
+	 */
+	int FX_LINEAR_GRADIENT = 1;
+
+	/**
+	 * The feature id for the '<em><b>Proportional</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_LINEAR_GRADIENT__PROPORTIONAL = FX_GRADIENT__PROPORTIONAL;
+
+	/**
+	 * The feature id for the '<em><b>Cycle Method</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_LINEAR_GRADIENT__CYCLE_METHOD = FX_GRADIENT__CYCLE_METHOD;
+
+	/**
+	 * The feature id for the '<em><b>Stops</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_LINEAR_GRADIENT__STOPS = FX_GRADIENT__STOPS;
+
+	/**
+	 * The feature id for the '<em><b>Start X</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_LINEAR_GRADIENT__START_X = FX_GRADIENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Start Y</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_LINEAR_GRADIENT__START_Y = FX_GRADIENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>End X</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_LINEAR_GRADIENT__END_X = FX_GRADIENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>End Y</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_LINEAR_GRADIENT__END_Y = FX_GRADIENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Fx Linear Gradient</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_LINEAR_GRADIENT_FEATURE_COUNT = FX_GRADIENT_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Fx Linear Gradient</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_LINEAR_GRADIENT_OPERATION_COUNT = FX_GRADIENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxRadialGradientImpl <em>Fx Radial Gradient</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.FxRadialGradientImpl
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxRadialGradient()
+	 * @generated
+	 */
+	int FX_RADIAL_GRADIENT = 2;
+
+	/**
+	 * The feature id for the '<em><b>Proportional</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_RADIAL_GRADIENT__PROPORTIONAL = FX_GRADIENT__PROPORTIONAL;
+
+	/**
+	 * The feature id for the '<em><b>Cycle Method</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_RADIAL_GRADIENT__CYCLE_METHOD = FX_GRADIENT__CYCLE_METHOD;
+
+	/**
+	 * The feature id for the '<em><b>Stops</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_RADIAL_GRADIENT__STOPS = FX_GRADIENT__STOPS;
+
+	/**
+	 * The feature id for the '<em><b>Focus Angle</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_RADIAL_GRADIENT__FOCUS_ANGLE = FX_GRADIENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Focus Distance</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_RADIAL_GRADIENT__FOCUS_DISTANCE = FX_GRADIENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Center X</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_RADIAL_GRADIENT__CENTER_X = FX_GRADIENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Center Y</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_RADIAL_GRADIENT__CENTER_Y = FX_GRADIENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Radius</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_RADIAL_GRADIENT__RADIUS = FX_GRADIENT_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of structural features of the '<em>Fx Radial Gradient</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_RADIAL_GRADIENT_FEATURE_COUNT = FX_GRADIENT_FEATURE_COUNT + 5;
+
+	/**
+	 * The number of operations of the '<em>Fx Radial Gradient</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_RADIAL_GRADIENT_OPERATION_COUNT = FX_GRADIENT_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxStopImpl <em>Fx Stop</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.FxStopImpl
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxStop()
+	 * @generated
+	 */
+	int FX_STOP = 3;
+
+	/**
+	 * The feature id for the '<em><b>Color</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_STOP__COLOR = 0;
+
+	/**
+	 * The feature id for the '<em><b>Offset</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_STOP__OFFSET = 1;
+
+	/**
+	 * The number of structural features of the '<em>Fx Stop</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_STOP_FEATURE_COUNT = 2;
+
+	/**
+	 * The number of operations of the '<em>Fx Stop</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_STOP_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxColorImpl <em>Fx Color</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.FxColorImpl
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxColor()
+	 * @generated
+	 */
+	int FX_COLOR = 4;
+
+	/**
+	 * The number of structural features of the '<em>Fx Color</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_COLOR_FEATURE_COUNT = 0;
+
+	/**
+	 * The number of operations of the '<em>Fx Color</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int FX_COLOR_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.RgbFxColorImpl <em>Rgb Fx Color</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.RgbFxColorImpl
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getRgbFxColor()
+	 * @generated
+	 */
+	int RGB_FX_COLOR = 5;
+
+	/**
+	 * The feature id for the '<em><b>Red</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RGB_FX_COLOR__RED = FX_COLOR_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Green</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RGB_FX_COLOR__GREEN = FX_COLOR_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Blue</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RGB_FX_COLOR__BLUE = FX_COLOR_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Opacity</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RGB_FX_COLOR__OPACITY = FX_COLOR_FEATURE_COUNT + 3;
+
+	/**
+	 * The number of structural features of the '<em>Rgb Fx Color</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RGB_FX_COLOR_FEATURE_COUNT = FX_COLOR_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of operations of the '<em>Rgb Fx Color</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RGB_FX_COLOR_OPERATION_COUNT = FX_COLOR_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod <em>Fx Cycle Method</em>}' enum.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxCycleMethod()
+	 * @generated
+	 */
+	int FX_CYCLE_METHOD = 6;
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.fx.ide.gradient.model.gradient.FxGradient <em>Fx Gradient</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Fx Gradient</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxGradient
+	 * @generated
+	 */
+	EClass getFxGradient();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxGradient#isProportional <em>Proportional</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Proportional</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxGradient#isProportional()
+	 * @see #getFxGradient()
+	 * @generated
+	 */
+	EAttribute getFxGradient_Proportional();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxGradient#getCycleMethod <em>Cycle Method</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Cycle Method</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxGradient#getCycleMethod()
+	 * @see #getFxGradient()
+	 * @generated
+	 */
+	EAttribute getFxGradient_CycleMethod();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.fx.ide.gradient.model.gradient.FxGradient#getStops <em>Stops</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Stops</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxGradient#getStops()
+	 * @see #getFxGradient()
+	 * @generated
+	 */
+	EReference getFxGradient_Stops();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient <em>Fx Linear Gradient</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Fx Linear Gradient</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient
+	 * @generated
+	 */
+	EClass getFxLinearGradient();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getStartX <em>Start X</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Start X</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getStartX()
+	 * @see #getFxLinearGradient()
+	 * @generated
+	 */
+	EAttribute getFxLinearGradient_StartX();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getStartY <em>Start Y</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Start Y</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getStartY()
+	 * @see #getFxLinearGradient()
+	 * @generated
+	 */
+	EAttribute getFxLinearGradient_StartY();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getEndX <em>End X</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>End X</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getEndX()
+	 * @see #getFxLinearGradient()
+	 * @generated
+	 */
+	EAttribute getFxLinearGradient_EndX();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getEndY <em>End Y</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>End Y</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient#getEndY()
+	 * @see #getFxLinearGradient()
+	 * @generated
+	 */
+	EAttribute getFxLinearGradient_EndY();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient <em>Fx Radial Gradient</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Fx Radial Gradient</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient
+	 * @generated
+	 */
+	EClass getFxRadialGradient();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getFocusAngle <em>Focus Angle</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Focus Angle</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getFocusAngle()
+	 * @see #getFxRadialGradient()
+	 * @generated
+	 */
+	EAttribute getFxRadialGradient_FocusAngle();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getFocusDistance <em>Focus Distance</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Focus Distance</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getFocusDistance()
+	 * @see #getFxRadialGradient()
+	 * @generated
+	 */
+	EAttribute getFxRadialGradient_FocusDistance();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getCenterX <em>Center X</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Center X</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getCenterX()
+	 * @see #getFxRadialGradient()
+	 * @generated
+	 */
+	EAttribute getFxRadialGradient_CenterX();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getCenterY <em>Center Y</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Center Y</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getCenterY()
+	 * @see #getFxRadialGradient()
+	 * @generated
+	 */
+	EAttribute getFxRadialGradient_CenterY();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getRadius <em>Radius</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Radius</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient#getRadius()
+	 * @see #getFxRadialGradient()
+	 * @generated
+	 */
+	EAttribute getFxRadialGradient_Radius();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.fx.ide.gradient.model.gradient.FxStop <em>Fx Stop</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Fx Stop</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxStop
+	 * @generated
+	 */
+	EClass getFxStop();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.fx.ide.gradient.model.gradient.FxStop#getColor <em>Color</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Color</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxStop#getColor()
+	 * @see #getFxStop()
+	 * @generated
+	 */
+	EReference getFxStop_Color();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.FxStop#getOffset <em>Offset</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Offset</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxStop#getOffset()
+	 * @see #getFxStop()
+	 * @generated
+	 */
+	EAttribute getFxStop_Offset();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.fx.ide.gradient.model.gradient.FxColor <em>Fx Color</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Fx Color</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxColor
+	 * @generated
+	 */
+	EClass getFxColor();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor <em>Rgb Fx Color</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Rgb Fx Color</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor
+	 * @generated
+	 */
+	EClass getRgbFxColor();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getRed <em>Red</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Red</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getRed()
+	 * @see #getRgbFxColor()
+	 * @generated
+	 */
+	EAttribute getRgbFxColor_Red();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getGreen <em>Green</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Green</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getGreen()
+	 * @see #getRgbFxColor()
+	 * @generated
+	 */
+	EAttribute getRgbFxColor_Green();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getBlue <em>Blue</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Blue</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getBlue()
+	 * @see #getRgbFxColor()
+	 * @generated
+	 */
+	EAttribute getRgbFxColor_Blue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getOpacity <em>Opacity</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Opacity</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getOpacity()
+	 * @see #getRgbFxColor()
+	 * @generated
+	 */
+	EAttribute getRgbFxColor_Opacity();
+
+	/**
+	 * Returns the meta object for enum '{@link org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod <em>Fx Cycle Method</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for enum '<em>Fx Cycle Method</em>'.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod
+	 * @generated
+	 */
+	EEnum getFxCycleMethod();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	GradientFactory getGradientFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxGradientImpl <em>Fx Gradient</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.FxGradientImpl
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxGradient()
+		 * @generated
+		 */
+		EClass FX_GRADIENT = eINSTANCE.getFxGradient();
+
+		/**
+		 * The meta object literal for the '<em><b>Proportional</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_GRADIENT__PROPORTIONAL = eINSTANCE.getFxGradient_Proportional();
+
+		/**
+		 * The meta object literal for the '<em><b>Cycle Method</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_GRADIENT__CYCLE_METHOD = eINSTANCE.getFxGradient_CycleMethod();
+
+		/**
+		 * The meta object literal for the '<em><b>Stops</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference FX_GRADIENT__STOPS = eINSTANCE.getFxGradient_Stops();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxLinearGradientImpl <em>Fx Linear Gradient</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.FxLinearGradientImpl
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxLinearGradient()
+		 * @generated
+		 */
+		EClass FX_LINEAR_GRADIENT = eINSTANCE.getFxLinearGradient();
+
+		/**
+		 * The meta object literal for the '<em><b>Start X</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_LINEAR_GRADIENT__START_X = eINSTANCE.getFxLinearGradient_StartX();
+
+		/**
+		 * The meta object literal for the '<em><b>Start Y</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_LINEAR_GRADIENT__START_Y = eINSTANCE.getFxLinearGradient_StartY();
+
+		/**
+		 * The meta object literal for the '<em><b>End X</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_LINEAR_GRADIENT__END_X = eINSTANCE.getFxLinearGradient_EndX();
+
+		/**
+		 * The meta object literal for the '<em><b>End Y</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_LINEAR_GRADIENT__END_Y = eINSTANCE.getFxLinearGradient_EndY();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxRadialGradientImpl <em>Fx Radial Gradient</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.FxRadialGradientImpl
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxRadialGradient()
+		 * @generated
+		 */
+		EClass FX_RADIAL_GRADIENT = eINSTANCE.getFxRadialGradient();
+
+		/**
+		 * The meta object literal for the '<em><b>Focus Angle</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_RADIAL_GRADIENT__FOCUS_ANGLE = eINSTANCE.getFxRadialGradient_FocusAngle();
+
+		/**
+		 * The meta object literal for the '<em><b>Focus Distance</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_RADIAL_GRADIENT__FOCUS_DISTANCE = eINSTANCE.getFxRadialGradient_FocusDistance();
+
+		/**
+		 * The meta object literal for the '<em><b>Center X</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_RADIAL_GRADIENT__CENTER_X = eINSTANCE.getFxRadialGradient_CenterX();
+
+		/**
+		 * The meta object literal for the '<em><b>Center Y</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_RADIAL_GRADIENT__CENTER_Y = eINSTANCE.getFxRadialGradient_CenterY();
+
+		/**
+		 * The meta object literal for the '<em><b>Radius</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_RADIAL_GRADIENT__RADIUS = eINSTANCE.getFxRadialGradient_Radius();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxStopImpl <em>Fx Stop</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.FxStopImpl
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxStop()
+		 * @generated
+		 */
+		EClass FX_STOP = eINSTANCE.getFxStop();
+
+		/**
+		 * The meta object literal for the '<em><b>Color</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference FX_STOP__COLOR = eINSTANCE.getFxStop_Color();
+
+		/**
+		 * The meta object literal for the '<em><b>Offset</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute FX_STOP__OFFSET = eINSTANCE.getFxStop_Offset();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxColorImpl <em>Fx Color</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.FxColorImpl
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxColor()
+		 * @generated
+		 */
+		EClass FX_COLOR = eINSTANCE.getFxColor();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.fx.ide.gradient.model.gradient.impl.RgbFxColorImpl <em>Rgb Fx Color</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.RgbFxColorImpl
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getRgbFxColor()
+		 * @generated
+		 */
+		EClass RGB_FX_COLOR = eINSTANCE.getRgbFxColor();
+
+		/**
+		 * The meta object literal for the '<em><b>Red</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute RGB_FX_COLOR__RED = eINSTANCE.getRgbFxColor_Red();
+
+		/**
+		 * The meta object literal for the '<em><b>Green</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute RGB_FX_COLOR__GREEN = eINSTANCE.getRgbFxColor_Green();
+
+		/**
+		 * The meta object literal for the '<em><b>Blue</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute RGB_FX_COLOR__BLUE = eINSTANCE.getRgbFxColor_Blue();
+
+		/**
+		 * The meta object literal for the '<em><b>Opacity</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute RGB_FX_COLOR__OPACITY = eINSTANCE.getRgbFxColor_Opacity();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod <em>Fx Cycle Method</em>}' enum.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod
+		 * @see org.eclipse.fx.ide.gradient.model.gradient.impl.GradientPackageImpl#getFxCycleMethod()
+		 * @generated
+		 */
+		EEnum FX_CYCLE_METHOD = eINSTANCE.getFxCycleMethod();
+
+	}
+
+} //GradientPackage
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/RgbFxColor.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/RgbFxColor.java
new file mode 100644
index 0000000..bbd1d3b
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/RgbFxColor.java
@@ -0,0 +1,130 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Rgb Fx Color</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getRed <em>Red</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getGreen <em>Green</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getBlue <em>Blue</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getOpacity <em>Opacity</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getRgbFxColor()
+ * @model
+ * @generated
+ */
+public interface RgbFxColor extends FxColor {
+	/**
+	 * Returns the value of the '<em><b>Red</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Red</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Red</em>' attribute.
+	 * @see #setRed(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getRgbFxColor_Red()
+	 * @model
+	 * @generated
+	 */
+	double getRed();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getRed <em>Red</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Red</em>' attribute.
+	 * @see #getRed()
+	 * @generated
+	 */
+	void setRed(double value);
+
+	/**
+	 * Returns the value of the '<em><b>Green</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Green</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Green</em>' attribute.
+	 * @see #setGreen(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getRgbFxColor_Green()
+	 * @model
+	 * @generated
+	 */
+	double getGreen();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getGreen <em>Green</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Green</em>' attribute.
+	 * @see #getGreen()
+	 * @generated
+	 */
+	void setGreen(double value);
+
+	/**
+	 * Returns the value of the '<em><b>Blue</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Blue</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Blue</em>' attribute.
+	 * @see #setBlue(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getRgbFxColor_Blue()
+	 * @model
+	 * @generated
+	 */
+	double getBlue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getBlue <em>Blue</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Blue</em>' attribute.
+	 * @see #getBlue()
+	 * @generated
+	 */
+	void setBlue(double value);
+
+	/**
+	 * Returns the value of the '<em><b>Opacity</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Opacity</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Opacity</em>' attribute.
+	 * @see #setOpacity(double)
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#getRgbFxColor_Opacity()
+	 * @model
+	 * @generated
+	 */
+	double getOpacity();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor#getOpacity <em>Opacity</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Opacity</em>' attribute.
+	 * @see #getOpacity()
+	 * @generated
+	 */
+	void setOpacity(double value);
+
+} // RgbFxColor
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxColorImpl.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxColorImpl.java
new file mode 100644
index 0000000..715b520
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxColorImpl.java
@@ -0,0 +1,41 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient.impl;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.fx.ide.gradient.model.gradient.FxColor;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Fx Color</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * </p>
+ *
+ * @generated
+ */
+public abstract class FxColorImpl extends MinimalEObjectImpl.Container implements FxColor {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected FxColorImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return GradientPackage.Literals.FX_COLOR;
+	}
+
+} //FxColorImpl
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxGradientImpl.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxGradientImpl.java
new file mode 100644
index 0000000..2ec06e4
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxGradientImpl.java
@@ -0,0 +1,271 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient.impl;
+
+import java.util.Collection;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+import org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod;
+import org.eclipse.fx.ide.gradient.model.gradient.FxGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.FxStop;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Fx Gradient</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxGradientImpl#isProportional <em>Proportional</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxGradientImpl#getCycleMethod <em>Cycle Method</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxGradientImpl#getStops <em>Stops</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public abstract class FxGradientImpl extends MinimalEObjectImpl.Container implements FxGradient {
+	/**
+	 * The default value of the '{@link #isProportional() <em>Proportional</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isProportional()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean PROPORTIONAL_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isProportional() <em>Proportional</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isProportional()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean proportional = PROPORTIONAL_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getCycleMethod() <em>Cycle Method</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCycleMethod()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final FxCycleMethod CYCLE_METHOD_EDEFAULT = FxCycleMethod.NO_CYCLE;
+
+	/**
+	 * The cached value of the '{@link #getCycleMethod() <em>Cycle Method</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCycleMethod()
+	 * @generated
+	 * @ordered
+	 */
+	protected FxCycleMethod cycleMethod = CYCLE_METHOD_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getStops() <em>Stops</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStops()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<FxStop> stops;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected FxGradientImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return GradientPackage.Literals.FX_GRADIENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isProportional() {
+		return proportional;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setProportional(boolean newProportional) {
+		boolean oldProportional = proportional;
+		proportional = newProportional;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_GRADIENT__PROPORTIONAL, oldProportional, proportional));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FxCycleMethod getCycleMethod() {
+		return cycleMethod;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCycleMethod(FxCycleMethod newCycleMethod) {
+		FxCycleMethod oldCycleMethod = cycleMethod;
+		cycleMethod = newCycleMethod == null ? CYCLE_METHOD_EDEFAULT : newCycleMethod;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_GRADIENT__CYCLE_METHOD, oldCycleMethod, cycleMethod));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<FxStop> getStops() {
+		if (stops == null) {
+			stops = new EObjectContainmentEList<FxStop>(FxStop.class, this, GradientPackage.FX_GRADIENT__STOPS);
+		}
+		return stops;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case GradientPackage.FX_GRADIENT__STOPS:
+				return ((InternalEList<?>)getStops()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case GradientPackage.FX_GRADIENT__PROPORTIONAL:
+				return isProportional();
+			case GradientPackage.FX_GRADIENT__CYCLE_METHOD:
+				return getCycleMethod();
+			case GradientPackage.FX_GRADIENT__STOPS:
+				return getStops();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case GradientPackage.FX_GRADIENT__PROPORTIONAL:
+				setProportional((Boolean)newValue);
+				return;
+			case GradientPackage.FX_GRADIENT__CYCLE_METHOD:
+				setCycleMethod((FxCycleMethod)newValue);
+				return;
+			case GradientPackage.FX_GRADIENT__STOPS:
+				getStops().clear();
+				getStops().addAll((Collection<? extends FxStop>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case GradientPackage.FX_GRADIENT__PROPORTIONAL:
+				setProportional(PROPORTIONAL_EDEFAULT);
+				return;
+			case GradientPackage.FX_GRADIENT__CYCLE_METHOD:
+				setCycleMethod(CYCLE_METHOD_EDEFAULT);
+				return;
+			case GradientPackage.FX_GRADIENT__STOPS:
+				getStops().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case GradientPackage.FX_GRADIENT__PROPORTIONAL:
+				return proportional != PROPORTIONAL_EDEFAULT;
+			case GradientPackage.FX_GRADIENT__CYCLE_METHOD:
+				return cycleMethod != CYCLE_METHOD_EDEFAULT;
+			case GradientPackage.FX_GRADIENT__STOPS:
+				return stops != null && !stops.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (proportional: ");
+		result.append(proportional);
+		result.append(", cycleMethod: ");
+		result.append(cycleMethod);
+		result.append(')');
+		return result.toString();
+	}
+
+} //FxGradientImpl
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxLinearGradientImpl.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxLinearGradientImpl.java
new file mode 100644
index 0000000..e9469eb
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxLinearGradientImpl.java
@@ -0,0 +1,314 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Fx Linear Gradient</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxLinearGradientImpl#getStartX <em>Start X</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxLinearGradientImpl#getStartY <em>Start Y</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxLinearGradientImpl#getEndX <em>End X</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxLinearGradientImpl#getEndY <em>End Y</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class FxLinearGradientImpl extends FxGradientImpl implements FxLinearGradient {
+	/**
+	 * The default value of the '{@link #getStartX() <em>Start X</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStartX()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double START_X_EDEFAULT = 0.0;
+	/**
+	 * The cached value of the '{@link #getStartX() <em>Start X</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStartX()
+	 * @generated
+	 * @ordered
+	 */
+	protected double startX = START_X_EDEFAULT;
+	/**
+	 * The default value of the '{@link #getStartY() <em>Start Y</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStartY()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double START_Y_EDEFAULT = 0.0;
+	/**
+	 * The cached value of the '{@link #getStartY() <em>Start Y</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getStartY()
+	 * @generated
+	 * @ordered
+	 */
+	protected double startY = START_Y_EDEFAULT;
+	/**
+	 * The default value of the '{@link #getEndX() <em>End X</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEndX()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double END_X_EDEFAULT = 0.0;
+	/**
+	 * The cached value of the '{@link #getEndX() <em>End X</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEndX()
+	 * @generated
+	 * @ordered
+	 */
+	protected double endX = END_X_EDEFAULT;
+	/**
+	 * The default value of the '{@link #getEndY() <em>End Y</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEndY()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double END_Y_EDEFAULT = 0.0;
+	/**
+	 * The cached value of the '{@link #getEndY() <em>End Y</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEndY()
+	 * @generated
+	 * @ordered
+	 */
+	protected double endY = END_Y_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected FxLinearGradientImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return GradientPackage.Literals.FX_LINEAR_GRADIENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getStartX() {
+		return startX;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setStartX(double newStartX) {
+		double oldStartX = startX;
+		startX = newStartX;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_LINEAR_GRADIENT__START_X, oldStartX, startX));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getStartY() {
+		return startY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setStartY(double newStartY) {
+		double oldStartY = startY;
+		startY = newStartY;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_LINEAR_GRADIENT__START_Y, oldStartY, startY));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getEndX() {
+		return endX;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEndX(double newEndX) {
+		double oldEndX = endX;
+		endX = newEndX;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_LINEAR_GRADIENT__END_X, oldEndX, endX));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getEndY() {
+		return endY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEndY(double newEndY) {
+		double oldEndY = endY;
+		endY = newEndY;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_LINEAR_GRADIENT__END_Y, oldEndY, endY));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case GradientPackage.FX_LINEAR_GRADIENT__START_X:
+				return getStartX();
+			case GradientPackage.FX_LINEAR_GRADIENT__START_Y:
+				return getStartY();
+			case GradientPackage.FX_LINEAR_GRADIENT__END_X:
+				return getEndX();
+			case GradientPackage.FX_LINEAR_GRADIENT__END_Y:
+				return getEndY();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case GradientPackage.FX_LINEAR_GRADIENT__START_X:
+				setStartX((Double)newValue);
+				return;
+			case GradientPackage.FX_LINEAR_GRADIENT__START_Y:
+				setStartY((Double)newValue);
+				return;
+			case GradientPackage.FX_LINEAR_GRADIENT__END_X:
+				setEndX((Double)newValue);
+				return;
+			case GradientPackage.FX_LINEAR_GRADIENT__END_Y:
+				setEndY((Double)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case GradientPackage.FX_LINEAR_GRADIENT__START_X:
+				setStartX(START_X_EDEFAULT);
+				return;
+			case GradientPackage.FX_LINEAR_GRADIENT__START_Y:
+				setStartY(START_Y_EDEFAULT);
+				return;
+			case GradientPackage.FX_LINEAR_GRADIENT__END_X:
+				setEndX(END_X_EDEFAULT);
+				return;
+			case GradientPackage.FX_LINEAR_GRADIENT__END_Y:
+				setEndY(END_Y_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case GradientPackage.FX_LINEAR_GRADIENT__START_X:
+				return startX != START_X_EDEFAULT;
+			case GradientPackage.FX_LINEAR_GRADIENT__START_Y:
+				return startY != START_Y_EDEFAULT;
+			case GradientPackage.FX_LINEAR_GRADIENT__END_X:
+				return endX != END_X_EDEFAULT;
+			case GradientPackage.FX_LINEAR_GRADIENT__END_Y:
+				return endY != END_Y_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (startX: ");
+		result.append(startX);
+		result.append(", startY: ");
+		result.append(startY);
+		result.append(", endX: ");
+		result.append(endX);
+		result.append(", endY: ");
+		result.append(endY);
+		result.append(')');
+		return result.toString();
+	}
+
+} //FxLinearGradientImpl
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxRadialGradientImpl.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxRadialGradientImpl.java
new file mode 100644
index 0000000..026de56
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxRadialGradientImpl.java
@@ -0,0 +1,366 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Fx Radial Gradient</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxRadialGradientImpl#getFocusAngle <em>Focus Angle</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxRadialGradientImpl#getFocusDistance <em>Focus Distance</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxRadialGradientImpl#getCenterX <em>Center X</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxRadialGradientImpl#getCenterY <em>Center Y</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxRadialGradientImpl#getRadius <em>Radius</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class FxRadialGradientImpl extends FxGradientImpl implements FxRadialGradient {
+	/**
+	 * The default value of the '{@link #getFocusAngle() <em>Focus Angle</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFocusAngle()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double FOCUS_ANGLE_EDEFAULT = 0.0;
+	/**
+	 * The cached value of the '{@link #getFocusAngle() <em>Focus Angle</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFocusAngle()
+	 * @generated
+	 * @ordered
+	 */
+	protected double focusAngle = FOCUS_ANGLE_EDEFAULT;
+	/**
+	 * The default value of the '{@link #getFocusDistance() <em>Focus Distance</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFocusDistance()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double FOCUS_DISTANCE_EDEFAULT = 0.0;
+	/**
+	 * The cached value of the '{@link #getFocusDistance() <em>Focus Distance</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFocusDistance()
+	 * @generated
+	 * @ordered
+	 */
+	protected double focusDistance = FOCUS_DISTANCE_EDEFAULT;
+	/**
+	 * The default value of the '{@link #getCenterX() <em>Center X</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCenterX()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double CENTER_X_EDEFAULT = 0.0;
+	/**
+	 * The cached value of the '{@link #getCenterX() <em>Center X</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCenterX()
+	 * @generated
+	 * @ordered
+	 */
+	protected double centerX = CENTER_X_EDEFAULT;
+	/**
+	 * The default value of the '{@link #getCenterY() <em>Center Y</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCenterY()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double CENTER_Y_EDEFAULT = 0.0;
+	/**
+	 * The cached value of the '{@link #getCenterY() <em>Center Y</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCenterY()
+	 * @generated
+	 * @ordered
+	 */
+	protected double centerY = CENTER_Y_EDEFAULT;
+	/**
+	 * The default value of the '{@link #getRadius() <em>Radius</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRadius()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double RADIUS_EDEFAULT = 0.0;
+	/**
+	 * The cached value of the '{@link #getRadius() <em>Radius</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRadius()
+	 * @generated
+	 * @ordered
+	 */
+	protected double radius = RADIUS_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected FxRadialGradientImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return GradientPackage.Literals.FX_RADIAL_GRADIENT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getFocusAngle() {
+		return focusAngle;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFocusAngle(double newFocusAngle) {
+		double oldFocusAngle = focusAngle;
+		focusAngle = newFocusAngle;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_RADIAL_GRADIENT__FOCUS_ANGLE, oldFocusAngle, focusAngle));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getFocusDistance() {
+		return focusDistance;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFocusDistance(double newFocusDistance) {
+		double oldFocusDistance = focusDistance;
+		focusDistance = newFocusDistance;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_RADIAL_GRADIENT__FOCUS_DISTANCE, oldFocusDistance, focusDistance));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getCenterX() {
+		return centerX;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCenterX(double newCenterX) {
+		double oldCenterX = centerX;
+		centerX = newCenterX;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_RADIAL_GRADIENT__CENTER_X, oldCenterX, centerX));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getCenterY() {
+		return centerY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCenterY(double newCenterY) {
+		double oldCenterY = centerY;
+		centerY = newCenterY;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_RADIAL_GRADIENT__CENTER_Y, oldCenterY, centerY));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getRadius() {
+		return radius;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRadius(double newRadius) {
+		double oldRadius = radius;
+		radius = newRadius;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_RADIAL_GRADIENT__RADIUS, oldRadius, radius));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case GradientPackage.FX_RADIAL_GRADIENT__FOCUS_ANGLE:
+				return getFocusAngle();
+			case GradientPackage.FX_RADIAL_GRADIENT__FOCUS_DISTANCE:
+				return getFocusDistance();
+			case GradientPackage.FX_RADIAL_GRADIENT__CENTER_X:
+				return getCenterX();
+			case GradientPackage.FX_RADIAL_GRADIENT__CENTER_Y:
+				return getCenterY();
+			case GradientPackage.FX_RADIAL_GRADIENT__RADIUS:
+				return getRadius();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case GradientPackage.FX_RADIAL_GRADIENT__FOCUS_ANGLE:
+				setFocusAngle((Double)newValue);
+				return;
+			case GradientPackage.FX_RADIAL_GRADIENT__FOCUS_DISTANCE:
+				setFocusDistance((Double)newValue);
+				return;
+			case GradientPackage.FX_RADIAL_GRADIENT__CENTER_X:
+				setCenterX((Double)newValue);
+				return;
+			case GradientPackage.FX_RADIAL_GRADIENT__CENTER_Y:
+				setCenterY((Double)newValue);
+				return;
+			case GradientPackage.FX_RADIAL_GRADIENT__RADIUS:
+				setRadius((Double)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case GradientPackage.FX_RADIAL_GRADIENT__FOCUS_ANGLE:
+				setFocusAngle(FOCUS_ANGLE_EDEFAULT);
+				return;
+			case GradientPackage.FX_RADIAL_GRADIENT__FOCUS_DISTANCE:
+				setFocusDistance(FOCUS_DISTANCE_EDEFAULT);
+				return;
+			case GradientPackage.FX_RADIAL_GRADIENT__CENTER_X:
+				setCenterX(CENTER_X_EDEFAULT);
+				return;
+			case GradientPackage.FX_RADIAL_GRADIENT__CENTER_Y:
+				setCenterY(CENTER_Y_EDEFAULT);
+				return;
+			case GradientPackage.FX_RADIAL_GRADIENT__RADIUS:
+				setRadius(RADIUS_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case GradientPackage.FX_RADIAL_GRADIENT__FOCUS_ANGLE:
+				return focusAngle != FOCUS_ANGLE_EDEFAULT;
+			case GradientPackage.FX_RADIAL_GRADIENT__FOCUS_DISTANCE:
+				return focusDistance != FOCUS_DISTANCE_EDEFAULT;
+			case GradientPackage.FX_RADIAL_GRADIENT__CENTER_X:
+				return centerX != CENTER_X_EDEFAULT;
+			case GradientPackage.FX_RADIAL_GRADIENT__CENTER_Y:
+				return centerY != CENTER_Y_EDEFAULT;
+			case GradientPackage.FX_RADIAL_GRADIENT__RADIUS:
+				return radius != RADIUS_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (focusAngle: ");
+		result.append(focusAngle);
+		result.append(", focusDistance: ");
+		result.append(focusDistance);
+		result.append(", centerX: ");
+		result.append(centerX);
+		result.append(", centerY: ");
+		result.append(centerY);
+		result.append(", radius: ");
+		result.append(radius);
+		result.append(')');
+		return result.toString();
+	}
+
+} //FxRadialGradientImpl
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxStopImpl.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxStopImpl.java
new file mode 100644
index 0000000..22b6209
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/FxStopImpl.java
@@ -0,0 +1,244 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+
+import org.eclipse.fx.ide.gradient.model.gradient.FxColor;
+import org.eclipse.fx.ide.gradient.model.gradient.FxStop;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Fx Stop</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxStopImpl#getColor <em>Color</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.FxStopImpl#getOffset <em>Offset</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class FxStopImpl extends MinimalEObjectImpl.Container implements FxStop {
+	/**
+	 * The cached value of the '{@link #getColor() <em>Color</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getColor()
+	 * @generated
+	 * @ordered
+	 */
+	protected FxColor color;
+
+	/**
+	 * The default value of the '{@link #getOffset() <em>Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOffset()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double OFFSET_EDEFAULT = 0.0;
+
+	/**
+	 * The cached value of the '{@link #getOffset() <em>Offset</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOffset()
+	 * @generated
+	 * @ordered
+	 */
+	protected double offset = OFFSET_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected FxStopImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return GradientPackage.Literals.FX_STOP;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FxColor getColor() {
+		return color;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetColor(FxColor newColor, NotificationChain msgs) {
+		FxColor oldColor = color;
+		color = newColor;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, GradientPackage.FX_STOP__COLOR, oldColor, newColor);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setColor(FxColor newColor) {
+		if (newColor != color) {
+			NotificationChain msgs = null;
+			if (color != null)
+				msgs = ((InternalEObject)color).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - GradientPackage.FX_STOP__COLOR, null, msgs);
+			if (newColor != null)
+				msgs = ((InternalEObject)newColor).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - GradientPackage.FX_STOP__COLOR, null, msgs);
+			msgs = basicSetColor(newColor, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_STOP__COLOR, newColor, newColor));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getOffset() {
+		return offset;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOffset(double newOffset) {
+		double oldOffset = offset;
+		offset = newOffset;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.FX_STOP__OFFSET, oldOffset, offset));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case GradientPackage.FX_STOP__COLOR:
+				return basicSetColor(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case GradientPackage.FX_STOP__COLOR:
+				return getColor();
+			case GradientPackage.FX_STOP__OFFSET:
+				return getOffset();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case GradientPackage.FX_STOP__COLOR:
+				setColor((FxColor)newValue);
+				return;
+			case GradientPackage.FX_STOP__OFFSET:
+				setOffset((Double)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case GradientPackage.FX_STOP__COLOR:
+				setColor((FxColor)null);
+				return;
+			case GradientPackage.FX_STOP__OFFSET:
+				setOffset(OFFSET_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case GradientPackage.FX_STOP__COLOR:
+				return color != null;
+			case GradientPackage.FX_STOP__OFFSET:
+				return offset != OFFSET_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (offset: ");
+		result.append(offset);
+		result.append(')');
+		return result.toString();
+	}
+
+} //FxStopImpl
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/GradientFactoryImpl.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/GradientFactoryImpl.java
new file mode 100644
index 0000000..71fcc02
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/GradientFactoryImpl.java
@@ -0,0 +1,179 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient.impl;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EDataType;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.impl.EFactoryImpl;
+
+import org.eclipse.emf.ecore.plugin.EcorePlugin;
+
+import org.eclipse.fx.ide.gradient.model.gradient.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Factory</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class GradientFactoryImpl extends EFactoryImpl implements GradientFactory {
+	/**
+	 * Creates the default factory implementation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public static GradientFactory init() {
+		try {
+			GradientFactory theGradientFactory = (GradientFactory)EPackage.Registry.INSTANCE.getEFactory(GradientPackage.eNS_URI);
+			if (theGradientFactory != null) {
+				return theGradientFactory;
+			}
+		}
+		catch (Exception exception) {
+			EcorePlugin.INSTANCE.log(exception);
+		}
+		return new GradientFactoryImpl();
+	}
+
+	/**
+	 * Creates an instance of the factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public GradientFactoryImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public EObject create(EClass eClass) {
+		switch (eClass.getClassifierID()) {
+			case GradientPackage.FX_LINEAR_GRADIENT: return createFxLinearGradient();
+			case GradientPackage.FX_RADIAL_GRADIENT: return createFxRadialGradient();
+			case GradientPackage.FX_STOP: return createFxStop();
+			case GradientPackage.RGB_FX_COLOR: return createRgbFxColor();
+			default:
+				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object createFromString(EDataType eDataType, String initialValue) {
+		switch (eDataType.getClassifierID()) {
+			case GradientPackage.FX_CYCLE_METHOD:
+				return createFxCycleMethodFromString(eDataType, initialValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String convertToString(EDataType eDataType, Object instanceValue) {
+		switch (eDataType.getClassifierID()) {
+			case GradientPackage.FX_CYCLE_METHOD:
+				return convertFxCycleMethodToString(eDataType, instanceValue);
+			default:
+				throw new IllegalArgumentException("The datatype '" + eDataType.getName() + "' is not a valid classifier");
+		}
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FxLinearGradient createFxLinearGradient() {
+		FxLinearGradientImpl fxLinearGradient = new FxLinearGradientImpl();
+		return fxLinearGradient;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FxRadialGradient createFxRadialGradient() {
+		FxRadialGradientImpl fxRadialGradient = new FxRadialGradientImpl();
+		return fxRadialGradient;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FxStop createFxStop() {
+		FxStopImpl fxStop = new FxStopImpl();
+		return fxStop;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public RgbFxColor createRgbFxColor() {
+		RgbFxColorImpl rgbFxColor = new RgbFxColorImpl();
+		return rgbFxColor;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public FxCycleMethod createFxCycleMethodFromString(EDataType eDataType, String initialValue) {
+		FxCycleMethod result = FxCycleMethod.get(initialValue);
+		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
+		return result;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String convertFxCycleMethodToString(EDataType eDataType, Object instanceValue) {
+		return instanceValue == null ? null : instanceValue.toString();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public GradientPackage getGradientPackage() {
+		return (GradientPackage)getEPackage();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @deprecated
+	 * @generated
+	 */
+	@Deprecated
+	public static GradientPackage getPackage() {
+		return GradientPackage.eINSTANCE;
+	}
+
+} //GradientFactoryImpl
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/GradientPackageImpl.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/GradientPackageImpl.java
new file mode 100644
index 0000000..416b1eb
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/GradientPackageImpl.java
@@ -0,0 +1,498 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient.impl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EEnum;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+import org.eclipse.fx.ide.gradient.model.gradient.FxColor;
+import org.eclipse.fx.ide.gradient.model.gradient.FxCycleMethod;
+import org.eclipse.fx.ide.gradient.model.gradient.FxGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient;
+import org.eclipse.fx.ide.gradient.model.gradient.FxStop;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientFactory;
+import org.eclipse.fx.ide.gradient.model.gradient.GradientPackage;
+import org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class GradientPackageImpl extends EPackageImpl implements GradientPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass fxGradientEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass fxLinearGradientEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass fxRadialGradientEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass fxStopEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass fxColorEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass rgbFxColorEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EEnum fxCycleMethodEEnum = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private GradientPackageImpl() {
+		super(eNS_URI, GradientFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link GradientPackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static GradientPackage init() {
+		if (isInited) return (GradientPackage)EPackage.Registry.INSTANCE.getEPackage(GradientPackage.eNS_URI);
+
+		// Obtain or create and register package
+		GradientPackageImpl theGradientPackage = (GradientPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof GradientPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new GradientPackageImpl());
+
+		isInited = true;
+
+		// Create package meta-data objects
+		theGradientPackage.createPackageContents();
+
+		// Initialize created meta-data
+		theGradientPackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theGradientPackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(GradientPackage.eNS_URI, theGradientPackage);
+		return theGradientPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getFxGradient() {
+		return fxGradientEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxGradient_Proportional() {
+		return (EAttribute)fxGradientEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxGradient_CycleMethod() {
+		return (EAttribute)fxGradientEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getFxGradient_Stops() {
+		return (EReference)fxGradientEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getFxLinearGradient() {
+		return fxLinearGradientEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxLinearGradient_StartX() {
+		return (EAttribute)fxLinearGradientEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxLinearGradient_StartY() {
+		return (EAttribute)fxLinearGradientEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxLinearGradient_EndX() {
+		return (EAttribute)fxLinearGradientEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxLinearGradient_EndY() {
+		return (EAttribute)fxLinearGradientEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getFxRadialGradient() {
+		return fxRadialGradientEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxRadialGradient_FocusAngle() {
+		return (EAttribute)fxRadialGradientEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxRadialGradient_FocusDistance() {
+		return (EAttribute)fxRadialGradientEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxRadialGradient_CenterX() {
+		return (EAttribute)fxRadialGradientEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxRadialGradient_CenterY() {
+		return (EAttribute)fxRadialGradientEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxRadialGradient_Radius() {
+		return (EAttribute)fxRadialGradientEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getFxStop() {
+		return fxStopEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getFxStop_Color() {
+		return (EReference)fxStopEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getFxStop_Offset() {
+		return (EAttribute)fxStopEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getFxColor() {
+		return fxColorEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getRgbFxColor() {
+		return rgbFxColorEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getRgbFxColor_Red() {
+		return (EAttribute)rgbFxColorEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getRgbFxColor_Green() {
+		return (EAttribute)rgbFxColorEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getRgbFxColor_Blue() {
+		return (EAttribute)rgbFxColorEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getRgbFxColor_Opacity() {
+		return (EAttribute)rgbFxColorEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EEnum getFxCycleMethod() {
+		return fxCycleMethodEEnum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public GradientFactory getGradientFactory() {
+		return (GradientFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		fxGradientEClass = createEClass(FX_GRADIENT);
+		createEAttribute(fxGradientEClass, FX_GRADIENT__PROPORTIONAL);
+		createEAttribute(fxGradientEClass, FX_GRADIENT__CYCLE_METHOD);
+		createEReference(fxGradientEClass, FX_GRADIENT__STOPS);
+
+		fxLinearGradientEClass = createEClass(FX_LINEAR_GRADIENT);
+		createEAttribute(fxLinearGradientEClass, FX_LINEAR_GRADIENT__START_X);
+		createEAttribute(fxLinearGradientEClass, FX_LINEAR_GRADIENT__START_Y);
+		createEAttribute(fxLinearGradientEClass, FX_LINEAR_GRADIENT__END_X);
+		createEAttribute(fxLinearGradientEClass, FX_LINEAR_GRADIENT__END_Y);
+
+		fxRadialGradientEClass = createEClass(FX_RADIAL_GRADIENT);
+		createEAttribute(fxRadialGradientEClass, FX_RADIAL_GRADIENT__FOCUS_ANGLE);
+		createEAttribute(fxRadialGradientEClass, FX_RADIAL_GRADIENT__FOCUS_DISTANCE);
+		createEAttribute(fxRadialGradientEClass, FX_RADIAL_GRADIENT__CENTER_X);
+		createEAttribute(fxRadialGradientEClass, FX_RADIAL_GRADIENT__CENTER_Y);
+		createEAttribute(fxRadialGradientEClass, FX_RADIAL_GRADIENT__RADIUS);
+
+		fxStopEClass = createEClass(FX_STOP);
+		createEReference(fxStopEClass, FX_STOP__COLOR);
+		createEAttribute(fxStopEClass, FX_STOP__OFFSET);
+
+		fxColorEClass = createEClass(FX_COLOR);
+
+		rgbFxColorEClass = createEClass(RGB_FX_COLOR);
+		createEAttribute(rgbFxColorEClass, RGB_FX_COLOR__RED);
+		createEAttribute(rgbFxColorEClass, RGB_FX_COLOR__GREEN);
+		createEAttribute(rgbFxColorEClass, RGB_FX_COLOR__BLUE);
+		createEAttribute(rgbFxColorEClass, RGB_FX_COLOR__OPACITY);
+
+		// Create enums
+		fxCycleMethodEEnum = createEEnum(FX_CYCLE_METHOD);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		fxLinearGradientEClass.getESuperTypes().add(this.getFxGradient());
+		fxRadialGradientEClass.getESuperTypes().add(this.getFxGradient());
+		rgbFxColorEClass.getESuperTypes().add(this.getFxColor());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(fxGradientEClass, FxGradient.class, "FxGradient", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getFxGradient_Proportional(), ecorePackage.getEBoolean(), "proportional", null, 0, 1, FxGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getFxGradient_CycleMethod(), this.getFxCycleMethod(), "cycleMethod", null, 0, 1, FxGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getFxGradient_Stops(), this.getFxStop(), null, "stops", null, 0, -1, FxGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(fxLinearGradientEClass, FxLinearGradient.class, "FxLinearGradient", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getFxLinearGradient_StartX(), ecorePackage.getEDouble(), "startX", null, 0, 1, FxLinearGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getFxLinearGradient_StartY(), ecorePackage.getEDouble(), "startY", null, 0, 1, FxLinearGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getFxLinearGradient_EndX(), ecorePackage.getEDouble(), "endX", null, 0, 1, FxLinearGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getFxLinearGradient_EndY(), ecorePackage.getEDouble(), "endY", null, 0, 1, FxLinearGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(fxRadialGradientEClass, FxRadialGradient.class, "FxRadialGradient", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getFxRadialGradient_FocusAngle(), ecorePackage.getEDouble(), "focusAngle", null, 0, 1, FxRadialGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getFxRadialGradient_FocusDistance(), ecorePackage.getEDouble(), "focusDistance", null, 0, 1, FxRadialGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getFxRadialGradient_CenterX(), ecorePackage.getEDouble(), "centerX", null, 0, 1, FxRadialGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getFxRadialGradient_CenterY(), ecorePackage.getEDouble(), "centerY", null, 0, 1, FxRadialGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getFxRadialGradient_Radius(), ecorePackage.getEDouble(), "radius", null, 0, 1, FxRadialGradient.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(fxStopEClass, FxStop.class, "FxStop", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getFxStop_Color(), this.getFxColor(), null, "color", null, 0, 1, FxStop.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getFxStop_Offset(), ecorePackage.getEDouble(), "offset", null, 0, 1, FxStop.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(fxColorEClass, FxColor.class, "FxColor", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(rgbFxColorEClass, RgbFxColor.class, "RgbFxColor", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getRgbFxColor_Red(), ecorePackage.getEDouble(), "red", null, 0, 1, RgbFxColor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getRgbFxColor_Green(), ecorePackage.getEDouble(), "green", null, 0, 1, RgbFxColor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getRgbFxColor_Blue(), ecorePackage.getEDouble(), "blue", null, 0, 1, RgbFxColor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getRgbFxColor_Opacity(), ecorePackage.getEDouble(), "opacity", null, 0, 1, RgbFxColor.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		// Initialize enums and add enum literals
+		initEEnum(fxCycleMethodEEnum, FxCycleMethod.class, "FxCycleMethod");
+		addEEnumLiteral(fxCycleMethodEEnum, FxCycleMethod.NO_CYCLE);
+		addEEnumLiteral(fxCycleMethodEEnum, FxCycleMethod.REFLECT);
+		addEEnumLiteral(fxCycleMethodEEnum, FxCycleMethod.REPEAT);
+
+		// Create resource
+		createResource(eNS_URI);
+	}
+
+} //GradientPackageImpl
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/RgbFxColorImpl.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/RgbFxColorImpl.java
new file mode 100644
index 0000000..2704fc5
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/impl/RgbFxColorImpl.java
@@ -0,0 +1,324 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.fx.ide.gradient.model.gradient.GradientPackage;
+import org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Rgb Fx Color</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.RgbFxColorImpl#getRed <em>Red</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.RgbFxColorImpl#getGreen <em>Green</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.RgbFxColorImpl#getBlue <em>Blue</em>}</li>
+ *   <li>{@link org.eclipse.fx.ide.gradient.model.gradient.impl.RgbFxColorImpl#getOpacity <em>Opacity</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class RgbFxColorImpl extends FxColorImpl implements RgbFxColor {
+	/**
+	 * The default value of the '{@link #getRed() <em>Red</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRed()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double RED_EDEFAULT = 0.0;
+
+	/**
+	 * The cached value of the '{@link #getRed() <em>Red</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRed()
+	 * @generated
+	 * @ordered
+	 */
+	protected double red = RED_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getGreen() <em>Green</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getGreen()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double GREEN_EDEFAULT = 0.0;
+
+	/**
+	 * The cached value of the '{@link #getGreen() <em>Green</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getGreen()
+	 * @generated
+	 * @ordered
+	 */
+	protected double green = GREEN_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getBlue() <em>Blue</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBlue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double BLUE_EDEFAULT = 0.0;
+
+	/**
+	 * The cached value of the '{@link #getBlue() <em>Blue</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBlue()
+	 * @generated
+	 * @ordered
+	 */
+	protected double blue = BLUE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getOpacity() <em>Opacity</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOpacity()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final double OPACITY_EDEFAULT = 0.0;
+
+	/**
+	 * The cached value of the '{@link #getOpacity() <em>Opacity</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOpacity()
+	 * @generated
+	 * @ordered
+	 */
+	protected double opacity = OPACITY_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected RgbFxColorImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return GradientPackage.Literals.RGB_FX_COLOR;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getRed() {
+		return red;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRed(double newRed) {
+		double oldRed = red;
+		red = newRed;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.RGB_FX_COLOR__RED, oldRed, red));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getGreen() {
+		return green;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setGreen(double newGreen) {
+		double oldGreen = green;
+		green = newGreen;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.RGB_FX_COLOR__GREEN, oldGreen, green));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getBlue() {
+		return blue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBlue(double newBlue) {
+		double oldBlue = blue;
+		blue = newBlue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.RGB_FX_COLOR__BLUE, oldBlue, blue));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public double getOpacity() {
+		return opacity;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOpacity(double newOpacity) {
+		double oldOpacity = opacity;
+		opacity = newOpacity;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, GradientPackage.RGB_FX_COLOR__OPACITY, oldOpacity, opacity));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case GradientPackage.RGB_FX_COLOR__RED:
+				return getRed();
+			case GradientPackage.RGB_FX_COLOR__GREEN:
+				return getGreen();
+			case GradientPackage.RGB_FX_COLOR__BLUE:
+				return getBlue();
+			case GradientPackage.RGB_FX_COLOR__OPACITY:
+				return getOpacity();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case GradientPackage.RGB_FX_COLOR__RED:
+				setRed((Double)newValue);
+				return;
+			case GradientPackage.RGB_FX_COLOR__GREEN:
+				setGreen((Double)newValue);
+				return;
+			case GradientPackage.RGB_FX_COLOR__BLUE:
+				setBlue((Double)newValue);
+				return;
+			case GradientPackage.RGB_FX_COLOR__OPACITY:
+				setOpacity((Double)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case GradientPackage.RGB_FX_COLOR__RED:
+				setRed(RED_EDEFAULT);
+				return;
+			case GradientPackage.RGB_FX_COLOR__GREEN:
+				setGreen(GREEN_EDEFAULT);
+				return;
+			case GradientPackage.RGB_FX_COLOR__BLUE:
+				setBlue(BLUE_EDEFAULT);
+				return;
+			case GradientPackage.RGB_FX_COLOR__OPACITY:
+				setOpacity(OPACITY_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case GradientPackage.RGB_FX_COLOR__RED:
+				return red != RED_EDEFAULT;
+			case GradientPackage.RGB_FX_COLOR__GREEN:
+				return green != GREEN_EDEFAULT;
+			case GradientPackage.RGB_FX_COLOR__BLUE:
+				return blue != BLUE_EDEFAULT;
+			case GradientPackage.RGB_FX_COLOR__OPACITY:
+				return opacity != OPACITY_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (red: ");
+		result.append(red);
+		result.append(", green: ");
+		result.append(green);
+		result.append(", blue: ");
+		result.append(blue);
+		result.append(", opacity: ");
+		result.append(opacity);
+		result.append(')');
+		return result.toString();
+	}
+
+} //RgbFxColorImpl
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/util/GradientAdapterFactory.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/util/GradientAdapterFactory.java
new file mode 100644
index 0000000..5ea8792
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/util/GradientAdapterFactory.java
@@ -0,0 +1,210 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient.util;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
+
+import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
+
+import org.eclipse.emf.ecore.EObject;
+
+import org.eclipse.fx.ide.gradient.model.gradient.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Adapter Factory</b> for the model.
+ * It provides an adapter <code>createXXX</code> method for each class of the model.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage
+ * @generated
+ */
+public class GradientAdapterFactory extends AdapterFactoryImpl {
+	/**
+	 * The cached model package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static GradientPackage modelPackage;
+
+	/**
+	 * Creates an instance of the adapter factory.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public GradientAdapterFactory() {
+		if (modelPackage == null) {
+			modelPackage = GradientPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Returns whether this factory is applicable for the type of the object.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance object of the model.
+	 * <!-- end-user-doc -->
+	 * @return whether this factory is applicable for the type of the object.
+	 * @generated
+	 */
+	@Override
+	public boolean isFactoryForType(Object object) {
+		if (object == modelPackage) {
+			return true;
+		}
+		if (object instanceof EObject) {
+			return ((EObject)object).eClass().getEPackage() == modelPackage;
+		}
+		return false;
+	}
+
+	/**
+	 * The switch that delegates to the <code>createXXX</code> methods.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected GradientSwitch<Adapter> modelSwitch =
+		new GradientSwitch<Adapter>() {
+			@Override
+			public Adapter caseFxGradient(FxGradient object) {
+				return createFxGradientAdapter();
+			}
+			@Override
+			public Adapter caseFxLinearGradient(FxLinearGradient object) {
+				return createFxLinearGradientAdapter();
+			}
+			@Override
+			public Adapter caseFxRadialGradient(FxRadialGradient object) {
+				return createFxRadialGradientAdapter();
+			}
+			@Override
+			public Adapter caseFxStop(FxStop object) {
+				return createFxStopAdapter();
+			}
+			@Override
+			public Adapter caseFxColor(FxColor object) {
+				return createFxColorAdapter();
+			}
+			@Override
+			public Adapter caseRgbFxColor(RgbFxColor object) {
+				return createRgbFxColorAdapter();
+			}
+			@Override
+			public Adapter defaultCase(EObject object) {
+				return createEObjectAdapter();
+			}
+		};
+
+	/**
+	 * Creates an adapter for the <code>target</code>.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param target the object to adapt.
+	 * @return the adapter for the <code>target</code>.
+	 * @generated
+	 */
+	@Override
+	public Adapter createAdapter(Notifier target) {
+		return modelSwitch.doSwitch((EObject)target);
+	}
+
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.fx.ide.gradient.model.gradient.FxGradient <em>Fx Gradient</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxGradient
+	 * @generated
+	 */
+	public Adapter createFxGradientAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient <em>Fx Linear Gradient</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxLinearGradient
+	 * @generated
+	 */
+	public Adapter createFxLinearGradientAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient <em>Fx Radial Gradient</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxRadialGradient
+	 * @generated
+	 */
+	public Adapter createFxRadialGradientAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.fx.ide.gradient.model.gradient.FxStop <em>Fx Stop</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxStop
+	 * @generated
+	 */
+	public Adapter createFxStopAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.fx.ide.gradient.model.gradient.FxColor <em>Fx Color</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.FxColor
+	 * @generated
+	 */
+	public Adapter createFxColorAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor <em>Rgb Fx Color</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.fx.ide.gradient.model.gradient.RgbFxColor
+	 * @generated
+	 */
+	public Adapter createRgbFxColorAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for the default case.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @generated
+	 */
+	public Adapter createEObjectAdapter() {
+		return null;
+	}
+
+} //GradientAdapterFactory
diff --git a/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/util/GradientSwitch.java b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/util/GradientSwitch.java
new file mode 100644
index 0000000..b4e5f32
--- /dev/null
+++ b/experimental/gradienteditor/org.eclipse.fx.ide.gradient.model/src/org/eclipse/fx/ide/gradient/model/gradient/util/GradientSwitch.java
@@ -0,0 +1,218 @@
+/**
+ */
+package org.eclipse.fx.ide.gradient.model.gradient.util;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+
+import org.eclipse.emf.ecore.util.Switch;
+
+import org.eclipse.fx.ide.gradient.model.gradient.*;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Switch</b> for the model's inheritance hierarchy.
+ * It supports the call {@link #doSwitch(EObject) doSwitch(object)}
+ * to invoke the <code>caseXXX</code> method for each class of the model,
+ * starting with the actual class of the object
+ * and proceeding up the inheritance hierarchy
+ * until a non-null result is returned,
+ * which is the result of the switch.
+ * <!-- end-user-doc -->
+ * @see org.eclipse.fx.ide.gradient.model.gradient.GradientPackage
+ * @generated
+ */
+public class GradientSwitch<T> extends Switch<T> {
+	/**
+	 * The cached model package
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected static GradientPackage modelPackage;
+
+	/**
+	 * Creates an instance of the switch.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public GradientSwitch() {
+		if (modelPackage == null) {
+			modelPackage = GradientPackage.eINSTANCE;
+		}
+	}
+
+	/**
+	 * Checks whether this is a switch for the given package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @parameter ePackage the package in question.
+	 * @return whether this is a switch for the given package.
+	 * @generated
+	 */
+	@Override
+	protected boolean isSwitchFor(EPackage ePackage) {
+		return ePackage == modelPackage;
+	}
+
+	/**
+	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the first non-null result returned by a <code>caseXXX</code> call.
+	 * @generated
+	 */
+	@Override
+	protected T doSwitch(int classifierID, EObject theEObject) {
+		switch (classifierID) {
+			case GradientPackage.FX_GRADIENT: {
+				FxGradient fxGradient = (FxGradient)theEObject;
+				T result = caseFxGradient(fxGradient);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case GradientPackage.FX_LINEAR_GRADIENT: {
+				FxLinearGradient fxLinearGradient = (FxLinearGradient)theEObject;
+				T result = caseFxLinearGradient(fxLinearGradient);
+				if (result == null) result = caseFxGradient(fxLinearGradient);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case GradientPackage.FX_RADIAL_GRADIENT: {
+				FxRadialGradient fxRadialGradient = (FxRadialGradient)theEObject;
+				T result = caseFxRadialGradient(fxRadialGradient);
+				if (result == null) result = caseFxGradient(fxRadialGradient);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case GradientPackage.FX_STOP: {
+				FxStop fxStop = (FxStop)theEObject;
+				T result = caseFxStop(fxStop);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case GradientPackage.FX_COLOR: {
+				FxColor fxColor = (FxColor)theEObject;
+				T result = caseFxColor(fxColor);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case GradientPackage.RGB_FX_COLOR: {
+				RgbFxColor rgbFxColor = (RgbFxColor)theEObject;
+				T result = caseRgbFxColor(rgbFxColor);
+				if (result == null) result = caseFxColor(rgbFxColor);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			default: return defaultCase(theEObject);
+		}
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Fx Gradient</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Fx Gradient</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseFxGradient(FxGradient object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Fx Linear Gradient</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Fx Linear Gradient</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseFxLinearGradient(FxLinearGradient object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Fx Radial Gradient</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Fx Radial Gradient</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseFxRadialGradient(FxRadialGradient object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Fx Stop</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Fx Stop</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseFxStop(FxStop object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Fx Color</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Fx Color</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseFxColor(FxColor object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Rgb Fx Color</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Rgb Fx Color</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseRgbFxColor(RgbFxColor object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch, but this is the last case anyway.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
+	 * @generated
+	 */
+	@Override
+	public T defaultCase(EObject object) {
+		return null;
+	}
+
+} //GradientSwitch
diff --git a/experimental/swt/org.eclipse.fx.sample.singlesource.app/bin/.gitignore b/experimental/swt/org.eclipse.fx.sample.singlesource.app/bin/.gitignore
deleted file mode 100644
index 2837626..0000000
--- a/experimental/swt/org.eclipse.fx.sample.singlesource.app/bin/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/donotdelete
diff --git a/experimental/swt/org.eclipse.fx.sample.singlesource.app/bin/donotdelete b/experimental/swt/org.eclipse.fx.sample.singlesource.app/bin/donotdelete
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/experimental/swt/org.eclipse.fx.sample.singlesource.app/bin/donotdelete
