improved architecture
diff --git a/plugins/org.eclipse.mylyn.docs.intent.client.synchronizer/src/org/eclipse/mylyn/docs/intent/client/synchronizer/factory/SynchronizerStatusFactory.java b/plugins/org.eclipse.mylyn.docs.intent.client.synchronizer/src/org/eclipse/mylyn/docs/intent/client/synchronizer/factory/SynchronizerStatusFactory.java
index 8e7e50f..c6ed24d 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.client.synchronizer/src/org/eclipse/mylyn/docs/intent/client/synchronizer/factory/SynchronizerStatusFactory.java
+++ b/plugins/org.eclipse.mylyn.docs.intent.client.synchronizer/src/org/eclipse/mylyn/docs/intent/client/synchronizer/factory/SynchronizerStatusFactory.java
@@ -28,6 +28,7 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.mylyn.docs.intent.core.compiler.AttributeChangeStatus;
 import org.eclipse.mylyn.docs.intent.core.compiler.CompilationMessageType;
 import org.eclipse.mylyn.docs.intent.core.compiler.CompilationStatus;
 import org.eclipse.mylyn.docs.intent.core.compiler.CompilationStatusSeverity;
@@ -91,7 +92,13 @@
 					break;
 				case DiffPackage.UPDATE_ATTRIBUTE:
 					status = CompilerFactory.eINSTANCE.createAttributeChangeStatus();
-					((StructuralFeatureChangeStatus)status).setChangeState(SynchronizerChangeState.UPDATE);
+					((AttributeChangeStatus)status).setChangeState(SynchronizerChangeState.UPDATE);
+					UpdateAttribute updateAttribute = (UpdateAttribute)difference;
+					((AttributeChangeStatus)status).setFeatureName(updateAttribute.getAttribute().getName());
+					((AttributeChangeStatus)status).setWorkingCopyElementURIFragment(EcoreUtil.getURI(
+							updateAttribute.getRightElement()).toString());
+					((AttributeChangeStatus)status).setCompiledElementURIFragment(EcoreUtil.getURI(
+							updateAttribute.getLeftElement()).toString());
 					break;
 
 				// references
diff --git a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/IntentEditorDropSupport.java b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/IntentEditorDropSupport.java
index f2ec719..f5185b3 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/IntentEditorDropSupport.java
+++ b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/IntentEditorDropSupport.java
@@ -24,10 +24,8 @@
 import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.RepositoryAdapter;
 import org.eclipse.mylyn.docs.intent.core.compiler.CompilationStatus;
 import org.eclipse.mylyn.docs.intent.core.compiler.ModelElementChangeStatus;
-import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerCompilationStatus;
 import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnit;
 import org.eclipse.mylyn.docs.intent.modelingunit.update.ModelingUnitUpdater;
-import org.eclipse.mylyn.docs.intent.modelingunit.update.ModelingUnitUpdaterUtils;
 import org.eclipse.swt.dnd.DropTargetAdapter;
 import org.eclipse.swt.dnd.DropTargetEvent;
 
@@ -107,17 +105,16 @@
 		IntentDocumentProvider documentProvider = (IntentDocumentProvider)editor.getDocumentProvider();
 		final RepositoryAdapter repositoryAdapter = documentProvider.getListenedElementsHandler()
 				.getRepositoryAdapter();
-		ModelingUnitUpdater updater = new ModelingUnitUpdater(repositoryAdapter, modelingUnit);
+		ModelingUnitUpdater updater = new ModelingUnitUpdater(repositoryAdapter);
 
 		boolean astChanged = false;
 		CompilationStatusQuery query = new CompilationStatusQuery(repositoryAdapter);
 		for (CompilationStatus compilationStatus : query.getOrCreateCompilationStatusManager()
 				.getCompilationStatusList()) {
-			if (compilationStatus instanceof ModelElementChangeStatus
-					&& ModelingUnitUpdaterUtils.canFix((SynchronizerCompilationStatus)compilationStatus)) {
+			if (compilationStatus instanceof ModelElementChangeStatus) {
 				ModelElementChangeStatus status = (ModelElementChangeStatus)compilationStatus;
 				if (uriFragments.contains(status.getWorkingCopyElementURIFragment())) {
-					updater.fixSynchronizationStatus(status);
+					updater.fixSynchronizationStatus(modelingUnit, status);
 					astChanged = true;
 				}
 			}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/IntentQuickAssistProcessor.java b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/IntentQuickAssistProcessor.java
index 3e5b36f..2391ecf 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/IntentQuickAssistProcessor.java
+++ b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/IntentQuickAssistProcessor.java
@@ -28,7 +28,6 @@
 import org.eclipse.mylyn.docs.intent.core.compiler.ResourceChangeStatus;
 import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerCompilationStatus;
 import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerResourceState;
-import org.eclipse.mylyn.docs.intent.modelingunit.update.ModelingUnitUpdaterUtils;
 
 /**
  * {@link IntentQuickAssistProcessor} used by Intent to fix any issues.
@@ -121,9 +120,7 @@
 			}
 		} else {
 			proposals.add(new EMFCompareFix(annotation));
-			if (ModelingUnitUpdaterUtils.canFix(status)) {
-				proposals.add(new UpdateModelingUnitFix(annotation));
-			}
+			proposals.add(new UpdateModelingUnitFix(annotation));
 		}
 		return proposals;
 	}
diff --git a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/UpdateModelingUnitFix.java b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/UpdateModelingUnitFix.java
index e766c44..eafdb6a 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/UpdateModelingUnitFix.java
+++ b/plugins/org.eclipse.mylyn.docs.intent.client.ui/src/org/eclipse/mylyn/docs/intent/client/ui/editor/quickfix/UpdateModelingUnitFix.java
@@ -15,11 +15,9 @@
 import org.eclipse.jface.text.source.Annotation;
 import org.eclipse.mylyn.docs.intent.client.ui.editor.IntentEditorDocument;
 import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.RepositoryAdapter;
-import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerCompilationStatus;
 import org.eclipse.mylyn.docs.intent.core.modelingunit.InstanciationInstruction;
 import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnit;
 import org.eclipse.mylyn.docs.intent.modelingunit.update.ModelingUnitUpdater;
-import org.eclipse.mylyn.docs.intent.modelingunit.update.ModelingUnitUpdaterUtils;
 
 /**
  * Proposal used to fix a Synchronization issue by opening the compare Editor.
@@ -53,9 +51,9 @@
 				intentTarget = intentTarget.eContainer();
 			}
 			if (intentTarget != null) {
-				ModelingUnitUpdater updater = new ModelingUnitUpdater(repositoryAdapter,
-						(ModelingUnit)intentTarget);
-				updater.fixSynchronizationStatus(syncAnnotation.getCompilationStatus());
+				ModelingUnitUpdater updater = new ModelingUnitUpdater(repositoryAdapter);
+				updater.fixSynchronizationStatus((ModelingUnit)intentTarget,
+						syncAnnotation.getCompilationStatus());
 				((IntentEditorDocument)document).reloadFromAST();
 			}
 		}
@@ -67,8 +65,7 @@
 	 * @see org.eclipse.jface.text.contentassist.ICompletionProposal#getDisplayString()
 	 */
 	public String getDisplayString() {
-		return ModelingUnitUpdaterUtils.getFixMessage((SynchronizerCompilationStatus)syncAnnotation
-				.getCompilationStatus());
+		return "Update modeling unit";
 	}
 
 }
diff --git a/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdater.java b/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdater.java
index d08ffcc..295cada 100644
--- a/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdater.java
+++ b/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdater.java
@@ -11,20 +11,27 @@
  *******************************************************************************/
 package org.eclipse.mylyn.docs.intent.modelingunit.update;
 
+import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.mylyn.docs.intent.collab.common.logger.IIntentLogger.LogType;
 import org.eclipse.mylyn.docs.intent.collab.common.logger.IntentLogger;
 import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.IntentCommand;
 import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.ReadOnlyException;
 import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.RepositoryAdapter;
 import org.eclipse.mylyn.docs.intent.collab.handlers.adapters.SaveException;
+import org.eclipse.mylyn.docs.intent.core.compiler.AttributeChangeStatus;
 import org.eclipse.mylyn.docs.intent.core.compiler.CompilationStatus;
 import org.eclipse.mylyn.docs.intent.core.compiler.CompilerPackage;
 import org.eclipse.mylyn.docs.intent.core.compiler.ModelElementChangeStatus;
+import org.eclipse.mylyn.docs.intent.core.compiler.ReferenceChangeStatus;
+import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerChangeState;
 import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerCompilationStatus;
 import org.eclipse.mylyn.docs.intent.core.modelingunit.ContributionInstruction;
 import org.eclipse.mylyn.docs.intent.core.modelingunit.InstanciationInstruction;
 import org.eclipse.mylyn.docs.intent.core.modelingunit.ModelingUnit;
+import org.eclipse.mylyn.docs.intent.core.modelingunit.NativeValueForStructuralFeature;
+import org.eclipse.mylyn.docs.intent.core.modelingunit.StructuralFeatureAffectation;
 import org.eclipse.mylyn.docs.intent.modelingunit.gen.ModelingUnitGenerator;
 
 /**
@@ -36,67 +43,131 @@
 
 	private RepositoryAdapter repositoryAdapter;
 
-	private ModelingUnit modelingUnit;
-
 	/**
 	 * Creates a modeling unit updater.
 	 * 
 	 * @param repositoryAdapter
 	 *            the repository adapter
-	 * @param modelingUnitToUpdate
-	 *            the modeling unit to update
 	 */
-	public ModelingUnitUpdater(RepositoryAdapter repositoryAdapter, ModelingUnit modelingUnitToUpdate) {
+	public ModelingUnitUpdater(RepositoryAdapter repositoryAdapter) {
 		this.repositoryAdapter = repositoryAdapter;
-		this.modelingUnit = modelingUnitToUpdate;
 	}
 
 	/**
-	 * Fixes the given statuses by updating the current modeling unit.
+	 * Fixes the given statuses by updating the given modeling unit.
 	 * 
+	 * @param modelingUnit
+	 *            the modeling unit to update
 	 * @param statusToFix
 	 *            the statuses to fix
 	 */
-	public void fixSynchronizationStatus(CompilationStatus... statusToFix) {
+	public void fixSynchronizationStatus(ModelingUnit modelingUnit, CompilationStatus... statusToFix) {
 		for (CompilationStatus status : statusToFix) {
 			switch (status.eClass().getClassifierID()) {
 				case CompilerPackage.MODEL_ELEMENT_CHANGE_STATUS:
-					InstanciationInstruction instanciation = (InstanciationInstruction)((SynchronizerCompilationStatus)status)
-							.getTarget();
-					create(instanciation,
-							ModelingUnitUpdaterUtils
-									.getRootEObjectToGenerate((ModelElementChangeStatus)status));
+					fixModelElementChangeStatus(modelingUnit, (ModelElementChangeStatus)status);
 					break;
-
+				case CompilerPackage.ATTRIBUTE_CHANGE_STATUS:
+					fixAttributeChangeStatus(modelingUnit, (AttributeChangeStatus)status);
+					break;
+				case CompilerPackage.REFERENCE_CHANGE_STATUS:
+					fixReferenceChangeStatus(modelingUnit, (ReferenceChangeStatus)status);
+					break;
 				default:
 					break;
 			}
 		}
 	}
 
-	/**
-	 * Creates or update the given target element.
-	 * 
-	 * @param containerInstanciation
-	 *            the instruction that defines the containment of the target element
-	 * @param target
-	 *            the element to create or update
-	 */
-	private void create(InstanciationInstruction containerInstanciation, EObject target) {
-		final ContributionInstruction contribution = generateContribution(containerInstanciation, target);
-		repositoryAdapter.execute(new IntentCommand() {
+	private void fixModelElementChangeStatus(final ModelingUnit modelingUnit, ModelElementChangeStatus status) {
+		switch (status.getChangeState().getValue()) {
+			case SynchronizerChangeState.WORKING_COPY_TARGET_VALUE:
+				InstanciationInstruction containerInstanciation = (InstanciationInstruction)status
+						.getTarget();
 
-			public void execute() {
-				try {
-					modelingUnit.getInstructions().add(contribution);
-					repositoryAdapter.save();
-				} catch (ReadOnlyException e) {
-					IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
-				} catch (SaveException e) {
-					IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
-				}
-			}
+				EObject target = getWorkingCopyEObject(status.getWorkingCopyElementURIFragment());
 
-		});
+				final ContributionInstruction contribution = generateContribution(containerInstanciation,
+						target);
+				repositoryAdapter.execute(new IntentCommand() {
+
+					public void execute() {
+						try {
+							modelingUnit.getInstructions().add(contribution);
+							repositoryAdapter.save();
+						} catch (ReadOnlyException e) {
+							IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
+						} catch (SaveException e) {
+							IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
+						}
+					}
+
+				});
+				break;
+
+			default:
+				debug(status);
+				break;
+		}
 	}
+
+	private EObject getWorkingCopyEObject(String uri) {
+		ResourceSetImpl rs = new ResourceSetImpl();
+		EObject target = rs.getEObject(URI.createURI(uri), true);
+		return target;
+	}
+
+	private void fixAttributeChangeStatus(final ModelingUnit modelingUnit, AttributeChangeStatus status) {
+		switch (status.getChangeState().getValue()) {
+			case SynchronizerChangeState.UPDATE_VALUE:
+
+				InstanciationInstruction target = (InstanciationInstruction)status.getTarget();
+				for (StructuralFeatureAffectation affectation : target.getStructuralFeatures()) {
+					if (affectation.getName().equals(status.getFeatureName())) {
+						final NativeValueForStructuralFeature value = (NativeValueForStructuralFeature)affectation
+								.getValues().get(0);
+
+						EObject element = getWorkingCopyEObject(status.getWorkingCopyElementURIFragment());
+						final Object newValue = element.eGet(element.eClass().getEStructuralFeature(
+								status.getFeatureName()));
+						repositoryAdapter.execute(new IntentCommand() {
+
+							public void execute() {
+								try {
+									value.setValue("\"" + newValue.toString() + "\"");
+									repositoryAdapter.save();
+								} catch (ReadOnlyException e) {
+									IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
+								} catch (SaveException e) {
+									IntentLogger.getInstance().log(LogType.ERROR, e.getMessage());
+								}
+							}
+
+						});
+
+					}
+				}
+
+				break;
+
+			default:
+				debug(status);
+				break;
+		}
+	}
+
+	private void fixReferenceChangeStatus(ModelingUnit modelingUnit, ReferenceChangeStatus status) {
+		switch (status.getChangeState().getValue()) {
+			default:
+				debug(status);
+				break;
+		}
+	}
+
+	private void debug(SynchronizerCompilationStatus status) {
+		System.err.println("UNSUPPORTED :");
+		System.err.println(status.eClass().getName());
+		System.err.println(status.getMessage());
+	}
+
 }
diff --git a/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdaterUtils.java b/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdaterUtils.java
deleted file mode 100644
index b7fb09a..0000000
--- a/plugins/org.eclipse.mylyn.docs.intent.modelingunit.update/src/org/eclipse/mylyn/docs/intent/modelingunit/update/ModelingUnitUpdaterUtils.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 Obeo.
-
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Obeo - initial API and implementation
- *******************************************************************************/
-package org.eclipse.mylyn.docs.intent.modelingunit.update;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.mylyn.docs.intent.core.compiler.CompilerPackage;
-import org.eclipse.mylyn.docs.intent.core.compiler.ModelElementChangeStatus;
-import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerChangeState;
-import org.eclipse.mylyn.docs.intent.core.compiler.SynchronizerCompilationStatus;
-
-/**
- * Modeling unit updater utilities methods.
- * 
- * @author <a href="mailto:william.piers@obeo.fr">William Piers</a>
- */
-public final class ModelingUnitUpdaterUtils {
-
-	/**
-	 * Constructor.
-	 */
-	private ModelingUnitUpdaterUtils() {
-		// prevents instantiation
-	}
-
-	/**
-	 * Returns the root EObject to generate.
-	 * 
-	 * @param status
-	 *            the sync status
-	 * @return the root EObject to generate
-	 */
-	public static EObject getRootEObjectToGenerate(ModelElementChangeStatus status) {
-		ResourceSetImpl rs = new ResourceSetImpl();
-		return rs.getEObject(URI.createURI(status.getWorkingCopyElementURIFragment()), true);
-	}
-
-	/**
-	 * Checks whether a status can be fixed or not.
-	 * 
-	 * @param status
-	 *            the status to test
-	 * @return true if the status can be fixed
-	 */
-	public static boolean canFix(SynchronizerCompilationStatus status) {
-		boolean res = false;
-		switch (status.eClass().getClassifierID()) {
-			case CompilerPackage.MODEL_ELEMENT_CHANGE_STATUS:
-				res = ((ModelElementChangeStatus)status).getChangeState().equals(
-						SynchronizerChangeState.WORKING_COPY_TARGET);
-				break;
-
-			default:
-				break;
-		}
-		return res;
-	}
-
-	/**
-	 * Checks whether a status can be fixed or not.
-	 * 
-	 * @param status
-	 *            the status to test
-	 * @return true if the status can be fixed
-	 */
-	public static String getFixMessage(SynchronizerCompilationStatus status) {
-		// TODO accurate messages
-		return "Update modeling unit";
-	}
-}