works?
diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java
index af13c69..ec92c35 100644
--- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java
+++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/TopLevelFIF.java
@@ -20,9 +20,11 @@
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.kotlin.descriptors.CallableDescriptor;
 import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
+import org.jetbrains.kotlin.descriptors.PropertyDescriptor;
 import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor;
 import org.jetbrains.kotlin.js.backend.ast.JsExpression;
 import org.jetbrains.kotlin.js.backend.ast.JsInvocation;
+import org.jetbrains.kotlin.js.backend.ast.JsName;
 import org.jetbrains.kotlin.js.backend.ast.JsNameRef;
 import org.jetbrains.kotlin.js.patterns.DescriptorPredicate;
 import org.jetbrains.kotlin.js.patterns.NamePredicate;
@@ -31,11 +33,17 @@
 import org.jetbrains.kotlin.js.translate.context.TranslationContext;
 import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic;
 import org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsicWithReceiverComputed;
+import org.jetbrains.kotlin.js.translate.reference.CallableReferenceTranslator;
 import org.jetbrains.kotlin.js.translate.utils.JsAstUtils;
+import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils;
 import org.jetbrains.kotlin.js.translate.utils.TranslationUtils;
 import org.jetbrains.kotlin.js.translate.utils.UtilsKt;
+import org.jetbrains.kotlin.psi.KtCallableReferenceExpression;
+import org.jetbrains.kotlin.psi.KtPsiUtil;
 import org.jetbrains.kotlin.resolve.DescriptorFactory;
+import org.jetbrains.kotlin.resolve.calls.callUtil.CallUtilKt;
 import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
+import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver;
 import org.jetbrains.kotlin.types.KotlinType;
 
 import java.util.List;
@@ -150,13 +158,37 @@
         }
     };
 
+    private static final FunctionIntrinsic LATEINIT_KPROPERTY_ISINITIALIZED_INTRINSIC = new FunctionIntrinsic() {
+        @NotNull
+        @Override
+        public JsExpression apply(
+                @NotNull CallInfo callInfo,
+                @NotNull List<? extends JsExpression> arguments,
+                @NotNull TranslationContext context
+        ) {
+            ResolvedCall<? extends CallableDescriptor> call = callInfo.getResolvedCall();
+            ExpressionReceiver receiver = (ExpressionReceiver)call.getExtensionReceiver();
+
+            KtCallableReferenceExpression expression = (KtCallableReferenceExpression)KtPsiUtil.safeDeparenthesize(receiver.getExpression());
+            ResolvedCall<? extends CallableDescriptor> referencedProperty =
+                    CallUtilKt.getResolvedCall(expression.getCallableReference(), context.bindingContext());
+            PropertyDescriptor propertyDescriptor = (PropertyDescriptor)referencedProperty.getResultingDescriptor();
+
+            JsExpression receiverExpression = CallableReferenceTranslator.INSTANCE.calculateReceiver(expression, context);
+            JsName backingFieldName = TranslationUtils.getNameForBackingField(
+                    context, (PropertyDescriptor)JsDescriptorUtils.findRealDeclaration(propertyDescriptor));
+            JsNameRef backingFieldRef = new JsNameRef(backingFieldName, receiverExpression);
+            return TranslationUtils.nullCheck(backingFieldRef, true);
+        }
+    };
+
     private static final FunctionIntrinsic STRING_SUBSTRING = new FunctionIntrinsicWithReceiverComputed() {
         @NotNull
         @Override
         public JsExpression apply(
                 @Nullable JsExpression receiver,
-               @NotNull List<? extends JsExpression> arguments,
-               @NotNull TranslationContext context
+                @NotNull List<? extends JsExpression> arguments,
+                @NotNull TranslationContext context
         ) {
             return new JsInvocation(new JsNameRef("substring", receiver), arguments);
         }
@@ -202,6 +234,9 @@
 
         add(pattern("kotlin", "enumValues"), ENUM_VALUES_INTRINSIC);
         add(pattern("kotlin", "enumValueOf"), ENUM_VALUE_OF_INTRINSIC);
+
+        add(pattern("kotlin", "<get-isInitialized>").isExtensionOf("kotlin.reflect.KProperty0"),
+            LATEINIT_KPROPERTY_ISINITIALIZED_INTRINSIC);
     }
 
 }
diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt
index 82d2e1f..69fdab9 100644
--- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt
+++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/CallableReferenceTranslator.kt
@@ -50,23 +50,8 @@
 object CallableReferenceTranslator {
 
     fun translate(expression: KtCallableReferenceExpression, context: TranslationContext): JsExpression {
-        val referencedFunction = expression.callableReference.getResolvedCallWithAssert(context.bindingContext())
-        val descriptor = referencedFunction.getResultingDescriptor()
-
-        val extensionReceiver = referencedFunction.extensionReceiver
-        val dispatchReceiver = referencedFunction.dispatchReceiver
-        assert(dispatchReceiver == null || extensionReceiver == null) { "Cannot generate reference with both receivers: " + descriptor }
-
-        val receiver = (dispatchReceiver ?: extensionReceiver)?.let {
-            when (it) {
-                is TransientReceiver -> null
-                is ImplicitClassReceiver -> context.getDispatchReceiver(JsDescriptorUtils.getReceiverParameterForReceiver(it))
-                is ExtensionReceiver -> JsThisRef()
-                is ExpressionReceiver -> Translation.translateAsExpression(it.expression, context)
-                else -> throw UnsupportedOperationException("Unsupported receiver value: " + it)
-            }
-        }
-
+        val receiver = calculateReceiver(expression, context)
+        val descriptor = referencedDescriptor(expression, context)
         return when (descriptor) {
             is PropertyDescriptor ->
                 translateForProperty(descriptor, context, expression, receiver)
@@ -77,6 +62,28 @@
         }
     }
 
+    fun calculateReceiver(expression: KtCallableReferenceExpression, context: TranslationContext): JsExpression? {
+        val referencedFunction = expression.callableReference.getResolvedCallWithAssert(context.bindingContext())
+        val descriptor = referencedFunction.getResultingDescriptor()
+
+        val extensionReceiver = referencedFunction.extensionReceiver
+        val dispatchReceiver = referencedFunction.dispatchReceiver
+        assert(dispatchReceiver == null || extensionReceiver == null) { "Cannot generate reference with both receivers: " + descriptor }
+
+        return (dispatchReceiver ?: extensionReceiver)?.let {
+            when (it) {
+                is TransientReceiver -> null
+                is ImplicitClassReceiver -> context.getDispatchReceiver(JsDescriptorUtils.getReceiverParameterForReceiver(it))
+                is ExtensionReceiver -> JsThisRef()
+                is ExpressionReceiver -> Translation.translateAsExpression(it.expression, context)
+                else -> throw UnsupportedOperationException("Unsupported receiver value: " + it)
+            }
+        }
+    }
+
+    fun referencedDescriptor(expression: KtCallableReferenceExpression, context: TranslationContext)
+        = expression.callableReference.getResolvedCallWithAssert(context.bindingContext()).getResultingDescriptor()
+
     private fun translateForFunction(
             descriptor: FunctionDescriptor,
             context: TranslationContext,
diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java
index 142ce06..8e11fc6 100644
--- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java
+++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/JsDescriptorUtils.java
@@ -170,12 +170,12 @@
     }
 
     @Nullable
-    private static FunctionDescriptor findRealDeclaration(@NotNull FunctionDescriptor descriptor) {
+    public static CallableMemberDescriptor findRealDeclaration(@NotNull CallableMemberDescriptor descriptor) {
         if (descriptor.getModality() == Modality.ABSTRACT) return null;
         if (descriptor.getKind().isReal()) return descriptor;
 
-        for (FunctionDescriptor o : descriptor.getOverriddenDescriptors()) {
-            FunctionDescriptor child = findRealDeclaration(o);
+        for (CallableMemberDescriptor o : descriptor.getOverriddenDescriptors()) {
+            CallableMemberDescriptor child = findRealDeclaration(o);
             if (child != null) {
                 return child;
             }
diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java
index 9aec904..79c4a5f 100644
--- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java
+++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/utils/TranslationUtils.java
@@ -54,9 +54,7 @@
 
 import static org.jetbrains.kotlin.js.backend.ast.JsBinaryOperator.*;
 import static org.jetbrains.kotlin.js.translate.utils.BindingUtils.getCallableDescriptorForOperationExpression;
-import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.assignment;
-import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.createDataDescriptor;
-import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.pureFqn;
+import static org.jetbrains.kotlin.js.translate.utils.JsAstUtils.*;
 
 public final class TranslationUtils {
 
@@ -172,16 +170,22 @@
     }
 
     @NotNull
-    public static JsNameRef backingFieldReference(@NotNull TranslationContext context, @NotNull PropertyDescriptor descriptor) {
+    public static JsName getNameForBackingField(@NotNull TranslationContext context, @NotNull PropertyDescriptor descriptor) {
         DeclarationDescriptor containingDescriptor = descriptor.getContainingDeclaration();
-        JsName backingFieldName = containingDescriptor instanceof PackageFragmentDescriptor ?
-                                  context.getInnerNameForDescriptor(descriptor) :
-                                  context.getNameForDescriptor(descriptor);
 
         if (!JsDescriptorUtils.isSimpleFinalProperty(descriptor) && !(containingDescriptor instanceof PackageFragmentDescriptor)) {
-            backingFieldName = context.getNameForBackingField(descriptor);
+            return context.getNameForBackingField(descriptor);
         }
 
+        return containingDescriptor instanceof PackageFragmentDescriptor ?
+                                  context.getInnerNameForDescriptor(descriptor) :
+                                  context.getNameForDescriptor(descriptor);
+    }
+
+    @NotNull
+    public static JsNameRef backingFieldReference(@NotNull TranslationContext context, @NotNull PropertyDescriptor descriptor) {
+        DeclarationDescriptor containingDescriptor = descriptor.getContainingDeclaration();
+
         JsExpression receiver;
         if (containingDescriptor instanceof PackageFragmentDescriptor) {
             receiver = null;
@@ -190,7 +194,7 @@
             receiver = context.getDispatchReceiver(JsDescriptorUtils.getReceiverParameterForDeclaration(containingDescriptor));
         }
 
-        JsNameRef result = new JsNameRef(backingFieldName, receiver);
+        JsNameRef result = new JsNameRef(getNameForBackingField(context, descriptor), receiver);
         MetadataProperties.setType(result, getReturnTypeForCoercion(descriptor));
 
         return result;
diff --git a/js/js.translator/testData/box/propertyAccess/simpleLateInitIsInitialized.kt b/js/js.translator/testData/box/propertyAccess/simpleLateInitIsInitialized.kt
index 5f4cc8f..2743597 100644
--- a/js/js.translator/testData/box/propertyAccess/simpleLateInitIsInitialized.kt
+++ b/js/js.translator/testData/box/propertyAccess/simpleLateInitIsInitialized.kt
@@ -1,3 +1,4 @@
+// EXPECTED_REACHABLE_NODES: 1035
 // LANGUAGE_VERSION: 1.2
 // WITH_RUNTIME