diff --git a/api/src/main/java/javax/faces/FactoryFinder.java b/api/src/main/java/javax/faces/FactoryFinder.java
index 4719049..b14714b 100755
--- a/api/src/main/java/javax/faces/FactoryFinder.java
+++ b/api/src/main/java/javax/faces/FactoryFinder.java
@@ -47,6 +47,7 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.faces.component.search.SearchExpressionContextFactory;
+import org.apache.myfaces.core.api.shared.lang.ClassUtils;
 
 /**
  * see Javadoc of <a href="http://java.sun.com/javaee/javaserverfaces/1.2/docs/api/index.html">JSF Specification</a>
@@ -258,7 +259,7 @@
 
     private static Object _getFactory(String factoryName) throws FacesException
     {
-        ClassLoader classLoader = getClassLoader();
+        ClassLoader classLoader = ClassUtils.getContextClassLoader();
 
         // This code must be synchronized because this could cause a problem when
         // using update feature each time of myfaces (org.apache.myfaces.CONFIG_REFRESH_PERIOD)
@@ -440,7 +441,7 @@
     {
         try
         {
-            Class<?> beanEntryClass = _FactoryFinderProviderFactory.classForName(BEAN_ENTRY_CLASS_NAME);
+            Class<?> beanEntryClass = ClassUtils.classForName(BEAN_ENTRY_CLASS_NAME);
             Constructor beanEntryConstructor = beanEntryClass.getDeclaredConstructor(Object.class, Object.class);
 
             Object result = beanEntryConstructor.newInstance(instance, creationMetaData);
@@ -584,7 +585,7 @@
     {
         checkFactoryName(factoryName);
 
-        ClassLoader classLoader = getClassLoader();
+        ClassLoader classLoader = ClassUtils.getContextClassLoader();
         Map<String, List<String>> factoryClassNames = null;
         synchronized (registeredFactoryNames)
         {
@@ -656,7 +657,7 @@
 
     private static void _releaseFactories() throws FacesException
     {
-        ClassLoader classLoader = getClassLoader();
+        ClassLoader classLoader = ClassUtils.getContextClassLoader();
 
         Map<String, Object> factoryMap;
         // This code must be synchronized
@@ -716,31 +717,4 @@
             throw new IllegalArgumentException("factoryName '" + factoryName + '\'');
         }
     }
-
-    private static ClassLoader getClassLoader()
-    {
-        try
-        {
-            ClassLoader classLoader = null;
-            if (System.getSecurityManager() != null)
-            {
-                classLoader = (ClassLoader) AccessController.doPrivileged(
-                        (PrivilegedExceptionAction) () -> Thread.currentThread().getContextClassLoader());
-            }
-            else
-            {
-                classLoader = Thread.currentThread().getContextClassLoader();
-            }
-            
-            if (classLoader == null)
-            {
-                throw new FacesException("web application class loader cannot be identified", null);
-            }
-            return classLoader;
-        }
-        catch (Exception e)
-        {
-            throw new FacesException("web application class loader cannot be identified", e);
-        }
-    }
 }
diff --git a/api/src/main/java/javax/faces/_FactoryFinderProviderFactory.java b/api/src/main/java/javax/faces/_FactoryFinderProviderFactory.java
index 405dbd4..b8071f5 100644
--- a/api/src/main/java/javax/faces/_FactoryFinderProviderFactory.java
+++ b/api/src/main/java/javax/faces/_FactoryFinderProviderFactory.java
@@ -19,12 +19,10 @@
 package javax.faces;
 
 import java.lang.reflect.Method;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 import javax.faces.context.ExternalContext;
+import org.apache.myfaces.core.api.shared.lang.ClassUtils;
 
 /**
  * Provide utility methods used by FactoryFinder class to lookup for SPI interface FactoryFinderProvider.
@@ -83,7 +81,7 @@
 
         try
         {
-            factoryFinderFactoryClass = classForName(FACTORY_FINDER_PROVIDER_FACTORY_CLASS_NAME);
+            factoryFinderFactoryClass = ClassUtils.classForName(FACTORY_FINDER_PROVIDER_FACTORY_CLASS_NAME);
             if (factoryFinderFactoryClass != null)
             {
                 factoryFinderproviderFactoryGetMethod = factoryFinderFactoryClass.getMethod
@@ -92,7 +90,7 @@
                         .getMethod("getFactoryFinderProvider", null);
             }
 
-            factoryFinderProviderClass = classForName(FACTORY_FINDER_PROVIDER_CLASS_NAME);
+            factoryFinderProviderClass = ClassUtils.classForName(FACTORY_FINDER_PROVIDER_CLASS_NAME);
             if (factoryFinderProviderClass != null)
             {
                 factoryFinderProviderGetFactoryMethod = factoryFinderProviderClass.getMethod("getFactory",
@@ -103,7 +101,7 @@
                         ("releaseFactories", null);
             }
             
-            injectionProviderFactoryClass = classForName(INJECTION_PROVIDER_FACTORY_CLASS_NAME);
+            injectionProviderFactoryClass = ClassUtils.classForName(INJECTION_PROVIDER_FACTORY_CLASS_NAME);
             
             if (injectionProviderFactoryClass != null)
             {
@@ -113,7 +111,7 @@
                     getMethod("getInjectionProvider", ExternalContext.class);
             }
             
-            injectionProviderClass = classForName(INJECTION_PROVIDER_CLASS_NAME);
+            injectionProviderClass = ClassUtils.classForName(INJECTION_PROVIDER_CLASS_NAME);
             
             if (injectionProviderClass != null)
             {
@@ -171,62 +169,4 @@
         return null;
     }
 
-    // ~ Methods Copied from _ClassUtils
-    // ------------------------------------------------------------------------------------
-
-    /**
-     * Tries a Class.loadClass with the context class loader of the current thread first and automatically falls back
-     * to
-     * the ClassUtils class loader (i.e. the loader of the myfaces.jar lib) if necessary.
-     *
-     * @param type fully qualified name of a non-primitive non-array class
-     * @return the corresponding Class
-     * @throws NullPointerException   if type is null
-     * @throws ClassNotFoundException
-     */
-    public static Class<?> classForName(String type) throws ClassNotFoundException
-    {
-        if (type == null)
-        {
-            throw new NullPointerException("type");
-        }
-        try
-        {
-            // Try WebApp ClassLoader first
-            return Class.forName(type, false, // do not initialize for faster startup
-                    getContextClassLoader());
-        }
-        catch (ClassNotFoundException ignore)
-        {
-            // fallback: Try ClassLoader for ClassUtils (i.e. the myfaces.jar lib)
-            return Class.forName(type, false, // do not initialize for faster startup
-                    _FactoryFinderProviderFactory.class.getClassLoader());
-        }
-    }
-
-    /**
-     * Gets the ClassLoader associated with the current thread. Returns the class loader associated with the specified
-     * default object if no context loader is associated with the current thread.
-     *
-     * @return ClassLoader
-     */
-    protected static ClassLoader getContextClassLoader()
-    {
-        if (System.getSecurityManager() != null)
-        {
-            try
-            {
-                return (ClassLoader) AccessController.doPrivileged(
-                        (PrivilegedExceptionAction) () -> Thread.currentThread().getContextClassLoader());
-            }
-            catch (PrivilegedActionException pae)
-            {
-                throw new FacesException(pae);
-            }
-        }
-        else
-        {
-            return Thread.currentThread().getContextClassLoader();
-        }
-    }
 }
diff --git a/api/src/main/java/javax/faces/component/UIViewParameter.java b/api/src/main/java/javax/faces/component/UIViewParameter.java
index 58e58f1..d63fb13 100644
--- a/api/src/main/java/javax/faces/component/UIViewParameter.java
+++ b/api/src/main/java/javax/faces/component/UIViewParameter.java
@@ -273,7 +273,7 @@
             log.finest("releaseRenderer rendererMap -> " + delegateRendererMap.toString());
         }
 
-        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+        ClassLoader classLoader = ClassUtils.getContextClassLoader();
         
         if (log.isLoggable(Level.FINEST))
         {
diff --git a/api/src/main/java/javax/faces/validator/BeanValidator.java b/api/src/main/java/javax/faces/validator/BeanValidator.java
index 0d0a62b..7910b6a 100644
--- a/api/src/main/java/javax/faces/validator/BeanValidator.java
+++ b/api/src/main/java/javax/faces/validator/BeanValidator.java
@@ -20,9 +20,6 @@
 
 import org.apache.myfaces.core.api.shared.MessageUtils;
 import org.apache.myfaces.core.api.shared.ExternalSpecifications;
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -31,7 +28,6 @@
 import java.util.Set;
 import java.util.logging.Logger;
 
-import javax.el.ELContext;
 import javax.el.ValueExpression;
 import javax.el.ValueReference;
 import javax.faces.FacesException;
@@ -51,6 +47,7 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFWebConfigParam;
 import org.apache.myfaces.core.api.shared.FacesMessageInterpolator;
 import org.apache.myfaces.core.api.shared.ValueReferenceResolver;
+import org.apache.myfaces.core.api.shared.lang.ClassUtils;
 
 /**
  * <p>
@@ -158,7 +155,7 @@
         }
 
         // Obtain a reference to the to-be-validated object and the property name.
-        ValueReference reference = getValueReference(valueExpression, context);
+        ValueReference reference = ValueReferenceResolver.resolve(valueExpression, context);
         if (reference == null)
         {
             return;
@@ -299,20 +296,6 @@
     }
 
     /**
-     * Get the ValueReference from the ValueExpression.
-     *
-     * @param valueExpression The ValueExpression for value.
-     * @param context The FacesContext.
-     * @return A ValueReferenceWrapper with the necessary information about the ValueReference.
-     */
-    private ValueReference getValueReference(
-            final ValueExpression valueExpression, final FacesContext context)
-    {
-        ELContext elCtx = context.getELContext();
-        return ValueReferenceResolver.resolve(valueExpression, elCtx);
-    }
-
-    /**
      * This method creates ValidatorFactory instances or retrieves them from the container.
      *
      * Once created, ValidatorFactory instances are stored in the container under the key
@@ -369,44 +352,17 @@
                 clazz = clazz.trim();
                 if (!clazz.isEmpty())
                 {
-                    Class<?> theClass = null;
-                    ClassLoader cl = null;
-                    if (System.getSecurityManager() != null) 
-                    {
-                        try 
-                        {
-                            cl = (ClassLoader) AccessController.doPrivileged(
-                                    (PrivilegedExceptionAction) () -> Thread.currentThread().getContextClassLoader());
-                        }
-                        catch (PrivilegedActionException pae)
-                        {
-                            throw new FacesException(pae);
-                        }
-                    }
-                    else
-                    {
-                        cl = Thread.currentThread().getContextClassLoader();
-                    }
-                    
                     try
-                    {                        
-                        // Try WebApp ClassLoader first
-                        theClass = Class.forName(clazz,false,cl);
-                    }
-                    catch (ClassNotFoundException ignore)
                     {
-                        try
-                        {
-                            // fallback: Try ClassLoader for BeanValidator (i.e. the myfaces.jar lib)
-                            theClass = Class.forName(clazz,false, BeanValidator.class.getClassLoader());
-                        }
-                        catch (ClassNotFoundException e)
-                        {
-                            throw new RuntimeException("Could not load validation group", e);
-                        }                        
+                        Class<?> theClass = ClassUtils.classForName(clazz);
+
+                        // the class was found
+                        validationGroupsList.add(theClass);
                     }
-                    // the class was found
-                    validationGroupsList.add(theClass);
+                    catch (ClassNotFoundException e)
+                    {
+                        throw new RuntimeException("Could not load validation group", e);                     
+                    }
                 }
             }
                     
@@ -461,8 +417,6 @@
             // validationGroups to javax.validation.groups.Default. 
             this.validationGroups = null;
         }
-        // Only the String is saved, recalculate the Class[] on state restoration.
-        //postSetValidationGroups();
     }
 
     /**
@@ -484,7 +438,6 @@
     {
         this.validationGroups = validationGroups;
         this.clearInitialState();
-        //postSetValidationGroups();
     }
 
     @JSFProperty
diff --git a/api/src/main/java/org/apache/myfaces/core/api/shared/MessageUtils.java b/api/src/main/java/org/apache/myfaces/core/api/shared/MessageUtils.java
index 1da0939..e5a9efe 100755
--- a/api/src/main/java/org/apache/myfaces/core/api/shared/MessageUtils.java
+++ b/api/src/main/java/org/apache/myfaces/core/api/shared/MessageUtils.java
@@ -18,18 +18,15 @@
  */
 package org.apache.myfaces.core.api.shared;
 
-import java.security.AccessController;
-import java.security.PrivilegedActionException;
-import java.security.PrivilegedExceptionAction;
 import java.util.Locale;
 import java.util.MissingResourceException;
 import java.util.ResourceBundle;
 
 import javax.el.ValueExpression;
-import javax.faces.FacesException;
 import javax.faces.application.FacesMessage;
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
+import org.apache.myfaces.core.api.shared.lang.ClassUtils;
 
 public class MessageUtils
 {
@@ -220,16 +217,7 @@
                 try
                 {
                     //Last resort is the context class loader
-                    ClassLoader cl;
-                    if (System.getSecurityManager() == null)
-                    {
-                        cl = Thread.currentThread().getContextClassLoader();
-                    }
-                    else
-                    {
-                        cl = (ClassLoader) AccessController.doPrivileged(
-                                (PrivilegedExceptionAction) () -> Thread.currentThread().getContextClassLoader());
-                    }
+                    ClassLoader cl = ClassUtils.getContextClassLoader();
 
                     if (bundleControl == null)
                     {
@@ -240,10 +228,6 @@
                         return ResourceBundle.getBundle(bundleName, locale, cl, bundleControl);
                     }
                 }
-                catch(PrivilegedActionException pae)
-                {
-                    throw new FacesException(pae);
-                }
                 catch (MissingResourceException damned)
                 {
                     facesContext.getExternalContext().log("resource bundle " + bundleName + " could not be found");
diff --git a/api/src/main/java/org/apache/myfaces/core/api/shared/ValueReferenceResolver.java b/api/src/main/java/org/apache/myfaces/core/api/shared/ValueReferenceResolver.java
index 1a64156..d0b7a36 100644
--- a/api/src/main/java/org/apache/myfaces/core/api/shared/ValueReferenceResolver.java
+++ b/api/src/main/java/org/apache/myfaces/core/api/shared/ValueReferenceResolver.java
@@ -21,18 +21,32 @@
 import javax.el.ELContext;
 import javax.el.ValueExpression;
 import javax.el.ValueReference;
+import javax.faces.context.FacesContext;
 import javax.faces.el.CompositeComponentExpressionHolder;
 
 public class ValueReferenceResolver
 {
     /**
+     * Get the ValueReference from the ValueExpression.
+     *
+     * @param valueExpression The ValueExpression for value.
+     * @param context The FacesContext.
+     * @return A ValueReferenceWrapper with the necessary information about the ValueReference.
+     */
+    public static ValueReference resolve(ValueExpression valueExpression, FacesContext context)
+    {
+        ELContext elCtx = context.getELContext();
+        return ValueReferenceResolver.resolve(valueExpression, elCtx);
+    }
+
+    /**
      * This method can be used to extract the ValueReference from the given ValueExpression.
      *
      * @param valueExpression The ValueExpression to resolve.
      * @param elCtx The ELContext, needed to parse and execute the expression.
      * @return The ValueReferenceWrapper.
      */
-    public static ValueReference resolve(ValueExpression valueExpression, final ELContext elCtx)
+    public static ValueReference resolve(ValueExpression valueExpression, ELContext elCtx)
     {
         ValueReference valueReference = valueExpression.getValueReference(elCtx);
         
diff --git a/impl/src/main/java/org/apache/myfaces/component/validate/WholeBeanValidator.java b/impl/src/main/java/org/apache/myfaces/component/validate/WholeBeanValidator.java
index 13d91dc..3571545 100644
--- a/impl/src/main/java/org/apache/myfaces/component/validate/WholeBeanValidator.java
+++ b/impl/src/main/java/org/apache/myfaces/component/validate/WholeBeanValidator.java
@@ -252,22 +252,6 @@
 
     }
 
-
-    /**
-     * Get the ValueReference from the ValueExpression.
-     *
-     * @param valueExpression The ValueExpression for value.
-     * @param context The FacesContext.
-     * @return A ValueReferenceWrapper with the necessary information about the ValueReference.
-     */
-    private ValueReference getValueReference(
-            final ValueExpression valueExpression, final FacesContext context)
-    {
-        ELContext elCtx = context.getELContext();
-
-        return ValueReferenceResolver.resolve(valueExpression, elCtx);
-    }
-
     /**
      * This method creates ValidatorFactory instances or retrieves them from the container.
      *
@@ -398,7 +382,7 @@
             }
 
             // Obtain a reference to the to-be-validated object and the property name.
-            ValueReference reference = validator.getValueReference(
+            ValueReference reference = ValueReferenceResolver.resolve(
                     valueExpression, context.getFacesContext());
             if (reference == null)
             {
diff --git a/impl/src/main/java/org/apache/myfaces/util/WebXmlParser.java b/impl/src/main/java/org/apache/myfaces/util/WebXmlParser.java
index 30b54d7..f119d93 100755
--- a/impl/src/main/java/org/apache/myfaces/util/WebXmlParser.java
+++ b/impl/src/main/java/org/apache/myfaces/util/WebXmlParser.java
@@ -136,7 +136,7 @@
 
         try
         {
-            Enumeration<URL> webFragments = Thread.currentThread().getContextClassLoader()
+            Enumeration<URL> webFragments = ClassUtils.getContextClassLoader()
                     .getResources("META-INF/web-fragment.xml");
             while (webFragments.hasMoreElements())
             {
