diff --git includes/VersioncontrolBackend.php includes/VersioncontrolBackend.php
index 06ce1cd..60ec43c 100644
--- includes/VersioncontrolBackend.php
+++ includes/VersioncontrolBackend.php
@@ -74,6 +74,7 @@ abstract class VersioncontrolBackend {
       'repo'      => 'VersioncontrolRepositoryController',
       'account'   => 'VersioncontrolAccountController',
       'operation' => 'VersioncontrolOperationController',
+      'commit'    => 'VersioncontrolCommitController',
       'item'      => 'VersioncontrolItemController',
       'branch'    => 'VersioncontrolBranchController',
       'tag'       => 'VersioncontrolTagController',
@@ -84,6 +85,7 @@ abstract class VersioncontrolBackend {
       'repo'      => 'VersioncontrolRepository',
       'account'   => 'VersioncontrolAccount',
       'operation' => 'VersioncontrolOperation',
+      'commit'    => 'VersioncontrolCommit',
       'item'      => 'VersioncontrolItem',
       'branch'    => 'VersioncontrolBranch',
       'tag'       => 'VersioncontrolTag',
diff --git includes/VersioncontrolBranch.php includes/VersioncontrolBranch.php
index b34e10c..3232e36 100644
--- includes/VersioncontrolBranch.php
+++ includes/VersioncontrolBranch.php
@@ -64,7 +64,7 @@ class VersioncontrolBranch extends VersioncontrolEntity {
    */
   public function loadCommits($ids = array(), $conditions = array(), $options = array()) {
     $conditions['branches'] = array($this->label_id);
-    return $this->backend->loadEntities('operation', $ids, $conditions, $options);
+    return $this->backend->loadEntities('commit', $ids, $conditions, $options);
   }
 
   public function update($options = array()) {
diff --git includes/VersioncontrolItem.php includes/VersioncontrolItem.php
index 1bbfe80..b3c0b38 100644
--- includes/VersioncontrolItem.php
+++ includes/VersioncontrolItem.php
@@ -164,7 +164,7 @@ abstract class VersioncontrolItem extends VersioncontrolEntity {
    *   sorted in reverse chronological order, so the newest revision
    *   comes first. Each element has its (file-level) item revision as
    *   key, and a standard item object (as the ones retrieved by
-   *   VersioncontrolOperation::getItems()) as value. All items except
+   *   VersioncontrolCommit::getItems()) as value. All items except
    *   for the oldest one will also have the 'action' and 'source_items'
    *   properties filled in, the oldest item might or might not have
    *   them. (If they exist for the oldest item, 'action' will be
@@ -305,7 +305,7 @@ abstract class VersioncontrolItem extends VersioncontrolEntity {
    *
    * When first retrieving an item, the selected label is initialized
    * with a sensible value - for example,
-   * VersioncontrolOperation::getItems() assigns the affected branch or
+   * VersioncontrolCommit::getItems() assigns the affected branch or
    * tag of that operation to all the items. (This is especially
    * important for version control systems like Subversion where there is
    * a need to specify the label per item and not per operation, as a
@@ -335,6 +335,7 @@ abstract class VersioncontrolItem extends VersioncontrolEntity {
     // label.
     switch ($this->selected_label->get_from) {
     case 'operation':
+    case 'commit':
       $selected_label = $this->selected_label->operation->getSelectedLabel($this);
       break;
     case 'other_item':
diff --git includes/VersioncontrolOperation.php includes/VersioncontrolOperation.php
index d5f5347..fb12dab 100644
--- includes/VersioncontrolOperation.php
+++ includes/VersioncontrolOperation.php
@@ -178,7 +178,7 @@ abstract class VersioncontrolOperation extends VersioncontrolEntity {
   public function insert($options = array()) {
     if (!empty($this->vc_op_id)) {
       // This is supposed to be a new commit, but has a vc_op_id already.
-      throw new Exception('Attempted to insert a Versioncontrol commit which is already present in the database.', E_ERROR);
+      throw new Exception('Attempted to insert a Versioncontrol operation which is already present in the database.', E_ERROR);
     }
 
     // Append default options.
@@ -201,7 +201,7 @@ abstract class VersioncontrolOperation extends VersioncontrolEntity {
     $this->backendInsert($options);
 
     // Everything's done, invoke the hook.
-    module_invoke_all('versioncontrol_entity_commit_insert', $this);
+    module_invoke_all('versioncontrol_entity_operation_insert', $this);
     return $this;
   }
 
@@ -217,7 +217,7 @@ abstract class VersioncontrolOperation extends VersioncontrolEntity {
   public function update($options = array()) {
     if (empty($this->vc_op_id)) {
       // This is supposed to be an existing branch, but has no vc_op_id.
-      throw new Exception('Attempted to update a Versioncontrol commit which has not yet been inserted in the database.', E_ERROR);
+      throw new Exception('Attempted to update a Versioncontrol operation which has not yet been inserted in the database.', E_ERROR);
     }
 
     // Append default options.
@@ -240,7 +240,7 @@ abstract class VersioncontrolOperation extends VersioncontrolEntity {
     $this->backendUpdate($options);
 
     // Everything's done, invoke the hook.
-    module_invoke_all('versioncontrol_entity_commit_update', $this);
+    module_invoke_all('versioncontrol_entity_operation_update', $this);
     return $this;
   }
 
@@ -300,7 +300,7 @@ abstract class VersioncontrolOperation extends VersioncontrolEntity {
 
     $this->backendDelete($options);
 
-    module_invoke_all('versioncontrol_entity_commit_delete', $this);
+    module_invoke_all('versioncontrol_entity_operation_delete', $this);
   }
 
   protected function deleteNested($options) {
diff --git includes/VersioncontrolRepository.php includes/VersioncontrolRepository.php
index d7ce058..065ea23 100644
--- includes/VersioncontrolRepository.php
+++ includes/VersioncontrolRepository.php
@@ -224,7 +224,7 @@ abstract class VersioncontrolRepository implements VersioncontrolEntityInterface
   public function loadCommits($ids = array(), $conditions = array(), $options = array()) {
     $conditions['type'] = VERSIONCONTROL_OPERATION_COMMIT;
     $conditions['repo_id'] = $this->repo_id;
-    return $this->backend->loadEntities('operation', $ids, $conditions, $options);
+    return $this->backend->loadEntities('commit', $ids, $conditions, $options);
   }
 
   /**
diff --git includes/controllers.inc includes/controllers.inc
index e1be420..5d497a3 100644
--- includes/controllers.inc
+++ includes/controllers.inc
@@ -505,6 +505,19 @@ class VersioncontrolOperationController extends VersioncontrolEntityController {
   }
 }
 
+class VersioncontrolCommitController extends VersioncontrolOperationController {
+  protected $entityType = 'commit';
+
+  /**
+   * Ensure we're only retrieving commit operations.
+   */
+  protected function buildQueryConditions(&$query, $ids, $conditions) {
+    parent::buildQueryConditions($query, $ids, $conditions);
+    $this->attachCondition($query, 'type', VERSIONCONTROL_OPERATION_COMMIT);
+    return $query;
+  }
+}
+
 class VersioncontrolItemController extends VersioncontrolEntityController {
   protected $entityType = 'item';
   protected $baseTable = 'versioncontrol_item_revisions';
diff --git includes/interfaces.inc includes/interfaces.inc
index b40381c..a317a9e 100644
--- includes/interfaces.inc
+++ includes/interfaces.inc
@@ -183,26 +183,26 @@ interface VersioncontrolRepositoryGetItem {
 
 interface VersioncontrolUserMapperInterface {
   /**
-   * Map the author of the passed VersioncontrolOperation object to a Drupal
+   * Map the author of the passed VersioncontrolCommit object to a Drupal
    * uid, or FALSE if no uid mapping could be made.
    *
-   * @param VersioncontrolOperation $commit
+   * @param VersioncontrolCommit $commit
    *   The commit to be mapped.
    * @return mixed
    *   Either a uid (int), or FALSE if the mapping failed.
    */
-  public function mapAuthor(VersioncontrolOperation $commit);
+  public function mapAuthor(VersioncontrolCommit $commit);
 
   /**
-   * Map the committer of the passed VersioncontrolOperation object to a Drupal
+   * Map the committer of the passed VersioncontrolCommit object to a Drupal
    * uid, or FALSE if no uid mapping could be made.
    *
-   * @param VersioncontrolOperation $commit
+   * @param VersioncontrolCommit $commit
    *   The commit to be mapped.
    * @return mixed
    *   Either a uid (int), or FALSE if the mapping failed.
    */
-  public function mapCommitter(VersioncontrolOperation $commit);
+  public function mapCommitter(VersioncontrolCommit $commit);
 }
 
 interface VersioncontrolAuthHandlerInterface {
diff --git includes/plugins/user_mapping_methods/VersioncontrolUserMapperSimpleMail.class.php includes/plugins/user_mapping_methods/VersioncontrolUserMapperSimpleMail.class.php
index 2851c91..03a56c3 100644
--- includes/plugins/user_mapping_methods/VersioncontrolUserMapperSimpleMail.class.php
+++ includes/plugins/user_mapping_methods/VersioncontrolUserMapperSimpleMail.class.php
@@ -7,11 +7,11 @@
  * does no checking to ensure they're good.
  */
 class VersioncontrolUserMapperSimpleMail implements VersioncontrolUserMapperInterface {
-  public function mapAuthor(VersioncontrolOperation $commit) {
+  public function mapAuthor(VersioncontrolCommit $commit) {
     return $this->map($commit->author);
   }
 
-  public function mapCommitter(VersioncontrolOperation $commit) {
+  public function mapCommitter(VersioncontrolCommit $commit) {
     return $this->map($commit->committer);
   }
 
diff --git tests/VersioncontrolBackendTests.test tests/VersioncontrolBackendTests.test
index a64e367..66e84b0 100644
--- tests/VersioncontrolBackendTests.test
+++ tests/VersioncontrolBackendTests.test
@@ -31,7 +31,7 @@ class VersioncontrolBackendBaseUnitTest extends VersioncontrolTestCase {
     // As soon as the backend is initialized, the base class should have a bunch
     // of classes declared on it and available for factory operations. Check.
     // This also has the effect of ensuring autoload declarations are in place.
-    $types = array('repo', 'operation', 'item', 'branch', 'tag');
+    $types = array('repo', 'operation', 'commit', 'item', 'branch', 'tag');
     foreach ($this->backends as $backend) { // Iterate over all available backends.
       foreach ($types as $type) { // Iterate over each entity type.
         $this->assertTrue(isset($backend->classesEntities[$type]), "$backend->name backend declares an entity class for type '$type'", 'PHP');
diff --git tests/VersioncontrolItemUnitTestingTestCase.test tests/VersioncontrolItemUnitTestingTestCase.test
index 55369a1..98b1422 100644
--- tests/VersioncontrolItemUnitTestingTestCase.test
+++ tests/VersioncontrolItemUnitTestingTestCase.test
@@ -33,9 +33,9 @@ class VersioncontrolItemUnitTestingTestCase extends VersioncontrolTestCase {
   public function testCreation() {
     // Build and insert.
     $repo = $this->versioncontrolCreateRepository('test');
-    $operation = $this->versioncontrolCreateOperation('test');
+    $commit = $this->versioncontrolCreateCommit('test');
     $data = array(
-      'vc_op_id' => $operation->vc_op_id,
+      'vc_op_id' => $commit->vc_op_id,
       'path' => '/fake/path/to/file',
       'revision' => $this->randomName(4),
       'type' => VERSIONCONTROL_ITEM_FILE,
diff --git tests/VersioncontrolTestCase.test tests/VersioncontrolTestCase.test
index 4799be6..8730a00 100644
--- tests/VersioncontrolTestCase.test
+++ tests/VersioncontrolTestCase.test
@@ -238,6 +238,39 @@ abstract class VersioncontrolTestCase extends DrupalWebTestCase {
     return $operation;
   }
 
+  public function versioncontrolCreateCommit($backend_name = 'test', $data = array(), $insert=TRUE) {
+    static $i = 0;
+    $name = $this->randomName(7);
+    $default_data = array(
+      'type' => VERSIONCONTROL_OPERATION_COMMIT,
+      'date' => time(),
+      'author' => $name,
+      'author_uid' => 0,
+      'committer' => $name,
+      'committer_uid' => 0,
+      'revision' => ++$i,
+      'message' => $this->randomString(20),
+      'labels' => array(),
+      'itemRevisions' => array(),
+    );
+    $data += $default_data;
+
+    $backend = $this->backends[$backend_name];
+    if (!isset($data['repo_id'])) {
+      if (!isset($data['repository']) || !is_subclass_of($data['repository'], 'VersioncontrolRepository')) {
+        $repo = $this->versioncontrolCreateRepository($backend_name);
+        $data['repo_id'] = $repo->repo_id;
+      }
+    }
+    $commit = $backend->buildEntity('commit', $data);
+    if ($insert) {
+      $commit->insert();
+      $this->assertTrue(isset($commit->vc_op_id) && is_numeric($commit->vc_op_id), t('VersioncontrolCommit::insert() properly populates a new repository object with an integer vc_op_id.'));
+    }
+
+    return $commit;
+  }
+
   public function versioncontrolCreateItem($backend_name = 'test', $data = array(), $insert=TRUE) {
     static $i = 0;
     $default_data = array(
diff --git versioncontrol.drush.inc versioncontrol.drush.inc
index 88b84e5..ed21a66 100644
--- versioncontrol.drush.inc
+++ versioncontrol.drush.inc
@@ -20,7 +20,8 @@ function versioncontrol_drush_command() {
     ),
     'bootstrap' => DRUSH_BOOTSTRAP_DRUPAL_FULL,
   );
-  $items['vcapi-map-operations'] = array(
+  $items['vcapi-map-commits'] = array(
+    'aliases' => array('vcapi-map-operations'),
     'description' => "Attempt to map author & committer data in tracked commits/operations to Drupal users. By default, only unmapped operations will be attempted.",
     'arguments' => array(
       'repositories' => 'A comma-delimited list of repository ids or shortnames. Mixing and matching names and ids is fine.',
@@ -49,6 +50,7 @@ function versioncontrol_drush_help($section) {
   switch ($section) {
     case 'drush:vcapi-parse-logs':
       return dt("This command will fetch all new activity in the repositories listed on the command line. If no repositories are given, log fetching will be triggered on all repositories.");
+    case 'drush:vcapi-map-commits':
     case 'drush:vcapi-map-operations':
       return dt("This command will attempt to map raw operation author/committer data to known Drupal accounts.");
   }
@@ -114,7 +116,7 @@ function drush_versioncontrol_vcapi_parse_logs() {
   drush_backend_batch_process();
 }
 
-function drush_versioncontrol_vcapi_map_operations() {
+function drush_versioncontrol_vcapi_map_commits() {
   $repos = array();
   if ($discover = drush_get_option('discover', FALSE)) {
     $ids = db_select('versioncontrol_operations', 'vco')
diff --git versioncontrol.info versioncontrol.info
index a8eb5d1..b8c82ad 100644
--- versioncontrol.info
+++ versioncontrol.info
@@ -9,6 +9,7 @@ files[] = includes/VersioncontrolBackend.php
 files[] = includes/VersioncontrolBranch.php
 files[] = includes/VersioncontrolItem.php
 files[] = includes/VersioncontrolOperation.php
+files[] = includes/VersioncontrolCommit.php
 files[] = includes/VersioncontrolRepository.php
 files[] = includes/VersioncontrolTag.php
 files[] = includes/interfaces.inc
diff --git versioncontrol.module versioncontrol.module
index ecb985f..a96d906 100644
--- versioncontrol.module
+++ versioncontrol.module
@@ -87,7 +87,7 @@ define('VERSIONCONTROL_ITEM_DIRECTORY',         2);
  * Only used for items that don't exist in the repository (anymore), at least
  * not in the given revision. That is mostly the case with items that
  * were deleted by a commit and are returned as result by
- * VersioncontrolOperation::getItems(). A "deleted file" can also be
+ * VersioncontrolCommit::getItems(). A "deleted file" can also be
  * returned by directory listings for CVS, representing "dead files".
  */
 //@{
@@ -435,7 +435,7 @@ function _versioncontrol_get_fallback_authorization_method() {
  *   The repository that the items are located in.
  * @param $items
  *   An array of item arrays, for example as returned by
- *   VersioncontrolOperation::getItems().
+ *   VersioncontrolCommit::getItems().
  *
  * @return
  *   This function does not have a return value; instead, it alters the
@@ -541,7 +541,7 @@ function versioncontrol_fetch_source_items($repository, &$items) {
  *   The repository that the items are located in.
  * @param $items
  *   An array of item arrays, for example as returned by
- *   VersioncontrolOperation::getItems().
+ *   VersioncontrolCommit::getItems().
  *
  * @return
  *   This function does not have a return value; instead, it alters the
@@ -752,7 +752,7 @@ function theme_versioncontrol_account_username($uid, $username, $repository, $op
  *
  * @param $statistics
  *   An array of statistics objects as returned by
- *   versioncontrol_get_operation_statistics(), grouped by at least uid and
+ *   versioncontrol_get_commit_statistics(), grouped by at least uid and
  *   optionally repo_id/username columns.
  * @param $options
  *   An array of optional further options. Currently, the only supported
@@ -766,14 +766,14 @@ function theme_versioncontrol_user_statistics_table($statistics, $options = arra
   $rows = array();
 
   foreach ($statistics as $user_stats) {
-    $last_operation_date = t('!time ago', array(
-      '!time' => format_interval(time() - $user_stats->last_operation_date, 1),
+    $last_commit_date = t('!time ago', array(
+      '!time' => format_interval(time() - $user_stats->last_commit_date, 1),
     ));
-    $first_operation_date = t('!time ago', array(
-      '!time' => format_interval(time() - $user_stats->first_operation_date, 1),
+    $first_commit_date = t('!time ago', array(
+      '!time' => format_interval(time() - $user_stats->first_commit_date, 1),
     ));
-    $total_operations = format_plural(
-      $user_stats->total_operations, '1 commit', '@count commits'
+    $total_commits = format_plural(
+      $user_stats->total_commits, '1 commit', '@count commits'
     );
 
     if (isset($options['constraints']) && module_exists('commitlog')) {
@@ -784,14 +784,14 @@ function theme_versioncontrol_user_statistics_table($statistics, $options = arra
       else {
         $options['constraints']['uids'] = array($user_stats->uid);
       }
-      $total_operations = l($total_operations, commitlog_get_url($options['constraints']));
+      $total_commits = l($total_commits, commitlog_get_url($options['constraints']));
     }
 
     $rows[] = array(
       theme('versioncontrol_user_statistics_account', $user_stats),
-      $last_operation_date,
-      $first_operation_date,
-      $total_operations,
+      $last_commit_date,
+      $first_commit_date,
+      $total_commits,
     );
   }
   return theme('table', $header, $rows);
@@ -803,7 +803,7 @@ function theme_versioncontrol_user_statistics_table($statistics, $options = arra
  *
  * @param $statistics
  *   An array of statistics objects as returned by
- *   versioncontrol_get_operation_statistics(), grouped by at least uid and
+ *   versioncontrol_get_commit_statistics(), grouped by at least uid and
  *   optionally repo_id/username columns.
  */
 function theme_versioncontrol_user_statistics_item_list($statistics, $more_link = NULL) {
@@ -819,15 +819,15 @@ function theme_versioncontrol_user_statistics_item_list($statistics, $more_link
     $item .= t('!committer - !commit-count', array(
       '!committer' => theme('versioncontrol_user_statistics_account', $user_stats),
       '!commit-count' => '<span class="versioncontrol-commit-count">'
-        . format_plural($user_stats->total_operations, '1 commit', '@count commits')
+        . format_plural($user_stats->total_commits, '1 commit', '@count commits')
         . '</span>',
     ));
 
-    if (!empty($user_stats->first_operation_date)) { // has committed yet?
+    if (!empty($user_stats->first_commit_date)) { // has committed yet?
       $item .= '<div class="versioncontrol-commit-times">';
       $item .= t('last: !last_time ago, first: !first_time ago', array(
-        '!last_time' => format_interval(time() - $user_stats->last_operation_date, 1),
-        '!first_time' => format_interval(time() - $user_stats->first_operation_date, 1),
+        '!last_time' => format_interval(time() - $user_stats->last_commit_date, 1),
+        '!first_time' => format_interval(time() - $user_stats->first_commit_date, 1),
       ));
       $item .= '</div>';
     }
