diff --git a/src/main/java/org/olat/user/restapi/UserWebService.java b/src/main/java/org/olat/user/restapi/UserWebService.java
index 574d1f24244f5fbbe180071d6b8c985dfde8eb16..41049eed1cddbfede5ba3ac60cb56c3c97273d56 100644
--- a/src/main/java/org/olat/user/restapi/UserWebService.java
+++ b/src/main/java/org/olat/user/restapi/UserWebService.java
@@ -549,13 +549,12 @@ public class UserWebService {
 	 * @response.representation.200.doc The portrait as image
 	 * @response.representation.404.doc The identity or the portrait not found
 	 * @param identityKey The identity key of the user being searched
-	 * @param request The REST request
 	 * @return The image
 	 */
 	@HEAD
 	@Path("{identityKey}/portrait")
 	@Produces({"image/jpeg","image/jpg",MediaType.APPLICATION_OCTET_STREAM})
-	public Response getPortraitHead(@PathParam("identityKey") Long identityKey, @Context Request request) {
+	public Response getPortraitHead(@PathParam("identityKey") Long identityKey) {
 		try {
 			IdentityShort identity = BaseSecurityManager.getInstance().loadIdentityShortByKey(identityKey);
 			if(identity == null) {
@@ -796,6 +795,18 @@ public class UserWebService {
 			String translation = translator.translate(error.getErrorKey(), error.getArgs());
 			errors.add(new ErrorVO(pack, error.getErrorKey(), translation));
 			return false;
+		} else if((userPropertyHandler.getName().equals(UserConstants.INSTITUTIONALEMAIL) || userPropertyHandler.getName().equals(UserConstants.EMAIL))
+				&& StringHelper.containsNonWhitespace(value)) {
+			
+			List<Identity> identities = UserManager.getInstance().findIdentitiesByEmail(Collections.singletonList(value));
+			if((user == null && identities.size() > 0)
+					||  identities.size() > 1
+					|| (user != null && identities.size() == 1 && !user.equals(identities.get(0).getUser()))) {
+				String pack = userPropertyHandler.getClass().getPackage().getName();
+				Translator translator = new PackageTranslator(pack, locale);
+				String translation = translator.translate("form.name." + userPropertyHandler.getName() + ".error.exists");
+				errors.add(new ErrorVO("org.olat.user.propertyhandlers:new.form.name." + userPropertyHandler.getName() + ".exists", translation));
+			}
 		}
 		
 		return true;
diff --git a/src/test/java/org/olat/restapi/UserMgmtTest.java b/src/test/java/org/olat/restapi/UserMgmtTest.java
index 774df231122764bf1e3d730ecee67f3f55182f29..40d51ba42e744daad88c11544512395e0e4707d0 100644
--- a/src/test/java/org/olat/restapi/UserMgmtTest.java
+++ b/src/test/java/org/olat/restapi/UserMgmtTest.java
@@ -589,7 +589,7 @@ public class UserMgmtTest extends OlatJerseyTestCase {
 
 		URI request = UriBuilder.fromUri(getContextURI()).path("users").build();
 		HttpPut method = conn.createPut(request, MediaType.APPLICATION_JSON, true);
-    conn.addJsonEntity(method, vo);
+		conn.addJsonEntity(method, vo);
 		method.addHeader("Accept-Language", "en");
 		
 		HttpResponse response = conn.execute(method);
@@ -643,13 +643,69 @@ public class UserMgmtTest extends OlatJerseyTestCase {
 		conn.shutdown();
 	}
 	
+	/**
+	 * Test if we can create two users with the same email addresses.
+	 */
+	@Test
+	public void testCreateUser_same_email() throws IOException, URISyntaxException {
+		RestConnection conn = new RestConnection();
+		assertTrue(conn.login("administrator", "openolat"));
+
+		String email = UUID.randomUUID() + "@frentix.com";
+		
+		UserVO vo = new UserVO();
+		String username = UUID.randomUUID().toString();
+		vo.setLogin(username);
+		vo.setFirstName("John");
+		vo.setLastName("Smith");
+		vo.setEmail(email);
+		vo.putProperty("gender", "male");//male or female
+
+		URI request = UriBuilder.fromUri(getContextURI()).path("users").build();
+		HttpPut method = conn.createPut(request, MediaType.APPLICATION_JSON, true);
+		conn.addJsonEntity(method, vo);
+		method.addHeader("Accept-Language", "en");
+		
+		HttpResponse response = conn.execute(method);
+		assertTrue(response.getStatusLine().getStatusCode() == 200 || response.getStatusLine().getStatusCode() == 201);
+		UserVO savedVo = conn.parse(response, UserVO.class);
+		Identity savedIdent = BaseSecurityManager.getInstance().findIdentityByName(username);
+
+		assertNotNull(savedVo);
+		assertNotNull(savedIdent);
+		assertEquals(savedVo.getKey(), savedIdent.getKey());
+		
+		//second 
+		UserVO vo2 = new UserVO();
+		vo2.setLogin(UUID.randomUUID().toString());
+		vo2.setFirstName("Eva");
+		vo2.setLastName("Smith");
+		vo2.setEmail(email);
+		vo2.putProperty("gender", "female");
+
+		URI request2 = UriBuilder.fromUri(getContextURI()).path("users").build();
+		HttpPut method2 = conn.createPut(request2, MediaType.APPLICATION_JSON, true);
+		conn.addJsonEntity(method2, vo2);
+		method2.addHeader("Accept-Language", "en");
+		
+		HttpResponse response2 = conn.execute(method2);
+		int  statusCode2 = response2.getStatusLine().getStatusCode();
+		Assert.assertEquals(406, statusCode2);
+		String errorMessage = EntityUtils.toString(response2.getEntity());
+		Assert.assertNotNull(errorMessage);
+
+		conn.shutdown();
+	}
+	
 	@Test
 	public void testCreateUserWithValidationError() throws IOException, URISyntaxException {
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login("administrator", "openolat"));
 		
+		String login = "rest-809-" + UUID.randomUUID();
+		
 		UserVO vo = new UserVO();
-		vo.setLogin("rest-809");
+		vo.setLogin(login);
 		vo.setFirstName("John");
 		vo.setLastName("Smith");
 		vo.setEmail("");
@@ -672,14 +728,171 @@ public class UserMgmtTest extends OlatJerseyTestCase {
 		assertNotNull(errors.get(1).getCode());
 		assertNotNull(errors.get(1).getTranslation());
 		
-		Identity savedIdent = BaseSecurityManager.getInstance().findIdentityByName("rest-809");
+		Identity savedIdent = BaseSecurityManager.getInstance().findIdentityByName(login);
 		assertNull(savedIdent);
 		conn.shutdown();
 	}
 	
+	/**
+	 * Test if we can create two users with the same email addresses.
+	 */
+	@Test
+	public void testCreateAndUpdateUser() throws IOException, URISyntaxException {
+		RestConnection conn = new RestConnection();
+		assertTrue(conn.login("administrator", "openolat"));
+
+		String username = UUID.randomUUID().toString();
+		String email = UUID.randomUUID() + "@frentix.com";
+		
+		UserVO vo = new UserVO();
+		vo.setLogin(username);
+		vo.setFirstName("Terence");
+		vo.setLastName("Smith");
+		vo.setEmail(email);
+		vo.putProperty("gender", "male");//male or female
+
+		URI request = UriBuilder.fromUri(getContextURI()).path("users").build();
+		HttpPut method = conn.createPut(request, MediaType.APPLICATION_JSON, true);
+		conn.addJsonEntity(method, vo);
+		method.addHeader("Accept-Language", "en");
+		
+		HttpResponse response = conn.execute(method);
+		assertTrue(response.getStatusLine().getStatusCode() == 200 || response.getStatusLine().getStatusCode() == 201);
+		UserVO savedVo = conn.parse(response, UserVO.class);
+		Identity savedIdent = securityManager.findIdentityByName(username);
+
+		Assert.assertNotNull(savedVo);
+		Assert.assertNotNull(savedIdent);
+		Assert.assertEquals(savedVo.getKey(), savedIdent.getKey());
+		Assert.assertEquals(username, savedIdent.getName());
+		Assert.assertEquals("Terence", savedIdent.getUser().getFirstName());
+		
+		//second 
+		UserVO updateVo = new UserVO();
+		updateVo.setKey(savedVo.getKey());
+		updateVo.setLogin(username);
+		updateVo.setFirstName("Maximilien");
+		updateVo.setLastName("Smith");
+		updateVo.setEmail(email);
+		updateVo.putProperty("gender", "male");
+
+		URI updateRequest = UriBuilder.fromUri(getContextURI()).path("users").path(savedVo.getKey().toString()).build();
+		HttpPost updateMethod = conn.createPost(updateRequest, MediaType.APPLICATION_JSON);
+		conn.addJsonEntity(updateMethod, updateVo);
+		updateMethod.addHeader("Accept-Language", "en");
+		
+		HttpResponse updateResponse = conn.execute(updateMethod);
+		int  statusCode = updateResponse.getStatusLine().getStatusCode();
+		Assert.assertEquals(200, statusCode);
+		UserVO updatedVo = conn.parse(updateResponse, UserVO.class);
+		dbInstance.commitAndCloseSession();
+		Identity updatedIdent = securityManager.loadIdentityByKey(savedVo.getKey());
+		
+		Assert.assertNotNull(updatedVo);
+		Assert.assertNotNull(updatedIdent);
+		Assert.assertEquals(updatedVo.getKey(), savedIdent.getKey());
+		Assert.assertEquals(updatedVo.getKey(), updatedIdent.getKey());
+		Assert.assertEquals(username, updatedIdent.getName());
+		Assert.assertEquals("Maximilien", updatedIdent.getUser().getFirstName());
+
+		conn.shutdown();
+	}
+	
+	/**
+	 * Test if we can create two users with the same email addresses.
+	 */
+	@Test
+	public void testCreateAndUpdateUser_same_email() throws IOException, URISyntaxException {
+		RestConnection conn = new RestConnection();
+		assertTrue(conn.login("administrator", "openolat"));
+
+		String email = UUID.randomUUID() + "@frentix.com";
+		
+		UserVO vo = new UserVO();
+		String username = UUID.randomUUID().toString();
+		vo.setLogin(username);
+		vo.setFirstName("John");
+		vo.setLastName("Smith");
+		vo.setEmail(email);
+		vo.putProperty("gender", "male");//male or female
+
+		URI request = UriBuilder.fromUri(getContextURI()).path("users").build();
+		HttpPut method = conn.createPut(request, MediaType.APPLICATION_JSON, true);
+		conn.addJsonEntity(method, vo);
+		method.addHeader("Accept-Language", "en");
+		
+		HttpResponse response = conn.execute(method);
+		assertTrue(response.getStatusLine().getStatusCode() == 200 || response.getStatusLine().getStatusCode() == 201);
+		UserVO savedVo = conn.parse(response, UserVO.class);
+		Identity savedIdent = securityManager.findIdentityByName(username);
+
+		Assert.assertNotNull(savedVo);
+		Assert.assertNotNull(savedIdent);
+		Assert.assertEquals(savedVo.getKey(), savedIdent.getKey());
+		
+		//second user
+		String secondEmail = UUID.randomUUID() + "@frentix.com";
+		String secondUsername = UUID.randomUUID().toString();
+		
+		UserVO secondVo = new UserVO();
+		secondVo.setLogin(secondUsername);
+		secondVo.setFirstName("Eva");
+		secondVo.setLastName("Smith");
+		secondVo.setEmail(secondEmail);
+		secondVo.putProperty("gender", "female");
+
+		URI secondRequest = UriBuilder.fromUri(getContextURI()).path("users").build();
+		HttpPut secondMethod = conn.createPut(secondRequest, MediaType.APPLICATION_JSON, true);
+		conn.addJsonEntity(secondMethod, secondVo);
+		secondMethod.addHeader("Accept-Language", "en");
+		
+		HttpResponse secondResponse = conn.execute(secondMethod);
+		int secondStatusCode = secondResponse.getStatusLine().getStatusCode();
+		Assert.assertEquals(200, secondStatusCode);
+		UserVO secondSavedVo = conn.parse(secondResponse, UserVO.class);
+		Assert.assertNotNull(secondSavedVo);
+		
+		dbInstance.commitAndCloseSession();
+		Identity secondSavedIdent = securityManager.findIdentityByName(secondUsername);
+		Assert.assertNotNull(secondSavedIdent);
+		Assert.assertEquals(secondSavedVo.getKey(), secondSavedIdent.getKey());
+		Assert.assertEquals(secondEmail, secondSavedIdent.getUser().getEmail());
+
+		// update second with new first name and the mail of the first user
+		UserVO updateVo = new UserVO();
+		updateVo.setKey(secondSavedVo.getKey());
+		updateVo.setLogin(secondUsername);
+		updateVo.setFirstName("Caprice");
+		updateVo.setLastName("Smith");
+		updateVo.setEmail(email);
+		updateVo.putProperty("gender", "female");
+
+		URI updateRequest = UriBuilder.fromUri(getContextURI()).path("users").path(secondSavedVo.getKey().toString()).build();
+		HttpPost updateMethod = conn.createPost(updateRequest, MediaType.APPLICATION_JSON);
+		conn.addJsonEntity(updateMethod, updateVo);
+		updateMethod.addHeader("Accept-Language", "en");
+		
+		HttpResponse updateResponse = conn.execute(updateMethod);
+		int  statusCode = updateResponse.getStatusLine().getStatusCode();
+		Assert.assertEquals(406, statusCode);
+		String errorMessage = EntityUtils.toString(updateResponse.getEntity());
+		Assert.assertNotNull(errorMessage);
+		
+		// check that nothing has changed for the second user
+		dbInstance.commitAndCloseSession();
+		Identity notUpdatedIdent = securityManager.findIdentityByName(secondUsername);
+		Assert.assertNotNull(notUpdatedIdent);
+		Assert.assertEquals(secondSavedVo.getKey(), notUpdatedIdent.getKey());
+		Assert.assertEquals("Eva", notUpdatedIdent.getUser().getFirstName());
+		Assert.assertEquals("Smith", notUpdatedIdent.getUser().getLastName());
+		Assert.assertEquals(secondEmail, notUpdatedIdent.getUser().getEmail());
+
+		conn.shutdown();
+	}
+	
 	@Test
 	public void testDeleteUser() throws IOException, URISyntaxException {
-		Identity idToDelete = JunitTestHelper.createAndPersistIdentityAsUser("user-to-delete-" + UUID.randomUUID().toString());
+		Identity idToDelete = JunitTestHelper.createAndPersistIdentityAsUser("user-to-delete-" + UUID.randomUUID());
 		dbInstance.commitAndCloseSession();
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login("administrator", "openolat"));