diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -466,6 +466,7 @@
     'DifferentialRevisionQuery' => 'applications/differential/query/DifferentialRevisionQuery.php',
     'DifferentialRevisionRepositoryHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryHeraldField.php',
     'DifferentialRevisionRepositoryProjectsHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryProjectsHeraldField.php',
+    'DifferentialRevisionRevertedByCommitEdgeType' => 'applications/differential/edge/DifferentialRevisionRevertedByCommitEdgeType.php',
     'DifferentialRevisionReviewersHeraldField' => 'applications/differential/herald/DifferentialRevisionReviewersHeraldField.php',
     'DifferentialRevisionSearchEngine' => 'applications/differential/query/DifferentialRevisionSearchEngine.php',
     'DifferentialRevisionStatus' => 'applications/differential/constants/DifferentialRevisionStatus.php',
@@ -540,6 +541,8 @@
     'DiffusionCommitRepositoryProjectsHeraldField' => 'applications/diffusion/herald/DiffusionCommitRepositoryProjectsHeraldField.php',
     'DiffusionCommitRevertedByCommitEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertedByCommitEdgeType.php',
     'DiffusionCommitRevertsCommitEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertsCommitEdgeType.php',
+    'DiffusionCommitRevertsRevisionEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertsRevisionEdgeType.php',
+    'DiffusionCommitRevertsTasksEdgeType' => 'applications/diffusion/edge/DiffusionCommitRevertsTasksEdgeType.php',
     'DiffusionCommitReviewerHeraldField' => 'applications/diffusion/herald/DiffusionCommitReviewerHeraldField.php',
     'DiffusionCommitRevisionAcceptedHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionAcceptedHeraldField.php',
     'DiffusionCommitRevisionHeraldField' => 'applications/diffusion/herald/DiffusionCommitRevisionHeraldField.php',
@@ -1203,6 +1206,7 @@
     'ManiphestTaskPriorityHeraldField' => 'applications/maniphest/herald/ManiphestTaskPriorityHeraldField.php',
     'ManiphestTaskQuery' => 'applications/maniphest/query/ManiphestTaskQuery.php',
     'ManiphestTaskResultListView' => 'applications/maniphest/view/ManiphestTaskResultListView.php',
+    'ManiphestTaskRevertedByCommitEdgeType' => 'applications/maniphest/edge/ManiphestTaskRevertedByCommitEdgeType.php',
     'ManiphestTaskSearchEngine' => 'applications/maniphest/query/ManiphestTaskSearchEngine.php',
     'ManiphestTaskStatus' => 'applications/maniphest/constants/ManiphestTaskStatus.php',
     'ManiphestTaskStatusDatasource' => 'applications/maniphest/typeahead/ManiphestTaskStatusDatasource.php',
@@ -4063,6 +4067,7 @@
     'DifferentialRevisionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
     'DifferentialRevisionRepositoryHeraldField' => 'DifferentialRevisionHeraldField',
     'DifferentialRevisionRepositoryProjectsHeraldField' => 'DifferentialRevisionHeraldField',
+    'DifferentialRevisionRevertedByCommitEdgeType' => 'PhabricatorEdgeType',
     'DifferentialRevisionReviewersHeraldField' => 'DifferentialRevisionHeraldField',
     'DifferentialRevisionSearchEngine' => 'PhabricatorApplicationSearchEngine',
     'DifferentialRevisionStatus' => 'Phobject',
@@ -4137,6 +4142,8 @@
     'DiffusionCommitRepositoryProjectsHeraldField' => 'DiffusionCommitHeraldField',
     'DiffusionCommitRevertedByCommitEdgeType' => 'PhabricatorEdgeType',
     'DiffusionCommitRevertsCommitEdgeType' => 'PhabricatorEdgeType',
+    'DiffusionCommitRevertsRevisionEdgeType' => 'PhabricatorEdgeType',
+    'DiffusionCommitRevertsTasksEdgeType' => 'PhabricatorEdgeType',
     'DiffusionCommitReviewerHeraldField' => 'DiffusionCommitHeraldField',
     'DiffusionCommitRevisionAcceptedHeraldField' => 'DiffusionCommitHeraldField',
     'DiffusionCommitRevisionHeraldField' => 'DiffusionCommitHeraldField',
@@ -4917,6 +4924,7 @@
     'ManiphestTaskPriorityHeraldField' => 'ManiphestTaskHeraldField',
     'ManiphestTaskQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
     'ManiphestTaskResultListView' => 'ManiphestView',
+    'ManiphestTaskRevertedByCommitEdgeType' => 'PhabricatorEdgeType',
     'ManiphestTaskSearchEngine' => 'PhabricatorApplicationSearchEngine',
     'ManiphestTaskStatus' => 'ManiphestConstants',
     'ManiphestTaskStatusDatasource' => 'PhabricatorTypeaheadDatasource',
diff --git a/src/applications/differential/edge/DifferentialRevisionRevertedByCommitEdgeType.php b/src/applications/differential/edge/DifferentialRevisionRevertedByCommitEdgeType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/differential/edge/DifferentialRevisionRevertedByCommitEdgeType.php
@@ -0,0 +1,103 @@
+<?php
+
+final class DifferentialRevisionRevertedByCommitEdgeType
+  extends PhabricatorEdgeType {
+
+  const EDGECONST = 61;
+
+  public function getInverseEdgeConstant() {
+    return DiffusionCommitRevertsRevisionEdgeType::EDGECONST;
+  }
+
+  public function shouldWriteInverseTransactions() {
+    return true;
+  }
+
+  public function getTransactionAddString(
+    $actor,
+    $add_count,
+    $add_edges) {
+
+    return pht(
+      '%s added %s reverting commit(s): %s.',
+      $actor,
+      $add_count,
+      $add_edges);
+  }
+
+  public function getTransactionRemoveString(
+    $actor,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s removed %s reverting commit(s): %s.',
+      $actor,
+      $rem_count,
+      $rem_edges);
+  }
+
+  public function getTransactionEditString(
+    $actor,
+    $total_count,
+    $add_count,
+    $add_edges,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s edited reverting commit(s), added %s: %s; removed %s: %s.',
+      $actor,
+      $add_count,
+      $add_edges,
+      $rem_count,
+      $rem_edges);
+  }
+
+  public function getFeedAddString(
+    $actor,
+    $object,
+    $add_count,
+    $add_edges) {
+
+    return pht(
+      '%s added %s reverting commit(s) for %s: %s.',
+      $actor,
+      $add_count,
+      $object,
+      $add_edges);
+  }
+
+  public function getFeedRemoveString(
+    $actor,
+    $object,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s removed %s reverting commit(s) for %s: %s.',
+      $actor,
+      $rem_count,
+      $object,
+      $rem_edges);
+  }
+
+  public function getFeedEditString(
+    $actor,
+    $object,
+    $total_count,
+    $add_count,
+    $add_edges,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s edited reverting commit(s) for %s, added %s: %s; removed %s: %s.',
+      $actor,
+      $object,
+      $add_count,
+      $add_edges,
+      $rem_count,
+      $rem_edges);
+  }
+}
diff --git a/src/applications/diffusion/edge/DiffusionCommitRevertsRevisionEdgeType.php b/src/applications/diffusion/edge/DiffusionCommitRevertsRevisionEdgeType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/edge/DiffusionCommitRevertsRevisionEdgeType.php
@@ -0,0 +1,107 @@
+<?php
+
+final class DiffusionCommitRevertsRevisionEdgeType extends PhabricatorEdgeType {
+
+  const EDGECONST = 60;
+
+  public function getInverseEdgeConstant() {
+    return DifferentialRevisionRevertedByCommitEdgeType::EDGECONST;
+  }
+
+  public function shouldWriteInverseTransactions() {
+    return true;
+  }
+
+  public function shouldPreventCycles() {
+    return true;
+  }
+
+  public function getTransactionAddString(
+    $actor,
+    $add_count,
+    $add_edges) {
+
+    return pht(
+      '%s added %s reverting commit(s): %s.',
+      $actor,
+      $add_count,
+      $add_edges);
+  }
+
+  public function getTransactionRemoveString(
+    $actor,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s removed %s reverting commit(s): %s.',
+      $actor,
+      $rem_count,
+      $rem_edges);
+  }
+
+  public function getTransactionEditString(
+    $actor,
+    $total_count,
+    $add_count,
+    $add_edges,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s edited reverting commit(s), added %s: %s; removed %s: %s.',
+      $actor,
+      $add_count,
+      $add_edges,
+      $rem_count,
+      $rem_edges);
+  }
+
+  public function getFeedAddString(
+    $actor,
+    $object,
+    $add_count,
+    $add_edges) {
+
+    return pht(
+      '%s added %s reverting commit(s) for %s: %s.',
+      $actor,
+      $add_count,
+      $object,
+      $add_edges);
+  }
+
+  public function getFeedRemoveString(
+    $actor,
+    $object,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s removed %s reverting commit(s) for %s: %s.',
+      $actor,
+      $rem_count,
+      $object,
+      $rem_edges);
+  }
+
+  public function getFeedEditString(
+    $actor,
+    $object,
+    $total_count,
+    $add_count,
+    $add_edges,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s edited reverting commit(s) for %s, added %s: %s; removed %s: %s.',
+      $actor,
+      $object,
+      $add_count,
+      $add_edges,
+      $rem_count,
+      $rem_edges);
+  }
+
+}
diff --git a/src/applications/diffusion/edge/DiffusionCommitRevertsTasksEdgeType.php b/src/applications/diffusion/edge/DiffusionCommitRevertsTasksEdgeType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/edge/DiffusionCommitRevertsTasksEdgeType.php
@@ -0,0 +1,107 @@
+<?php
+
+final class DiffusionCommitRevertsTasksEdgeType extends PhabricatorEdgeType {
+
+  const EDGECONST = 62;
+
+  public function getInverseEdgeConstant() {
+    return ManiphestTaskRevertedByCommitEdgeType::EDGECONST;
+  }
+
+  public function shouldWriteInverseTransactions() {
+    return true;
+  }
+
+  public function shouldPreventCycles() {
+    return true;
+  }
+
+  public function getTransactionAddString(
+    $actor,
+    $add_count,
+    $add_edges) {
+
+    return pht(
+      '%s added %s reverting commit(s): %s.',
+      $actor,
+      $add_count,
+      $add_edges);
+  }
+
+  public function getTransactionRemoveString(
+    $actor,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s removed %s reverting commit(s): %s.',
+      $actor,
+      $rem_count,
+      $rem_edges);
+  }
+
+  public function getTransactionEditString(
+    $actor,
+    $total_count,
+    $add_count,
+    $add_edges,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s edited reverting commit(s), added %s: %s; removed %s: %s.',
+      $actor,
+      $add_count,
+      $add_edges,
+      $rem_count,
+      $rem_edges);
+  }
+
+  public function getFeedAddString(
+    $actor,
+    $object,
+    $add_count,
+    $add_edges) {
+
+    return pht(
+      '%s added %s reverting commit(s) for %s: %s.',
+      $actor,
+      $add_count,
+      $object,
+      $add_edges);
+  }
+
+  public function getFeedRemoveString(
+    $actor,
+    $object,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s removed %s reverting commit(s) for %s: %s.',
+      $actor,
+      $rem_count,
+      $object,
+      $rem_edges);
+  }
+
+  public function getFeedEditString(
+    $actor,
+    $object,
+    $total_count,
+    $add_count,
+    $add_edges,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s edited reverting commit(s) for %s, added %s: %s; removed %s: %s.',
+      $actor,
+      $object,
+      $add_count,
+      $add_edges,
+      $rem_count,
+      $rem_edges);
+  }
+
+}
diff --git a/src/applications/maniphest/edge/ManiphestTaskRevertedByCommitEdgeType.php b/src/applications/maniphest/edge/ManiphestTaskRevertedByCommitEdgeType.php
new file mode 100644
--- /dev/null
+++ b/src/applications/maniphest/edge/ManiphestTaskRevertedByCommitEdgeType.php
@@ -0,0 +1,105 @@
+<?php
+
+final class ManiphestTaskRevertedByCommitEdgeType extends PhabricatorEdgeType {
+
+  const EDGECONST = 63;
+
+  public function shouldWriteInverseTransactions() {
+    return true;
+  }
+
+  public function getInverseEdgeConstant() {
+    return DiffusionCommitRevertsTasksEdgeType::EDGECONST;
+  }
+
+  public function getTransactionAddString(
+    $actor,
+    $add_count,
+    $add_edges) {
+
+    return pht(
+      '%s added %s reverting commit(s): %s.',
+      $actor,
+      $add_count,
+      $add_edges);
+  }
+
+  public function getTransactionRemoveString(
+    $actor,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s removed %s reverting commit(s): %s.',
+      $actor,
+      $rem_count,
+      $rem_edges);
+  }
+
+  public function getTransactionEditString(
+    $actor,
+    $total_count,
+    $add_count,
+    $add_edges,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s edited %s reverting commit(s), added %s: %s; removed %s: %s.',
+      $actor,
+      $total_count,
+      $add_count,
+      $add_edges,
+      $rem_count,
+      $rem_edges);
+  }
+
+  public function getFeedAddString(
+    $actor,
+    $object,
+    $add_count,
+    $add_edges) {
+
+    return pht(
+      '%s added %s reverting commit(s) to %s: %s.',
+      $actor,
+      $add_count,
+      $object,
+      $add_edges);
+  }
+
+  public function getFeedRemoveString(
+    $actor,
+    $object,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s removed %s reverting commit(s) from %s: %s.',
+      $actor,
+      $rem_count,
+      $object,
+      $rem_edges);
+  }
+
+  public function getFeedEditString(
+    $actor,
+    $object,
+    $total_count,
+    $add_count,
+    $add_edges,
+    $rem_count,
+    $rem_edges) {
+
+    return pht(
+      '%s edited %s reverting commit(s) for %s, added %s: %s; removed %s: %s.',
+      $actor,
+      $total_count,
+      $object,
+      $add_count,
+      $add_edges,
+      $rem_count,
+      $rem_edges);
+  }
+
+}
diff --git a/src/applications/repository/worker/PhabricatorRepositoryCommitHeraldWorker.php b/src/applications/repository/worker/PhabricatorRepositoryCommitHeraldWorker.php
--- a/src/applications/repository/worker/PhabricatorRepositoryCommitHeraldWorker.php
+++ b/src/applications/repository/worker/PhabricatorRepositoryCommitHeraldWorker.php
@@ -81,7 +81,93 @@
       $xactions[] = id(new PhabricatorAuditTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
         ->setMetadataValue('edge:type', $reverts_edge)
-        ->setNewValue(array('+' => array_fuse($reverted_commit_phids)));
+        ->setNewValue(array('=' => array_fuse($reverted_commit_phids)));
+
+      $reverted_commit_data =
+        id(new PhabricatorRepositoryCommitData())->loadAllWhere(
+          'commitID IN (%Ld)',
+          mpull($reverted_commits, 'getID', 'getID'));
+
+      $differential_app = 'PhabricatorDifferentialApplication';
+      if (PhabricatorApplication::isClassInstalled($differential_app)) {
+        $reverted_revision_ids = array();
+
+        foreach ($reverted_commit_data as $commit_data) {
+          $revision = $commit_data->getCommitDetail('differential.revisionID');
+
+          if ($revision) {
+            $reverted_revision_ids[] = $revision;
+          }
+        }
+
+        $revision_query = id(new DifferentialRevisionQuery())
+          ->setViewer(PhabricatorUser::getOmnipotentUser())
+          ->withIDs($reverted_revision_ids);
+        $reverted_revisions = $revision_query->execute();
+
+        foreach ($reverted_revisions as $revision) {
+          $edge_type = DifferentialRevisionRevertedByCommitEdgeType::EDGECONST;
+          $xaction = id(new DifferentialTransaction())
+            ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
+            ->setMetadataValue('edge:type', $edge_type)
+            ->setNewValue(array(
+              '+' => array($commit->getPHID() => $commit->getPHID()),
+            ));
+
+          $diff_editor = id(new DifferentialTransactionEditor())
+            ->setActor(PhabricatorUser::getOmnipotentUser())
+            ->setActingAsPHID($acting_as_phid)
+            ->setContentSource(PhabricatorContentSource::newForSource(
+              PhabricatorContentSource::SOURCE_DAEMON, array()))
+            ->setContinueOnNoEffect(true);
+
+          $diff_editor->applyTransactions($revision, array($xaction));
+        }
+      }
+
+      $maniphest_app = 'PhabricatorManiphestApplication';
+      if (PhabricatorApplication::isClassInstalled($maniphest_app)) {
+        $reverted_task_ids = array();
+
+        foreach ($reverted_commit_data as $commit_data) {
+          $monograms = ipull(
+            id(new ManiphestCustomFieldStatusParser())
+              ->parseCorpus($commit_data->getCommitMessage()),
+            'monograms');
+          $monograms = array_mergev($monograms);
+
+          foreach ($monograms as $monogram) {
+            $reverted_task_ids[] = (int)trim($monogram, 'tT');
+          }
+        }
+
+        $task_query = id(new ManiphestTaskQuery())
+          ->setViewer(PhabricatorUser::getOmnipotentUser())
+          ->withIDs($reverted_task_ids);
+        $reverted_tasks = $task_query->execute();
+
+        foreach ($reverted_tasks as $task) {
+          $edge_type = ManiphestTaskRevertedByCommitEdgeType::EDGECONST;
+          $xaction = id(new ManiphestTransaction())
+            ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
+            ->setMetadataValue('edge:type', $edge_type)
+            ->setNewValue(array(
+              '+' => array($commit->getPHID() => $commit->getPHID()),
+            ));
+
+          $maniphest_editor = id(new ManiphestTransactionEditor())
+            ->setActor(PhabricatorUser::getOmnipotentUser())
+            ->setActingAsPHID($acting_as_phid)
+            ->setContentSource(PhabricatorContentSource::newForSource(
+              PhabricatorContentSource::SOURCE_DAEMON, array()))
+            ->setContinueOnNoEffect(true);
+
+          $maniphest_editor->applyTransactions($task, array($xaction));
+        }
+      }
+
+      // TODO: Maybe re-open Maniphest Task.
+
     }
 
     try {
diff --git a/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php b/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php
--- a/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php
+++ b/src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php
@@ -169,10 +169,22 @@
             'precommitRevisionStatus',
             $revision->getStatus());
         }
-        $commit_drev = DiffusionCommitHasRevisionEdgeType::EDGECONST;
-        id(new PhabricatorEdgeEditor())
-          ->addEdge($commit->getPHID(), $commit_drev, $revision->getPHID())
-          ->save();
+
+        $editor = id(new DifferentialTransactionEditor())
+          ->setActor($actor)
+          ->setActingAsPHID($acting_as_phid)
+          ->setContentSource(PhabricatorContentSource::newForSource(
+          PhabricatorContentSource::SOURCE_DAEMON, array()));
+
+        $edge_type = DifferentialRevisionHasCommitEdgeType::EDGECONST;
+        $xaction = id(new DifferentialTransaction())
+          ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
+          ->setMetadataValue('edge:type', $edge_type)
+          ->setNewValue(array(
+            '+' => array($commit->getPHID() => $commit->getPHID()),
+          ));
+
+        $editor->applyTransactions($revision, array($xaction));
 
         queryfx(
           $conn_w,
@@ -238,15 +250,12 @@
             ->setMetadataValue('isCommitUpdate', true);
           $xactions[] = $commit_close_xaction;
 
-          $content_source = PhabricatorContentSource::newForSource(
-            PhabricatorContentSource::SOURCE_DAEMON,
-            array());
-
           $editor = id(new DifferentialTransactionEditor())
             ->setActor($actor)
             ->setActingAsPHID($acting_as_phid)
             ->setContinueOnMissingFields(true)
-            ->setContentSource($content_source)
+            ->setContentSource(PhabricatorContentSource::newForSource(
+              PhabricatorContentSource::SOURCE_DAEMON, array()))
             ->setChangedPriorToCommitURI($changed_uri)
             ->setIsCloseByCommit(true);
 
@@ -504,12 +513,9 @@
       $edge_xaction = id(new ManiphestTransaction())
         ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
         ->setMetadataValue('edge:type', $edge_type)
-        ->setNewValue(
-          array(
-            '+' => array(
-              $commit->getPHID() => $commit->getPHID(),
-            ),
-          ));
+        ->setNewValue(array(
+          '+' => array($commit->getPHID() => $commit->getPHID()),
+        ));
 
       $status = $task_statuses[$task_id];
       if ($status) {
@@ -525,10 +531,6 @@
 
       $xactions[] = $edge_xaction;
 
-      $content_source = PhabricatorContentSource::newForSource(
-        PhabricatorContentSource::SOURCE_DAEMON,
-        array());
-
       $editor = id(new ManiphestTransactionEditor())
         ->setActor($actor)
         ->setActingAsPHID($acting_as)
@@ -536,7 +538,8 @@
         ->setContinueOnMissingFields(true)
         ->setUnmentionablePHIDMap(
           array($commit->getPHID() => $commit->getPHID()))
-        ->setContentSource($content_source);
+        ->setContentSource(PhabricatorContentSource::newForSource(
+          PhabricatorContentSource::SOURCE_DAEMON, array()));
 
       $editor->applyTransactions($task, $xactions);
     }