diff --git a/src/main/java/org/olat/repository/RepositoryService.java b/src/main/java/org/olat/repository/RepositoryService.java
index 4526021c59f143fe5b0efa68a86eace03eda370c..dcfbff34f375327ebc20e4c503a82ceb9ebeab13 100644
--- a/src/main/java/org/olat/repository/RepositoryService.java
+++ b/src/main/java/org/olat/repository/RepositoryService.java
@@ -73,6 +73,8 @@ public interface RepositoryService {
 	public List<RepositoryEntry> loadRepositoryEntriesByExternalId(String externalId);
 
 	public List<RepositoryEntry> loadRepositoryEntriesByExternalRef(String externalRef);
+	
+	public List<RepositoryEntry> loadRepositoryEntriesLikeExternalRef(String externalRef);
 
 	public List<RepositoryEntry> loadByResourceKeys(Collection<Long> keys);
 
diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java b/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java
index 92dbbe8584871d587e0979bce62088f74aeda052..8230bb1b806251c1f33dc34eae02dc59128b8043 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryEntryDAO.java
@@ -152,6 +152,18 @@ public class RepositoryEntryDAO {
 				.getResultList();
 	}
 	
+	public List<RepositoryEntry> loadRepositoryEntriesLikeExternalRef(String externalRef) {
+		if (externalRef == null) return Collections.emptyList();
+		
+		String query = "select v from repositoryentry as v where v.externalRef like (:externalRef)";
+		
+		String externalRefParamater = new StringBuilder("%").append(externalRef).append("%").toString();
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(query, RepositoryEntry.class)
+				.setParameter("externalRef", externalRefParamater)
+				.getResultList();
+	}
+	
 	public List<RepositoryEntry> loadRepositoryEntries(int firstResult, int maxResult) {
 		String query = "select v from repositoryentry as v order by v.key asc";
 		return dbInstance.getCurrentEntityManager()
diff --git a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
index e92ceb53cdf0746e6c4f2cb6320dd9c1ba24a518..ab815fc27cfc6573d98f7bd1d5c0f758e19c5e2d 100644
--- a/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
+++ b/src/main/java/org/olat/repository/manager/RepositoryServiceImpl.java
@@ -29,6 +29,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.logging.log4j.Logger;
 import org.olat.basesecurity.Group;
 import org.olat.basesecurity.GroupRoles;
 import org.olat.basesecurity.IdentityRef;
@@ -45,7 +46,6 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Organisation;
 import org.olat.core.id.OrganisationRef;
 import org.olat.core.id.Roles;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.logging.activity.LearningResourceLoggingAction;
 import org.olat.core.logging.activity.OlatResourceableType;
@@ -376,6 +376,11 @@ public class RepositoryServiceImpl implements RepositoryService, OrganisationDat
 		return repositoryEntryDAO.loadRepositoryEntriesByExternalRef(externalRef);
 	}
 
+	@Override
+	public List<RepositoryEntry> loadRepositoryEntriesLikeExternalRef(String externalRef) {
+		return repositoryEntryDAO.loadRepositoryEntriesLikeExternalRef(externalRef);
+	}
+
 	@Override
 	public List<RepositoryEntry> loadRepositoryEntries(int firstResult, int maxResult) {
 		return repositoryEntryDAO.loadRepositoryEntries(firstResult, maxResult);
diff --git a/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java b/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java
index 320ec96b0b566af8afbc9b23696a693f8a1cf1f1..2d37b1ac9d133a513ee9ba926e0102924eb77367 100644
--- a/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java
+++ b/src/main/java/org/olat/resource/accesscontrol/AccessControlModule.java
@@ -66,6 +66,7 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO
 	private static final String PAYPAL_ENABLED = "method.paypal.enabled";
 	private static final String PAYPAL_CHECKOUT_ENABLED = "method.paypal.checkout.enabled";
 	private static final String AUTO_ENABLED = "method.auto.enabled";
+	private static final String AUTO_EXTERNAL_REF_DELIMITER = "method.auto.external.ref.delimiter";
 
 	@Value("${resource.accesscontrol.enabled:true}")
 	private boolean enabled;
@@ -75,6 +76,8 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO
 	private boolean freeEnabled;
 	@Value("${method.auto.enabled:false}")
 	private boolean autoEnabled;
+	@Value("${method.auto.externalRef.delimiter}")
+	private String autoExternalRefDelimiter;
 	@Value("${method.token.enabled:true}")
 	private boolean tokenEnabled;
 	@Value("${method.paypal.enabled:false}")
@@ -143,6 +146,11 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO
 		if(StringHelper.containsNonWhitespace(autoEnabledObj)) {
 			autoEnabled = "true".equals(autoEnabledObj);
 		}
+		
+		String autoExternalRefDelimiterObj = getStringPropertyValue(AUTO_EXTERNAL_REF_DELIMITER, true);
+		if(StringHelper.containsNonWhitespace(autoExternalRefDelimiterObj)) {
+			autoExternalRefDelimiter = autoExternalRefDelimiterObj;
+		}
 
 		String homeEnabledObj = getStringPropertyValue(AC_HOME_ENABLED, true);
 		if(StringHelper.containsNonWhitespace(homeEnabledObj)) {
@@ -220,6 +228,15 @@ public class AccessControlModule extends AbstractSpringModule implements ConfigO
 		acMethodManager.enableAutoMethods(autoEnabled);
 	}
 
+	public String getAutoExternalRefDelimiter() {
+		return autoExternalRefDelimiter;
+	}
+
+	public void setAutoExternalRefDelimiter(String autoExternalRefDelimiter) {
+		this.autoExternalRefDelimiter = autoExternalRefDelimiter;
+		setStringProperty(AUTO_EXTERNAL_REF_DELIMITER, autoExternalRefDelimiter, true);
+	}
+
 	public boolean isPaypalEnabled() {
 		return paypalEnabled;
 	}
diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAO.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAO.java
index d8549833abd9b81c0e9e20371fde811df7d12c3a..749357b4be7f42b1105e481d914709d6a070c7a0 100644
--- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAO.java
+++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAO.java
@@ -23,7 +23,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.persistence.TypedQuery;
 
@@ -92,33 +92,38 @@ class AdvanceOrderDAO {
 		return advanceOrder;
 	}
 
-	Collection<AdvanceOrder> loadPendingAdvanceOrders(Map<IdentifierKey, String> identifiers) {
+	Collection<AdvanceOrder> loadPendingAdvanceOrders(Collection<IdentifierKeyValue> identifiers) {
 		if (identifiers == null || identifiers.isEmpty()) return new ArrayList<>();
 
 		StringBuilder sb = new StringBuilder();
 		sb.append("select advanceOrder from advanceOrder advanceOrder")
 		  .append(" where advanceOrder.status=:status")
 		  .append("   and ((1 = 2)");
-
-		for (Map.Entry<IdentifierKey, String> entry : identifiers.entrySet()) {
-			if (entry.getKey() != null && StringHelper.containsNonWhitespace(entry.getValue())) {
-				sb.append(" or (advanceOrder.identifierKey=:").append(entry.getKey());
-				sb.append(" and advanceOrder.identifierValue=:").append(entry.getKey()).append(entry.getKey()).append(")");
-			}
+		
+		List<IdentifierKeyValue> identifierList = identifiers.stream()
+				.collect(Collectors.toList());
+		for (int i = 0; i < identifierList.size(); i++) {
+			IdentifierKeyValue keyValue = identifierList.get(i);
+			if (keyValue.getKey() != null && StringHelper.containsNonWhitespace(keyValue.getValue())) {
+				sb.append(" or (advanceOrder.identifierKey=:").append("key" + i);
+				sb.append("       and advanceOrder.identifierValue=:").append("value" + i);
+				sb.append("    )");
+			}	
 		}
 		sb.append(")");
-
+		
 		TypedQuery<AdvanceOrder> query = dbInstance.getCurrentEntityManager()
 				.createQuery(sb.toString(), AdvanceOrder.class)
 				.setParameter("status", Status.PENDING);
-
-		for (Map.Entry<IdentifierKey, String> entry : identifiers.entrySet()) {
-			if (entry.getKey() != null && StringHelper.containsNonWhitespace(entry.getValue())) {
-				query.setParameter(entry.getKey().toString(), entry.getKey());
-				query.setParameter(entry.getKey().toString().concat(entry.getKey().toString()), entry.getValue());
+		
+		for (int i = 0; i < identifierList.size(); i++) {
+			IdentifierKeyValue keyValue = identifierList.get(i);
+			if (keyValue.getKey() != null && StringHelper.containsNonWhitespace(keyValue.getValue())) {
+				query.setParameter("key" + i, keyValue.getKey());
+				query.setParameter("value" + i, keyValue.getValue());
 			}
 		}
-
+		
 		return query.getResultList();
 	}
 
@@ -155,5 +160,54 @@ class AdvanceOrderDAO {
 
 		return advanceOrder;
 	}
+	
+	static final class IdentifierKeyValue {
+		
+		private final IdentifierKey key;
+		private final String value;
+		
+		public IdentifierKeyValue(IdentifierKey key, String value) {
+			super();
+			this.key = key;
+			this.value = value;
+		}
+
+		public IdentifierKey getKey() {
+			return key;
+		}
+
+		public String getValue() {
+			return value;
+		}
+		
+		@Override
+		public int hashCode() {
+			final int prime = 31;
+			int result = 1;
+			result = prime * result + ((key == null) ? 0 : key.hashCode());
+			result = prime * result + ((value == null) ? 0 : value.hashCode());
+			return result;
+		}
+		
+		@Override
+		public boolean equals(Object obj) {
+			if (this == obj)
+				return true;
+			if (obj == null)
+				return false;
+			if (getClass() != obj.getClass())
+				return false;
+			IdentifierKeyValue other = (IdentifierKeyValue) obj;
+			if (key != other.key)
+				return false;
+			if (value == null) {
+				if (other.value != null)
+					return false;
+			} else if (!value.equals(other.value))
+				return false;
+			return true;
+		}
+		
+	}
 
 }
diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AutoAccessManagerImpl.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AutoAccessManagerImpl.java
index 98c15ea96a1b16bcb923d2dd91db97a4c8ee5fa3..03a3d2bbd911a69d75fc84af3fe4e677bce638ae 100644
--- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AutoAccessManagerImpl.java
+++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/AutoAccessManagerImpl.java
@@ -21,9 +21,9 @@ package org.olat.resource.accesscontrol.provider.auto.manager;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.EnumMap;
+import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
+import java.util.Set;
 
 import org.apache.logging.log4j.Logger;
 import org.olat.basesecurity.GroupRoles;
@@ -42,6 +42,7 @@ import org.olat.resource.accesscontrol.provider.auto.AdvanceOrder.Status;
 import org.olat.resource.accesscontrol.provider.auto.AdvanceOrderInput;
 import org.olat.resource.accesscontrol.provider.auto.AutoAccessManager;
 import org.olat.resource.accesscontrol.provider.auto.IdentifierKey;
+import org.olat.resource.accesscontrol.provider.auto.manager.AdvanceOrderDAO.IdentifierKeyValue;
 import org.olat.resource.accesscontrol.provider.auto.model.AutoAccessMethod;
 import org.olat.user.UserDataDeletable;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -108,13 +109,16 @@ public class AutoAccessManagerImpl implements AutoAccessManager, UserDataDeletab
 	@Override
 	public Collection<AdvanceOrder> loadPendingAdvanceOrders(RepositoryEntry entry) {
 		if (entry == null) return new ArrayList<>();
-
-		Map<IdentifierKey, String> searchValues = new EnumMap<>(IdentifierKey.class);
+		
+		Set<IdentifierKeyValue> searchValues = new HashSet<>();
 		for (IdentifierKey key: IdentifierKey.values()) {
-			String value = identifierHandler.getRepositoryEntryValue(key, entry);
-			searchValues.put(key, value);
+			Set<String> values = identifierHandler.getRepositoryEntryValue(key, entry);
+			for (String value : values) {
+				IdentifierKeyValue identifierKeyValue = new IdentifierKeyValue(key, value);
+				searchValues.add(identifierKeyValue);
+			}
 		}
-
+		
 		return advanceOrderDAO.loadPendingAdvanceOrders(searchValues);
 	}
 
diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandler.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandler.java
index 8f5202ecb204a5c429a40f279de478b06068aba5..67d7acf12380603fef0ec3c25d2a45f12e5c68d7 100644
--- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandler.java
+++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandler.java
@@ -20,8 +20,11 @@
 package org.olat.resource.accesscontrol.provider.auto.manager;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
+import org.olat.core.util.StringHelper;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryService;
 import org.olat.resource.accesscontrol.provider.auto.IdentifierKey;
@@ -59,8 +62,13 @@ class ExternalIdHandler implements IdentifierKeyHandler {
 	}
 
 	@Override
-	public String getRepositoryEntryValue(RepositoryEntry entry) {
-		return entry.getExternalId();
+	public Set<String> getRepositoryEntryValue(RepositoryEntry entry) {
+		Set<String> values = new HashSet<>();
+		String externalId = entry.getExternalId();
+		if (StringHelper.containsNonWhitespace(externalId)) {
+			values.add(externalId);
+		}
+		return values;
 	}
 
 }
diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandler.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandler.java
index 77d09bbba247cd1cb179952f768a2fe3962f98de..c372ec0f69e0b03048fc207bc04de3fa27740128 100644
--- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandler.java
+++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandler.java
@@ -20,10 +20,14 @@
 package org.olat.resource.accesscontrol.provider.auto.manager;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
+import org.olat.core.util.StringHelper;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryService;
+import org.olat.resource.accesscontrol.AccessControlModule;
 import org.olat.resource.accesscontrol.provider.auto.IdentifierKey;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -37,6 +41,8 @@ import org.springframework.stereotype.Component;
 @Component
 class ExternalRefHandler implements IdentifierKeyHandler {
 
+	@Autowired
+	private AccessControlModule accessControlModule;
 	@Autowired
 	private RepositoryService repositoryService;
 
@@ -50,7 +56,12 @@ class ExternalRefHandler implements IdentifierKeyHandler {
 		List<RepositoryEntry> entries = new ArrayList<>();
 
 		try {
-			entries = repositoryService.loadRepositoryEntriesByExternalRef(value);
+			String delimiter = accessControlModule.getAutoExternalRefDelimiter();
+			if (StringHelper.containsNonWhitespace(delimiter)) {
+				entries = getRepositoryEntries(value, delimiter);
+			} else {
+				entries = repositoryService.loadRepositoryEntriesByExternalRef(value);
+			}
 		} catch (Exception e) {
 			// nothing to add
 		}
@@ -58,9 +69,45 @@ class ExternalRefHandler implements IdentifierKeyHandler {
 		return entries;
 	}
 
+	private List<RepositoryEntry> getRepositoryEntries(String value, String delimiter) {
+		List<RepositoryEntry> entries = repositoryService.loadRepositoryEntriesLikeExternalRef(value);
+		Set<RepositoryEntry> matchingEntries = new HashSet<>();
+		for (RepositoryEntry entry : entries) {
+			for (String externalRef : entry.getExternalRef().split(delimiter)) {
+				if (externalRef.equals(value)) {
+					matchingEntries.add(entry);
+				}
+			}
+		}
+		return new ArrayList<>(matchingEntries);
+	}
+
 	@Override
-	public String getRepositoryEntryValue(RepositoryEntry entry) {
-		return entry.getExternalRef();
+	public Set<String> getRepositoryEntryValue(RepositoryEntry entry) {
+		String delimiter = accessControlModule.getAutoExternalRefDelimiter();
+		return StringHelper.containsNonWhitespace(delimiter)
+				? getSplitedValues(entry, delimiter)
+				: getValue(entry);
+	}
+	
+	private Set<String> getValue(RepositoryEntry entry) {
+		Set<String> values = new HashSet<>();
+		String externalRef = entry.getExternalRef();
+		if (StringHelper.containsNonWhitespace(externalRef)) {
+			values.add(externalRef);
+		}
+		return values;
 	}
 
+	private Set<String> getSplitedValues(RepositoryEntry entry, String delimiter) {
+		Set<String> values = new HashSet<>();
+		String externalRef = entry.getExternalRef();
+		if (StringHelper.containsNonWhitespace(externalRef)) {
+			for (String externalRefToken : externalRef.split(delimiter)) {
+				values.add(externalRefToken);
+			}
+		}
+		return values;
+	}
+	
 }
diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierHandler.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierHandler.java
index cdd708157d95109f9a8dc81dbcfb3f28144fa4df..1e907798a5245906453747c0c2e8381c5913fff2 100644
--- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierHandler.java
+++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierHandler.java
@@ -23,6 +23,7 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import javax.annotation.PostConstruct;
@@ -76,16 +77,16 @@ class IdentifierHandler {
 			log.debug("Found more then one RepositotyEntry for " + key + "=" + value + ". Keys: " + keys);
 		}
 		return entries;
-    }
+	}
 
-    /**
-     * Takes a RepostoryEntry and returns the value for a given IdenifierKey
-     *
-     * @param key
-     * @param entry
-     * @return
-     */
-	String getRepositoryEntryValue(IdentifierKey key, RepositoryEntry entry) {
+	/**
+	* Takes a RepostoryEntry and returns the values for a given IdenifierKey
+	*
+	* @param key
+	* @param entry
+	* @return
+	*/
+	Set<String> getRepositoryEntryValue(IdentifierKey key, RepositoryEntry entry) {
 		return handlers.get(key).getRepositoryEntryValue(entry);
 	}
 
diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierKeyHandler.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierKeyHandler.java
index 6c256fdcfb77d629da71412a8e2a6a2ce4845959..a7164f4bfb1535b29e5341b26102b1e9428fd230 100644
--- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierKeyHandler.java
+++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/IdentifierKeyHandler.java
@@ -20,6 +20,7 @@
 package org.olat.resource.accesscontrol.provider.auto.manager;
 
 import java.util.List;
+import java.util.Set;
 
 import org.olat.repository.RepositoryEntry;
 import org.olat.resource.accesscontrol.provider.auto.IdentifierKey;
@@ -47,11 +48,11 @@ interface IdentifierKeyHandler {
 	public List<RepositoryEntry> find(String value);
 
 	/**
-	 * Finds the appropriate Value in the RepositoryEntry.
+	 * Finds the appropriate values in the RepositoryEntry.
 	 *
 	 * @param entry
 	 * @return
 	 */
-	public String getRepositoryEntryValue(RepositoryEntry entry);
+	public Set<String> getRepositoryEntryValue(RepositoryEntry entry);
 
 }
diff --git a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandler.java b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandler.java
index 9a0482ff67f3edb48e93f16f18aa323161fb8e49..14f694bb781d149db220e3cea647f10a9f2e3193 100644
--- a/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandler.java
+++ b/src/main/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandler.java
@@ -20,7 +20,9 @@
 package org.olat.resource.accesscontrol.provider.auto.manager;
 
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryService;
@@ -62,8 +64,11 @@ class InternalIdHandler implements IdentifierKeyHandler {
 	}
 
 	@Override
-	public String getRepositoryEntryValue(RepositoryEntry entry) {
-		return Long.toString(entry.getKey());
+	public Set<String> getRepositoryEntryValue(RepositoryEntry entry) {
+	Set<String> values = new HashSet<>();
+	String internalId = Long.toString(entry.getKey());
+	values.add(internalId);
+	return values;
 	}
 
 }
diff --git a/src/main/java/org/olat/shibboleth/manager/ShibbolethManagerImpl.java b/src/main/java/org/olat/shibboleth/manager/ShibbolethManagerImpl.java
index 96a05253c8d78954b4800ec255d7101247f1ecff..0d4402e7734edd83900cb6492a9b0bb33245134c 100644
--- a/src/main/java/org/olat/shibboleth/manager/ShibbolethManagerImpl.java
+++ b/src/main/java/org/olat/shibboleth/manager/ShibbolethManagerImpl.java
@@ -88,12 +88,12 @@ public class ShibbolethManagerImpl implements ShibbolethManager {
 
 	private void createAndBookAdvanceOrders(Identity identity, ShibbolethAttributes shibbolethAttributes) {
 		if (acModule.isAutoEnabled()) {
-			createAdvanceOr(identity, shibbolethAttributes);
+			createAdvanceOrder(identity, shibbolethAttributes);
 			autoAccessManager.grantAccessToCourse(identity);
 		}
 	}
 
-	private void createAdvanceOr(Identity identity, ShibbolethAttributes shibbolethAttributes) {
+	private void createAdvanceOrder(Identity identity, ShibbolethAttributes shibbolethAttributes) {
 		ShibbolethAdvanceOrderInput input = getShibbolethAdvanceOrderInput();
 		input.setIdentity(identity);
 		String rawValues = shibbolethAttributes.getAcRawValues();
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index 10610f39f9ebfc87e2f582b72c845c40fb601eaf..08db266263f543684c3e32f7439fd218c4ca28d3 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -1304,6 +1304,10 @@ method.auto.shib.shib=
 method.auto.shib.splitter.values=Semicolon
 method.auto.shib.splitter=
 
+# External eeference may have many values separated by this delimiter.
+# If the value is not defined, no splitting is executed.
+method.auto.externalRef.delimiter=
+
 ########################################
 # Paypal Checkout
 ########################################
diff --git a/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java b/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java
index d1902a66c8d5a91aa9afed6a9c9ba4ec5848570a..a3edc1345c21e12ac947e14ed928dbc85747ca64 100644
--- a/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java
+++ b/src/test/java/org/olat/repository/manager/RepositoryEntryDAOTest.java
@@ -358,6 +358,43 @@ public class RepositoryEntryDAOTest extends OlatTestCase {
 		Assert.assertNotNull(emptyRes);
 		Assert.assertEquals(0, emptyRes.size());
 	}
+
+	@Test
+	public void loadRepositoryEntriesLikeExternalRef() {
+		String externalRef = "myExternalRef";
+
+		// remove old test date
+		String query = "update repositoryentry as v set v.externalRef=null where v.externalRef like (:externalRef)";
+		String externalRefParamater = new StringBuilder("%").append(externalRef).append("%").toString();
+		dbInstance.getCurrentEntityManager()
+				.createQuery(query)
+				.setParameter("externalRef", externalRefParamater)
+				.executeUpdate();
+
+		// insert test data
+		Organisation defOrganisation = organisationService.getDefaultOrganisation();
+		RepositoryEntry re1 = repositoryService.create(null, "Rei Ayanami", "-", "Repository entry DAO Test 8a", "", null,
+				RepositoryEntryStatusEnum.trash, defOrganisation);
+		re1.setExternalRef(externalRef);
+		repositoryService.update(re1);
+		RepositoryEntry re2 = repositoryService.create(null, "Rei Ayanami", "-", "Repository entry DAO Test 8b", "", null,
+				RepositoryEntryStatusEnum.trash, defOrganisation);
+		re2.setExternalRef(externalRef + "123");
+		repositoryService.update(re2);
+		RepositoryEntry re3 = repositoryService.create(null, "Rei Ayanami", "-", "Repository entry DAO Test 8c", "", null,
+				RepositoryEntryStatusEnum.trash, defOrganisation);
+		re3.setExternalRef("abc" + externalRef + "123");
+		repositoryService.update(re3);
+		RepositoryEntry re4 = repositoryService.create(null, "Rei Ayanami", "-", "Repository entry DAO Test 8d", "", null,
+				RepositoryEntryStatusEnum.trash, defOrganisation);
+		re4.setExternalRef("123");
+		repositoryService.update(re4);
+		dbInstance.commitAndCloseSession();
+
+		Collection<RepositoryEntry> entries = repositoryEntryDao.loadRepositoryEntriesLikeExternalRef(externalRef);
+		Assert.assertNotNull(entries);
+		Assert.assertEquals(3, entries.size());
+	}
 	
 	@Test
 	public void loadRepositoryEntries() {
diff --git a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAOTest.java b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAOTest.java
index 5209ce5e456205ef75436bcf8e8993d27fe33993..a46364a4a54c4933e417eff4f3cb9d210b8fe5da 100644
--- a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAOTest.java
+++ b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/AdvanceOrderDAOTest.java
@@ -23,9 +23,9 @@ import static org.assertj.core.api.Assertions.assertThat;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
+import java.util.Set;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -38,6 +38,7 @@ import org.olat.resource.accesscontrol.model.TokenAccessMethod;
 import org.olat.resource.accesscontrol.provider.auto.AdvanceOrder;
 import org.olat.resource.accesscontrol.provider.auto.AdvanceOrder.Status;
 import org.olat.resource.accesscontrol.provider.auto.IdentifierKey;
+import org.olat.resource.accesscontrol.provider.auto.manager.AdvanceOrderDAO.IdentifierKeyValue;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.OlatTestCase;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -150,12 +151,12 @@ public class AdvanceOrderDAOTest extends OlatTestCase {
 		AdvanceOrder aoNotMatchingValue = sut.create(identity, IdentifierKey.internalId, "not matching", freeMethod);
 		sut.save(aoNotMatchingValue);
 		dbInstance.commitAndCloseSession();
-
-		Map<IdentifierKey, String> identifiers = new HashMap<>();
-		identifiers.put(IdentifierKey.internalId, IDENTIFIER_VALUE);
-		identifiers.put(IdentifierKey.externalId, IDENTIFIER_VALUE);
-		Collection<AdvanceOrder> advanceOrders = sut.loadPendingAdvanceOrders(identifiers);
-
+		
+		Set<IdentifierKeyValue> searchValues = new HashSet<>();
+		searchValues.add(new IdentifierKeyValue(IdentifierKey.internalId, IDENTIFIER_VALUE));
+		searchValues.add(new IdentifierKeyValue(IdentifierKey.externalId, IDENTIFIER_VALUE));
+		Collection<AdvanceOrder> advanceOrders = sut.loadPendingAdvanceOrders(searchValues);
+		
 		assertThat(advanceOrders).hasSize(2).contains(aoMatchingInternalId, aoMatchingExternalId);
 	}
 
@@ -170,13 +171,13 @@ public class AdvanceOrderDAOTest extends OlatTestCase {
 		AdvanceOrder aoNotMatchingValue = sut.create(identity, IdentifierKey.internalId, "not matching", freeMethod);
 		sut.save(aoNotMatchingValue);
 		dbInstance.commitAndCloseSession();
-
-		Map<IdentifierKey, String> identifiers = new HashMap<>();
-		identifiers.put(IdentifierKey.internalId, IDENTIFIER_VALUE);
-		identifiers.put(null, IDENTIFIER_VALUE);
-		identifiers.put(IdentifierKey.externalId, "");
-		Collection<AdvanceOrder> advanceOrders = sut.loadPendingAdvanceOrders(identifiers);
-
+		
+		Set<IdentifierKeyValue> searchValues = new HashSet<>();
+		searchValues.add(new IdentifierKeyValue(IdentifierKey.internalId, IDENTIFIER_VALUE));
+		searchValues.add(new IdentifierKeyValue(null, IDENTIFIER_VALUE));
+		searchValues.add(new IdentifierKeyValue(IdentifierKey.externalId, ""));
+		Collection<AdvanceOrder> advanceOrders = sut.loadPendingAdvanceOrders(searchValues);
+		
 		assertThat(advanceOrders).hasSize(1).contains(aoMatchingInternalId);
 	}
 
diff --git a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandlerTest.java b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandlerTest.java
index 0d21fc8365c1c1d1f4954b3ff1b240fc2da3ec34..cd39f1867b0e58a8c5c5ecc5ab547b7d65ba3b0a 100644
--- a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandlerTest.java
+++ b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalIdHandlerTest.java
@@ -23,6 +23,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.Set;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.InjectMocks;
@@ -65,10 +67,10 @@ public class ExternalIdHandlerTest {
 	public void shouldReturnTheExternalIdFromRepositoryEntry() {
 		String externalId = "1234";
 		when(entryMock.getExternalId()).thenReturn(externalId);
-
-		String value = sut.getRepositoryEntryValue(entryMock);
-
-		assertThat(value).isEqualTo(externalId);
+		
+		Set<String> values = sut.getRepositoryEntryValue(entryMock);
+		
+		assertThat(values.iterator().next()).isEqualTo(externalId);
 	}
 
 }
diff --git a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandlerTest.java b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandlerTest.java
index 0eb900a40eb2c2952302a1e00094e76d4fdd7ab9..8de47b171dc3b0f0e3e4bd5fc85960a0d08fd4d6 100644
--- a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandlerTest.java
+++ b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/ExternalRefHandlerTest.java
@@ -23,6 +23,10 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.InjectMocks;
@@ -30,6 +34,7 @@ import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.olat.repository.RepositoryEntry;
 import org.olat.repository.RepositoryService;
+import org.olat.resource.accesscontrol.AccessControlModule;
 
 /**
  *
@@ -39,6 +44,8 @@ import org.olat.repository.RepositoryService;
  */
 public class ExternalRefHandlerTest {
 
+	@Mock
+	private AccessControlModule accessModulControlMock;
 	@Mock
 	private RepositoryService repositoryServiceMock;
 	@Mock
@@ -54,21 +61,66 @@ public class ExternalRefHandlerTest {
 
 	@Test
 	public void shouldDelegateTheSearchToRepositoryService() {
+		when(accessModulControlMock.getAutoExternalRefDelimiter()).thenReturn("");
 		String externalRef = "EXT-123";
 
 		sut.find(externalRef);
 
 		verify(repositoryServiceMock).loadRepositoryEntriesByExternalRef(externalRef);
 	}
-
+	
+	@Test
+	public void shouldFilterExactMatchingExternalRef() {
+		when(accessModulControlMock.getAutoExternalRefDelimiter()).thenReturn(",");
+		
+		String externalRef = "EXT-123";
+		List<RepositoryEntry> entries = new ArrayList<>();
+		RepositoryEntry re1 = new RepositoryEntry();
+		re1.setExternalRef("EXT-123");
+		entries.add(re1);
+		RepositoryEntry re2 = new RepositoryEntry();
+		re2.setExternalRef("EXT-123,abc");
+		entries.add(re2);
+		RepositoryEntry re3 = new RepositoryEntry();
+		re3.setExternalRef("abc,EXT-123");
+		entries.add(re3);
+		RepositoryEntry re4 = new RepositoryEntry();
+		re4.setExternalRef("EXT-1234");
+		entries.add(re4);
+		RepositoryEntry re5 = new RepositoryEntry();
+		re5.setExternalRef("EXT-123,oo,EXT-123");
+		entries.add(re5);
+		when(repositoryServiceMock.loadRepositoryEntriesLikeExternalRef(externalRef))
+				.thenReturn(entries);
+		
+		List<RepositoryEntry> foundEntries = sut.find(externalRef);
+		
+		assertThat(foundEntries)
+				.containsExactlyInAnyOrder(re1, re2, re3, re5)
+				.doesNotContain(re4);
+	}
+	
 	@Test
 	public void shouldReturnTheExternalRefFromRepositoryEntry() {
+		when(accessModulControlMock.getAutoExternalRefDelimiter()).thenReturn("");
 		String externalRef = "1234";
 		when(entryMock.getExternalRef()).thenReturn(externalRef);
 
-		String value = sut.getRepositoryEntryValue(entryMock);
+		Set<String> values = sut.getRepositoryEntryValue(entryMock);
 
-		assertThat(value).isEqualTo(externalRef);
+		assertThat(values.iterator().next()).isEqualTo(externalRef);
+	}
+	
+	@Test
+	public void shouldReturnSplitedExternalRefsFromRepositoryEntry() {
+		when(accessModulControlMock.getAutoExternalRefDelimiter()).thenReturn(",");
+		String externalRef = "1234,1234,123,12,1.1";
+		when(entryMock.getExternalRef()).thenReturn(externalRef);
+		
+		Set<String> values = sut.getRepositoryEntryValue(entryMock);
+		
+		List<String> valueList = new ArrayList<>(values);
+		assertThat(valueList).containsExactlyInAnyOrder("1234","123","12","1.1");
 	}
 
 }
diff --git a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandlerTest.java b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandlerTest.java
index ff4c8c89a1731cde50fdf96af71fe9d785b96d13..4013cb6fa17e7437321fdc1c9341f58ce6ae1ad6 100644
--- a/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandlerTest.java
+++ b/src/test/java/org/olat/resource/accesscontrol/provider/auto/manager/InternalIdHandlerTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.util.Collection;
+import java.util.Set;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -75,10 +76,11 @@ public class InternalIdHandlerTest {
 	public void shouldReturnTheExternalIdFromRepositoryEntry() {
 		Long key = 1234L;
 		when(entryMock.getKey()).thenReturn(key);
-
-		String value = sut.getRepositoryEntryValue(entryMock);
-
+		
+		Set<String> values = sut.getRepositoryEntryValue(entryMock);
+		
 		String keyAsString = Long.toString(key);
-		assertThat(value).isEqualTo(keyAsString);
+		assertThat(values.iterator().next()).isEqualTo(keyAsString);
 	}
+	
 }