emf forms framework  reworked to be compatible with Eclipse 3.4
diff --git a/modeling/features/org.eclipse.pde.ds-feature/feature.xml b/modeling/features/org.eclipse.pde.ds-feature/feature.xml
index e721799..158be64 100644
--- a/modeling/features/org.eclipse.pde.ds-feature/feature.xml
+++ b/modeling/features/org.eclipse.pde.ds-feature/feature.xml
@@ -74,4 +74,11 @@
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.eclipse.pde.emfforms.validation_35"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
 </feature>
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/.project b/modeling/plugins/org.eclipse.pde.emfforms/.project
index 6702fec..c861388 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/.project
+++ b/modeling/plugins/org.eclipse.pde.emfforms/.project
@@ -25,6 +25,11 @@
 			<arguments>
 			</arguments>
 		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ds.core.builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
 	</buildSpec>
 	<natures>
 		<nature>org.eclipse.pde.PluginNature</nature>
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 3589335..f73d918 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF
+++ b/modeling/plugins/org.eclipse.pde.emfforms/META-INF/MANIFEST.MF
@@ -16,7 +16,10 @@
 Bundle-Localization: plugin
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.pde.emfforms.editor,
+ org.eclipse.pde.emfforms.editor.actions,
  org.eclipse.pde.emfforms.internal;x-internal:=true,
+ org.eclipse.pde.emfforms.internal.actions;x-internal:=true,
  org.eclipse.pde.emfforms.internal.editor;x-internal:=true,
  org.eclipse.pde.emfforms.internal.validation;x-internal:=true
 Import-Package: org.eclipse.core.resources
+Service-Component: OSGI-INF/*.xml
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/OSGI-INF/validatingEContentAdapter34.xml b/modeling/plugins/org.eclipse.pde.emfforms/OSGI-INF/validatingEContentAdapter34.xml
new file mode 100644
index 0000000..5f3ead7
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/OSGI-INF/validatingEContentAdapter34.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.0.0" immediate="true" name="org.eclipse.pde.emfforms.validation_34">
+   <implementation class="org.eclipse.pde.emfforms.internal.validation.ValidatingService34"/>
+   <service>
+      <provide interface="org.eclipse.pde.emfforms.editor.ValidatingService"/>
+   </service>
+   <property name="service.ranking" type="Integer" value="10"/>
+</scr:component>
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/build.properties b/modeling/plugins/org.eclipse.pde.emfforms/build.properties
index d14ceee..e44c086 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/build.properties
+++ b/modeling/plugins/org.eclipse.pde.emfforms/build.properties
@@ -1,8 +1,8 @@
-source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
                plugin.properties,\
                icons/,\
-               plugin.xml
-               
\ No newline at end of file
+               plugin.xml,\
+               OSGI-INF/
+source.. = src/
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java
index 5960900..80d4a04 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfFormEditor.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     Anyware Technologies - initial API and implementation
  *
- * $Id: EmfFormEditor.java,v 1.15 2009/07/18 14:42:27 bcabe Exp $
+ * $Id: EmfFormEditor.java,v 1.16 2009/07/18 20:27:34 bcabe Exp $
  */
 package org.eclipse.pde.emfforms.editor;
 
@@ -700,6 +700,7 @@
 						// Select the root object in the view.
 						contentOutlineViewer.setSelection(new StructuredSelection(getEditingDomain().getResourceSet().getResources().get(0)), true);
 					}
+
 				}
 
 				@Override
@@ -723,7 +724,14 @@
 			contentOutlinePage.addSelectionChangedListener(new ISelectionChangedListener() {
 				// This ensures that we handle selections correctly.
 				public void selectionChanged(SelectionChangedEvent event) {
-					handleContentOutlineSelection(event.getSelection());
+					handleContentOutlineSelection(event.getSelection(), getViewer());
+				}
+			});
+
+			addSelectionChangedListener(new ISelectionChangedListener() {
+				// This ensures that we handle selections correctly.
+				public void selectionChanged(SelectionChangedEvent event) {
+					handleContentOutlineSelection(event.getSelection(), contentOutlineViewer);
 				}
 			});
 		}
@@ -734,24 +742,10 @@
 	/**
 	 * This deals with how we want selection in the outline to affect the other views.
 	 */
-	public void handleContentOutlineSelection(ISelection selection) {
-		if (!selection.isEmpty() && selection instanceof IStructuredSelection) {
-			Iterator<?> selectedElements = ((IStructuredSelection) selection).iterator();
-			if (selectedElements.hasNext()) {
-				// Get the first selected element.
-				Object selectedElement = selectedElements.next();
-
-				// If it's the selection viewer, then we want it to select the same selection as this selection.
-				if (getViewer() != null) {
-					ArrayList<Object> selectionList = new ArrayList<Object>();
-					selectionList.add(selectedElement);
-					while (selectedElements.hasNext()) {
-						selectionList.add(selectedElements.next());
-					}
-
-					// Set the selection to the widget.
-					getViewer().setSelection(new StructuredSelection(selectionList));
-				}
+	public void handleContentOutlineSelection(ISelection selection, Viewer viewerToSnych) {
+		if (!selection.isEmpty() && selection instanceof IStructuredSelection && viewerToSnych != null) {
+			if (((IStructuredSelection) selection).getFirstElement() != ((IStructuredSelection) viewerToSnych.getSelection()).getFirstElement()) {
+				viewerToSnych.setSelection(new StructuredSelection(((IStructuredSelection) selection).getFirstElement()));
 			}
 		}
 	}
@@ -848,7 +842,7 @@
 					if (eObject != null && (getEditingDomain() instanceof AdapterFactoryEditingDomain)) {
 						AdapterFactoryEditingDomain editingDomain = (AdapterFactoryEditingDomain) getEditingDomain();
 						if (getViewer() != null) {
-							getViewer().setSelection(new StructuredSelection(Collections.singleton(AdapterFactoryEditingDomain.getWrapper(eObject, editingDomain)).toArray()));
+							getViewer().setSelection(new StructuredSelection(Collections.singleton(editingDomain.getWrapper(eObject)).toArray()));
 						}
 					}
 				}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java
index dd57271..0cffd66 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/EmfMasterDetailBlock.java
@@ -8,20 +8,30 @@
  * Contributors:
  *     Anyware Technologies - initial API and implementation
  *
- * $Id: EmfMasterDetailBlock.java,v 1.10 2009/07/18 20:26:56 bcabe Exp $
+ * $Id: EmfMasterDetailBlock.java,v 1.11 2009/07/28 16:19:11 bcabe Exp $
  */
 package org.eclipse.pde.emfforms.editor;
 
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.databinding.observable.value.IValueChangeListener;
+import org.eclipse.core.databinding.observable.value.ValueChangeEvent;
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.databinding.EMFUpdateValueStrategy;
+import org.eclipse.emf.edit.command.RemoveCommand;
 import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
 import org.eclipse.emf.edit.ui.dnd.*;
 import org.eclipse.emf.edit.ui.provider.*;
 import org.eclipse.jface.action.*;
+import org.eclipse.jface.databinding.swt.SWTObservables;
+import org.eclipse.jface.databinding.viewers.ViewersObservables;
 import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.jface.layout.GridLayoutFactory;
 import org.eclipse.jface.viewers.*;
+import org.eclipse.pde.emfforms.internal.actions.RemoveAction;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.dnd.DND;
 import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.*;
 import org.eclipse.swt.layout.FillLayout;
 import org.eclipse.swt.widgets.*;
 import org.eclipse.ui.IEditorActionBarContributor;
@@ -35,12 +45,16 @@
 public abstract class EmfMasterDetailBlock extends MasterDetailsBlock implements IDetailsPageProvider, IMenuListener {
 
 	protected EmfFormEditor<?> parentEditor;
-	protected boolean useGenericAddButton = true;
+	protected boolean useGenericButton = false;
+	protected boolean useGenericSectionToolBar = true;
+
 	private String title;
 	private TreeViewer treeViewer;
 	private Button addButton;
 	private Button removeButton;
 
+	private ToolBarManager toolBarManager;
+
 	public EmfMasterDetailBlock(EmfFormEditor<?> editor, String title) {
 		this.title = title;
 		this.parentEditor = editor;
@@ -58,22 +72,37 @@
 		section.marginHeight = 5;
 
 		Composite client = toolkit.createComposite(section, SWT.WRAP);
-		GridLayoutFactory.fillDefaults().numColumns(2).applyTo(client);
+		GridLayoutFactory.fillDefaults().numColumns(useGenericButton ? 2 : 1).applyTo(client);
 
-		FilteredTree ft = new FilteredTree(client, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL, new PatternFilter(), true);
+		FilteredTree ft = new FilteredTree(client, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL, new PatternFilter());
 		treeViewer = ft.getViewer();
 
-		Composite buttonComposite = new Composite(client, SWT.NONE);
-		GridLayoutFactory.fillDefaults().numColumns(1).applyTo(buttonComposite);
+		//Buttons
+		if (useGenericButton) {
+			Composite buttonComposite = new Composite(client, SWT.NONE);
+			GridLayoutFactory.fillDefaults().numColumns(1).applyTo(buttonComposite);
 
-		if (useGenericAddButton)
-			addButton = createButton(buttonComposite, "Add...");
+			addButton = createButton(buttonComposite, "Add"); //$NON-NLS-1$
+			removeButton = createButton(buttonComposite, "Remove"); //$NON-NLS-1$
 
-		createCustomAddButtons(buttonComposite);
+			createCustomButtons(buttonComposite);
+			GridDataFactory.fillDefaults().grab(false, false).applyTo(buttonComposite);
+		}
 
-		removeButton = createButton(buttonComposite, "Remove"); //$NON-NLS-1$
+		//SectionToolBar
+		final RemoveAction removeAction = new RemoveAction(this);
 
-		GridDataFactory.fillDefaults().grab(false, false).applyTo(buttonComposite);
+		if (useGenericSectionToolBar) {
+			toolBarManager = PDEFormToolkit.createSectionToolBarManager(section);
+			Action addAction = createCustomToolbarAddAction();
+			if (addAction != null) {
+				toolBarManager.add(addAction);
+			}
+
+			toolBarManager.add(removeAction);
+			toolBarManager.update(true);
+			section.setTextClient(toolBarManager.getControl());
+		}
 
 		treeViewer.setContentProvider(new AdapterFactoryContentProvider(parentEditor.getAdapterFactory()));
 		treeViewer.setLabelProvider(new DecoratingLabelProvider(new AdapterFactoryLabelProvider(parentEditor.getAdapterFactory()), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
@@ -99,11 +128,68 @@
 			}
 		});
 
+		// add +/- key shortcuts
+		treeViewer.getTree().addKeyListener(new KeyAdapter() {
+			@Override
+			public void keyPressed(KeyEvent e) {
+				if (e.keyCode == Action.findKeyCode("DELETE")) { //$NON-NLS-1$
+					removeAction.run();
+				}
+			}
+		});
+
+		if (useGenericButton) {
+
+			DataBindingContext bindingContext = new DataBindingContext();
+
+			//Enable button when the tree selection is not empty
+			bindingContext.bindValue(ViewersObservables.observeSingleSelection(getTreeViewer()), SWTObservables.observeEnabled(getRemoveButton()), new EMFUpdateValueStrategy() {
+				/**
+				 * @see org.eclipse.core.databinding.UpdateValueStrategy#convert(java.lang.Object)
+				 */
+				@Override
+				public Object convert(Object value) {
+					return !(getTreeViewer().getSelection().isEmpty());
+				}
+			}, null);
+
+			//Generic action for remove button
+			getRemoveButton().addSelectionListener(new SelectionAdapter() {
+				public void widgetSelected(SelectionEvent e) {
+					Object sel = ((IStructuredSelection) getTreeViewer().getSelection()).getFirstElement();
+					if (sel != null) {
+						Command c = RemoveCommand.create(getEditor().getEditingDomain(), sel);
+						getEditor().getEditingDomain().getCommandStack().execute(c);
+					}
+				}
+			});
+		}
+
+		if (useGenericSectionToolBar) {
+
+			//Enable action when the tree selection is not empty
+			ViewersObservables.observeSingleSelection(getTreeViewer()).addValueChangeListener(new IValueChangeListener() {
+				public void handleValueChange(ValueChangeEvent event) {
+					boolean bool = !(getTreeViewer().getSelection().isEmpty());
+					removeAction.setEnabled(bool);
+				}
+			});
+
+		}
+
 		createContextMenuFor(treeViewer);
 
+		//update Editor selection
+		getEditor().addViewerToListenTo(getTreeViewer());
+
 		section.setClient(client);
 	}
 
+	protected Action createCustomToolbarAddAction() {
+		// Subclass may override this method
+		return null;
+	}
+
 	protected Button createButton(Composite parent, String btnText) {
 		Button btn = new Button(parent, SWT.FLAT | SWT.PUSH);
 		GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).grab(true, false).applyTo(btn);
@@ -138,13 +224,13 @@
 	}
 
 	/**
-	 * @return The "Add..." button that can be used to hook an element creation wizard, or <code>null</code> if the {@link EmfMasterDetailBlock#useGenericAddButton} flag is set to <code>false</code> 
+	 * @return The "Add..." button that can be used to hook an element creation wizard, or <code>null</code> if the {@link EmfMasterDetailBlock#useGenericButton} flag is set to <code>false</code> 
 	 */
 	public Button getGenericAddButton() {
 		return addButton;
 	}
 
-	protected void createCustomAddButtons(Composite parent) {
+	protected void createCustomButtons(Composite parent) {
 		// Should be overriden by clients wanting to contribute their own "add" button(s) 
 	}
 
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/ValidatingService.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/ValidatingService.java
new file mode 100644
index 0000000..2867109
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/ValidatingService.java
@@ -0,0 +1,32 @@
+package org.eclipse.pde.emfforms.editor;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.ui.forms.IMessageManager;
+
+public interface ValidatingService {
+
+	public static final KeyMap keyMap = new KeyMap();
+
+	static class KeyMap {
+		private Map<Integer, Integer> keymap = new HashMap<Integer, Integer>();
+
+		protected KeyMap() {
+			keymap.put(Integer.valueOf(IStatus.ERROR), Integer.valueOf(IMessageProvider.ERROR));
+			keymap.put(Integer.valueOf(IStatus.INFO), Integer.valueOf(IMessageProvider.WARNING));
+			keymap.put(Integer.valueOf(IStatus.INFO), Integer.valueOf(IMessageProvider.INFORMATION));
+			keymap.put(Integer.valueOf(IStatus.OK), Integer.valueOf(IMessageProvider.NONE));
+			keymap.put(Integer.valueOf(IStatus.CANCEL), Integer.valueOf(IMessageProvider.INFORMATION));
+		}
+
+		public int getMessageProviderKey(int iStatusKey) {
+			return keymap.get(Integer.valueOf(iStatusKey)).intValue();
+		}
+	}
+
+	void analyzeDiagnostic(DataBindingContext dataBindingContext, Diagnostic diagnostic, IMessageManager messageManager);
+}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/actions/AbstractAddAction.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/actions/AbstractAddAction.java
new file mode 100644
index 0000000..435a4e8
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/editor/actions/AbstractAddAction.java
@@ -0,0 +1,46 @@
+package org.eclipse.pde.emfforms.editor.actions;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.pde.emfforms.editor.EmfMasterDetailBlock;
+import org.eclipse.pde.emfforms.internal.Activator;
+import org.eclipse.pde.emfforms.internal.editor.IEmfFormsImages;
+
+public abstract class AbstractAddAction extends Action {
+
+	protected EmfMasterDetailBlock masterDetail;
+
+	public AbstractAddAction(EmfMasterDetailBlock masterDetail) {
+		super();
+		this.masterDetail = masterDetail;
+		setText("Add");
+		setToolTipText("Add a element to current model");
+	}
+
+	@Override
+	public void run() {
+
+		Object createdObject = createNewObject(masterDetail);
+
+		// select the created method
+		masterDetail.getTreeViewer().refresh();
+		masterDetail.getTreeViewer().setSelection(new StructuredSelection(createdObject), true);
+		masterDetail.getTreeViewer().getTree().setFocus();
+
+	}
+
+	/**
+	 * Create and return the new object to add to the masterDetail. The new object will be selected in the tree.
+	 * 
+	 * @param masterDetail where the new object will be add
+	 * @return the created object
+	 */
+	protected abstract Object createNewObject(EmfMasterDetailBlock masterDetail);
+
+	@Override
+	public ImageDescriptor getImageDescriptor() {
+		return ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource(IEmfFormsImages.ADD_TOOLBAR_BUTTON)); //$NON-NLS-1$
+	}
+
+}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/actions/RemoveAction.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/actions/RemoveAction.java
new file mode 100644
index 0000000..742c4ec
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/actions/RemoveAction.java
@@ -0,0 +1,69 @@
+package org.eclipse.pde.emfforms.internal.actions;
+
+import org.eclipse.emf.common.command.Command;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.pde.emfforms.editor.EmfMasterDetailBlock;
+import org.eclipse.pde.emfforms.internal.Activator;
+import org.eclipse.pde.emfforms.internal.editor.IEmfFormsImages;
+import org.eclipse.ui.PlatformUI;
+
+public class RemoveAction extends Action {
+
+	private EmfMasterDetailBlock masterDetail;
+
+	public RemoveAction(EmfMasterDetailBlock masterDetail) {
+		super();
+		this.masterDetail = masterDetail;
+		setText("Remove");
+		setToolTipText("Remove selected element");
+	}
+
+	public void run() {
+		TreeViewer treeViewer = masterDetail.getTreeViewer();
+
+		if (!treeViewer.getSelection().isEmpty()) {
+
+			int selIndex = treeViewer.getTree().indexOf(treeViewer.getTree().getSelection()[0]);
+
+			EObject sel = (EObject) ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
+			AdapterFactoryLabelProvider labelProvider = new AdapterFactoryLabelProvider(masterDetail.getEditor().getAdapterFactory());
+
+			// -- Confirmation Dialog
+			String title = "Delete the current selection"; //$NON-NLS-1$
+			String message = "Do you really want to delete '" + labelProvider.getText(sel) + "' ?"; //$NON-NLS-1$ //$NON-NLS-2$
+
+			if (MessageDialog.openQuestion(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), title, message)) {
+				EditingDomain editingDomain = masterDetail.getEditor().getEditingDomain();
+				// perform add method
+				Command c = RemoveCommand.create(editingDomain, sel);
+				editingDomain.getCommandStack().execute(c);
+
+				treeViewer.refresh();
+				if (treeViewer.getTree().getItemCount() > 0) {
+
+					// if we delete the last line, select the new last
+					// line
+					if (selIndex >= treeViewer.getTree().getItemCount())
+						selIndex = selIndex - 1;
+
+					treeViewer.getTree().setSelection(treeViewer.getTree().getItem(selIndex));
+					treeViewer.getTree().setFocus();
+				}
+			}
+		}
+	}
+
+	@Override
+	public ImageDescriptor getImageDescriptor() {
+		return ImageDescriptor.createFromURL(Activator.getDefault().getBundle().getResource(IEmfFormsImages.REMOVE_TOOLBAR_BUTTON));
+	}
+
+}
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java
index e16cd26..35b0e6d 100644
--- a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingEContentAdapter.java
@@ -1,22 +1,19 @@
 package org.eclipse.pde.emfforms.internal.validation;
 
-import java.util.*;
-import org.eclipse.core.databinding.Binding;
 import org.eclipse.core.databinding.DataBindingContext;
 import org.eclipse.core.databinding.observable.value.IObservableValue;
-import org.eclipse.core.runtime.IStatus;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.emf.databinding.IEMFObservable;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.util.Diagnostician;
 import org.eclipse.emf.ecore.util.EContentAdapter;
 import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.jface.databinding.swt.ISWTObservable;
-import org.eclipse.jface.dialogs.IMessageProvider;
 import org.eclipse.pde.emfforms.editor.EmfFormEditor;
-import org.eclipse.swt.widgets.Control;
+import org.eclipse.pde.emfforms.editor.ValidatingService;
+import org.eclipse.pde.emfforms.internal.Activator;
 import org.eclipse.ui.forms.IMessageManager;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
 
 public class ValidatingEContentAdapter extends EContentAdapter {
 	private DataBindingContext _dataBindingContext;
@@ -24,7 +21,7 @@
 	private IObservableValue _observedValue;
 	private Diagnostician _diagnostician;
 
-	private static final KeyMap keyMap = new KeyMap();
+	private ValidatingService validatingService;
 
 	public ValidatingEContentAdapter(IObservableValue observedValue, DataBindingContext dataBindingContext, EmfFormEditor<?> formEditor) {
 		_formEditor = formEditor;
@@ -51,8 +48,9 @@
 
 	@Override
 	public void notifyChanged(Notification notification) {
-		if (notification.getEventType() != Notification.REMOVING_ADAPTER)
+		if (notification.getEventType() != Notification.REMOVING_ADAPTER) {
 			validate();
+		}
 	}
 
 	public void validate() {
@@ -63,71 +61,19 @@
 		Diagnostic diagnostics = _diagnostician.validate((EObject) _observedValue.getValue());
 
 		for (Diagnostic diagnostic : diagnostics.getChildren()) {
-			analyzeDiagnostic(diagnostic, messageManager);
+			getValidatorService().analyzeDiagnostic(_dataBindingContext, diagnostic, messageManager);
 		}
 
 		messageManager.update();
 	}
 
-	private void analyzeDiagnostic(Diagnostic diagnostic, IMessageManager messageManager) {
-		boolean atLeastOneErroneousBinding = false;
-		for (Object o : _dataBindingContext.getBindings()) {
-			Binding binding = (Binding) o;
-			IEMFObservable emfObservable = null;
-			ISWTObservable swtObservable = null;
-			if (binding.getModel() instanceof IEMFObservable && binding.getTarget() instanceof ISWTObservable) {
-				emfObservable = (IEMFObservable) binding.getModel();
-				swtObservable = (ISWTObservable) binding.getTarget();
-			} else if (binding.getTarget() instanceof IEMFObservable && binding.getModel() instanceof ISWTObservable) {
-				swtObservable = (ISWTObservable) binding.getModel();
-				emfObservable = (IEMFObservable) binding.getTarget();
-			}
-
-			if (emfObservable != null && swtObservable != null)
-				if (checkBinding(emfObservable, swtObservable, diagnostic, messageManager))
-					atLeastOneErroneousBinding = true;
+	private ValidatingService getValidatorService() {
+		BundleContext context = Activator.getDefault().getBundle().getBundleContext();
+		if (validatingService == null) {
+			ServiceReference validatingServiceRef = context.getServiceReference(ValidatingService.class.getName());
+			validatingService = (ValidatingService) context.getService(validatingServiceRef);
 		}
-		if (!atLeastOneErroneousBinding) {
-			// add an error message anyways
-			messageManager.addMessage(diagnostic, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()));
-		}
-	}
-
-	private boolean checkBinding(IEMFObservable emfObservable, ISWTObservable swtObservable, Diagnostic diagnostic, IMessageManager messageManager) {
-		List<?> diagnosticData = diagnostic.getData();
-		if (diagnosticData.size() >= 2) {
-			if (diagnosticData.get(0) == emfObservable.getObserved()) {
-				if (diagnosticData.get(1) == emfObservable.getStructuralFeature()) {
-					if (swtObservable.getWidget() instanceof Control) {
-						Control control = (Control) swtObservable.getWidget();
-
-						if (true || control.isVisible())
-							messageManager.addMessage(swtObservable, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()), control);
-						else
-							messageManager.addMessage(swtObservable, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()));
-
-						return true;
-					}
-				}
-			}
-		}
-		return false;
-	}
-
-	protected static class KeyMap {
-		private Map<Integer, Integer> keymap = new HashMap<Integer, Integer>();
-
-		protected KeyMap() {
-			keymap.put(Integer.valueOf(IStatus.ERROR), Integer.valueOf(IMessageProvider.ERROR));
-			keymap.put(Integer.valueOf(IStatus.INFO), Integer.valueOf(IMessageProvider.WARNING));
-			keymap.put(Integer.valueOf(IStatus.INFO), Integer.valueOf(IMessageProvider.INFORMATION));
-			keymap.put(Integer.valueOf(IStatus.OK), Integer.valueOf(IMessageProvider.NONE));
-			keymap.put(Integer.valueOf(IStatus.CANCEL), Integer.valueOf(IMessageProvider.INFORMATION));
-		}
-
-		protected int getMessageProviderKey(int iStatusKey) {
-			return keymap.get(Integer.valueOf(iStatusKey)).intValue();
-		}
+		return validatingService;
 	}
 
 }
diff --git a/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingService34.java b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingService34.java
new file mode 100644
index 0000000..9a7f158
--- /dev/null
+++ b/modeling/plugins/org.eclipse.pde.emfforms/src/org/eclipse/pde/emfforms/internal/validation/ValidatingService34.java
@@ -0,0 +1,60 @@
+package org.eclipse.pde.emfforms.internal.validation;
+
+import java.util.List;
+import org.eclipse.core.databinding.Binding;
+import org.eclipse.core.databinding.DataBindingContext;
+import org.eclipse.core.internal.databinding.observable.masterdetail.DetailObservableValue;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.jface.databinding.swt.ISWTObservable;
+import org.eclipse.pde.emfforms.editor.ValidatingService;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.forms.IMessageManager;
+
+public class ValidatingService34 implements ValidatingService {
+
+	public void analyzeDiagnostic(DataBindingContext dataBindingContext, Diagnostic diagnostic, IMessageManager messageManager) {
+		boolean atLeastOneErroneousBinding = false;
+		for (Object o : dataBindingContext.getBindings()) {
+			Binding binding = (Binding) o;
+			DetailObservableValue emfObservable = null;
+			ISWTObservable swtObservable = null;
+			if (binding.getModel() instanceof DetailObservableValue && binding.getTarget() instanceof ISWTObservable) {
+				emfObservable = (DetailObservableValue) binding.getModel();
+				swtObservable = (ISWTObservable) binding.getTarget();
+			} else if (binding.getTarget() instanceof DetailObservableValue && binding.getModel() instanceof ISWTObservable) {
+				swtObservable = (ISWTObservable) binding.getModel();
+				emfObservable = (DetailObservableValue) binding.getTarget();
+			}
+
+			if (emfObservable != null && swtObservable != null)
+				if (checkBindingFor34(emfObservable, swtObservable, diagnostic, messageManager))
+					atLeastOneErroneousBinding = true;
+		}
+		if (!atLeastOneErroneousBinding) {
+			// add an error message anyways
+			messageManager.addMessage(diagnostic, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()));
+		}
+	}
+
+	private boolean checkBindingFor34(DetailObservableValue emfObservable, ISWTObservable swtObservable, Diagnostic diagnostic, IMessageManager messageManager) {
+		List<?> diagnosticData = diagnostic.getData();
+		if (diagnosticData.size() >= 2) {
+			if (diagnosticData.get(0) == emfObservable.getObserved()) {
+				if (diagnosticData.get(1) == emfObservable.getValueType()) {
+					if (swtObservable.getWidget() instanceof Control) {
+						Control control = (Control) swtObservable.getWidget();
+
+						if (true || control.isVisible())
+							messageManager.addMessage(swtObservable, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()), control);
+						else
+							messageManager.addMessage(swtObservable, diagnostic.getMessage(), null, keyMap.getMessageProviderKey(diagnostic.getSeverity()));
+
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+	}
+
+}
diff --git a/modeling/releng/org.eclipse.pde.ds.releng/maps/ds-incubator.map b/modeling/releng/org.eclipse.pde.ds.releng/maps/ds-incubator.map
index e915cf9..daef214 100644
--- a/modeling/releng/org.eclipse.pde.ds.releng/maps/ds-incubator.map
+++ b/modeling/releng/org.eclipse.pde.ds.releng/maps/ds-incubator.map
@@ -1,4 +1,5 @@
 plugin@org.eclipse.pde.emfforms=HEAD,:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse,,pde-incubator/modeling/plugins/org.eclipse.pde.emfforms
+bundle@org.eclipse.pde.emfforms.validation_35=HEAD,:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse,,pde-incubator/modeling/plugins/org.eclipse.pde.emfforms.validation_35
 
 plugin@org.eclipse.pde.ds=HEAD,:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse,,pde-incubator/modeling/plugins/org.eclipse.pde.ds
 plugin@org.eclipse.pde.ds.builder=HEAD,:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse,,pde-incubator/modeling/plugins/org.eclipse.pde.ds.builder