diff --git a/compiler/testData/codegen/box/callableReference/bound/simpleProperty.kt b/compiler/testData/codegen/box/callableReference/bound/simpleProperty.kt
index bcf45ee0..11d4828 100644
--- a/compiler/testData/codegen/box/callableReference/bound/simpleProperty.kt
+++ b/compiler/testData/codegen/box/callableReference/bound/simpleProperty.kt
@@ -4,23 +4,30 @@
 
 fun A.bar(x: Int) = foo() * x;
 
+object Foo {
+    val qqq = 6
+}
+
 fun box(): String {
-    var a = "kotlin".length
-    print(a)
-    val g = A::foo
-    print(g(A(78)))
+//    var a = "kotlin".length
+//    print(a)
+//    val g = A::foo
+//    print(g(A(78)))
+//
+//    val f = (if (1 < 2) A(6) else { print(1); A(2)})::foo
+//    if (f() != 6) return "fail"
+//
+//    val z = A(3)::bar
+//    if (z(11) != 33) return "fail"
+//
+//    val q = 100
+//    fun A.zzz(x: Int) = (x + q) * foo()
+//    val w = A(5)::zzz
+//
+//    if (w(11) != 555) return "fail"
 
-    val f = (if (1 < 2) A(6) else { print(1); A(2)})::foo
-    if (f() != 6) return "fail"
-
-    val z = A(3)::bar
-    if (z(11) != 33) return "fail"
-
-    val q = 100
-    fun A.zzz(x: Int) = (x + q) * foo()
-    val w = A(5)::zzz
-
-    if (w(11) != 555) return "fail"
+    val ddd = Foo::qqq
+    if (ddd() != 6) return "fail"
 
     return "OK"
 }
diff --git a/compiler/testData/codegen/box/callableReference/bound/syntheticExtensionOnLHS.kt b/compiler/testData/codegen/box/callableReference/bound/syntheticExtensionOnLHS.kt
index d13956b..b8be540 100644
--- a/compiler/testData/codegen/box/callableReference/bound/syntheticExtensionOnLHS.kt
+++ b/compiler/testData/codegen/box/callableReference/bound/syntheticExtensionOnLHS.kt
@@ -1,3 +1,4 @@
+// TARGET_BACKEND: JVM
 // WITH_RUNTIME
 // FILE: A.java
 
diff --git a/compiler/testData/codegen/boxInline/callableReference/bound/intrinsic.kt b/compiler/testData/codegen/boxInline/callableReference/bound/intrinsic.kt
index ab6fb03..fc4f7f5 100644
--- a/compiler/testData/codegen/boxInline/callableReference/bound/intrinsic.kt
+++ b/compiler/testData/codegen/boxInline/callableReference/bound/intrinsic.kt
@@ -1,3 +1,5 @@
+// Enable when callble references for intrinsics are suported.
+// IGNORE_BACKEND: JS
 // FILE: 1.kt
 
 package test
diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java
index 6847c3c..4ca51b8 100644
--- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java
+++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java
@@ -85,7 +85,9 @@
     private static final String CALLABLE_REF_FOR_CONSTRUCTOR_NAME = "getCallableRefForConstructor";
     private static final String CALLABLE_REF_FOR_TOP_LEVEL_PROPERTY = "getCallableRefForTopLevelProperty";
     private static final String CALLABLE_REF_FOR_MEMBER_PROPERTY = "getCallableRefForMemberProperty";
+    private static final String BOUND_CALLABLE_REF_FOR_MEMBER_PROPERTY = "getBoundCallableRefForMemberProperty";
     private static final String CALLABLE_REF_FOR_EXTENSION_PROPERTY = "getCallableRefForExtensionProperty";
+    private static final String BOUND_CALLABLE_REF_FOR_EXTENSION_PROPERTY = "getBoundCallableRefForExtensionProperty";
 
     private static final String DELEGATE = "$delegate";
 
@@ -210,8 +212,12 @@
     @NotNull
     private final JsName callableRefForMemberProperty;
     @NotNull
+    private final JsName boundCallableRefForMemberProperty;
+    @NotNull
     private final JsName callableRefForExtensionProperty;
     @NotNull
+    private final JsName boundCallableRefForExtensionProperty;
+    @NotNull
     private final JsExpression callGetProperty;
     @NotNull
     private final JsExpression callSetProperty;
@@ -234,7 +240,9 @@
         callableRefForConstructorName = kotlinScope.declareName(CALLABLE_REF_FOR_CONSTRUCTOR_NAME);
         callableRefForTopLevelProperty = kotlinScope.declareName(CALLABLE_REF_FOR_TOP_LEVEL_PROPERTY);
         callableRefForMemberProperty = kotlinScope.declareName(CALLABLE_REF_FOR_MEMBER_PROPERTY);
+        boundCallableRefForMemberProperty = kotlinScope.declareName(BOUND_CALLABLE_REF_FOR_MEMBER_PROPERTY);
         callableRefForExtensionProperty = kotlinScope.declareName(CALLABLE_REF_FOR_EXTENSION_PROPERTY);
+        boundCallableRefForExtensionProperty = kotlinScope.declareName(BOUND_CALLABLE_REF_FOR_EXTENSION_PROPERTY);
 
         isTypeName = kotlinScope.declareName("isType");
     }
@@ -296,11 +304,21 @@
     }
 
     @NotNull
+    public JsExpression boundCallableRefForMemberPropertyReference() {
+        return kotlin(boundCallableRefForMemberProperty);
+    }
+
+    @NotNull
     public JsExpression callableRefForExtensionPropertyReference() {
         return kotlin(callableRefForExtensionProperty);
     }
 
     @NotNull
+    public JsExpression boundCallableRefForExtensionPropertyReference() {
+        return kotlin(boundCallableRefForExtensionProperty);
+    }
+
+    @NotNull
     public static JsExpression throwNPEFunctionRef() {
         return new JsNameRef(THROW_NPE_FUN_NAME, kotlinObject());
     }
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 bf1d1b7..6c31736 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
@@ -25,11 +25,14 @@
 import org.jetbrains.kotlin.js.translate.utils.*
 import org.jetbrains.kotlin.psi.KtCallableReferenceExpression
 import org.jetbrains.kotlin.resolve.DescriptorUtils
+import org.jetbrains.kotlin.resolve.PropertyImportedFromObject
 import java.util.*
 
 object CallableReferenceTranslator {
 
     fun translate(expression: KtCallableReferenceExpression, context: TranslationContext): JsExpression {
+        val descriptor = BindingUtils.getDescriptorForReferenceExpression(context.bindingContext(), expression.callableReference)
+
         val receiver = expression.receiverExpression?.let { r ->
             if (context.bindingContext().getType(r) == null) {
                 null
@@ -41,9 +44,11 @@
                 }
                 e
             }
+        } ?: (descriptor as? PropertyImportedFromObject)?.let {
+            ReferenceTranslator.translateAsValueReference(it.containingObject, context)
         }
 
-        val descriptor = BindingUtils.getDescriptorForReferenceExpression(context.bindingContext(), expression.callableReference)
+
         return when (descriptor) {
             is PropertyDescriptor ->
                 translateForProperty(descriptor, context, expression, receiver)
@@ -87,9 +92,9 @@
             KotlinBuiltIns.isBuiltIn(descriptor) ->
                 reportNotSupported(context, expression)
             isExtension(descriptor) ->
-                translateForExtensionProperty(descriptor, context)
+                translateForExtensionProperty(descriptor, context, receiver)
             isMember(descriptor) ->
-                translateForMemberProperty(descriptor, context)
+                translateForMemberProperty(descriptor, context, receiver)
             else ->
                 translateForTopLevelProperty(descriptor, context)
         }
@@ -157,27 +162,39 @@
         return function
     }
 
-    private fun translateForMemberProperty(descriptor: PropertyDescriptor, context: TranslationContext): JsExpression {
+    private fun translateForMemberProperty(descriptor: PropertyDescriptor, context: TranslationContext, receiver: JsExpression?): JsExpression {
         val jsPropertyName = context.getNameForDescriptor(descriptor)
         val jsPropertyNameAsString = context.program().getStringLiteral(jsPropertyName.toString())
-        return JsInvocation(context.namer().callableRefForMemberPropertyReference(), jsPropertyNameAsString, isVar(descriptor))
+        if (receiver == null) {
+            return JsInvocation(context.namer().callableRefForMemberPropertyReference(), jsPropertyNameAsString, isVar(descriptor))
+        } else {
+            return JsInvocation(context.namer().boundCallableRefForMemberPropertyReference(), receiver, jsPropertyNameAsString, isVar(descriptor))
+        }
     }
 
-    private fun translateForExtensionProperty(descriptor: PropertyDescriptor, context: TranslationContext): JsExpression {
+    private fun translateForExtensionProperty(descriptor: PropertyDescriptor, context: TranslationContext, receiver: JsExpression?): JsExpression {
         val jsGetterNameRef = ReferenceTranslator.translateAsValueReference(descriptor.getter!!, context)
         val propertyName = descriptor.name
         val jsPropertyNameAsString = context.program().getStringLiteral(propertyName.asString())
-        val argumentList = ArrayList<JsExpression>(3)
+        val argumentList = ArrayList<JsExpression>(4)
+        if (receiver != null) {
+            argumentList.add(receiver)
+        }
         argumentList.add(jsPropertyNameAsString)
         argumentList.add(jsGetterNameRef)
         if (descriptor.isVar) {
             val jsSetterNameRef = ReferenceTranslator.translateAsValueReference(descriptor.setter!!, context)
             argumentList.add(jsSetterNameRef)
         }
-        return if (AnnotationsUtils.isNativeObject(descriptor))
-            translateForMemberProperty(descriptor, context)
-        else
+        return if (AnnotationsUtils.isNativeObject(descriptor)) {
+            translateForMemberProperty(descriptor, context, receiver)
+        }
+        else if (receiver == null) {
             JsInvocation(context.namer().callableRefForExtensionPropertyReference(), argumentList)
+        }
+        else {
+            JsInvocation(context.namer().boundCallableRefForExtensionPropertyReference(), argumentList)
+        }
     }
 
     private fun translateForConstructor(descriptor: FunctionDescriptor, context: TranslationContext): JsExpression {
diff --git a/js/js.translator/testData/kotlin_lib_ecma5.js b/js/js.translator/testData/kotlin_lib_ecma5.js
index 3cfdcf9..a4925ca 100644
--- a/js/js.translator/testData/kotlin_lib_ecma5.js
+++ b/js/js.translator/testData/kotlin_lib_ecma5.js
@@ -183,11 +183,25 @@
         return getPropertyRefClass(getFun, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg);
     };
 
+    Kotlin.getBoundCallableRefForMemberProperty = function(receiver, name, isVar) {
+        var getFun = Function("receiver", "return function " + name + "() { return receiver['" + name + "']; }")(receiver);
+        var setFun = isVar ? function(value) { receiver[name] = value; } : null;
+        return getPropertyRefClass(getFun, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg);
+    };
+
     Kotlin.getCallableRefForExtensionProperty = function(name, getFun, setFun) {
         var getFunWrapper = Function("getFun", "return function " + name + "(receiver, extensionReceiver) { return getFun(receiver, extensionReceiver) }")(getFun);
         return getPropertyRefClass(getFunWrapper, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg);
     };
 
+    Kotlin.getBoundCallableRefForExtensionProperty = function(receiver, name, getFun, setFun) {
+        var getFunWrapper = Function("receiver", "getFun", "return function " + name + "(extensionReceiver) { return getFun(receiver, extensionReceiver) }")(receiver, getFun);
+        if (setFun) {
+            setFun = setFun.bind(null, receiver);
+        }
+        return getPropertyRefClass(getFunWrapper, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg);
+    };
+
     function getPropertyRefClass(getFun, getName, setFun, setName, cache) {
         var obj = getFun;
         var isMutable = typeof setFun === "function";
diff --git a/js/js.translator/testData/test.html b/js/js.translator/testData/test.html
index 5d94ae1..9a85904 100644
--- a/js/js.translator/testData/test.html
+++ b/js/js.translator/testData/test.html
@@ -2,7 +2,7 @@
 <html>
 <head>
   <script type="application/javascript" src="../../../dist/js/kotlin.js"></script>
-  <script type="application/javascript" src="out/codegen/boxInline/callableReference/classLevel_v5.js"></script>
+  <script type="application/javascript" src="out/codegen/boxInline/callableReference/bound/topLevelExtensionProperty_v5.js"></script>
 
   <script type="application/javascript">
     console.log(JS_TESTS.box());
