### Eclipse Workspace Patch 1.0
#P org.tigris.subversion.clientadapter.javahl
Index: src/org/tigris/subversion/svnclientadapter/javahl/AbstractJhlClientAdapter.java
===================================================================
--- src/org/tigris/subversion/svnclientadapter/javahl/AbstractJhlClientAdapter.java	(revision 4654)
+++ src/org/tigris/subversion/svnclientadapter/javahl/AbstractJhlClientAdapter.java	(working copy)
@@ -2270,7 +2270,63 @@
 			throw new SVNClientException(e);
 		}		
 	}
+	
+    /* (non-Javadoc)
+     * @see org.tigris.subversion.svnclientadapter.ISVNClientAdapter#getRevProperty(org.tigris.subversion.svnclientadapter.SVNUrl, org.tigris.subversion.svnclientadapter.SVNRevision.Number)
+     */
+    public String getRevProperty(SVNUrl url, SVNRevision.Number revisionNo, String propName) throws SVNClientException {
+      String propData = null;
+        try {
+            notificationHandler.setCommand(ISVNNotifyListener.Command.PROPGET);
 
+            notificationHandler.logCommandLine(
+                "propget --revprop -r " + revisionNo.toString()
+                    + " \""
+                    + propName
+                    + "\"  "
+                    + url.toString());
+            notificationHandler.setBaseDir();
+            PropertyData temp = svnClient.revProperty(url.toString(), propName, Revision.getInstance(revisionNo.getNumber())); //setRevProperty(url.toString(), propName, Revision.getInstance(revisionNo.getNumber()), fixSVNString(propertyData), true);
+            propData = temp.getValue();
+            if (propName.startsWith("svn:")) {
+              fixSVNString(propData);
+            } 
+        } catch (ClientException e) {
+            notificationHandler.logException(e);
+            throw new SVNClientException(e);
+        }    
+        return propData;
+    }	
+    
+    /* (non-Javadoc)
+     * @see org.tigris.subversion.svnclientadapter.ISVNClientAdapter#getRevProperties(org.tigris.subversion.svnclientadapter.SVNUrl, org.tigris.subversion.svnclientadapter.SVNRevision.Number)
+     */
+    public ISVNProperty[] getRevProperties(SVNUrl url, SVNRevision.Number revisionNo) throws SVNClientException {
+        try {
+            notificationHandler.setCommand(ISVNNotifyListener.Command.PROPLIST);
+            String target = url.toString();
+            notificationHandler.logCommandLine(
+                    "proplist --revprop -r " + revisionNo.toString()
+                    + target);
+            
+            notificationHandler.setBaseDir();
+            PropertyData[] propertiesData = svnClient.revProperties(target, Revision.getInstance(revisionNo.getNumber()));
+              //.properties(target, JhlConverter.convert(revision), JhlConverter.convert(pegRevision));
+            if (propertiesData == null) {
+                // no properties
+                return new JhlPropertyData[0];
+            }
+            JhlPropertyData[] svnProperties = new JhlPropertyData[propertiesData.length];
+            for (int i = 0; i < propertiesData.length;i++) {
+                svnProperties[i] = JhlPropertyData.newForUrl(propertiesData[i]);  
+            }
+            return svnProperties;
+        } catch (ClientException e) {
+            notificationHandler.logException(e);
+            throw new SVNClientException(e);
+        }       
+    }    
+
 	/* (non-Javadoc)
 	 * @see org.tigris.subversion.svnclientadapter.ISVNClientAdapter#getAdminDirectoryName()
 	 */
#P org.tigris.subversion.subclipse.ui
Index: src/org/tigris/subversion/subclipse/ui/actions/ShowSvnRevPropertiesAction.java
===================================================================
--- src/org/tigris/subversion/subclipse/ui/actions/ShowSvnRevPropertiesAction.java	(revision 0)
+++ src/org/tigris/subversion/subclipse/ui/actions/ShowSvnRevPropertiesAction.java	(revision 0)
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 Subclipse project and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Subclipse project committers - initial API and implementation
+ ******************************************************************************/
+package org.tigris.subversion.subclipse.ui.actions;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.IAction;
+import org.tigris.subversion.subclipse.core.ISVNLocalResource;
+import org.tigris.subversion.subclipse.core.SVNException;
+import org.tigris.subversion.subclipse.core.resources.SVNWorkspaceRoot;
+import org.tigris.subversion.subclipse.ui.ISVNUIConstants;
+import org.tigris.subversion.subclipse.ui.svnproperties.SvnRevPropertiesView;
+
+
+/**
+ * 
+ * Action for Show svn revision properties
+ * 
+ * 
+ */
+public class ShowSvnRevPropertiesAction extends WorkbenchWindowAction {
+
+    protected void execute(IAction action) throws InvocationTargetException, InterruptedException {
+        if (action != null && !action.isEnabled()) { 
+            action.setEnabled(true);
+        } 
+        else {
+            if (getSelectedResources() != null && getSelectedResources().length > 0) {
+                IResource resource = (IResource)getSelectedResources()[0];
+                final ISVNLocalResource svnResource = SVNWorkspaceRoot.getSVNResourceFor(resource);
+                try {        
+                    SvnRevPropertiesView view = (SvnRevPropertiesView)showView(SvnRevPropertiesView.VIEW_ID);
+                    if (view != null)
+                        view.showSvnProperties(svnResource);
+                        view.refresh();
+                } catch (SVNException e) {
+                    throw new InvocationTargetException(e);
+                }
+            }
+        }
+    }
+
+    protected boolean isEnabledForAddedResources() {
+        return true;
+    }
+
+    protected boolean isEnabledForIgnoredResources() {
+        return false;
+    }
+
+    protected boolean isEnabledForInaccessibleResources() {
+        return false;
+    }
+
+    protected boolean isEnabledForManagedResources() {
+        return true;
+    }
+
+    protected boolean isEnabledForMultipleResources() {
+        return false;
+    }
+
+    protected boolean isEnabledForUnmanagedResources() {
+        return false;
+    }
+    
+    /*
+     * @see org.tigris.subversion.subclipse.ui.actions.ReplaceableIconAction#getImageId()
+     */
+    protected String getImageId() {
+        return ISVNUIConstants.IMG_MENU_SHOWPROPERTY; // just re-use regular properties icon
+    }
+
+}
Index: src/org/tigris/subversion/subclipse/ui/settings/UnversionedCustomProperty.java
===================================================================
--- src/org/tigris/subversion/subclipse/ui/settings/UnversionedCustomProperty.java	(revision 0)
+++ src/org/tigris/subversion/subclipse/ui/settings/UnversionedCustomProperty.java	(revision 0)
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2010 Subclipse project and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Subclipse project committers - initial API and implementation
+ ******************************************************************************/
+package org.tigris.subversion.subclipse.ui.settings;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.tigris.subversion.subclipse.core.ISVNRemoteResource;
+import org.tigris.subversion.subclipse.core.SVNException;
+import org.tigris.subversion.subclipse.core.SVNProviderPlugin;
+import org.tigris.subversion.svnclientadapter.ISVNClientAdapter;
+import org.tigris.subversion.svnclientadapter.ISVNProperty;
+import org.tigris.subversion.svnclientadapter.SVNClientException;
+import org.tigris.subversion.svnclientadapter.SVNRevision;
+import org.tigris.subversion.svnclientadapter.SVNUrl;
+
+
+public class UnversionedCustomProperty {
+  
+  final private String name;
+  final private String value;
+  
+  public UnversionedCustomProperty(String name, String value) {
+    this.name = name;
+    this.value = value;
+  }
+
+  public String getName() { return name; }
+  
+  public String getValue() { return value; }  
+
+  public static UnversionedCustomProperty[] getSvnRevisionProperties(final ISVNRemoteResource remoteResource, final SVNRevision revision,
+      final SVNRevision peg)  throws SVNException {
+    return getSvnRevisionProperties(remoteResource, revision, peg, true);
+  }
+  
+  public static UnversionedCustomProperty[] getSvnRevisionProperties(final ISVNRemoteResource remoteResource, final SVNRevision revision,
+      final SVNRevision peg, final boolean customOnly)  throws SVNException {
+    
+    SVNUrl url= remoteResource.getUrl(); 
+ 
+    ISVNProperty[] props = getSvnRevisionProperties(url, revision, peg);
+    List<UnversionedCustomProperty> temp = new ArrayList<UnversionedCustomProperty>();
+    for (ISVNProperty prop : props) {
+      final String name = prop.getName();
+      final String value = prop.getValue();
+      // TODO: pull these from svnPropertyTypes prefixes rather than hardcoding
+      if (customOnly && (name.startsWith("svn:") || name.startsWith("bugtraq:") || name.startsWith("tsvn:"))) 
+        continue;
+      UnversionedCustomProperty ucp = new UnversionedCustomProperty(name, value);
+      temp.add(ucp);
+    }
+    UnversionedCustomProperty ret[] = temp.toArray(new UnversionedCustomProperty[0]);
+    return ret;
+  }
+  
+  public static ISVNProperty[] getSvnRevisionProperties(final SVNUrl url, final SVNRevision revision, final SVNRevision peg) throws SVNException {
+    return getSvnRevisionProperties(url, revision, peg, true);
+  }
+  
+  public static ISVNProperty[] getSvnRevisionProperties(final SVNUrl url, final SVNRevision revision, final SVNRevision peg, final boolean customOnly) throws SVNException {
+    try {
+        ISVNClientAdapter svnClient = SVNProviderPlugin.getPlugin().getSVNClient();
+        SVNProviderPlugin.disableConsoleLogging(); 
+        ISVNProperty[] props = svnClient.getRevProperties(url, (SVNRevision.Number)revision);
+        if (customOnly) 
+          return stripNonCustom(props);
+        return props;
+    } catch (SVNClientException e) {
+        throw SVNException.wrapException(e); 
+    } finally {
+        SVNProviderPlugin.enableConsoleLogging(); 
+    }
+  }  
+  
+  private static ISVNProperty[] stripNonCustom(final ISVNProperty[] propsIn) {
+    List<ISVNProperty> temp = new ArrayList<ISVNProperty>();
+    for (ISVNProperty property : propsIn) {
+      String name = property.getName();
+      if (name.startsWith("svn:") || name.startsWith("bugtraq:") || name.startsWith("tsvn:")) 
+        continue;
+      temp.add(property);
+    }
+    
+    ISVNProperty[] ret = temp.toArray(new ISVNProperty[0]);
+    return ret;
+  }
+  
+  private static final String NL = System.getProperty("line.separator");
+  
+  public static String asMultilineString(UnversionedCustomProperty[] props) {
+    StringBuilder sb = new StringBuilder(props.length * 64); // wag for reasonable size;
+    for (UnversionedCustomProperty prop : props) {
+      if (prop == null) break;
+      sb.append(prop.getName() + ": " + prop.getValue() + NL);
+    }
+    return sb.toString();
+  }
+  
+}
Index: plugin.properties
===================================================================
--- plugin.properties	(revision 4654)
+++ plugin.properties	(working copy)
@@ -153,6 +153,9 @@
 ShowHistoryAction.label=Show &History
 ShowHistoryCommand.label=Show History
 ShowHistoryAction.tooltip=Show History
+ShowRevisionPropertiesAction.label=Show Revision Properties
+ShowRevisionPropertiesCommand.label=Show Revision Properties
+ShowRevisionPropertiesAction.tooltip=Show Revision Properties
 ShowPendingOperationsAction.label=Show pending operations
 ShowPendingOperationsAction.tooltip=Show resources that need commit 
 ShowSvnPropertiesAction.label=Show Properties
@@ -172,6 +175,7 @@
 SVNGroupMenu.label=S&VN
 SVNMergeParticipant=SVN Merge
 SvnPropertiesView.name=SVN Properties
+SvnRevPropertiesView.name=SVN Rev Properties
 TreeConflictsView.name=SVN Tree Conflicts
 SVNRemoteQuickDiffProvider.label=&Latest SVN Revision
 SVNRepositoryExploring=SVN Repository Exploring
Index: src/org/tigris/subversion/subclipse/ui/messages.properties
===================================================================
--- src/org/tigris/subversion/subclipse/ui/messages.properties	(revision 4654)
+++ src/org/tigris/subversion/subclipse/ui/messages.properties	(working copy)
@@ -354,6 +354,7 @@
 HistoryView.affectedPathsCompressedLayout=&Compressed Folders
 HistoryView.affectedPathsHorizontalLayout=&Horizontal Layout
 HistoryView.affectedPathsVerticalLayout=&Vertical Layout
+HistoryView.showRevisionProperties=Show R&evision Properties
 HistorySearchDialog.comment=&Comment
 HistorySearchDialog.date=Start &date
 HistorySearchDialog.revision=Start &revision
@@ -1225,6 +1226,8 @@
 SvnPropertiesView.addKeywordsTooltip=Set keywords
 SvnPropertiesView.errorAddKeywordsTitle=Set keywords
 SvnPropertiesView.errorAddKeywordsMessage=Can't set keywords
+SvnRevPropertiesView.titleWithTwoArguments=Svn revision {0} properties for {1}
+SvnRevPropertiesView.titleWithOneArgument=Svn revision properties for {0}
 TreeConflictsView.resource=Resource
 TreeConflictsView.description=Description
 TreeConflictsView.noResource=No resource selected
Index: src/org/tigris/subversion/subclipse/ui/history/SVNHistoryPage.java
===================================================================
--- src/org/tigris/subversion/subclipse/ui/history/SVNHistoryPage.java	(revision 4654)
+++ src/org/tigris/subversion/subclipse/ui/history/SVNHistoryPage.java	(working copy)
@@ -97,6 +97,7 @@
 import org.eclipse.team.ui.history.IHistoryPageSite;
 import org.eclipse.ui.IActionBars;
 import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.dialogs.ContainerSelectionDialog;
 import org.eclipse.ui.editors.text.EditorsUI;
@@ -145,6 +146,7 @@
 import org.tigris.subversion.subclipse.ui.operations.ReplaceOperation;
 import org.tigris.subversion.subclipse.ui.operations.SwitchOperation;
 import org.tigris.subversion.subclipse.ui.settings.ProjectProperties;
+import org.tigris.subversion.subclipse.ui.svnproperties.SvnRevPropertiesView;
 import org.tigris.subversion.subclipse.ui.util.EmptySearchViewerFilter;
 import org.tigris.subversion.subclipse.ui.util.LinkList;
 import org.tigris.subversion.subclipse.ui.wizards.BranchTagWizard;
@@ -215,6 +217,7 @@
   private IAction updateToRevisionAction;
   private IAction openChangedPathAction;
   private IAction showHistoryAction;
+  private IAction showRevisionPropertiesAction;  
   private IAction compareAction;
   private IAction showAnnotationAction;
   private IAction exportAction;
@@ -729,6 +732,9 @@
           manager.add(getCreateTagFromRevisionAction());
           // }
           manager.add(getSetCommitPropertiesAction());
+          
+          manager.add(getShowRevisionPropertiesAction());
+          
           ILogEntry logEntry = (ILogEntry)((IStructuredSelection)sel).getFirstElement();
           if (logEntry.getNumberOfChildren() > 0)
         	  manager.add(getShowRevisionsAction());
@@ -2129,6 +2135,46 @@
     return setCommitPropertiesAction;
   }
   
+  private IAction getShowRevisionPropertiesAction() {
+  if(showRevisionPropertiesAction == null) {
+    showRevisionPropertiesAction = new Action(Policy.bind("HistoryView.showRevisionProperties")) { //$NON-NLS-1$
+      public void run() {
+        try {
+          final ISelection selection = getSelection();
+          if( !(selection instanceof IStructuredSelection))
+            return;
+          final ILogEntry ourSelection = getLogEntry((IStructuredSelection) selection);
+
+          SVNRevision rev = ourSelection.getRevision();
+          ISVNRemoteResource selectionRemoteResource = ourSelection.getRemoteResource();
+                    
+          SvnRevPropertiesView revPropsView = (SvnRevPropertiesView)getSite().getPage().findView(SvnRevPropertiesView.VIEW_ID);   
+            
+          if (revPropsView == null) {
+            try {
+              getSite().getPage().showView(SvnRevPropertiesView.VIEW_ID);
+            } catch (PartInitException e) {
+              SVNUIPlugin.openError(getSite().getShell(), null, null, e, SVNUIPlugin.LOG_TEAM_EXCEPTIONS);
+            }
+            
+          } 
+          revPropsView.showSvnProperties(selectionRemoteResource);
+          revPropsView.refresh();
+        } catch(SVNException e) {
+          SVNUIPlugin.openError(getSite().getShell(), null, null, e, SVNUIPlugin.LOG_TEAM_EXCEPTIONS);
+        }
+      }
+
+      // we don't allow multiple selection
+      public boolean isEnabled() {
+        ISelection selection = getSelection();
+        return selection instanceof IStructuredSelection && ((IStructuredSelection) selection).size() == 1;
+      }
+    };
+  }
+  return showRevisionPropertiesAction;
+}
+  
   private IAction getShowRevisionsAction() {
 	  if (showRevisionsAction == null) {
 		  showRevisionsAction = new Action(Policy.bind("HistoryView.showMergedRevisions")) { //$NON-NLS-1$
Index: plugin.xml
===================================================================
--- plugin.xml	(revision 4654)
+++ plugin.xml	(working copy)
@@ -44,6 +44,13 @@
             id="org.tigris.subversion.subclipse.ui.svnproperties.SvnPropertiesView">
       </view>
       <view
+            name="%SvnRevPropertiesView.name"
+            icon="icons/full/cview16/props_view.gif"
+            category="org.tigris.subversion.subclipse"
+            class="org.tigris.subversion.subclipse.ui.svnproperties.SvnRevPropertiesView"
+            id="org.tigris.subversion.subclipse.ui.svnproperties.SvnRevPropertiesView">
+      </view>
+      <view
             name="%AnnotateView.name"
             icon="icons/full/cview16/annotate_view.gif"
             category="org.tigris.subversion.subclipse"
Index: src/org/tigris/subversion/subclipse/ui/svnproperties/SvnRevPropertiesView.java
===================================================================
--- src/org/tigris/subversion/subclipse/ui/svnproperties/SvnRevPropertiesView.java	(revision 0)
+++ src/org/tigris/subversion/subclipse/ui/svnproperties/SvnRevPropertiesView.java	(revision 0)
@@ -0,0 +1,511 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2010 Subclipse project and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Subclipse project committers - initial API and implementation
+ ******************************************************************************/
+
+package org.tigris.subversion.subclipse.ui.svnproperties;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IMenuListener;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.text.Document;
+import org.eclipse.jface.text.TextViewer;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.team.ui.history.IHistoryPage;
+import org.eclipse.team.ui.history.IHistoryPageSite;
+import org.eclipse.team.ui.history.IHistoryView;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.ISelectionListener;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+import org.tigris.subversion.subclipse.core.IResourceStateChangeListener;
+import org.tigris.subversion.subclipse.core.ISVNLocalResource;
+import org.tigris.subversion.subclipse.core.ISVNRemoteResource;
+import org.tigris.subversion.subclipse.core.SVNException;
+import org.tigris.subversion.subclipse.core.SVNProviderPlugin;
+import org.tigris.subversion.subclipse.core.resources.LocalResourceStatus;
+import org.tigris.subversion.subclipse.ui.IHelpContextIds;
+import org.tigris.subversion.subclipse.ui.ISVNUIConstants;
+import org.tigris.subversion.subclipse.ui.Policy;
+import org.tigris.subversion.subclipse.ui.SVNUIPlugin;
+import org.tigris.subversion.subclipse.ui.conflicts.PropertyConflict;
+import org.tigris.subversion.subclipse.ui.settings.UnversionedCustomProperty;
+import org.tigris.subversion.svnclientadapter.ISVNProperty;
+import org.tigris.subversion.svnclientadapter.SVNRevision;
+import org.tigris.subversion.svnclientadapter.SVNStatusKind;
+
+
+
+public class SvnRevPropertiesView extends ViewPart {
+  public static final String VIEW_ID = "org.tigris.subversion.subclipse.ui.svnproperties.SvnRevPropertiesView"; //$NON-NLS-1$
+  
+  private TableViewer tableViewer;
+  private TextViewer textViewer;
+  private ISVNLocalResource resource;
+  private ISVNRemoteResource remoteResource;
+  private Action refreshAction;
+  private Label statusLabel;
+  private ISelectionListener pageSelectionListener;
+  private ISelectionChangedListener historyRevisionListener;
+  private IResourceStateChangeListener resourceStateChangeListener;
+  
+  private PropertyConflict[] conflicts;  
+
+
+  class ResourceStateChangeListener implements IResourceStateChangeListener {
+    /**
+     * the svn status of some resources changed. Refresh if we are concerned
+     */
+    public void resourceSyncInfoChanged(IResource[] changedResources) {
+        for (int i = 0; i < changedResources.length;i++) {
+            if (resource != null && changedResources[i].equals(resource.getIResource())) {
+                refresh();
+            }
+        }
+    }
+
+    public void resourceModified(IResource[] changedResources) {}
+
+    public void projectConfigured(IProject project) {}
+
+    public void projectDeconfigured(IProject project) {}
+    
+    public void initialize() {}
+}  
+  
+  public SvnRevPropertiesView() {
+  }
+  
+  /*
+   *  (non-Javadoc)
+   * @see org.eclipse.ui.IWorkbenchPart#dispose()
+   */
+  public void dispose() {
+      SVNProviderPlugin.removeResourceStateChangeListener(resourceStateChangeListener);
+      resourceStateChangeListener = null;
+      getSite().getPage().removePostSelectionListener(pageSelectionListener);
+      if (historyRevisionListener != null) {
+    
+      }
+      super.dispose();
+  }
+
+  class PropertiesLabelProvider implements ITableLabelProvider {
+    
+    public PropertiesLabelProvider() {
+    }
+    
+    /**
+     * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
+     */
+    public Image getColumnImage(Object element, int columnIndex) {
+        if (columnIndex == 0 && element != null && conflicts != null) {
+            ISVNProperty svnProperty = (ISVNProperty)element; 
+            for (int i = 0; i < conflicts.length; i++) {
+                if (conflicts[i].getPropertyName().equals(svnProperty.getName())) {
+                    return SVNUIPlugin.getImage(ISVNUIConstants.IMG_PROPERTY_CONFLICTED);                       
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
+     */
+    public String getColumnText(Object element, int columnIndex) {
+        if (element == null)
+            return ""; //$NON-NLS-1$
+        ISVNProperty svnProperty = (ISVNProperty)element; 
+        
+        String result = null;
+        switch (columnIndex) {
+            case 1 :
+                result = svnProperty.getName();
+                break;
+            case 2 : 
+                result = svnProperty.getValue();
+                break;
+        }
+        // This method must not return null
+        if (result == null) result = ""; //$NON-NLS-1$
+        return result;
+
+    }
+
+    /**
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+     */
+    public void addListener(ILabelProviderListener listener) {
+    }
+
+    /**
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
+     */
+    public void dispose() {
+    }
+
+    /**
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
+     */
+    public boolean isLabelProperty(Object element, String property) {
+        return false;
+    }
+
+    /**
+     * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+     */
+    public void removeListener(ILabelProviderListener listener) {
+    }
+
+}  
+  
+
+  private TableViewer createTable(Composite parent) {
+      Table table =   new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI);
+      table.setHeaderVisible(true);
+      table.setLinesVisible(true);
+
+      GridData gridData = new GridData(GridData.FILL_BOTH);
+      table.setLayoutData(gridData);
+      TableLayout layout = new TableLayout();
+      table.setLayout(layout);
+      
+      tableViewer = new TableViewer(table);
+      createColumns(table, layout);
+
+      tableViewer.setContentProvider(new ArrayContentProvider());
+      tableViewer.setLabelProvider(new PropertiesLabelProvider());
+      return tableViewer;
+  }
+
+  /**
+   * Create the TextViewer 
+   */
+  protected TextViewer createText(Composite parent) {
+      return new TextViewer(parent, SWT.V_SCROLL | SWT.WRAP | SWT.MULTI | SWT.READ_ONLY);
+  }
+  
+  /**
+   * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
+   */
+  public void createPartControl(Composite parent) {
+      GridLayout layout = new GridLayout();
+      layout.marginWidth = 0;
+      layout.marginHeight = 0;
+      layout.numColumns = 1;
+      parent.setLayout(layout);       
+      statusLabel = new Label(parent,SWT.LEFT);
+      GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
+      gridData.grabExcessHorizontalSpace = true;
+      statusLabel.setLayoutData(gridData);
+
+      SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
+      sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
+      tableViewer = createTable(sashForm);
+      textViewer = createText(sashForm);
+      sashForm.setWeights(new int[] { 70, 30 });
+
+      contributeActions();        
+      
+      pageSelectionListener = new ISelectionListener() {
+          public void selectionChanged(IWorkbenchPart part, ISelection selection) {
+              handlePartSelectionChanged(part,selection);
+          }
+      };
+      
+      getSite().getPage().addPostSelectionListener(pageSelectionListener);
+      resourceStateChangeListener = new ResourceStateChangeListener();
+      SVNProviderPlugin.addResourceStateChangeListener(resourceStateChangeListener);
+      
+  }
+  
+  /**
+   * called when the selection changed on another part  
+   */
+  private void handlePartSelectionChanged(IWorkbenchPart part, ISelection selection) {
+      if (!(selection instanceof IStructuredSelection))
+          return;
+      
+      try {
+          Object first = ((IStructuredSelection)selection).getFirstElement(); 
+
+          if (first instanceof IAdaptable) {
+              IAdaptable a = (IAdaptable) first;
+              Object adapter = a.getAdapter(IResource.class);
+              if (adapter instanceof IResource) {
+                  IResource resource = (IResource)adapter;
+                  
+                  // If the resource isn't open or doesn't exist it won't have properties
+                  if (!resource.isAccessible()) {
+                      clearSvnProperties();
+                      refresh();
+                  } else {
+                      ISVNLocalResource svnResource = (ISVNLocalResource)resource.getAdapter(ISVNLocalResource.class);
+                      showSvnProperties(svnResource);
+                      refresh();
+                  }
+              }
+          }
+      } catch (SVNException e) {
+      }   
+  }  
+  
+  private Action getRefreshAction() {
+    if (refreshAction == null) {
+        SVNUIPlugin plugin = SVNUIPlugin.getPlugin();
+        refreshAction = new Action(Policy.bind("SvnPropertiesView.refreshLabel"), plugin.getImageDescriptor(ISVNUIConstants.IMG_REFRESH_ENABLED)) { //$NON-NLS-1$
+            public void run() {
+                try {
+                  if (resource != null)
+                    showSvnProperties(resource);
+                  else if (remoteResource != null)
+                    showSvnProperties(remoteResource);
+                } catch (SVNException e) {; } // eat it
+                refresh();
+            }
+        };
+        refreshAction.setToolTipText(Policy.bind("SvnPropertiesView.refresh")); //$NON-NLS-1$
+        refreshAction.setDisabledImageDescriptor(plugin.getImageDescriptor(ISVNUIConstants.IMG_REFRESH_DISABLED));
+        refreshAction.setHoverImageDescriptor(plugin.getImageDescriptor(ISVNUIConstants.IMG_REFRESH));
+    }
+    return refreshAction;
+}
+
+// TODO: Add, modify and Delete actions, this rev is just view only for now  
+  
+/**
+ * Adds the action contributions for this view.
+ */    
+public void contributeActions() {
+    // Contribute actions to popup menu for the table
+    MenuManager menuMgr = new MenuManager();
+    Menu menu = menuMgr.createContextMenu(tableViewer.getTable());
+    menuMgr.addMenuListener(new IMenuListener() {
+        public void menuAboutToShow(IMenuManager menuMgr) {
+            fillTableMenu(menuMgr);
+        }
+    });
+    menuMgr.setRemoveAllWhenShown(true);
+    tableViewer.getTable().setMenu(menu);
+    getSite().registerContextMenu(menuMgr, tableViewer); 
+
+    // Create the local tool bar
+    IActionBars actionBars = getViewSite().getActionBars();
+    IToolBarManager tbm = actionBars.getToolBarManager();
+    tbm.add(getRefreshAction());
+    tbm.update(false);
+    
+    // set F1 help
+    PlatformUI.getWorkbench().getHelpSystem().setHelp(tableViewer.getControl(), IHelpContextIds.REV_PROPERTIES_VIEW);
+
+    // set the selectionchanged listener for the table
+    // updates property value when selection changes
+    tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+        public void selectionChanged(SelectionChangedEvent event) {
+            ISelection selection = event.getSelection();
+            if (selection == null || !(selection instanceof IStructuredSelection)) {
+                textViewer.setDocument(new Document("")); //$NON-NLS-1$
+                return;
+            }
+            IStructuredSelection ss = (IStructuredSelection)selection;
+            if (ss.size() != 1) {
+                textViewer.setDocument(new Document("")); //$NON-NLS-1$
+                return;
+            }
+            ISVNProperty property = (ISVNProperty)ss.getFirstElement();
+            textViewer.setDocument(new Document(property.getValue()));
+        }
+    });
+}
+
+/**
+ * fill the popup menu for the table
+ */
+private void fillTableMenu(IMenuManager manager) {
+    manager.add(getRefreshAction());
+ }
+
+/**
+ * Method createColumns.
+ * @param table
+ * @param layout
+ * @param viewer
+ */
+private void createColumns(Table table, TableLayout layout) {
+
+    TableColumn col;
+    
+    // name
+    col = new TableColumn(table, SWT.NONE);
+    col.setResizable(false);
+    layout.addColumnData(new ColumnWeightData(1, true));
+
+    // name
+    col = new TableColumn(table, SWT.NONE);
+    col.setResizable(true);
+    col.setText(Policy.bind("SvnPropertiesView.propertyName")); //$NON-NLS-1$
+    layout.addColumnData(new ColumnWeightData(60, true));
+
+    // value
+    col = new TableColumn(table, SWT.NONE);
+    col.setResizable(true);
+    col.setText(Policy.bind("SvnPropertiesView.propertyValue")); //$NON-NLS-1$
+    layout.addColumnData(new ColumnWeightData(120, true));
+}
+
+/**
+ * @see org.eclipse.ui.IWorkbenchPart#setFocus()
+ */
+public void setFocus() {
+    tableViewer.getControl().setFocus();
+}
+
+/**
+ * refresh the view
+ */
+public void refresh()  {
+
+    Display.getDefault().syncExec(new Runnable() {
+        public void run() {
+            try {
+                ISVNProperty[] props = getSvnRevProperties();
+                tableViewer.setInput(props);
+                tableViewer.refresh();
+            } catch (SVNException e) {
+                // silently ignore exception
+            }
+        }
+    });
+}
+
+/**
+ * update the status text
+ *
+ */
+private void updateStatus() {
+    conflicts = null;
+    if (resource == null && remoteResource == null) {
+        statusLabel.setText(""); //$NON-NLS-1$
+        return;
+    }
+    if (resource != null) {
+    try {
+        LocalResourceStatus status = resource.getStatus();
+        if (!resource.isManaged()) {
+            statusLabel.setText(Policy.bind("SvnPropertiesView.resourceNotManaged")); //$NON-NLS-1$
+        } else 
+        if (status.getPropStatus().equals(SVNStatusKind.MODIFIED))
+        {
+            statusLabel.setText(Policy.bind("SvnPropertiesView.somePropertiesModified")); //$NON-NLS-1$
+        } else
+        if (status.getPropStatus().equals(SVNStatusKind.NORMAL)) {
+            statusLabel.setText(Policy.bind("SvnPropertiesView.noPropertiesModified")); //$NON-NLS-1$
+        } else
+        if (status.getPropStatus().equals(SVNStatusKind.CONFLICTED))
+        {
+            statusLabel.setText(Policy.bind("SvnPropertiesView.conflictOnProperties")); //$NON-NLS-1$
+            try {
+                conflicts = PropertyConflict.getPropertyConflicts(resource);
+            } catch (Exception e) {}
+        } else {
+            statusLabel.setText(""); //$NON-NLS-1$
+        }
+    } catch (SVNException e) {
+        statusLabel.setText(Policy.bind("SvnPropertiesView.errorGettingStatus")); //$NON-NLS-1$
+    }
+    }
+}
+
+public void clearSvnProperties() {
+  setContentDescription("");
+  updateStatus();
+}
+    
+  /**
+   * Shows the properties for the given resource 
+   */
+  public void showSvnProperties(ISVNLocalResource resource) throws SVNException {
+      this.resource = resource;
+      this.remoteResource = null;
+      
+      if (resource != null) {
+          if (resource.isManaged()) {
+              if (resource.getRevision() != null) {
+                setContentDescription(Policy.bind("SvnRevPropertiesView.titleWithTwoArguments", resource.getRevision().toString(), resource.getName())); //$NON-NLS-1$
+              }
+          } else {
+              setContentDescription(Policy.bind("SvnRevPropertiesView.titleWithOneArgument", resource.getName())); //$NON-NLS-1$
+          }
+      } else {
+          setContentDescription(""); //$NON-NLS-1$
+      }
+      updateStatus();
+  }  
+  
+  /**
+   * Shows the properties for the given resource 
+   */
+  public void showSvnProperties(ISVNRemoteResource resource) throws SVNException {
+      this.remoteResource = resource;
+      this.resource = null;
+      if (resource != null) {
+        if (resource.getRevision() != null) {
+          setContentDescription(Policy.bind("SvnRevPropertiesView.titleWithTwoArguments", resource.getRevision().toString(), resource.getName())); //$NON-NLS-1$
+        }
+      } else {
+          setContentDescription(""); //$NON-NLS-1$
+      }
+      updateStatus();
+  }  
+  
+  private ISVNProperty[] getSvnRevProperties() throws SVNException {
+    
+    if(resource != null && resource.isManaged()) {
+      SVNRevision rev = resource.getRevision();
+      ISVNRemoteResource remoteResource = resource.getRemoteResource(rev);
+      return UnversionedCustomProperty.getSvnRevisionProperties(remoteResource.getUrl(), rev, null);
+    }
+    
+    if (remoteResource != null) {
+      SVNRevision rev = remoteResource.getRevision();
+      return UnversionedCustomProperty.getSvnRevisionProperties(remoteResource.getUrl(), rev, null);
+    }
+    
+    return null;
+  }
+  
+}
Index: src/org/tigris/subversion/subclipse/ui/IHelpContextIds.java
===================================================================
--- src/org/tigris/subversion/subclipse/ui/IHelpContextIds.java	(revision 4654)
+++ src/org/tigris/subversion/subclipse/ui/IHelpContextIds.java	(working copy)
@@ -91,6 +91,7 @@
 	public static final String COMPARE_REVISIONS_VIEW = PREFIX + "compare_revision_view_context"; //$NON-NLS-1$
 	public static final String ANNOTATIONS_VIEW = PREFIX + "annotations_view_context"; //$NON-NLS-1$
 	public static final String PROPERTIES_VIEW = PREFIX + "properties_view_context"; //$NON-NLS-1$
+    public static final String REV_PROPERTIES_VIEW = PREFIX + "rev_properties_view_context"; //$NON-NLS-1$	
 	public static final String PENDING_OPERATIONS_VIEW = PREFIX + "pending_operations_view_context"; //$NON-NLS-1$
 
 	// Actions
#P org.tigris.subversion.clientadapter
Index: src/org/tigris/subversion/svnclientadapter/ISVNClientAdapter.java
===================================================================
--- src/org/tigris/subversion/svnclientadapter/ISVNClientAdapter.java	(revision 4654)
+++ src/org/tigris/subversion/svnclientadapter/ISVNClientAdapter.java	(working copy)
@@ -1048,6 +1048,17 @@
 			SVNRevision.Number revisionNo, String propName,
 			String propertyData, boolean force) throws SVNClientException;
     
+    /**
+     * get a revision property for a given revision
+     * @param path
+     * @param revisionNo
+     * @param propName
+     * @throws SVNClientException
+     */    
+    public abstract String getRevProperty(SVNUrl path,
+            SVNRevision.Number revisionNo, String propName) 
+            throws SVNClientException;    
+    
 	/**
 	 * get the ignored patterns for the given directory
 	 * if path is not a directory, returns null
@@ -1415,6 +1426,15 @@
      */    
 	public abstract ISVNProperty[] getProperties(SVNUrl url) throws SVNClientException;
 
+    /**
+     * Get all the revision properties for the given url at a revision
+     * @param url
+     * @param revision
+     * @return information about an URL.
+     * @throws SVNClientException
+     */
+    public abstract ISVNProperty[] getRevProperties(SVNUrl url, SVNRevision.Number revision) throws SVNClientException;	
+	
 	/**
 	 * Remove 'conflicted' state on working copy files or directories
 	 * @param path

