Index: src/test/java/org/apache/maven/scm/provider/svn/SvnTagBranchUtilsTest.java
===================================================================
--- src/test/java/org/apache/maven/scm/provider/svn/SvnTagBranchUtilsTest.java	(revision 345673)
+++ src/test/java/org/apache/maven/scm/provider/svn/SvnTagBranchUtilsTest.java	(working copy)
@@ -144,6 +144,13 @@
 
     }
 
+    public void testResolveTagViewCVS()
+        throws Exception
+    {
+        assertEquals( "http://foo.com/cgi-bin/viewcvs.cgi/svn/tags/my-tag?root=test",
+                      SvnTagBranchUtils.resolveTagUrl( "http://foo.com/cgi-bin/viewcvs.cgi/svn/trunk/?root=test", "/my-tag/" ) );
+    }
+    
     public void testResolveTagWithSlashes()
         throws Exception
     {
@@ -152,7 +159,7 @@
         testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "/my-branch/", "http://foo.com/svn/branches/my-branch" );
 
         testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "http://foo.com/svn/myproject/branches/", "/my-branch/",
-                              "http://foo.com/svn/myproject/branches/my-branch" );
+        "http://foo.com/svn/myproject/branches/my-branch" );
     }
 
     public void testResolveTagWithTagOverwritingBase()
Index: src/main/java/org/apache/maven/scm/provider/svn/SvnTagBranchUtils.java
===================================================================
--- src/main/java/org/apache/maven/scm/provider/svn/SvnTagBranchUtils.java	(revision 345673)
+++ src/main/java/org/apache/maven/scm/provider/svn/SvnTagBranchUtils.java	(working copy)
@@ -81,32 +81,68 @@
 
     /**
      * Resolves a tag to a repository url.
+     * By supplying the repository to this function (rather than calling {@link #resolveTagUrl(String, String)}
+     * the resolution can use the repository's tagBase to override the default tag location.
      * 
-     * 
      * @param repository  the repository to use as a base for tag resolution
-     * @param branchTagName  tag name
+     * @param tag         tag name
      * @return
      * @see #resolveUrl(SvnScmProviderRepository, String, String)
      */
     public static String resolveTagUrl( SvnScmProviderRepository repository, String tag )
     {
-        return resolveUrl( repository, SVN_TAGS, tag );
+        return resolveUrl( repository.getUrl(), repository.getTagBase(), SVN_TAGS, tag );
     }
 
     /**
      * Resolves a tag to a repository url.
+     * Will not use the {@link SvnScmProviderRepository#getTagBase()} during resolution.
      * 
+     * @param repositoryUrl  string url for the repository
+     * @param tag            tag name
+     * @return
+     * @see #resolveUrl(SvnScmProviderRepository, String, String)
+     */
+    public static String resolveTagUrl( String repositoryUrl, String tag )
+    {
+        return resolveUrl( repositoryUrl, null, SVN_TAGS, tag );
+    }
+
+    /**
+     * Resolves a branch name to a repository url. 
+     * By supplying the repository to this function (rather than calling {@link #resolveBranchUrl(String, String)}
+     * the resolution can use the repository's tagBase to override the default tag location.
      * 
      * @param repository  the repository to use as a base for tag resolution
-     * @param branchTagName  tag name
+     * @param branch      tag name
      * @return
      * @see #resolveUrl(SvnScmProviderRepository, String, String)
      */
-    public static String resolveBranchUrl( SvnScmProviderRepository repository, String tag )
+    public static String resolveBranchUrl( SvnScmProviderRepository repository, String branch )
     {
-        return resolveUrl( repository, SVN_BRANCHES, tag );
+        return resolveUrl( repository.getUrl(), repository.getTagBase(), SVN_BRANCHES, branch );
     }
 
+   /**
+    * Resolves a branch name to a repository url. 
+    * Will not use the {@link SvnScmProviderRepository#getTagBase()} during resolution.
+    * 
+    * @param repositoryUrl  string url for the repository
+    * @param branch         branch name
+    * @return
+    * @see #resolveUrl(SvnScmProviderRepository, String, String)
+    */
+    public static String resolveBranchUrl( String repositoryUrl, String branch )
+    {
+        return resolveUrl( repositoryUrl, null, SVN_BRANCHES, branch );
+    }
+
+    private static String addSuffix( String baseString, String suffix )
+    {
+        return ( suffix != null ) ? baseString + suffix : baseString;
+    }
+    
+    
     /**
      * Resolves a tag or branch name to a repository url.<br>
      * If the <code>branchTagName</code> is an absolute URL, that value is returned. 
@@ -127,16 +163,25 @@
      *                      or even contain a relative path to the root like "branches/my-branch"
      * @return
      */
-    public static String resolveUrl( SvnScmProviderRepository repository, String subdir, String branchTagName )
+    public static String resolveUrl( String repositoryUrl, String tagBase, String subdir, String branchTagName )
     {
-        String projectRoot = getProjectRoot( repository.getUrl() );
+        String projectRoot = getProjectRoot( repositoryUrl );
         branchTagName = StringUtils.strip( branchTagName, "/" );
-
+        
         if ( StringUtils.isEmpty( branchTagName ) )
         {
             return null;
         }
+        
+        // Look for a query string as in ViewCVS urls
+        String queryString = null;
+        if ( repositoryUrl.indexOf( "?" ) >= 0 )
+        {
+            queryString = repositoryUrl.substring( repositoryUrl.indexOf( "?" ) );
+        }
 
+
+
         if ( branchTagName.indexOf( "://" ) >= 0 )
         {
             // branch/tag is already an absolute url so just return it. 
@@ -144,9 +189,9 @@
         }
 
         // User has a tagBase specified so just return the name appended to the tagBase
-        if ( StringUtils.isNotEmpty( repository.getTagBase() ) )
+        if ( StringUtils.isNotEmpty( tagBase ) )
         {
-            return appendPath( repository.getTagBase(), branchTagName );
+            return appendPath( tagBase, branchTagName );
         }
 
         // Look for any "branches/" or "tags/" specifiers in the branchTagName. If one occurs,
@@ -155,11 +200,11 @@
         {
             if ( branchTagName.startsWith( SVN_BASE_DIRS[i] + "/" ) )
             {
-                return appendPath( projectRoot, branchTagName );
+                return addSuffix( appendPath( projectRoot, branchTagName ), queryString );
             }
         }
 
-        return appendPath( appendPath( projectRoot, subdir ), branchTagName );
+        return addSuffix( appendPath( appendPath( projectRoot, subdir ), branchTagName ), queryString );        
     }
 
     /* Helper function that does the checking for {@link #isRevisionSpecifier} 

