Index: core/xwiki-core/src/test/java/com/xpn/xwiki/render/DefaultXWikiRenderingEngineTest.java
===================================================================
--- core/xwiki-core/src/test/java/com/xpn/xwiki/render/DefaultXWikiRenderingEngineTest.java	(revision 29400)
+++ core/xwiki-core/src/test/java/com/xpn/xwiki/render/DefaultXWikiRenderingEngineTest.java	(working copy)
@@ -20,6 +20,7 @@
  */
 package com.xpn.xwiki.render;
 
+import java.util.ArrayList;
 import java.io.ByteArrayInputStream;
 
 import javax.servlet.ServletContext;
@@ -33,6 +34,8 @@
 import com.xpn.xwiki.test.AbstractBridgedXWikiComponentTestCase;
 import com.xpn.xwiki.web.Utils;
 import com.xpn.xwiki.web.XWikiServletContext;
+import com.xpn.xwiki.user.api.XWikiRightService;
+import com.xpn.xwiki.user.impl.xwiki.XWikiRightServiceImpl;
 
 /**
  * Unit tests for {@link DefaultXWikiRenderingEngine}.
@@ -43,6 +46,8 @@
 {
     private DefaultXWikiRenderingEngine engine;
 
+    private XWiki xwiki;
+
     /**
      * {@inheritDoc}
      * 
@@ -65,7 +70,7 @@
             returnValue(new ByteArrayInputStream("".getBytes())));
         XWikiServletContext engineContext = new XWikiServletContext((ServletContext) mockServletContext.proxy());
 
-        XWiki xwiki = new XWiki(config, getContext(), engineContext, false)
+        xwiki = new XWiki(config, getContext(), engineContext, false)
         {
             public String getSkin(XWikiContext context)
             {
@@ -86,6 +91,17 @@
             {
 
             }
+
+            public XWikiRightService getRightService()
+            {
+                return new XWikiRightServiceImpl()
+                {
+                    public boolean hasProgrammingRights(XWikiDocument doc, XWikiContext context)
+                    {
+                        return true;
+                    }
+                };
+            }
         };
         xwiki.setVersion("1.0");
 
@@ -95,6 +111,9 @@
         xwiki.getConfig().setProperty("xwiki.render.velocity.macrolist", "");
 
         this.engine = (DefaultXWikiRenderingEngine) xwiki.getRenderingEngine();
+
+        // Make sure the wiki in the context will say that we have programming permission.
+        getContext().setWiki(this.xwiki);
     }
 
     public void testRenderTextWhenUsingCodeMacro() throws Exception
@@ -135,4 +154,46 @@
         String out = engine.renderText(text, document, getContext());
         assertTrue(out.contains(link));
     }
+
+    public void testRenderGroovy() throws Exception
+    {
+        assertEquals("hello world", engine.renderText("<% println(\"hello world\"); %>", document, getContext()));
+    }
+
+    public void testSwitchOrderOfRenderers() throws Exception
+    {
+        String text = "#set($x = '<' + '% println(\"hello world\"); %' + '>')\n$x";
+        String velocityFirst = "hello world";
+        String groovyFirst = "<% println(\"hello world\"); %>";
+
+        XWikiDocument document = new XWikiDocument();
+
+        // Prove that the renderers are in the right order by default.
+        assertEquals(engine.getRendererNames(), new ArrayList<String>(){{
+            add("mapping");
+            add("velocity");
+            add("groovy");
+            add("plugin");
+            add("wiki");
+            add("xwiki");
+        }});
+
+        assertEquals(velocityFirst, engine.renderText(text, document, getContext()));
+
+        xwiki.getConfig().put("xwiki.render.renderingorder",
+                              "macromapping, groovy, velocity, plugin, wiki, wikiwiki");
+
+        DefaultXWikiRenderingEngine myEngine = new DefaultXWikiRenderingEngine(xwiki, getContext());
+
+        assertEquals(myEngine.getRendererNames(), new ArrayList<String>(){{
+            add("mapping");
+            add("groovy");
+            add("velocity");
+            add("plugin");
+            add("wiki");
+            add("xwiki");
+        }});
+
+        assertEquals(groovyFirst, myEngine.renderText(text, document, getContext()));
+    }
 }
Index: core/xwiki-core/src/main/java/com/xpn/xwiki/render/DefaultXWikiRenderingEngine.java
===================================================================
--- core/xwiki-core/src/main/java/com/xpn/xwiki/render/DefaultXWikiRenderingEngine.java	(revision 29400)
+++ core/xwiki-core/src/main/java/com/xpn/xwiki/render/DefaultXWikiRenderingEngine.java	(working copy)
@@ -49,6 +49,10 @@
 {
     private static final Log LOG = LogFactory.getLog(XWikiRenderingEngine.class);
 
+    /** The default order in which the rendering engines will be run on the input. */
+    private final String[] defaultRenderingOrder =
+        new String[]{"macromapping", "velocity", "groovy", "plugin", "wiki", "wikiwiki"};
+
     private List<XWikiRenderer> renderers = new ArrayList<XWikiRenderer>();
 
     private HashMap<String, XWikiRenderer> renderermap = new LinkedHashMap<String, XWikiRenderer>();
@@ -57,25 +61,41 @@
 
     public DefaultXWikiRenderingEngine(XWiki xwiki, XWikiContext context) throws XWikiException
     {
-        if (xwiki.Param("xwiki.render.macromapping", "1").equals("1")) {
-            addRenderer("mapping", new XWikiMacrosMappingRenderer(xwiki, context));
+        String[] renderingOrder = xwiki.getConfig().getPropertyAsList("xwiki.render.renderingorder");
+        if (renderingOrder == null || renderingOrder.length == 0) {
+            renderingOrder = defaultRenderingOrder;
         }
-        // addRenderer(new XWikiJSPRenderer());
-        if (xwiki.Param("xwiki.render.velocity", "1").equals("1")) {
-            addRenderer("velocity", new XWikiVelocityRenderer());
+
+        for (int i = 0; i < renderingOrder.length; i++) {
+            if (xwiki.Param("xwiki.render." + renderingOrder[i], "1").equals("1")) {
+
+                if (renderingOrder[i].equals("macromapping")) {
+                    addRenderer("mapping", new XWikiMacrosMappingRenderer(xwiki, context));
+
+                } else if (renderingOrder[i].equals("velocity")) {
+                    addRenderer("velocity", new XWikiVelocityRenderer());
+
+                } else if (renderingOrder[i].equals("groovy")) {
+                    addRenderer("groovy", new XWikiGroovyRenderer());
+
+                } else if (renderingOrder[i].equals("plugin")) {
+                    addRenderer("plugin", new XWikiPluginRenderer());
+
+                } else if (renderingOrder[i].equals("wiki")) {
+                    addRenderer("wiki", new XWikiRadeoxRenderer(false));
+
+                } else if (renderingOrder[i].equals("wikiwiki")) {
+                    if (xwiki.Param("xwiki.render.wikiwiki", "0").equals("1")) {
+                        addRenderer("xwiki", new XWikiWikiBaseRenderer(true, true));
+                    } else {
+                        addRenderer("xwiki", new XWikiWikiBaseRenderer(false, true));
+                    }
+                }
+            }
         }
-        if (xwiki.Param("xwiki.render.groovy", "1").equals("1")) {
-            addRenderer("groovy", new XWikiGroovyRenderer());
-        }
-        if (xwiki.Param("xwiki.render.plugin", "1").equals("1")) {
-            addRenderer("plugin", new XWikiPluginRenderer());
-        }
-        if (xwiki.Param("xwiki.render.wiki", "1").equals("1")) {
-            addRenderer("wiki", new XWikiRadeoxRenderer(false));
-        }
-        if (xwiki.Param("xwiki.render.wikiwiki", "0").equals("1")) {
-            addRenderer("xwiki", new XWikiWikiBaseRenderer(true, true));
-        } else {
+
+        // If there is no wikiwiki renderer, we must add it because it's the base renderer
+        if (renderermap.get("xwiki") == null) {
             addRenderer("xwiki", new XWikiWikiBaseRenderer(false, true));
         }
 
Index: tools/xwiki-configuration-resources/src/main/resources/xwiki.cfg.vm
===================================================================
--- tools/xwiki-configuration-resources/src/main/resources/xwiki.cfg.vm	(revision 29400)
+++ tools/xwiki-configuration-resources/src/main/resources/xwiki.cfg.vm	(working copy)
@@ -307,6 +307,11 @@
 #-# Simple wiki syntax rendering 
 # xwiki.render.wikiwiki=0
 
+#-# Rendering order: content will be rendered by the first renderer on the list, output rendered by the second, etc.
+#-# Default: macromapping, velocity, groovy, plugin, wiki, wikiwiki
+#-# To protect against velocity content becomming groovy code, it is recommended to leave the following line active.
+xwiki.render.renderingorder=macromapping, groovy, velocity, plugin, wiki, wikiwiki
+
 #-# Maximum number of documents to keep in the rendered cache
 # xwiki.render.cache.capacity=100
 
