diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.java
index ae420c4..357600b 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/HgScmProvider.java
@@ -31,9 +31,11 @@
 import org.apache.maven.scm.command.remove.RemoveScmResult;
 import org.apache.maven.scm.command.status.StatusScmResult;
 import org.apache.maven.scm.command.update.UpdateScmResult;
+import org.apache.maven.scm.command.tag.TagScmResult;
 import org.apache.maven.scm.provider.AbstractScmProvider;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 import org.apache.maven.scm.provider.hg.command.HgCommand;
+import org.apache.maven.scm.provider.hg.command.tag.HgTagCommand;
 import org.apache.maven.scm.provider.hg.command.add.HgAddCommand;
 import org.apache.maven.scm.provider.hg.command.changelog.HgChangeLogCommand;
 import org.apache.maven.scm.provider.hg.command.checkin.HgCheckInCommand;
@@ -239,6 +241,21 @@
     }
 
     /**
+     * @see org.apache.maven.scm.provider.AbstractScmProvider#checkout(org.apache.maven.scm.provider.ScmProviderRepository,org.apache.maven.scm.ScmFileSet,org.apache.maven.scm.CommandParameters)
+     */
+    public TagScmResult tag( ScmProviderRepository repository, ScmFileSet fileSet,
+                                       CommandParameters parameters )
+        throws ScmException
+    {
+        HgTagCommand command = new HgTagCommand();
+
+        command.setLogger( getLogger() );
+
+        return (TagScmResult) command.execute( repository, fileSet, parameters );
+    }
+
+
+    /**
      * @see org.apache.maven.scm.provider.AbstractScmProvider#diff(org.apache.maven.scm.provider.ScmProviderRepository,org.apache.maven.scm.ScmFileSet,org.apache.maven.scm.CommandParameters)
      */
     public DiffScmResult diff( ScmProviderRepository repository, ScmFileSet fileSet, CommandParameters parameters )
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgCommand.java
index ace3edd..bfc2bbc 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgCommand.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgCommand.java
@@ -93,7 +93,12 @@
     public static final String REVNO_CMD = "id";
 
     /**
-     * Show inventory of the current working copy or a revision
+     * Tag this revision
+     */
+    public static final String TAG_CMD = "tag";
+
+    /**
+     * Show list of the current working copy or a revision
      */
     public static final String INVENTORY_CMD = "locate";
 
@@ -111,4 +116,5 @@
     public static final String VERSION = "version";
 
     public static final String CHECK = "check";
+    String ALL_OPTION = "-A";
 }
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgConsumer.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgConsumer.java
index 0b16d8d..13b788a 100644
--- a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgConsumer.java
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/HgConsumer.java
@@ -74,13 +74,13 @@
         identifiers.put( "renamed", ScmFileStatus.MODIFIED );
 
         /** Statuses from hg status;
-         *  TODO "! deleted but still tracked"
-         *  d 
          */
         identifiers.put( "A", ScmFileStatus.ADDED );
         identifiers.put( "?", ScmFileStatus.UNKNOWN );
         identifiers.put( "M", ScmFileStatus.MODIFIED );
         identifiers.put( "R", ScmFileStatus.DELETED );
+        identifiers.put( "C", ScmFileStatus.CHECKED_IN );
+        identifiers.put( "!", ScmFileStatus.MISSING );
         identifiers.put( "I", ScmFileStatus.UNKNOWN ); // not precisely the same, but i think semantics work? - rwd
 
         messages.put( "hg: WARNING:", "WARNING" );
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgListCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgListCommand.java
new file mode 100644
index 0000000..9b6eda4
--- /dev/null
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgListCommand.java
@@ -0,0 +1,71 @@
+package org.apache.maven.scm.provider.hg.command.inventory;
+
+import org.apache.maven.scm.provider.hg.command.HgCommand;
+import org.apache.maven.scm.provider.hg.HgUtils;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.command.list.AbstractListCommand;
+import org.apache.maven.scm.command.list.ListScmResult;
+import org.apache.maven.scm.*;
+
+import java.io.File;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Get a list of all files in the repository
+ * 
+ * @author <a href="mailto:ryan@darksleep.com">ryan daum</a>
+ */
+public class HgListCommand extends AbstractListCommand
+        implements HgCommand 
+{
+
+    protected ListScmResult executeListCommand(ScmProviderRepository repository, ScmFileSet fileSet, boolean recursive, ScmVersion scmVersion) throws ScmException {
+
+        if ( fileSet.getFiles().length != 0 )
+        {
+            throw new ScmException( "This provider doesn't support listing subsets of a directory" );
+        }
+        //
+        File workingDir = fileSet.getBasedir();
+
+         // build the command
+        String[] listCmd = new String[]{STATUS_CMD, ALL_OPTION};
+
+        // keep the command about in string form for reporting
+        StringBuffer cmd = new StringBuffer();
+        for (int i = 0; i < listCmd.length; i++) {
+            String s = listCmd[i];
+            cmd.append(s);
+            if (i < listCmd.length - 1)
+                cmd.append(" ");
+        }
+
+        HgListConsumer consumer = new HgListConsumer( getLogger() );
+
+        ScmResult result = HgUtils.execute( consumer, getLogger(), workingDir, listCmd);
+
+        if (result.isSuccess()) {
+            return new ListScmResult(consumer.getFiles(), result);
+        } else {
+            throw new ScmException( "Error while executing command " + cmd.toString() );
+        }
+    }
+}
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgListConsumer.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgListConsumer.java
new file mode 100644
index 0000000..8125a60
--- /dev/null
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/inventory/HgListConsumer.java
@@ -0,0 +1,52 @@
+package org.apache.maven.scm.provider.hg.command.inventory;
+
+import org.apache.maven.scm.provider.hg.command.HgConsumer;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.ScmFile;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Get a list of all files in the repository
+ *
+ * @author <a href="mailto:ryan@darksleep.com">ryan daum</a>
+ */
+public class HgListConsumer extends HgConsumer {
+
+    private List files = new ArrayList();
+
+    public HgListConsumer( ScmLogger logger )
+    {
+        super( logger );
+    }
+
+    public void doConsume( ScmFileStatus status, String trimmedLine )
+    {
+        files.add(new ScmFile(trimmedLine, status));
+    }
+
+    public List getFiles() {
+        return files;
+    }
+}
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java
new file mode 100644
index 0000000..2f6a2dc
--- /dev/null
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommand.java
@@ -0,0 +1,121 @@
+package org.apache.maven.scm.provider.hg.command.tag;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.scm.*;
+import org.apache.maven.scm.command.add.AddScmResult;
+import org.apache.maven.scm.command.tag.AbstractTagCommand;
+import org.apache.maven.scm.command.tag.TagScmResult;
+import org.apache.maven.scm.command.list.ListScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.hg.HgUtils;
+import org.apache.maven.scm.provider.hg.repository.HgScmProviderRepository;
+import org.apache.maven.scm.provider.hg.command.HgCommand;
+import org.apache.maven.scm.provider.hg.command.HgConsumer;
+import org.apache.maven.scm.provider.hg.command.inventory.HgListCommand;
+import org.apache.maven.scm.provider.hg.command.inventory.HgListConsumer;
+import org.apache.maven.scm.provider.hg.command.add.HgAddConsumer;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.FileUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Tag
+ *
+ * @author <a href="mailto:ryan@darksleep.com">ryan daum</a>
+ */
+public class HgTagCommand
+        extends AbstractTagCommand
+        implements HgCommand
+{
+
+    protected ScmResult executeTagCommand(ScmProviderRepository scmProviderRepository, ScmFileSet fileSet, String tag, String message) throws ScmException {
+
+        if ( tag == null || StringUtils.isEmpty( tag.trim() ) )
+        {
+            throw new ScmException( "tag must be specified" );
+        }
+
+        if ( fileSet.getFiles().length != 0 )
+        {
+            throw new ScmException( "This provider doesn't support tagging subsets of a directory" );
+        }
+
+        File workingDir = fileSet.getBasedir();
+
+
+        // build the command
+        String[] tagCmd = new String[]{TAG_CMD, MESSAGE_OPTION, message, tag };
+
+        // keep the command about in string form for reporting
+        StringBuffer cmd = joinCmd(tagCmd);
+
+        HgTagConsumer consumer = new HgTagConsumer( getLogger() );
+        ScmResult result = HgUtils.execute( consumer, getLogger(), workingDir, tagCmd);
+        HgScmProviderRepository repository = (HgScmProviderRepository) scmProviderRepository;
+        if (result.isSuccess()) {
+            // now push
+            // Push to parent branch if any
+            if ( !repository.getURI().equals( fileSet.getBasedir().getAbsolutePath() ) )
+            {
+                String[] push_cmd = new String[]{HgCommand.PUSH_CMD, repository.getURI()};
+                result = HgUtils.execute( new HgConsumer( getLogger() ), getLogger(), fileSet.getBasedir(), push_cmd );
+            }
+        } else {
+            throw new ScmException( "Error while executing command " + cmd.toString() );
+        }
+
+        // do an inventory to return the files tagged (all of them)
+        String[] list_cmd = new String[]{HgCommand.INVENTORY_CMD};
+        HgListConsumer listconsumer = new HgListConsumer(getLogger());
+        result =  HgUtils.execute(listconsumer, getLogger(), fileSet.getBasedir(), list_cmd);
+        if (result.isSuccess()) {
+            List files = listconsumer.getFiles();
+            ArrayList fileList = new ArrayList();
+            for ( Iterator i = files.iterator(); i.hasNext(); )
+            {
+                ScmFile f = (ScmFile) i.next();
+
+                if (!f.getPath().endsWith(".hgtags"))
+                    fileList.add( new ScmFile( f.getPath(), ScmFileStatus.TAGGED ) );
+            }
+
+            return new TagScmResult(fileList, result);
+        } else {
+            throw new ScmException( "Error while executing command " + cmd.toString() );
+        }
+    }
+
+    private StringBuffer joinCmd(String[] cmd) {
+        StringBuffer result = new StringBuffer();
+        for (int i = 0; i < cmd.length; i++) {
+            String s = cmd[i];
+            result.append(s);
+            if (i < cmd.length - 1)
+                result.append(" ");
+        }
+        return result;
+    }
+}
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagConsumer.java b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagConsumer.java
new file mode 100644
index 0000000..40341ea
--- /dev/null
+++ b/maven-scm-providers/maven-scm-provider-hg/src/main/java/org/apache/maven/scm/provider/hg/command/tag/HgTagConsumer.java
@@ -0,0 +1,46 @@
+package org.apache.maven.scm.provider.hg.command.tag;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.scm.ScmFile;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.provider.hg.command.HgConsumer;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:ryan@darksleep.com">ryan daum</a>
+ */
+public class HgTagConsumer
+        extends HgConsumer
+{
+    public HgTagConsumer( ScmLogger logger )
+    {
+        super( logger );
+    }
+
+    public void doConsume( ScmFileStatus status, String trimmedLine )
+    {       
+    }
+
+}
diff --git a/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommandTckTest.java b/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommandTckTest.java
new file mode 100644
index 0000000..cd750ea
--- /dev/null
+++ b/maven-scm-providers/maven-scm-provider-hg/src/test/java/org/apache/maven/scm/provider/hg/command/tag/HgTagCommandTckTest.java
@@ -0,0 +1,45 @@
+package org.apache.maven.scm.provider.hg.command.tag;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.scm.provider.hg.HgRepoUtils;
+import org.apache.maven.scm.tck.command.tag.TagCommandTckTest;
+
+/**
+ * This test tests the tag command.
+ *
+ * @author <a href="mailto:ryan@darksleep.com">Ryan Daum</a>
+ * @version $Id$
+ */
+public class HgTagCommandTckTest
+        extends TagCommandTckTest
+{
+     public String getScmUrl()
+        throws Exception
+    {
+        return HgRepoUtils.getScmUrl();
+    }
+
+    public void initRepo()
+        throws Exception
+    {
+        HgRepoUtils.initRepo();
+    }
+}
