diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/macro/code/CodeMacro.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/macro/code/CodeMacro.java
index ae64a0cba773b2c2012aec25dd4ae98852a4576f..e8191bfd9dc5b917af7cbd2d48964d6463b6e503 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/macro/code/CodeMacro.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/macro/code/CodeMacro.java
@@ -27,7 +27,7 @@
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.xwiki.component.annotation.Component;
 import org.xwiki.component.manager.ComponentLookupException;
@@ -45,172 +45,113 @@
 /**
  * Highlight provided content depending of the content syntax.
  * 
- * @version $Id$der(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
-    }
-}uage(), new StringReader(content));
+ * @version $Id$
+ * @since 1.7RC1
+ */
+@Component
+@Named("code")
+@Singleton
+public class CodeMacro extends AbstractBoxMacro<CodeMacroParameters>
+{
+    /**
+     * The description of the macro.
+     */
+    private static final String DESCRIPTION = "Highlights code snippets of various programming languages";
+
+    /**
+     * Used to indicate that content should not be highlighted.
+     */
+    private static final String LANGUAGE_NONE = "none";
+
+    /**
+     * The description of the macro content.
+     */
+    private static final String CONTENT_DESCRIPTION = "the content to highlight";
+
+    /**
+     * Used to parse content when language="none".
+     */
+    @Inject
+    @Named("plain/1.0")
+    private Parser plainTextParser;
+
+    /**
+     * Used to lookup highlight parsers.
+     */
+    @Inject
+    private ComponentManager componentManager;
+
+    /**
+     * The logger to log.
+     */
+    @Inject
+    private Logger logger;
+
+    /**
+     * Create and initialize the descriptor of the macro.
+     */
+    public CodeMacro()
+    {
+        super("Code", DESCRIPTION, new DefaultContentDescriptor(CONTENT_DESCRIPTION), CodeMacroParameters.class);
+        setDefaultCategory(DEFAULT_CATEGORY_FORMATTING);
     }
-}uage(), new StringReader(content));
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.xwiki.rendering.internal.macro.box.DefaultBoxMacro#parseContent(org.xwiki.rendering.macro.box.BoxMacroParameters,
+     *      java.lang.String, org.xwiki.rendering.transformation.MacroTransformationContext)
+     */
+    @Override
+    protected List<Block> parseContent(CodeMacroParameters parameters, String content,
+        MacroTransformationContext context) throws MacroExecutionException
+    {
+        List<Block> result;
+        try {
+            if (LANGUAGE_NONE.equalsIgnoreCase(parameters.getLanguage())) {
+                if (StringUtils.isEmpty(content)) {
+                    result = Collections.emptyList();
+                } else {
+                    result = this.plainTextParser.parse(new StringReader(content)).getChildren().get(0).getChildren();
+                }
+            } else {
+                result = highlight(parameters, content);
+            }
+        } catch (Exception e) {
+            throw new MacroExecutionException("Failed to highlight content", e);
+        }
+
+        return result;
     }
-}uage(), new StringReader(content));
+
+    /**
+     * Return a highlighted version of the provided content.
+     * 
+     * @param parameters the code macro parameters.
+     * @param content the content to highlight.
+     * @return the highlighted version of the provided content.
+     * @throws ParseException the highlight parser failed.
+     * @throws ComponentLookupException failed to find highlight parser for provided language.
+     */
+    protected List<Block> highlight(CodeMacroParameters parameters, String content) throws ParseException,
+        ComponentLookupException
+    {
+        HighlightParser parser;
+
+        if (parameters.getLanguage() != null) {
+            try {
+                parser = this.componentManager.lookup(HighlightParser.class, parameters.getLanguage());
+                return parser.highlight(parameters.getLanguage(), new StringReader(content));
+            } catch (ComponentLookupException e) {
+                this.logger.debug(
+                    "Can't find specific highlighting parser for language [" + parameters.getLanguage() + "]", e);
+            }
+        }
+
+        this.logger.debug("Trying the default highlighting parser");
+
+        parser = this.componentManager.lookup(HighlightParser.class, "default");
+
+        return parser.highlight(parameters.getLanguage(), new StringReader(content));
     }
 }
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/parser/pygments/BlocksGeneratorPygmentsListener.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/parser/pygments/BlocksGeneratorPygmentsListener.java
index 98c0e6eb4f1ef2ce28ee87d2dec13beb77175515..2f75b847cf6b7c8dcf355eaee88ad014a988a8a7 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/parser/pygments/BlocksGeneratorPygmentsListener.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/parser/pygments/BlocksGeneratorPygmentsListener.java
@@ -26,7 +26,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.python.core.PyNone;
 import org.xwiki.rendering.block.Block;
 import org.xwiki.rendering.block.FormatBlock;
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/parser/pygments/PygmentsParser.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/parser/pygments/PygmentsParser.java
index 8231678a4d36b96df6231d07df771ccb8a540e29..5ad404ccb28b1db7a86763987f8ec4a92cf0da8b 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/parser/pygments/PygmentsParser.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-code/src/main/java/org/xwiki/rendering/internal/parser/pygments/PygmentsParser.java
@@ -29,7 +29,7 @@
 import javax.inject.Inject;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.python.core.Py;
 import org.python.core.PyObject;
 import org.python.core.PyUnicode;
@@ -271,7 +271,7 @@ private PyObject getLexer(String language)
     {
         PythonInterpreter interpreter = getPythonInterpreter();
 
-        if (StringUtils.isNotEmpty(language)) {
+        if (!StringUtils.isEmpty(language)) {
             interpreter.exec(MessageFormat.format(PY_LEXER_CREATE, language));
         } else {
             interpreter.exec(PY_LEXER_FIND);
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-container/src/main/java/org/xwiki/rendering/internal/macro/container/ColumnsLayoutManager.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-container/src/main/java/org/xwiki/rendering/internal/macro/container/ColumnsLayoutManager.java
index d190bd845ddb181ff412c748a04306b8e7cc198c..f0549cc51bb053b401bd3b5c562c4118abfa0351 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-container/src/main/java/org/xwiki/rendering/internal/macro/container/ColumnsLayoutManager.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-container/src/main/java/org/xwiki/rendering/internal/macro/container/ColumnsLayoutManager.java
@@ -23,7 +23,7 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.xwiki.component.annotation.Component;
 import org.xwiki.component.annotation.Requirement;
 import org.xwiki.rendering.block.Block;
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-container/src/main/java/org/xwiki/rendering/macro/container/AbstractContainerMacro.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-container/src/main/java/org/xwiki/rendering/macro/container/AbstractContainerMacro.java
index d426f40648655bc46511262d4e29319dad9cf467..7f3c467b76b64db832c41948b2797d0a65f00d95 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-container/src/main/java/org/xwiki/rendering/macro/container/AbstractContainerMacro.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-container/src/main/java/org/xwiki/rendering/macro/container/AbstractContainerMacro.java
@@ -26,7 +26,7 @@
 
 import javax.inject.Inject;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.xwiki.component.manager.ComponentLookupException;
 import org.xwiki.component.manager.ComponentManager;
 import org.xwiki.rendering.block.Block;
@@ -100,7 +100,7 @@ public List<Block> execute(P parameters, String content, MacroTransformationCont
         }
 
         // add the css class, if any, to the container root
-        if (StringUtils.isNotEmpty(parameters.getCssClass())) {
+        if (!StringUtils.isEmpty(parameters.getCssClass())) {
             containerRoot.setParameter(CLASS_ATTRIBUTE, parameters.getCssClass());
         }
 
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-dashboard/src/main/java/org/xwiki/rendering/internal/macro/dashboard/DashboardMacro.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-dashboard/src/main/java/org/xwiki/rendering/internal/macro/dashboard/DashboardMacro.java
index eafeadfc18ac19b876852afd96e42119079ea372..ad34625efea7e8bea5ac531bc74582fc75236ac9 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-dashboard/src/main/java/org/xwiki/rendering/internal/macro/dashboard/DashboardMacro.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-dashboard/src/main/java/org/xwiki/rendering/internal/macro/dashboard/DashboardMacro.java
@@ -28,7 +28,7 @@
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.xwiki.component.annotation.Component;
 import org.xwiki.component.manager.ComponentLookupException;
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-dashboard/src/main/java/org/xwiki/rendering/internal/macro/dashboard/DefaultGadgetSource.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-dashboard/src/main/java/org/xwiki/rendering/internal/macro/dashboard/DefaultGadgetSource.java
index 3e860c9a21ddc422d77d09e05d70b3f9b83ae3bd..50c38d2737976e69afa4ada2e0e96a2d807f8bc2 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-dashboard/src/main/java/org/xwiki/rendering/internal/macro/dashboard/DefaultGadgetSource.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-dashboard/src/main/java/org/xwiki/rendering/internal/macro/dashboard/DefaultGadgetSource.java
@@ -25,7 +25,7 @@
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.velocity.VelocityContext;
 import org.xwiki.component.annotation.Component;
 import org.xwiki.component.annotation.Requirement;
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/internal/macro/rss/DefaultRomeFeedFactory.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/internal/macro/rss/DefaultRomeFeedFactory.java
index 9ddd162dfd4526a970846bff81f6de173f20d1c0..e631eb4b3e7554d25d739d1b4e2cd94727cd1089 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/internal/macro/rss/DefaultRomeFeedFactory.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/internal/macro/rss/DefaultRomeFeedFactory.java
@@ -25,7 +25,7 @@
 
 import org.xwiki.rendering.macro.MacroExecutionException;
 import org.xwiki.rendering.macro.rss.RssMacroParameters;
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 
 import com.sun.syndication.feed.synd.SyndFeed;
 import com.sun.syndication.io.SyndFeedInput;
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/internal/macro/rss/RssMacro.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/internal/macro/rss/RssMacro.java
index 9885b086791052f57a61183ecd065a3e20550476..6fb2e839d5f50fef44615c2e6551820abbb0561a 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/internal/macro/rss/RssMacro.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/internal/macro/rss/RssMacro.java
@@ -28,7 +28,7 @@
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.xwiki.bridge.SkinAccessBridge;
 import org.xwiki.component.annotation.Component;
 import org.xwiki.rendering.block.Block;
@@ -137,7 +137,7 @@ public List<Block> execute(RssMacroParameters parameters, String content, MacroT
         boolean hasImage = parameters.isImage() && (feed.getImage() != null);
         boxParameters.setCssClass("rssfeed");
 
-        if (StringUtils.isNotEmpty(parameters.getWidth())) {
+        if (!StringUtils.isEmpty(parameters.getWidth())) {
             boxParameters.setWidth(parameters.getWidth());
         }
 
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/macro/rss/RssMacroParameters.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/macro/rss/RssMacroParameters.java
index b14642b4a443d6d914d6387ecdd6b383a908958f..4771b50fd3febeaa714a59d9c7ac1f4370fef0ce 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/macro/rss/RssMacroParameters.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-rss/src/main/java/org/xwiki/rendering/macro/rss/RssMacroParameters.java
@@ -23,7 +23,7 @@
 import java.net.MalformedURLException;
 import java.net.URL;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.xwiki.properties.annotation.PropertyDescription;
 import org.xwiki.properties.annotation.PropertyMandatory;
 import org.xwiki.rendering.macro.parameter.MacroParameterException;
@@ -31,145 +31,137 @@
 /**
  * Parameters for the {@link org.xwiki.rendering.internal.macro.rss.RssMacro} Macro.
  * 
- * @version $Id$contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
-    {
-        return this.contensContent()
+ * @version $Id$
+ * @since 1.8RC1
+ */
+public class RssMacroParameters
+{
+    /**
+     * The URL of the RSS feed.
+     */
+    private String feed;
+
+    /**
+     * If "true" displays the content of each feed in addition to the feed item link.
+     */
+    private boolean content;
+
+    /**
+     * The number of feed items to display.
+     */
+    private int count = 10;
+
+    /**
+     * If "true" and if the feed has an image, display it.
+     */
+    private boolean image;
+
+    /**
+     * The width of the enclosing box containing the RSS macro output.
+     */
+    private String width = StringUtils.EMPTY;
+
+    /**
+     * The RSS feed URL.
+     */
+    private URL feedURL;
+
+    /**
+     * @return the RSS feed URL.
+     */
+    public String getFeed()
     {
-        return this.contensContent()
+        return feed;
+    }
+
+    /**
+     * @param feed the RSS feed URL.
+     * @throws MacroParameterException if the feed URL is malformed.
+     */
+    @PropertyMandatory
+    @PropertyDescription("URL of the RSS feed")
+    public void setFeed(String feed) throws MacroParameterException
+    {
+        this.feed = feed;
+        try {
+            this.feedURL = new java.net.URL(feed);
+        } catch (MalformedURLException ex) {
+            throw new MacroParameterException("Malformed feed URL", ex);
+        }
+    }
+
+    /**
+     * @param image whether to display the feed's image.
+     */
+    @PropertyDescription("If the feeds has an image associated, display it?")
+    public void setImage(boolean image)
     {
-        return this.contensContent()
+        this.image = image;
+    }
+
+    /**
+     * @return whether to display the feed's image.
+     */
+    public boolean isImage()
     {
-        return this.contensContent()
+        return image;
+    }
+
+    /**
+     * @param width the width of the RSS box, that will dismiss potential CSS rules defining its default value.
+     */
+    @PropertyDescription("The width, in px or %, of the box containing the RSS output (default is 30%)")
+    public void setWidth(String width)
     {
-        return this.contensContent()
+        this.width = width;
+    }
+
+    /**
+     * @return the width of the RSS box, that will dismiss potential CSS rules defining its default value.
+     */
+    public String getWidth()
     {
-        return this.contensContent()
+        return this.width;
+    }
+
+    /**
+     * @param count the number of feed items to display.
+     */
+    @PropertyDescription("The maximum number of feed items to display on the page.")
+    public void setCount(int count)
     {
-        return this.contensContent()
+        this.count = count;
+    }
+
+    /**
+     * @return the number of feed items to display.
+     */
+    public int getCount()
     {
-        return this.contensContent()
+        return count;
+    }
+
+    /**
+     * @return the feed's URL
+     */
+    public URL getFeedURL()
     {
-        return this.contensContent()
+        return feedURL;
+    }
+
+    /**
+     * @param content if "true" displays the content of each feed in addition to the feed item link
+     */
+    @PropertyDescription("Display content for feed entries")
+    public void setContent(boolean content)
     {
-        return this.contensContent()
+        this.content = content;
+    }
+
+    /**
+     * @return true if the content of each feed should be displayed
+     */
+    public boolean isContent()
     {
         return this.content;
     }
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/internal/macro/script/DefaultAttachmentClassLoaderFactory.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/internal/macro/script/DefaultAttachmentClassLoaderFactory.java
index f804a9f874195224b698dd7404cf3dcc570f1b00..562d88507b5da5ce734859b4f12d6da8f7f34628 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/internal/macro/script/DefaultAttachmentClassLoaderFactory.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/internal/macro/script/DefaultAttachmentClassLoaderFactory.java
@@ -33,7 +33,7 @@
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.xwiki.classloader.ExtendedURLClassLoader;
 import org.xwiki.classloader.ExtendedURLStreamHandler;
 import org.xwiki.classloader.URIClassLoader;
@@ -107,7 +107,7 @@ private Set<URI> extractURIs(String jarURLs) throws URISyntaxException
     {
         // Parse the passed JAR URLs to tokenize it.
         Set<URI> uris = new LinkedHashSet<URI>();
-        if (StringUtils.isNotEmpty(jarURLs)) {
+        if (!StringUtils.isEmpty(jarURLs)) {
             StringTokenizer tokenizer = new StringTokenizer(jarURLs, ",");
             while (tokenizer.hasMoreElements()) {
                 String token = tokenizer.nextToken().trim();
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/internal/macro/script/ScriptClassLoaderHandlerListener.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/internal/macro/script/ScriptClassLoaderHandlerListener.java
index 5242ba158abf593987036d8381208390f76b47cf..6d96687a8f8933f0b1143f30e32eadf9f2383c07 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/internal/macro/script/ScriptClassLoaderHandlerListener.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/internal/macro/script/ScriptClassLoaderHandlerListener.java
@@ -26,7 +26,7 @@
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.xwiki.bridge.DocumentAccessBridge;
 import org.xwiki.classloader.ExtendedURLClassLoader;
 import org.xwiki.component.annotation.Component;
@@ -172,7 +172,7 @@ private ClassLoader findClassLoader(String jarsParameterValue, ClassLoader paren
             (ExtendedURLClassLoader) this.execution.getContext().getProperty(EXECUTION_CONTEXT_CLASSLOADER_KEY);
 
         if (cl == null) {
-            if (StringUtils.isNotEmpty(jarsParameterValue)) {
+            if (!StringUtils.isEmpty(jarsParameterValue)) {
                 cl = createOrExtendClassLoader(true, jarsParameterValue, parent);
             } else {
                 cl = this.attachmentClassLoaderFactory.createAttachmentClassLoader("", parent);
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/macro/script/AbstractJSR223ScriptMacro.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/macro/script/AbstractJSR223ScriptMacro.java
index 30abaaa2a5d00853c08839749ce94260b4067d5e..b5d586e5a1f80c8a132ea4b390b1236115520c16 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/macro/script/AbstractJSR223ScriptMacro.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/macro/script/AbstractJSR223ScriptMacro.java
@@ -33,7 +33,7 @@
 import javax.script.ScriptEngineManager;
 import javax.script.ScriptException;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.xwiki.context.ExecutionContext;
 import org.xwiki.rendering.block.Block;
 import org.xwiki.rendering.block.XDOM;
@@ -46,671 +46,251 @@
  * Base Class for script evaluation macros based on JSR223.
  * 
  * @param <P> the type of macro parameters bean.
- * @version $Id$urn engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
-
-        return engine.compile(content);
-g
+ * @version $Id$
+ * @since 1.7M3
+ */
+public abstract class AbstractJSR223ScriptMacro<P extends JSR223ScriptMacroParameters> extends AbstractScriptMacro<P>
+    implements PrivilegedScriptMacro
+{
+    /**
+     * Key under which the Script Engines are saved in the Execution Context, see {@link #execution}.
+     */
+    private static final String EXECUTION_CONTEXT_ENGINE_KEY = "scriptEngines";
+
+    /**
+     * Used to get the current script context to give to script engine evaluation method.
+     */
+    @Inject
+    private ScriptContextManager scriptContextManager;
+
+    /**
+     * @param macroName the name of the macro (eg "groovy")
+     */
+    public AbstractJSR223ScriptMacro(String macroName)
+    {
+        super(macroName, null, JSR223ScriptMacroParameters.class);
+    }
 
-        return engine.compile(content);
-g
+    /**
+     * @param macroName the name of the macro (eg "groovy")
+     * @param macroDescription the text description of the macro.
+     */
+    public AbstractJSR223ScriptMacro(String macroName, String macroDescription)
+    {
+        super(macroName, macroDescription, JSR223ScriptMacroParameters.class);
+    }
 
-        return engine.compile(content);
-g
+    /**
+     * @param macroName the name of the macro (eg "groovy")
+     * @param macroDescription the text description of the macro.
+     * @param contentDescriptor the description of the macro content.
+     */
+    public AbstractJSR223ScriptMacro(String macroName, String macroDescription, ContentDescriptor contentDescriptor)
+    {
+        super(macroName, macroDescription, contentDescriptor, JSR223ScriptMacroParameters.class);
+    }
 
-        return engine.compile(content);
-g
+    /**
+     * @param macroName the name of the macro (eg "groovy")
+     * @param macroDescription the text description of the macro.
+     * @param parametersBeanClass class of the parameters bean for this macro.
+     */
+    public AbstractJSR223ScriptMacro(String macroName, String macroDescription,
+        Class< ? extends JSR223ScriptMacroParameters> parametersBeanClass)
+    {
+        super(macroName, macroDescription, parametersBeanClass);
+    }
 
-        return engine.compile(content);
-g
+    /**
+     * @param macroName the name of the macro (eg "groovy")
+     * @param macroDescription the text description of the macro.
+     * @param contentDescriptor the description of the macro content.
+     * @param parametersBeanClass class of the parameters bean for this macro.
+     */
+    public AbstractJSR223ScriptMacro(String macroName, String macroDescription, ContentDescriptor contentDescriptor,
+        Class< ? extends JSR223ScriptMacroParameters> parametersBeanClass)
+    {
+        super(macroName, macroDescription, contentDescriptor, parametersBeanClass);
+    }
 
-        return engine.compile(content);
-g
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.xwiki.rendering.macro.Macro#supportsInlineMode()
+     */
+    public boolean supportsInlineMode()
+    {
+        return true;
+    }
 
-        return engine.compile(content);
-g
+    /**
+     * Method to overwrite to indicate the script engine name.
+     * 
+     * @param parameters the macro parameters.
+     * @param context the context of the macro transformation.
+     * @return the name of the script engine to use.
+     */
+    protected String getScriptEngineName(P parameters, MacroTransformationContext context)
+    {
+        return context.getCurrentMacroBlock().getId().toLowerCase();
+    }
 
-        return engine.compile(content);
-g
+    /**
+     * Get the current ScriptContext and refresh it.
+     * 
+     * @return the script context.
+     */
+    protected ScriptContext getScriptContext()
+    {
+        return this.scriptContextManager.getScriptContext();
+    }
 
-        return engine.compile(content);
-g
+    /**
+     * {@inheritDoc}
+     * 
+     * @see AbstractScriptMacro#evaluate(ScriptMacroParameters, String, MacroTransformationContext)
+     */
+    @Override
+    protected List<Block> evaluateBlock(P parameters, String content, MacroTransformationContext context)
+        throws MacroExecutionException
+    {
+        if (StringUtils.isEmpty(content)) {
+            return Collections.emptyList();
+        }
+
+        String engineName = getScriptEngineName(parameters, context);
+
+        List<Block> result;
+        if (engineName != null) {
+            try {
+                ScriptEngine engine = getScriptEngine(engineName);
+
+                if (engine != null) {
+                    result = evaluateBlock(engine, parameters, content, context);
+                } else {
+                    throw new MacroExecutionException("Can't find script engine with name [" + engineName + "]");
+                }
+            } catch (ScriptException e) {
+                throw new MacroExecutionException("Failed to evaluate Script Macro for content [" + content + "]", e);
+            }
+
+        } else {
+            // If no language identifier is provided, don't evaluate content
+            result = parseScriptResult(content, parameters, context);
+        }
+
+        return result;
+    }
 
-        return engine.compile(content);
-g
+    /**
+     * Execute provided script and return {@link Block} based result.
+     * 
+     * @param engine the script engine to use to evaluate the script.
+     * @param parameters the macro parameters.
+     * @param content the script to execute.
+     * @param context the context of the macro transformation.
+     * @return the result of script execution.
+     * @throws ScriptException failed to evaluate script
+     * @throws MacroExecutionException failed to evaluate provided content.
+     */
+    protected List<Block> evaluateBlock(ScriptEngine engine, P parameters, String content,
+        MacroTransformationContext context) throws ScriptException, MacroExecutionException
+    {
+        List<Block> result;
+
+        ScriptContext scriptContext = getScriptContext();
+
+        StringWriter stringWriter = new StringWriter();
+
+        // set writer in script context
+        scriptContext.setWriter(stringWriter);
+
+        try {
+            Object scriptResult = eval(content, engine, scriptContext);
+
+            if (scriptResult instanceof XDOM) {
+                result = ((XDOM) scriptResult).getChildren();
+            } else if (scriptResult instanceof Block) {
+                result = Collections.singletonList((Block) scriptResult);
+            } else if (scriptResult instanceof List && !((List< ? >) scriptResult).isEmpty()
+                && ((List< ? >) scriptResult).get(0) instanceof Block) {
+                result = (List<Block>) scriptResult;
+            } else {
+                // Run the wiki syntax parser on the script-rendered content
+                result = parseScriptResult(stringWriter.toString(), parameters, context);
+            }
+        } finally {
+            // remove writer script from context
+            scriptContext.setWriter(null);
+        }
+
+        return result;
+    }
 
-        return engine.compile(content);
-g
+    /**
+     * @param engineName the script engine name (eg "groovy", etc)
+     * @return the Script engine to use to evaluate the script
+     * @throws MacroExecutionException in case of an error in parsing the jars parameter
+     */
+    private ScriptEngine getScriptEngine(String engineName) throws MacroExecutionException
+    {
+        // Look for a script engine in the Execution Context since we want the same engine to be used
+        // for all evals during the same execution lifetime.
+        // We must use the same engine because that engine may create an internal ClassLoader in which
+        // it loads new classes defined in the script and if we create a new engine then defined classes
+        // will be lost.
+        // However we also need to be able to execute several script Macros during a single execution request
+        // and for example the second macro could have jar parameters. In order to support this use case
+        // we ensure in AbstractScriptMacro to reuse the same thread context ClassLoader during the whole
+        // request execution.
+        ExecutionContext executionContext = this.execution.getContext();
+        Map<String, ScriptEngine> scriptEngines =
+            (Map<String, ScriptEngine>) executionContext.getProperty(EXECUTION_CONTEXT_ENGINE_KEY);
+        if (scriptEngines == null) {
+            scriptEngines = new HashMap<String, ScriptEngine>();
+            executionContext.setProperty(EXECUTION_CONTEXT_ENGINE_KEY, scriptEngines);
+        }
+        ScriptEngine engine = scriptEngines.get(engineName);
+
+        if (engine == null) {
+            ScriptEngineManager sem = new ScriptEngineManager();
+            engine = sem.getEngineByName(engineName);
+            scriptEngines.put(engineName, engine);
+        }
+
+        return engine;
+    }
 
-        return engine.compile(content);
-g
+    /**
+     * Execute the script.
+     * 
+     * @param content the script to be executed by the script engine
+     * @param engine the script engine
+     * @param scriptContext the script context
+     * @return The value returned from the execution of the script.
+     * @throws ScriptException if an error occurrs in script. ScriptEngines should create and throw
+     *             <code>ScriptException</code> wrappers for checked Exceptions thrown by underlying scripting
+     *             implementations.
+     */
+    protected Object eval(String content, ScriptEngine engine, ScriptContext scriptContext) throws ScriptException
+    {
+        return engine.eval(content, scriptContext);
+    }
 
-        return engine.compile(content);
-g
+    // /////////////////////////////////////////////////////////////////////
+    // Compiled scripts management
+
+    /**
+     * Return a compiled version of the provided script.
+     * 
+     * @param content the script to compile.
+     * @param engine the script engine.
+     * @return the compiled version of the script.
+     * @throws ScriptException failed to compile the script.
+     */
+    protected CompiledScript getCompiledScript(String content, Compilable engine) throws ScriptException
+    {
+        // TODO: add caching
 
         return engine.compile(content);
     }
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/macro/script/AbstractScriptMacro.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/macro/script/AbstractScriptMacro.java
index 63cc36b93e22bb372894214654149d2d0a04e941..0730b214f1ef1694cb8b582b38cf58c663843537 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/macro/script/AbstractScriptMacro.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-script/src/main/java/org/xwiki/rendering/macro/script/AbstractScriptMacro.java
@@ -26,7 +26,7 @@
 import javax.inject.Inject;
 import javax.inject.Named;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.xwiki.component.manager.ComponentManager;
 import org.xwiki.context.Execution;
 import org.xwiki.observation.ObservationManager;
@@ -189,7 +189,7 @@ public List<Block> execute(P parameters, String content, MacroTransformationCont
     {
         List<Block> result = Collections.emptyList();
 
-        if (StringUtils.isNotEmpty(content)) {
+        if (!StringUtils.isEmpty(content)) {
             try {
                 // send evaluation starts event
                 ScriptEvaluatingEvent event = new ScriptEvaluatingEvent(getDescriptor().getId().getId());
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-useravatar/src/main/java/org/xwiki/rendering/internal/macro/useravatar/UserAvatarMacro.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-useravatar/src/main/java/org/xwiki/rendering/internal/macro/useravatar/UserAvatarMacro.java
index 51b076362104e323843d010d2ec3b41681079c87..6b06ec78fc71401acdabfc74c734ed1ac7888d66 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-useravatar/src/main/java/org/xwiki/rendering/internal/macro/useravatar/UserAvatarMacro.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-useravatar/src/main/java/org/xwiki/rendering/internal/macro/useravatar/UserAvatarMacro.java
@@ -26,7 +26,7 @@
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.xwiki.bridge.DocumentAccessBridge;
 import org.xwiki.bridge.SkinAccessBridge;
 import org.xwiki.component.annotation.Component;
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-velocity/src/main/java/org/xwiki/rendering/internal/macro/velocity/VelocityMacro.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-velocity/src/main/java/org/xwiki/rendering/internal/macro/velocity/VelocityMacro.java
index 7aa5efa73753e6fadd9651b809d2f0cc622fd0c4..bf31c2682a947e7ca0b0bf30b8b72cc4a898a3c5 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-velocity/src/main/java/org/xwiki/rendering/internal/macro/velocity/VelocityMacro.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-macros/xwiki-platform-rendering-macro-velocity/src/main/java/org/xwiki/rendering/internal/macro/velocity/VelocityMacro.java
@@ -23,7 +23,7 @@
 
 import javax.inject.Inject;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.apache.velocity.VelocityContext;
 import org.slf4j.Logger;
 import org.xwiki.component.annotation.Component;
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/renderer/XWikiLinkLabelGenerator.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/renderer/XWikiLinkLabelGenerator.java
index 408834c3021ccfce168373e4bb205748d88198b7..c9c7092516310e60512a2864b475b0433c75927d 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/renderer/XWikiLinkLabelGenerator.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/renderer/XWikiLinkLabelGenerator.java
@@ -23,7 +23,7 @@
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.xwiki.bridge.DocumentAccessBridge;
 import org.xwiki.bridge.DocumentModelBridge;
 import org.xwiki.model.reference.DocumentReference;
@@ -85,7 +85,7 @@ public String generate(ResourceReference reference)
         if (result.indexOf("%t") > -1) {
             try {
                 DocumentModelBridge document = this.documentAccessBridge.getDocument(documentReference);
-                if (StringUtils.isNotBlank(document.getTitle())) {
+                if (!StringUtils.isBlank(document.getTitle())) {
                     result = result.replace("%t", document.getTitle());
                 } else {
                     result = documentReference.getName();
diff --git a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/wiki/XWikiWikiModel.java b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/wiki/XWikiWikiModel.java
index 98254e2dea97b13d764f7a73042f2214306fb067..3d78b1f714b86e46c443402c2a17072b40c3efd2 100644
--- a/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/wiki/XWikiWikiModel.java
+++ b/xwiki-platform-core/xwiki-platform-rendering/xwiki-platform-rendering-xwiki/src/main/java/org/xwiki/rendering/internal/wiki/XWikiWikiModel.java
@@ -30,7 +30,7 @@
 import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang.StringUtils;
 import org.w3c.css.sac.InputSource;
 import org.w3c.dom.css.CSSStyleDeclaration;
 import org.xwiki.bridge.DocumentAccessBridge;