moved the generic model builder to EMF Forms
diff --git a/modeling/plugins/org.eclipse.pde.ds.builder/META-INF/MANIFEST.MF b/modeling/plugins/org.eclipse.pde.ds.builder/META-INF/MANIFEST.MF
index 2c9ad54..ffe7dd8 100644
--- a/modeling/plugins/org.eclipse.pde.ds.builder/META-INF/MANIFEST.MF
+++ b/modeling/plugins/org.eclipse.pde.ds.builder/META-INF/MANIFEST.MF
@@ -13,6 +13,7 @@
  org.eclipse.pde.core.plugin,
  org.eclipse.pde.ds.scr,
  org.eclipse.pde.ds.scr.util,
+ org.eclipse.pde.emfforms.builder;version="0.1.0",
  org.eclipse.pde.internal.core,
  org.eclipse.pde.internal.core.ibundle,
  org.eclipse.pde.internal.core.natures,
diff --git a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/IncrementalModelBuilder.java b/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/IncrementalModelBuilder.java
deleted file mode 100644
index 4a375c9..0000000
--- a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/IncrementalModelBuilder.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/**
- * Copyright (c) 2009 Anyware Technologies and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Anyware Technologies - initial API and implementation
- *
- * $Id: IncrementalModelBuilder.java,v 1.5 2009/07/05 20:21:06 bcabe Exp $
- */
-package org.eclipse.pde.ds.builder.internal.validation;
-
-import java.util.*;
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.pde.core.plugin.IPluginModelBase;
-import org.eclipse.pde.core.plugin.PluginRegistry;
-import org.eclipse.pde.internal.core.ibundle.IBundleModel;
-import org.eclipse.pde.internal.core.ibundle.IBundlePluginModelBase;
-import org.eclipse.pde.internal.core.natures.PDE;
-import org.osgi.service.component.ComponentConstants;
-
-/**
- * An abstract class to subclass to launch background jobs on the modified model
- * TODO: Listen to modification on Java files
- */
-public abstract class IncrementalModelBuilder extends IncrementalProjectBuilder {
-	protected class ModelFileDeltaVisitor implements IResourceDeltaVisitor {
-		private Map<Resource, IResource> modifiedResources = new HashMap<Resource, IResource>();
-		private String _contentType;
-
-		public ModelFileDeltaVisitor(String contentType) {
-			_contentType = contentType;
-		}
-
-		public Map<Resource, IResource> getModifiedResources() {
-			return modifiedResources;
-		}
-
-		/**
-		 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse
-		 *      .core.resources.IResourceDelta)
-		 */
-		public boolean visit(IResourceDelta delta) throws CoreException {
-			IResource resource = delta.getResource();
-			switch (delta.getKind()) {
-			case IResourceDelta.ADDED:
-			case IResourceDelta.REMOVED:
-				// Do nothing
-				break;
-			case IResourceDelta.CHANGED:
-				if (resource instanceof IContainer)
-					return true;
-				if (_contentType != null
-						&& !_contentType.equals(((IFile) resource)
-								.getContentDescription().getContentType()
-								.getId()))
-					return false;
-				// handle changed resource
-				URI resourceURI = URI.createPlatformResourceURI(resource
-						.getFullPath().toString(), true);
-				Resource modelResource = new AdapterFactoryEditingDomain(
-						new ComposedAdapterFactory(
-								ComposedAdapterFactory.Descriptor.Registry.INSTANCE),
-						new BasicCommandStack()).getResourceSet().getResource(
-						resourceURI, true);
-				if (modelResource != null && modelResource.isLoaded()
-						&& !modifiedResources.containsKey(modelResource)) {
-					modifiedResources.put(modelResource, resource);
-				}
-				break;
-			}
-			// return true to continue visiting children.
-			return true;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.core.resources.IncrementalProjectBuilder#build(int,
-	 *      java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	protected IProject[] build(int kind, Map args, IProgressMonitor monitor)
-			throws CoreException {
-		switch (kind) {
-		case FULL_BUILD:
-			fullBuild(monitor);
-			break;
-		case CLEAN_BUILD:
-			clean(monitor);
-			break;
-		default:
-			IResourceDelta delta = getDelta(getProject());
-			if (delta == null) {
-				fullBuild(monitor);
-			} else {
-				incrementalBuild(delta, monitor);
-			}
-
-			break;
-		}
-		return null;
-	}
-
-	@Override
-	protected void clean(IProgressMonitor monitor) throws CoreException {
-		// Subclasses must override this method
-	}
-
-	protected void incrementalBuild(IResourceDelta delta,
-			IProgressMonitor monitor) throws CoreException {
-		if (monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-		// the visitor does the work.
-		ModelFileDeltaVisitor visitor = new ModelFileDeltaVisitor(
-				getContentType());
-		delta.accept(visitor);
-
-		Map<Resource, IResource> modifiedResources = visitor
-				.getModifiedResources();
-
-		monitor.beginTask("Incremental Build", modifiedResources.size());
-
-		for (Resource modelResource : modifiedResources.keySet()) {
-			build(modelResource.getContents().get(0), modifiedResources
-					.get(modelResource), false, new SubProgressMonitor(monitor,
-					1));
-		}
-
-		monitor.done();
-
-	}
-
-	/**
-	 * If the model files to build have a content-type, this method must return
-	 * it, in order to optimize the build process (fail-fast mode)
-	 * 
-	 * @return the content-type of model files, or null if no content-type
-	 *         exists
-	 */
-	protected String getContentType() {
-		return null;
-	}
-
-	@SuppressWarnings("restriction")
-	protected void fullBuild(IProgressMonitor monitor) throws CoreException {
-		if (monitor == null) {
-			monitor = new NullProgressMonitor();
-		}
-
-		if (PDE.hasPluginNature(getProject())) {
-			IPluginModelBase bundle = PluginRegistry.findModel(getProject());
-			if (bundle instanceof IBundlePluginModelBase) {
-				IBundleModel bundleModel = ((IBundlePluginModelBase) bundle)
-						.getBundleModel();
-				// XXX for some reason, if we don't call load() by hand, some
-				// headers are missing (???)
-				bundleModel.load();
-				String serviceComponents = bundleModel.getBundle().getHeader(
-						ComponentConstants.SERVICE_COMPONENT);
-				if (serviceComponents != null) {
-					StringTokenizer tok = new StringTokenizer(
-							serviceComponents, ","); //$NON-NLS-1$
-					// process all definition file
-					while (tok.hasMoreElements()) {
-						String definitionFile = tok.nextToken().trim();
-						int ind = definitionFile.lastIndexOf('/');
-						String path = ind != -1 ? definitionFile.substring(0,
-								ind) : "/"; //$NON-NLS-1$
-						// TODO we need to support patterns (path may be equal
-						// to something like "/OSGI-INF/comp-*.xml"...)
-						IFile componentFile = getProject().getFile(
-								definitionFile);
-						URI res = URI.createPlatformResourceURI(componentFile
-								.getFullPath().toString(), true);
-						Resource modelResource = new AdapterFactoryEditingDomain(
-								new ComposedAdapterFactory(
-										ComposedAdapterFactory.Descriptor.Registry.INSTANCE),
-								new BasicCommandStack()).getResourceSet()
-								.getResource(res, true);
-						build(modelResource.getContents().get(0),
-								componentFile, true, new SubProgressMonitor(
-										monitor, 1));
-					}
-				} // end while
-
-			}
-
-		}
-	}
-
-	protected abstract void build(EObject modelObject, IResource resource,
-			boolean force, IProgressMonitor monitor) throws CoreException;
-
-	/*
-	 * private boolean isComponentReferencedInManifest() {
-	 * 
-	 * }
-	 */
-}
diff --git a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/ScrBuilder.java b/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/ScrBuilder.java
index 187e60b..c06ec0c 100644
--- a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/ScrBuilder.java
+++ b/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/ScrBuilder.java
@@ -1,17 +1,28 @@
 package org.eclipse.pde.ds.builder.internal.validation;
 
+import java.util.StringTokenizer;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.*;
+import org.eclipse.emf.common.command.BasicCommandStack;
 import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.*;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.Diagnostician;
 import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
 import org.eclipse.emf.edit.provider.IItemLabelProvider;
 import org.eclipse.emf.transaction.RunnableWithResult;
 import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.core.plugin.PluginRegistry;
 import org.eclipse.pde.ds.builder.internal.Activator;
+import org.eclipse.pde.emfforms.builder.IncrementalModelBuilder;
+import org.eclipse.pde.emfforms.builder.MarkerHelper;
+import org.eclipse.pde.internal.core.ibundle.IBundleModel;
+import org.eclipse.pde.internal.core.ibundle.IBundlePluginModelBase;
+import org.eclipse.pde.internal.core.natures.PDE;
+import org.osgi.service.component.ComponentConstants;
 
 public class ScrBuilder extends IncrementalModelBuilder {
 	public static final String ID = "org.eclipse.pde.ds.builder.scrBuilder";
@@ -19,6 +30,52 @@
 	public ScrBuilder() {
 	}
 
+	@SuppressWarnings("restriction")
+	@Override
+	protected void fullBuild(IProgressMonitor monitor) throws CoreException {
+		if (monitor == null) {
+			monitor = new NullProgressMonitor();
+		}
+
+		if (PDE.hasPluginNature(getProject())) {
+			IPluginModelBase bundle = PluginRegistry.findModel(getProject());
+			if (bundle instanceof IBundlePluginModelBase) {
+				IBundleModel bundleModel = ((IBundlePluginModelBase) bundle)
+						.getBundleModel();
+				// XXX for some reason, if we don't call load() by hand, some
+				// headers are missing (???)
+				bundleModel.load();
+				String serviceComponents = bundleModel.getBundle().getHeader(
+						ComponentConstants.SERVICE_COMPONENT);
+				if (serviceComponents != null) {
+					StringTokenizer tok = new StringTokenizer(
+							serviceComponents, ","); //$NON-NLS-1$
+					// process all definition file
+					while (tok.hasMoreElements()) {
+						String definitionFile = tok.nextToken().trim();
+						int ind = definitionFile.lastIndexOf('/');
+						String path = ind != -1 ? definitionFile.substring(0,
+								ind) : "/"; //$NON-NLS-1$
+						// TODO we need to support patterns (path may be equal
+						// to something like "/OSGI-INF/comp-*.xml"...)
+						IFile componentFile = getProject().getFile(
+								definitionFile);
+						URI res = URI.createPlatformResourceURI(componentFile
+								.getFullPath().toString(), true);
+						Resource modelResource = new AdapterFactoryEditingDomain(
+								new ComposedAdapterFactory(
+										ComposedAdapterFactory.Descriptor.Registry.INSTANCE),
+								new BasicCommandStack()).getResourceSet()
+								.getResource(res, true);
+						build(modelResource.getContents().get(0),
+								componentFile, true, new SubProgressMonitor(
+										monitor, 1));
+					}
+				} // end while
+			}
+		}
+	}
+
 	protected void build(EObject modelObject, IResource resource,
 			boolean force, IProgressMonitor monitor) throws CoreException {
 		if (monitor == null) {
diff --git a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/constraints/ComponentImplementationTypeIsOnClasspath.java b/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/constraints/ComponentImplementationTypeIsOnClasspath.java
index 1822514..16bc2a0 100644
--- a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/constraints/ComponentImplementationTypeIsOnClasspath.java
+++ b/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/constraints/ComponentImplementationTypeIsOnClasspath.java
@@ -8,16 +8,17 @@
  * Contributors:
  *     Anyware Technologies - initial API and implementation
  *
- * $Id: ComponentImplementationTypeIsOnClasspath.java,v 1.3 2009/07/02 21:54:54 bcabe Exp $
+ * $Id: ComponentImplementationTypeIsOnClasspath.java,v 1.4 2009/07/03 20:14:25 bcabe Exp $
  */
 package org.eclipse.pde.ds.builder.internal.validation.constraints;
 
+import org.eclipse.pde.emfforms.builder.EMFHelper;
+
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.emf.validation.AbstractModelConstraint;
 import org.eclipse.emf.validation.IValidationContext;
 import org.eclipse.emf.validation.model.ConstraintStatus;
 import org.eclipse.jdt.core.*;
-import org.eclipse.pde.ds.builder.internal.validation.EMFHelper;
 import org.eclipse.pde.ds.builder.internal.validation.EnhancedConstraintStatus;
 import org.eclipse.pde.ds.scr.Implementation;
 import org.eclipse.pde.ds.scr.ScrPackage;
diff --git a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/constraints/ComponentMethodsAreValidAndAccessible.java b/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/constraints/ComponentMethodsAreValidAndAccessible.java
index ecd4f77..dd311b4 100644
--- a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/constraints/ComponentMethodsAreValidAndAccessible.java
+++ b/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/constraints/ComponentMethodsAreValidAndAccessible.java
@@ -8,10 +8,12 @@
  * Contributors:
  *     Anyware Technologies - initial API and implementation
  *
- * $Id: ComponentMethodsAreValidAndAccessible.java,v 1.3 2009/07/03 20:14:25 bcabe Exp $
+ * $Id: ComponentMethodsAreValidAndAccessible.java,v 1.4 2009/07/05 17:06:26 bcabe Exp $
  */
 package org.eclipse.pde.ds.builder.internal.validation.constraints;
 
+import org.eclipse.pde.emfforms.builder.EMFHelper;
+
 import java.util.*;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.emf.ecore.EStructuralFeature;
@@ -19,7 +21,6 @@
 import org.eclipse.emf.validation.IValidationContext;
 import org.eclipse.emf.validation.model.ConstraintStatus;
 import org.eclipse.jdt.core.*;
-import org.eclipse.pde.ds.builder.internal.validation.EMFHelper;
 import org.eclipse.pde.ds.builder.internal.validation.EnhancedConstraintStatus;
 import org.eclipse.pde.ds.scr.Component;
 import org.eclipse.pde.ds.scr.ScrPackage;
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF b/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF
index 03521d7..01a66c8 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF
+++ b/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF
@@ -24,8 +24,9 @@
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-Localization: plugin
 Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.pde.emfforms.editor,
- org.eclipse.pde.emfforms.editor.actions,
+Export-Package: org.eclipse.pde.emfforms.builder;version="0.1.0",
+ org.eclipse.pde.emfforms.editor;version="0.1.0",
+ org.eclipse.pde.emfforms.editor.actions;version="0.1.0",
  org.eclipse.pde.emfforms.internal;x-internal:=true,
  org.eclipse.pde.emfforms.internal.editor;x-internal:=true,
  org.eclipse.pde.emfforms.internal.validation;x-internal:=true
diff --git a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/EMFHelper.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/builder/EMFHelper.java
similarity index 97%
rename from modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/EMFHelper.java
rename to modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/builder/EMFHelper.java
index af009cc..eeb9135 100644
--- a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/EMFHelper.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/builder/EMFHelper.java
@@ -1,4 +1,4 @@
-package org.eclipse.pde.ds.builder.internal.validation;
+package org.eclipse.pde.emfforms.builder;
 
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.Path;
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/builder/IncrementalModelBuilder.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/builder/IncrementalModelBuilder.java
new file mode 100644
index 0000000..1b74554
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/builder/IncrementalModelBuilder.java
@@ -0,0 +1,137 @@
+/**
+ * Copyright (c) 2009 Anyware Technologies and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     Anyware Technologies - initial API and implementation
+ *
+ * $Id: IncrementalModelBuilder.java,v 1.6 2009/07/29 10:31:26 bcabe Exp $
+ */
+package org.eclipse.pde.emfforms.builder;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.emf.common.command.BasicCommandStack;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+
+/**
+ * An abstract class to subclass to launch background jobs on the modified model
+ */
+public abstract class IncrementalModelBuilder extends IncrementalProjectBuilder {
+	protected class ModelFileDeltaVisitor implements IResourceDeltaVisitor {
+		private Map<Resource, IResource> modifiedResources = new HashMap<Resource, IResource>();
+		private String _contentType;
+
+		public ModelFileDeltaVisitor(String contentType) {
+			_contentType = contentType;
+		}
+
+		public Map<Resource, IResource> getModifiedResources() {
+			return modifiedResources;
+		}
+
+		/**
+		 * @see org.eclipse.core.resources.IResourceDeltaVisitor#visit(org.eclipse
+		 *      .core.resources.IResourceDelta)
+		 */
+		public boolean visit(IResourceDelta delta) throws CoreException {
+			IResource resource = delta.getResource();
+			switch (delta.getKind()) {
+				case IResourceDelta.ADDED :
+				case IResourceDelta.REMOVED :
+					// Do nothing
+					break;
+				case IResourceDelta.CHANGED :
+					if (resource instanceof IContainer)
+						return true;
+					if (_contentType != null && !_contentType.equals(((IFile) resource).getContentDescription().getContentType().getId()))
+						return false;
+					// handle changed resource
+					URI resourceURI = URI.createPlatformResourceURI(resource.getFullPath().toString(), true);
+					Resource modelResource = new AdapterFactoryEditingDomain(new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE), new BasicCommandStack()).getResourceSet().getResource(resourceURI, true);
+					if (modelResource != null && modelResource.isLoaded() && !modifiedResources.containsKey(modelResource)) {
+						modifiedResources.put(modelResource, resource);
+					}
+					break;
+			}
+			// return true to continue visiting children.
+			return true;
+		}
+	}
+
+	/**
+	 * @see org.eclipse.core.resources.IncrementalProjectBuilder#build(int,
+	 *      java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	protected IProject[] build(int kind, Map args, IProgressMonitor monitor) throws CoreException {
+		switch (kind) {
+			case FULL_BUILD :
+				fullBuild(monitor);
+				break;
+			case CLEAN_BUILD :
+				clean(monitor);
+				break;
+			default :
+				IResourceDelta delta = getDelta(getProject());
+				if (delta == null) {
+					fullBuild(monitor);
+				} else {
+					incrementalBuild(delta, monitor);
+				}
+
+				break;
+		}
+		return null;
+	}
+
+	@Override
+	protected void clean(IProgressMonitor monitor) throws CoreException {
+		// Subclasses must override this method
+	}
+
+	protected void incrementalBuild(IResourceDelta delta, IProgressMonitor monitor) throws CoreException {
+		if (monitor == null) {
+			monitor = new NullProgressMonitor();
+		}
+		// the visitor does the work.
+		ModelFileDeltaVisitor visitor = new ModelFileDeltaVisitor(getContentType());
+		delta.accept(visitor);
+
+		Map<Resource, IResource> modifiedResources = visitor.getModifiedResources();
+
+		monitor.beginTask("Incremental Build", modifiedResources.size());
+
+		for (Resource modelResource : modifiedResources.keySet()) {
+			build(modelResource.getContents().get(0), modifiedResources.get(modelResource), false, new SubProgressMonitor(monitor, 1));
+		}
+
+		monitor.done();
+
+	}
+
+	/**
+	 * If the model files to build have a content-type, this method must return
+	 * it, in order to optimize the build process (fail-fast mode)
+	 * 
+	 * @return the content-type of model files, or null if no content-type
+	 *         exists
+	 */
+	protected String getContentType() {
+		return null;
+	}
+
+	protected abstract void fullBuild(IProgressMonitor monitor) throws CoreException;
+
+	protected abstract void build(EObject modelObject, IResource resource, boolean force, IProgressMonitor monitor) throws CoreException;
+}
diff --git a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/MarkerHelper.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/builder/MarkerHelper.java
similarity index 69%
rename from modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/MarkerHelper.java
rename to modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/builder/MarkerHelper.java
index a3602ce..a85eee2 100644
--- a/modeling/plugins/org.eclipse.pde.ds.builder/src/org/eclipse/pde/ds/builder/internal/validation/MarkerHelper.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/builder/MarkerHelper.java
@@ -1,4 +1,4 @@
-package org.eclipse.pde.ds.builder.internal.validation;
+package org.eclipse.pde.emfforms.builder;
 
 import java.util.*;
 import org.eclipse.core.resources.*;
@@ -33,8 +33,7 @@
 		}
 	}
 
-	private static void createMarker(Diagnostic diagnostic,
-			Map<URI, IFile> visitedResources) throws CoreException {
+	private static void createMarker(Diagnostic diagnostic, Map<URI, IFile> visitedResources) throws CoreException {
 		String markerType = MarkerHelper.VALIDATION_MARKER_TYPE;
 
 		EObject target = (EObject) diagnostic.getData().get(0);
@@ -43,8 +42,7 @@
 
 		// Normalize the URI to something that we can deal with like file or
 		// platform scheme
-		resourceUri = r.getResourceSet().getURIConverter().normalize(
-				resourceUri);
+		resourceUri = r.getResourceSet().getURIConverter().normalize(resourceUri);
 
 		IFile file = visitedResources.get(resourceUri);
 
@@ -62,31 +60,29 @@
 			IMarker marker = file.createMarker(markerType);
 
 			marker.setAttribute(IMarker.SOURCE_ID, diagnostic.getCode());
-			marker.setAttribute(EValidator.URI_ATTRIBUTE, EcoreUtil.getURI(
-					target).toString());
+			marker.setAttribute(EValidator.URI_ATTRIBUTE, EcoreUtil.getURI(target).toString());
 
 			switch (diagnostic.getSeverity()) {
-			case IStatus.INFO:
-				marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO);
-				marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_LOW);
-				break;
-			case IStatus.WARNING:
-				marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
-				marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_NORMAL);
-				break;
-			case IStatus.ERROR:
-			case IStatus.CANCEL:
-				marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
-				marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
-				break;
+				case IStatus.INFO :
+					marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_INFO);
+					marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_LOW);
+					break;
+				case IStatus.WARNING :
+					marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
+					marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_NORMAL);
+					break;
+				case IStatus.ERROR :
+				case IStatus.CANCEL :
+					marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR);
+					marker.setAttribute(IMarker.PRIORITY, IMarker.PRIORITY_HIGH);
+					break;
 			}
 
 			marker.setAttribute(IMarker.MESSAGE, diagnostic.getMessage());
 		}
 	}
 
-	public static void createMarkers(final Diagnostic validationDiagnostic,
-			IProgressMonitor monitor) throws CoreException {
+	public static void createMarkers(final Diagnostic validationDiagnostic, IProgressMonitor monitor) throws CoreException {
 		if (validationDiagnostic.getSeverity() == Diagnostic.OK) {
 			return;
 		}
@@ -99,13 +95,10 @@
 				final Map<URI, IFile> visitedResources = new HashMap<URI, IFile>();
 
 				if (!validationDiagnostic.getChildren().isEmpty()) {
-					m.beginTask("Create validation markers",
-							validationDiagnostic.getChildren().size());
-					for (Diagnostic diagnostic : validationDiagnostic
-							.getChildren()) {
+					m.beginTask("Create validation markers", validationDiagnostic.getChildren().size());
+					for (Diagnostic diagnostic : validationDiagnostic.getChildren()) {
 						List<?> data = diagnostic.getData();
-						if (data != null && !data.isEmpty()
-								&& data.get(0) instanceof EObject) {
+						if (data != null && !data.isEmpty() && data.get(0) instanceof EObject) {
 							createMarker(diagnostic, visitedResources);
 						}