diff --git a/xwiki-platform-core/xwiki-platform-oldcore/src/main/java/com/xpn/xwiki/internal/template/TemplateAsyncRenderer.java b/xwiki-platform-core/xwiki-platform-oldcore/src/main/java/com/xpn/xwiki/internal/template/TemplateAsyncRenderer.java
index 0b2238d0b6bd1dc12c4c01a6c3e36cb81db72b38..2cad8875c3e3341051bc8f80bf84d2a9ff93da65 100644
--- a/xwiki-platform-core/xwiki-platform-oldcore/src/main/java/com/xpn/xwiki/internal/template/TemplateAsyncRenderer.java
+++ b/xwiki-platform-core/xwiki-platform-oldcore/src/main/java/com/xpn/xwiki/internal/template/TemplateAsyncRenderer.java
@@ -203,7 +203,15 @@ private void transform(Block block) throws TransformationException
             new TransformationContext(block instanceof XDOM ? (XDOM) block : new XDOM(Arrays.asList(block)),
                 this.renderingContext.getDefaultSyntax(), this.renderingContext.isRestricted());
 
-        transformationContext.setId(this.transformationId);
+        // Use the Transformation id as the name passed to the Velocity Engine. This name is used internally
+        // by Velocity as a cache index key for caching macros.
+        String tId = this.renderingContext.getTransformationId();
+        if (tId == null) {
+            // We need to set a top level id (otherwise Velocity macros won't be able to share vmacros for example)
+            tId = this.template.getId() != null ? this.template.getId() : "unknown namespace";
+        }
+        transformationContext.setId(tId);
+
         transformationContext.setTargetSyntax(this.targetSyntax);
 
         transform(block, transformationContext);