Index: jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/value/QValueFactoryImpl.java
===================================================================
--- jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/value/QValueFactoryImpl.java	(revision 650944)
+++ jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/value/QValueFactoryImpl.java	(working copy)
@@ -16,40 +16,41 @@
  */
 package org.apache.jackrabbit.spi.commons.value;
 
-import org.apache.jackrabbit.spi.commons.name.NameConstants;
-import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl;
-import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.io.Serializable;
+import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.TimeZone;
+
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.ValueFormatException;
+
 import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.NameFactory;
 import org.apache.jackrabbit.spi.Path;
+import org.apache.jackrabbit.spi.PathFactory;
 import org.apache.jackrabbit.spi.QPropertyDefinition;
 import org.apache.jackrabbit.spi.QValue;
 import org.apache.jackrabbit.spi.QValueFactory;
-import org.apache.jackrabbit.spi.PathFactory;
-import org.apache.jackrabbit.spi.NameFactory;
+import org.apache.jackrabbit.spi.commons.name.NameConstants;
+import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl;
+import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl;
+import org.apache.jackrabbit.util.ISO8601;
 import org.apache.jackrabbit.util.TransientFileFactory;
-import org.apache.jackrabbit.util.ISO8601;
 import org.apache.jackrabbit.uuid.UUID;
 
-import javax.jcr.RepositoryException;
-import javax.jcr.ValueFormatException;
-import javax.jcr.PropertyType;
-import java.util.Calendar;
-import java.util.Arrays;
-import java.util.TimeZone;
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.File;
-import java.io.ByteArrayInputStream;
-import java.io.UnsupportedEncodingException;
-import java.io.OutputStream;
-import java.io.FileOutputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.Serializable;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-
 /**
  * <code>QValueFactoryImpl</code>...
  */
@@ -144,6 +145,13 @@
     }
 
     /**
+     * @see QValueFactory#create(boolean)
+     */
+    public QValue create(boolean value) throws RepositoryException {
+        return new QValueImpl(Boolean.valueOf(value));
+    }
+
+    /**
      * @see QValueFactory#create(Name)
      */
     public QValue create(Name value) {
@@ -371,6 +379,18 @@
         }
 
         /**
+         * @throws RepositoryException
+         * @see QValue#getBoolean()
+         */
+        public boolean getBoolean() throws RepositoryException {
+            if (type == PropertyType.BOOLEAN) {
+                return ((Boolean) val).booleanValue();
+            } else {
+                return Boolean.valueOf(getString()).booleanValue();
+            }
+        }
+
+        /**
          * @see QValue#getPath()
          */
         public Path getPath() throws RepositoryException {
@@ -425,6 +445,7 @@
         public int hashCode() {
             return val.hashCode();
         }
+
     }
 
     //--------------------------------------------------------< Inner Class >---
@@ -744,6 +765,13 @@
         }
 
         /**
+         * @see QValue#getBoolean()
+         */
+        public boolean getBoolean() throws RepositoryException {
+            return Boolean.valueOf(getString()).booleanValue();
+        }
+
+        /**
          * @see QValue#getPath()
          */
         public Path getPath() throws RepositoryException {
@@ -903,5 +931,7 @@
             // deserialized value is always temp
             temp = true;
         }
+
     }
+
 }
\ No newline at end of file
Index: jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/value/QValueTest.java
===================================================================
--- jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/value/QValueTest.java	(revision 650944)
+++ jackrabbit-spi-commons/src/test/java/org/apache/jackrabbit/spi/commons/value/QValueTest.java	(working copy)
@@ -16,34 +16,34 @@
  */
 package org.apache.jackrabbit.spi.commons.value;
 
-import junit.framework.TestCase;
+import java.io.BufferedInputStream;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
+import java.util.Arrays;
+import java.util.Calendar;
 
 import javax.jcr.PropertyType;
 import javax.jcr.RepositoryException;
 import javax.jcr.ValueFormatException;
 
-import java.util.Calendar;
-import java.util.Arrays;
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.io.FileInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectOutputStream;
-import java.io.ByteArrayInputStream;
-import java.io.ObjectInputStream;
-import java.io.BufferedInputStream;
+import junit.framework.TestCase;
 
-import org.apache.jackrabbit.util.ISO8601;
-import org.apache.jackrabbit.uuid.UUID;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.Path;
 import org.apache.jackrabbit.spi.QValue;
 import org.apache.jackrabbit.spi.QValueFactory;
 import org.apache.jackrabbit.spi.commons.name.NameConstants;
 import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl;
+import org.apache.jackrabbit.util.ISO8601;
+import org.apache.jackrabbit.uuid.UUID;
 
 /**
  * <code>QValueTest</code>...
@@ -77,7 +77,7 @@
 
     public void testGetDoubleOnBooleanValue() throws RepositoryException {
         try {
-            QValue v = factory.create(Boolean.TRUE.toString(), PropertyType.BOOLEAN);
+            QValue v = factory.create(true);
             v.getDouble();
             fail("'true' cannot be converted to a valid double value.");
         } catch (ValueFormatException e) {
@@ -98,7 +98,7 @@
 
     public void testGetLongOnBooleanValue() throws RepositoryException {
         try {
-            QValue v = factory.create(Boolean.TRUE.toString(), PropertyType.BOOLEAN);
+            QValue v = factory.create(true);
             v.getLong();
             fail("'true' cannot be converted to a valid long value.");
         } catch (ValueFormatException e) {
@@ -106,6 +106,41 @@
         }
     }
 
+    //---------------------------------------------------------------< BOOLEAN >---
+
+    public void testCreateTrueBooleanValue() throws RepositoryException {
+        QValue v = factory.create(true);
+        assertEquals("Boolean value must be true", Boolean.TRUE.toString(), v.getString());
+        assertEquals("Boolean value must be true", true, v.getBoolean());
+    }
+
+    public void testCreateFalseBooleanValue() throws RepositoryException {
+        QValue v = factory.create(false);
+        assertEquals("Boolean value must be false", Boolean.FALSE.toString(), v.getString());
+        assertEquals("Boolean value must be false", false, v.getBoolean());
+    }
+
+    public void testCreateTrueFromString() throws ValueFormatException, RepositoryException {
+        QValue v = factory.create("true", PropertyType.STRING);
+        assertEquals("Boolean value must be true", true, v.getBoolean());
+    }
+
+    public void testCreateFalseFromString() throws ValueFormatException, RepositoryException {
+        QValue v = factory.create("any", PropertyType.STRING);
+        assertEquals("Boolean value must be false", false, v.getBoolean());
+    }
+
+    public void testReadBooleanAsLong() throws RepositoryException {
+        try {
+            QValue v = factory.create(true);
+            v.getLong();
+        }
+        catch (ValueFormatException e) {
+            return; // ok
+        }
+        assertTrue("Cannot convert value to long", false);
+    }
+
     //---------------------------------------------------------------< DATE >---
     public void testNullDateValue() throws IOException, RepositoryException {
         try {
Index: jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValue.java
===================================================================
--- jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValue.java	(revision 650944)
+++ jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValue.java	(working copy)
@@ -16,12 +16,13 @@
  */
 package org.apache.jackrabbit.spi;
 
-import javax.jcr.RepositoryException;
-import javax.jcr.PropertyType;
-import javax.jcr.Property;
 import java.io.InputStream;
 import java.util.Calendar;
 
+import javax.jcr.Property;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+
 /**
  * <code>QValue</code> is the qualified SPI representation of a
  * {@link javax.jcr.Value jcr value}. It therefore refers to <code>Name</code>s
@@ -107,6 +108,15 @@
     public long getLong() throws RepositoryException;
 
     /**
+     * Returns a <code>boolean</code> representation of this value.
+     *
+     * @return A <code>boolean</code> representation of this value.
+     * @throws RepositoryException if an error occurs.
+     */
+    public boolean getBoolean() throws RepositoryException;
+
+
+    /**
      * Returns a <code>Name</code> representation of this value.
      *
      * @return A <code>Name</code> representation of this value.
Index: jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueFactory.java
===================================================================
--- jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueFactory.java	(revision 650944)
+++ jackrabbit-spi/src/main/java/org/apache/jackrabbit/spi/QValueFactory.java	(working copy)
@@ -16,8 +16,8 @@
  */
 package org.apache.jackrabbit.spi;
 
+import java.io.File;
 import java.io.IOException;
-import java.io.File;
 import java.io.InputStream;
 import java.util.Calendar;
 
@@ -73,6 +73,15 @@
     public QValue create(long value) throws RepositoryException;
 
     /**
+     * Create a new <code>QValue</code> with type {@link javax.jcr.PropertyType#BOOLEAN}.
+     *
+     * @param value A <code>boolean</code> containing the value
+     * of the new <code>QValue</code>.
+     * @return a new <code>QValue</code>.
+     */
+    public QValue create(boolean value) throws RepositoryException;
+
+    /**
      * Create a new <code>QValue</code> with type {@link javax.jcr.PropertyType#NAME}.
      *
      * @param value A non-null <code>Name</code>.
