diff --git a/acl/src/main/java/org/springframework/security/acls/AclEntryVoter.java b/acl/src/main/java/org/springframework/security/acls/AclEntryVoter.java
deleted file mode 100644
index e25b97bc0f7..00000000000
--- a/acl/src/main/java/org/springframework/security/acls/AclEntryVoter.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.security.acls;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import org.aopalliance.intercept.MethodInvocation;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.springframework.security.access.AuthorizationServiceException;
-import org.springframework.security.access.ConfigAttribute;
-import org.springframework.security.access.vote.AbstractAclVoter;
-import org.springframework.security.acls.domain.ObjectIdentityRetrievalStrategyImpl;
-import org.springframework.security.acls.domain.SidRetrievalStrategyImpl;
-import org.springframework.security.acls.model.Acl;
-import org.springframework.security.acls.model.AclService;
-import org.springframework.security.acls.model.NotFoundException;
-import org.springframework.security.acls.model.ObjectIdentity;
-import org.springframework.security.acls.model.ObjectIdentityRetrievalStrategy;
-import org.springframework.security.acls.model.Permission;
-import org.springframework.security.acls.model.Sid;
-import org.springframework.security.acls.model.SidRetrievalStrategy;
-import org.springframework.security.core.Authentication;
-import org.springframework.util.Assert;
-import org.springframework.util.ObjectUtils;
-import org.springframework.util.StringUtils;
-
-/**
- * 
- * Given a domain object instance passed as a method argument, ensures the principal has
- * appropriate permission as indicated by the {@link AclService}.
- * 
- * The AclService is used to retrieve the access control list (ACL) permissions
- * associated with a domain object instance for the current Authentication
- * object.
- * 
- * The voter will vote if any {@link ConfigAttribute#getAttribute()} matches the
- * {@link #processConfigAttribute}. The provider will then locate the first method
- * argument of type {@link #processDomainObjectClass}. Assuming that method argument is
- * non-null, the provider will then lookup the ACLs from the AclManager and
- * ensure the principal is {@link Acl#isGranted(List, List, boolean)} when presenting the
- * {@link #requirePermission} array to that method.
- * 
- * If the method argument is null, the voter will abstain from voting. If the
- * method argument could not be found, an {@link AuthorizationServiceException} will be
- * thrown.
- * 
- * In practical terms users will typically setup a number of AclEntryVoters. Each
- * will have a different {@link #setProcessDomainObjectClass processDomainObjectClass},
- * {@link #processConfigAttribute} and {@link #requirePermission} combination. For
- * example, a small application might employ the following instances of
- * AclEntryVoter:
- * 
- * - Process domain object class BankAccount, configuration attribute
- *VOTE_ACL_BANK_ACCONT_READ, require permission
- *BasePermission.READ
- *- Process domain object class BankAccount, configuration attribute
- *VOTE_ACL_BANK_ACCOUNT_WRITE, require permission list
- *BasePermission.WRITEandBasePermission.CREATE(allowing the
- * principal to have either of these two permissions)
- *- Process domain object class Customer, configuration attribute
- *VOTE_ACL_CUSTOMER_READ, require permission
- *BasePermission.READ
- *- Process domain object class Customer, configuration attribute
- *VOTE_ACL_CUSTOMER_WRITE, require permission list
- *BasePermission.WRITEandBasePermission.CREATE
- *
- * Alternatively, you could have used a common superclass or interface for the
- * {@link #processDomainObjectClass} if bothBankAccount and
- * Customer had common parents.
- *
- * 
- * If the principal does not have sufficient permissions, the voter will vote to deny
- * access.
- *
- * 
- * All comparisons and prefixes are case sensitive.
- *
- * @author Ben Alex
- * @deprecated please use {@link AclPermissionEvaluator} instead. Spring Method Security
- * annotations may also prove useful, for example
- * {@code @PreAuthorize("hasPermission(#id, ObjectsReturnType.class, read)")}
- */
-@Deprecated
-public class AclEntryVoter extends AbstractAclVoter {
-
-	private static final Log logger = LogFactory.getLog(AclEntryVoter.class);
-
-	private final AclService aclService;
-
-	private final String processConfigAttribute;
-
-	private final List requirePermission;
-
-	private ObjectIdentityRetrievalStrategy objectIdentityRetrievalStrategy = new ObjectIdentityRetrievalStrategyImpl();
-
-	private SidRetrievalStrategy sidRetrievalStrategy = new SidRetrievalStrategyImpl();
-
-	private String internalMethod;
-
-	public AclEntryVoter(AclService aclService, String processConfigAttribute, Permission[] requirePermission) {
-		Assert.notNull(processConfigAttribute, "A processConfigAttribute is mandatory");
-		Assert.notNull(aclService, "An AclService is mandatory");
-		Assert.isTrue(!ObjectUtils.isEmpty(requirePermission), "One or more requirePermission entries is mandatory");
-		this.aclService = aclService;
-		this.processConfigAttribute = processConfigAttribute;
-		this.requirePermission = Arrays.asList(requirePermission);
-	}
-
-	/**
-	 * Optionally specifies a method of the domain object that will be used to obtain a
-	 * contained domain object. That contained domain object will be used for the ACL
-	 * evaluation. This is useful if a domain object contains a parent that an ACL
-	 * evaluation should be targeted for, instead of the child domain object (which
-	 * perhaps is being created and as such does not yet have any ACL permissions)
-	 * @return null to use the domain object, or the name of a method (that
-	 * requires no arguments) that should be invoked to obtain an Object
-	 * which will be the domain object used for ACL evaluation
-	 */
-	protected String getInternalMethod() {
-		return this.internalMethod;
-	}
-
-	public void setInternalMethod(String internalMethod) {
-		this.internalMethod = internalMethod;
-	}
-
-	protected String getProcessConfigAttribute() {
-		return this.processConfigAttribute;
-	}
-
-	public void setObjectIdentityRetrievalStrategy(ObjectIdentityRetrievalStrategy objectIdentityRetrievalStrategy) {
-		Assert.notNull(objectIdentityRetrievalStrategy, "ObjectIdentityRetrievalStrategy required");
-		this.objectIdentityRetrievalStrategy = objectIdentityRetrievalStrategy;
-	}
-
-	public void setSidRetrievalStrategy(SidRetrievalStrategy sidRetrievalStrategy) {
-		Assert.notNull(sidRetrievalStrategy, "SidRetrievalStrategy required");
-		this.sidRetrievalStrategy = sidRetrievalStrategy;
-	}
-
-	@Override
-	public boolean supports(ConfigAttribute attribute) {
-		return (attribute.getAttribute() != null) && attribute.getAttribute().equals(getProcessConfigAttribute());
-	}
-
-	@Override
-	public int vote(Authentication authentication, MethodInvocation object, Collection attributes) {
-		for (ConfigAttribute attr : attributes) {
-			if (!supports(attr)) {
-				continue;
-			}
-
-			// Need to make an access decision on this invocation
-			// Attempt to locate the domain object instance to process
-			Object domainObject = getDomainObjectInstance(object);
-
-			// If domain object is null, vote to abstain
-			if (domainObject == null) {
-				logger.debug("Voting to abstain - domainObject is null");
-				return ACCESS_ABSTAIN;
-			}
-
-			// Evaluate if we are required to use an inner domain object
-			if (StringUtils.hasText(this.internalMethod)) {
-				domainObject = invokeInternalMethod(domainObject);
-			}
-
-			// Obtain the OID applicable to the domain object
-			ObjectIdentity objectIdentity = this.objectIdentityRetrievalStrategy.getObjectIdentity(domainObject);
-
-			// Obtain the SIDs applicable to the principal
-			List sids = this.sidRetrievalStrategy.getSids(authentication);
-
-			Acl acl;
-
-			try {
-				// Lookup only ACLs for SIDs we're interested in
-				acl = this.aclService.readAclById(objectIdentity, sids);
-			}
-			catch (NotFoundException ex) {
-				logger.debug("Voting to deny access - no ACLs apply for this principal");
-				return ACCESS_DENIED;
-			}
-
-			try {
-				if (acl.isGranted(this.requirePermission, sids, false)) {
-					logger.debug("Voting to grant access");
-					return ACCESS_GRANTED;
-				}
-				logger.debug("Voting to deny access - ACLs returned, but insufficient permissions for this principal");
-				return ACCESS_DENIED;
-			}
-			catch (NotFoundException ex) {
-				logger.debug("Voting to deny access - no ACLs apply for this principal");
-				return ACCESS_DENIED;
-			}
-		}
-
-		// No configuration attribute matched, so abstain
-		return ACCESS_ABSTAIN;
-	}
-
-	private Object invokeInternalMethod(Object domainObject) {
-		try {
-			Class> domainObjectType = domainObject.getClass();
-			Method method = domainObjectType.getMethod(this.internalMethod, new Class[0]);
-			return method.invoke(domainObject);
-		}
-		catch (NoSuchMethodException ex) {
-			throw new AuthorizationServiceException("Object of class '" + domainObject.getClass()
-					+ "' does not provide the requested internalMethod: " + this.internalMethod);
-		}
-		catch (IllegalAccessException ex) {
-			logger.debug("IllegalAccessException", ex);
-			throw new AuthorizationServiceException(
-					"Problem invoking internalMethod: " + this.internalMethod + " for object: " + domainObject);
-		}
-		catch (InvocationTargetException ex) {
-			logger.debug("InvocationTargetException", ex);
-			throw new AuthorizationServiceException(
-					"Problem invoking internalMethod: " + this.internalMethod + " for object: " + domainObject);
-		}
-	}
-
-}
diff --git a/acl/src/main/java/org/springframework/security/acls/afterinvocation/AbstractAclProvider.java b/acl/src/main/java/org/springframework/security/acls/afterinvocation/AbstractAclProvider.java
deleted file mode 100644
index 0a8e24a4b3c..00000000000
--- a/acl/src/main/java/org/springframework/security/acls/afterinvocation/AbstractAclProvider.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.security.acls.afterinvocation;
-
-import java.util.List;
-
-import org.springframework.security.access.AfterInvocationProvider;
-import org.springframework.security.access.ConfigAttribute;
-import org.springframework.security.acls.AclPermissionEvaluator;
-import org.springframework.security.acls.domain.ObjectIdentityRetrievalStrategyImpl;
-import org.springframework.security.acls.domain.SidRetrievalStrategyImpl;
-import org.springframework.security.acls.model.Acl;
-import org.springframework.security.acls.model.AclService;
-import org.springframework.security.acls.model.NotFoundException;
-import org.springframework.security.acls.model.ObjectIdentity;
-import org.springframework.security.acls.model.ObjectIdentityRetrievalStrategy;
-import org.springframework.security.acls.model.Permission;
-import org.springframework.security.acls.model.Sid;
-import org.springframework.security.acls.model.SidRetrievalStrategy;
-import org.springframework.security.core.Authentication;
-import org.springframework.util.Assert;
-import org.springframework.util.ObjectUtils;
-
-/**
- * Abstract {@link AfterInvocationProvider} which provides commonly-used ACL-related
- * services.
- *
- * @author Ben Alex
- * @deprecated please use {@link AclPermissionEvaluator} instead. Spring Method Security
- * annotations may also prove useful, for example
- * {@code @PostAuthorize("hasPermission(filterObject, read)")}
- */
-@Deprecated
-public abstract class AbstractAclProvider implements AfterInvocationProvider {
-
-	protected final AclService aclService;
-
-	protected String processConfigAttribute;
-
-	protected Class> processDomainObjectClass = Object.class;
-
-	protected ObjectIdentityRetrievalStrategy objectIdentityRetrievalStrategy = new ObjectIdentityRetrievalStrategyImpl();
-
-	protected SidRetrievalStrategy sidRetrievalStrategy = new SidRetrievalStrategyImpl();
-
-	protected final List requirePermission;
-
-	public AbstractAclProvider(AclService aclService, String processConfigAttribute,
-			List requirePermission) {
-		Assert.hasText(processConfigAttribute, "A processConfigAttribute is mandatory");
-		Assert.notNull(aclService, "An AclService is mandatory");
-		Assert.isTrue(!ObjectUtils.isEmpty(requirePermission), "One or more requirePermission entries is mandatory");
-		this.aclService = aclService;
-		this.processConfigAttribute = processConfigAttribute;
-		this.requirePermission = requirePermission;
-	}
-
-	protected Class> getProcessDomainObjectClass() {
-		return this.processDomainObjectClass;
-	}
-
-	protected boolean hasPermission(Authentication authentication, Object domainObject) {
-		// Obtain the OID applicable to the domain object
-		ObjectIdentity objectIdentity = this.objectIdentityRetrievalStrategy.getObjectIdentity(domainObject);
-
-		// Obtain the SIDs applicable to the principal
-		List sids = this.sidRetrievalStrategy.getSids(authentication);
-
-		try {
-			// Lookup only ACLs for SIDs we're interested in
-			Acl acl = this.aclService.readAclById(objectIdentity, sids);
-			return acl.isGranted(this.requirePermission, sids, false);
-		}
-		catch (NotFoundException ex) {
-			return false;
-		}
-	}
-
-	public void setObjectIdentityRetrievalStrategy(ObjectIdentityRetrievalStrategy objectIdentityRetrievalStrategy) {
-		Assert.notNull(objectIdentityRetrievalStrategy, "ObjectIdentityRetrievalStrategy required");
-		this.objectIdentityRetrievalStrategy = objectIdentityRetrievalStrategy;
-	}
-
-	protected void setProcessConfigAttribute(String processConfigAttribute) {
-		Assert.hasText(processConfigAttribute, "A processConfigAttribute is mandatory");
-		this.processConfigAttribute = processConfigAttribute;
-	}
-
-	public void setProcessDomainObjectClass(Class> processDomainObjectClass) {
-		Assert.notNull(processDomainObjectClass, "processDomainObjectClass cannot be set to null");
-		this.processDomainObjectClass = processDomainObjectClass;
-	}
-
-	public void setSidRetrievalStrategy(SidRetrievalStrategy sidRetrievalStrategy) {
-		Assert.notNull(sidRetrievalStrategy, "SidRetrievalStrategy required");
-		this.sidRetrievalStrategy = sidRetrievalStrategy;
-	}
-
-	@Override
-	public boolean supports(ConfigAttribute attribute) {
-		return this.processConfigAttribute.equals(attribute.getAttribute());
-	}
-
-	/**
-	 * This implementation supports any type of class, because it does not query the
-	 * presented secure object.
-	 * @param clazz the secure object
-	 * @return always true
-	 */
-	@Override
-	public boolean supports(Class> clazz) {
-		return true;
-	}
-
-}
diff --git a/acl/src/main/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationCollectionFilteringProvider.java b/acl/src/main/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationCollectionFilteringProvider.java
deleted file mode 100644
index 8f3adb1f5ee..00000000000
--- a/acl/src/main/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationCollectionFilteringProvider.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.security.acls.afterinvocation;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.springframework.core.log.LogMessage;
-import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.access.AuthorizationServiceException;
-import org.springframework.security.access.ConfigAttribute;
-import org.springframework.security.acls.AclPermissionEvaluator;
-import org.springframework.security.acls.model.AclService;
-import org.springframework.security.acls.model.Permission;
-import org.springframework.security.core.Authentication;
-
-/**
- * 
- * Given a Collection of domain object instances returned from a secure
- * object invocation, remove any Collection elements the principal does not
- * have appropriate permission to access as defined by the {@link AclService}.
- * 
- * The AclService is used to retrieve the access control list (ACL)
- * permissions associated with each Collection domain object instance element
- * for the current Authentication object.
- * 
- * This after invocation provider will fire if any {@link ConfigAttribute#getAttribute()}
- * matches the {@link #processConfigAttribute}. The provider will then lookup the ACLs
- * from the AclService and ensure the principal is
- * {@link org.springframework.security.acls.model.Acl#isGranted(List, List, boolean)
- * Acl.isGranted()} when presenting the {@link #requirePermission} array to that method.
- * 
- * If the principal does not have permission, that element will not be included in the
- * returned Collection.
- * 
- * Often users will setup a BasicAclEntryAfterInvocationProvider with a
- * {@link #processConfigAttribute} of AFTER_ACL_COLLECTION_READ and a
- * {@link #requirePermission} of BasePermission.READ. These are also the
- * defaults.
- * 
- * If the provided returnObject is null, a null
- * Collection will be returned. If the provided returnObject is
- * not a Collection, an {@link AuthorizationServiceException} will be thrown.
- * 
- * All comparisons and prefixes are case sensitive.
- *
- * @author Ben Alex
- * @author Paulo Neves
- * @deprecated please use {@link AclPermissionEvaluator} instead. Spring Method Security
- * annotations may also prove useful, for example
- * {@code @PostFilter("hasPermission(filterObject, read)")}
- */
-@Deprecated
-public class AclEntryAfterInvocationCollectionFilteringProvider extends AbstractAclProvider {
-
-	protected static final Log logger = LogFactory.getLog(AclEntryAfterInvocationCollectionFilteringProvider.class);
-
-	public AclEntryAfterInvocationCollectionFilteringProvider(AclService aclService,
-			List requirePermission) {
-		super(aclService, "AFTER_ACL_COLLECTION_READ", requirePermission);
-	}
-
-	@Override
-	@SuppressWarnings("unchecked")
-	public Object decide(Authentication authentication, Object object, Collection config,
-			Object returnedObject) throws AccessDeniedException {
-		if (returnedObject == null) {
-			logger.debug("Return object is null, skipping");
-			return null;
-		}
-
-		for (ConfigAttribute attr : config) {
-			if (!this.supports(attr)) {
-				continue;
-			}
-
-			// Need to process the Collection for this invocation
-			Filterer filterer = getFilterer(returnedObject);
-
-			// Locate unauthorised Collection elements
-			for (Object domainObject : filterer) {
-				// Ignore nulls or entries which aren't instances of the configured domain
-				// object class
-				if (domainObject == null || !getProcessDomainObjectClass().isAssignableFrom(domainObject.getClass())) {
-					continue;
-				}
-				if (!hasPermission(authentication, domainObject)) {
-					filterer.remove(domainObject);
-					logger.debug(LogMessage.of(() -> "Principal is NOT authorised for element: " + domainObject));
-				}
-			}
-			return filterer.getFilteredObject();
-		}
-		return returnedObject;
-	}
-
-	private Filterer getFilterer(Object returnedObject) {
-		if (returnedObject instanceof Collection) {
-			return new CollectionFilterer((Collection) returnedObject);
-		}
-		if (returnedObject.getClass().isArray()) {
-			return new ArrayFilterer((Object[]) returnedObject);
-		}
-		throw new AuthorizationServiceException("A Collection or an array (or null) was required as the "
-				+ "returnedObject, but the returnedObject was: " + returnedObject);
-	}
-
-}
diff --git a/acl/src/main/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationProvider.java b/acl/src/main/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationProvider.java
deleted file mode 100644
index 6142d45cb91..00000000000
--- a/acl/src/main/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationProvider.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright 2004, 2005, 2006 Acegi Technology Pty Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.security.acls.afterinvocation;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-import org.springframework.context.MessageSource;
-import org.springframework.context.MessageSourceAware;
-import org.springframework.context.support.MessageSourceAccessor;
-import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.access.ConfigAttribute;
-import org.springframework.security.acls.AclPermissionEvaluator;
-import org.springframework.security.acls.model.AclService;
-import org.springframework.security.acls.model.Permission;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.SpringSecurityMessageSource;
-
-/**
- * Given a domain object instance returned from a secure object invocation, ensures the
- * principal has appropriate permission as defined by the {@link AclService}.
- * 
- * The AclService is used to retrieve the access control list (ACL)
- * permissions associated with a domain object instance for the current
- * Authentication object.
- * 
- * This after invocation provider will fire if any {@link ConfigAttribute#getAttribute()}
- * matches the {@link #processConfigAttribute}. The provider will then lookup the ACLs
- * from the AclService and ensure the principal is
- * {@link org.springframework.security.acls.model.Acl#isGranted(List, List, boolean)
- * Acl.isGranted(List, List, boolean)} when presenting the {@link #requirePermission}
- * array to that method.
- * 
- * Often users will set up an AclEntryAfterInvocationProvider with a
- * {@link #processConfigAttribute} of AFTER_ACL_READ and a
- * {@link #requirePermission} of BasePermission.READ. These are also the
- * defaults.
- * 
- * If the principal does not have sufficient permissions, an
- * AccessDeniedException will be thrown.
- * 
- * If the provided returnedObject is null, permission will always be
- * granted and null will be returned.
- * 
- * All comparisons and prefixes are case sensitive.
- *
- * @deprecated please use {@link AclPermissionEvaluator} instead. Spring Method Security
- * annotations may also prove useful, for example
- * {@code @PostAuthorize("hasPermission(filterObject, read)")}
- */
-@Deprecated
-public class AclEntryAfterInvocationProvider extends AbstractAclProvider implements MessageSourceAware {
-
-	protected static final Log logger = LogFactory.getLog(AclEntryAfterInvocationProvider.class);
-
-	protected MessageSourceAccessor messages = SpringSecurityMessageSource.getAccessor();
-
-	public AclEntryAfterInvocationProvider(AclService aclService, List requirePermission) {
-		this(aclService, "AFTER_ACL_READ", requirePermission);
-	}
-
-	public AclEntryAfterInvocationProvider(AclService aclService, String processConfigAttribute,
-			List requirePermission) {
-		super(aclService, processConfigAttribute, requirePermission);
-	}
-
-	@Override
-	public Object decide(Authentication authentication, Object object, Collection config,
-			Object returnedObject) throws AccessDeniedException {
-
-		if (returnedObject == null) {
-			// AclManager interface contract prohibits nulls
-			// As they have permission to null/nothing, grant access
-			logger.debug("Return object is null, skipping");
-			return null;
-		}
-
-		if (!getProcessDomainObjectClass().isAssignableFrom(returnedObject.getClass())) {
-			logger.debug("Return object is not applicable for this provider, skipping");
-			return returnedObject;
-		}
-
-		for (ConfigAttribute attr : config) {
-			if (!this.supports(attr)) {
-				continue;
-			}
-
-			// Need to make an access decision on this invocation
-			if (hasPermission(authentication, returnedObject)) {
-				return returnedObject;
-			}
-
-			logger.debug("Denying access");
-			throw new AccessDeniedException(this.messages.getMessage("AclEntryAfterInvocationProvider.noPermission",
-					new Object[] { authentication.getName(), returnedObject },
-					"Authentication {0} has NO permissions to the domain object {1}"));
-		}
-
-		return returnedObject;
-	}
-
-	@Override
-	public void setMessageSource(MessageSource messageSource) {
-		this.messages = new MessageSourceAccessor(messageSource);
-	}
-
-}
diff --git a/acl/src/test/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationCollectionFilteringProviderTests.java b/acl/src/test/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationCollectionFilteringProviderTests.java
deleted file mode 100644
index bc8a9655659..00000000000
--- a/acl/src/test/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationCollectionFilteringProviderTests.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2002-2016 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.security.acls.afterinvocation;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.junit.jupiter.api.Test;
-
-import org.springframework.security.access.ConfigAttribute;
-import org.springframework.security.access.SecurityConfig;
-import org.springframework.security.acls.model.Acl;
-import org.springframework.security.acls.model.AclService;
-import org.springframework.security.acls.model.ObjectIdentity;
-import org.springframework.security.acls.model.ObjectIdentityRetrievalStrategy;
-import org.springframework.security.acls.model.Permission;
-import org.springframework.security.acls.model.SidRetrievalStrategy;
-import org.springframework.security.core.Authentication;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-/**
- * @author Luke Taylor
- */
-@SuppressWarnings({ "unchecked" })
-public class AclEntryAfterInvocationCollectionFilteringProviderTests {
-
-	@Test
-	public void objectsAreRemovedIfPermissionDenied() {
-		AclService service = mock(AclService.class);
-		Acl acl = mock(Acl.class);
-		given(acl.isGranted(any(), any(), anyBoolean())).willReturn(false);
-		given(service.readAclById(any(), any())).willReturn(acl);
-		AclEntryAfterInvocationCollectionFilteringProvider provider = new AclEntryAfterInvocationCollectionFilteringProvider(
-				service, Arrays.asList(mock(Permission.class)));
-		provider.setObjectIdentityRetrievalStrategy(mock(ObjectIdentityRetrievalStrategy.class));
-		provider.setProcessDomainObjectClass(Object.class);
-		provider.setSidRetrievalStrategy(mock(SidRetrievalStrategy.class));
-		Object returned = provider.decide(mock(Authentication.class), new Object(),
-				SecurityConfig.createList("AFTER_ACL_COLLECTION_READ"),
-				new ArrayList(Arrays.asList(new Object(), new Object())));
-		assertThat(returned).isInstanceOf(List.class);
-		assertThat(((List) returned)).isEmpty();
-		returned = provider.decide(mock(Authentication.class), new Object(),
-				SecurityConfig.createList("UNSUPPORTED", "AFTER_ACL_COLLECTION_READ"),
-				new Object[] { new Object(), new Object() });
-		assertThat(returned instanceof Object[]).isTrue();
-		assertThat(((Object[]) returned).length == 0).isTrue();
-	}
-
-	@Test
-	public void accessIsGrantedIfNoAttributesDefined() {
-		AclEntryAfterInvocationCollectionFilteringProvider provider = new AclEntryAfterInvocationCollectionFilteringProvider(
-				mock(AclService.class), Arrays.asList(mock(Permission.class)));
-		Object returned = new Object();
-		assertThat(returned).isSameAs(provider.decide(mock(Authentication.class), new Object(),
-				Collections.emptyList(), returned));
-	}
-
-	@Test
-	public void nullReturnObjectIsIgnored() {
-		AclService service = mock(AclService.class);
-		AclEntryAfterInvocationCollectionFilteringProvider provider = new AclEntryAfterInvocationCollectionFilteringProvider(
-				service, Arrays.asList(mock(Permission.class)));
-		assertThat(provider.decide(mock(Authentication.class), new Object(),
-				SecurityConfig.createList("AFTER_ACL_COLLECTION_READ"), null))
-			.isNull();
-		verify(service, never()).readAclById(any(ObjectIdentity.class), any(List.class));
-	}
-
-}
diff --git a/acl/src/test/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationProviderTests.java b/acl/src/test/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationProviderTests.java
deleted file mode 100644
index 00f61d0a54a..00000000000
--- a/acl/src/test/java/org/springframework/security/acls/afterinvocation/AclEntryAfterInvocationProviderTests.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2002-2016 the original author or authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.springframework.security.acls.afterinvocation;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.junit.jupiter.api.Test;
-
-import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.access.ConfigAttribute;
-import org.springframework.security.access.SecurityConfig;
-import org.springframework.security.acls.model.Acl;
-import org.springframework.security.acls.model.AclService;
-import org.springframework.security.acls.model.NotFoundException;
-import org.springframework.security.acls.model.ObjectIdentity;
-import org.springframework.security.acls.model.ObjectIdentityRetrievalStrategy;
-import org.springframework.security.acls.model.Permission;
-import org.springframework.security.acls.model.SidRetrievalStrategy;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.SpringSecurityMessageSource;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.verify;
-
-/**
- * @author Luke Taylor
- */
-@SuppressWarnings({ "unchecked" })
-public class AclEntryAfterInvocationProviderTests {
-
-	@Test
-	public void rejectsMissingPermissions() {
-		assertThatIllegalArgumentException()
-			.isThrownBy(() -> new AclEntryAfterInvocationProvider(mock(AclService.class), null));
-		assertThatIllegalArgumentException().isThrownBy(
-				() -> new AclEntryAfterInvocationProvider(mock(AclService.class), Collections.emptyList()));
-	}
-
-	@Test
-	public void accessIsAllowedIfPermissionIsGranted() {
-		AclService service = mock(AclService.class);
-		Acl acl = mock(Acl.class);
-		given(acl.isGranted(any(List.class), any(List.class), anyBoolean())).willReturn(true);
-		given(service.readAclById(any(), any())).willReturn(acl);
-		AclEntryAfterInvocationProvider provider = new AclEntryAfterInvocationProvider(service,
-				Arrays.asList(mock(Permission.class)));
-		provider.setMessageSource(new SpringSecurityMessageSource());
-		provider.setObjectIdentityRetrievalStrategy(mock(ObjectIdentityRetrievalStrategy.class));
-		provider.setProcessDomainObjectClass(Object.class);
-		provider.setSidRetrievalStrategy(mock(SidRetrievalStrategy.class));
-		Object returned = new Object();
-		assertThat(returned).isSameAs(provider.decide(mock(Authentication.class), new Object(),
-				SecurityConfig.createList("AFTER_ACL_READ"), returned));
-	}
-
-	@Test
-	public void accessIsGrantedIfNoAttributesDefined() {
-		AclEntryAfterInvocationProvider provider = new AclEntryAfterInvocationProvider(mock(AclService.class),
-				Arrays.asList(mock(Permission.class)));
-		Object returned = new Object();
-		assertThat(returned).isSameAs(provider.decide(mock(Authentication.class), new Object(),
-				Collections.emptyList(), returned));
-	}
-
-	@Test
-	public void accessIsGrantedIfObjectTypeNotSupported() {
-		AclEntryAfterInvocationProvider provider = new AclEntryAfterInvocationProvider(mock(AclService.class),
-				Arrays.asList(mock(Permission.class)));
-		provider.setProcessDomainObjectClass(String.class);
-		// Not a String
-		Object returned = new Object();
-		assertThat(returned).isSameAs(provider.decide(mock(Authentication.class), new Object(),
-				SecurityConfig.createList("AFTER_ACL_READ"), returned));
-	}
-
-	@Test
-	public void accessIsDeniedIfPermissionIsNotGranted() {
-		AclService service = mock(AclService.class);
-		Acl acl = mock(Acl.class);
-		given(acl.isGranted(any(List.class), any(List.class), anyBoolean())).willReturn(false);
-		// Try a second time with no permissions found
-		given(acl.isGranted(any(), any(List.class), anyBoolean())).willThrow(new NotFoundException(""));
-		given(service.readAclById(any(), any())).willReturn(acl);
-		AclEntryAfterInvocationProvider provider = new AclEntryAfterInvocationProvider(service,
-				Arrays.asList(mock(Permission.class)));
-		provider.setProcessConfigAttribute("MY_ATTRIBUTE");
-		provider.setMessageSource(new SpringSecurityMessageSource());
-		provider.setObjectIdentityRetrievalStrategy(mock(ObjectIdentityRetrievalStrategy.class));
-		provider.setProcessDomainObjectClass(Object.class);
-		provider.setSidRetrievalStrategy(mock(SidRetrievalStrategy.class));
-		assertThatExceptionOfType(AccessDeniedException.class)
-			.isThrownBy(() -> provider.decide(mock(Authentication.class), new Object(),
-					SecurityConfig.createList("UNSUPPORTED", "MY_ATTRIBUTE"), new Object()));
-		// Second scenario with no acls found
-		assertThatExceptionOfType(AccessDeniedException.class)
-			.isThrownBy(() -> provider.decide(mock(Authentication.class), new Object(),
-					SecurityConfig.createList("UNSUPPORTED", "MY_ATTRIBUTE"), new Object()));
-	}
-
-	@Test
-	public void nullReturnObjectIsIgnored() {
-		AclService service = mock(AclService.class);
-		AclEntryAfterInvocationProvider provider = new AclEntryAfterInvocationProvider(service,
-				Arrays.asList(mock(Permission.class)));
-		assertThat(provider.decide(mock(Authentication.class), new Object(),
-				SecurityConfig.createList("AFTER_ACL_COLLECTION_READ"), null))
-			.isNull();
-		verify(service, never()).readAclById(any(ObjectIdentity.class), any(List.class));
-	}
-
-}