diff --git a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java
index 629f9ac..50a94c3 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java
@@ -117,7 +117,8 @@
     @Override
     public void visit(VariableBinding.Start variableBinding) {
         source.startBlock();
-        TypeInfo typeInfo = TypeInference.inferTypes(variableBinding.getExpression(), analyzer, unitBuilder.getImports());
+        TypeInfo typeInfo = TypeInference
+                .inferTypes(variableBinding.getExpression(), analyzer, unitBuilder.getImports(), unitBuilder.getJavaImportsAnalyzer());
         Type type = typeInfo.typeOf(variableBinding.getExpression());
         String properName = declare(variableBinding.getVariableName(), type);
         source.beginAssignment(properName, type.getNativeClass());
@@ -125,7 +126,8 @@
                 variableBinding.getExpression(),
                 source,
                 analyzer,
-                typeInfo);
+                typeInfo,
+                unitBuilder.getImports());
         source.endStatement();
     }
 
@@ -142,7 +144,8 @@
 
     @Override
     public void visit(VariableBinding.Global globalAssignment) {
-        TypeInfo typeInfo = TypeInference.inferTypes(globalAssignment.getExpression(), analyzer, unitBuilder.getImports());
+        TypeInfo typeInfo = TypeInference
+                .inferTypes(globalAssignment.getExpression(), analyzer, unitBuilder.getImports(), unitBuilder.getJavaImportsAnalyzer());
         VariableDescriptor descriptor = analyzer.declareGlobal(globalAssignment.getVariableName());
         String name = descriptor.getAssignedName();
         source.append(name).assign();
@@ -150,7 +153,8 @@
                 globalAssignment.getExpression(),
                 source,
                 analyzer,
-                typeInfo);
+                typeInfo,
+                unitBuilder.getImports());
         source.endStatement();
         String listCoercionVar = descriptor.getListCoercion();
         if (listCoercionVar != null) {
diff --git a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java
index 6108c8b..d7e6f47 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java
@@ -17,7 +17,9 @@
 package org.apache.sling.scripting.sightly.java.compiler.impl;
 
 import java.util.Map;
+import java.util.Set;
 
+import org.apache.sling.scripting.sightly.compiler.RuntimeFunction;
 import org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode;
 import org.apache.sling.scripting.sightly.compiler.expression.SideEffectVisitor;
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.ArrayLiteral;
@@ -33,6 +35,7 @@
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.TernaryOperator;
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.UnaryOperation;
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.UnaryOperator;
+import org.apache.sling.scripting.sightly.java.compiler.JavaEscapeUtils;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.BinaryOpGen;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.Operators;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.UnaryOpGen;
@@ -45,18 +48,21 @@
     private final JavaSource source;
     private final VariableAnalyzer analyzer;
     private final TypeInfo typeInfo;
+    private final Set<String> imports;
 
-    private ExpressionTranslator(JavaSource source, VariableAnalyzer analyzer, TypeInfo typeInfo) {
+    private ExpressionTranslator(JavaSource source, VariableAnalyzer analyzer, TypeInfo typeInfo, Set<String> imports) {
         this.source = source;
         this.analyzer = analyzer;
         this.typeInfo= typeInfo;
+        this.imports = imports;
     }
 
     public static void buildExpression(ExpressionNode node,
                                        JavaSource source,
                                        VariableAnalyzer analyzer,
-                                       TypeInfo typeInfo) {
-        ExpressionTranslator builder = new ExpressionTranslator(source, analyzer, typeInfo);
+                                       TypeInfo typeInfo,
+                                       Set<String> imports) {
+        ExpressionTranslator builder = new ExpressionTranslator(source, analyzer, typeInfo, imports);
         builder.traverse(node);
     }
 
@@ -136,11 +142,27 @@
 
     @Override
     public void visit(RuntimeCall runtimeCall) {
+        String runtimeCallName = runtimeCall.getFunctionName();
         source.startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, SourceGenConstants.RUNTIME_CALL_METHOD)
-                .stringLiteral(runtimeCall.getFunctionName());
+                .stringLiteral(runtimeCallName);
+        int index = 0;
         for (ExpressionNode arg : runtimeCall.getArguments()) {
             source.separateArgument();
-            visit(arg);
+            if (RuntimeFunction.USE.equals(runtimeCallName) && index == 0) {
+                if (arg instanceof StringConstant) {
+                    StringConstant constant = (StringConstant) arg;
+                    String className = constant.getText();
+                    if (imports.contains(className)) {
+                        source.className(className.substring(className.lastIndexOf('.') + 1));
+                    } else {
+                        visit(arg);
+                    }
+                } else {
+                    visit(arg);
+                }
+            } else {
+                visit(arg);
+            }
         }
         source.endCall();
     }
diff --git a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java
index f5aefd5..680e340 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java
@@ -244,6 +244,14 @@
         return startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, SourceGenConstants.RENDER_CONTEXT_GET_OBJECT_MODEL).endCall();
     }
 
+    public JavaSource property(String target, String property) {
+        return append(target).append(".").append(property);
+    }
+
+    public JavaSource className(String className) {
+        return property(className, "class").startCall("getName", true).endCall();
+    }
+
     private StringBuilder indent() {
         for (int i = 0; i < indentLevel; i++) {
             builder.append(INDENT);
diff --git a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java
index 6511de3..b9292d1 100644
--- a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java
+++ b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java
@@ -37,6 +37,7 @@
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.StringConstant;
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.TernaryOperator;
 import org.apache.sling.scripting.sightly.compiler.expression.nodes.UnaryOperation;
+import org.apache.sling.scripting.sightly.java.compiler.JavaImportsAnalyzer;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.BinaryOpGen;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.Operators;
 import org.apache.sling.scripting.sightly.java.compiler.impl.operator.UnaryOpGen;
@@ -49,18 +50,21 @@
     private final VariableAnalyzer analyzer;
     private final Map<ExpressionNode, Type> inferMap = new IdentityHashMap<>();
     private final Set<String> imports;
+    private final JavaImportsAnalyzer importsAnalyzer;
     private static final Pattern FQCN_PATTERN = Pattern.compile("([[\\p{L}&&[^\\p{Lu}]]_$][\\p{L}\\p{N}_$]*\\.)+[\\p{Lu}_$][\\p{L}\\p{N}_$]*");
 
 
-    public static TypeInfo inferTypes(ExpressionNode node, VariableAnalyzer analyzer, Set<String> imports) {
-        TypeInference typeInference = new TypeInference(analyzer, imports);
+    public static TypeInfo inferTypes(ExpressionNode node, VariableAnalyzer analyzer, Set<String> imports,
+                                      JavaImportsAnalyzer importsAnalyzer) {
+        TypeInference typeInference = new TypeInference(analyzer, imports, importsAnalyzer);
         typeInference.infer(node);
         return new TypeInfo(typeInference.inferMap);
     }
 
-    private TypeInference(VariableAnalyzer analyzer, Set<String> imports) {
+    private TypeInference(VariableAnalyzer analyzer, Set<String> imports, JavaImportsAnalyzer importsAnalyzer) {
         this.analyzer = analyzer;
         this.imports = imports;
+        this.importsAnalyzer = importsAnalyzer;
     }
 
 
@@ -138,7 +142,7 @@
             ExpressionNode identifier = runtimeCall.getArguments().get(0);
             if (identifier instanceof StringConstant) {
                 String objectType = ((StringConstant) identifier).getText();
-                if (FQCN_PATTERN.matcher(objectType).matches()) {
+                if (FQCN_PATTERN.matcher(objectType).matches() && importsAnalyzer != null && importsAnalyzer.allowImport(objectType)) {
                     imports.add(objectType);
                     return Type.dynamic(objectType);
                 }
diff --git a/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java b/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java
index 924e519..73ce0a8 100644
--- a/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java
+++ b/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java
@@ -103,6 +103,9 @@
         String source = backendCompiler.build(classInfo);
         String expectedJavaOutput = IOUtils.toString(this.getClass().getResourceAsStream("/imports.html.java"), "UTF-8");
         assertEquals(expectedJavaOutput, source);
+        ClassLoader classLoader = JavaClassBackendCompilerTest.class.getClassLoader();
+        CharSequenceJavaCompiler<RenderUnit> compiler = new CharSequenceJavaCompiler<>(classLoader, null);
+        compiler.compile(classInfo.getFullyQualifiedClassName(), source);
     }
 
     private ClassInfo buildClassInfo(final String info) {
diff --git a/src/test/resources/imports.html b/src/test/resources/imports.html
index 82d1905..639c635 100644
--- a/src/test/resources/imports.html
+++ b/src/test/resources/imports.html
@@ -16,7 +16,7 @@
   ~ specific language governing permissions and limitations
   ~ under the License.
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/-->
-<div data-sly-use.slingSettings="org.apache.sling.settings.SlingSettingsService"
+<div data-sly-use.record="org.apache.sling.scripting.sightly.Record"
      data-sly-use.js="script.js"
      data-sly-use.pojo="Pojo"
 ></div>
diff --git a/src/test/resources/imports.html.java b/src/test/resources/imports.html.java
index f80f7db..bdbcaf1 100644
--- a/src/test/resources/imports.html.java
+++ b/src/test/resources/imports.html.java
@@ -25,7 +25,7 @@
 import org.apache.sling.scripting.sightly.java.compiler.RenderUnit;
 import org.apache.sling.scripting.sightly.render.RenderContext;
 
-import org.apache.sling.settings.SlingSettingsService;
+import org.apache.sling.scripting.sightly.Record;
 
 
 public final class Test_imports extends RenderUnit {
@@ -37,11 +37,11 @@
                                 RenderContext renderContext) {
 // Main Template Body -----------------------------------------------------------------------------
 
-Object _global_slingsettings = null;
+Object _global_record = null;
 Object _global_js = null;
 Object _global_pojo = null;
 out.write("\n");
-_global_slingsettings = renderContext.call("use", "org.apache.sling.settings.SlingSettingsService", obj());
+_global_record = renderContext.call("use", Record.class.getName(), obj());
 _global_js = renderContext.call("use", "script.js", obj());
 _global_pojo = renderContext.call("use", "Pojo", obj());
 out.write("<div></div>\n");
