diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/ReflectUtil.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/ReflectUtil.java
index e61febd..fb7bce7 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/ReflectUtil.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/common/util/ReflectUtil.java
@@ -18,13 +18,9 @@
  */
 package org.apache.myfaces.extensions.scripting.core.common.util;
 
-
 import org.apache.myfaces.extensions.scripting.core.api.WeavingContext;
 
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
+import java.lang.reflect.*;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.logging.Level;
@@ -35,11 +31,13 @@
  * @version $Revision$ $Date$
  */
 
-public class ReflectUtil {
+public class ReflectUtil
+{
 
     static final Logger _logger = Logger.getLogger(ReflectUtil.class.getName());
 
-    public static Object instantiate(String clazz, Object... varargs) {
+    public static Object instantiate(String clazz, Object... varargs)
+    {
         return instantiate(ClassUtils.forName(clazz), varargs);
     }
 
@@ -50,28 +48,41 @@
      * @param varargs the instantiation parameters
      * @return the instantiated object
      */
-    public static Object instantiate(Class clazz, Object... varargs) {
+    public static Object instantiate(Class clazz, Object... varargs)
+    {
         Class[] classes = new Class[varargs.length];
-        for (int cnt = 0; cnt < varargs.length; cnt++) {
+        for (int cnt = 0; cnt < varargs.length; cnt++)
+        {
 
-            if (varargs[cnt] instanceof Cast) {
+            if (varargs[cnt] instanceof Cast)
+            {
                 classes[cnt] = ((Cast) varargs[cnt]).getClazz();
                 varargs[cnt] = ((Cast) varargs[cnt]).getValue();
-            } else {
+            } else
+            {
                 classes[cnt] = varargs[cnt].getClass();
             }
         }
 
-        try {
+        try
+        {
             Constructor constr = clazz.getConstructor(classes);
             return constr.newInstance(varargs);
-        } catch (NoSuchMethodException e) {
+        }
+        catch (NoSuchMethodException e)
+        {
             throw new RuntimeException(e);
-        } catch (InvocationTargetException e) {
+        }
+        catch (InvocationTargetException e)
+        {
             throw new RuntimeException(e);
-        } catch (IllegalAccessException e) {
+        }
+        catch (IllegalAccessException e)
+        {
             throw new RuntimeException(e);
-        } catch (InstantiationException e) {
+        }
+        catch (InstantiationException e)
+        {
             throw new RuntimeException(e);
         }
     }/*this is mostly just a helper to bypass a groovy bug in a more
@@ -80,7 +91,8 @@
    * fixes that
    * */
 
-    public static Object newObject(Class clazz) throws IllegalAccessException, InstantiationException {
+    public static Object newObject(Class clazz) throws IllegalAccessException, InstantiationException
+    {
         return clazz.newInstance();
     }
 
@@ -93,18 +105,21 @@
      * @param varargs    the arguments which have to be passed to the method
      * @return the return value of the method
      */
-    public static Object executeStaticMethod(Class obj, String methodName, Object... varargs) {
+    public static Object executeStaticMethod(Class obj, String methodName, Object... varargs)
+    {
 
         Collection<Method> methods = getMethods(obj, methodName, varargs.length);
 
         Object retVal = handleStaticMethod(obj, methodName, methods, varargs);
-        if (!methodNotFound(retVal)) {
+        if (!methodNotFound(retVal))
+        {
             return retVal;
         }
 
         methods = getAllMethods(obj, methodName, varargs.length);
         retVal = handleStaticMethod(obj, methodName, methods, varargs);
-        if (!methodNotFound(retVal)) {
+        if (!methodNotFound(retVal))
+        {
             return retVal;
         }
 
@@ -112,11 +127,69 @@
 
     }
 
-    public static Collection<Method> getAllMethods(Class clazz, String methodName, int varargLength) {
+    public static void setField(Object obj, String fieldName, Object value, boolean protectedField)
+    {
+        try
+        {
+            Field f = null;
+            try
+            {
+                f = obj.getClass().getDeclaredField(fieldName);
+            }
+            catch (NoSuchFieldException e)
+            {
+                f = obj.getClass().getField(fieldName);
+            }
+
+            f.setAccessible(protectedField);
+            f.set(obj, value);
+
+        }
+        catch (NoSuchFieldException e)
+        {
+            throw new RuntimeException(e);
+        }
+        catch (IllegalAccessException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static Object getField(Object obj, String fieldName, boolean protectedField)
+    {
+        try
+        {
+            Field f = null;
+            try
+            {
+                f = obj.getClass().getDeclaredField(fieldName);
+            }
+            catch (NoSuchFieldException e)
+            {
+                f = obj.getClass().getField(fieldName);
+            }
+            f.setAccessible(protectedField);
+            return f.get(obj);
+        }
+        catch (NoSuchFieldException e)
+        {
+            throw new RuntimeException(e);
+        }
+        catch (IllegalAccessException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static Collection<Method> getAllMethods(Class clazz, String methodName, int varargLength)
+    {
         ArrayList<Method> retVal = new ArrayList<Method>(30);
-        while (clazz != null) {
-            for (Method m : clazz.getDeclaredMethods()) {
-                if (m.getParameterTypes().length == varargLength && m.getName().equals(methodName)) {
+        while (clazz != null)
+        {
+            for (Method m : clazz.getDeclaredMethods())
+            {
+                if (m.getParameterTypes().length == varargLength && m.getName().equals(methodName))
+                {
                     retVal.add(m);
                 }
             }
@@ -126,10 +199,13 @@
         return retVal;
     }
 
-    public static Collection<Method> getMethods(Class clazz, String methodName, int varargLength) {
+    public static Collection<Method> getMethods(Class clazz, String methodName, int varargLength)
+    {
         ArrayList<Method> retVal = new ArrayList<Method>(30);
-        for (Method m : clazz.getDeclaredMethods()) {
-            if (m.getParameterTypes().length == varargLength && m.getName().equals(methodName)) {
+        for (Method m : clazz.getDeclaredMethods())
+        {
+            if (m.getParameterTypes().length == varargLength && m.getName().equals(methodName))
+            {
                 retVal.add(m);
             }
         }
@@ -150,7 +226,8 @@
      *                          language execution where failures can happen but method executions
      *                          should not enforce exception handling
      */
-    public static Object executeMethod(Object obj, String methodName, Object... varargs) {
+    public static Object executeMethod(Object obj, String methodName, Object... varargs)
+    {
 
         Collection<Method> methods;
         //if we have an invocationHandler here we
@@ -158,7 +235,8 @@
         //That way we can cover more dynamic stuff
         //our reload invocation handler is treated differently here
 
-        if (obj instanceof InvocationHandler) {
+        if (obj instanceof InvocationHandler)
+        {
             InvocationHandler objToInvoke = (InvocationHandler) obj;
 
             Object realTarget = WeavingContext.getInstance().getDelegateFromProxy(objToInvoke);
@@ -167,13 +245,15 @@
             //to be accessed
             methods = getMethods(realTarget.getClass(), methodName, varargs.length);
             Object retVal = handleInvHandlerMethod(objToInvoke, methodName, methods, varargs);
-            if (!methodNotFound(retVal)) {
+            if (!methodNotFound(retVal))
+            {
                 return retVal;
             }
             //if not we try all of them until we have a match
             methods = getAllMethods(realTarget.getClass(), methodName, varargs.length);
             retVal = handleInvHandlerMethod(objToInvoke, methodName, methods, varargs);
-            if (!(methodNotFound(retVal))) {
+            if (!(methodNotFound(retVal)))
+            {
                 return retVal;
             }
 
@@ -186,14 +266,16 @@
         //to be accessed
         methods = getMethods(clazz, methodName, varargs.length);
         Object retVal = handleObjMethod(obj, methodName, methods, varargs);
-        if (!methodNotFound(retVal)) {
+        if (!methodNotFound(retVal))
+        {
             return retVal;
         }
 
         //if not we try all of them until we have a match
         methods = getAllMethods(clazz, methodName, varargs.length);
         retVal = handleObjMethod(obj, methodName, methods, varargs);
-        if (!methodNotFound(retVal)) {
+        if (!methodNotFound(retVal))
+        {
             return retVal;
         }
 
@@ -204,7 +286,8 @@
      * special marker class which is a special return value indicating
      * that not method has been found which can be executed
      */
-    static class _MethodNotFound {
+    static class _MethodNotFound
+    {
     }
 
     /**
@@ -214,7 +297,8 @@
      * @param retVal the retVal which has to be investigated
      * @return true if the retVal is instance of _MethodNotFound false otherwise
      */
-    private static boolean methodNotFound(Object retVal) {
+    private static boolean methodNotFound(Object retVal)
+    {
         return retVal instanceof _MethodNotFound;
     }
 
@@ -228,14 +312,20 @@
      * @param varargs     the list of varargs to be passed to the method
      * @return the result of the invocation, or an object of type _MethodNotFound otherwise
      */
-    static private Object handleInvHandlerMethod(InvocationHandler objToInvoke, String methodName, Collection<Method> methods, Object... varargs) {
-        for (Method m : methods) {
-            if (!m.getName().equals(methodName) || m.getParameterTypes().length != varargs.length) {
+    static private Object handleInvHandlerMethod(InvocationHandler objToInvoke, String methodName, Collection<Method> methods, Object... varargs)
+    {
+        for (Method m : methods)
+        {
+            if (!m.getName().equals(methodName) || m.getParameterTypes().length != varargs.length)
+            {
                 continue;
             }
-            try {
+            try
+            {
                 return objToInvoke.invoke(objToInvoke, m, varargs);
-            } catch (Throwable e) {
+            }
+            catch (Throwable e)
+            {
                 handleException(e);
             }
         }
@@ -251,14 +341,20 @@
      * @param varargs     the list of varargs to be passed to the method
      * @return the result of the invocation, or an object of type _MethodNotFound otherwise
      */
-    static private Object handleObjMethod(Object objToInvoke, String methodName, Collection<Method> methods, Object... varargs) {
-        for (Method m : methods) {
-            if (!m.getName().equals(methodName) || m.getParameterTypes().length != varargs.length) {
+    static private Object handleObjMethod(Object objToInvoke, String methodName, Collection<Method> methods, Object... varargs)
+    {
+        for (Method m : methods)
+        {
+            if (!m.getName().equals(methodName) || m.getParameterTypes().length != varargs.length)
+            {
                 continue;
             }
-            try {
+            try
+            {
                 return m.invoke(objToInvoke, varargs);
-            } catch (Throwable e) {
+            }
+            catch (Throwable e)
+            {
                 handleException(e);
             }
         }
@@ -274,30 +370,42 @@
      * @param varargs     the list of varargs to be passed to the method
      * @return the result of the invocation, or an object of type _MethodNotFound otherwise
      */
-    static private Object handleStaticMethod(Class objToInvoke, String methodName, Collection<Method> methods, Object... varargs) {
-        for (Method m : methods) {
-            if (!m.getName().equals(methodName) || m.getParameterTypes().length != varargs.length) {
+    static private Object handleStaticMethod(Class objToInvoke, String methodName, Collection<Method> methods, Object... varargs)
+    {
+        for (Method m : methods)
+        {
+            if (!m.getName().equals(methodName) || m.getParameterTypes().length != varargs.length)
+            {
                 continue;
             }
-            try {
+            try
+            {
                 return m.invoke(objToInvoke, varargs);
-            } catch (Throwable e) {
+            }
+            catch (Throwable e)
+            {
                 handleException(e);
             }
         }
         return new _MethodNotFound();
     }
 
-    private static void handleException(Throwable e) {
-        if (e instanceof IllegalAccessException) {
-            if (_logger.isLoggable(Level.FINEST)) {
+    private static void handleException(Throwable e)
+    {
+        if (e instanceof IllegalAccessException)
+        {
+            if (_logger.isLoggable(Level.FINEST))
+            {
                 _logger.log(Level.FINEST, "", e);
             }
-        } else if (e instanceof IllegalArgumentException) {
-            if (_logger.isLoggable(Level.FINEST)) {
+        } else if (e instanceof IllegalArgumentException)
+        {
+            if (_logger.isLoggable(Level.FINEST))
+            {
                 _logger.log(Level.FINEST, "", e);
             }
-        } else {
+        } else
+        {
             throw new RuntimeException(e);
         }
     }
@@ -313,26 +421,37 @@
      * @return the result object for the Method(method) call
      * @throws RuntimeException an unmanaged runtime exception in case of an introspection error
      */
-    public static Object fastExecuteMethod(Object obj, String methodName, Object... varargs) {
+    public static Object fastExecuteMethod(Object obj, String methodName, Object... varargs)
+    {
         Class[] classes = new Class[varargs.length];
-        for (int cnt = 0; cnt < varargs.length; cnt++) {
+        for (int cnt = 0; cnt < varargs.length; cnt++)
+        {
 
-            if (varargs[cnt] instanceof Cast) {
+            if (varargs[cnt] instanceof Cast)
+            {
                 classes[cnt] = ((Cast) varargs[cnt]).getClazz();
                 varargs[cnt] = ((Cast) varargs[cnt]).getValue();
-            } else {
+            } else
+            {
                 classes[cnt] = varargs[cnt].getClass();
             }
         }
 
-        try {
+        try
+        {
             Method m = fastGetMethod(obj, methodName, classes);
             return m.invoke(obj, varargs);
-        } catch (NoSuchMethodException e) {
+        }
+        catch (NoSuchMethodException e)
+        {
             throw new RuntimeException(e);
-        } catch (InvocationTargetException e) {
+        }
+        catch (InvocationTargetException e)
+        {
             throw new RuntimeException(e);
-        } catch (IllegalAccessException e) {
+        }
+        catch (IllegalAccessException e)
+        {
             throw new RuntimeException(e);
         }
 
@@ -351,11 +470,15 @@
      * @return the method if found
      * @throws NoSuchMethodException in case it could not be found
      */
-    public static Method fastGetMethod(Object obj, String methodName, Class[] classes) throws NoSuchMethodException {
+    public static Method fastGetMethod(Object obj, String methodName, Class[] classes) throws NoSuchMethodException
+    {
         Method m;
-        try {
+        try
+        {
             m = obj.getClass().getDeclaredMethod(methodName, classes);
-        } catch (NoSuchMethodException e) {
+        }
+        catch (NoSuchMethodException e)
+        {
             m = obj.getClass().getMethod(methodName, classes);
         }
         return m;
@@ -372,36 +495,51 @@
      * @return the result object for the Method(method) call
      * @throws RuntimeException an unmanaged runtime exception in case of an introspection error
      */
-    public static Object fastExecuteStaticMethod(Class obj, String methodName, Object... varargs) {
+    public static Object fastExecuteStaticMethod(Class obj, String methodName, Object... varargs)
+    {
         Class[] classes = new Class[varargs.length];
-        for (int cnt = 0; cnt < varargs.length; cnt++) {
+        for (int cnt = 0; cnt < varargs.length; cnt++)
+        {
 
-            if (varargs[cnt] instanceof Cast) {
+            if (varargs[cnt] instanceof Cast)
+            {
                 classes[cnt] = ((Cast) varargs[cnt]).getClazz();
                 varargs[cnt] = ((Cast) varargs[cnt]).getValue();
-            } else {
+            } else
+            {
                 classes[cnt] = varargs[cnt].getClass();
             }
         }
 
-        try {
+        try
+        {
             Method m = fastGetStaticMethod(obj, methodName, classes);
             return m.invoke(obj, varargs);
-        } catch (NoSuchMethodException e) {
+        }
+        catch (NoSuchMethodException e)
+        {
             throw new RuntimeException(e);
-        } catch (InvocationTargetException e) {
+        }
+        catch (InvocationTargetException e)
+        {
             throw new RuntimeException(e);
-        } catch (IllegalAccessException e) {
+        }
+        catch (IllegalAccessException e)
+        {
             throw new RuntimeException(e);
         }
 
     }
 
-    public static Method fastGetStaticMethod(Class obj, String methodName, Class[] classes) throws NoSuchMethodException {
+    public static Method fastGetStaticMethod(Class obj, String methodName, Class[] classes) throws NoSuchMethodException
+    {
         Method m;
-        try {
+        try
+        {
             m = obj.getDeclaredMethod(methodName, classes);
-        } catch (NoSuchMethodException e) {
+        }
+        catch (NoSuchMethodException e)
+        {
             m = obj.getMethod(methodName, classes);
         }
         return m;
@@ -415,7 +553,8 @@
      * @param value the value object to be used as param
      * @return a Cast object of the parameters
      */
-    public static Cast cast(Class clazz, Object value) {
+    public static Cast cast(Class clazz, Object value)
+    {
         return new Cast(clazz, value);
     }
 
@@ -426,7 +565,8 @@
      * @param clazz the cast target for the method call
      * @return a null value Cast object of the parameters
      */
-    public static Null nullCast(Class clazz) {
+    public static Null nullCast(Class clazz)
+    {
         return new Null(clazz);
     }
 }
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/adapters/handlers/MyFacesBeanHandler.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/adapters/handlers/MyFacesBeanHandler.java
index c9136c2..0116362 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/adapters/handlers/MyFacesBeanHandler.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/adapters/handlers/MyFacesBeanHandler.java
@@ -23,7 +23,6 @@
  * @author Werner Punz (latest modification by $Author$)
  * @version $Revision$ $Date$
  *
- * TODO refactor this out
  */
 
 import org.apache.myfaces.config.RuntimeConfig;
@@ -276,6 +275,12 @@
         return WeavingContext.getInstance().isDynamic(managedBeanClass) && tainted.contains(managedBeanClass.getName());
     }
 
-
+    public  void registerManagedBean(Class clazz, String beanName) {
+        //TODO move this over from the beanimplementationListener
+    }
+    public  void removeManagedBean(String className) {
+        //TODO move this over from the beanimplementationlistener
+    }
+        
 }
 
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/annotation/BeanImplementationListener.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/annotation/BeanImplementationListener.java
index 0f2d99f..ac5811e 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/annotation/BeanImplementationListener.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/annotation/BeanImplementationListener.java
@@ -52,7 +52,6 @@
 
     public void register(Class clazz, java.lang.annotation.Annotation ann) {
 
-        RuntimeConfig config = getRuntimeConfig();
 
         javax.faces.bean.ManagedBean annCasted = (javax.faces.bean.ManagedBean) ann;
 
@@ -64,6 +63,19 @@
         beanName = beanName.replaceAll("\"", "");
         //we need to reregister for every bean due to possible managed prop
         //and scope changes
+        registerManagedBean(clazz, beanName);
+
+    }
+
+    /**
+     * registers a new managed bean into runtime config
+     * @param clazz
+     * @param beanName
+     */
+    protected void registerManagedBean(Class clazz, String beanName)
+    {
+        RuntimeConfig config = getRuntimeConfig();
+
         ManagedBean mbean;
         if (!hasToReregister(beanName, clazz)) {
             mbean = (ManagedBean) _alreadyRegistered.get(beanName);
@@ -73,13 +85,14 @@
         }
 
         mbean.setBeanClass(clazz.getName());
+
+        ReflectUtil.setField(mbean, "beanClass", null, true);
         mbean.setName(beanName);
         handleManagedpropertiesCompiled(mbean, fields(clazz));
         resolveScope(clazz, mbean);
 
         _alreadyRegistered.put(beanName, mbean);
         config.addManagedBean(beanName, mbean);
-
     }
 
     private void resolveScope(Class clazz, ManagedBean mbean) {
@@ -102,7 +115,7 @@
         mbean.setScope(scope);
     }
 
-    private void handleManagedpropertiesCompiled(ManagedBean mbean, Field[] fields) {
+    protected void handleManagedpropertiesCompiled(ManagedBean mbean, Field[] fields) {
         /*since we reprocess the managed properties we can handle them here by clearing them first*/
         mbean.getManagedProperties().clear();
         for (Field field : fields) {
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java
index 494df5d..f8420f4 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/dynamicDecorators/implementations/RenderkitProxy.java
@@ -21,6 +21,7 @@
 import org.apache.myfaces.extensions.scripting.core.api.Decorated;
 import org.apache.myfaces.extensions.scripting.core.api.ScriptingConst;
 import org.apache.myfaces.extensions.scripting.core.api.WeavingContext;
+import org.apache.myfaces.extensions.scripting.core.common.util.ReflectUtil;
 
 import javax.faces.context.ResponseStream;
 import javax.faces.context.ResponseWriter;
@@ -76,24 +77,19 @@
             String name = proxiedObject.getClass().getName();
             while (name.contains("ExtVal") && (name.contains("Wrapper") || name.contains("Proxy")))
             {
-                Field proxiedField = proxiedObject.getClass().getDeclaredField("wrapped");
-                proxiedField.setAccessible(true);
-                proxiedObject = (Renderer) proxiedField.get(proxiedObject);
-
+                proxiedObject = (Renderer)  ReflectUtil.getField(proxiedObject,
+                        "wrapped", true);
                 name = proxiedObject.getClass().getName();
             }
 
             // "getWrapped");
         }
-        catch (IllegalAccessException e)
+        catch (RuntimeException e)
         {
             e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
         }
-        catch (NoSuchFieldException e)
-        {
-            e.printStackTrace();  //To change body of catch statement use File | Settings | File
-            // Templates.
-        }
+
+
         return proxiedObject;
     }
 
@@ -107,23 +103,16 @@
                String name = proxy.getClass().getName();
                while (name.contains("ExtVal") && (name.contains("Wrapper") || name.contains("Proxy")))
                {
-                   Field proxiedField = proxy.getClass().getDeclaredField("wrapped");
-                   proxiedField.setAccessible(true);
                    oldProxiedObject = proxy;
-                   proxy = (Renderer) proxiedField.get(proxy);
+                   proxy = (Renderer) ReflectUtil.getField(proxy,"wrapped", true); //(Renderer) proxiedField.get(proxy);
                    name = proxy.getClass().getName();
                    if(!name.contains("ExtVal") && !(name.contains("Wrapper") || name.contains("Proxy"))) {
-                       proxiedField.set(oldProxiedObject, proxy);
+                       ReflectUtil.setField(oldProxiedObject,"wrapped", proxy, true);
                        return proxy;
                    }
-
                }
            }
-           catch (IllegalAccessException e)
-           {
-               e.printStackTrace();
-           }
-           catch (NoSuchFieldException e)
+           catch (RuntimeException e)
            {
                e.printStackTrace();
            }
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/startup/RefreshPhaseListener.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/startup/RefreshPhaseListener.java
index 5ab9b57..66232eb 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/startup/RefreshPhaseListener.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/jsf/startup/RefreshPhaseListener.java
@@ -50,8 +50,8 @@
         Map<Object, Object> params = context.getAttributes();
         if(params.containsKey("ANN_PROCESSED")) return;
         else params.put("ANN_PROCESSED", Boolean.TRUE);
-        WeavingContext.getInstance().annotationScan();
         WeavingContext.getInstance().getImplementationSPI().refreshManagedBeans();
+        WeavingContext.getInstance().annotationScan();
     }
 
     @Override
diff --git a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy
index 97f1d9d..f164bd6 100644
--- a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy
+++ b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService.groovy
@@ -23,9 +23,6 @@
 import javax.faces.bean.ManagedBean
 
 
-
-@ManagedBean(name = "blogService")
-@ApplicationScoped
 public class BlogService {
   List blogEntries = new ArrayList()
 
diff --git a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy
index f1d7920..a7d59fc 100644
--- a/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy
+++ b/extscript-examples/myfaces20-example/src/main/webapp/WEB-INF/groovy/org/apache/myfaces/groovyloader/blog/BlogService2.groovy
@@ -24,6 +24,8 @@
 
 
 
+@ManagedBean(name = "blogService")
+@ApplicationScoped
 public class BlogService2 {
   List blogEntries = new ArrayList()
 
