Index: src/test/java/org/xwiki/model/internal/DefaultModelConfigurationTest.java
===================================================================
--- src/test/java/org/xwiki/model/internal/DefaultModelConfigurationTest.java	(revision 27170)
+++ src/test/java/org/xwiki/model/internal/DefaultModelConfigurationTest.java	(working copy)
@@ -21,9 +21,11 @@
 
 import org.jmock.Expectations;
 import org.jmock.Mockery;
+import org.jmock.integration.junit4.JMock;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.xwiki.component.manager.ComponentManager;
 import org.xwiki.component.util.ReflectionUtils;
 import org.xwiki.configuration.ConfigurationSource;
@@ -36,6 +38,7 @@
  * @version $Id$
  * @since 2.2M1
  */
+@RunWith(JMock.class)
 public class DefaultModelConfigurationTest
 {
     private Mockery mockery = new Mockery();
@@ -69,12 +72,19 @@
                 will(returnValue("defaultSpace"));
             oneOf(mockSource).getProperty(with(equal("model.reference.default.attachment")), with(any(String.class)));
                 will(returnValue("defaultFilename"));
+            oneOf(mockSource).getProperty(with(equal("model.reference.default.object")), with(any(String.class)));
+                will(returnValue("defaultObject"));
+            oneOf(mockSource).getProperty(with(equal("model.reference.default.object_property")), 
+                with(any(String.class)));
+                will(returnValue("defaultProperty"));
         }});
         
         Assert.assertEquals("defaultWiki", this.configuration.getDefaultReferenceValue(EntityType.WIKI));
         Assert.assertEquals("defaultDocument", this.configuration.getDefaultReferenceValue(EntityType.DOCUMENT));
         Assert.assertEquals("defaultSpace", this.configuration.getDefaultReferenceValue(EntityType.SPACE));
         Assert.assertEquals("defaultFilename", this.configuration.getDefaultReferenceValue(EntityType.ATTACHMENT));
+        Assert.assertEquals("defaultObject", this.configuration.getDefaultReferenceValue(EntityType.OBJECT));
+        Assert.assertEquals("defaultProperty", this.configuration.getDefaultReferenceValue(EntityType.OBJECT_PROPERTY));
     }
 
     @Test
@@ -86,11 +96,17 @@
             oneOf(mockSource).getProperty("model.reference.default.space", "Main"); will(returnValue("Main"));
             oneOf(mockSource).getProperty("model.reference.default.attachment", "filename");
                 will(returnValue("filename"));
+            oneOf(mockSource).getProperty("model.reference.default.object", "object");
+                will(returnValue("Main.WebHome"));
+            oneOf(mockSource).getProperty("model.reference.default.object_property", "property");
+                will(returnValue("property"));
         }});
 
         Assert.assertEquals("xwiki", this.configuration.getDefaultReferenceValue(EntityType.WIKI));
         Assert.assertEquals("WebHome", this.configuration.getDefaultReferenceValue(EntityType.DOCUMENT));
         Assert.assertEquals("Main", this.configuration.getDefaultReferenceValue(EntityType.SPACE));
         Assert.assertEquals("filename", this.configuration.getDefaultReferenceValue(EntityType.ATTACHMENT));
+        Assert.assertEquals("Main.WebHome", configuration.getDefaultReferenceValue(EntityType.OBJECT));
+        Assert.assertEquals("property", configuration.getDefaultReferenceValue(EntityType.OBJECT_PROPERTY));
     }
 }
Index: src/test/java/org/xwiki/model/internal/reference/DefaultReferenceEntityReferenceResolverTest.java
===================================================================
--- src/test/java/org/xwiki/model/internal/reference/DefaultReferenceEntityReferenceResolverTest.java	(revision 27170)
+++ src/test/java/org/xwiki/model/internal/reference/DefaultReferenceEntityReferenceResolverTest.java	(working copy)
@@ -56,6 +56,9 @@
             allowing(mockModelConfiguration).getDefaultReferenceValue(EntityType.SPACE); will(returnValue("defspace"));
             allowing(mockModelConfiguration).getDefaultReferenceValue(EntityType.WIKI); will(returnValue("defwiki"));
             allowing(mockModelConfiguration).getDefaultReferenceValue(EntityType.DOCUMENT); will(returnValue("defpage"));
+            allowing(mockModelConfiguration).getDefaultReferenceValue(EntityType.OBJECT); will(returnValue("defobject"));
+            allowing(mockModelConfiguration).getDefaultReferenceValue(EntityType.OBJECT_PROPERTY); 
+            will(returnValue("defproperty"));
         }});
     }
 
@@ -144,4 +147,84 @@
         Assert.assertEquals(EntityType.WIKI, reference.getParent().getType());
         Assert.assertEquals("defwiki", reference.getParent().getName());
     }
+
+    /**
+     * Tests that a relative object reference is resolved correctly and completed with the default document parent.
+     */
+    @Test
+    public void testResolveObjectReferenceWhenMissingParents()
+    {
+        EntityReference reference =
+            resolver.resolve(new EntityReference("object", EntityType.OBJECT), EntityType.OBJECT);
+        Assert.assertEquals(EntityType.OBJECT, reference.getType());
+        Assert.assertEquals("object", reference.getName());
+        Assert.assertEquals(EntityType.DOCUMENT, reference.getParent().getType());
+        Assert.assertEquals("defpage", reference.getParent().getName());
+        Assert.assertEquals(EntityType.SPACE, reference.getParent().getParent().getType());
+        Assert.assertEquals("defspace", reference.getParent().getParent().getName());
+        Assert.assertEquals(EntityType.WIKI, reference.getParent().getParent().getParent().getType());
+        Assert.assertEquals("defwiki", reference.getParent().getParent().getParent().getName());
+    }
+
+    /**
+     * Tests that a relative object property is resolved correctly and completed with the default object parent.
+     */
+    @Test
+    public void testResolveObjectPropertyReferenceWhenMissingParents()
+    {
+        EntityReference reference =
+            resolver.resolve(new EntityReference("property", EntityType.OBJECT_PROPERTY), EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals(EntityType.OBJECT_PROPERTY, reference.getType());
+        Assert.assertEquals("property", reference.getName());        
+        Assert.assertEquals(EntityType.OBJECT, reference.getParent().getType());
+        Assert.assertEquals("defobject", reference.getParent().getName());
+        Assert.assertEquals(EntityType.DOCUMENT, reference.getParent().getParent().getType());
+        Assert.assertEquals("defpage", reference.getParent().getParent().getName());
+        Assert.assertEquals(EntityType.SPACE, reference.getParent().getParent().getParent().getType());
+        Assert.assertEquals("defspace", reference.getParent().getParent().getParent().getName());
+        Assert.assertEquals(EntityType.WIKI, reference.getParent().getParent().getParent().getParent().getType());
+        Assert.assertEquals("defwiki", reference.getParent().getParent().getParent().getParent().getName());
+    }
+
+    /**
+     * Test that a document reference, when resolved as an object reference, is correctly completed with the default
+     * values for object name.
+     */
+    @Test
+    public void testResolveObjectReferenceWhenTypeIsDocument()
+    {
+        EntityReference reference =
+            resolver.resolve(new EntityReference("page", EntityType.DOCUMENT, new EntityReference("space",
+                EntityType.SPACE, new EntityReference("wiki", EntityType.WIKI))), EntityType.OBJECT);
+        Assert.assertEquals(EntityType.OBJECT, reference.getType());
+        Assert.assertEquals("defobject", reference.getName());
+        Assert.assertEquals(EntityType.DOCUMENT, reference.getParent().getType());
+        Assert.assertEquals("page", reference.getParent().getName());
+        Assert.assertEquals(EntityType.SPACE, reference.getParent().getParent().getType());
+        Assert.assertEquals("space", reference.getParent().getParent().getName());
+        Assert.assertEquals(EntityType.WIKI, reference.getParent().getParent().getParent().getType());
+        Assert.assertEquals("wiki", reference.getParent().getParent().getParent().getName());
+    }
+
+    /**
+     * Test that a document reference, when resolved as a property reference, is correctly completed with the default
+     * values for object and property name.
+     */
+    @Test
+    public void testResolveObjectPropertyReferenceWhenTypeIsDocument()
+    {
+        EntityReference reference =
+            resolver.resolve(new EntityReference("page", EntityType.DOCUMENT, new EntityReference("space",
+                EntityType.SPACE, new EntityReference("wiki", EntityType.WIKI))), EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals(EntityType.OBJECT_PROPERTY, reference.getType());
+        Assert.assertEquals("defproperty", reference.getName());
+        Assert.assertEquals(EntityType.OBJECT, reference.getParent().getType());
+        Assert.assertEquals("defobject", reference.getParent().getName());
+        Assert.assertEquals(EntityType.DOCUMENT, reference.getParent().getParent().getType());
+        Assert.assertEquals("page", reference.getParent().getParent().getName());
+        Assert.assertEquals(EntityType.SPACE, reference.getParent().getParent().getParent().getType());
+        Assert.assertEquals("space", reference.getParent().getParent().getParent().getName());
+        Assert.assertEquals(EntityType.WIKI, reference.getParent().getParent().getParent().getParent().getType());
+        Assert.assertEquals("wiki", reference.getParent().getParent().getParent().getParent().getName());
+    }    
 }
Index: src/test/java/org/xwiki/model/internal/reference/DefaultStringEntityReferenceSerializerTest.java
===================================================================
--- src/test/java/org/xwiki/model/internal/reference/DefaultStringEntityReferenceSerializerTest.java	(revision 27170)
+++ src/test/java/org/xwiki/model/internal/reference/DefaultStringEntityReferenceSerializerTest.java	(working copy)
@@ -47,6 +47,10 @@
 
     private static final String DEFAULT_ATTACHMENT = "filename";
 
+    private static final String DEFAULT_OBJECT = "defobject";
+
+    private static final String DEFAULT_OBJECT_PROPERTY = "defproperty";
+
     private EntityReferenceSerializer serializer;
 
     private EntityReferenceResolver resolver;
@@ -73,6 +77,10 @@
                 will(returnValue(DEFAULT_PAGE));
             allowing(mockModelConfiguration).getDefaultReferenceValue(EntityType.ATTACHMENT);
                 will(returnValue(DEFAULT_ATTACHMENT));
+            allowing(mockModelConfiguration).getDefaultReferenceValue(EntityType.OBJECT);
+                will(returnValue(DEFAULT_OBJECT));
+            allowing(mockModelConfiguration).getDefaultReferenceValue(EntityType.OBJECT_PROPERTY);
+                will(returnValue(DEFAULT_OBJECT_PROPERTY));
         }});
     }
 
@@ -154,4 +162,62 @@
         
         Assert.assertEquals("wiki", serializer.serialize(reference.getParent().getParent()));
     }
+
+    /**
+     * Tests resolving and re-serializing an object reference.
+     */
+    @Test
+    public void testResolveAndSerializeObjectReference()
+    {
+        EntityReference reference = resolver.resolve("wiki:space.page^xwiki.class[0]", EntityType.OBJECT);
+        Assert.assertEquals("wiki:space.page^xwiki.class[0]", serializer.serialize(reference));
+
+        // default values
+        reference = resolver.resolve("", EntityType.OBJECT);
+        Assert.assertEquals("xwiki:XWiki.WebHome^defobject", serializer.serialize(reference));
+
+        // property reference with no object
+        reference = resolver.resolve("wiki:space.page#property", EntityType.OBJECT);
+        Assert.assertEquals("xwiki:XWiki.WebHome^wiki:space.page#property", serializer.serialize(reference));
+
+        // test escaping character
+        reference = resolver.resolve("wiki:space.page^xwiki.cla\\^ss[0]", EntityType.OBJECT);
+        Assert.assertEquals("wiki:space.page^xwiki.cla\\^ss[0]", serializer.serialize(reference));
+
+        reference = resolver.resolve("wiki:spa^ce.page^xwiki.cla\\^ss[0]", EntityType.OBJECT);
+        Assert.assertEquals("wiki:spa^ce.page^xwiki.cla\\^ss[0]", serializer.serialize(reference));
+
+        reference = resolver.resolve(":.\\^@", EntityType.OBJECT);
+        Assert.assertEquals("xwiki:XWiki.WebHome^:.\\^@", serializer.serialize(reference));
+    }
+
+    /**
+     * Tests resolving and re-serializing an object reference.
+     */
+    @Test
+    public void testResolveAndSerializePropertyReference()
+    {
+        EntityReference reference = resolver.resolve("wiki:space.page^xwiki.class[0]#prop", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals("wiki:space.page^xwiki.class[0]#prop", serializer.serialize(reference));
+
+        // default values
+        reference = resolver.resolve("", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals("xwiki:XWiki.WebHome^defobject#defproperty", serializer.serialize(reference));
+
+        // using separators
+        reference = resolver.resolve("space.page@attachment", EntityType.OBJECT_PROPERTY);
+        Assert
+            .assertEquals("xwiki:XWiki.WebHome^defobject#space.page@attachment", serializer.serialize(reference));
+
+        reference = resolver.resolve("space.page^xwiki.class[0]", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals("xwiki:XWiki.WebHome^defobject#space.page^xwiki.class[0]", serializer
+            .serialize(reference));
+
+        // test escaping character
+        reference = resolver.resolve("wiki:space.page^xwiki.class[0]#prop\\#erty", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals("wiki:space.page^xwiki.class[0]#prop\\#erty", serializer.serialize(reference));
+
+        reference = resolver.resolve("wiki:space.page#^xwiki.class[0]#property", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals("wiki:space.page#^xwiki.class[0]#property", serializer.serialize(reference));
+    }
 }
\ No newline at end of file
Index: src/test/java/org/xwiki/model/internal/reference/DefaultStringEntityReferenceResolverTest.java
===================================================================
--- src/test/java/org/xwiki/model/internal/reference/DefaultStringEntityReferenceResolverTest.java	(revision 27170)
+++ src/test/java/org/xwiki/model/internal/reference/DefaultStringEntityReferenceResolverTest.java	(working copy)
@@ -46,6 +46,10 @@
         
     private static final String DEFAULT_ATTACHMENT = "filename";
 
+    private static final String DEFAULT_OBJECT = "defobject";
+
+    private static final String DEFAULT_OBJECT_PROPERTY = "defproperty";
+
     private EntityReferenceResolver resolver;
 
     private Mockery mockery = new Mockery();
@@ -68,6 +72,10 @@
                 will(returnValue(DEFAULT_PAGE));
             allowing(mockModelConfiguration).getDefaultReferenceValue(EntityType.ATTACHMENT);
                 will(returnValue(DEFAULT_ATTACHMENT));
+            allowing(mockModelConfiguration).getDefaultReferenceValue(EntityType.OBJECT);
+                will(returnValue(DEFAULT_OBJECT));
+            allowing(mockModelConfiguration).getDefaultReferenceValue(EntityType.OBJECT_PROPERTY);
+                will(returnValue(DEFAULT_OBJECT_PROPERTY));
         }});
     }
 
@@ -176,4 +184,186 @@
         Assert.assertEquals(DEFAULT_PAGE, reference.extractReference(EntityType.DOCUMENT).getName());
         Assert.assertEquals(":.@", reference.getName());
     }
+
+    /**
+     * Tests resolving object references.
+     */
+    @Test
+    public void testResolveObjectReference()
+    {
+        EntityReference reference = resolver.resolve("wiki:space.page^xwiki.class[0]", EntityType.OBJECT);
+        Assert.assertEquals("wiki", reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("xwiki.class[0]", reference.getName());
+
+        // default values
+        reference = resolver.resolve("", EntityType.OBJECT);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals(DEFAULT_SPACE, reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals(DEFAULT_PAGE, reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals(DEFAULT_OBJECT, reference.getName());
+
+        // without some of the parents
+        reference = resolver.resolve("space.page^XWiki.Class[0]", EntityType.OBJECT);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("XWiki.Class[0]", reference.getName());
+
+        reference = resolver.resolve("page^XWiki.Class[0]", EntityType.OBJECT);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals(DEFAULT_SPACE, reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("XWiki.Class[0]", reference.getName());
+
+        reference = resolver.resolve("XWiki.Class", EntityType.OBJECT);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals(DEFAULT_SPACE, reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals(DEFAULT_PAGE, reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("XWiki.Class", reference.getName());
+
+        // property without object
+        reference = resolver.resolve("wiki:space.page#property", EntityType.OBJECT);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals(DEFAULT_SPACE, reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals(DEFAULT_PAGE, reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("wiki:space.page#property", reference.getName());
+
+        // object with no name
+        reference = resolver.resolve("wiki:space.page^", EntityType.OBJECT);
+        Assert.assertEquals("wiki", reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals(DEFAULT_OBJECT, reference.getName());
+
+        // test separator escape
+        reference = resolver.resolve("wiki:space.page^obje\\^ct", EntityType.OBJECT);
+        Assert.assertEquals("wiki", reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("obje^ct", reference.getName());
+        
+        // and that separators don't need to be escaped other than in the object name
+        reference = resolver.resolve("wiki:space.page^xwiki.class[0]", EntityType.OBJECT);
+        Assert.assertEquals("wiki", reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("xwiki.class[0]", reference.getName());
+        
+        reference = resolver.resolve("wiki:space.page^xwi\\\\.ki.class[0]", EntityType.OBJECT);
+        Assert.assertEquals("wiki", reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("xwi\\.ki.class[0]", reference.getName());
+
+        reference = resolver.resolve("wiki:spa^ce.page^xwiki.class[0]", EntityType.OBJECT);
+        Assert.assertEquals("wiki", reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("spa^ce", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("xwiki.class[0]", reference.getName());
+
+        reference = resolver.resolve(":.\\^@", EntityType.OBJECT);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals(DEFAULT_SPACE, reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals(DEFAULT_PAGE, reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals(":.^@", reference.getName());
+    }
+
+    /**
+     * Tests resolving object references.
+     */
+    @Test
+    public void testResolvePropertyReference()
+    {
+        EntityReference reference = resolver.resolve("wiki:space.page^xwiki.class[0]#prop", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals("wiki", reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("xwiki.class[0]", reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals("prop", reference.getName());
+
+        // default values
+        reference = resolver.resolve("", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals(DEFAULT_SPACE, reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals(DEFAULT_PAGE, reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals(DEFAULT_OBJECT, reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals(DEFAULT_OBJECT_PROPERTY, reference.getName());
+
+        // without some of the parents
+        reference = resolver.resolve("space.page^XWiki.Class[0]#prop", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("XWiki.Class[0]", reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals("prop", reference.getName());
+
+        reference = resolver.resolve("page^XWiki.Class[0]#prop", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals(DEFAULT_SPACE, reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("XWiki.Class[0]", reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals("prop", reference.getName());
+
+        reference = resolver.resolve("XWiki.Class[0]#prop", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals(DEFAULT_SPACE, reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals(DEFAULT_PAGE, reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("XWiki.Class[0]", reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals("prop", reference.getName());
+
+        reference = resolver.resolve("FooBar", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals(DEFAULT_SPACE, reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals(DEFAULT_PAGE, reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals(DEFAULT_OBJECT, reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals("FooBar", reference.getName());
+
+        // object without property, parsed as property
+        reference = resolver.resolve("wiki:space.page^XWiki.Class[0]", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals(DEFAULT_SPACE, reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals(DEFAULT_PAGE, reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals(DEFAULT_OBJECT, reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals("wiki:space.page^XWiki.Class[0]", reference.getName());
+
+        // empty prop
+        reference = resolver.resolve("wiki:space.page^XWiki.Class#", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals("wiki", reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("XWiki.Class", reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals(DEFAULT_OBJECT_PROPERTY, reference.getName());
+
+        // test separator escape
+        reference = resolver.resolve("wiki:space.page^xwiki.class[0]#prop\\#erty", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals("wiki", reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("xwiki.class[0]", reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals("prop#erty", reference.getName());
+
+        // and that separators don't need to be escaped other than in the property name
+        reference = resolver.resolve("wiki:space.page^x#wiki.class[0]#prop", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals("wiki", reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("page", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("x#wiki.class[0]", reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals("prop", reference.getName());
+
+        reference = resolver.resolve("wiki:space.pa#ge^xwiki.class[0]#prop", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals("wiki", reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals("space", reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals("pa#ge", reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals("xwiki.class[0]", reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals("prop", reference.getName());
+
+        reference = resolver.resolve(":^\\#.@", EntityType.OBJECT_PROPERTY);
+        Assert.assertEquals(DEFAULT_WIKI, reference.extractReference(EntityType.WIKI).getName());
+        Assert.assertEquals(DEFAULT_SPACE, reference.extractReference(EntityType.SPACE).getName());
+        Assert.assertEquals(DEFAULT_PAGE, reference.extractReference(EntityType.DOCUMENT).getName());
+        Assert.assertEquals(DEFAULT_OBJECT, reference.extractReference(EntityType.OBJECT).getName());
+        Assert.assertEquals(":^#.@", reference.getName());
+    }
 }
Index: src/test/java/org/xwiki/model/reference/ObjectReferenceTest.java
===================================================================
--- src/test/java/org/xwiki/model/reference/ObjectReferenceTest.java	(revision 0)
+++ src/test/java/org/xwiki/model/reference/ObjectReferenceTest.java	(revision 0)
@@ -0,0 +1,88 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.xwiki.model.reference;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+import org.xwiki.model.EntityType;
+
+/**
+ * Unit test for the Object reference ({@link ObjectReference}).
+ * 
+ * @version $Id$
+ * @since 2.2M2
+ */
+public class ObjectReferenceTest
+{
+    /**
+     * Ensures the equivalence of constructors.
+     */
+    @Test
+    public void testConstructors()
+    {
+        ObjectReference reference =
+            new ObjectReference(new EntityReference("Object", EntityType.OBJECT, new EntityReference("Page",
+                EntityType.DOCUMENT, new EntityReference("Space", EntityType.SPACE, new EntityReference("wiki",
+                    EntityType.WIKI)))));
+        assertEquals(reference, new ObjectReference("wiki", "Space", "Page", "Object"));
+        assertEquals(reference, new ObjectReference("Object", new DocumentReference("wiki", "Space", "Page")));
+    }
+
+    @Test
+    public void testInvalidType()
+    {
+        try {
+            ObjectReference reference = new ObjectReference(new EntityReference("className", EntityType.DOCUMENT));
+            fail("Should have thrown exception");
+        } catch (IllegalArgumentException expected) {
+            assertEquals("Invalid type [DOCUMENT] for an object reference", expected.getMessage());
+        }
+    }
+
+    @Test
+    public void testInvalidNullParent()
+    {
+        try {
+            ObjectReference reference = new ObjectReference(new EntityReference("className", EntityType.OBJECT, null));
+            fail("Should have thrown exception");
+        } catch (IllegalArgumentException expected) {
+            assertEquals("Invalid parent reference [null] for an object reference", expected.getMessage());
+        }
+    }
+
+    /**
+     * Tests that an object reference throws exception if it doesn't have a document as a parent.
+     */
+    @Test
+    public void testInvalidParentType()
+    {
+        try {
+            ObjectReference reference =
+                new ObjectReference(new EntityReference("className", EntityType.OBJECT, new EntityReference("Space",
+                    EntityType.SPACE)));
+            fail("Should have thrown exception");
+        } catch (IllegalArgumentException expected) {
+            assertEquals("Invalid parent reference [name = [Space], type = [SPACE], parent = [null]] for an object "
+                + "reference", expected.getMessage());
+        }
+    }
+}
Index: src/test/java/org/xwiki/model/reference/ObjectPropertyReferenceTest.java
===================================================================
--- src/test/java/org/xwiki/model/reference/ObjectPropertyReferenceTest.java	(revision 0)
+++ src/test/java/org/xwiki/model/reference/ObjectPropertyReferenceTest.java	(revision 0)
@@ -0,0 +1,91 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.xwiki.model.reference;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import org.junit.Test;
+import org.xwiki.model.EntityType;
+
+/**
+ * Unit test for the Property reference ({@link ObjectPropertyReference}).
+ * 
+ * @version $Id$
+ * @since 2.2M2
+ */
+public class ObjectPropertyReferenceTest
+{
+    /**
+     * Test equivalence of constructors.
+     */
+    @Test
+    public void testConstructors()
+    {
+        ObjectPropertyReference reference =
+            new ObjectPropertyReference(new EntityReference("property", EntityType.OBJECT_PROPERTY,
+                new EntityReference("Object", EntityType.OBJECT, new EntityReference("Page", EntityType.DOCUMENT,
+                    new EntityReference("Space", EntityType.SPACE, new EntityReference("wiki", EntityType.WIKI))))));
+        assertEquals(reference, new ObjectPropertyReference("wiki", "Space", "Page", "Object", "property"));
+        assertEquals(reference, new ObjectPropertyReference("property", new ObjectReference("wiki", "Space", "Page",
+            "Object")));
+    }
+
+    @Test
+    public void testInvalidType()
+    {
+        try {
+            ObjectPropertyReference reference =
+                new ObjectPropertyReference(new EntityReference("space.page", EntityType.DOCUMENT));
+            fail("Should have thrown exception");
+        } catch (IllegalArgumentException expected) {
+            assertEquals("Invalid type [DOCUMENT] for an object property reference", expected.getMessage());
+        }
+    }
+
+    @Test
+    public void testInvalidNullParent()
+    {
+        try {
+            ObjectPropertyReference reference =
+                new ObjectPropertyReference(new EntityReference("property", EntityType.OBJECT_PROPERTY, null));
+            fail("Should have thrown exception");
+        } catch (IllegalArgumentException expected) {
+            assertEquals("Invalid parent reference [null] for an object property reference", expected.getMessage());
+        }
+    }
+
+    /**
+     * Tests that an object reference throws exception if it doesn't have a document as a parent.
+     */
+    @Test
+    public void testInvalidParentType()
+    {
+        try {
+            ObjectPropertyReference reference =
+                new ObjectPropertyReference(new EntityReference("property", EntityType.OBJECT_PROPERTY,
+                    new EntityReference("Space", EntityType.SPACE)));
+            fail("Should have thrown exception");
+        } catch (IllegalArgumentException expected) {
+            assertEquals("Invalid parent reference [name = [Space], type = [SPACE], parent = [null]] for an object "
+                + "property reference", expected.getMessage());
+        }
+    }
+}
Index: src/main/java/org/xwiki/model/internal/DefaultModelConfiguration.java
===================================================================
--- src/main/java/org/xwiki/model/internal/DefaultModelConfiguration.java	(revision 27170)
+++ src/main/java/org/xwiki/model/internal/DefaultModelConfiguration.java	(working copy)
@@ -51,6 +51,8 @@
         put(EntityType.SPACE, "Main");
         put(EntityType.DOCUMENT, "WebHome");
         put(EntityType.ATTACHMENT, "filename");
+        put(EntityType.OBJECT, "object");
+        put(EntityType.OBJECT_PROPERTY, "property");
     }};
 
     /**
Index: src/main/java/org/xwiki/model/internal/reference/DefaultReferenceEntityReferenceResolver.java
===================================================================
--- src/main/java/org/xwiki/model/internal/reference/DefaultReferenceEntityReferenceResolver.java	(revision 27170)
+++ src/main/java/org/xwiki/model/internal/reference/DefaultReferenceEntityReferenceResolver.java	(working copy)
@@ -51,6 +51,8 @@
         put(EntityType.DOCUMENT, Arrays.asList(EntityType.SPACE));
         put(EntityType.SPACE, Arrays.asList(EntityType.WIKI, EntityType.SPACE));
         put(EntityType.WIKI, Collections.<EntityType>emptyList());
+        put(EntityType.OBJECT, Arrays.asList(EntityType.DOCUMENT));
+        put(EntityType.OBJECT_PROPERTY, Arrays.asList(EntityType.OBJECT));        
     }};
 
     /**
Index: src/main/java/org/xwiki/model/internal/reference/DefaultStringEntityReferenceSerializer.java
===================================================================
--- src/main/java/org/xwiki/model/internal/reference/DefaultStringEntityReferenceSerializer.java	(revision 27170)
+++ src/main/java/org/xwiki/model/internal/reference/DefaultStringEntityReferenceSerializer.java	(working copy)
@@ -44,12 +44,16 @@
         put(EntityType.ATTACHMENT, Arrays.asList("@"));
         put(EntityType.DOCUMENT, Arrays.asList("."));
         put(EntityType.SPACE, Arrays.asList(":", "."));
+        put(EntityType.OBJECT, Arrays.asList("^"));
+        put(EntityType.OBJECT_PROPERTY, Arrays.asList("#"));        
     }};
 
     private Map<EntityType, List<String>> replacements = new HashMap<EntityType, List<String>>() {{
         put(EntityType.ATTACHMENT, Arrays.asList("\\@"));
         put(EntityType.DOCUMENT, Arrays.asList("\\."));
         put(EntityType.SPACE, Arrays.asList("\\:", "\\."));
+        put(EntityType.OBJECT, Arrays.asList("\\^"));
+        put(EntityType.OBJECT_PROPERTY, Arrays.asList("\\#"));        
     }};
 
     /**
Index: src/main/java/org/xwiki/model/internal/reference/DefaultStringObjectReferenceResolver.java
===================================================================
--- src/main/java/org/xwiki/model/internal/reference/DefaultStringObjectReferenceResolver.java	(revision 0)
+++ src/main/java/org/xwiki/model/internal/reference/DefaultStringObjectReferenceResolver.java	(revision 0)
@@ -0,0 +1,56 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.xwiki.model.internal.reference;
+
+import org.xwiki.component.annotation.Component;
+import org.xwiki.component.annotation.Requirement;
+import org.xwiki.model.EntityType;
+import org.xwiki.model.reference.EntityReferenceResolver;
+import org.xwiki.model.reference.ObjectReference;
+import org.xwiki.model.reference.ObjectReferenceResolver;
+
+/**
+ * Specialized version of {@link org.xwiki.model.reference.EntityReferenceResolver} which can be considered a helper
+ * component to resolve {@link ObjectReference} objects from their string representation. This implementation uses fixed
+ * default values when parts of the Reference are missing in the string representation. Default values are retrieved
+ * from the {@link org.xwiki.model.ModelConfiguration} class.
+ * 
+ * @version $Id$
+ * @since 2.2M2
+ */
+@Component
+public class DefaultStringObjectReferenceResolver implements ObjectReferenceResolver<String>
+{
+    /**
+     * The default entity resolver, used to delegate actual resolving of string representations.
+     */
+    @Requirement
+    private EntityReferenceResolver<String> entityReferenceResolver;
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.xwiki.model.reference.DocumentReferenceResolver#resolve(Object)
+     */
+    public ObjectReference resolve(String objectReferenceRepresentation)
+    {
+        return new ObjectReference(entityReferenceResolver.resolve(objectReferenceRepresentation, EntityType.OBJECT));
+    }
+}
Index: src/main/java/org/xwiki/model/internal/reference/AbstractStringEntityReferenceResolver.java
===================================================================
--- src/main/java/org/xwiki/model/internal/reference/AbstractStringEntityReferenceResolver.java	(revision 27170)
+++ src/main/java/org/xwiki/model/internal/reference/AbstractStringEntityReferenceResolver.java	(working copy)
@@ -19,15 +19,15 @@
  */
 package org.xwiki.model.internal.reference;
 
-import org.xwiki.model.EntityType;
-import org.xwiki.model.reference.EntityReference;
-import org.xwiki.model.reference.EntityReferenceResolver;
-
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.xwiki.model.EntityType;
+import org.xwiki.model.reference.EntityReference;
+import org.xwiki.model.reference.EntityReferenceResolver;
+
 /**
  * Generic implementation deferring default values for unspecified reference parts to extending classes. This allows
  * for example both the Current Entity Reference Resolver and the Default Entity Reference Resolver to share the code
@@ -42,6 +42,8 @@
         put(EntityType.DOCUMENT, Arrays.asList('.', ':'));
         put(EntityType.ATTACHMENT, Arrays.asList('@', '.', ':'));
         put(EntityType.SPACE, Arrays.asList(':'));
+        put(EntityType.OBJECT, Arrays.asList('^', '.', ':'));
+        put(EntityType.OBJECT_PROPERTY, Arrays.asList('#', '^', '.', ':'));
     }};
 
     private Map<EntityType, List<EntityType>> entityTypes = new HashMap<EntityType, List<EntityType>>() {{
@@ -49,6 +51,10 @@
         put(EntityType.ATTACHMENT, Arrays.asList(EntityType.ATTACHMENT, EntityType.DOCUMENT, EntityType.SPACE,
             EntityType.WIKI));
         put(EntityType.SPACE, Arrays.asList(EntityType.SPACE, EntityType.WIKI));
+        put(EntityType.OBJECT, Arrays.asList(EntityType.OBJECT, EntityType.DOCUMENT, EntityType.SPACE,
+            EntityType.WIKI));
+        put(EntityType.OBJECT_PROPERTY, Arrays.asList(EntityType.OBJECT_PROPERTY, EntityType.OBJECT, 
+            EntityType.DOCUMENT, EntityType.SPACE, EntityType.WIKI));
     }};
 
     /**
@@ -59,6 +65,7 @@
 
     /**
      * {@inheritDoc}
+     * 
      * @see org.xwiki.model.reference.EntityReferenceResolver#resolve(Object, org.xwiki.model.EntityType)
      */
     public EntityReference resolve(String entityReferenceRepresentation, EntityType type)
Index: src/main/java/org/xwiki/model/internal/reference/DefaultStringObjectPropertyReferenceResolver.java
===================================================================
--- src/main/java/org/xwiki/model/internal/reference/DefaultStringObjectPropertyReferenceResolver.java	(revision 0)
+++ src/main/java/org/xwiki/model/internal/reference/DefaultStringObjectPropertyReferenceResolver.java	(revision 0)
@@ -0,0 +1,57 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.xwiki.model.internal.reference;
+
+import org.xwiki.component.annotation.Component;
+import org.xwiki.component.annotation.Requirement;
+import org.xwiki.model.EntityType;
+import org.xwiki.model.reference.EntityReferenceResolver;
+import org.xwiki.model.reference.ObjectPropertyReference;
+import org.xwiki.model.reference.ObjectPropertyReferenceResolver;
+
+/**
+ * Specialized version of {@link org.xwiki.model.reference.EntityReferenceResolver} which can be considered a helper
+ * component to resolve {@link ObjectPropertyReference} objects from their string representation. This implementation uses
+ * fixed default values when parts of the Reference are missing in the string representation. Default values are
+ * retrieved from the {@link org.xwiki.model.ModelConfiguration} class.
+ * 
+ * @version $Id$
+ * @since 2.2M2
+ */
+@Component
+public class DefaultStringObjectPropertyReferenceResolver implements ObjectPropertyReferenceResolver<String>
+{
+    /**
+     * The default entity resolver, used to delegate actual resolving of string representations.
+     */
+    @Requirement
+    private EntityReferenceResolver<String> entityReferenceResolver;
+
+    /**
+     * {@inheritDoc}
+     * 
+     * @see org.xwiki.model.reference.ObjectPropertyReferenceResolver#resolve(java.lang.Object)
+     */
+    public ObjectPropertyReference resolve(String propertyReferenceRepresentation)
+    {
+        return new ObjectPropertyReference(entityReferenceResolver.resolve(propertyReferenceRepresentation,
+            EntityType.OBJECT_PROPERTY));
+    }
+}
Index: src/main/java/org/xwiki/model/reference/ObjectReference.java
===================================================================
--- src/main/java/org/xwiki/model/reference/ObjectReference.java	(revision 0)
+++ src/main/java/org/xwiki/model/reference/ObjectReference.java	(revision 0)
@@ -0,0 +1,94 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.xwiki.model.reference;
+
+import org.xwiki.model.EntityType;
+
+/**
+ * Reference to an object in a document (by classname and index, document, space, wiki).
+ * 
+ * @since 2.2M2
+ * @version $Id$
+ */
+public class ObjectReference extends EntityReference
+{
+    /**
+     * Constructor which would raise exceptions if the source entity reference does not have the appropriate type or
+     * parent, etc.
+     * 
+     * @param reference the raw reference to build this object reference from
+     */
+    public ObjectReference(EntityReference reference)
+    {
+        super(reference.getName(), reference.getType(), reference.getParent());
+    }
+
+    /**
+     * @param wiki wiki where the parent document of the object is
+     * @param space space where the parent document of the object is
+     * @param document parent document of the object
+     * @param objectName the name of the object
+     */
+    public ObjectReference(String wiki, String space, String document, String objectName)
+    {
+        this(objectName, new DocumentReference(wiki, space, document));
+    }
+
+    /**
+     * @param objectName the name of the object
+     * @param documentReference the reference of the parent document of the object
+     */
+    public ObjectReference(String objectName, DocumentReference documentReference)
+    {
+        super(objectName, EntityType.OBJECT, documentReference);
+    }
+
+    /**
+     * {@inheritDoc} <br />
+     * Overridden to check the type to be an object type.
+     * 
+     * @see org.xwiki.model.reference.EntityReference#setType(org.xwiki.model.EntityType)
+     */
+    @Override
+    public void setType(EntityType type)
+    {
+        if (type != EntityType.OBJECT) {
+            throw new IllegalArgumentException("Invalid type [" + type + "] for an object reference");
+        }
+
+        super.setType(EntityType.OBJECT);
+    }
+
+    /**
+     * {@inheritDoc} <br />
+     * Overridden to ensure that the parent of an object is always a document.
+     * 
+     * @see org.xwiki.model.reference.EntityReference#setParent(org.xwiki.model.reference.EntityReference)
+     */
+    @Override
+    public void setParent(EntityReference parent)
+    {
+        if (parent == null || parent.getType() != EntityType.DOCUMENT) {
+            throw new IllegalArgumentException("Invalid parent reference [" + parent + "] for an object reference");
+        }
+
+        super.setParent(new DocumentReference(parent));
+    }
+}
Index: src/main/java/org/xwiki/model/reference/ObjectReferenceResolver.java
===================================================================
--- src/main/java/org/xwiki/model/reference/ObjectReferenceResolver.java	(revision 0)
+++ src/main/java/org/xwiki/model/reference/ObjectReferenceResolver.java	(revision 0)
@@ -0,0 +1,41 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.xwiki.model.reference;
+
+import org.xwiki.component.annotation.ComponentRole;
+
+/**
+ * Resolve an Object reference defined in a given representation into a validated {@link ObjectReference} object, i.e.
+ * with valid values and a valid hierarchy (e.g. an Object reference must have a parent which is a document reference,
+ * reference values must not be null, etc).
+ * 
+ * @version $Id$
+ * @since 2.2M2
+ * @param <T> the type of the representation (e.g. a String)
+ */
+@ComponentRole
+public interface ObjectReferenceResolver<T>
+{
+    /**
+     * @param objectReferenceRepresentation the representation of an object reference (e.g. as a String)
+     * @return the valid resolved object reference as an object
+     */
+    ObjectReference resolve(T objectReferenceRepresentation);
+}
Index: src/main/java/org/xwiki/model/reference/ObjectPropertyReference.java
===================================================================
--- src/main/java/org/xwiki/model/reference/ObjectPropertyReference.java	(revision 0)
+++ src/main/java/org/xwiki/model/reference/ObjectPropertyReference.java	(revision 0)
@@ -0,0 +1,98 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.xwiki.model.reference;
+
+import org.xwiki.model.EntityType;
+
+/**
+ * References a property in an object in a document (the value of the property).
+ * 
+ * @since 2.2M2
+ * @version $Id$
+ */
+public class ObjectPropertyReference extends EntityReference
+{
+    /**
+     * Constructor which would raise exceptions if the source entity reference does not have the appropriate type or
+     * parent, etc.
+     * 
+     * @param reference the raw reference to build this object reference from
+     */
+    public ObjectPropertyReference(EntityReference reference)
+    {
+        super(reference.getName(), reference.getType(), reference.getParent());
+    }
+
+    /**
+     * Builds a property reference for the passed property in the passed object.
+     * 
+     * @param propertyName the name of the property to create reference for
+     * @param objectReference the reference to the object whose property is
+     */
+    public ObjectPropertyReference(String propertyName, ObjectReference objectReference)
+    {
+        super(propertyName, EntityType.OBJECT_PROPERTY, objectReference);
+    }
+
+    /**
+     * @param wiki the wiki of the document where the parent object of this property is
+     * @param space the space of the document where the parent object of this property is
+     * @param page the document where the parent object of this property is
+     * @param objectName the name of the parent object of this property
+     * @param propertyName the name of the property to refer to
+     */
+    public ObjectPropertyReference(String wiki, String space, String page, String objectName, String propertyName)
+    {
+        this(propertyName, new ObjectReference(wiki, space, page, objectName));
+    }
+
+    /**
+     * {@inheritDoc} <br />
+     * Overridden to check the type to be a property type.
+     * 
+     * @see org.xwiki.model.reference.EntityReference#setType(org.xwiki.model.EntityType)
+     */
+    @Override
+    public void setType(EntityType type)
+    {
+        if (type != EntityType.OBJECT_PROPERTY) {
+            throw new IllegalArgumentException("Invalid type [" + type + "] for an object property reference");
+        }
+
+        super.setType(EntityType.OBJECT);
+    }
+
+    /**
+     * {@inheritDoc} <br />
+     * Overridden to ensure that the parent of a property is always an object.
+     * 
+     * @see org.xwiki.model.reference.EntityReference#setParent(org.xwiki.model.reference.EntityReference)
+     */
+    @Override
+    public void setParent(EntityReference parent)
+    {
+        if (parent == null || parent.getType() != EntityType.OBJECT) {
+            throw new IllegalArgumentException("Invalid parent reference [" + parent + "] for an object property "
+                + "reference");
+        }
+
+        super.setParent(new ObjectReference(parent));
+    }
+}
Index: src/main/java/org/xwiki/model/reference/ObjectPropertyReferenceResolver.java
===================================================================
--- src/main/java/org/xwiki/model/reference/ObjectPropertyReferenceResolver.java	(revision 0)
+++ src/main/java/org/xwiki/model/reference/ObjectPropertyReferenceResolver.java	(revision 0)
@@ -0,0 +1,41 @@
+/*
+ * See the NOTICE file distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.xwiki.model.reference;
+
+import org.xwiki.component.annotation.ComponentRole;
+
+/**
+ * Resolve a Property reference defined in a given representation into a validated {@link ObjectPropertyReference} object,
+ * i.e. with valid values and a valid hierarchy (e.g. a Property reference must have a parent which is an object
+ * reference, reference values must not be null, etc).
+ * 
+ * @version $Id$
+ * @since 2.2M2
+ * @param <T> the type of the representation (e.g. a String)
+ */
+@ComponentRole
+public interface ObjectPropertyReferenceResolver<T>
+{
+    /**
+     * @param propertyReferenceRepresentation the representation of an object reference (e.g. as a String)
+     * @return the valid resolved object reference as an object
+     */
+    ObjectPropertyReference resolve(T propertyReferenceRepresentation);
+}
Index: src/main/java/org/xwiki/model/EntityType.java
===================================================================
--- src/main/java/org/xwiki/model/EntityType.java	(revision 27170)
+++ src/main/java/org/xwiki/model/EntityType.java	(working copy)
@@ -46,7 +46,17 @@
     DOCUMENT,
 
     /**
-     * Represents an Attachment Entity. 
+     * Represents an Attachment Entity.
      */
-    ATTACHMENT;
+    ATTACHMENT,
+
+    /**
+     * Represents an Object Entity.
+     */
+    OBJECT,
+
+    /**
+     * Represents an Object Property Entity.
+     */
+    OBJECT_PROPERTY
 }
Index: src/main/resources/META-INF/components.txt
===================================================================
--- src/main/resources/META-INF/components.txt	(revision 27170)
+++ src/main/resources/META-INF/components.txt	(working copy)
@@ -5,5 +5,7 @@
 org.xwiki.model.internal.reference.DefaultStringDocumentReferenceResolver
 org.xwiki.model.internal.reference.DefaultReferenceDocumentReferenceResolver
 org.xwiki.model.internal.reference.DefaultStringAttachmentReferenceResolver
+org.xwiki.model.internal.reference.DefaultStringObjectPropertyReferenceResolver
+org.xwiki.model.internal.reference.DefaultStringObjectReferenceResolver
 org.xwiki.model.internal.DefaultModelConfiguration
 org.xwiki.model.internal.DefaultModelContext
\ No newline at end of file
