diff --git a/src/main/java/org/apache/sling/scripting/sightly/impl/engine/SightlyCompiledScript.java b/src/main/java/org/apache/sling/scripting/sightly/impl/engine/SightlyCompiledScript.java
index cf2c9ea..c0ddbaf 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/impl/engine/SightlyCompiledScript.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/impl/engine/SightlyCompiledScript.java
@@ -45,7 +45,7 @@
     }
 
     @Override
-    public Object eval(ScriptContext context) throws ScriptException {
+    public Object eval(ScriptContext context) {
         Bindings bindings = context.getBindings(ScriptContext.ENGINE_SCOPE);
         SlingBindings slingBindings = new SlingBindings();
         slingBindings.putAll(bindings);
diff --git a/src/main/java/org/apache/sling/scripting/sightly/impl/engine/SightlyScriptEngine.java b/src/main/java/org/apache/sling/scripting/sightly/impl/engine/SightlyScriptEngine.java
index 1a9fb03..8c5e9ed 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/impl/engine/SightlyScriptEngine.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/impl/engine/SightlyScriptEngine.java
@@ -92,22 +92,17 @@
     @Override
     public Object eval(Reader reader, ScriptContext scriptContext) throws ScriptException {
         checkArguments(reader, scriptContext);
-        Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
-        SlingBindings slingBindings = new SlingBindings();
-        slingBindings.putAll(bindings);
-        final SlingHttpServletRequest request = slingBindings.getRequest();
-        if (request == null) {
-            throw new SightlyException("Missing SlingHttpServletRequest from ScriptContext.");
-        }
-        final Object oldValue = request.getAttribute(SlingBindings.class.getName());
         try {
-            request.setAttribute(SlingBindings.class.getName(), slingBindings);
-            SightlyCompiledScript compiledScript = internalCompile(reader, scriptContext);
+            Object renderUnit = scriptContext.getAttribute("precompiled.unit", SlingScriptConstants.SLING_SCOPE);
+            SightlyCompiledScript compiledScript;
+            if (renderUnit instanceof RenderUnit) {
+                compiledScript = new SightlyCompiledScript(this, (RenderUnit) renderUnit);
+            } else {
+                compiledScript = internalCompile(reader, scriptContext);
+            }
             return compiledScript.eval(scriptContext);
         } catch (Exception e) {
             throw new ScriptException(e);
-        } finally {
-            request.setAttribute(SlingBindings.class.getName(), oldValue);
         }
     }
 
@@ -134,34 +129,27 @@
                     return script;
                 }
             };
-            Object renderUnit = null;
+            JavaClassBackendCompiler javaClassBackendCompiler = new JavaClassBackendCompiler(importsAnalyser);
+            GlobalShadowCheckBackendCompiler shadowCheckBackendCompiler = null;
             if (scriptContext != null) {
-                renderUnit = scriptContext.getAttribute("precompiled.unit", SlingScriptConstants.SLING_SCOPE);
+                Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
+                Set<String> globals = bindings.keySet();
+                shadowCheckBackendCompiler = new GlobalShadowCheckBackendCompiler(javaClassBackendCompiler, globals);
             }
-            if (renderUnit == null) {
-                JavaClassBackendCompiler javaClassBackendCompiler = new JavaClassBackendCompiler(importsAnalyser);
-                GlobalShadowCheckBackendCompiler shadowCheckBackendCompiler = null;
-                if (scriptContext != null) {
-                    Bindings bindings = scriptContext.getBindings(ScriptContext.ENGINE_SCOPE);
-                    Set<String> globals = bindings.keySet();
-                    shadowCheckBackendCompiler = new GlobalShadowCheckBackendCompiler(javaClassBackendCompiler, globals);
+            CompilationResult result = shadowCheckBackendCompiler == null ? sightlyCompiler.compile(compilationUnit,
+                    javaClassBackendCompiler) : sightlyCompiler.compile(compilationUnit, shadowCheckBackendCompiler);
+            if (result.getWarnings().size() > 0) {
+                for (CompilerMessage warning : result.getWarnings()) {
+                    LOGGER.warn("Script {} {}:{}: {}", warning.getScriptName(), warning.getLine(), warning.getColumn(), warning.getMessage());
                 }
-                CompilationResult result = shadowCheckBackendCompiler == null ? sightlyCompiler.compile(compilationUnit,
-                        javaClassBackendCompiler) : sightlyCompiler.compile(compilationUnit, shadowCheckBackendCompiler);
-                if (result.getWarnings().size() > 0) {
-                    for (CompilerMessage warning : result.getWarnings()) {
-                        LOGGER.warn("Script {} {}:{}: {}", warning.getScriptName(), warning.getLine(), warning.getColumn(),
-                                warning.getMessage());
-                    }
-                }
-                if (result.getErrors().size() > 0) {
-                    CompilerMessage error = result.getErrors().get(0);
-                    throw new ScriptException(error.getMessage(), error.getScriptName(), error.getLine(), error.getColumn());
-                }
-                SourceIdentifier sourceIdentifier = new SourceIdentifier(configuration, scriptName);
-                String javaSourceCode = javaClassBackendCompiler.build(sourceIdentifier);
-                renderUnit = javaCompilerService.compileSource(sourceIdentifier, javaSourceCode);
             }
+            if (result.getErrors().size() > 0) {
+                CompilerMessage error = result.getErrors().get(0);
+                throw new ScriptException(error.getMessage(), error.getScriptName(), error.getLine(), error.getColumn());
+            }
+            SourceIdentifier sourceIdentifier = new SourceIdentifier(configuration, scriptName);
+            String javaSourceCode = javaClassBackendCompiler.build(sourceIdentifier);
+            Object renderUnit = javaCompilerService.compileSource(sourceIdentifier, javaSourceCode);
             if (renderUnit instanceof RenderUnit) {
                 return new SightlyCompiledScript(this, (RenderUnit) renderUnit);
             } else {
