diff --git a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
index 46349ba..ea3c413 100755
--- a/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/application/ApplicationImpl.java
@@ -971,31 +971,22 @@
     {
         Assert.notEmpty(behaviorId, "behaviorId");
 
-        final Class<? extends Behavior> behaviorClass =
-                getObjectFromClassMap(behaviorId, _behaviorClassMap);
-        
+        final Class<? extends Behavior> behaviorClass = getObjectFromClassMap(behaviorId, _behaviorClassMap);
         if (behaviorClass == null)
         {
             throw new FacesException("Could not find any registered behavior-class for behaviorId : " + behaviorId);
         }
-        
-        if (!_cdiManagedBehaviorMap.containsKey(behaviorClass))
-        {
-            FacesBehavior annotation = behaviorClass.getAnnotation(FacesBehavior.class);
-            if (annotation != null && annotation.managed())
-            {
-                _cdiManagedBehaviorMap.put(behaviorClass, true);
-            }
-            else
-            {
-                _cdiManagedBehaviorMap.put(behaviorClass, false);
-            }
-        }
-        
+
         try
         {
+            boolean managed = _cdiManagedBehaviorMap.computeIfAbsent(behaviorClass, k ->
+            {
+                FacesBehavior annotation = k.getAnnotation(FacesBehavior.class);
+                return annotation == null ? false : annotation.managed();
+            });
+            
             Behavior behavior = null;
-            if (Boolean.TRUE.equals(_cdiManagedBehaviorMap.get(behaviorClass)))
+            if (managed)
             {
                 if (ClientBehavior.class.isAssignableFrom(behaviorClass))
                 {
@@ -1012,13 +1003,13 @@
 
                 if (innerBehavior instanceof ClientBehaviorBase)
                 {
-                  ClientBehaviorBase clientBehavior = (ClientBehaviorBase) innerBehavior;
-                  String renderType = clientBehavior.getRendererType();
-                  if (renderType != null)
-                  {
-                    ClientBehaviorRenderer cbr = facesContext.getRenderKit().getClientBehaviorRenderer(renderType);
-                    _handleAttachedResourceDependencyAnnotations(facesContext, cbr);
-                  }
+                    ClientBehaviorBase clientBehavior = (ClientBehaviorBase) innerBehavior;
+                    String renderType = clientBehavior.getRendererType();
+                    if (renderType != null)
+                    {
+                        ClientBehaviorRenderer cbr = facesContext.getRenderKit().getClientBehaviorRenderer(renderType);
+                        _handleAttachedResourceDependencyAnnotations(facesContext, cbr);
+                    }
                 }
             }
             else
@@ -1029,13 +1020,13 @@
 
                 if (behavior instanceof ClientBehaviorBase)
                 {
-                  ClientBehaviorBase clientBehavior = (ClientBehaviorBase) behavior;
-                  String renderType = clientBehavior.getRendererType();
-                  if (renderType != null)
-                  {
-                    ClientBehaviorRenderer cbr = facesContext.getRenderKit().getClientBehaviorRenderer(renderType);
-                    _handleAttachedResourceDependencyAnnotations(facesContext, cbr);
-                  }
+                    ClientBehaviorBase clientBehavior = (ClientBehaviorBase) behavior;
+                    String renderType = clientBehavior.getRendererType();
+                    if (renderType != null)
+                    {
+                        ClientBehaviorRenderer cbr = facesContext.getRenderKit().getClientBehaviorRenderer(renderType);
+                        _handleAttachedResourceDependencyAnnotations(facesContext, cbr);
+                    }
                 }
             }
 
@@ -1334,31 +1325,22 @@
     {
         Assert.notEmpty(converterId, "converterId");
 
-        final Class<? extends Converter> converterClass =
-                getObjectFromClassMap(converterId, _converterIdToClassMap);
+        final Class<? extends Converter> converterClass = getObjectFromClassMap(converterId, _converterIdToClassMap);
         if (converterClass == null)
         {
             throw new FacesException("Could not find any registered converter-class by converterId : " + converterId);
         }
 
-        if (!_cdiManagedConverterMap.containsKey(converterClass))
-        {
-            FacesConverter annotation = converterClass.getAnnotation(FacesConverter.class);
-            if (annotation != null && annotation.managed())
-            {
-                _cdiManagedConverterMap.put(converterClass, true);
-            }
-            else
-            {
-                _cdiManagedConverterMap.put(converterClass, false);
-            }
-        }
-        
         try
         {
-            Converter converter = null;
+            boolean managed = _cdiManagedConverterMap.computeIfAbsent(converterClass, k ->
+            {
+                FacesConverter annotation = k.getAnnotation(FacesConverter.class);
+                return annotation == null ? false : annotation.managed();
+            });
             
-            if (Boolean.TRUE.equals(_cdiManagedConverterMap.get(converterClass)))
+            Converter converter = null;
+            if (managed)
             {
                 converter = new FacesConverterCDIWrapper(converterClass, null, converterId);
                 
@@ -1646,53 +1628,32 @@
         {
             return;
         }
-        boolean classAlreadyProcessed = false;
 
-        
-        List<ResourceDependency> dependencyList = null;
-        boolean isCachedList = false;
-        
-        if(context.isProjectStage(ProjectStage.Production) && _classToResourceDependencyMap.containsKey(inspectedClass))
+        // reset cache each time
+        if (context.isProjectStage(ProjectStage.Development))
         {
-            dependencyList = _classToResourceDependencyMap.get(inspectedClass);
-            if(dependencyList == null)
-            {
-                return; //class has been inspected and did not contain any resource dependency annotations
-            }
-            else if (dependencyList.isEmpty())
-            {
-                return;
-            }
-            
-            isCachedList = true;    // else annotations were found in the cache
+            _classToResourceDependencyMap.remove(inspectedClass);
         }
         
-        if(dependencyList == null)  //not in production or the class hasn't been inspected yet
-        {   
-            ResourceDependency dependency = inspectedClass.getAnnotation(ResourceDependency.class);
-            ResourceDependencies dependencies = inspectedClass.getAnnotation(ResourceDependencies.class);
-            if(dependency != null || dependencies != null)
-            {
-                //resource dependencies were found using one or both annotations, create and build a new list
-                dependencyList = new ArrayList<ResourceDependency>();
-                
-                if(dependency != null)
-                {
-                    dependencyList.add(dependency);
-                }
-                
-                if(dependencies != null)
-                {
-                    dependencyList.addAll(Arrays.asList(dependencies.value()));
-                }
-            }
-            else
-            {
-                dependencyList = Collections.emptyList();
-            }
-        }
+        List<ResourceDependency> dependencyList = _classToResourceDependencyMap.computeIfAbsent(inspectedClass, k ->
+        {
+            List<ResourceDependency> values = new ArrayList<>(5);
 
-        //resource dependencies were found through inspection or from cache, handle them
+            ResourceDependency dependency = k.getAnnotation(ResourceDependency.class);
+            if (dependency != null)
+            {
+                values.add(dependency);
+            }
+
+            ResourceDependencies dependencies = k.getAnnotation(ResourceDependencies.class);
+            if (dependencies != null)
+            {
+                values.addAll(Arrays.asList(dependencies.value()));
+            }
+
+            return values.isEmpty() ? Collections.emptyList() : values;
+        });
+
         if (dependencyList != null && !dependencyList.isEmpty()) 
         {
             for (int i = 0, size = dependencyList.size(); i < size; i++)
@@ -1705,19 +1666,8 @@
                 }
             }
         }
-        
-        //if we're in production and the list is not yet cached, store it
-        if(context.isProjectStage(ProjectStage.Production) && !isCachedList && dependencyList != null)
-        {
-            // Note at this point dependencyList cannot be null, but just let this
-            // as a sanity check.
-            _classToResourceDependencyMap.put(inspectedClass, dependencyList);
-        }
-        
-        if (!classAlreadyProcessed)
-        {
-            rvc.setClassProcessed(inspectedClass);
-        }
+
+        rvc.setClassProcessed(inspectedClass);
     }
 
     /**
@@ -1861,33 +1811,24 @@
     {
         Assert.notEmpty(validatorId, "validatorId");
 
-        Class<? extends Validator> validatorClass =
-                getObjectFromClassMap(validatorId, _validatorClassMap);
+        Class<? extends Validator> validatorClass = getObjectFromClassMap(validatorId, _validatorClassMap);
         if (validatorClass == null)
         {
             String message = "Unknown validator id '" + validatorId + "'.";
             log.severe(message);
             throw new FacesException(message);
         }
-        
-        if (!_cdiManagedValidatorMap.containsKey(validatorClass))
-        {
-            FacesValidator annotation = validatorClass.getAnnotation(FacesValidator.class);
-            if (annotation != null && annotation.managed())
-            {
-                _cdiManagedValidatorMap.put(validatorClass, true);
-            }
-            else
-            {
-                _cdiManagedValidatorMap.put(validatorClass, false);
-            }
-        }
 
         try
         {
-            Validator validator = null;
+            boolean managed = _cdiManagedValidatorMap.computeIfAbsent(validatorClass, k -> 
+            {
+                FacesValidator annotation = k.getAnnotation(FacesValidator.class);
+                return annotation == null ? false : annotation.managed();
+            });
             
-            if (Boolean.TRUE.equals(_cdiManagedValidatorMap.get(validatorClass)))
+            Validator validator = null;
+            if (managed)
             {
                 validator = new FacesValidatorCDIWrapper(validatorClass, validatorId);
                 
@@ -2012,49 +1953,31 @@
     private void _handleListenerForAnnotations(FacesContext context, Object inspected, Class<?> inspectedClass,
                                                UIComponent component, boolean isProduction)
     {
-        List<ListenerFor> listenerForList = null;
-        boolean isCachedList = false;
-        
-        if(isProduction)
+        // reset cache each time
+        if (!isProduction)
         {
-            listenerForList = _classToListenerForMap.get(inspectedClass);
-
-            if (listenerForList != null)
-            {
-                if (listenerForList.isEmpty())
-                {
-                    return; //class has been inspected and did not contain any listener annotations
-                }
-                
-                isCachedList = true;    // else annotations were found in the cache
-            }
+            _classToListenerForMap.remove(inspectedClass);
         }
 
-        if(listenerForList == null) //not in production or the class hasn't been inspected yet
+        List<ListenerFor> listenerForList = _classToListenerForMap.computeIfAbsent(inspectedClass, k ->
         {
-            ListenerFor listener = inspectedClass.getAnnotation(ListenerFor.class);
-            ListenersFor listeners = inspectedClass.getAnnotation(ListenersFor.class);
-            if(listener != null || listeners != null)
+            List<ListenerFor> values = new ArrayList<>();
+            
+            ListenerFor listener = k.getAnnotation(ListenerFor.class);
+            if (listener != null)
             {
-                //listeners were found using one or both annotations, create and build a new list
-                listenerForList = new ArrayList<ListenerFor>();
-                
-                if(listener != null)
-                {
-                    listenerForList.add(listener);
-                }
-                
-                if(listeners != null)
-                {
-                    listenerForList.addAll(Arrays.asList(listeners.value()));
-                }
+                values.add(listener);
             }
-            else
+
+            ListenersFor listeners = k.getAnnotation(ListenersFor.class);
+            if (listeners != null)
             {
-                listenerForList = Collections.emptyList();
+                values.addAll(Arrays.asList(listeners.value()));
             }
-        }        
- 
+            
+            return values.isEmpty() ? Collections.emptyList() : values;
+        });
+
         // listeners were found through inspection or from cache, handle them
         if (listenerForList != null && !listenerForList.isEmpty()) 
         {
@@ -2064,14 +1987,6 @@
                 _handleListenerFor(context, inspected, component, listenerFor);
             }
         }
-        
-        //if we're in production and the list is not yet cached, store it
-        if(isProduction && !isCachedList && listenerForList != null) 
-        {
-            // Note at this point listenerForList cannot be null, but just let listenerForList != null
-            // as a sanity check.
-            _classToListenerForMap.put(inspectedClass, listenerForList);
-        }
     }
 
     private void _handleListenerFor(FacesContext context, Object inspected, UIComponent component,
@@ -2373,12 +2288,12 @@
     {
         Object obj = classMap.get(id);
         
-        if(obj == null)
+        if (obj == null)
         {
             return null;    //object for this id wasn't found on the map
         }
         
-        if(obj instanceof Class<?>)
+        if (obj instanceof Class<?>)
         {
             return (Class<? extends T>)obj;
         }
diff --git a/impl/src/main/java/org/apache/myfaces/context/RequestViewMetadata.java b/impl/src/main/java/org/apache/myfaces/context/RequestViewMetadata.java
index 5e7eea0..560ebd6 100644
--- a/impl/src/main/java/org/apache/myfaces/context/RequestViewMetadata.java
+++ b/impl/src/main/java/org/apache/myfaces/context/RequestViewMetadata.java
@@ -37,7 +37,7 @@
     public static final String RESOURCE_DEPENDENCY_KEY = "oam.component.resource.RDK";
 
     // No lazy init: every view has one (UIView.class) or more classes to process   
-    private Map<Class<?>, Boolean> processedClasses = new HashMap<Class<?>,Boolean>();
+    private Map<Class<?>, Boolean> processedClasses = new HashMap<>();
     
     private Map<ResourceDependency, Boolean> addedResources;
     
