diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep00.java b/src/main/java/org/olat/admin/user/imp/ImportStep00.java
index a976bb03f030311fbee0b07fcdd57e99cb0a7ad4..37f1b4e247fc703bd1e895754b60bd2636d489fb 100644
--- a/src/main/java/org/olat/admin/user/imp/ImportStep00.java
+++ b/src/main/java/org/olat/admin/user/imp/ImportStep00.java
@@ -74,11 +74,10 @@ import com.thoughtworks.xstream.XStream;
  */
 class ImportStep00 extends BasicStep {
 
-	boolean canCreateOLATPassword;
-	static final String usageIdentifyer = UserImportController.class.getCanonicalName();
-	Mapper excelMapper;
-	String formatexplanationPart2;
-	TextElement textAreaElement;
+	private static final String usageIdentifyer = UserImportController.class.getCanonicalName();
+	private boolean canCreateOLATPassword;
+	private Mapper excelMapper;
+	private TextElement textAreaElement;
 
 	public ImportStep00(UserRequest ureq, boolean canCreateOLATPassword) {
 		super(ureq);
@@ -108,14 +107,17 @@ class ImportStep00 extends BasicStep {
 
 	private final class ImportStepForm00 extends StepFormBasicController {
 
-		private FormLayoutContainer textContainer;
-		private List<UserPropertyHandler> userPropertyHandlers;
-		private List<TransientIdentity> newIdents;
 		private List<Identity> idents;
+		private List<UpdateIdentity> updateIdents;
+		private List<TransientIdentity> newIdents;
+		private List<UserPropertyHandler> userPropertyHandlers;
+
+		private final UserManager um;
 
 		public ImportStepForm00(UserRequest ureq, WindowControl control, Form rootForm, StepsRunContext runContext) {
 			super(ureq, control, rootForm, runContext, LAYOUT_VERTICAL, null);
 			flc.setTranslator(getTranslator());
+			um = UserManager.getInstance();
 			initForm(ureq);
 		}
 
@@ -124,11 +126,11 @@ class ImportStep00 extends BasicStep {
 			//
 		}
 
-		@SuppressWarnings("synthetic-access")
 		@Override
 		protected void formOK(UserRequest ureq) {
 			addToRunContext("idents", idents);
 			addToRunContext("newIdents", newIdents);
+			addToRunContext("updateIdents", updateIdents);
 			addToRunContext("validImport", Boolean.TRUE);
 			boolean newUsers = false;
 			if (newIdents.size() != 0) {
@@ -149,22 +151,9 @@ class ImportStep00 extends BasicStep {
 
 			idents = new ArrayList<Identity>();
 			newIdents = new ArrayList<TransientIdentity>();
-			// fxdiff: check also emails in change-workflow, see OLAT-5723
-			Set<String> tempEmailsInUse = new HashSet<String>();
-			RegistrationManager rm = RegistrationManager.getInstance();
-			List<TemporaryKey> tk = rm.loadTemporaryKeyByAction(RegistrationManager.EMAIL_CHANGE);
-			if (tk != null) {
-				for (TemporaryKey temporaryKey : tk) {
-					XStream xml = new XStream();
-					@SuppressWarnings("unchecked")
-					Map<String, String> mails = (Map<String, String>) xml.fromXML(temporaryKey.getEmailAddress());
-					for(Map.Entry<String, String> mailEntry:mails.entrySet()) {
-						tempEmailsInUse.add(mailEntry.getKey());
-						tempEmailsInUse.add(mailEntry.getValue());
-					}
-				}
-			}
-			// fxdiff >
+			updateIdents = new ArrayList<UpdateIdentity>();
+			//check also emails in change-workflow, see OLAT-5723
+			Set<String> tempEmailsInUse = getTemporaryEmailInUse();
 			
 			// Note: some values are fix and required: login, pwd and lang, those
 			// can not be configured in the config file
@@ -178,173 +167,197 @@ class ImportStep00 extends BasicStep {
 			String[] lines = inp.split("\r?\n");
 			for (int i = 0; i < lines.length; i++) {
 				String line = lines[i];
-				if (!line.equals("")) { // ignore empty lines
-					String delimiter = "\t";
-					// use comma as fallback delimiter, e.g. for better testing
-					if (line.indexOf(delimiter) == -1) delimiter = ",";
-					String[] parts = line.split(delimiter);
-					String login, pwd, lang;
-
-					int columnId = 0;
+				if (line.equals("")) continue;
+				
+				String delimiter = "\t";
+				// use comma as fallback delimiter, e.g. for better testing
+				if (line.indexOf(delimiter) == -1) delimiter = ",";
+				String[] parts = line.split(delimiter);
+				String login, pwd, lang;
+
+				int columnId = 0;
+
+				// login row
+				if (parts.length > columnId) {
+					login = parts[columnId].trim();
+					if (!UserManager.getInstance().syntaxCheckOlatLogin(login)) {
+						textAreaElement.setErrorKey("error.login", new String[] { String.valueOf(i + 1), login });
+						importDataError = true;
+						break;
+					}
+				} else {
+					textAreaElement.setErrorKey("error.columncount", new String[] { String.valueOf(i + 1) });
+					importDataError = true;
+					break;
+				}
+				columnId++;
 
-					// login row
+				// pwd row
+				if (canCreateOLATPassword) {
 					if (parts.length > columnId) {
-						login = parts[columnId].trim();
-						if (!UserManager.getInstance().syntaxCheckOlatLogin(login)) {
-							textAreaElement.setErrorKey("error.login", new String[] { String.valueOf(i + 1), login });
-							importDataError = true;
-							break;
+						pwd = parts[columnId].trim();
+						if (StringHelper.containsNonWhitespace(pwd)) {
+							if (!UserManager.getInstance().syntaxCheckOlatPassword(pwd)) {
+								textAreaElement.setErrorKey("error.pwd", new String[] { String.valueOf(i + 1), pwd });
+								importDataError = true;
+								break;
+							}
+						} else {
+							// treat all white-space-only passwords as non-passwords.
+							// the user generation code below will then generate no
+							// authentication token for this user
+							pwd = null;
 						}
 					} else {
 						textAreaElement.setErrorKey("error.columncount", new String[] { String.valueOf(i + 1) });
 						importDataError = true;
 						break;
 					}
-					columnId++;
+				} else {
+					pwd = null;
+				}
+				columnId++;
 
-					// pwd row
-					if (canCreateOLATPassword) {
-						if (parts.length > columnId) {
-							pwd = parts[columnId].trim();
-							if (StringHelper.containsNonWhitespace(pwd)) {
-								if (!UserManager.getInstance().syntaxCheckOlatPassword(pwd)) {
-									textAreaElement.setErrorKey("error.pwd", new String[] { String.valueOf(i + 1), pwd });
-									importDataError = true;
-									break;
-								}
-							} else {
-								// treat all white-space-only passwords as non-passwords.
-								// the user generation code below will then generate no
-								// authentication token for this user
-								pwd = null;
-							}
-						} else {
-							textAreaElement.setErrorKey("error.columncount", new String[] { String.valueOf(i + 1) });
-							importDataError = true;
-							break;
-						}
-					} else {
-						pwd = null;
+				// optional language fields
+				if (parts.length > columnId) {
+					lang = parts[columnId].trim();
+					if (lang.equals("")) {
+						lang = defaultlang;
+					} else if (!languages.contains(lang)) {
+						textAreaElement.setErrorKey("error.lang", new String[] { String.valueOf(i + 1), lang });
+						importDataError = true;
+						break;
 					}
-					columnId++;
+				} else {
+					lang = defaultlang;
+				}
+				columnId++;
 
-					// optional language fields
-					if (parts.length > columnId) {
-						lang = parts[columnId].trim();
-						if (lang.equals("")) {
-							lang = defaultlang;
-						} else if (!languages.contains(lang)) {
-							textAreaElement.setErrorKey("error.lang", new String[] { String.valueOf(i + 1), lang });
+				Identity ident = BaseSecurityManager.getInstance().findIdentityByName(login);
+				if (ident != null) {
+					// update existing accounts, add info message
+					idents.add(ident);
+					
+					ident.getUser().getPreferences().setLanguage(lang);
+					importDataError = updateUserProperties(ident, parts, i, columnId, tempEmailsInUse, importedEmails, true);
+					if(importDataError) break;
+					
+					UpdateIdentity uIdentity = new UpdateIdentity(ident, pwd);
+					updateIdents.add(uIdentity);
+				} else {
+					// no identity/user yet, create
+					// check that no user with same login name is already in list
+					for (Iterator<TransientIdentity> it_news = newIdents.iterator(); it_news.hasNext();) {
+						TransientIdentity singleUser = it_news.next();
+						if (singleUser.getName().equalsIgnoreCase(login)) {
+							textAreaElement.setErrorKey("error.login.douplicate", new String[] { String.valueOf(i + 1), login });
 							importDataError = true;
 							break;
 						}
-					} else {
-						lang = defaultlang;
 					}
-					columnId++;
 
-					Identity ident = BaseSecurityManager.getInstance().findIdentityByName(login);
-					if (ident != null) {
-						// ignore existing accounts, add info message
-						idents.add(ident);
-					} else {
-						// no identity/user yet, create
-						UserManager um = UserManager.getInstance();
-						UserPropertyHandler userPropertyHandler;
-						String thisKey = "";
-						String thisValue = "";
-						// check that no user with same login name is already in list
-						for (Iterator<TransientIdentity> it_news = newIdents.iterator(); it_news.hasNext();) {
-							TransientIdentity singleUser = it_news.next();
-							if (singleUser.getName().equalsIgnoreCase(login)) {
-								textAreaElement.setErrorKey("error.login.douplicate", new String[] { String.valueOf(i + 1), login });
-								importDataError = true;
-								break;
-							}
-						}
+					TransientIdentity ud = new TransientIdentity();
+					// insert fix fields: login, pwd, lang from above
+					ud.setName(login);
+					ud.setPassword(pwd);
+					ud.setLanguage(lang);
+					importDataError = updateUserProperties(ud, parts, i, columnId, tempEmailsInUse, importedEmails, false);
+					if(importDataError) break;
+					
+					idents.add(ud);
+					newIdents.add(ud);
+				}
+			}
 
-						TransientIdentity ud = new TransientIdentity();
-						// insert fix fields: login, pwd, lang from above
-						ud.setName(login);
-						ud.setPassword(pwd);
-						ud.setLanguage(lang);
-
-						for (int j = 0; j < userPropertyHandlers.size(); j++) {
-							userPropertyHandler = userPropertyHandlers.get(j);
-							thisKey = userPropertyHandler.getName();
-							// last columns may be empty if not mandatory
-							if (parts.length <= columnId) {
-								thisValue = "";
-							} else {
-								thisValue = parts[columnId].trim();
-							}
-							boolean isMandatoryField = um.isMandatoryUserProperty(usageIdentifyer, userPropertyHandler);
-							if (isMandatoryField && !StringHelper.containsNonWhitespace(thisValue)) {
-								textAreaElement.setErrorKey("error.mandatory", new String[] { String.valueOf(i + 1), translate(userPropertyHandler.i18nFormElementLabelKey()) });
-								importDataError = true;
-								break;
-							}
-							// used for call-back value depending on PropertyHandler
-							ValidationError validationError = new ValidationError();
-							if (!userPropertyHandler.isValidValue(null, thisValue, validationError, getLocale())) {
-								textAreaElement.setErrorKey("error.lengthorformat", new String[] { String.valueOf(i + 1), translate(userPropertyHandler.i18nFormElementLabelKey()),
-										translate(validationError.getErrorKey(), validationError.getArgs()) });
-								importDataError = true;
-								break;
-							}
-							// check that no user with same (institutional) e-mail is already in OLAT
-							if ( (thisKey.equals(UserConstants.INSTITUTIONALEMAIL) || thisKey.equals(UserConstants.EMAIL)) && !thisValue.isEmpty() ) {
-								// check that no user with same email is already in OLAT
-								Identity identity = UserManager.getInstance().findIdentityByEmail(thisValue);
-								if (identity != null) {
-									textAreaElement.setErrorKey("error.email.exists", new String[] { String.valueOf(i + 1), thisValue });
-									importDataError = true;
-									break;
-								}
-							}
-							// check that no user with same email is already in list
-							if (thisKey.equals(UserConstants.EMAIL)) {
-								// check that no user with same email is already in list
-								Integer mailPos = importedEmails.indexOf(thisValue);
-								// fxdiff
-								//TODO unique user property
-								boolean duplicate = mailPos != -1;
-								if (!duplicate) {
-									duplicate |= tempEmailsInUse.contains(thisValue);
-								}
-								if(!duplicate) {
-									duplicate |= um.isEmailInUse(thisValue);
-								}
-
-								if (duplicate) { // fxdiff >
-									mailPos++;
-									textAreaElement.setErrorKey("error.email.douplicate",
-											new String[] { String.valueOf(i + 1), thisValue, mailPos.toString() });
-									importDataError = true;
-									break;
-								} else {
-									importedEmails.add(thisValue);
-								}
-							}
-							ud.setProperty(thisKey, thisValue);
-							columnId++;
-						}
-						idents.add(ud);
-						newIdents.add(ud);
+			return !importDataError;
+		}
+		
+		private Set<String> getTemporaryEmailInUse() {
+			Set<String> tempEmailsInUse = new HashSet<String>();
+			RegistrationManager rm = RegistrationManager.getInstance();
+			List<TemporaryKey> tk = rm.loadTemporaryKeyByAction(RegistrationManager.EMAIL_CHANGE);
+			if (tk != null) {
+				for (TemporaryKey temporaryKey : tk) {
+					XStream xml = new XStream();
+					@SuppressWarnings("unchecked")
+					Map<String, String> mails = (Map<String, String>) xml.fromXML(temporaryKey.getEmailAddress());
+					for(Map.Entry<String, String> mailEntry:mails.entrySet()) {
+						tempEmailsInUse.add(mailEntry.getKey());
+						tempEmailsInUse.add(mailEntry.getValue());
 					}
 				}
 			}
+			return tempEmailsInUse;
+		}
+		
+		private boolean updateUserProperties(Identity ud, String[] parts, int i, int columnId,
+				Set<String> tempEmailsInUse, List<String> importedEmails, boolean update) {
+			
+			boolean importDataError = false;
+			for (int j = 0; j < userPropertyHandlers.size(); j++) {
+				UserPropertyHandler userPropertyHandler = userPropertyHandlers.get(j);
+				String thisKey = userPropertyHandler.getName();
+				String thisValue = "";
+				// last columns may be empty if not mandatory
+				if (parts.length <= columnId) {
+					thisValue = "";
+				} else {
+					thisValue = parts[columnId].trim();
+				}
+				boolean isMandatoryField = um.isMandatoryUserProperty(usageIdentifyer, userPropertyHandler);
+				if (isMandatoryField && !StringHelper.containsNonWhitespace(thisValue)) {
+					textAreaElement.setErrorKey("error.mandatory", new String[] { String.valueOf(i + 1), translate(userPropertyHandler.i18nFormElementLabelKey()) });
+					importDataError = true;
+					break;
+				}
+				// used for call-back value depending on PropertyHandler
+				ValidationError validationError = new ValidationError();
+				if (!userPropertyHandler.isValidValue(null, thisValue, validationError, getLocale())) {
+					textAreaElement.setErrorKey("error.lengthorformat", new String[] { String.valueOf(i + 1), translate(userPropertyHandler.i18nFormElementLabelKey()),
+							translate(validationError.getErrorKey(), validationError.getArgs()) });
+					importDataError = true;
+					break;
+				}
+				// check that no user with same (institutional) e-mail is already in OLAT
+				if ( (thisKey.equals(UserConstants.INSTITUTIONALEMAIL) || thisKey.equals(UserConstants.EMAIL)) && !thisValue.isEmpty() ) {
+					// check that no user with same email is already in OLAT
+					Identity identity = UserManager.getInstance().findIdentityByEmail(thisValue);
+					if (identity != null && !identity.equals(ud)) {
+						textAreaElement.setErrorKey("error.email.exists", new String[] { String.valueOf(i + 1), thisValue });
+						importDataError = true;
+						break;
+					}
+				}
+				// check that no user with same email is already in list
+				if (thisKey.equals(UserConstants.EMAIL)) {
+					// check that no user with same email is already in list
+					Integer mailPos = importedEmails.indexOf(thisValue);
+					boolean duplicate = mailPos != -1;
+					if (!duplicate) {
+						duplicate |= tempEmailsInUse.contains(thisValue);
+					}
 
-			if (importDataError) return false;
-
-			return true;
+					if (duplicate) {
+						mailPos++;
+						textAreaElement.setErrorKey("error.email.douplicate",
+								new String[] { String.valueOf(i + 1), thisValue, mailPos.toString() });
+						importDataError = true;
+						break;
+					} else {
+						importedEmails.add(thisValue);
+					}
+				}
+				ud.getUser().setProperty(thisKey, thisValue);
+				columnId++;
+			}
+			return importDataError;
 		}
 
 		@Override
 		protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 			setFormTitle("title");
 
-			textContainer = FormLayoutContainer.createCustomFormLayout("index", getTranslator(), this.velocity_root + "/step0.html");
+			FormLayoutContainer textContainer = FormLayoutContainer.createCustomFormLayout("index", getTranslator(), this.velocity_root + "/step0.html");
 			formLayout.add(textContainer);
 			textContainer.contextPut("canCreateOLATPassword", canCreateOLATPassword);
 
diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep01.java b/src/main/java/org/olat/admin/user/imp/ImportStep01.java
index 8a34b2070384812a6fe17e06c766f9c5d3ede8da..6fe6989a7be1524ce77f1fc54bffdcb41a1711f9 100644
--- a/src/main/java/org/olat/admin/user/imp/ImportStep01.java
+++ b/src/main/java/org/olat/admin/user/imp/ImportStep01.java
@@ -28,6 +28,7 @@ import java.util.List;
 
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
+import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
 import org.olat.core.gui.components.form.flexible.impl.Form;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.CSSIconFlexiCellRenderer;
@@ -51,26 +52,22 @@ import org.olat.user.UserManager;
 import org.olat.user.propertyhandlers.UserPropertyHandler;
 
 class ImportStep01 extends BasicStep {
+	private static final String usageIdentifyer = UserImportController.class.getCanonicalName();
 
-	boolean canCreateOLATPassword;
-	boolean newUsers;
-	static final String usageIdentifyer = UserImportController.class.getCanonicalName();
+	private boolean newUsers;
+	private boolean canCreateOLATPassword;
 
 	public ImportStep01(UserRequest ureq, boolean canCreateOLATPassword, boolean newUsers) {
 		super(ureq);
-		this.canCreateOLATPassword = canCreateOLATPassword;
 		this.newUsers = newUsers;
+		this.canCreateOLATPassword = canCreateOLATPassword;
 		setI18nTitleAndDescr("step1.description", "step1.short.description");
-		setNextStep(new ImportStep02(ureq)); //fxdiff: 101 have another step for group addition
+		setNextStep(new ImportStep02(ureq));
 	}
 
 	@Override
 	public PrevNextFinishConfig getInitialPrevNextFinishConfig() {
-		if (newUsers) {
-			return new PrevNextFinishConfig(true, true, true);
-		} else {
-			return new PrevNextFinishConfig(true, false, false);
-		}
+		return new PrevNextFinishConfig(true, true, true);
 	}
 
 	@Override
@@ -80,9 +77,9 @@ class ImportStep01 extends BasicStep {
 	}
 
 	private final class ImportStepForm01 extends StepFormBasicController {
-		private List<TransientIdentity> newIdents;
-		private List<Identity> idents;
+
 		private FormLayoutContainer textContainer;
+		private MultipleSelectionElement updatePasswordEl;
 		private List<UserPropertyHandler> userPropertyHandlers;
 
 		public ImportStepForm01(UserRequest ureq, WindowControl control, Form rootForm, StepsRunContext runContext) {
@@ -96,23 +93,31 @@ class ImportStep01 extends BasicStep {
 
 		@Override
 		protected void doDispose() {
-		// TODO Auto-generated method stub
+			//
 		}
 
 		@Override
 		protected void formOK(UserRequest ureq) {
+			Boolean update = Boolean.FALSE;
+			if(updatePasswordEl != null && updatePasswordEl.isAtLeastSelected(1)) {
+				update = Boolean.TRUE; 
+			}
+			addToRunContext("updatePasswords", update);
 			fireEvent(ureq, StepsEvent.ACTIVATE_NEXT);
 		}
 
-		@SuppressWarnings("unchecked")
 		@Override
 		protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 			FormLayoutContainer formLayoutVertical = FormLayoutContainer.createVerticalFormLayout("vertical", getTranslator());
 			formLayout.add(formLayoutVertical);
 
-			idents = (List<Identity>) getFromRunContext("idents");
-			newIdents = (List<TransientIdentity>) getFromRunContext("newIdents");
-			textContainer = FormLayoutContainer.createCustomFormLayout("step1", getTranslator(), this.velocity_root + "/step1.html");
+			@SuppressWarnings("unchecked")
+			List<Identity> idents = (List<Identity>) getFromRunContext("idents");
+			@SuppressWarnings("unchecked")
+			List<UpdateIdentity> updateIdents = (List<UpdateIdentity>) getFromRunContext("updateIdents");
+			@SuppressWarnings("unchecked")
+			List<TransientIdentity> newIdents = (List<TransientIdentity>) getFromRunContext("newIdents");
+			textContainer = FormLayoutContainer.createCustomFormLayout("step1", getTranslator(), velocity_root + "/step1.html");
 			formLayoutVertical.add(textContainer);
 
 			int cntall = idents.size();
@@ -121,6 +126,12 @@ class ImportStep01 extends BasicStep {
 			textContainer.contextPut("newusers", newUsers);
 			String overview = getTranslator().translate("import.confirm", new String[] { "" + cntall, "" + cntNew, "" + cntOld });
 			textContainer.contextPut("overview", overview);
+			textContainer.contextPut("updateusers", updateIdents.isEmpty());
+			if(!updateIdents.isEmpty() && canCreateOLATPassword) {
+				String[] theValues = new String[]{ translate("update.password") };
+				updatePasswordEl = uifactory
+						.addCheckboxesHorizontal("update.password", textContainer, new String[]{"on"}, theValues, null);
+			}
 
 			FlexiTableColumnModel tableColumnModel = FlexiTableDataModelFactory.createFlexiTableColumnModel();
 			int colPos = 0;
@@ -191,5 +202,4 @@ class UserNewOldCustomFlexiCellRenderer extends CSSIconFlexiCellRenderer {
 		}
 		return translator.translate("error");
 	}
-
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep02.java b/src/main/java/org/olat/admin/user/imp/ImportStep02.java
index 48863d223282cf46b0151f04c6ad49f8cb5c9e96..e975a912262342d5dffef5ad40db9ab04556287c 100644
--- a/src/main/java/org/olat/admin/user/imp/ImportStep02.java
+++ b/src/main/java/org/olat/admin/user/imp/ImportStep02.java
@@ -74,5 +74,4 @@ public class ImportStep02 extends BasicStep {
 		StepFormController stepI = new GroupSearchController(ureq, windowControl, form, stepsRunContext);
 		return stepI;
 	}
-
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/user/imp/ImportStep03SendMail.java b/src/main/java/org/olat/admin/user/imp/ImportStep03SendMail.java
index 9c57666e082c99018923b8eec392951268b1e3a8..935998548ea72c2ccc46bad5b5d9724339da437a 100644
--- a/src/main/java/org/olat/admin/user/imp/ImportStep03SendMail.java
+++ b/src/main/java/org/olat/admin/user/imp/ImportStep03SendMail.java
@@ -60,5 +60,4 @@ public class ImportStep03SendMail extends BasicStep {
 		StepFormController stepI = new SendMailConfirmationController(ureq, windowControl, form, stepsRunContext);
 		return stepI;
 	}
-
 }
diff --git a/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java b/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java
new file mode 100644
index 0000000000000000000000000000000000000000..be9a8503f3b1d9de2c4a663f5b41954756189aee
--- /dev/null
+++ b/src/main/java/org/olat/admin/user/imp/UpdateIdentity.java
@@ -0,0 +1,47 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.admin.user.imp;
+
+import org.olat.core.id.Identity;
+
+/**
+ * 
+ * Initial date: 20.12.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class UpdateIdentity {
+	
+	private final Identity identity;
+	private final String password;
+	
+	public UpdateIdentity(Identity identity, String password) {
+		this.identity = identity;
+		this.password = password;
+	}
+	
+	public String getPassword() {
+		return password;
+	}
+
+	public Identity getIdentity() {
+		return identity;
+	}
+}
diff --git a/src/main/java/org/olat/admin/user/imp/UserImportController.java b/src/main/java/org/olat/admin/user/imp/UserImportController.java
index cd06ab1ed161993ba29d55764f2d4808b7ff997d..95d72b72be7304bb78ab30b3fbd274d87a13d124 100644
--- a/src/main/java/org/olat/admin/user/imp/UserImportController.java
+++ b/src/main/java/org/olat/admin/user/imp/UserImportController.java
@@ -32,6 +32,7 @@ import java.util.List;
 import java.util.Set;
 
 import org.olat.basesecurity.AuthHelper;
+import org.olat.basesecurity.Authentication;
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DBFactory;
@@ -54,6 +55,7 @@ import org.olat.core.util.StringHelper;
 import org.olat.core.util.mail.MailPackage;
 import org.olat.group.BusinessGroupService;
 import org.olat.group.model.BusinessGroupMembershipChange;
+import org.olat.login.auth.OLATAuthManager;
 import org.olat.user.UserManager;
 import org.olat.user.propertyhandlers.UserPropertyHandler;
 
@@ -76,7 +78,9 @@ public class UserImportController extends BasicController {
 	private StepsMainRunController importStepsController;
 	
 	private final BaseSecurity securityManager;
+	private final OLATAuthManager olatAuthManager;
 	private final BusinessGroupService businessGroupService;
+	private final UserManager um ;
 
 	/**
 	 * @param ureq
@@ -86,7 +90,9 @@ public class UserImportController extends BasicController {
 	 */
 	public UserImportController(UserRequest ureq, WindowControl wControl, boolean canCreateOLATPassword) {
 		super(ureq, wControl);
+		um = UserManager.getInstance();
 		securityManager = CoreSpringFactory.getImpl(BaseSecurity.class);
+		olatAuthManager = CoreSpringFactory.getImpl(OLATAuthManager.class);
 		businessGroupService = CoreSpringFactory.getImpl(BusinessGroupService.class);
 		this.canCreateOLATPassword = canCreateOLATPassword;
 		mainVC = createVelocityContainer("importindex");
@@ -127,7 +133,7 @@ public class UserImportController extends BasicController {
 		}
 
 		// Create transient user without firstName,lastName, email
-		UserManager um = UserManager.getInstance();
+		
 		User newUser = um.createUser(null, null, null);
 
 		List<UserPropertyHandler> userProperties = userPropertyHandlers;
@@ -143,6 +149,19 @@ public class UserImportController extends BasicController {
 		Identity ident = AuthHelper.createAndPersistIdentityAndUserWithUserGroup(login, pwd, newUser);
 		return ident;
 	}
+	
+	private Identity doUpdateIdentity(UpdateIdentity singleUser, Boolean updatePassword) {
+		String password = singleUser.getPassword();
+		Identity identity = singleUser.getIdentity();
+		um.updateUserFromIdentity(identity);
+		if(StringHelper.containsNonWhitespace(password) && updatePassword != null && updatePassword.booleanValue()) {
+			Authentication auth = securityManager.findAuthentication(identity, "OLAT");
+			if(auth != null) {
+				olatAuthManager.changePassword(getIdentity(), identity, password);
+			}
+		}
+		return singleUser.getIdentity();
+	}
 
 	/**
 	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
@@ -155,8 +174,8 @@ public class UserImportController extends BasicController {
 	protected void event(UserRequest ureq, Component source, Event event) {
 		if (source == startLink){
 		// use fallback translator for user property translation
-		setTranslator(UserManager.getInstance().getPropertyHandlerTranslator(getTranslator()));
-		userPropertyHandlers = UserManager.getInstance().getUserPropertyHandlersFor(usageIdentifyer, true);
+		setTranslator(um.getPropertyHandlerTranslator(getTranslator()));
+		userPropertyHandlers = um.getUserPropertyHandlersFor(usageIdentifyer, true);
 		
 		Step start = new ImportStep00(ureq, canCreateOLATPassword);
 		// callback executed in case wizard is finished.
@@ -172,6 +191,13 @@ public class UserImportController extends BasicController {
 						for (TransientIdentity newIdent:newIdents) {
 							doCreateAndPersistIdentity(newIdent);
 						}
+						
+						Boolean updatePasswords = (Boolean)runContext.get("updatePasswords");
+						@SuppressWarnings("unchecked")
+						List<UpdateIdentity> updateIdents = (List<UpdateIdentity>) runContext.get("updateIdents");
+						for (UpdateIdentity updateIdent:updateIdents) {
+							doUpdateIdentity(updateIdent, updatePasswords);
+						}
 
 						@SuppressWarnings("unchecked")
 						List<Long> ownGroups = (List<Long>) runContext.get("ownerGroups");
diff --git a/src/main/java/org/olat/admin/user/imp/_content/step1.html b/src/main/java/org/olat/admin/user/imp/_content/step1.html
index bbd446a3b62eaf709ab22eab118639c4817b5267..8903c067c303a6b5836e2612e6026e32bb38fda9 100644
--- a/src/main/java/org/olat/admin/user/imp/_content/step1.html
+++ b/src/main/java/org/olat/admin/user/imp/_content/step1.html
@@ -3,4 +3,8 @@
 	$overview
 #else 
 	$r.translate("step1.nonewusers")
+#end
+
+#if($r.visible("update.password"))
+		<br/><br/>$r.render("update.password")
 #end
\ No newline at end of file
diff --git a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties
index 67141bc89cb3608cd3580df1f5e8447cda382eae..884230ca776dc0358ab4811d9a9e957ba3dc5977 100644
--- a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_de.properties
@@ -47,3 +47,4 @@ table.user.lang=Sprache
 table.user.login=Benutzername
 table.user.pwd=Passwort
 title=Import von Benutzern
+update.password=Passw\u00F6rter \u00E4ndern f\u00FCr existierende Benutzer
diff --git a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties
index 08f2e91dc5c085aee9ca5f8204cf20aa4223628d..1f58eeecc05699212615041a7483025f98c71698 100644
--- a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_en.properties
@@ -47,3 +47,4 @@ table.user.lang=Language
 table.user.login=User name
 table.user.pwd=Password
 title=User import
+update.password=Update passwords of current users
diff --git a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties
index 96cc5b7c5f1e7806a33ee309ef8bc3570b2890b7..9de09bf493b8b8ca9b5ca5a1a11cf2ef06ef6ed2 100644
--- a/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/admin/user/imp/_i18n/LocalStrings_fr.properties
@@ -48,3 +48,4 @@ table.user.lang=Langue
 table.user.login=Nom d'utilisateur
 table.user.pwd=Mot de passe
 title=Importation des utilisateurs
+update.password=Changer les mots-de-passe de utilisateurs existants