diff --git oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
index df20db8..3968713 100644
--- oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
+++ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/session/NodeImpl.java
@@ -659,16 +659,19 @@ public class NodeImpl<T extends NodeDelegate> extends ItemImpl<T> implements Nod
             @Nonnull
             @Override
             public PropertyIterator perform() throws RepositoryException {
-                Iterator<PropertyDelegate> properties = Iterators.filter(
-                        node.getProperties(),
-                        new Predicate<PropertyDelegate>() {
-                            @Override
-                            public boolean apply(PropertyDelegate entry) {
-                                // TODO: use Oak names
-                                return ItemNameMatcher.matches(toJcrPath(entry.getName()), namePattern);
-                            }
-                        });
-                return new PropertyIteratorAdapter(propertyIterator(properties));
+                final PropertyIteratorDelegate delegate = new PropertyIteratorDelegate(node, new Predicate<PropertyDelegate>() {
+                    @Override
+                    public boolean apply(PropertyDelegate entry) {
+                        // TODO: use Oak names
+                        return ItemNameMatcher.matches(toJcrPath(entry.getName()), namePattern);
+                    }
+                });
+                return new PropertyIteratorAdapter(propertyIterator(delegate.iterator())){
+                    @Override
+                    public long getSize() {
+                        return delegate.getSize();
+                    }
+                };
             }
         });
     }
@@ -680,16 +683,19 @@ public class NodeImpl<T extends NodeDelegate> extends ItemImpl<T> implements Nod
             @Nonnull
             @Override
             public PropertyIterator perform() throws RepositoryException {
-                Iterator<PropertyDelegate> propertyNames = Iterators.filter(
-                        node.getProperties(),
-                        new Predicate<PropertyDelegate>() {
-                            @Override
-                            public boolean apply(PropertyDelegate entry) {
-                                // TODO: use Oak names
-                                return ItemNameMatcher.matches(toJcrPath(entry.getName()), nameGlobs);
-                            }
-                        });
-                return new PropertyIteratorAdapter(propertyIterator(propertyNames));
+                final PropertyIteratorDelegate delegate = new PropertyIteratorDelegate(node, new Predicate<PropertyDelegate>() {
+                    @Override
+                    public boolean apply(PropertyDelegate entry) {
+                        // TODO: use Oak names
+                        return ItemNameMatcher.matches(toJcrPath(entry.getName()), nameGlobs);
+                    }
+                });
+                return new PropertyIteratorAdapter(propertyIterator(delegate.iterator())){
+                    @Override
+                    public long getSize() {
+                        return delegate.getSize();
+                    }
+                };
             }
         });
     }
@@ -1582,4 +1588,28 @@ public class NodeImpl<T extends NodeDelegate> extends ItemImpl<T> implements Nod
             }
         });
     }
+
+    private static class PropertyIteratorDelegate {
+        private final NodeDelegate node;
+        private final Predicate<PropertyDelegate> predicate;
+
+        PropertyIteratorDelegate(NodeDelegate node, Predicate<PropertyDelegate> predicate) {
+            this.node = node;
+            this.predicate = predicate;
+        }
+
+        public Iterator<PropertyDelegate> iterator() throws InvalidItemStateException {
+            return Iterators.filter(node.getProperties(), predicate);
+        }
+
+        public long getSize() {
+            try {
+                return Iterators.size(iterator());
+            } catch (InvalidItemStateException e) {
+                throw new IllegalStateException(
+                        "This iterator is no longer valid", e);
+            }
+        }
+
+    }
 }
diff --git oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/PropertyTest.java oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/PropertyTest.java
index 75d6fbd..1218a6e 100644
--- oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/PropertyTest.java
+++ oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/PropertyTest.java
@@ -18,6 +18,7 @@ package org.apache.jackrabbit.oak.jcr;
 
 import javax.jcr.Node;
 import javax.jcr.Property;
+import javax.jcr.PropertyIterator;
 import javax.jcr.PropertyType;
 import javax.jcr.Value;
 import javax.jcr.ValueFormatException;
@@ -26,6 +27,7 @@ import javax.jcr.nodetype.NodeTypeTemplate;
 import javax.jcr.nodetype.PropertyDefinition;
 import javax.jcr.nodetype.PropertyDefinitionTemplate;
 
+import com.google.common.collect.Iterators;
 import org.apache.jackrabbit.JcrConstants;
 import org.apache.jackrabbit.test.AbstractJCRTest;
 
@@ -250,4 +252,26 @@ public class PropertyTest extends AbstractJCRTest {
             // success
         }
     }
+
+    public void testPropertyIteratorSize() throws Exception{
+        Node n = testRootNode.addNode("unstructured", JcrConstants.NT_UNSTRUCTURED);
+        n.setProperty("foo", "a");
+        n.setProperty("foo-1", "b");
+        n.setProperty("bar", "b");
+        n.setProperty("cat", "c");
+        superuser.save();
+
+        //Extra 1 for jcr:primaryType
+        PropertyIterator pitr = n.getProperties();
+        assertEquals(4 + 1, pitr.getSize());
+        assertEquals(4 + 1, Iterators.size(pitr));
+
+        pitr = n.getProperties("foo*");
+        assertEquals(2, pitr.getSize());
+        assertEquals(2, Iterators.size(pitr));
+
+        pitr = n.getProperties(new String[] {"foo*", "cat*"});
+        assertEquals(3, pitr.getSize());
+        assertEquals(3, Iterators.size(pitr));
+    }
 }
\ No newline at end of file
