diff --git a/src/main/java/org/olat/basesecurity/OrganisationService.java b/src/main/java/org/olat/basesecurity/OrganisationService.java
index 84835f78233dfe07af6ef9e07bc479156b43757e..539de4b661af20fcf4e45b0bfbfbf5b073c3bbb8 100644
--- a/src/main/java/org/olat/basesecurity/OrganisationService.java
+++ b/src/main/java/org/olat/basesecurity/OrganisationService.java
@@ -22,6 +22,7 @@ package org.olat.basesecurity;
 import java.util.List;
 
 import org.olat.basesecurity.model.OrganisationMember;
+import org.olat.basesecurity.model.SearchMemberParameters;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
 import org.olat.core.id.OrganisationRef;
@@ -181,7 +182,7 @@ public interface OrganisationService {
 	
 	public void setAsGuest(Identity identity);
 	
-	public List<OrganisationMember> getMembers(Organisation organisation);
+	public List<OrganisationMember> getMembers(Organisation organisation, SearchMemberParameters params);
 	
 	public List<Identity> getMembersIdentity(Organisation organisation, OrganisationRoles role);
 	
diff --git a/src/main/java/org/olat/basesecurity/SearchIdentityParams.java b/src/main/java/org/olat/basesecurity/SearchIdentityParams.java
index 2ef9791b747bd78c1abc57c5111bf3840c893511..fd0c6d6415841362c3ed6fce0e3d1c0e5073650d 100644
--- a/src/main/java/org/olat/basesecurity/SearchIdentityParams.java
+++ b/src/main/java/org/olat/basesecurity/SearchIdentityParams.java
@@ -169,7 +169,7 @@ public class SearchIdentityParams {
 	public boolean hasUserProperties() {
 		return userProperties != null && !userProperties.isEmpty();  
 	}
-	
+
 	public Map<String, String> getUserProperties() {
 		return userProperties;
 	}
diff --git a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java
index e8126fcf7dd0f0b31e460f85d83309d186c3f3c5..edf42771974740233faba7c73ad994774bc8823f 100644
--- a/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java
+++ b/src/main/java/org/olat/basesecurity/manager/IdentityPowerSearchQueriesImpl.java
@@ -297,7 +297,7 @@ public class IdentityPowerSearchQueriesImpl implements IdentityPowerSearchQuerie
 		return needsAnd;
 	}
 	
-	private boolean createUserPropertiesQueryPart(SearchIdentityParams params, StringBuilder sb) {	
+	public boolean createUserPropertiesQueryPart(SearchIdentityParams params, StringBuilder sb) {	
 		boolean needsAnd = false;
 		boolean needsUserPropertiesJoin = false;
 		
diff --git a/src/main/java/org/olat/basesecurity/manager/OrganisationDAO.java b/src/main/java/org/olat/basesecurity/manager/OrganisationDAO.java
index 9c96fa35123a8b299309871d02c3ab87eb4479b3..fcea4991fbc7164bc72291eab3ca327fe6350d0f 100644
--- a/src/main/java/org/olat/basesecurity/manager/OrganisationDAO.java
+++ b/src/main/java/org/olat/basesecurity/manager/OrganisationDAO.java
@@ -38,12 +38,14 @@ import org.olat.basesecurity.OrganisationType;
 import org.olat.basesecurity.model.OrganisationImpl;
 import org.olat.basesecurity.model.OrganisationMember;
 import org.olat.basesecurity.model.OrganisationNode;
+import org.olat.basesecurity.model.SearchMemberParameters;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.PersistenceHelper;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
 import org.olat.core.id.OrganisationRef;
 import org.olat.core.util.StringHelper;
+import org.olat.user.propertyhandlers.UserPropertyHandler;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -172,17 +174,22 @@ public class OrganisationDAO {
 				.getResultList();
 	}
 	
-	public List<OrganisationMember> getMembers(OrganisationRef organisation) {
+	public List<OrganisationMember> getMembers(OrganisationRef organisation, SearchMemberParameters params) {
 		StringBuilder sb = new StringBuilder(256);
 		sb.append("select ident, membership.role, membership.inheritanceModeString from organisation org")
 		  .append(" inner join org.group baseGroup")
 		  .append(" inner join baseGroup.members membership")
 		  .append(" inner join membership.identity ident")
+		  .append(" inner join fetch ident.user user")
 		  .append(" where org.key=:organisationKey");
-		List<Object[]> objects = dbInstance.getCurrentEntityManager()
+		createUserPropertiesQueryPart(sb, params.getSearchString(), params.getUserProperties());
+		
+		TypedQuery<Object[]> query = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), Object[].class)
-				.setParameter("organisationKey", organisation.getKey())
-				.getResultList();
+				.setParameter("organisationKey", organisation.getKey());
+		createUserPropertiesQueryParameters(query, params.getSearchString());
+		
+		List<Object[]> objects = query.getResultList();
 		List<OrganisationMember> members = new ArrayList<>(objects.size());
 		for(Object[] object:objects) {
 			Identity identity = (Identity)object[0];
@@ -197,6 +204,29 @@ public class OrganisationDAO {
 		return members;
 	}
 	
+	private void createUserPropertiesQueryPart(StringBuilder sb, String searchString, List<UserPropertyHandler> handlers) {
+		if(!StringHelper.containsNonWhitespace(searchString)) return;
+		
+		// treat login and userProperties as one element in this query
+		sb.append(" and ( ");			
+		PersistenceHelper.appendFuzzyLike(sb, "ident.name", "searchString", dbInstance.getDbVendor());
+		
+		for(UserPropertyHandler handler:handlers) {
+			if(handler.getDatabaseColumnName() != null) {
+				sb.append(" or ");
+				PersistenceHelper.appendFuzzyLike(sb, "user.".concat(handler.getName()), "searchString", dbInstance.getDbVendor());
+			}
+		}
+		sb.append(")");
+	}
+	
+	private void createUserPropertiesQueryParameters(TypedQuery<?> query, String searchString) {
+		if(!StringHelper.containsNonWhitespace(searchString)) return;
+		
+		String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(searchString);
+		query.setParameter("searchString", fuzzySearch);
+	}
+	
 	public List<Identity> getMembersIdentity(OrganisationRef organisation, String role) {
 		StringBuilder sb = new StringBuilder(256);
 		sb.append("select ident from organisation org")
diff --git a/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java b/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java
index 7dab218cab152b73d36f999b3c8b95bb56597e75..e0c928a6a9309704be9a7c09b709ab6e01d4797f 100644
--- a/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java
+++ b/src/main/java/org/olat/basesecurity/manager/OrganisationServiceImpl.java
@@ -40,6 +40,7 @@ import org.olat.basesecurity.OrganisationTypeRef;
 import org.olat.basesecurity.model.OrganisationImpl;
 import org.olat.basesecurity.model.OrganisationMember;
 import org.olat.basesecurity.model.OrganisationNode;
+import org.olat.basesecurity.model.SearchMemberParameters;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
@@ -332,8 +333,8 @@ public class OrganisationServiceImpl implements OrganisationService, Initializin
 	}
 
 	@Override
-	public List<OrganisationMember> getMembers(Organisation organisation) {
-		return organisationDao.getMembers(organisation);
+	public List<OrganisationMember> getMembers(Organisation organisation, SearchMemberParameters params) {
+		return organisationDao.getMembers(organisation, params);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/basesecurity/model/SearchMemberParameters.java b/src/main/java/org/olat/basesecurity/model/SearchMemberParameters.java
new file mode 100644
index 0000000000000000000000000000000000000000..2bf30b56beef63e4c5e45817837554c7d9253b81
--- /dev/null
+++ b/src/main/java/org/olat/basesecurity/model/SearchMemberParameters.java
@@ -0,0 +1,52 @@
+/**
+ * <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.basesecurity.model;
+
+import java.util.List;
+
+import org.olat.user.propertyhandlers.UserPropertyHandler;
+
+/**
+ * 
+ * Initial date: 17 juil. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class SearchMemberParameters {
+	
+	private String searchString;
+	private List<UserPropertyHandler> userProperties;
+	
+	public String getSearchString() {
+		return searchString;
+	}
+	
+	public void setSearchString(String searchString) {
+		this.searchString = searchString;
+	}
+
+	public List<UserPropertyHandler> getUserProperties() {
+		return userProperties;
+	}
+
+	public void setUserProperties(List<UserPropertyHandler> userProperties) {
+		this.userProperties = userProperties;
+	}
+}
diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumService.java b/src/main/java/org/olat/modules/curriculum/CurriculumService.java
index 3989456b645e7d23649337ed3628d8bf9e30004e..d68466e0dbc58f8db09bbff5cf13b3e9ab1bdc4e 100644
--- a/src/main/java/org/olat/modules/curriculum/CurriculumService.java
+++ b/src/main/java/org/olat/modules/curriculum/CurriculumService.java
@@ -34,6 +34,7 @@ import org.olat.modules.curriculum.model.CurriculumElementRepositoryEntryViews;
 import org.olat.modules.curriculum.model.CurriculumInfos;
 import org.olat.modules.curriculum.model.CurriculumMember;
 import org.olat.modules.curriculum.model.CurriculumSearchParameters;
+import org.olat.modules.curriculum.model.SearchMemberParameters;
 import org.olat.modules.taxonomy.TaxonomyLevel;
 import org.olat.modules.taxonomy.TaxonomyLevelRef;
 import org.olat.repository.RepositoryEntry;
@@ -80,7 +81,7 @@ public interface CurriculumService {
 	 * @param curriculum The curriculum
 	 * @return A list of memberships
 	 */
-	public List<CurriculumMember> getMembers(CurriculumRef curriculum);
+	public List<CurriculumMember> getMembers(CurriculumRef curriculum, SearchMemberParameters params);
 	
 	/**
 	 * Get the list of members of the specified curriculum with the specified
@@ -268,7 +269,7 @@ public interface CurriculumService {
 	 * @param element The curriculum element
 	 * @return The list of memberships
 	 */
-	public List<CurriculumMember> getMembers(CurriculumElement element);
+	public List<CurriculumMember> getMembers(CurriculumElement element, SearchMemberParameters params);
 	
 	/**
 	 * The list of members of the specified curriculum element with the specified role.
diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java
index e9fe1dc6abb7b46d97f1bb05abc034204da331ac..1ec02a3dfde3d4956710a495a877e1c7072baab6 100644
--- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java
+++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumDAO.java
@@ -41,7 +41,6 @@ import org.olat.modules.curriculum.CurriculumRef;
 import org.olat.modules.curriculum.CurriculumRoles;
 import org.olat.modules.curriculum.model.CurriculumImpl;
 import org.olat.modules.curriculum.model.CurriculumInfos;
-import org.olat.modules.curriculum.model.CurriculumMember;
 import org.olat.modules.curriculum.model.CurriculumSearchParameters;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -245,27 +244,6 @@ public class CurriculumDAO {
 		return dbInstance.getCurrentEntityManager().merge(curriculum);
 	}
 	
-	public List<CurriculumMember> getMembers(CurriculumRef curriculum) {
-		StringBuilder sb = new StringBuilder(256);
-		sb.append("select ident, membership.role from curriculum cur")
-		  .append(" inner join cur.group baseGroup")
-		  .append(" inner join baseGroup.members membership")
-		  .append(" inner join membership.identity ident")
-		  .append(" inner join fetch ident.user identUser")
-		  .append(" where cur.key=:curriculumKey");
-		List<Object[]> rawObjects = dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), Object[].class)
-				.setParameter("curriculumKey", curriculum.getKey())
-				.getResultList();
-		List<CurriculumMember> members = new ArrayList<>(rawObjects.size());
-		for(Object[] object:rawObjects) {
-			Identity identity = (Identity)object[0];
-			String role = (String)object[1];
-			members.add(new CurriculumMember(identity, role));
-		}
-		return members;
-	}
-	
 	public List<Identity> getMembersIdentity(CurriculumRef curriculum, String role) {
 		StringBuilder sb = new StringBuilder(256);
 		sb.append("select ident from curriculum cur")
diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java
index 06b96bbe2d30645c716f856b56fa7d431dd04035..fd045b92ccfa24550b1919f7c95f64908ddb25b9 100644
--- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java
+++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java
@@ -32,7 +32,6 @@ import java.util.stream.Collectors;
 import javax.persistence.TypedQuery;
 
 import org.olat.basesecurity.GroupMembership;
-import org.olat.basesecurity.GroupMembershipInheritance;
 import org.olat.basesecurity.manager.GroupDAO;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.commons.persistence.PersistenceHelper;
@@ -48,7 +47,6 @@ import org.olat.modules.curriculum.CurriculumRoles;
 import org.olat.modules.curriculum.model.CurriculumElementImpl;
 import org.olat.modules.curriculum.model.CurriculumElementInfos;
 import org.olat.modules.curriculum.model.CurriculumElementMembershipImpl;
-import org.olat.modules.curriculum.model.CurriculumMember;
 import org.olat.repository.RepositoryEntryRef;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -291,32 +289,6 @@ public class CurriculumElementDAO {
 				.getResultList();
 	}
 	
-	public List<CurriculumMember> getMembers(CurriculumElementRef element) {
-		StringBuilder sb = new StringBuilder(256);
-		sb.append("select ident, membership.role, membership.inheritanceModeString from curriculumelement el")
-		  .append(" inner join el.group baseGroup")
-		  .append(" inner join baseGroup.members membership")
-		  .append(" inner join membership.identity ident")
-		  .append(" inner join fetch ident.user identUser")
-		  .append(" where el.key=:elementKey");
-		List<Object[]> objects = dbInstance.getCurrentEntityManager()
-				.createQuery(sb.toString(), Object[].class)
-				.setParameter("elementKey", element.getKey())
-				.getResultList();
-		List<CurriculumMember> members = new ArrayList<>(objects.size());
-		for(Object[] object:objects) {
-			Identity identity = (Identity)object[0];
-			String role = (String)object[1];
-			String inheritanceModeString = (String)object[2];
-			GroupMembershipInheritance inheritanceMode = GroupMembershipInheritance.none;
-			if(StringHelper.containsNonWhitespace(inheritanceModeString)) {
-				inheritanceMode = GroupMembershipInheritance.valueOf(inheritanceModeString);
-			}
-			members.add(new CurriculumMember(identity, role, inheritanceMode));
-		}
-		return members;
-	}
-	
 	public List<Identity> getMembersIdentity(CurriculumElementRef element, String role) {
 		StringBuilder sb = new StringBuilder(256);
 		sb.append("select ident from curriculumelement el")
diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumMemberQueries.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumMemberQueries.java
new file mode 100644
index 0000000000000000000000000000000000000000..949600910af388a9d46634e2ca46e3fd3b0fc842
--- /dev/null
+++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumMemberQueries.java
@@ -0,0 +1,131 @@
+/**
+ * <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.modules.curriculum.manager;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.TypedQuery;
+
+import org.olat.basesecurity.GroupMembershipInheritance;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.commons.persistence.PersistenceHelper;
+import org.olat.core.id.Identity;
+import org.olat.core.util.StringHelper;
+import org.olat.modules.curriculum.CurriculumElementRef;
+import org.olat.modules.curriculum.CurriculumRef;
+import org.olat.modules.curriculum.model.CurriculumMember;
+import org.olat.modules.curriculum.model.SearchMemberParameters;
+import org.olat.user.propertyhandlers.UserPropertyHandler;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * A service to query the members of curriculums and curriculum elements.
+ * 
+ * Initial date: 17 juil. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+@Service
+public class CurriculumMemberQueries {
+	
+	@Autowired
+	private DB dbInstance;
+	
+	public List<CurriculumMember> getMembers(CurriculumRef curriculum, SearchMemberParameters params) {
+		StringBuilder sb = new StringBuilder(256);
+		sb.append("select ident, membership.role from curriculum cur")
+		  .append(" inner join cur.group baseGroup")
+		  .append(" inner join baseGroup.members membership")
+		  .append(" inner join membership.identity ident")
+		  .append(" inner join fetch ident.user user")
+		  .append(" where cur.key=:curriculumKey");
+		createUserPropertiesQueryPart(sb, params.getSearchString(), params.getUserProperties());
+		
+		TypedQuery<Object[]> query = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), Object[].class)
+				.setParameter("curriculumKey", curriculum.getKey());
+		createUserPropertiesQueryParameters(query, params.getSearchString());
+
+		List<Object[]> rawObjects = query.getResultList();
+		List<CurriculumMember> members = new ArrayList<>(rawObjects.size());
+		for(Object[] object:rawObjects) {
+			Identity identity = (Identity)object[0];
+			String role = (String)object[1];
+			members.add(new CurriculumMember(identity, role));
+		}
+		return members;
+	}
+	
+	public List<CurriculumMember> getMembers(CurriculumElementRef element, SearchMemberParameters params) {
+		StringBuilder sb = new StringBuilder(256);
+		sb.append("select ident, membership.role, membership.inheritanceModeString from curriculumelement el")
+		  .append(" inner join el.group baseGroup")
+		  .append(" inner join baseGroup.members membership")
+		  .append(" inner join membership.identity ident")
+		  .append(" inner join fetch ident.user user")
+		  .append(" where el.key=:elementKey");
+		createUserPropertiesQueryPart(sb, params.getSearchString(), params.getUserProperties());
+		
+		TypedQuery<Object[]> query = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), Object[].class)
+				.setParameter("elementKey", element.getKey());
+		createUserPropertiesQueryParameters(query, params.getSearchString());
+					
+		List<Object[]> objects = query.getResultList();
+		List<CurriculumMember> members = new ArrayList<>(objects.size());
+		for(Object[] object:objects) {
+			Identity identity = (Identity)object[0];
+			String role = (String)object[1];
+			String inheritanceModeString = (String)object[2];
+			GroupMembershipInheritance inheritanceMode = GroupMembershipInheritance.none;
+			if(StringHelper.containsNonWhitespace(inheritanceModeString)) {
+				inheritanceMode = GroupMembershipInheritance.valueOf(inheritanceModeString);
+			}
+			members.add(new CurriculumMember(identity, role, inheritanceMode));
+		}
+		return members;
+	}
+	
+	private void createUserPropertiesQueryPart(StringBuilder sb, String searchString, List<UserPropertyHandler> handlers) {
+		if(!StringHelper.containsNonWhitespace(searchString)) return;
+		
+		// treat login and userProperties as one element in this query
+		sb.append(" and ( ");			
+		PersistenceHelper.appendFuzzyLike(sb, "ident.name", "searchString", dbInstance.getDbVendor());
+		
+		for(UserPropertyHandler handler:handlers) {
+			if(handler.getDatabaseColumnName() != null) {
+				sb.append(" or ");
+				PersistenceHelper.appendFuzzyLike(sb, "user.".concat(handler.getName()), "searchString", dbInstance.getDbVendor());
+			}
+		}
+		sb.append(")");
+	}
+	
+	private void createUserPropertiesQueryParameters(TypedQuery<?> query, String searchString) {
+		if(!StringHelper.containsNonWhitespace(searchString)) return;
+		
+		String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(searchString);
+		query.setParameter("searchString", fuzzySearch);
+	}
+
+}
diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java
index 38064a758b98c4d37c59a8dbace6229f387dbb92..1175dfe8d376011881a48bb16b9ded632b044b9b 100644
--- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java
+++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java
@@ -55,6 +55,7 @@ import org.olat.modules.curriculum.model.CurriculumElementRepositoryEntryViews;
 import org.olat.modules.curriculum.model.CurriculumInfos;
 import org.olat.modules.curriculum.model.CurriculumMember;
 import org.olat.modules.curriculum.model.CurriculumSearchParameters;
+import org.olat.modules.curriculum.model.SearchMemberParameters;
 import org.olat.modules.taxonomy.TaxonomyLevel;
 import org.olat.modules.taxonomy.TaxonomyLevelRef;
 import org.olat.repository.RepositoryEntry;
@@ -83,6 +84,8 @@ public class CurriculumServiceImpl implements CurriculumService {
 	@Autowired
 	private CurriculumDAO curriculumDao;
 	@Autowired
+	private CurriculumMemberQueries memberQueries;
+	@Autowired
 	private RepositoryEntryMyCourseQueries myCourseQueries;
 	@Autowired
 	private RepositoryEntryDAO repositoryEntryDao;
@@ -115,8 +118,8 @@ public class CurriculumServiceImpl implements CurriculumService {
 	}
 	
 	@Override
-	public List<CurriculumMember> getMembers(CurriculumRef curriculum) {
-		return curriculumDao.getMembers(curriculum);
+	public List<CurriculumMember> getMembers(CurriculumRef curriculum, SearchMemberParameters params) {
+		return memberQueries.getMembers(curriculum, params);
 	}
 
 	@Override
@@ -187,7 +190,7 @@ public class CurriculumServiceImpl implements CurriculumService {
 	public CurriculumElementType cloneCurriculumElementType(CurriculumElementTypeRef elementType) {
 		CurriculumElementType clonedType = curriculumElementTypeDao.cloneCurriculumElementType(elementType);
 		List<CurriculumElementTypeToType> allowSubTypesToTypes = curriculumElementTypeToTypeDao.getAllowedSubTypes(elementType);
-		if(allowSubTypesToTypes.size() > 0) {
+		if(!allowSubTypesToTypes.isEmpty()) {
 			for(CurriculumElementTypeToType allowSubTypeToType:allowSubTypesToTypes) {
 				curriculumElementTypeToTypeDao.addAllowedSubType(clonedType, allowSubTypeToType.getAllowedSubType());
 			}
@@ -278,8 +281,8 @@ public class CurriculumServiceImpl implements CurriculumService {
 	}
 
 	@Override
-	public List<CurriculumMember> getMembers(CurriculumElement element) {
-		return curriculumElementDao.getMembers(element);
+	public List<CurriculumMember> getMembers(CurriculumElement element, SearchMemberParameters params) {
+		return memberQueries.getMembers(element, params);
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/modules/curriculum/model/SearchMemberParameters.java b/src/main/java/org/olat/modules/curriculum/model/SearchMemberParameters.java
new file mode 100644
index 0000000000000000000000000000000000000000..bbfb0a0c4d63725f5a805de28a924e002c236c2b
--- /dev/null
+++ b/src/main/java/org/olat/modules/curriculum/model/SearchMemberParameters.java
@@ -0,0 +1,54 @@
+/**
+ * <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.modules.curriculum.model;
+
+import java.util.List;
+
+import org.olat.user.propertyhandlers.UserPropertyHandler;
+
+/**
+ * 
+ * Initial date: 17 juil. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class SearchMemberParameters {
+	
+	private String searchString;
+	private List<UserPropertyHandler> userProperties;
+	
+	public String getSearchString() {
+		return searchString;
+	}
+	
+	public void setSearchString(String searchString) {
+		this.searchString = searchString;
+	}
+
+	public List<UserPropertyHandler> getUserProperties() {
+		return userProperties;
+	}
+
+	public void setUserProperties(List<UserPropertyHandler> userProperties) {
+		this.userProperties = userProperties;
+	}
+	
+	
+}
diff --git a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java
index 490fce5263e6599ab1ab071505f3aeaf7d4443fe..888f69eaf211c62485a22dc44eb374391a3ec9e2 100644
--- a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java
+++ b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java
@@ -55,6 +55,7 @@ import org.olat.modules.curriculum.manager.CurriculumElementToTaxonomyLevelDAO;
 import org.olat.modules.curriculum.model.CurriculumElementRefImpl;
 import org.olat.modules.curriculum.model.CurriculumElementTypeRefImpl;
 import org.olat.modules.curriculum.model.CurriculumMember;
+import org.olat.modules.curriculum.model.SearchMemberParameters;
 import org.olat.modules.taxonomy.TaxonomyLevel;
 import org.olat.modules.taxonomy.TaxonomyService;
 import org.olat.modules.taxonomy.model.TaxonomyLevelRefImpl;
@@ -505,7 +506,8 @@ public class CurriculumElementsWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
-		List<CurriculumMember> members = curriculumService.getMembers(curriculumElement);
+		SearchMemberParameters params = new SearchMemberParameters();
+		List<CurriculumMember> members = curriculumService.getMembers(curriculumElement, params);
 		List<CurriculumElementMemberVO> voList = new ArrayList<>(members.size());
 		for(CurriculumMember member:members) {
 			voList.add(CurriculumElementMemberVO.valueOf(member));
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java
index 7454020299cc681dcd4dec6979d15fd4d0a484ee..1f7c09d0b77c8d7a16837120545c8ee7d0bf4278 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumElementUserManagementController.java
@@ -40,6 +40,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableSearchEvent;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -55,6 +56,7 @@ import org.olat.modules.curriculum.CurriculumRoles;
 import org.olat.modules.curriculum.CurriculumSecurityCallback;
 import org.olat.modules.curriculum.CurriculumService;
 import org.olat.modules.curriculum.model.CurriculumMember;
+import org.olat.modules.curriculum.model.SearchMemberParameters;
 import org.olat.modules.curriculum.ui.CurriculumUserManagementTableModel.CurriculumMemberCols;
 import org.olat.modules.curriculum.ui.event.RoleEvent;
 import org.olat.user.UserManager;
@@ -141,15 +143,19 @@ public class CurriculumElementUserManagementController extends FormBasicControll
 		
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CurriculumMemberCols.role, new RoleFlexiCellRenderer(getTranslator())));
 
-		tableModel = new CurriculumUserManagementTableModel(columnsModel); 
+		tableModel = new CurriculumUserManagementTableModel(columnsModel, getLocale()); 
 		tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, 20, false, getTranslator(), formLayout);
 		tableEl.setExportEnabled(true);
 		tableEl.setSelectAllEnable(true);
 		tableEl.setMultiSelect(true);
+		tableEl.setSearchEnabled(true);
 	}
 	
 	private void loadModel(boolean reset) {
-		List<CurriculumMember> members = curriculumService.getMembers(curriculumElement);
+		SearchMemberParameters params = new SearchMemberParameters();
+		params.setSearchString(tableEl.getQuickSearchString());
+		params.setUserProperties(userPropertyHandlers);
+		List<CurriculumMember> members = curriculumService.getMembers(curriculumElement, params);
 		List<CurriculumMemberRow> rows = new ArrayList<>(members.size());
 		for(CurriculumMember member:members) {
 			rows.add(new CurriculumMemberRow(member, userPropertyHandlers, getLocale()));
@@ -222,6 +228,10 @@ public class CurriculumElementUserManagementController extends FormBasicControll
 			doRolleCallout(ureq);
 		} else if(removeMembershipButton == source) {
 			doConfirmRemoveAllMemberships(ureq);
+		} else if(tableEl == source) {
+			if(event instanceof FlexiTableSearchEvent) {
+				loadModel(true);
+			}
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java
index e67876398473787e48a37201ecd42a806736390f..b8048898829696c13ce6c97f3cb75b2a4dec3500 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementController.java
@@ -40,6 +40,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableSearchEvent;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -55,6 +56,7 @@ import org.olat.modules.curriculum.CurriculumRoles;
 import org.olat.modules.curriculum.CurriculumSecurityCallback;
 import org.olat.modules.curriculum.CurriculumService;
 import org.olat.modules.curriculum.model.CurriculumMember;
+import org.olat.modules.curriculum.model.SearchMemberParameters;
 import org.olat.modules.curriculum.ui.CurriculumUserManagementTableModel.CurriculumMemberCols;
 import org.olat.modules.curriculum.ui.event.RoleEvent;
 import org.olat.user.UserManager;
@@ -140,15 +142,19 @@ public class CurriculumUserManagementController extends FormBasicController {
 		
 		columnsModel.addFlexiColumnModel(new DefaultFlexiColumnModel(CurriculumMemberCols.role, new RoleFlexiCellRenderer(getTranslator())));
 
-		tableModel = new CurriculumUserManagementTableModel(columnsModel); 
+		tableModel = new CurriculumUserManagementTableModel(columnsModel, getLocale()); 
 		tableEl = uifactory.addTableElement(getWindowControl(), "table", tableModel, 20, false, getTranslator(), formLayout);
 		tableEl.setExportEnabled(true);
 		tableEl.setSelectAllEnable(true);
 		tableEl.setMultiSelect(true);
+		tableEl.setSearchEnabled(true);
 	}
 	
 	private void loadModel(boolean reset) {
-		List<CurriculumMember> members = curriculumService.getMembers(curriculum);
+		SearchMemberParameters params = new SearchMemberParameters();
+		params.setSearchString(tableEl.getQuickSearchString());
+		params.setUserProperties(userPropertyHandlers);
+		List<CurriculumMember> members = curriculumService.getMembers(curriculum, params);
 		List<CurriculumMemberRow> rows = new ArrayList<>(members.size());
 		for(CurriculumMember member:members) {
 			rows.add(new CurriculumMemberRow(member, userPropertyHandlers, getLocale()));
@@ -221,6 +227,10 @@ public class CurriculumUserManagementController extends FormBasicController {
 			doRolleCallout(ureq);
 		} else if(removeMembershipButton == source) {
 			doConfirmRemoveAllMemberships(ureq);
+		} else if(tableEl == source) {
+			if(event instanceof FlexiTableSearchEvent) {
+				loadModel(true);
+			}
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementTableModel.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementTableModel.java
index ab56a59a36880e1cfb4b83b250a368d7885bf3f1..5a1d73db8f017ecd0b285cc85c274f0072519ddf 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementTableModel.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementTableModel.java
@@ -19,6 +19,8 @@
  */
 package org.olat.modules.curriculum.ui;
 
+import java.util.Locale;
+
 import org.olat.core.commons.persistence.SortKey;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiSortableColumnDef;
@@ -34,13 +36,19 @@ import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFl
 public class CurriculumUserManagementTableModel extends DefaultFlexiTableDataModel<CurriculumMemberRow>
 implements SortableFlexiTableDataModel<CurriculumMemberRow> {
 	
-	public CurriculumUserManagementTableModel(FlexiTableColumnModel columnModel) {
+	private final Locale locale;
+	
+	public CurriculumUserManagementTableModel(FlexiTableColumnModel columnModel, Locale locale) {
 		super(columnModel);
+		this.locale = locale;
 	}
 
 	@Override
-	public void sort(SortKey sortKey) {
-		//
+	public void sort(SortKey orderBy) {
+		if(orderBy != null) {
+			CurriculumUserManagementTableSortDelegate sort = new CurriculumUserManagementTableSortDelegate(orderBy, this, locale);
+			super.setObjects(sort.sort());
+		}
 	}
 
 	@Override
@@ -65,7 +73,7 @@ implements SortableFlexiTableDataModel<CurriculumMemberRow> {
 
 	@Override
 	public DefaultFlexiTableDataModel<CurriculumMemberRow> createCopyWithEmptyList() {
-		return new CurriculumUserManagementTableModel(getTableColumnModel());
+		return new CurriculumUserManagementTableModel(getTableColumnModel(), locale);
 	}
 	
 	public enum CurriculumMemberCols implements FlexiSortableColumnDef {
diff --git a/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementTableSortDelegate.java b/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementTableSortDelegate.java
new file mode 100644
index 0000000000000000000000000000000000000000..b5b4c5859d82ceeb4d539ca53b24f7d48ff3c36b
--- /dev/null
+++ b/src/main/java/org/olat/modules/curriculum/ui/CurriculumUserManagementTableSortDelegate.java
@@ -0,0 +1,38 @@
+/**
+ * <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.modules.curriculum.ui;
+
+import java.util.Locale;
+
+import org.olat.core.commons.persistence.SortKey;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.SortableFlexiTableModelDelegate;
+
+/**
+ * 
+ * Initial date: 17 juil. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class CurriculumUserManagementTableSortDelegate extends SortableFlexiTableModelDelegate<CurriculumMemberRow> {
+
+	public CurriculumUserManagementTableSortDelegate(SortKey orderBy, CurriculumUserManagementTableModel model, Locale locale) {
+		super(orderBy, model, locale);
+	}
+}
diff --git a/src/main/java/org/olat/user/ui/organisation/OrganisationUserManagementController.java b/src/main/java/org/olat/user/ui/organisation/OrganisationUserManagementController.java
index b7a2ee02416c68a945fc421ce5c7c40290581876..11cbaff05bda2cba39177d82c0ac975faba5f930 100644
--- a/src/main/java/org/olat/user/ui/organisation/OrganisationUserManagementController.java
+++ b/src/main/java/org/olat/user/ui/organisation/OrganisationUserManagementController.java
@@ -34,6 +34,7 @@ import org.olat.basesecurity.events.MultiIdentityChosenEvent;
 import org.olat.basesecurity.events.SingleIdentityChosenEvent;
 import org.olat.basesecurity.model.IdentityRefImpl;
 import org.olat.basesecurity.model.OrganisationMember;
+import org.olat.basesecurity.model.SearchMemberParameters;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.form.flexible.FormItem;
 import org.olat.core.gui.components.form.flexible.FormItemContainer;
@@ -44,6 +45,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel;
 import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableDataModelFactory;
+import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableSearchEvent;
 import org.olat.core.gui.components.link.Link;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
@@ -143,11 +145,15 @@ public class OrganisationUserManagementController extends FormBasicController {
 		tableEl.setExportEnabled(true);
 		tableEl.setSelectAllEnable(true);
 		tableEl.setMultiSelect(true);
+		tableEl.setSearchEnabled(true);
 		tableEl.setAndLoadPersistedPreferences(ureq, "organisation-user-list");
 	}
 	
 	private void loadModel(boolean reset) {
-		List<OrganisationMember> members = organisationService.getMembers(organisation);
+		SearchMemberParameters params = new SearchMemberParameters();
+		params.setSearchString(tableEl.getQuickSearchString());
+		params.setUserProperties(userPropertyHandlers);
+		List<OrganisationMember> members = organisationService.getMembers(organisation, params);
 		List<OrganisationUserRow> rows = new ArrayList<>(members.size());
 		for(OrganisationMember member:members) {
 			rows.add(new OrganisationUserRow(member, userPropertyHandlers, getLocale()));
@@ -220,6 +226,10 @@ public class OrganisationUserManagementController extends FormBasicController {
 			doRolleCallout(ureq);
 		} else if(removeMembershipButton == source) {
 			doConfirmRemoveAllMemberships(ureq);
+		} else if(tableEl == source) {
+			if(event instanceof FlexiTableSearchEvent) {
+				loadModel(true);
+			}
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
diff --git a/src/main/java/org/olat/user/ui/organisation/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/user/ui/organisation/_i18n/LocalStrings_de.properties
index 3dc42ef57f3355b7ef1e94b04ded374ac5d2125b..168f4cd95dde1328cc07704934f7bac7ae0773bc 100644
--- a/src/main/java/org/olat/user/ui/organisation/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/user/ui/organisation/_i18n/LocalStrings_de.properties
@@ -13,7 +13,6 @@ edit.type=Organisationtyp editieren
 institution.to.org=Ressourceverwaltung mit Institutionname zu Organisationen migrieren
 institution.to.org.explain=Erkl\u00E4rung
 institution.to.org.label=Migration
-role.learnresourcemanager=Lernressourcenverwalter
 migrate=Migrieren
 move.organisation=Organisation schieben
 organisation.admin.enabled=Organisationen einschalten
@@ -34,7 +33,6 @@ role.author=$org.olat.admin.user\:role.author
 role.coach=$org.olat.admin.user\:role.coach
 role.curriculummanager=$org.olat.admin.user\:role.curriculummanager
 role.rolesmanager=$org.olat.admin.user\:role.rolesmanager
-role.curriculummanager=$org.olat.admin.user\:role.curriculummanager
 role.groupmanager=$org.olat.admin.user\:role.groupmanager
 role.guest=$org.olat.admin.user\:role.guest
 role.principal=$org.olat.admin.user\:role.principal
@@ -43,6 +41,7 @@ role.owner=$org.olat.admin.user\:role.owner
 role.coach=$org.olat.admin.user\:role.coach
 role.participant=$org.olat.admin.user\:role.participant
 role.poolmanager=$org.olat.admin.user\:role.poolmanager
+role.learnresourcemanager=$org.olat.admin.user\:role.learnresourcemanager
 role.user=$org.olat.admin.user\:role.user
 role.usermanager=$org.olat.admin.user\:role.usermanager
 table.header.displayName=Name
diff --git a/src/test/java/org/olat/basesecurity/manager/OrganisationDAOTest.java b/src/test/java/org/olat/basesecurity/manager/OrganisationDAOTest.java
index 3a3ca2739d531a8483d0701d259890b884d30335..9536fdda3a7db42b00911bdcb0b936c52cae24de 100644
--- a/src/test/java/org/olat/basesecurity/manager/OrganisationDAOTest.java
+++ b/src/test/java/org/olat/basesecurity/manager/OrganisationDAOTest.java
@@ -34,6 +34,7 @@ import org.olat.basesecurity.model.OrganisationImpl;
 import org.olat.basesecurity.model.OrganisationMember;
 import org.olat.basesecurity.model.OrganisationNode;
 import org.olat.basesecurity.model.OrganisationRefImpl;
+import org.olat.basesecurity.model.SearchMemberParameters;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
@@ -144,7 +145,8 @@ public class OrganisationDAOTest extends OlatTestCase {
 		organisationService.addMember(organisation, member, OrganisationRoles.user);
 		dbInstance.commitAndCloseSession();
 		
-		List<OrganisationMember> members = organisationDao.getMembers(organisation);
+		SearchMemberParameters params = new SearchMemberParameters();
+		List<OrganisationMember> members = organisationDao.getMembers(organisation, params);
 		Assert.assertNotNull(members);
 		Assert.assertEquals(1, members.size());
 		OrganisationMember organisationMember = members.get(0);
diff --git a/src/test/java/org/olat/core/commons/services/text/TextServiceTest.java b/src/test/java/org/olat/core/commons/services/text/TextServiceTest.java
index 5817480152c415d5af0e4a71aafba8f3ab154f59..7913b67c1b0c632340ee6ef9876ccc5df3e29991 100644
--- a/src/test/java/org/olat/core/commons/services/text/TextServiceTest.java
+++ b/src/test/java/org/olat/core/commons/services/text/TextServiceTest.java
@@ -1,3 +1,22 @@
+/**
+ * <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.core.commons.services.text;
 
 import java.util.Locale;
diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java
index 877bc364ec16bbdcf2ad8b02801c318734053bc1..4ef4029a296bf8a285e897688f8e97cf3f6355b0 100644
--- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java
+++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumDAOTest.java
@@ -36,7 +36,6 @@ import org.olat.modules.curriculum.CurriculumRoles;
 import org.olat.modules.curriculum.CurriculumService;
 import org.olat.modules.curriculum.model.CurriculumImpl;
 import org.olat.modules.curriculum.model.CurriculumInfos;
-import org.olat.modules.curriculum.model.CurriculumMember;
 import org.olat.modules.curriculum.model.CurriculumSearchParameters;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
@@ -202,23 +201,6 @@ public class CurriculumDAOTest extends OlatTestCase {
 		Assert.assertTrue(userCurriculums.isEmpty());
 	}
 	
-	@Test
-	public void getMembers() {
-		// add a curriculum manager
-		Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-manager-1");
-		Curriculum curriculum = curriculumService.createCurriculum("CUR-1", "Curriculum 1", "Short desc.", null);
-		dbInstance.commitAndCloseSession();
-		curriculumService.addMember(curriculum, manager, CurriculumRoles.curriculummanager);
-		dbInstance.commitAndCloseSession();
-		
-		// get memberships
-		List<CurriculumMember> members = curriculumDao.getMembers(curriculum);
-		Assert.assertNotNull(members);
-		Assert.assertEquals(1, members.size());
-		Assert.assertEquals(CurriculumRoles.curriculummanager.name(), members.get(0).getRole());
-		Assert.assertEquals(manager, members.get(0).getIdentity());	
-	}
-	
 	@Test
 	public void getMembersIdentity() {
 		// add a curriculum manager
diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java
index 45e6cb2dc150b15e52e4704297a80354f07a5fa4..53682d642268fcf9153eb9999c681423cab328ff 100644
--- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java
+++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java
@@ -36,7 +36,6 @@ import org.olat.modules.curriculum.CurriculumRoles;
 import org.olat.modules.curriculum.CurriculumService;
 import org.olat.modules.curriculum.model.CurriculumElementImpl;
 import org.olat.modules.curriculum.model.CurriculumElementInfos;
-import org.olat.modules.curriculum.model.CurriculumMember;
 import org.olat.repository.RepositoryEntry;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
@@ -316,22 +315,6 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		Assert.assertTrue(descendants1_1.contains(element1_1_2));
 	}
 	
-	@Test
-	public void getMembers() {
-		Identity supervisor = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-supervisor-1");
-		Curriculum curriculum = curriculumService.createCurriculum("cur-for-el-4", "Curriculum for element", "Curriculum", null);
-		CurriculumElement element = curriculumService.createCurriculumElement("Element-4", "4. Element", null, null, null, null, curriculum);
-		curriculumService.addMember(element, supervisor, CurriculumRoles.curriculummanager);
-		dbInstance.commitAndCloseSession();
-		
-		List<CurriculumMember> members = curriculumElementDao.getMembers(element);
-		Assert.assertNotNull(members);
-		Assert.assertEquals(1, members.size());
-		CurriculumMember member = members.get(0);
-		Assert.assertEquals(supervisor, member.getIdentity());
-		Assert.assertEquals(CurriculumRoles.curriculummanager.name(), member.getRole());
-	}
-	
 	@Test
 	public void getMembersIdentity() {
 		Identity supervisor = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-supervisor-1");
diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumMemberQueriesTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumMemberQueriesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..380cae7fcf103c05d1152ceaf1a8cb06189f44ba
--- /dev/null
+++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumMemberQueriesTest.java
@@ -0,0 +1,87 @@
+/**
+ * <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.modules.curriculum.manager;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.olat.core.commons.persistence.DB;
+import org.olat.core.id.Identity;
+import org.olat.modules.curriculum.Curriculum;
+import org.olat.modules.curriculum.CurriculumElement;
+import org.olat.modules.curriculum.CurriculumRoles;
+import org.olat.modules.curriculum.CurriculumService;
+import org.olat.modules.curriculum.model.CurriculumMember;
+import org.olat.modules.curriculum.model.SearchMemberParameters;
+import org.olat.test.JunitTestHelper;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * 
+ * Initial date: 17 juil. 2018<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class CurriculumMemberQueriesTest {
+	
+	@Autowired
+	private DB dbInstance;
+	@Autowired
+	private CurriculumService curriculumService;
+	@Autowired
+	private CurriculumMemberQueries memberQueries;
+	
+	@Test
+	public void getCurriculumMembers() {
+		// add a curriculum manager
+		Identity manager = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-manager-1");
+		Curriculum curriculum = curriculumService.createCurriculum("CUR-1", "Curriculum 1", "Short desc.", null);
+		dbInstance.commitAndCloseSession();
+		curriculumService.addMember(curriculum, manager, CurriculumRoles.curriculummanager);
+		dbInstance.commitAndCloseSession();
+		
+		// get memberships
+		SearchMemberParameters params = new SearchMemberParameters();
+		List<CurriculumMember> members = memberQueries.getMembers(curriculum, params);
+		Assert.assertNotNull(members);
+		Assert.assertEquals(1, members.size());
+		Assert.assertEquals(CurriculumRoles.curriculummanager.name(), members.get(0).getRole());
+		Assert.assertEquals(manager, members.get(0).getIdentity());	
+	}
+	
+	@Test
+	public void getCurriculumElementMembers() {
+		Identity supervisor = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-supervisor-1");
+		Curriculum curriculum = curriculumService.createCurriculum("cur-for-el-4", "Curriculum for element", "Curriculum", null);
+		CurriculumElement element = curriculumService.createCurriculumElement("Element-4", "4. Element", null, null, null, null, curriculum);
+		curriculumService.addMember(element, supervisor, CurriculumRoles.curriculummanager);
+		dbInstance.commitAndCloseSession();
+		
+		SearchMemberParameters params = new SearchMemberParameters();
+		List<CurriculumMember> members = memberQueries.getMembers(element, params);
+		Assert.assertNotNull(members);
+		Assert.assertEquals(1, members.size());
+		CurriculumMember member = members.get(0);
+		Assert.assertEquals(supervisor, member.getIdentity());
+		Assert.assertEquals(CurriculumRoles.curriculummanager.name(), member.getRole());
+	}
+
+}
diff --git a/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java b/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java
index c3ee603a2db129b78938d63f1c6d91fec044d679..ea536289bcc169194a5aa02f1c4f0dc417308022 100644
--- a/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java
+++ b/src/test/java/org/olat/restapi/CurriculumElementsWebServiceTest.java
@@ -57,6 +57,7 @@ import org.olat.modules.curriculum.CurriculumService;
 import org.olat.modules.curriculum.manager.CurriculumElementToTaxonomyLevelDAO;
 import org.olat.modules.curriculum.model.CurriculumElementRefImpl;
 import org.olat.modules.curriculum.model.CurriculumMember;
+import org.olat.modules.curriculum.model.SearchMemberParameters;
 import org.olat.modules.curriculum.restapi.CurriculumElementMemberVO;
 import org.olat.modules.curriculum.restapi.CurriculumElementVO;
 import org.olat.modules.taxonomy.Taxonomy;
@@ -831,8 +832,9 @@ public class CurriculumElementsWebServiceTest extends OlatJerseyTestCase {
 		HttpResponse response = conn.execute(method);
 		Assert.assertEquals(200, response.getStatusLine().getStatusCode());
 		EntityUtils.consume(response.getEntity());
-		
-		List<CurriculumMember> members = curriculumService.getMembers(element);
+
+		SearchMemberParameters params = new SearchMemberParameters();
+		List<CurriculumMember> members = curriculumService.getMembers(element, params);
 		Assert.assertNotNull(members);
 		Assert.assertEquals(1, members.size());
 		Assert.assertEquals(member, members.get(0).getIdentity());
@@ -980,8 +982,9 @@ public class CurriculumElementsWebServiceTest extends OlatJerseyTestCase {
 		HttpResponse response = conn.execute(method);
 		Assert.assertEquals(200, response.getStatusLine().getStatusCode());
 		EntityUtils.consume(response.getEntity());
-		
-		List<CurriculumMember> members = curriculumService.getMembers(element);
+
+		SearchMemberParameters params = new SearchMemberParameters();
+		List<CurriculumMember> members = curriculumService.getMembers(element, params);
 		Assert.assertNotNull(members);
 		Assert.assertTrue(members.isEmpty());
 	}
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index 55e2f400f941a4b5527074b7efc2215751a2c9f7..f8ca81a48d59df946f1ba77fd02ddd8402f2b76c 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -183,6 +183,7 @@ import org.junit.runners.Suite;
 	org.olat.modules.coach.manager.CoachingDAOTest.class,
 	org.olat.modules.coach.CoachingLargeTest.class,
 	org.olat.modules.curriculum.manager.CurriculumDAOTest.class,
+	org.olat.modules.curriculum.manager.CurriculumMemberQueriesTest.class,
 	org.olat.modules.curriculum.manager.CurriculumElementDAOTest.class,
 	org.olat.modules.curriculum.manager.CurriculumElementTypeDAOTest.class,
 	org.olat.modules.curriculum.manager.CurriculumRepositoryEntryRelationDAOTest.class,