Index: src/main/org/tigris/subversion/svnclientadapter/commandline/CmdLineClientAdapter.java
===================================================================
--- src/main/org/tigris/subversion/svnclientadapter/commandline/CmdLineClientAdapter.java	(revision 2941)
+++ src/main/org/tigris/subversion/svnclientadapter/commandline/CmdLineClientAdapter.java	(working copy)
@@ -795,6 +795,23 @@
 			throw SVNClientException.wrapException(e);
 		}
 	}
+	
+	public ISVNProperty propertyGet(SVNUrl url, SVNRevision revision, String propertyName) throws SVNClientException {
+		try {
+			InputStream valueAndData = _cmd.propget(url.toString(), propertyName, toString(revision));
+            
+			byte[] bytes = streamToByteArray(valueAndData);
+            if (bytes.length == 0) {
+                return null; // the property does not exist
+            }
+            
+			return new CmdLineProperty(propertyName, new String(bytes), url, bytes);
+		} catch (CmdLineException e) {
+			throw SVNClientException.wrapException(e);
+		} catch (IOException e) {
+			throw SVNClientException.wrapException(e);
+		}
+	}
 
     /*
      * (non-Javadoc)
Index: src/main/org/tigris/subversion/svnclientadapter/commandline/SvnCommandLine.java
===================================================================
--- src/main/org/tigris/subversion/svnclientadapter/commandline/SvnCommandLine.java	(revision 2941)
+++ src/main/org/tigris/subversion/svnclientadapter/commandline/SvnCommandLine.java	(working copy)
@@ -582,6 +582,25 @@
 
 	/**
 	 * <p>
+	 * Print value of <tt>propName</tt> on files, dirs, or revisions.</p>
+	 *
+	 * @param Local path of resource.
+	 * @param propName Property name whose value we wish to find.
+	 */
+	InputStream propget(String path, String propName, String revision) throws CmdLineException {
+        setCommand(ISVNNotifyListener.Command.PROPGET, false);
+        CmdArguments args = new CmdArguments();
+		args.add("propget");
+		args.add("--strict");
+		args.add(propName);
+		args.add(path + "@" + revision);
+        args.addAuthInfo(this.user, this.pass);
+        args.addConfigInfo(this.configDir);        
+		return execInputStream(args);
+	}
+
+	/**
+	 * <p>
 	 * Set <tt>propName</tt> to <tt>propVal</tt> on files or dirs.</p>
 	 * 
 	 * @param propName name of the property.
Index: src/main/org/tigris/subversion/svnclientadapter/ISVNClientAdapter.java
===================================================================
--- src/main/org/tigris/subversion/svnclientadapter/ISVNClientAdapter.java	(revision 2941)
+++ src/main/org/tigris/subversion/svnclientadapter/ISVNClientAdapter.java	(working copy)
@@ -688,6 +688,17 @@
 		throws SVNClientException;
 	
 	/**
+	 * get a property or null if property is not found
+	 * @param url
+	 * @param revision
+	 * @param propertyName
+	 * @return a property or null
+	 * @throws SVNClientException
+	 */
+	public abstract ISVNProperty propertyGet(SVNUrl url, SVNRevision revision, String propertyName)
+		throws SVNClientException;
+	
+	/**
 	 * delete a property
 	 * @param path
 	 * @param propertyName
Index: src/main/org/tigris/subversion/svnclientadapter/javahl/AbstractJhlClientAdapter.java
===================================================================
--- src/main/org/tigris/subversion/svnclientadapter/javahl/AbstractJhlClientAdapter.java	(revision 2941)
+++ src/main/org/tigris/subversion/svnclientadapter/javahl/AbstractJhlClientAdapter.java	(working copy)
@@ -1187,6 +1187,24 @@
 		}
 
 	}
+	
+	public ISVNProperty propertyGet(SVNUrl url, SVNRevision revision, String propertyName) throws SVNClientException {
+		try {
+			notificationHandler.setCommand(ISVNNotifyListener.Command.PROPGET);
+			String target = url.toString();
+			notificationHandler.logCommandLine(
+				"propget " + propertyName + " " + target);
+			notificationHandler.setBaseDir();
+			PropertyData propData = svnClient.propertyGet(target, propertyName, JhlConverter.convert(revision));
+            if (propData == null)
+                return null;
+            else
+			    return JhlPropertyData.newForUrl(propData);
+		} catch (ClientException e) {
+			notificationHandler.logException(e);
+			throw new SVNClientException(e);
+		}
+	}
 
     /* (non-Javadoc)
      * @see org.tigris.subversion.svnclientadapter.ISVNClientAdapter#propertyDel(java.io.File, java.lang.String, boolean)
Index: src/testcases/org/tigris/subversion/svnclientadapter/basictests/PropertiesTest.java
===================================================================
--- src/testcases/org/tigris/subversion/svnclientadapter/basictests/PropertiesTest.java	(revision 2941)
+++ src/testcases/org/tigris/subversion/svnclientadapter/basictests/PropertiesTest.java	(working copy)
@@ -16,7 +16,9 @@
 
 import org.tigris.subversion.svnclientadapter.ISVNProperty;
 import org.tigris.subversion.svnclientadapter.SVNKeywords;
+import org.tigris.subversion.svnclientadapter.SVNRevision;
 import org.tigris.subversion.svnclientadapter.SVNUrl;
+import org.tigris.subversion.svnclientadapter.SVNRevision.Number;
 import org.tigris.subversion.svnclientadapter.testUtils.OneTest;
 import org.tigris.subversion.svnclientadapter.testUtils.SVNTest;
 
@@ -67,10 +69,23 @@
         assertEquals(fileUrl, prop.getUrl());
         assertNull(prop.getFile());
         
-        // delete property
+        // delete properties
         client.propertyDel(dir,"myProp2",true);
         prop = client.propertyGet(file, "myProp2");
         assertNull(prop);
+        
+        //commit with deleteted property so we can test the properties on URL and revisions
+        client.commit(new File[] {dir}, "Commited properties", true);
+
+        long lastChangedRevision = client.getInfo(file).getLastChangedRevision().getNumber();
+        
+        //the last chagned revision of the file does not have the property
+        prop = client.propertyGet(fileUrl, SVNRevision.getRevision("" +lastChangedRevision), "myProp2");
+        assertNull(prop);
+
+        //the revision before has the property
+        prop = client.propertyGet(fileUrl, SVNRevision.getRevision("" + --lastChangedRevision), "myProp2");
+        assertNotNull(prop);
     }
 
     public void testBasicKeywords() throws Throwable {


