Index: maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/AbstractCvsScmProvider.java
===================================================================
--- maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/AbstractCvsScmProvider.java	(revision 415286)
+++ maven-scm-providers/maven-scm-providers-cvs/maven-scm-provider-cvs-commons/src/main/java/org/apache/maven/scm/provider/cvslib/AbstractCvsScmProvider.java	(working copy)
@@ -85,6 +85,41 @@
         return "CVS";
     }
 
+    /* From the Cederqvist:
+     * 
+     * "Tag names must start with an uppercase or lowercase letter and can 
+     * contain uppercase and lowercase letters, digits, `-', and `_'. The 
+     * two tag names BASE and HEAD are reserved for use by CVS. It is expected
+     * that future names which are special to CVS will be specially named,
+     * for example by starting with `.', rather than being named analogously
+     * to BASE and HEAD, to avoid conflicts with actual tag names."
+     */
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.scm.provider.AbstractScmProvider#sanitizeTagName(java.lang.String)
+     */
+    public String sanitizeTagName(String arg0) {
+        if(validateTagName(arg0))
+            return arg0;
+                
+        if(arg0.equals("HEAD") || arg0.equals("BASE") || !arg0.matches("[A-Za-z].*"))
+            /* we don't even bother to sanitize these, they're just silly */
+            throw new RuntimeException("Unable to sanitize tag "+arg0+": must begin with a letter" +
+                        "and not be HEAD or BASE");
+
+        /* swap all illegal characters for a _ */
+        return arg0.replaceAll("[^A-Za-z0-9_-]", "_");
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.scm.provider.AbstractScmProvider#validateTagName(java.lang.String)
+     */
+    public boolean validateTagName(String arg0) {
+        return (arg0.matches("[A-Za-z][A-Za-z0-9_-]*") && !arg0.equals("HEAD") && !arg0.equals("BASE"));
+    }
+
+
+
     public ScmProviderRepository makeProviderScmRepository( String scmSpecificUrl, char delimiter )
         throws ScmRepositoryException
     {
Index: maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java
===================================================================
--- maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java	(revision 414788)
+++ maven-scm-api/src/main/java/org/apache/maven/scm/provider/AbstractScmProvider.java	(working copy)
@@ -63,6 +63,28 @@
         return null;
     }
 
+    
+    
+    /* (non-Javadoc)
+     * @see org.apache.maven.scm.provider.ScmProvider#sanitizeTagName(java.lang.String)
+     */
+    public String sanitizeTagName(String tag) {
+        /* by default, we assume all tags are valid. */
+        return tag;
+    }
+
+
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.scm.provider.ScmProvider#validateTagName(java.lang.String)
+     */
+    public boolean validateTagName(String tag) {
+        /* by default, we assume all tags are valid. */
+        return true;
+    }
+
+
+
     public List validateScmUrl( String scmSpecificUrl, char delimiter )
     {
         List messages = new ArrayList();
Index: maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProvider.java
===================================================================
--- maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProvider.java	(revision 414788)
+++ maven-scm-api/src/main/java/org/apache/maven/scm/provider/ScmProvider.java	(working copy)
@@ -68,6 +68,22 @@
     String getScmSpecificFilename();
 
     /**
+     * Check if this tag is valid for this SCM provider.
+     * 
+     * @param tag tag name to check
+     * @return true if tag is valid 
+     */
+    boolean validateTagName(String tag);
+    
+    /**
+     * Given a tag name, make it suitable for this SCM provider. For example, CVS converts "." into "_"
+     * 
+     * @param tag input tag name
+     * @return sanitized tag name
+     */
+    String sanitizeTagName(String tag);
+    
+    /**
      * Adds the given files to the source control system
      *
      * @param repository the source control system
