Index: main/plugin-odf/resources/js/org/ametys/odf/helper/ChooseOrgUnit.i18n.js
===================================================================
--- main/plugin-odf/resources/js/org/ametys/odf/helper/ChooseOrgUnit.i18n.js	(revision 38757)
+++ main/plugin-odf/resources/js/org/ametys/odf/helper/ChooseOrgUnit.i18n.js	(working copy)
@@ -24,12 +24,14 @@
  * @param {Function} callback The method that will be called when the dialog box is closed. The method signature is &lt;ul&gt;&lt;li&gt;id: The id of the orgunit&lt;/li&gt;&lt;li&gt;title: The name of the title&lt;/li&gt;&lt;/ul&gt;.
  * @param {boolean} multiple Is selection multiple. false by default.
  * @param {String} values The selected orgunit(s). Can be null.
+ * @param {String} rootId The root orgunit ID. 'root' by default.
  */
-org.ametys.odf.helper.ChooseOrgUnit = function(icon, title, helpmessage, callback, multiple, values)
+org.ametys.odf.helper.ChooseOrgUnit = function(icon, title, helpmessage, callback, multiple, values, rootId)
 {
 	org.ametys.odf.helper.ChooseOrgUnit._cb = callback;
 	org.ametys.odf.helper.ChooseOrgUnit._multiple = multiple;
 	org.ametys.odf.helper.ChooseOrgUnit._values = values;
+	org.ametys.odf.helper.ChooseOrgUnit._rootId = rootId || 'root';
 	
 	org.ametys.odf.helper.ChooseOrgUnit._initialize(icon, title, helpmessage);
 	
@@ -110,7 +112,7 @@
 	org.ametys.odf.helper.ChooseOrgUnit._tree.getSelectionModel().addListener('selectionchange', org.ametys.odf.helper.ChooseOrgUnit._selectionChange);
 	org.ametys.odf.helper.ChooseOrgUnit._tree.getLoader().addListener ('beforeload', this._onBeforeLoad, this);
 	org.ametys.odf.helper.ChooseOrgUnit._tree.addListener ('load', this._onLoad, this);
-	org.ametys.odf.helper.ChooseOrgUnit._tree.createRootNode ('root');
+	org.ametys.odf.helper.ChooseOrgUnit._tree.createRootNode (org.ametys.odf.helper.ChooseOrgUnit._rootId);
 	org.ametys.odf.helper.ChooseOrgUnit._tree.getRootNode().reload ();
 	org.ametys.odf.helper.ChooseOrgUnit._tree.getRootNode().expand();
 }
@@ -143,7 +145,7 @@
 	
 	for (var i=0; i &lt; orgunits.length; i++)
 	{
-		var child = node.findChild ('id', orgunits[i]);
+		var child = node.id == orgunits[i] ? node : node.findChild ('id', orgunits[i]);
 		if (child != null)
 		{
 			if (org.ametys.odf.helper.ChooseOrgUnit._multiple)
Index: main/plugin-odf/resources/js/org/ametys/odf/orgunit/OrgUnitTreePanel.i18n.js
===================================================================
--- main/plugin-odf/resources/js/org/ametys/odf/orgunit/OrgUnitTreePanel.i18n.js	(revision 38757)
+++ main/plugin-odf/resources/js/org/ametys/odf/orgunit/OrgUnitTreePanel.i18n.js	(working copy)
@@ -126,7 +126,8 @@
         text: response.selectSingleNode('orgunits/orgunit').getAttribute('title'),
         id: response.selectSingleNode('orgunits/orgunit').getAttribute('id'),
         icon: getPluginResourcesUrl ('odf') + '/img/orgunit/orgunit_16.png',
-        type: 'orgunit'
+        type: 'orgunit',
+        checked: id == "root" ? undefined : false
     });
 	
 	this.setRootNode(rootNode);	
Index: main/plugin-odf/resources/js/org/ametys/odf/widgets/OrgUnitWidget.i18n.js
===================================================================
--- main/plugin-odf/resources/js/org/ametys/odf/widgets/OrgUnitWidget.i18n.js	(revision 38757)
+++ main/plugin-odf/resources/js/org/ametys/odf/widgets/OrgUnitWidget.i18n.js	(working copy)
@@ -172,7 +172,7 @@
 }
 
 /**
- * @private
+ * @protected
  */
 org.ametys.odf.widgets.OrgUnitWidget.prototype.selectOrgUnit = function ()
 {
Index: main/plugin-odf/src/org/ametys/odf/SynchronizeMultiValuesExpression.java
===================================================================
--- main/plugin-odf/src/org/ametys/odf/SynchronizeMultiValuesExpression.java	(revision 0)
+++ main/plugin-odf/src/org/ametys/odf/SynchronizeMultiValuesExpression.java	(revision 0)
@@ -0,0 +1,64 @@
+/*
+ *  Copyright 2012 Anyware Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.ametys.odf;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.ametys.odf.contenttype.ODFContentType;
+import org.ametys.plugins.repository.query.expression.AndExpression;
+import org.ametys.plugins.repository.query.expression.BooleanExpression;
+import org.ametys.plugins.repository.query.expression.Expression;
+import org.ametys.plugins.repository.query.expression.MetadataExpression;
+import org.ametys.plugins.repository.query.expression.NotExpression;
+import org.ametys.plugins.repository.query.expression.OrExpression;
+import org.ametys.plugins.repository.query.expression.StringExpression;
+
+/**
+ * Constructs an {@link Expression} for synchronized fields matching multiple values
+ *
+ */
+public class SynchronizeMultiValuesExpression implements Expression
+{
+    private Expression _expr;
+
+    /**
+     * Creates an {@link Expression} for a synchronized metadata
+     * @param metadata the metadata
+     * @param orgUnits the values to test
+     */
+    public SynchronizeMultiValuesExpression(String metadata, Set<String> orgUnits)
+    {
+        List<Expression> exprSyncValues = new ArrayList<Expression>();
+        List<Expression> exprValues = new ArrayList<Expression>();
+        for (String value : orgUnits)
+        {
+            exprSyncValues.add(new StringExpression(metadata + ODFContentType.REMOTE_SUFFIX, Operator.EQ, value));
+            exprValues.add(new StringExpression(metadata, Operator.EQ, value));
+        }
+        
+        Expression exprSync = new AndExpression(new BooleanExpression(metadata + ODFContentType.SYNC_SUFFIX, true), new OrExpression(exprSyncValues.toArray(new Expression[exprSyncValues.size()])));
+        Expression exprNotSync = new AndExpression(new OrExpression(new NotExpression(new MetadataExpression(metadata + ODFContentType.SYNC_SUFFIX)), new BooleanExpression(metadata + ODFContentType.SYNC_SUFFIX, Operator.NE, true)), new OrExpression(exprValues.toArray(new Expression[exprValues.size()])));
+        _expr = new OrExpression(exprSync, exprNotSync);
+    }
+    
+    @Override
+    public String build()
+    {
+        return _expr.build();
+    }
+}
Index: main/plugin-odf/src/org/ametys/odf/observation/OdfObservationConstants.java
===================================================================
--- main/plugin-odf/src/org/ametys/odf/observation/OdfObservationConstants.java	(revision 38757)
+++ main/plugin-odf/src/org/ametys/odf/observation/OdfObservationConstants.java	(working copy)
@@ -24,4 +24,7 @@
     /** Event id sent when a content is translated. */
     public static final String ODF_CONTENT_TRANSLATED = "odf.content.translated";
     
+    /** Event id when a ODF OrgUnit is moved. */
+    public static final String ODF_ORGUNIT_MOVED = "odf.orgunit.moved";
+    
 }
Index: main/plugin-odf/src/org/ametys/odf/orgunit/actions/MoveOrgUnitAction.java
===================================================================
--- main/plugin-odf/src/org/ametys/odf/orgunit/actions/MoveOrgUnitAction.java	(revision 38757)
+++ main/plugin-odf/src/org/ametys/odf/orgunit/actions/MoveOrgUnitAction.java	(working copy)
@@ -15,33 +15,48 @@
  */
 package org.ametys.odf.orgunit.actions;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.avalon.framework.parameters.Parameters;
 import org.apache.avalon.framework.service.ServiceException;
 import org.apache.avalon.framework.service.ServiceManager;
-import org.apache.cocoon.acting.ServiceableAction;
 import org.apache.cocoon.environment.ObjectModelHelper;
 import org.apache.cocoon.environment.Redirector;
 import org.apache.cocoon.environment.Request;
 import org.apache.cocoon.environment.SourceResolver;
 
+import org.ametys.cms.observation.Event;
+import org.ametys.cms.observation.ObservationConstants;
+import org.ametys.cms.observation.ObservationManager;
+import org.ametys.cms.workflow.AbstractContentWorkflowComponent;
+import org.ametys.cms.workflow.InitializeContentWorkflowAction;
+import org.ametys.odf.observation.OdfObservationConstants;
 import org.ametys.odf.orgunit.OrgUnit;
 import org.ametys.plugins.repository.AmetysObjectResolver;
+import org.ametys.plugins.repository.version.VersionableAmetysObject;
+import org.ametys.runtime.user.CurrentUserProvider;
+
+import com.opensymphony.workflow.WorkflowException;
+import com.opensymphony.workflow.spi.Step;
 
 /**
  * Moves a {@link OrgUnit}
  *
  */
-public class MoveOrgUnitAction extends ServiceableAction
+public class MoveOrgUnitAction extends InitializeContentWorkflowAction
 {
     private AmetysObjectResolver _resolver;
+    private ObservationManager _observationManager;
+    private CurrentUserProvider _currentUserProvider;
     
     @Override
     public void service(ServiceManager serviceManager) throws ServiceException
     {
         super.service(serviceManager);
         _resolver = (AmetysObjectResolver) serviceManager.lookup(AmetysObjectResolver.ROLE);
+        _observationManager = (ObservationManager) serviceManager.lookup(ObservationManager.ROLE);
+        _currentUserProvider = (CurrentUserProvider) serviceManager.lookup(CurrentUserProvider.ROLE);
     }
     
     @Override
@@ -60,10 +75,39 @@
         newParentOrgUnit.addSubOrgUnit(orgUnit.getId());
         oldParentOrgUnit.removeSubOrgUnit(orgUnit.getId());
         
-        newParentOrgUnit.saveChanges();
-        oldParentOrgUnit.saveChanges();
+        applyChangesToParent(newParentOrgUnit);
+        applyChangesToParent(oldParentOrgUnit);
+        
+        // Notify listeners
+        _observationManager.notify(new Event(_currentUserProvider.getUser(), OdfObservationConstants.ODF_ORGUNIT_MOVED, orgUnit, new Object[] {oldParentOrgUnit, newParentOrgUnit}));
         
         return EMPTY_MAP;
     }
+    
+    /**
+     * Apply changes to parent {@link OrgUnit}
+     * @param ou The parent orgunit
+     * @throws WorkflowException
+     */
+    protected void applyChangesToParent(OrgUnit ou) throws WorkflowException
+    {
+        // Save changes
+        ou.saveChanges();
+        // Create new version
+        ((VersionableAmetysObject) ou).checkpoint();
+        
+        // Notify listeners
+        _observationManager.notify(new Event(_currentUserProvider.getUser(), ObservationConstants.CONTENT_MODIFIED, ou));
+       
+        // Do workflow action
+        Map<String, Object> inputs = new HashMap<String, Object>();
+        inputs.put(AbstractContentWorkflowComponent.RESULT_MAP_KEY, new HashMap<String, Object>());
+        inputs.put(AbstractContentWorkflowComponent.CONTENT_KEY, ou);
+        _workflow.doAction(ou.getWorkflowId(), 22, inputs);
+        
+        Step currentStep = (Step) _workflow.getCurrentSteps(ou.getWorkflowId()).iterator().next();
+        ou.setCurrentStepId(currentStep.getStepId());
+        ou.saveChanges();
+    }
 
 }
