diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java
index d8e8ec2..2b7f874 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeLocalNameImpl.java
@@ -28,6 +28,7 @@ import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
 import org.apache.jackrabbit.oak.spi.query.PropertyValues;
+import org.apache.jackrabbit.oak.spi.query.QueryConstant;
 
 /**
  * The function "localname(..)".
@@ -77,15 +78,32 @@ public class NodeLocalNameImpl extends DynamicOperandImpl {
 
     @Override
     public void restrict(FilterImpl f, Operator operator, PropertyValue v) {
-        // TODO support LOCALNAME index conditions
+        if (v == null) {
+            return;
+        }
+
+        String name = NodeNameImpl.getName(query, v);
+        if (name == null) {
+            throw new IllegalArgumentException("Invalid name value: " + v.toString());
+        }
+        if (f.getSelector().equals(selector)
+                && NodeNameImpl.supportedOperator(operator)) {
+            f.restrictProperty(QueryConstant.RESTRICTION_LOCAL_NAME,
+                    operator, PropertyValues.newString(name));
+        }
     }
-    
+
     @Override
     public void restrictList(FilterImpl f, List<PropertyValue> list) {
         // optimizations of type "LOCALNAME(..) IN(A, B)" are not supported
     }
 
     @Override
+    public boolean supportsRangeConditions() {
+        return false;
+    }
+
+    @Override
     public boolean canRestrictSelector(SelectorImpl s) {
         return s.equals(selector);
     }
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java
index a19f199..a229730 100644
--- oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/query/ast/NodeNameImpl.java
@@ -28,8 +28,10 @@ import org.apache.jackrabbit.oak.api.PropertyValue;
 import org.apache.jackrabbit.oak.api.Type;
 import org.apache.jackrabbit.oak.commons.PathUtils;
 import org.apache.jackrabbit.oak.namepath.JcrNameParser;
+import org.apache.jackrabbit.oak.query.QueryImpl;
 import org.apache.jackrabbit.oak.query.index.FilterImpl;
 import org.apache.jackrabbit.oak.spi.query.PropertyValues;
+import org.apache.jackrabbit.oak.spi.query.QueryConstant;
 import org.apache.jackrabbit.util.ISO9075;
 
 /**
@@ -86,11 +88,17 @@ public class NodeNameImpl extends DynamicOperandImpl {
         if (v == null) {
             return;
         }
-        String name = getName(v);
+        String name = getName(query, v);
         if (name == null) {
             throw new IllegalArgumentException("Invalid name value: " + v.toString());
         }
-        // TODO support NAME(..) index conditions
+
+        //TODO extract the local name
+        if (f.getSelector().equals(selector)
+                && NodeNameImpl.supportedOperator(operator)) {
+            f.restrictProperty(QueryConstant.RESTRICTION_LOCAL_NAME,
+                    operator, PropertyValues.newString(name));
+        }
     }
     
     @Override
@@ -110,7 +118,7 @@ public class NodeNameImpl extends DynamicOperandImpl {
      * @param v the value
      * @return name value, or {@code null} if the value can not be converted
      */
-    private String getName(PropertyValue v) {
+    static String getName(QueryImpl query, PropertyValue v) {
         // TODO correctly validate JCR names - see JCR 2.0 spec 3.2.4 Naming Restrictions
         switch (v.getType().tag()) {
         case PropertyType.DATE:
@@ -133,7 +141,11 @@ public class NodeNameImpl extends DynamicOperandImpl {
         }
         return name;
     }
-    
+
+    static boolean supportedOperator(Operator o){
+        return o == Operator.EQUAL || o == Operator.LIKE;
+    }
+
     @Override
     int getPropertyType() {
         return PropertyType.NAME;
diff --git oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryConstant.java oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryConstant.java
new file mode 100644
index 0000000..49ecc58
--- /dev/null
+++ oak-core/src/main/java/org/apache/jackrabbit/oak/spi/query/QueryConstant.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.spi.query;
+
+public abstract class QueryConstant {
+
+    /**
+     * Name of the property restriction used to express query performed
+     * via NAME and LOCALNAME functions
+     */
+    public static final String RESTRICTION_LOCAL_NAME = ":localname";
+}
