diff --git a/scripts/daemon/phabricator_daemon_launcher.php b/scripts/daemon/phabricator_daemon_launcher.php
index 7a5776fa5..b0d3239f8 100755
--- a/scripts/daemon/phabricator_daemon_launcher.php
+++ b/scripts/daemon/phabricator_daemon_launcher.php
@@ -1,233 +1,209 @@
 #!/usr/bin/env php
 <?php
 
 /*
  * Copyright 2012 Facebook, Inc.
  *
  * Licensed 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.
  */
 
 $root = dirname(dirname(dirname(__FILE__)));
 require_once $root.'/scripts/__init_script__.php';
 
 phutil_require_module('phabricator', 'infrastructure/daemon/control');
 $control = new PhabricatorDaemonControl();
 
 must_have_extension('pcntl');
 must_have_extension('posix');
 
 function must_have_extension($ext) {
   if (!extension_loaded($ext)) {
     echo "ERROR: The PHP extension '{$ext}' is not installed. You must ".
          "install it to run daemons on this machine.\n";
     exit(1);
   }
 }
 
 switch (isset($argv[1]) ? $argv[1] : 'help') {
   case 'list':
     $err = $control->executeListCommand();
     exit($err);
 
   case 'status':
     $err = $control->executeStatusCommand();
     exit($err);
 
   case 'stop':
     $pass_argv = array_slice($argv, 2);
     $err = $control->executeStopCommand($pass_argv);
     exit($err);
 
   case 'repository-launch-readonly':
     $need_launch = phd_load_tracked_repositories();
     if (!$need_launch) {
       echo "There are no repositories with tracking enabled.\n";
-      exit(0);
+      exit(1);
     }
 
     will_launch($control);
+
+    echo "Launching PullLocal daemon in readonly mode...\n";
+
     $control->launchDaemon(
       'PhabricatorRepositoryPullLocalDaemon',
-      array());
+      array(
+        '--no-discovery',
+      ));
+
+    echo "Done.\n";
     break;
 
   case 'repository-launch-master':
     $need_launch = phd_load_tracked_repositories();
     if (!$need_launch) {
       echo "There are no repositories with tracking enabled.\n";
       exit(1);
-    } else {
-      will_launch($control);
-
-      $control->launchDaemon(
-        'PhabricatorRepositoryPullLocalDaemon',
-        array());
-
-      foreach ($need_launch as $repository) {
-        $name = $repository->getName();
-        $callsign = $repository->getCallsign();
-        $desc = "'{$name}' ({$callsign})";
-        $phid = $repository->getPHID();
-
-        switch ($repository->getVersionControlSystem()) {
-          case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
-            echo "Launching discovery daemon on the {$desc} repository...\n";
-            $control->launchDaemon(
-              'PhabricatorRepositoryGitCommitDiscoveryDaemon',
-              array(
-                $phid,
-              ));
-            break;
-          case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
-            echo "Launching discovery daemon on the {$desc} repository...\n";
-            $control->launchDaemon(
-              'PhabricatorRepositorySvnCommitDiscoveryDaemon',
-              array(
-                $phid,
-              ));
-            break;
-          case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
-            echo "Launching discovery daemon on the {$desc} repository...\n";
-            $control->launchDaemon(
-              'PhabricatorRepositoryMercurialCommitDiscoveryDaemon',
-              array(
-                $phid,
-              ));
-            break;
+    }
 
-        }
-      }
+    will_launch($control);
 
-      echo "Launching CommitTask daemon...\n";
-      $control->launchDaemon(
-        'PhabricatorRepositoryCommitTaskDaemon',
-        array());
+    echo "Launching PullLocal daemon in master mode...\n";
+    $control->launchDaemon(
+      'PhabricatorRepositoryPullLocalDaemon',
+      array());
 
-      echo "Done.\n";
-    }
+    echo "Launching CommitTask daemon...\n";
+    $control->launchDaemon(
+      'PhabricatorRepositoryCommitTaskDaemon',
+      array());
+
+    echo "NOTE: Make sure you run some taskmaster daemons too, e.g. ".
+         "with 'phd launch 4 taskmaster'.\n";
+
+    echo "Done.\n";
     break;
 
   case 'launch':
   case 'debug':
     $is_debug = ($argv[1] == 'debug');
 
     $daemon = idx($argv, 2);
     if (!$daemon) {
       throw new Exception("Daemon name required!");
     }
 
     $pass_argv = array_slice($argv, 3);
 
     $n = 1;
     if (!$is_debug) {
       if (is_numeric($daemon)) {
         $n = $daemon;
         if ($n < 1) {
           throw new Exception("Count must be at least 1!");
         }
         $daemon = idx($argv, 3);
         if (!$daemon) {
           throw new Exception("Daemon name required!");
         }
         $pass_argv = array_slice($argv, 4);
       }
     }
 
     $loader = new PhutilSymbolLoader();
     $symbols = $loader
       ->setAncestorClass('PhutilDaemon')
       ->selectSymbolsWithoutLoading();
 
     $symbols = ipull($symbols, 'name');
     $match = array();
     foreach ($symbols as $symbol) {
       if (stripos($symbol, $daemon) !== false) {
         if (strtolower($symbol) == strtolower($daemon)) {
           $match = array($symbol);
           break;
         } else {
           $match[] = $symbol;
         }
       }
     }
 
     if (count($match) == 0) {
       throw new Exception(
         "No daemons match! Use 'phd list' for a list of daemons.");
     } else if (count($match) > 1) {
       throw new Exception(
         "Which of these daemons did you mean?\n".
         "    ".implode("\n    ", $match));
     } else {
       $daemon = reset($match);
     }
 
     $with_logs = true;
     if ($is_debug) {
       // In debug mode, we emit errors straight to stdout, so nothing useful
       // will show up in the logs. Don't echo the message about stuff showing
       // up in them, since it would be confusing.
       $with_logs = false;
     }
 
     will_launch($control, $with_logs);
 
     if ($is_debug) {
       echo "Launching {$daemon} in debug mode (nondaemonized)...\n";
     } else {
       echo "Launching {$n} x {$daemon}";
     }
 
     for ($ii = 0; $ii < $n; $ii++) {
       $control->launchDaemon($daemon, $pass_argv, $is_debug);
       if (!$is_debug) {
         echo ".";
       }
     }
 
     echo "\n";
     echo "Done.\n";
 
     break;
 
   case '--help':
   case 'help':
   default:
     $err = $control->executeHelpCommand();
     exit($err);
 }
 
 function phd_load_tracked_repositories() {
   phutil_require_module(
     'phabricator',
     'applications/repository/storage/repository');
 
   $repositories = id(new PhabricatorRepository())->loadAll();
   foreach ($repositories as $key => $repository) {
     if (!$repository->isTracked()) {
       unset($repositories[$key]);
     }
   }
 
   return $repositories;
 }
 
 function will_launch($control, $with_logs = true) {
   echo "Staging launch...\n";
   $control->pingConduit();
   if ($with_logs) {
     $log_dir = $control->getControlDirectory('log').'/daemons.log';
     echo "NOTE: Logs will appear in '{$log_dir}'.\n\n";
   }
 }
 
diff --git a/scripts/repository/discover.php b/scripts/repository/discover.php
new file mode 100755
index 000000000..51a02f961
--- /dev/null
+++ b/scripts/repository/discover.php
@@ -0,0 +1,51 @@
+#!/usr/bin/env php
+<?php
+
+/*
+ * Copyright 2012 Facebook, Inc.
+ *
+ * Licensed 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.
+ */
+
+$root = dirname(dirname(dirname(__FILE__)));
+require_once $root.'/scripts/__init_script__.php';
+
+$args = new PhutilArgumentParser($argv);
+$args->setTagline('manually discover working copies');
+$args->setSynopsis(<<<EOHELP
+**discover.php** [__options__] __repository-callsign-or-phid ...__
+    Manually discover commits in working copies for the named repositories.
+EOHELP
+);
+$args->parseStandardArguments();
+$args->parse(
+  array(
+    array(
+      'name'      => 'repositories',
+      'wildcard'  => true,
+    ),
+  ));
+
+$repo_names = $args->getArg('repositories');
+if (!$repo_names) {
+  echo "Specify one or more repositories to pull, by callsign or PHID.\n";
+  exit(1);
+}
+
+$repos = PhabricatorRepository::loadAllByPHIDOrCallsign($repo_names);
+foreach ($repos as $repo) {
+  $callsign = $repo->getCallsign();
+  echo "Discovering '{$callsign}'...\n";
+  PhabricatorRepositoryPullLocalDaemon::discoverRepository($repo);
+}
+echo "Done.\n";
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
index 3515566b4..dfd635ce4 100644
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -1,1922 +1,1912 @@
 <?php
 
 /**
  * This file is automatically generated. Use 'phutil_mapper.php' to rebuild it.
  * @generated
  */
 
 phutil_register_library_map(array(
   'class' =>
   array(
     'Aphront304Response' => 'aphront/response/304',
     'Aphront400Response' => 'aphront/response/400',
     'Aphront403Response' => 'aphront/response/403',
     'Aphront404Response' => 'aphront/response/404',
     'AphrontAjaxResponse' => 'aphront/response/ajax',
     'AphrontApplicationConfiguration' => 'aphront/applicationconfiguration',
     'AphrontAttachedFileView' => 'view/control/attachedfile',
     'AphrontCSRFException' => 'aphront/exception/csrf',
     'AphrontCalendarMonthView' => 'applications/calendar/view/month',
     'AphrontContextBarView' => 'view/layout/contextbar',
     'AphrontController' => 'aphront/controller',
     'AphrontCrumbsView' => 'view/layout/crumbs',
     'AphrontDatabaseConnection' => 'storage/connection/base',
     'AphrontDatabaseTransactionState' => 'storage/transaction',
     'AphrontDefaultApplicationConfiguration' => 'aphront/default/configuration',
     'AphrontDialogResponse' => 'aphront/response/dialog',
     'AphrontDialogView' => 'view/dialog',
     'AphrontErrorView' => 'view/form/error',
     'AphrontException' => 'aphront/exception/base',
     'AphrontFilePreviewView' => 'view/layout/filepreview',
     'AphrontFileResponse' => 'aphront/response/file',
     'AphrontFormCheckboxControl' => 'view/form/control/checkbox',
     'AphrontFormControl' => 'view/form/control/base',
     'AphrontFormDateControl' => 'view/form/control/date',
     'AphrontFormDividerControl' => 'view/form/control/divider',
     'AphrontFormDragAndDropUploadControl' => 'view/form/control/draganddropupload',
     'AphrontFormFileControl' => 'view/form/control/file',
     'AphrontFormInsetView' => 'view/form/inset',
     'AphrontFormLayoutView' => 'view/form/layout',
     'AphrontFormMarkupControl' => 'view/form/control/markup',
     'AphrontFormPasswordControl' => 'view/form/control/password',
     'AphrontFormPolicyControl' => 'view/form/control/policy',
     'AphrontFormRadioButtonControl' => 'view/form/control/radio',
     'AphrontFormRecaptchaControl' => 'view/form/control/recaptcha',
     'AphrontFormSelectControl' => 'view/form/control/select',
     'AphrontFormStaticControl' => 'view/form/control/static',
     'AphrontFormSubmitControl' => 'view/form/control/submit',
     'AphrontFormTextAreaControl' => 'view/form/control/textarea',
     'AphrontFormTextControl' => 'view/form/control/text',
     'AphrontFormToggleButtonsControl' => 'view/form/control/togglebuttons',
     'AphrontFormTokenizerControl' => 'view/form/control/tokenizer',
     'AphrontFormView' => 'view/form/base',
     'AphrontHTTPSink' => 'aphront/sink/base',
     'AphrontHTTPSinkTestCase' => 'aphront/sink/base/__tests__',
     'AphrontHeadsupActionListView' => 'view/layout/headsup/actionlist',
     'AphrontHeadsupActionView' => 'view/layout/headsup/action',
     'AphrontHeadsupView' => 'view/layout/headsup/panel',
     'AphrontIDPagerView' => 'view/control/idpager',
     'AphrontIsolatedDatabaseConnection' => 'storage/connection/isolated',
     'AphrontIsolatedDatabaseConnectionTestCase' => 'storage/connection/isolated/__tests__',
     'AphrontIsolatedHTTPSink' => 'aphront/sink/test',
     'AphrontJSONResponse' => 'aphront/response/json',
     'AphrontJavelinView' => 'view/javelin-view',
     'AphrontKeyboardShortcutsAvailableView' => 'view/widget/keyboardshortcuts',
     'AphrontListFilterView' => 'view/layout/listfilter',
     'AphrontMiniPanelView' => 'view/layout/minipanel',
     'AphrontMySQLDatabaseConnection' => 'storage/connection/mysql/mysql',
     'AphrontMySQLDatabaseConnectionBase' => 'storage/connection/mysql/base',
     'AphrontMySQLDatabaseConnectionTestCase' => 'storage/connection/mysql/__tests__',
     'AphrontMySQLiDatabaseConnection' => 'storage/connection/mysql/mysqli',
     'AphrontNullView' => 'view/null',
     'AphrontPHPHTTPSink' => 'aphront/sink/php',
     'AphrontPageView' => 'view/page/base',
     'AphrontPagerView' => 'view/control/pager',
     'AphrontPanelView' => 'view/layout/panel',
     'AphrontPlainTextResponse' => 'aphront/response/plaintext',
     'AphrontProxyResponse' => 'aphront/response/proxy',
     'AphrontQueryAccessDeniedException' => 'storage/exception/accessdenied',
     'AphrontQueryConnectionException' => 'storage/exception/connection',
     'AphrontQueryConnectionLostException' => 'storage/exception/connectionlost',
     'AphrontQueryCountException' => 'storage/exception/count',
     'AphrontQueryDeadlockException' => 'storage/exception/deadlock',
     'AphrontQueryDuplicateKeyException' => 'storage/exception/duplicatekey',
     'AphrontQueryException' => 'storage/exception/base',
     'AphrontQueryObjectMissingException' => 'storage/exception/objectmissing',
     'AphrontQueryParameterException' => 'storage/exception/parameter',
     'AphrontQueryRecoverableException' => 'storage/exception/recoverable',
     'AphrontQuerySchemaException' => 'storage/exception/schema',
     'AphrontRedirectException' => 'aphront/exception/redirect',
     'AphrontRedirectResponse' => 'aphront/response/redirect',
     'AphrontReloadResponse' => 'aphront/response/reload',
     'AphrontRequest' => 'aphront/request',
     'AphrontRequestFailureView' => 'view/page/failure',
     'AphrontRequestTestCase' => 'aphront/request/__tests__',
     'AphrontResponse' => 'aphront/response/base',
     'AphrontScopedUnguardedWriteCapability' => 'aphront/writeguard/scopeguard',
     'AphrontSideNavFilterView' => 'view/layout/sidenavfilter',
     'AphrontSideNavView' => 'view/layout/sidenav',
     'AphrontTableView' => 'view/control/table',
     'AphrontTokenizerTemplateView' => 'view/control/tokenizer',
     'AphrontTypeaheadTemplateView' => 'view/control/typeahead',
     'AphrontURIMapper' => 'aphront/mapper',
     'AphrontUsageException' => 'aphront/exception/usage',
     'AphrontView' => 'view/base',
     'AphrontWebpageResponse' => 'aphront/response/webpage',
     'AphrontWriteGuard' => 'aphront/writeguard',
     'CelerityAPI' => 'infrastructure/celerity/api',
     'CelerityResourceController' => 'infrastructure/celerity/controller',
     'CelerityResourceGraph' => 'infrastructure/celerity/graph',
     'CelerityResourceMap' => 'infrastructure/celerity/map',
     'CelerityResourceTransformer' => 'infrastructure/celerity/transformer',
     'CelerityResourceTransformerTestCase' => 'infrastructure/celerity/transformer/__tests__',
     'CelerityStaticResourceResponse' => 'infrastructure/celerity/response',
     'ConduitAPIMethod' => 'applications/conduit/method/base',
     'ConduitAPIRequest' => 'applications/conduit/protocol/request',
     'ConduitAPIResponse' => 'applications/conduit/protocol/response',
     'ConduitAPI_arcanist_Method' => 'applications/conduit/method/arcanist/base',
     'ConduitAPI_arcanist_projectinfo_Method' => 'applications/conduit/method/arcanist/projectinfo',
     'ConduitAPI_audit_Method' => 'applications/conduit/method/audit/base',
     'ConduitAPI_audit_query_Method' => 'applications/conduit/method/audit/query',
     'ConduitAPI_chatlog_Method' => 'applications/conduit/method/chatlog/base',
     'ConduitAPI_chatlog_query_Method' => 'applications/conduit/method/chatlog/query',
     'ConduitAPI_chatlog_record_Method' => 'applications/conduit/method/chatlog/record',
     'ConduitAPI_conduit_connect_Method' => 'applications/conduit/method/conduit/connect',
     'ConduitAPI_conduit_getcertificate_Method' => 'applications/conduit/method/conduit/getcertificate',
     'ConduitAPI_conduit_ping_Method' => 'applications/conduit/method/conduit/ping',
     'ConduitAPI_daemon_launched_Method' => 'applications/conduit/method/daemon/launched',
     'ConduitAPI_daemon_log_Method' => 'applications/conduit/method/daemon/log',
     'ConduitAPI_differential_close_Method' => 'applications/conduit/method/differential/close',
     'ConduitAPI_differential_createcomment_Method' => 'applications/conduit/method/differential/createcomment',
     'ConduitAPI_differential_creatediff_Method' => 'applications/conduit/method/differential/creatediff',
     'ConduitAPI_differential_createrevision_Method' => 'applications/conduit/method/differential/createrevision',
     'ConduitAPI_differential_find_Method' => 'applications/conduit/method/differential/find',
     'ConduitAPI_differential_getalldiffs_Method' => 'applications/conduit/method/differential/getalldiffs',
     'ConduitAPI_differential_getcommitmessage_Method' => 'applications/conduit/method/differential/getcommitmessage',
     'ConduitAPI_differential_getcommitpaths_Method' => 'applications/conduit/method/differential/getcommitpaths',
     'ConduitAPI_differential_getdiff_Method' => 'applications/conduit/method/differential/getdiff',
     'ConduitAPI_differential_getrevision_Method' => 'applications/conduit/method/differential/getrevision',
     'ConduitAPI_differential_getrevisioncomments_Method' => 'applications/conduit/method/differential/getrevisioncomments',
     'ConduitAPI_differential_getrevisionfeedback_Method' => 'applications/conduit/method/differential/getrevisionfeedback',
     'ConduitAPI_differential_markcommitted_Method' => 'applications/conduit/method/differential/markcommitted',
     'ConduitAPI_differential_parsecommitmessage_Method' => 'applications/conduit/method/differential/parsecommitmessage',
     'ConduitAPI_differential_query_Method' => 'applications/conduit/method/differential/query',
     'ConduitAPI_differential_setdiffproperty_Method' => 'applications/conduit/method/differential/setdiffproperty',
     'ConduitAPI_differential_updaterevision_Method' => 'applications/conduit/method/differential/updaterevision',
     'ConduitAPI_differential_updatetaskrevisionassoc_Method' => 'applications/conduit/method/differential/updatetaskrevisionassoc',
     'ConduitAPI_differential_updateunitresults_Method' => 'applications/conduit/method/differential/updateunitresults',
     'ConduitAPI_diffusion_findsymbols_Method' => 'applications/conduit/method/diffusion/findsymbols',
     'ConduitAPI_diffusion_getcommits_Method' => 'applications/conduit/method/diffusion/getcommits',
     'ConduitAPI_diffusion_getrecentcommitsbypath_Method' => 'applications/conduit/method/diffusion/getrecentcommitsbypath',
     'ConduitAPI_feed_publish_Method' => 'applications/conduit/method/feed/publish',
     'ConduitAPI_feed_query_Method' => 'applications/conduit/method/feed/query',
     'ConduitAPI_file_download_Method' => 'applications/conduit/method/file/download',
     'ConduitAPI_file_info_Method' => 'applications/conduit/method/file/info',
     'ConduitAPI_file_upload_Method' => 'applications/conduit/method/file/upload',
     'ConduitAPI_flag_Method' => 'applications/conduit/method/flag/base',
     'ConduitAPI_flag_query_Method' => 'applications/conduit/method/flag/query',
     'ConduitAPI_macro_Method' => 'applications/conduit/method/macro/base',
     'ConduitAPI_macro_query_Method' => 'applications/conduit/method/macro/query',
     'ConduitAPI_maniphest_Method' => 'applications/conduit/method/maniphest/base',
     'ConduitAPI_maniphest_createtask_Method' => 'applications/conduit/method/maniphest/createtask',
     'ConduitAPI_maniphest_find_Method' => 'applications/conduit/method/maniphest/find',
     'ConduitAPI_maniphest_gettasktransactions_Method' => 'applications/conduit/method/maniphest/gettasktransactions',
     'ConduitAPI_maniphest_info_Method' => 'applications/conduit/method/maniphest/info',
     'ConduitAPI_maniphest_update_Method' => 'applications/conduit/method/maniphest/update',
     'ConduitAPI_paste_Method' => 'applications/conduit/method/paste/base',
     'ConduitAPI_paste_create_Method' => 'applications/conduit/method/paste/create',
     'ConduitAPI_paste_info_Method' => 'applications/conduit/method/paste/info',
     'ConduitAPI_path_getowners_Method' => 'applications/conduit/method/path/getowners',
     'ConduitAPI_phid_Method' => 'applications/conduit/method/phid/base',
     'ConduitAPI_phid_info_Method' => 'applications/conduit/method/phid/info',
     'ConduitAPI_phid_query_Method' => 'applications/conduit/method/phid/query',
     'ConduitAPI_phriction_Method' => 'applications/conduit/method/phriction/base',
     'ConduitAPI_phriction_edit_Method' => 'applications/conduit/method/phriction/edit',
     'ConduitAPI_phriction_history_Method' => 'applications/conduit/method/phriction/history',
     'ConduitAPI_phriction_info_Method' => 'applications/conduit/method/phriction/info',
     'ConduitAPI_project_Method' => 'applications/conduit/method/project/base',
     'ConduitAPI_project_query_Method' => 'applications/conduit/method/project/query',
     'ConduitAPI_remarkup_process_Method' => 'applications/conduit/method/remarkup/process',
     'ConduitAPI_repository_Method' => 'applications/conduit/method/repository/base',
     'ConduitAPI_repository_create_Method' => 'applications/conduit/method/repository/create',
     'ConduitAPI_repository_query_Method' => 'applications/conduit/method/repository/query',
     'ConduitAPI_slowvote_info_Method' => 'applications/conduit/method/slowvote/info',
     'ConduitAPI_user_Method' => 'applications/conduit/method/user/base',
     'ConduitAPI_user_addstatus_Method' => 'applications/conduit/method/user/addstatus',
     'ConduitAPI_user_find_Method' => 'applications/conduit/method/user/find',
     'ConduitAPI_user_info_Method' => 'applications/conduit/method/user/info',
     'ConduitAPI_user_query_Method' => 'applications/conduit/method/user/query',
     'ConduitAPI_user_removestatus_Method' => 'applications/conduit/method/user/removestatus',
     'ConduitAPI_user_whoami_Method' => 'applications/conduit/method/user/whoami',
     'ConduitException' => 'applications/conduit/protocol/exception',
     'DarkConsoleConfigPlugin' => 'aphront/console/plugin/config',
     'DarkConsoleController' => 'aphront/console/controller',
     'DarkConsoleCore' => 'aphront/console/core',
     'DarkConsoleErrorLogPlugin' => 'aphront/console/plugin/errorlog',
     'DarkConsoleErrorLogPluginAPI' => 'aphront/console/plugin/errorlog/api',
     'DarkConsoleEventPlugin' => 'aphront/console/plugin/event',
     'DarkConsoleEventPluginAPI' => 'aphront/console/plugin/event/api',
     'DarkConsolePlugin' => 'aphront/console/plugin/base',
     'DarkConsoleRequestPlugin' => 'aphront/console/plugin/request',
     'DarkConsoleServicesPlugin' => 'aphront/console/plugin/services',
     'DarkConsoleXHProfPlugin' => 'aphront/console/plugin/xhprof',
     'DarkConsoleXHProfPluginAPI' => 'aphront/console/plugin/xhprof/api',
     'DatabaseConfigurationProvider' => 'applications/base/storage/configuration/base',
     'DefaultDatabaseConfigurationProvider' => 'applications/base/storage/configuration/default',
     'DifferentialAction' => 'applications/differential/constants/action',
     'DifferentialActionHasNoEffectException' => 'applications/differential/exception/noeffect',
     'DifferentialAddCommentView' => 'applications/differential/view/addcomment',
     'DifferentialAffectedPath' => 'applications/differential/storage/affectedpath',
     'DifferentialApplyPatchFieldSpecification' => 'applications/differential/field/specification/applypatch',
     'DifferentialArcanistProjectFieldSpecification' => 'applications/differential/field/specification/arcanistproject',
     'DifferentialAuditorsFieldSpecification' => 'applications/differential/field/specification/auditors',
     'DifferentialAuthorFieldSpecification' => 'applications/differential/field/specification/author',
     'DifferentialAuxiliaryField' => 'applications/differential/storage/auxiliaryfield',
     'DifferentialBlameRevisionFieldSpecification' => 'applications/differential/field/specification/blamerev',
     'DifferentialBranchFieldSpecification' => 'applications/differential/field/specification/branch',
     'DifferentialCCWelcomeMail' => 'applications/differential/mail/ccwelcome',
     'DifferentialCCsFieldSpecification' => 'applications/differential/field/specification/ccs',
     'DifferentialChangeType' => 'applications/differential/constants/changetype',
     'DifferentialChangeset' => 'applications/differential/storage/changeset',
     'DifferentialChangesetDetailView' => 'applications/differential/view/changesetdetailview',
     'DifferentialChangesetListView' => 'applications/differential/view/changesetlistview',
     'DifferentialChangesetParser' => 'applications/differential/parser/changeset',
     'DifferentialChangesetViewController' => 'applications/differential/controller/changesetview',
     'DifferentialComment' => 'applications/differential/storage/comment',
     'DifferentialCommentEditor' => 'applications/differential/editor/comment',
     'DifferentialCommentMail' => 'applications/differential/mail/comment',
     'DifferentialCommentPreviewController' => 'applications/differential/controller/commentpreview',
     'DifferentialCommentSaveController' => 'applications/differential/controller/commentsave',
     'DifferentialCommitsFieldSpecification' => 'applications/differential/field/specification/commits',
     'DifferentialController' => 'applications/differential/controller/base',
     'DifferentialDAO' => 'applications/differential/storage/base',
     'DifferentialDateCreatedFieldSpecification' => 'applications/differential/field/specification/datecreated',
     'DifferentialDateModifiedFieldSpecification' => 'applications/differential/field/specification/datemodified',
     'DifferentialDefaultFieldSelector' => 'applications/differential/field/selector/default',
     'DifferentialDependenciesFieldSpecification' => 'applications/differential/field/specification/dependencies',
     'DifferentialDiff' => 'applications/differential/storage/diff',
     'DifferentialDiffContentMail' => 'applications/differential/mail/diffcontent',
     'DifferentialDiffCreateController' => 'applications/differential/controller/diffcreate',
     'DifferentialDiffProperty' => 'applications/differential/storage/diffproperty',
     'DifferentialDiffTableOfContentsView' => 'applications/differential/view/difftableofcontents',
     'DifferentialDiffViewController' => 'applications/differential/controller/diffview',
     'DifferentialException' => 'applications/differential/exception/base',
     'DifferentialExceptionMail' => 'applications/differential/mail/exception',
     'DifferentialExportPatchFieldSpecification' => 'applications/differential/field/specification/exportpatch',
     'DifferentialFieldDataNotAvailableException' => 'applications/differential/field/exception/notavailable',
     'DifferentialFieldParseException' => 'applications/differential/field/exception/parse',
     'DifferentialFieldSelector' => 'applications/differential/field/selector/base',
     'DifferentialFieldSpecification' => 'applications/differential/field/specification/base',
     'DifferentialFieldSpecificationIncompleteException' => 'applications/differential/field/exception/incomplete',
     'DifferentialFieldValidationException' => 'applications/differential/field/exception/validation',
     'DifferentialGitSVNIDFieldSpecification' => 'applications/differential/field/specification/gitsvnid',
     'DifferentialHostFieldSpecification' => 'applications/differential/field/specification/host',
     'DifferentialHunk' => 'applications/differential/storage/hunk',
     'DifferentialInlineComment' => 'applications/differential/storage/inlinecomment',
     'DifferentialInlineCommentEditController' => 'applications/differential/controller/inlinecommentedit',
     'DifferentialInlineCommentEditView' => 'applications/differential/view/inlinecommentedit',
     'DifferentialInlineCommentPreviewController' => 'applications/differential/controller/inlinecommentpreview',
     'DifferentialInlineCommentView' => 'applications/differential/view/inlinecomment',
     'DifferentialLinesFieldSpecification' => 'applications/differential/field/specification/lines',
     'DifferentialLintFieldSpecification' => 'applications/differential/field/specification/lint',
     'DifferentialLintStatus' => 'applications/differential/constants/lintstatus',
     'DifferentialLocalCommitsView' => 'applications/differential/view/localcommits',
     'DifferentialMail' => 'applications/differential/mail/base',
     'DifferentialManiphestTasksFieldSpecification' => 'applications/differential/field/specification/maniphesttasks',
     'DifferentialNewDiffMail' => 'applications/differential/mail/newdiff',
     'DifferentialPathFieldSpecification' => 'applications/differential/field/specification/path',
     'DifferentialPrimaryPaneView' => 'applications/differential/view/primarypane',
     'DifferentialReplyHandler' => 'applications/differential/replyhandler',
     'DifferentialResultsTableView' => 'applications/differential/view/resultstableview',
     'DifferentialRevertPlanFieldSpecification' => 'applications/differential/field/specification/revertplan',
     'DifferentialReviewRequestMail' => 'applications/differential/mail/reviewrequest',
     'DifferentialReviewedByFieldSpecification' => 'applications/differential/field/specification/reviewedby',
     'DifferentialReviewersFieldSpecification' => 'applications/differential/field/specification/reviewers',
     'DifferentialRevision' => 'applications/differential/storage/revision',
     'DifferentialRevisionCommentListView' => 'applications/differential/view/revisioncommentlist',
     'DifferentialRevisionCommentView' => 'applications/differential/view/revisioncomment',
     'DifferentialRevisionControlSystem' => 'applications/differential/constants/revisioncontrolsystem',
     'DifferentialRevisionDetailRenderer' => 'applications/differential/controller/customrenderer',
     'DifferentialRevisionDetailView' => 'applications/differential/view/revisiondetail',
     'DifferentialRevisionEditController' => 'applications/differential/controller/revisionedit',
     'DifferentialRevisionEditor' => 'applications/differential/editor/revision',
     'DifferentialRevisionIDFieldParserTestCase' => 'applications/differential/field/specification/revisionid/__tests__',
     'DifferentialRevisionIDFieldSpecification' => 'applications/differential/field/specification/revisionid',
     'DifferentialRevisionListController' => 'applications/differential/controller/revisionlist',
     'DifferentialRevisionListData' => 'applications/differential/data/revisionlist',
     'DifferentialRevisionListView' => 'applications/differential/view/revisionlist',
     'DifferentialRevisionQuery' => 'applications/differential/query/revision',
     'DifferentialRevisionStatsController' => 'applications/differential/controller/revisionstats',
     'DifferentialRevisionStatsView' => 'applications/differential/view/revisionstats',
     'DifferentialRevisionStatusFieldSpecification' => 'applications/differential/field/specification/revisionstatus',
     'DifferentialRevisionUpdateHistoryView' => 'applications/differential/view/revisionupdatehistory',
     'DifferentialRevisionViewController' => 'applications/differential/controller/revisionview',
     'DifferentialSubscribeController' => 'applications/differential/controller/subscribe',
     'DifferentialSummaryFieldSpecification' => 'applications/differential/field/specification/summary',
     'DifferentialTasksAttacher' => 'applications/differential/tasks',
     'DifferentialTestPlanFieldSpecification' => 'applications/differential/field/specification/testplan',
     'DifferentialTitleFieldSpecification' => 'applications/differential/field/specification/title',
     'DifferentialUnitFieldSpecification' => 'applications/differential/field/specification/unit',
     'DifferentialUnitStatus' => 'applications/differential/constants/unitstatus',
     'DifferentialUnitTestResult' => 'applications/differential/constants/unittestresult',
     'DiffusionBranchInformation' => 'applications/diffusion/data/branch',
     'DiffusionBranchQuery' => 'applications/diffusion/query/branch/base',
     'DiffusionBranchTableView' => 'applications/diffusion/view/branchtable',
     'DiffusionBrowseController' => 'applications/diffusion/controller/browse',
     'DiffusionBrowseFileController' => 'applications/diffusion/controller/file',
     'DiffusionBrowseQuery' => 'applications/diffusion/query/browse/base',
     'DiffusionBrowseTableView' => 'applications/diffusion/view/browsetable',
     'DiffusionChangeController' => 'applications/diffusion/controller/change',
     'DiffusionCommentListView' => 'applications/diffusion/view/commentlist',
     'DiffusionCommentView' => 'applications/diffusion/view/comment',
     'DiffusionCommitChangeTableView' => 'applications/diffusion/view/commitchangetable',
     'DiffusionCommitController' => 'applications/diffusion/controller/commit',
     'DiffusionCommitParentsQuery' => 'applications/diffusion/query/parents/base',
     'DiffusionCommitTagsQuery' => 'applications/diffusion/query/committags/base',
     'DiffusionContainsQuery' => 'applications/diffusion/query/contains/base',
     'DiffusionController' => 'applications/diffusion/controller/base',
     'DiffusionDiffController' => 'applications/diffusion/controller/diff',
     'DiffusionDiffQuery' => 'applications/diffusion/query/diff/base',
     'DiffusionEmptyResultView' => 'applications/diffusion/view/emptyresult',
     'DiffusionExternalController' => 'applications/diffusion/controller/external',
     'DiffusionFileContent' => 'applications/diffusion/data/filecontent',
     'DiffusionFileContentQuery' => 'applications/diffusion/query/filecontent/base',
     'DiffusionGitBranchQuery' => 'applications/diffusion/query/branch/git',
     'DiffusionGitBranchQueryTestCase' => 'applications/diffusion/query/branch/git/__tests__',
     'DiffusionGitBrowseQuery' => 'applications/diffusion/query/browse/git',
     'DiffusionGitCommitParentsQuery' => 'applications/diffusion/query/parents/git',
     'DiffusionGitCommitTagsQuery' => 'applications/diffusion/query/committags/git',
     'DiffusionGitContainsQuery' => 'applications/diffusion/query/contains/git',
     'DiffusionGitDiffQuery' => 'applications/diffusion/query/diff/git',
     'DiffusionGitFileContentQuery' => 'applications/diffusion/query/filecontent/git',
     'DiffusionGitHistoryQuery' => 'applications/diffusion/query/history/git',
     'DiffusionGitLastModifiedQuery' => 'applications/diffusion/query/lastmodified/git',
     'DiffusionGitMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/git',
     'DiffusionGitRawDiffQuery' => 'applications/diffusion/query/rawdiff/git',
     'DiffusionGitRenameHistoryQuery' => 'applications/diffusion/query/renamehistory/git',
     'DiffusionGitRequest' => 'applications/diffusion/request/git',
     'DiffusionGitTagListQuery' => 'applications/diffusion/query/taglist/git',
     'DiffusionHistoryController' => 'applications/diffusion/controller/history',
     'DiffusionHistoryQuery' => 'applications/diffusion/query/history/base',
     'DiffusionHistoryTableView' => 'applications/diffusion/view/historytable',
     'DiffusionHomeController' => 'applications/diffusion/controller/home',
     'DiffusionInlineCommentController' => 'applications/diffusion/controller/inline',
     'DiffusionLastModifiedController' => 'applications/diffusion/controller/lastmodified',
     'DiffusionLastModifiedQuery' => 'applications/diffusion/query/lastmodified/base',
     'DiffusionMercurialBranchQuery' => 'applications/diffusion/query/branch/mercurial',
     'DiffusionMercurialBrowseQuery' => 'applications/diffusion/query/browse/mercurial',
     'DiffusionMercurialCommitParentsQuery' => 'applications/diffusion/query/parents/mercurial',
     'DiffusionMercurialCommitTagsQuery' => 'applications/diffusion/query/committags/mercurial',
     'DiffusionMercurialContainsQuery' => 'applications/diffusion/query/contains/mercurial',
     'DiffusionMercurialDiffQuery' => 'applications/diffusion/query/diff/mercurial',
     'DiffusionMercurialFileContentQuery' => 'applications/diffusion/query/filecontent/mercurial',
     'DiffusionMercurialHistoryQuery' => 'applications/diffusion/query/history/mercurial',
     'DiffusionMercurialLastModifiedQuery' => 'applications/diffusion/query/lastmodified/mercurial',
     'DiffusionMercurialMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/mercurial',
     'DiffusionMercurialRawDiffQuery' => 'applications/diffusion/query/rawdiff/mercurial',
     'DiffusionMercurialRenameHistoryQuery' => 'applications/diffusion/query/renamehistory/mercurial',
     'DiffusionMercurialRequest' => 'applications/diffusion/request/mercurial',
     'DiffusionMercurialTagListQuery' => 'applications/diffusion/query/taglist/mercurial',
     'DiffusionMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/base',
     'DiffusionPathChange' => 'applications/diffusion/data/pathchange',
     'DiffusionPathChangeQuery' => 'applications/diffusion/query/pathchange/base',
     'DiffusionPathCompleteController' => 'applications/diffusion/controller/pathcomplete',
     'DiffusionPathIDQuery' => 'applications/diffusion/query/pathid/base',
     'DiffusionPathQuery' => 'applications/diffusion/query/path',
     'DiffusionPathQueryTestCase' => 'applications/diffusion/query/pathid/base/__tests__',
     'DiffusionPathValidateController' => 'applications/diffusion/controller/pathvalidate',
     'DiffusionQuery' => 'applications/diffusion/query/base',
     'DiffusionRawDiffQuery' => 'applications/diffusion/query/rawdiff/base',
     'DiffusionRenameHistoryQuery' => 'applications/diffusion/query/renamehistory/base',
     'DiffusionRepositoryController' => 'applications/diffusion/controller/repository',
     'DiffusionRepositoryPath' => 'applications/diffusion/data/repositorypath',
     'DiffusionRepositoryTag' => 'applications/diffusion/tag',
     'DiffusionRequest' => 'applications/diffusion/request/base',
     'DiffusionSvnBrowseQuery' => 'applications/diffusion/query/browse/svn',
     'DiffusionSvnCommitParentsQuery' => 'applications/diffusion/query/parents/svn',
     'DiffusionSvnCommitTagsQuery' => 'applications/diffusion/query/committags/svn',
     'DiffusionSvnContainsQuery' => 'applications/diffusion/query/contains/svn',
     'DiffusionSvnDiffQuery' => 'applications/diffusion/query/diff/svn',
     'DiffusionSvnFileContentQuery' => 'applications/diffusion/query/filecontent/svn',
     'DiffusionSvnHistoryQuery' => 'applications/diffusion/query/history/svn',
     'DiffusionSvnLastModifiedQuery' => 'applications/diffusion/query/lastmodified/svn',
     'DiffusionSvnMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/svn',
     'DiffusionSvnRawDiffQuery' => 'applications/diffusion/query/rawdiff/svn',
     'DiffusionSvnRenameHistoryQuery' => 'applications/diffusion/query/renamehistory/svn',
     'DiffusionSvnRequest' => 'applications/diffusion/request/svn',
     'DiffusionSvnTagListQuery' => 'applications/diffusion/query/taglist/svn',
     'DiffusionSymbolController' => 'applications/diffusion/controller/symbol',
     'DiffusionSymbolQuery' => 'applications/diffusion/query/symbol',
     'DiffusionTagListController' => 'applications/diffusion/controller/taglist',
     'DiffusionTagListQuery' => 'applications/diffusion/query/taglist/base',
     'DiffusionTagListView' => 'applications/diffusion/view/taglist',
     'DiffusionURITestCase' => 'applications/diffusion/request/base/__tests__',
     'DiffusionView' => 'applications/diffusion/view/base',
     'DrydockAllocator' => 'applications/drydock/allocator/resource',
     'DrydockAllocatorWorker' => 'applications/drydock/allocator/worker',
     'DrydockApacheWebrootBlueprint' => 'applications/drydock/blueprint/webroot/apache',
     'DrydockApacheWebrootInterface' => 'applications/drydock/interface/webroot/apache',
     'DrydockBlueprint' => 'applications/drydock/blueprint/base',
     'DrydockCommandInterface' => 'applications/drydock/interface/command/base',
     'DrydockConstants' => 'applications/drydock/constants/base',
     'DrydockController' => 'applications/drydock/controller/base',
     'DrydockDAO' => 'applications/drydock/storage/base',
     'DrydockEC2HostBlueprint' => 'applications/drydock/blueprint/ec2host',
     'DrydockInterface' => 'applications/drydock/interface/base',
     'DrydockLease' => 'applications/drydock/storage/lease',
     'DrydockLeaseListController' => 'applications/drydock/controller/leaselist',
     'DrydockLeaseStatus' => 'applications/drydock/constants/leasestatus',
     'DrydockLocalCommandInterface' => 'applications/drydock/interface/command/local',
     'DrydockLocalHostBlueprint' => 'applications/drydock/blueprint/localhost',
     'DrydockLog' => 'applications/drydock/storage/log',
     'DrydockLogController' => 'applications/drydock/controller/log',
     'DrydockLogQuery' => 'applications/drydock/query/log',
     'DrydockPhabricatorApplicationBlueprint' => 'applications/drydock/blueprint/application/phabricator',
     'DrydockRemoteHostBlueprint' => 'applications/drydock/blueprint/remotehost',
     'DrydockResource' => 'applications/drydock/storage/resource',
     'DrydockResourceAllocateController' => 'applications/drydock/controller/resourceallocate',
     'DrydockResourceListController' => 'applications/drydock/controller/resourcelist',
     'DrydockResourceStatus' => 'applications/drydock/constants/resourcestatus',
     'DrydockSSHCommandInterface' => 'applications/drydock/interface/command/ssh',
     'DrydockWebrootInterface' => 'applications/drydock/interface/webroot/base',
     'HeraldAction' => 'applications/herald/storage/action',
     'HeraldActionConfig' => 'applications/herald/config/action',
     'HeraldApplyTranscript' => 'applications/herald/storage/transcript/apply',
     'HeraldCommitAdapter' => 'applications/herald/adapter/commit',
     'HeraldCondition' => 'applications/herald/storage/condition',
     'HeraldConditionConfig' => 'applications/herald/config/condition',
     'HeraldConditionTranscript' => 'applications/herald/storage/transcript/condition',
     'HeraldContentTypeConfig' => 'applications/herald/config/contenttype',
     'HeraldController' => 'applications/herald/controller/base',
     'HeraldDAO' => 'applications/herald/storage/base',
     'HeraldDeleteController' => 'applications/herald/controller/delete',
     'HeraldDifferentialRevisionAdapter' => 'applications/herald/adapter/differential',
     'HeraldDryRunAdapter' => 'applications/herald/adapter/dryrun',
     'HeraldEditLogQuery' => 'applications/herald/query/log',
     'HeraldEffect' => 'applications/herald/engine/effect',
     'HeraldEngine' => 'applications/herald/engine/engine',
     'HeraldFieldConfig' => 'applications/herald/config/field',
     'HeraldHomeController' => 'applications/herald/controller/home',
     'HeraldInvalidConditionException' => 'applications/herald/engine/engine/exception',
     'HeraldInvalidFieldException' => 'applications/herald/engine/engine/exception',
     'HeraldNewController' => 'applications/herald/controller/new',
     'HeraldObjectAdapter' => 'applications/herald/adapter/base',
     'HeraldObjectTranscript' => 'applications/herald/storage/transcript/object',
     'HeraldRecursiveConditionsException' => 'applications/herald/engine/engine/exception',
     'HeraldRepetitionPolicyConfig' => 'applications/herald/config/repetitionpolicy',
     'HeraldRule' => 'applications/herald/storage/rule',
     'HeraldRuleController' => 'applications/herald/controller/rule',
     'HeraldRuleEdit' => 'applications/herald/storage/edithistory',
     'HeraldRuleEditHistoryController' => 'applications/herald/controller/edithistory',
     'HeraldRuleEditHistoryView' => 'applications/herald/view/edithistory',
     'HeraldRuleListView' => 'applications/herald/view/rulelist',
     'HeraldRuleQuery' => 'applications/herald/query/rule',
     'HeraldRuleTranscript' => 'applications/herald/storage/transcript/rule',
     'HeraldRuleTypeConfig' => 'applications/herald/config/ruletype',
     'HeraldTestConsoleController' => 'applications/herald/controller/test',
     'HeraldTranscript' => 'applications/herald/storage/transcript/base',
     'HeraldTranscriptController' => 'applications/herald/controller/transcript',
     'HeraldTranscriptListController' => 'applications/herald/controller/transcriptlist',
     'HeraldValueTypeConfig' => 'applications/herald/config/valuetype',
     'Javelin' => 'infrastructure/javelin/api',
     'JavelinReactorExample' => 'applications/uiexample/examples/reactor',
     'JavelinViewExample' => 'applications/uiexample/examples/client',
     'JavelinViewExampleServerView' => 'applications/uiexample/examples/client',
     'LiskDAO' => 'storage/lisk/dao',
     'LiskEphemeralObjectException' => 'storage/lisk/dao',
     'LiskFixtureTestCase' => 'storage/lisk/dao/__tests__',
     'LiskIsolationTestCase' => 'storage/lisk/dao/__tests__',
     'LiskIsolationTestDAO' => 'storage/lisk/dao/__tests__',
     'LiskIsolationTestDAOException' => 'storage/lisk/dao/__tests__',
     'ManiphestAction' => 'applications/maniphest/constants/action',
     'ManiphestAuxiliaryFieldDefaultSpecification' => 'applications/maniphest/auxiliaryfield/default',
     'ManiphestAuxiliaryFieldSpecification' => 'applications/maniphest/auxiliaryfield/base',
     'ManiphestAuxiliaryFieldTypeException' => 'applications/maniphest/auxiliaryfield/typeexception',
     'ManiphestAuxiliaryFieldValidationException' => 'applications/maniphest/auxiliaryfield/validationexception',
     'ManiphestBatchEditController' => 'applications/maniphest/controller/batch',
     'ManiphestConstants' => 'applications/maniphest/constants/base',
     'ManiphestController' => 'applications/maniphest/controller/base',
     'ManiphestDAO' => 'applications/maniphest/storage/base',
     'ManiphestDefaultTaskExtensions' => 'applications/maniphest/extensions/task',
     'ManiphestExportController' => 'applications/maniphest/controller/export',
     'ManiphestReplyHandler' => 'applications/maniphest/replyhandler',
     'ManiphestReportController' => 'applications/maniphest/controller/report',
     'ManiphestSavedQuery' => 'applications/maniphest/storage/savedquery',
     'ManiphestSavedQueryDeleteController' => 'applications/maniphest/controller/savedquerydelete',
     'ManiphestSavedQueryEditController' => 'applications/maniphest/controller/savedqueryedit',
     'ManiphestSavedQueryListController' => 'applications/maniphest/controller/savedquerylist',
     'ManiphestSubpriorityController' => 'applications/maniphest/controller/subpriority',
     'ManiphestTask' => 'applications/maniphest/storage/task',
     'ManiphestTaskAuxiliaryStorage' => 'applications/maniphest/storage/auxiliary',
     'ManiphestTaskDescriptionChangeController' => 'applications/maniphest/controller/descriptionchange',
     'ManiphestTaskDescriptionPreviewController' => 'applications/maniphest/controller/descriptionpreview',
     'ManiphestTaskDetailController' => 'applications/maniphest/controller/taskdetail',
     'ManiphestTaskEditController' => 'applications/maniphest/controller/taskedit',
     'ManiphestTaskExtensions' => 'applications/maniphest/extensions/base',
     'ManiphestTaskListController' => 'applications/maniphest/controller/tasklist',
     'ManiphestTaskListView' => 'applications/maniphest/view/tasklist',
     'ManiphestTaskOwner' => 'applications/maniphest/constants/owner',
     'ManiphestTaskPriority' => 'applications/maniphest/constants/priority',
     'ManiphestTaskProject' => 'applications/maniphest/storage/taskproject',
     'ManiphestTaskProjectsView' => 'applications/maniphest/view/taskprojects',
     'ManiphestTaskQuery' => 'applications/maniphest/query',
     'ManiphestTaskStatus' => 'applications/maniphest/constants/status',
     'ManiphestTaskSubscriber' => 'applications/maniphest/storage/subscriber',
     'ManiphestTaskSummaryView' => 'applications/maniphest/view/tasksummary',
     'ManiphestTransaction' => 'applications/maniphest/storage/transaction',
     'ManiphestTransactionDetailView' => 'applications/maniphest/view/transactiondetail',
     'ManiphestTransactionEditor' => 'applications/maniphest/editor/transaction',
     'ManiphestTransactionListView' => 'applications/maniphest/view/transactionlist',
     'ManiphestTransactionPreviewController' => 'applications/maniphest/controller/transactionpreview',
     'ManiphestTransactionSaveController' => 'applications/maniphest/controller/transactionsave',
     'ManiphestTransactionType' => 'applications/maniphest/constants/transactiontype',
     'ManiphestView' => 'applications/maniphest/view/base',
     'MetaMTAConstants' => 'applications/metamta/constants/base',
     'MetaMTANotificationType' => 'applications/metamta/constants/notificationtype',
     'Phabricator404Controller' => 'applications/base/controller/404',
     'PhabricatorAccessLog' => 'infrastructure/accesslog',
     'PhabricatorAphlictTestPageController' => 'applications/notifications/controller/test',
     'PhabricatorAuditActionConstants' => 'applications/audit/constants/action',
     'PhabricatorAuditAddCommentController' => 'applications/audit/controller/addcomment',
     'PhabricatorAuditComment' => 'applications/audit/storage/auditcomment',
     'PhabricatorAuditCommentEditor' => 'applications/audit/editor/comment',
     'PhabricatorAuditCommitListView' => 'applications/audit/view/commitlist',
     'PhabricatorAuditCommitQuery' => 'applications/audit/query/commit',
     'PhabricatorAuditCommitStatusConstants' => 'applications/audit/constants/commitstatus',
     'PhabricatorAuditController' => 'applications/audit/controller/base',
     'PhabricatorAuditDAO' => 'applications/audit/storage/base',
     'PhabricatorAuditInlineComment' => 'applications/audit/storage/inlinecommment',
     'PhabricatorAuditListController' => 'applications/audit/controller/list',
     'PhabricatorAuditListView' => 'applications/audit/view/list',
     'PhabricatorAuditPreviewController' => 'applications/audit/controller/preview',
     'PhabricatorAuditQuery' => 'applications/audit/query/audit',
     'PhabricatorAuditReplyHandler' => 'applications/audit/replyhandler',
     'PhabricatorAuditStatusConstants' => 'applications/audit/constants/status',
     'PhabricatorAuthController' => 'applications/auth/controller/base',
     'PhabricatorBuiltinPatchList' => 'infrastructure/setup/sql/phabricator',
     'PhabricatorCalendarBrowseController' => 'applications/calendar/controller/browse',
     'PhabricatorCalendarController' => 'applications/calendar/controller/base',
     'PhabricatorCalendarDAO' => 'applications/calendar/storage/base',
     'PhabricatorCalendarHoliday' => 'applications/calendar/storage/holiday',
     'PhabricatorCalendarHolidayTestCase' => 'applications/calendar/storage/holiday/__tests__',
     'PhabricatorChangesetResponse' => 'infrastructure/diff/response',
     'PhabricatorChatLogChannelListController' => 'applications/chatlog/controller/channellist',
     'PhabricatorChatLogChannelLogController' => 'applications/chatlog/controller/channellog',
     'PhabricatorChatLogConstants' => 'applications/chatlog/constants/base',
     'PhabricatorChatLogController' => 'applications/chatlog/controller/base',
     'PhabricatorChatLogDAO' => 'applications/chatlog/storage/base',
     'PhabricatorChatLogEvent' => 'applications/chatlog/storage/event',
     'PhabricatorChatLogEventType' => 'applications/chatlog/constants/eventtype',
     'PhabricatorChatLogQuery' => 'applications/chatlog/query',
     'PhabricatorConduitAPIController' => 'applications/conduit/controller/api',
     'PhabricatorConduitCertificateToken' => 'applications/conduit/storage/token',
     'PhabricatorConduitConnectionLog' => 'applications/conduit/storage/connectionlog',
     'PhabricatorConduitConsoleController' => 'applications/conduit/controller/console',
     'PhabricatorConduitController' => 'applications/conduit/controller/base',
     'PhabricatorConduitDAO' => 'applications/conduit/storage/base',
     'PhabricatorConduitListController' => 'applications/conduit/controller/list',
     'PhabricatorConduitLogController' => 'applications/conduit/controller/log',
     'PhabricatorConduitMethodCallLog' => 'applications/conduit/storage/methodcalllog',
     'PhabricatorConduitTokenController' => 'applications/conduit/controller/token',
     'PhabricatorContentSource' => 'applications/metamta/contentsource/source',
     'PhabricatorContentSourceView' => 'applications/metamta/contentsource/view',
     'PhabricatorController' => 'applications/base/controller/base',
     'PhabricatorCountdownController' => 'applications/countdown/controller/base',
     'PhabricatorCountdownDAO' => 'applications/countdown/storage/base',
     'PhabricatorCountdownDeleteController' => 'applications/countdown/controller/delete',
     'PhabricatorCountdownEditController' => 'applications/countdown/controller/edit',
     'PhabricatorCountdownListController' => 'applications/countdown/controller/list',
     'PhabricatorCountdownViewController' => 'applications/countdown/controller/view',
     'PhabricatorDaemon' => 'infrastructure/daemon/base',
     'PhabricatorDaemonCombinedLogController' => 'applications/daemon/controller/combined',
     'PhabricatorDaemonConsoleController' => 'applications/daemon/controller/console',
     'PhabricatorDaemonControl' => 'infrastructure/daemon/control',
     'PhabricatorDaemonController' => 'applications/daemon/controller/base',
     'PhabricatorDaemonDAO' => 'infrastructure/daemon/storage/base',
     'PhabricatorDaemonLog' => 'infrastructure/daemon/storage/log',
     'PhabricatorDaemonLogEvent' => 'infrastructure/daemon/storage/event',
     'PhabricatorDaemonLogEventsView' => 'applications/daemon/view/daemonlogevents',
     'PhabricatorDaemonLogListController' => 'applications/daemon/controller/loglist',
     'PhabricatorDaemonLogListView' => 'applications/daemon/view/daemonloglist',
     'PhabricatorDaemonLogViewController' => 'applications/daemon/controller/logview',
     'PhabricatorDaemonReference' => 'infrastructure/daemon/control/reference',
     'PhabricatorDaemonTimelineConsoleController' => 'applications/daemon/controller/timeline',
     'PhabricatorDaemonTimelineEventController' => 'applications/daemon/controller/timelineevent',
     'PhabricatorDefaultFileStorageEngineSelector' => 'applications/files/engineselector/default',
     'PhabricatorDefaultSearchEngineSelector' => 'applications/search/selector/default',
     'PhabricatorDifferenceEngine' => 'infrastructure/diff/engine',
     'PhabricatorDirectoryController' => 'applications/directory/controller/base',
     'PhabricatorDirectoryMainController' => 'applications/directory/controller/main',
     'PhabricatorDisabledUserController' => 'applications/auth/controller/disabled',
     'PhabricatorDraft' => 'applications/draft/storage/draft',
     'PhabricatorDraftDAO' => 'applications/draft/storage/base',
     'PhabricatorEdgeConfig' => 'infrastructure/edges/constants/config',
     'PhabricatorEdgeConstants' => 'infrastructure/edges/constants/base',
     'PhabricatorEdgeEditor' => 'infrastructure/edges/editor/edge',
     'PhabricatorEdgeQuery' => 'infrastructure/edges/query/edge',
     'PhabricatorEmailLoginController' => 'applications/auth/controller/email',
     'PhabricatorEmailTokenController' => 'applications/auth/controller/emailtoken',
     'PhabricatorEmailVerificationController' => 'applications/people/controller/emailverification',
     'PhabricatorEnv' => 'infrastructure/env',
     'PhabricatorEnvTestCase' => 'infrastructure/env/__tests__',
     'PhabricatorErrorExample' => 'applications/uiexample/examples/error',
     'PhabricatorEvent' => 'infrastructure/events/event',
     'PhabricatorEventEngine' => 'infrastructure/events/engine',
     'PhabricatorEventType' => 'infrastructure/events/constant/type',
     'PhabricatorFeedBuilder' => 'applications/feed/builder/feed',
     'PhabricatorFeedConstants' => 'applications/feed/constants/base',
     'PhabricatorFeedController' => 'applications/feed/controller/base',
     'PhabricatorFeedDAO' => 'applications/feed/storage/base',
     'PhabricatorFeedPublicStreamController' => 'applications/feed/controller/publicstream',
     'PhabricatorFeedQuery' => 'applications/feed/query',
     'PhabricatorFeedStory' => 'applications/feed/story/base',
     'PhabricatorFeedStoryAudit' => 'applications/feed/story/audit',
     'PhabricatorFeedStoryData' => 'applications/feed/storage/story',
     'PhabricatorFeedStoryDifferential' => 'applications/feed/story/differential',
     'PhabricatorFeedStoryManiphest' => 'applications/feed/story/maniphest',
     'PhabricatorFeedStoryPhriction' => 'applications/feed/story/phriction',
     'PhabricatorFeedStoryProject' => 'applications/feed/story/project',
     'PhabricatorFeedStoryPublisher' => 'applications/feed/publisher',
     'PhabricatorFeedStoryReference' => 'applications/feed/storage/storyreference',
     'PhabricatorFeedStoryStatus' => 'applications/feed/story/status',
     'PhabricatorFeedStoryTypeConstants' => 'applications/feed/constants/story',
     'PhabricatorFeedStoryUnknown' => 'applications/feed/story/unknown',
     'PhabricatorFeedStoryView' => 'applications/feed/view/story',
     'PhabricatorFeedView' => 'applications/feed/view/base',
     'PhabricatorFile' => 'applications/files/storage/file',
     'PhabricatorFileController' => 'applications/files/controller/base',
     'PhabricatorFileDAO' => 'applications/files/storage/base',
     'PhabricatorFileDataController' => 'applications/files/controller/data',
     'PhabricatorFileDeleteController' => 'applications/files/controller/delete',
     'PhabricatorFileDropUploadController' => 'applications/files/controller/dropupload',
     'PhabricatorFileImageMacro' => 'applications/files/storage/imagemacro',
     'PhabricatorFileInfoController' => 'applications/files/controller/info',
     'PhabricatorFileListController' => 'applications/files/controller/list',
     'PhabricatorFileMacroDeleteController' => 'applications/files/controller/macrodelete',
     'PhabricatorFileMacroEditController' => 'applications/files/controller/macroedit',
     'PhabricatorFileMacroListController' => 'applications/files/controller/macrolist',
     'PhabricatorFileProxyController' => 'applications/files/controller/proxy',
     'PhabricatorFileProxyImage' => 'applications/files/storage/proxyimage',
     'PhabricatorFileShortcutController' => 'applications/files/controller/shortcut',
     'PhabricatorFileSideNavView' => 'applications/files/view/sidenav',
     'PhabricatorFileStorageBlob' => 'applications/files/storage/storageblob',
     'PhabricatorFileStorageConfigurationException' => 'applications/files/exception/configuration',
     'PhabricatorFileStorageEngine' => 'applications/files/engine/base',
     'PhabricatorFileStorageEngineSelector' => 'applications/files/engineselector/base',
     'PhabricatorFileTransformController' => 'applications/files/controller/transform',
     'PhabricatorFileUploadController' => 'applications/files/controller/upload',
     'PhabricatorFileUploadException' => 'applications/files/exception/upload',
     'PhabricatorFileUploadView' => 'applications/files/view/upload',
     'PhabricatorFlag' => 'applications/flag/storage/flag',
     'PhabricatorFlagColor' => 'applications/flag/constants/color',
     'PhabricatorFlagConstants' => 'applications/flag/constants/base',
     'PhabricatorFlagController' => 'applications/flag/controller/base',
     'PhabricatorFlagDAO' => 'applications/flag/storage/base',
     'PhabricatorFlagDeleteController' => 'applications/flag/controller/delete',
     'PhabricatorFlagEditController' => 'applications/flag/controller/edit',
     'PhabricatorFlagListController' => 'applications/flag/controller/list',
     'PhabricatorFlagListView' => 'applications/flag/view/list',
     'PhabricatorFlagQuery' => 'applications/flag/query/flag',
     'PhabricatorFormExample' => 'applications/uiexample/examples/form',
     'PhabricatorGarbageCollectorDaemon' => 'infrastructure/daemon/garbagecollector',
     'PhabricatorGoodForNothingWorker' => 'infrastructure/daemon/workers/worker/goodfornothing',
     'PhabricatorHandleObjectSelectorDataView' => 'applications/phid/handle/view/selector',
     'PhabricatorHash' => 'infrastructure/util/hash',
     'PhabricatorHelpController' => 'applications/help/controller/base',
     'PhabricatorHelpKeyboardShortcutController' => 'applications/help/controller/keyboardshortcut',
     'PhabricatorIDPagedPolicyQuery' => 'infrastructure/query/policy/idpaged',
     'PhabricatorIRCBot' => 'infrastructure/daemon/irc/bot',
     'PhabricatorIRCDifferentialNotificationHandler' => 'infrastructure/daemon/irc/handler/differentialnotification',
     'PhabricatorIRCHandler' => 'infrastructure/daemon/irc/handler/base',
     'PhabricatorIRCLogHandler' => 'infrastructure/daemon/irc/handler/log',
     'PhabricatorIRCMacroHandler' => 'infrastructure/daemon/irc/handler/macro',
     'PhabricatorIRCMessage' => 'infrastructure/daemon/irc/message',
     'PhabricatorIRCObjectNameHandler' => 'infrastructure/daemon/irc/handler/objectname',
     'PhabricatorIRCProtocolHandler' => 'infrastructure/daemon/irc/handler/protocol',
     'PhabricatorIRCWhatsNewHandler' => 'infrastructure/daemon/irc/handler/whatsnew',
     'PhabricatorImageTransformer' => 'applications/files/transform',
     'PhabricatorInfrastructureTestCase' => 'infrastructure/__tests__',
     'PhabricatorInlineCommentController' => 'infrastructure/diff/controller',
     'PhabricatorInlineCommentInterface' => 'infrastructure/diff/interface/inline',
     'PhabricatorInlineSummaryView' => 'infrastructure/diff/view/inline',
     'PhabricatorJavelinLinter' => 'infrastructure/lint/linter/javelin',
     'PhabricatorJumpNavHandler' => 'applications/search/engine/jumpnav',
     'PhabricatorLintEngine' => 'infrastructure/lint/engine',
     'PhabricatorLiskDAO' => 'applications/base/storage/lisk',
     'PhabricatorLocalDiskFileStorageEngine' => 'applications/files/engine/localdisk',
     'PhabricatorLocalTimeTestCase' => 'view/utils/__tests__',
     'PhabricatorLoginController' => 'applications/auth/controller/login',
     'PhabricatorLoginValidateController' => 'applications/auth/controller/validate',
     'PhabricatorLogoutController' => 'applications/auth/controller/logout',
     'PhabricatorMailImplementationAdapter' => 'applications/metamta/adapter/base',
     'PhabricatorMailImplementationAmazonSESAdapter' => 'applications/metamta/adapter/amazonses',
     'PhabricatorMailImplementationPHPMailerLiteAdapter' => 'applications/metamta/adapter/phpmailerlite',
     'PhabricatorMailImplementationSendGridAdapter' => 'applications/metamta/adapter/sendgrid',
     'PhabricatorMailImplementationTestAdapter' => 'applications/metamta/adapter/test',
     'PhabricatorMailReplyHandler' => 'applications/metamta/replyhandler/base',
     'PhabricatorMarkupEngine' => 'applications/markup/engine',
     'PhabricatorMetaMTAAttachment' => 'applications/metamta/storage/mail',
     'PhabricatorMetaMTAController' => 'applications/metamta/controller/base',
     'PhabricatorMetaMTADAO' => 'applications/metamta/storage/base',
     'PhabricatorMetaMTAEmailBodyParser' => 'applications/metamta/parser',
     'PhabricatorMetaMTAEmailBodyParserTestCase' => 'applications/metamta/parser/__tests__',
     'PhabricatorMetaMTAListController' => 'applications/metamta/controller/list',
     'PhabricatorMetaMTAMail' => 'applications/metamta/storage/mail',
     'PhabricatorMetaMTAMailTestCase' => 'applications/metamta/storage/mail/__tests__',
     'PhabricatorMetaMTAMailingList' => 'applications/metamta/storage/mailinglist',
     'PhabricatorMetaMTAMailingListEditController' => 'applications/metamta/controller/mailinglistedit',
     'PhabricatorMetaMTAMailingListsController' => 'applications/metamta/controller/mailinglists',
     'PhabricatorMetaMTAReceiveController' => 'applications/metamta/controller/receive',
     'PhabricatorMetaMTAReceivedListController' => 'applications/metamta/controller/receivedlist',
     'PhabricatorMetaMTAReceivedMail' => 'applications/metamta/storage/receivedmail',
     'PhabricatorMetaMTASendController' => 'applications/metamta/controller/send',
     'PhabricatorMetaMTASendGridReceiveController' => 'applications/metamta/controller/sendgridreceive',
     'PhabricatorMetaMTAViewController' => 'applications/metamta/controller/view',
     'PhabricatorMetaMTAWorker' => 'applications/metamta/worker',
     'PhabricatorMySQLFileStorageEngine' => 'applications/files/engine/mysql',
     'PhabricatorNotificationsController' => 'applications/notifications/controller/base',
     'PhabricatorOAuthClientAuthorization' => 'applications/oauthserver/storage/clientauthorization',
     'PhabricatorOAuthClientAuthorizationBaseController' => 'applications/oauthserver/controller/clientauthorization/base',
     'PhabricatorOAuthClientAuthorizationDeleteController' => 'applications/oauthserver/controller/clientauthorization/delete',
     'PhabricatorOAuthClientAuthorizationEditController' => 'applications/oauthserver/controller/clientauthorization/edit',
     'PhabricatorOAuthClientAuthorizationListController' => 'applications/oauthserver/controller/clientauthorization/list',
     'PhabricatorOAuthClientAuthorizationQuery' => 'applications/oauthserver/query/clientauthorization',
     'PhabricatorOAuthClientBaseController' => 'applications/oauthserver/controller/client/base',
     'PhabricatorOAuthClientDeleteController' => 'applications/oauthserver/controller/client/delete',
     'PhabricatorOAuthClientEditController' => 'applications/oauthserver/controller/client/edit',
     'PhabricatorOAuthClientListController' => 'applications/oauthserver/controller/client/list',
     'PhabricatorOAuthClientViewController' => 'applications/oauthserver/controller/client/view',
     'PhabricatorOAuthDefaultRegistrationController' => 'applications/auth/controller/oauthregistration/default',
     'PhabricatorOAuthDiagnosticsController' => 'applications/auth/controller/oauthdiagnostics',
     'PhabricatorOAuthFailureView' => 'applications/auth/view/oauthfailure',
     'PhabricatorOAuthLoginController' => 'applications/auth/controller/oauth',
     'PhabricatorOAuthProvider' => 'applications/auth/oauth/provider/base',
     'PhabricatorOAuthProviderDisqus' => 'applications/auth/oauth/provider/disqus',
     'PhabricatorOAuthProviderException' => 'applications/auth/oauth/provider/exception',
     'PhabricatorOAuthProviderFacebook' => 'applications/auth/oauth/provider/facebook',
     'PhabricatorOAuthProviderGitHub' => 'applications/auth/oauth/provider/github',
     'PhabricatorOAuthProviderGoogle' => 'applications/auth/oauth/provider/google',
     'PhabricatorOAuthProviderPhabricator' => 'applications/auth/oauth/provider/phabricator',
     'PhabricatorOAuthRegistrationController' => 'applications/auth/controller/oauthregistration/base',
     'PhabricatorOAuthResponse' => 'applications/oauthserver/response',
     'PhabricatorOAuthServer' => 'applications/oauthserver/server',
     'PhabricatorOAuthServerAccessToken' => 'applications/oauthserver/storage/accesstoken',
     'PhabricatorOAuthServerAuthController' => 'applications/oauthserver/controller/auth',
     'PhabricatorOAuthServerAuthorizationCode' => 'applications/oauthserver/storage/authorizationcode',
     'PhabricatorOAuthServerClient' => 'applications/oauthserver/storage/client',
     'PhabricatorOAuthServerClientQuery' => 'applications/oauthserver/query/client',
     'PhabricatorOAuthServerController' => 'applications/oauthserver/controller/base',
     'PhabricatorOAuthServerDAO' => 'applications/oauthserver/storage/base',
     'PhabricatorOAuthServerScope' => 'applications/oauthserver/scope',
     'PhabricatorOAuthServerTestCase' => 'applications/oauthserver/server/__tests__',
     'PhabricatorOAuthServerTestController' => 'applications/oauthserver/controller/test',
     'PhabricatorOAuthServerTokenController' => 'applications/oauthserver/controller/token',
     'PhabricatorOAuthUnlinkController' => 'applications/auth/controller/unlink',
     'PhabricatorObjectAttachmentEditor' => 'applications/search/editor/attach',
     'PhabricatorObjectGraph' => 'applications/phid/graph',
     'PhabricatorObjectHandle' => 'applications/phid/handle',
     'PhabricatorObjectHandleConstants' => 'applications/phid/handle/const/base',
     'PhabricatorObjectHandleData' => 'applications/phid/handle/data',
     'PhabricatorObjectHandleStatus' => 'applications/phid/handle/const/status',
     'PhabricatorObjectSelectorDialog' => 'view/control/objectselector',
     'PhabricatorOffsetPagedQuery' => 'infrastructure/query/offsetpaged',
     'PhabricatorOwnerPathQuery' => 'applications/owners/query/path',
     'PhabricatorOwnersController' => 'applications/owners/controller/base',
     'PhabricatorOwnersDAO' => 'applications/owners/storage/base',
     'PhabricatorOwnersDeleteController' => 'applications/owners/controller/delete',
     'PhabricatorOwnersDetailController' => 'applications/owners/controller/detail',
     'PhabricatorOwnersEditController' => 'applications/owners/controller/edit',
     'PhabricatorOwnersListController' => 'applications/owners/controller/list',
     'PhabricatorOwnersOwner' => 'applications/owners/storage/owner',
     'PhabricatorOwnersPackage' => 'applications/owners/storage/package',
     'PhabricatorOwnersPath' => 'applications/owners/storage/path',
     'PhabricatorPHID' => 'applications/phid/storage/phid',
     'PhabricatorPHIDConstants' => 'applications/phid/constants',
     'PhabricatorPHIDController' => 'applications/phid/controller/base',
     'PhabricatorPHIDDAO' => 'applications/phid/storage/base',
     'PhabricatorPHIDLookupController' => 'applications/phid/controller/lookup',
     'PhabricatorPaste' => 'applications/paste/storage/paste',
     'PhabricatorPasteController' => 'applications/paste/controller/base',
     'PhabricatorPasteDAO' => 'applications/paste/storage/base',
     'PhabricatorPasteListController' => 'applications/paste/controller/list',
     'PhabricatorPasteQuery' => 'applications/paste/query/paste',
     'PhabricatorPasteViewController' => 'applications/paste/controller/view',
     'PhabricatorPeopleController' => 'applications/people/controller/base',
     'PhabricatorPeopleEditController' => 'applications/people/controller/edit',
     'PhabricatorPeopleListController' => 'applications/people/controller/list',
     'PhabricatorPeopleLogsController' => 'applications/people/controller/logs',
     'PhabricatorPeopleProfileController' => 'applications/people/controller/profile',
     'PhabricatorPeopleQuery' => 'applications/people/query',
     'PhabricatorPolicies' => 'applications/policy/constants/policy',
     'PhabricatorPolicyCapability' => 'applications/policy/constants/capability',
     'PhabricatorPolicyConstants' => 'applications/policy/constants/base',
     'PhabricatorPolicyException' => 'applications/policy/exception/base',
     'PhabricatorPolicyFilter' => 'applications/policy/filter/policy',
     'PhabricatorPolicyInterface' => 'applications/policy/interface/policy',
     'PhabricatorPolicyQuery' => 'infrastructure/query/policy/base',
     'PhabricatorPolicyTestCase' => 'applications/policy/__tests__',
     'PhabricatorPolicyTestObject' => 'applications/policy/__tests__',
     'PhabricatorPolicyTestQuery' => 'applications/policy/__tests__',
     'PhabricatorProfileHeaderView' => 'view/layout/profileheader',
     'PhabricatorProject' => 'applications/project/storage/project',
     'PhabricatorProjectAffiliation' => 'applications/project/storage/affiliation',
     'PhabricatorProjectConstants' => 'applications/project/constants/base',
     'PhabricatorProjectController' => 'applications/project/controller/base',
     'PhabricatorProjectCreateController' => 'applications/project/controller/create',
     'PhabricatorProjectDAO' => 'applications/project/storage/base',
     'PhabricatorProjectEditor' => 'applications/project/editor/project',
     'PhabricatorProjectListController' => 'applications/project/controller/list',
     'PhabricatorProjectNameCollisionException' => 'applications/project/exception/namecollison',
     'PhabricatorProjectProfile' => 'applications/project/storage/profile',
     'PhabricatorProjectProfileController' => 'applications/project/controller/profile',
     'PhabricatorProjectProfileEditController' => 'applications/project/controller/profileedit',
     'PhabricatorProjectQuery' => 'applications/project/query/project',
     'PhabricatorProjectStatus' => 'applications/project/constants/status',
     'PhabricatorProjectSubproject' => 'applications/project/storage/subproject',
     'PhabricatorProjectTransaction' => 'applications/project/storage/transaction',
     'PhabricatorProjectTransactionType' => 'applications/project/constants/transaction',
     'PhabricatorProjectUpdateController' => 'applications/project/controller/update',
     'PhabricatorQuery' => 'infrastructure/query/base',
     'PhabricatorRedirectController' => 'applications/base/controller/redirect',
     'PhabricatorRefreshCSRFController' => 'applications/auth/controller/refresh',
     'PhabricatorRemarkupRuleDifferential' => 'infrastructure/markup/remarkup/markuprule/differential',
     'PhabricatorRemarkupRuleDifferentialHandle' => 'infrastructure/markup/remarkup/markuprule/handle/differential',
     'PhabricatorRemarkupRuleDiffusion' => 'infrastructure/markup/remarkup/markuprule/diffusion',
     'PhabricatorRemarkupRuleEmbedFile' => 'infrastructure/markup/remarkup/markuprule/embedobject',
     'PhabricatorRemarkupRuleImageMacro' => 'infrastructure/markup/remarkup/markuprule/imagemacro',
     'PhabricatorRemarkupRuleManiphest' => 'infrastructure/markup/remarkup/markuprule/maniphest',
     'PhabricatorRemarkupRuleManiphestHandle' => 'infrastructure/markup/remarkup/markuprule/handle/maniphest',
     'PhabricatorRemarkupRuleMention' => 'infrastructure/markup/remarkup/markuprule/mention',
     'PhabricatorRemarkupRuleObjectHandle' => 'infrastructure/markup/remarkup/markuprule/handle',
     'PhabricatorRemarkupRuleObjectName' => 'infrastructure/markup/remarkup/markuprule/objectname',
     'PhabricatorRemarkupRulePaste' => 'infrastructure/markup/remarkup/markuprule/paste',
     'PhabricatorRemarkupRulePhriction' => 'infrastructure/markup/remarkup/markuprule/phriction',
     'PhabricatorRemarkupRuleProxyImage' => 'infrastructure/markup/remarkup/markuprule/proxyimage',
     'PhabricatorRemarkupRuleYoutube' => 'infrastructure/markup/remarkup/markuprule/youtube',
     'PhabricatorRepository' => 'applications/repository/storage/repository',
     'PhabricatorRepositoryArcanistProject' => 'applications/repository/storage/arcanistproject',
     'PhabricatorRepositoryArcanistProjectEditController' => 'applications/repository/controller/arcansistprojectedit',
     'PhabricatorRepositoryAuditRequest' => 'applications/repository/storage/auditrequest',
     'PhabricatorRepositoryCommit' => 'applications/repository/storage/commit',
     'PhabricatorRepositoryCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/base',
     'PhabricatorRepositoryCommitData' => 'applications/repository/storage/commitdata',
-    'PhabricatorRepositoryCommitDiscoveryDaemon' => 'applications/repository/daemon/commitdiscovery/base',
     'PhabricatorRepositoryCommitHeraldWorker' => 'applications/repository/worker/herald',
     'PhabricatorRepositoryCommitMessageDetailParser' => 'applications/repository/parser/base',
     'PhabricatorRepositoryCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/base',
     'PhabricatorRepositoryCommitOwnersWorker' => 'applications/repository/worker/owner',
     'PhabricatorRepositoryCommitParserWorker' => 'applications/repository/worker/base',
     'PhabricatorRepositoryCommitTaskDaemon' => 'applications/repository/daemon/committask',
     'PhabricatorRepositoryController' => 'applications/repository/controller/base',
     'PhabricatorRepositoryCreateController' => 'applications/repository/controller/create',
     'PhabricatorRepositoryDAO' => 'applications/repository/storage/base',
-    'PhabricatorRepositoryDaemon' => 'applications/repository/daemon/base',
     'PhabricatorRepositoryDefaultCommitMessageDetailParser' => 'applications/repository/parser/default',
     'PhabricatorRepositoryDeleteController' => 'applications/repository/controller/delete',
     'PhabricatorRepositoryEditController' => 'applications/repository/controller/edit',
     'PhabricatorRepositoryGitCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/git',
-    'PhabricatorRepositoryGitCommitDiscoveryDaemon' => 'applications/repository/daemon/commitdiscovery/git',
-    'PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase' => 'applications/repository/daemon/commitdiscovery/git/__tests__',
     'PhabricatorRepositoryGitCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/git',
     'PhabricatorRepositoryListController' => 'applications/repository/controller/list',
     'PhabricatorRepositoryMercurialCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/mercurial',
-    'PhabricatorRepositoryMercurialCommitDiscoveryDaemon' => 'applications/repository/daemon/commitdiscovery/mercurial',
     'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/mercurial',
     'PhabricatorRepositoryPullLocalDaemon' => 'applications/repository/daemon/pulllocal',
+    'PhabricatorRepositoryPullLocalDaemonTestCase' => 'applications/repository/daemon/pulllocal/__tests__',
     'PhabricatorRepositoryShortcut' => 'applications/repository/storage/shortcut',
     'PhabricatorRepositorySvnCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/svn',
-    'PhabricatorRepositorySvnCommitDiscoveryDaemon' => 'applications/repository/daemon/commitdiscovery/svn',
     'PhabricatorRepositorySvnCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/svn',
     'PhabricatorRepositorySymbol' => 'applications/repository/storage/symbol',
     'PhabricatorRepositoryTestCase' => 'applications/repository/storage/repository/__tests__',
     'PhabricatorRepositoryType' => 'applications/repository/constants/repositorytype',
     'PhabricatorS3FileStorageEngine' => 'applications/files/engine/s3',
     'PhabricatorSQLPatchList' => 'infrastructure/setup/sql/base',
     'PhabricatorScopedEnv' => 'infrastructure/env',
     'PhabricatorSearchAbstractDocument' => 'applications/search/index/abstractdocument',
     'PhabricatorSearchAttachController' => 'applications/search/controller/attach',
     'PhabricatorSearchBaseController' => 'applications/search/controller/base',
     'PhabricatorSearchCommitIndexer' => 'applications/search/index/indexer/repository',
     'PhabricatorSearchController' => 'applications/search/controller/search',
     'PhabricatorSearchDAO' => 'applications/search/storage/base',
     'PhabricatorSearchDifferentialIndexer' => 'applications/search/index/indexer/differential',
     'PhabricatorSearchDocument' => 'applications/search/storage/document/document',
     'PhabricatorSearchDocumentField' => 'applications/search/storage/document/field',
     'PhabricatorSearchDocumentIndexer' => 'applications/search/index/indexer/base',
     'PhabricatorSearchDocumentRelationship' => 'applications/search/storage/document/relationship',
     'PhabricatorSearchEngine' => 'applications/search/engine/base',
     'PhabricatorSearchEngineElastic' => 'applications/search/engine/elastic',
     'PhabricatorSearchEngineMySQL' => 'applications/search/engine/mysql',
     'PhabricatorSearchEngineSelector' => 'applications/search/selector/base',
     'PhabricatorSearchField' => 'applications/search/constants/field',
     'PhabricatorSearchIndexController' => 'applications/search/controller/index',
     'PhabricatorSearchManiphestIndexer' => 'applications/search/index/indexer/maniphest',
     'PhabricatorSearchPhrictionIndexer' => 'applications/search/index/indexer/phriction',
     'PhabricatorSearchQuery' => 'applications/search/storage/query',
     'PhabricatorSearchRelationship' => 'applications/search/constants/relationship',
     'PhabricatorSearchResultView' => 'applications/search/view/searchresult',
     'PhabricatorSearchScope' => 'applications/search/constants/scope',
     'PhabricatorSearchSelectController' => 'applications/search/controller/select',
     'PhabricatorSearchUserIndexer' => 'applications/search/index/indexer/user',
     'PhabricatorSetup' => 'infrastructure/setup',
     'PhabricatorSlowvoteChoice' => 'applications/slowvote/storage/choice',
     'PhabricatorSlowvoteComment' => 'applications/slowvote/storage/comment',
     'PhabricatorSlowvoteController' => 'applications/slowvote/controller/base',
     'PhabricatorSlowvoteCreateController' => 'applications/slowvote/controller/create',
     'PhabricatorSlowvoteDAO' => 'applications/slowvote/storage/base',
     'PhabricatorSlowvoteListController' => 'applications/slowvote/controller/list',
     'PhabricatorSlowvoteOption' => 'applications/slowvote/storage/option',
     'PhabricatorSlowvotePoll' => 'applications/slowvote/storage/poll',
     'PhabricatorSlowvotePollController' => 'applications/slowvote/controller/poll',
     'PhabricatorSlug' => 'infrastructure/util/slug',
     'PhabricatorSlugTestCase' => 'infrastructure/util/slug/__tests__',
     'PhabricatorSortTableExample' => 'applications/uiexample/examples/sorttable',
     'PhabricatorStandardPageView' => 'view/page/standard',
     'PhabricatorStatusController' => 'applications/status/base',
     'PhabricatorStorageFixtureScopeGuard' => 'infrastructure/testing/fixture/storage',
     'PhabricatorStorageManagementAPI' => 'infrastructure/setup/storage/management',
     'PhabricatorStorageManagementDatabasesWorkflow' => 'infrastructure/setup/storage/workflow/databases',
     'PhabricatorStorageManagementDestroyWorkflow' => 'infrastructure/setup/storage/workflow/destroy',
     'PhabricatorStorageManagementDumpWorkflow' => 'infrastructure/setup/storage/workflow/dump',
     'PhabricatorStorageManagementStatusWorkflow' => 'infrastructure/setup/storage/workflow/status',
     'PhabricatorStorageManagementUpgradeWorkflow' => 'infrastructure/setup/storage/workflow/upgrade',
     'PhabricatorStorageManagementWorkflow' => 'infrastructure/setup/storage/workflow/base',
     'PhabricatorStoragePatch' => 'infrastructure/setup/storage/patch',
     'PhabricatorSymbolNameLinter' => 'infrastructure/lint/hook/xhpastsymbolname',
     'PhabricatorSyntaxHighlighter' => 'applications/markup/syntax',
     'PhabricatorTaskmasterDaemon' => 'infrastructure/daemon/workers/taskmaster',
     'PhabricatorTestCase' => 'infrastructure/testing/testcase',
     'PhabricatorTimelineCursor' => 'infrastructure/daemon/timeline/storage/cursor',
     'PhabricatorTimelineDAO' => 'infrastructure/daemon/timeline/storage/base',
     'PhabricatorTimelineEvent' => 'infrastructure/daemon/timeline/storage/event',
     'PhabricatorTimelineEventData' => 'infrastructure/daemon/timeline/storage/eventdata',
     'PhabricatorTimelineIterator' => 'infrastructure/daemon/timeline/cursor/iterator',
     'PhabricatorTimer' => 'applications/countdown/storage/timer',
     'PhabricatorTransactionView' => 'view/layout/transaction',
     'PhabricatorTransformedFile' => 'applications/files/storage/transformed',
     'PhabricatorTrivialTestCase' => 'infrastructure/testing/testcase/__tests__',
     'PhabricatorTypeaheadCommonDatasourceController' => 'applications/typeahead/controller/common',
     'PhabricatorTypeaheadDatasourceController' => 'applications/typeahead/controller/base',
     'PhabricatorUIExample' => 'applications/uiexample/examples/base',
     'PhabricatorUIExampleController' => 'applications/uiexample/controller/base',
     'PhabricatorUIExampleRenderController' => 'applications/uiexample/controller/render',
     'PhabricatorUIListFilterExample' => 'applications/uiexample/examples/listfilter',
     'PhabricatorUIPagerExample' => 'applications/uiexample/examples/pager',
     'PhabricatorUITooltipExample' => 'applications/uiexample/examples/tooltip',
     'PhabricatorUnitsTestCase' => 'view/utils/__tests__',
     'PhabricatorUser' => 'applications/people/storage/user',
     'PhabricatorUserAccountSettingsPanelController' => 'applications/people/controller/settings/panels/account',
     'PhabricatorUserConduitSettingsPanelController' => 'applications/people/controller/settings/panels/conduit',
     'PhabricatorUserDAO' => 'applications/people/storage/base',
     'PhabricatorUserEmail' => 'applications/people/storage/email',
     'PhabricatorUserEmailPreferenceSettingsPanelController' => 'applications/people/controller/settings/panels/emailpref',
     'PhabricatorUserEmailSettingsPanelController' => 'applications/people/controller/settings/panels/email',
     'PhabricatorUserLog' => 'applications/people/storage/log',
     'PhabricatorUserOAuthInfo' => 'applications/people/storage/useroauthinfo',
     'PhabricatorUserOAuthSettingsPanelController' => 'applications/people/controller/settings/panels/oauth',
     'PhabricatorUserPasswordSettingsPanelController' => 'applications/people/controller/settings/panels/password',
     'PhabricatorUserPreferenceSettingsPanelController' => 'applications/people/controller/settings/panels/preferences',
     'PhabricatorUserPreferences' => 'applications/people/storage/preferences',
     'PhabricatorUserProfile' => 'applications/people/storage/profile',
     'PhabricatorUserProfileSettingsPanelController' => 'applications/people/controller/settings/panels/profile',
     'PhabricatorUserSSHKey' => 'applications/people/storage/usersshkey',
     'PhabricatorUserSSHKeysSettingsPanelController' => 'applications/people/controller/settings/panels/sshkeys',
     'PhabricatorUserSearchSettingsPanelController' => 'applications/people/controller/settings/panels/search',
     'PhabricatorUserSettingsController' => 'applications/people/controller/settings',
     'PhabricatorUserSettingsPanelController' => 'applications/people/controller/settings/panels/base',
     'PhabricatorUserStatus' => 'applications/people/storage/userstatus',
     'PhabricatorUserTestCase' => 'applications/people/storage/user/__tests__',
     'PhabricatorWorker' => 'infrastructure/daemon/workers/worker',
     'PhabricatorWorkerDAO' => 'infrastructure/daemon/workers/storage/base',
     'PhabricatorWorkerTask' => 'infrastructure/daemon/workers/storage/task',
     'PhabricatorWorkerTaskData' => 'infrastructure/daemon/workers/storage/taskdata',
     'PhabricatorWorkerTaskDetailController' => 'applications/daemon/controller/workertaskdetail',
     'PhabricatorWorkerTaskUpdateController' => 'applications/daemon/controller/workertaskupdate',
     'PhabricatorXHPASTViewController' => 'applications/xhpastview/controller/base',
     'PhabricatorXHPASTViewDAO' => 'applications/xhpastview/storage/base',
     'PhabricatorXHPASTViewFrameController' => 'applications/xhpastview/controller/viewframe',
     'PhabricatorXHPASTViewFramesetController' => 'applications/xhpastview/controller/viewframeset',
     'PhabricatorXHPASTViewInputController' => 'applications/xhpastview/controller/viewinput',
     'PhabricatorXHPASTViewPanelController' => 'applications/xhpastview/controller/viewpanel',
     'PhabricatorXHPASTViewParseTree' => 'applications/xhpastview/storage/parsetree',
     'PhabricatorXHPASTViewRunController' => 'applications/xhpastview/controller/run',
     'PhabricatorXHPASTViewStreamController' => 'applications/xhpastview/controller/viewstream',
     'PhabricatorXHPASTViewTreeController' => 'applications/xhpastview/controller/viewtree',
     'PhabricatorXHProfController' => 'applications/xhprof/controller/base',
     'PhabricatorXHProfProfileController' => 'applications/xhprof/controller/profile',
     'PhabricatorXHProfProfileSymbolView' => 'applications/xhprof/view/symbol',
     'PhabricatorXHProfProfileTopLevelView' => 'applications/xhprof/view/toplevel',
     'PhabricatorXHProfProfileView' => 'applications/xhprof/view/base',
     'PhameController' => 'applications/phame/controller/base',
     'PhameDAO' => 'applications/phame/storage/base',
     'PhameDraftListController' => 'applications/phame/controller/post/list/drafts',
     'PhamePost' => 'applications/phame/storage/post',
     'PhamePostDeleteController' => 'applications/phame/controller/post/delete',
     'PhamePostDetailView' => 'applications/phame/view/postdetail',
     'PhamePostEditController' => 'applications/phame/controller/post/edit',
     'PhamePostListBaseController' => 'applications/phame/controller/post/list/base',
     'PhamePostListController' => 'applications/phame/controller/post/list/posts',
     'PhamePostListView' => 'applications/phame/view/postlist',
     'PhamePostPreviewController' => 'applications/phame/controller/post/preview',
     'PhamePostQuery' => 'applications/phame/query/post',
     'PhamePostViewController' => 'applications/phame/controller/post/view',
     'PhortuneMonthYearExpiryControl' => 'applications/phortune/control/monthyearexpiry',
     'PhortuneStripeBaseController' => 'applications/phortune/stripe/controller/base',
     'PhortuneStripePaymentFormView' => 'applications/phortune/stripe/view/paymentform',
     'PhortuneStripeTestPaymentFormController' => 'applications/phortune/stripe/controller/testpaymentform',
     'PhrictionActionConstants' => 'applications/phriction/constants/action',
     'PhrictionChangeType' => 'applications/phriction/constants/changetype',
     'PhrictionConstants' => 'applications/phriction/constants/base',
     'PhrictionContent' => 'applications/phriction/storage/content',
     'PhrictionController' => 'applications/phriction/controller/base',
     'PhrictionDAO' => 'applications/phriction/storage/base',
     'PhrictionDeleteController' => 'applications/phriction/controller/delete',
     'PhrictionDiffController' => 'applications/phriction/controller/diff',
     'PhrictionDocument' => 'applications/phriction/storage/document',
     'PhrictionDocumentController' => 'applications/phriction/controller/document',
     'PhrictionDocumentEditor' => 'applications/phriction/editor/document',
     'PhrictionDocumentPreviewController' => 'applications/phriction/controller/documentpreview',
     'PhrictionDocumentStatus' => 'applications/phriction/constants/documentstatus',
     'PhrictionDocumentTestCase' => 'applications/phriction/storage/document/__tests__',
     'PhrictionEditController' => 'applications/phriction/controller/edit',
     'PhrictionHistoryController' => 'applications/phriction/controller/history',
     'PhrictionListController' => 'applications/phriction/controller/list',
     'QueryFormattingTestCase' => 'storage/qsprintf/__tests__',
   ),
   'function' =>
   array(
     '_phabricator_date_format' => 'view/utils',
     '_qsprintf_check_scalar_type' => 'storage/qsprintf',
     '_qsprintf_check_type' => 'storage/qsprintf',
     'celerity_generate_unique_node_id' => 'infrastructure/celerity/api',
     'celerity_get_resource_uri' => 'infrastructure/celerity/api',
     'celerity_register_resource_map' => 'infrastructure/celerity/map',
     'javelin_render_tag' => 'infrastructure/javelin/markup',
     'phabricator_date' => 'view/utils',
     'phabricator_datetime' => 'view/utils',
     'phabricator_format_bytes' => 'view/utils',
     'phabricator_format_local_time' => 'view/utils',
     'phabricator_format_relative_time' => 'view/utils',
     'phabricator_format_units_generic' => 'view/utils',
     'phabricator_on_relative_date' => 'view/utils',
     'phabricator_parse_bytes' => 'view/utils',
     'phabricator_relative_date' => 'view/utils',
     'phabricator_render_form' => 'infrastructure/javelin/markup',
     'phabricator_time' => 'view/utils',
     'phid_get_type' => 'applications/phid/utils',
     'phid_group_by_type' => 'applications/phid/utils',
     'qsprintf' => 'storage/qsprintf',
     'queryfx' => 'storage/queryfx',
     'queryfx_all' => 'storage/queryfx',
     'queryfx_one' => 'storage/queryfx',
     'require_celerity_resource' => 'infrastructure/celerity/api',
     'vqsprintf' => 'storage/qsprintf',
     'vqueryfx' => 'storage/queryfx',
     'vqueryfx_all' => 'storage/queryfx',
     'xsprintf_query' => 'storage/qsprintf',
   ),
   'requires_class' =>
   array(
     'Aphront304Response' => 'AphrontResponse',
     'Aphront400Response' => 'AphrontResponse',
     'Aphront403Response' => 'AphrontWebpageResponse',
     'Aphront404Response' => 'AphrontWebpageResponse',
     'AphrontAjaxResponse' => 'AphrontResponse',
     'AphrontAttachedFileView' => 'AphrontView',
     'AphrontCSRFException' => 'AphrontException',
     'AphrontCalendarMonthView' => 'AphrontView',
     'AphrontContextBarView' => 'AphrontView',
     'AphrontCrumbsView' => 'AphrontView',
     'AphrontDefaultApplicationConfiguration' => 'AphrontApplicationConfiguration',
     'AphrontDialogResponse' => 'AphrontResponse',
     'AphrontDialogView' => 'AphrontView',
     'AphrontErrorView' => 'AphrontView',
     'AphrontFilePreviewView' => 'AphrontView',
     'AphrontFileResponse' => 'AphrontResponse',
     'AphrontFormCheckboxControl' => 'AphrontFormControl',
     'AphrontFormControl' => 'AphrontView',
     'AphrontFormDateControl' => 'AphrontFormControl',
     'AphrontFormDividerControl' => 'AphrontFormControl',
     'AphrontFormDragAndDropUploadControl' => 'AphrontFormControl',
     'AphrontFormFileControl' => 'AphrontFormControl',
     'AphrontFormInsetView' => 'AphrontView',
     'AphrontFormLayoutView' => 'AphrontView',
     'AphrontFormMarkupControl' => 'AphrontFormControl',
     'AphrontFormPasswordControl' => 'AphrontFormControl',
     'AphrontFormPolicyControl' => 'AphrontFormControl',
     'AphrontFormRadioButtonControl' => 'AphrontFormControl',
     'AphrontFormRecaptchaControl' => 'AphrontFormControl',
     'AphrontFormSelectControl' => 'AphrontFormControl',
     'AphrontFormStaticControl' => 'AphrontFormControl',
     'AphrontFormSubmitControl' => 'AphrontFormControl',
     'AphrontFormTextAreaControl' => 'AphrontFormControl',
     'AphrontFormTextControl' => 'AphrontFormControl',
     'AphrontFormToggleButtonsControl' => 'AphrontFormControl',
     'AphrontFormTokenizerControl' => 'AphrontFormControl',
     'AphrontFormView' => 'AphrontView',
     'AphrontHTTPSinkTestCase' => 'PhabricatorTestCase',
     'AphrontHeadsupActionListView' => 'AphrontView',
     'AphrontHeadsupActionView' => 'AphrontView',
     'AphrontHeadsupView' => 'AphrontView',
     'AphrontIDPagerView' => 'AphrontView',
     'AphrontIsolatedDatabaseConnection' => 'AphrontDatabaseConnection',
     'AphrontIsolatedDatabaseConnectionTestCase' => 'PhabricatorTestCase',
     'AphrontIsolatedHTTPSink' => 'AphrontHTTPSink',
     'AphrontJSONResponse' => 'AphrontResponse',
     'AphrontJavelinView' => 'AphrontView',
     'AphrontKeyboardShortcutsAvailableView' => 'AphrontView',
     'AphrontListFilterView' => 'AphrontView',
     'AphrontMiniPanelView' => 'AphrontView',
     'AphrontMySQLDatabaseConnection' => 'AphrontMySQLDatabaseConnectionBase',
     'AphrontMySQLDatabaseConnectionBase' => 'AphrontDatabaseConnection',
     'AphrontMySQLDatabaseConnectionTestCase' => 'PhabricatorTestCase',
     'AphrontMySQLiDatabaseConnection' => 'AphrontMySQLDatabaseConnectionBase',
     'AphrontNullView' => 'AphrontView',
     'AphrontPHPHTTPSink' => 'AphrontHTTPSink',
     'AphrontPageView' => 'AphrontView',
     'AphrontPagerView' => 'AphrontView',
     'AphrontPanelView' => 'AphrontView',
     'AphrontPlainTextResponse' => 'AphrontResponse',
     'AphrontProxyResponse' => 'AphrontResponse',
     'AphrontQueryAccessDeniedException' => 'AphrontQueryRecoverableException',
     'AphrontQueryConnectionException' => 'AphrontQueryException',
     'AphrontQueryConnectionLostException' => 'AphrontQueryRecoverableException',
     'AphrontQueryCountException' => 'AphrontQueryException',
     'AphrontQueryDeadlockException' => 'AphrontQueryRecoverableException',
     'AphrontQueryDuplicateKeyException' => 'AphrontQueryException',
     'AphrontQueryObjectMissingException' => 'AphrontQueryException',
     'AphrontQueryParameterException' => 'AphrontQueryException',
     'AphrontQueryRecoverableException' => 'AphrontQueryException',
     'AphrontQuerySchemaException' => 'AphrontQueryException',
     'AphrontRedirectException' => 'AphrontException',
     'AphrontRedirectResponse' => 'AphrontResponse',
     'AphrontReloadResponse' => 'AphrontRedirectResponse',
     'AphrontRequestFailureView' => 'AphrontView',
     'AphrontRequestTestCase' => 'PhabricatorTestCase',
     'AphrontSideNavFilterView' => 'AphrontView',
     'AphrontSideNavView' => 'AphrontView',
     'AphrontTableView' => 'AphrontView',
     'AphrontTokenizerTemplateView' => 'AphrontView',
     'AphrontTypeaheadTemplateView' => 'AphrontView',
     'AphrontUsageException' => 'AphrontException',
     'AphrontWebpageResponse' => 'AphrontResponse',
     'CelerityResourceController' => 'AphrontController',
     'CelerityResourceGraph' => 'AbstractDirectedGraph',
     'CelerityResourceTransformerTestCase' => 'PhabricatorTestCase',
     'ConduitAPI_arcanist_Method' => 'ConduitAPIMethod',
     'ConduitAPI_arcanist_projectinfo_Method' => 'ConduitAPI_arcanist_Method',
     'ConduitAPI_audit_Method' => 'ConduitAPIMethod',
     'ConduitAPI_audit_query_Method' => 'ConduitAPI_audit_Method',
     'ConduitAPI_chatlog_Method' => 'ConduitAPIMethod',
     'ConduitAPI_chatlog_query_Method' => 'ConduitAPI_chatlog_Method',
     'ConduitAPI_chatlog_record_Method' => 'ConduitAPI_chatlog_Method',
     'ConduitAPI_conduit_connect_Method' => 'ConduitAPIMethod',
     'ConduitAPI_conduit_getcertificate_Method' => 'ConduitAPIMethod',
     'ConduitAPI_conduit_ping_Method' => 'ConduitAPIMethod',
     'ConduitAPI_daemon_launched_Method' => 'ConduitAPIMethod',
     'ConduitAPI_daemon_log_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_close_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_createcomment_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_creatediff_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_createrevision_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_find_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_getalldiffs_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_getcommitmessage_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_getcommitpaths_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_getdiff_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_getrevision_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_getrevisioncomments_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_getrevisionfeedback_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_markcommitted_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_parsecommitmessage_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_query_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_setdiffproperty_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_updaterevision_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_updatetaskrevisionassoc_Method' => 'ConduitAPIMethod',
     'ConduitAPI_differential_updateunitresults_Method' => 'ConduitAPIMethod',
     'ConduitAPI_diffusion_findsymbols_Method' => 'ConduitAPIMethod',
     'ConduitAPI_diffusion_getcommits_Method' => 'ConduitAPIMethod',
     'ConduitAPI_diffusion_getrecentcommitsbypath_Method' => 'ConduitAPIMethod',
     'ConduitAPI_feed_publish_Method' => 'ConduitAPIMethod',
     'ConduitAPI_feed_query_Method' => 'ConduitAPIMethod',
     'ConduitAPI_file_download_Method' => 'ConduitAPIMethod',
     'ConduitAPI_file_info_Method' => 'ConduitAPIMethod',
     'ConduitAPI_file_upload_Method' => 'ConduitAPIMethod',
     'ConduitAPI_flag_Method' => 'ConduitAPIMethod',
     'ConduitAPI_flag_query_Method' => 'ConduitAPI_flag_Method',
     'ConduitAPI_macro_Method' => 'ConduitAPIMethod',
     'ConduitAPI_macro_query_Method' => 'ConduitAPI_macro_Method',
     'ConduitAPI_maniphest_Method' => 'ConduitAPIMethod',
     'ConduitAPI_maniphest_createtask_Method' => 'ConduitAPI_maniphest_Method',
     'ConduitAPI_maniphest_find_Method' => 'ConduitAPI_maniphest_Method',
     'ConduitAPI_maniphest_gettasktransactions_Method' => 'ConduitAPI_maniphest_Method',
     'ConduitAPI_maniphest_info_Method' => 'ConduitAPI_maniphest_Method',
     'ConduitAPI_maniphest_update_Method' => 'ConduitAPI_maniphest_Method',
     'ConduitAPI_paste_Method' => 'ConduitAPIMethod',
     'ConduitAPI_paste_create_Method' => 'ConduitAPI_paste_Method',
     'ConduitAPI_paste_info_Method' => 'ConduitAPI_paste_Method',
     'ConduitAPI_path_getowners_Method' => 'ConduitAPIMethod',
     'ConduitAPI_phid_Method' => 'ConduitAPIMethod',
     'ConduitAPI_phid_info_Method' => 'ConduitAPI_phid_Method',
     'ConduitAPI_phid_query_Method' => 'ConduitAPI_phid_Method',
     'ConduitAPI_phriction_Method' => 'ConduitAPIMethod',
     'ConduitAPI_phriction_edit_Method' => 'ConduitAPI_phriction_Method',
     'ConduitAPI_phriction_history_Method' => 'ConduitAPI_phriction_Method',
     'ConduitAPI_phriction_info_Method' => 'ConduitAPI_phriction_Method',
     'ConduitAPI_project_Method' => 'ConduitAPIMethod',
     'ConduitAPI_project_query_Method' => 'ConduitAPI_project_Method',
     'ConduitAPI_remarkup_process_Method' => 'ConduitAPIMethod',
     'ConduitAPI_repository_Method' => 'ConduitAPIMethod',
     'ConduitAPI_repository_create_Method' => 'ConduitAPI_repository_Method',
     'ConduitAPI_repository_query_Method' => 'ConduitAPI_repository_Method',
     'ConduitAPI_slowvote_info_Method' => 'ConduitAPIMethod',
     'ConduitAPI_user_Method' => 'ConduitAPIMethod',
     'ConduitAPI_user_addstatus_Method' => 'ConduitAPI_user_Method',
     'ConduitAPI_user_find_Method' => 'ConduitAPI_user_Method',
     'ConduitAPI_user_info_Method' => 'ConduitAPI_user_Method',
     'ConduitAPI_user_query_Method' => 'ConduitAPI_user_Method',
     'ConduitAPI_user_removestatus_Method' => 'ConduitAPI_user_Method',
     'ConduitAPI_user_whoami_Method' => 'ConduitAPI_user_Method',
     'DarkConsoleConfigPlugin' => 'DarkConsolePlugin',
     'DarkConsoleController' => 'PhabricatorController',
     'DarkConsoleErrorLogPlugin' => 'DarkConsolePlugin',
     'DarkConsoleEventPlugin' => 'DarkConsolePlugin',
     'DarkConsoleEventPluginAPI' => 'PhutilEventListener',
     'DarkConsoleRequestPlugin' => 'DarkConsolePlugin',
     'DarkConsoleServicesPlugin' => 'DarkConsolePlugin',
     'DarkConsoleXHProfPlugin' => 'DarkConsolePlugin',
     'DifferentialActionHasNoEffectException' => 'DifferentialException',
     'DifferentialAddCommentView' => 'AphrontView',
     'DifferentialAffectedPath' => 'DifferentialDAO',
     'DifferentialApplyPatchFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialArcanistProjectFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialAuditorsFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialAuthorFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialAuxiliaryField' => 'DifferentialDAO',
     'DifferentialBlameRevisionFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialBranchFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialCCWelcomeMail' => 'DifferentialReviewRequestMail',
     'DifferentialCCsFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialChangeset' => 'DifferentialDAO',
     'DifferentialChangesetDetailView' => 'AphrontView',
     'DifferentialChangesetListView' => 'AphrontView',
     'DifferentialChangesetViewController' => 'DifferentialController',
     'DifferentialComment' => 'DifferentialDAO',
     'DifferentialCommentMail' => 'DifferentialMail',
     'DifferentialCommentPreviewController' => 'DifferentialController',
     'DifferentialCommentSaveController' => 'DifferentialController',
     'DifferentialCommitsFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialController' => 'PhabricatorController',
     'DifferentialDAO' => 'PhabricatorLiskDAO',
     'DifferentialDateCreatedFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialDateModifiedFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialDefaultFieldSelector' => 'DifferentialFieldSelector',
     'DifferentialDependenciesFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialDiff' => 'DifferentialDAO',
     'DifferentialDiffContentMail' => 'DifferentialMail',
     'DifferentialDiffCreateController' => 'DifferentialController',
     'DifferentialDiffProperty' => 'DifferentialDAO',
     'DifferentialDiffTableOfContentsView' => 'AphrontView',
     'DifferentialDiffViewController' => 'DifferentialController',
     'DifferentialExceptionMail' => 'DifferentialMail',
     'DifferentialExportPatchFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialGitSVNIDFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialHostFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialHunk' => 'DifferentialDAO',
     'DifferentialInlineComment' => 'DifferentialDAO',
     'DifferentialInlineCommentEditController' => 'PhabricatorInlineCommentController',
     'DifferentialInlineCommentEditView' => 'AphrontView',
     'DifferentialInlineCommentPreviewController' => 'DifferentialController',
     'DifferentialInlineCommentView' => 'AphrontView',
     'DifferentialLinesFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialLintFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialLocalCommitsView' => 'AphrontView',
     'DifferentialManiphestTasksFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialNewDiffMail' => 'DifferentialReviewRequestMail',
     'DifferentialPathFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialPrimaryPaneView' => 'AphrontView',
     'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler',
     'DifferentialResultsTableView' => 'AphrontView',
     'DifferentialRevertPlanFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialReviewRequestMail' => 'DifferentialMail',
     'DifferentialReviewedByFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialReviewersFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialRevision' => 'DifferentialDAO',
     'DifferentialRevisionCommentListView' => 'AphrontView',
     'DifferentialRevisionCommentView' => 'AphrontView',
     'DifferentialRevisionDetailView' => 'AphrontView',
     'DifferentialRevisionEditController' => 'DifferentialController',
     'DifferentialRevisionIDFieldParserTestCase' => 'PhabricatorTestCase',
     'DifferentialRevisionIDFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialRevisionListController' => 'DifferentialController',
     'DifferentialRevisionListView' => 'AphrontView',
     'DifferentialRevisionStatsController' => 'DifferentialController',
     'DifferentialRevisionStatsView' => 'AphrontView',
     'DifferentialRevisionStatusFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialRevisionUpdateHistoryView' => 'AphrontView',
     'DifferentialRevisionViewController' => 'DifferentialController',
     'DifferentialSubscribeController' => 'DifferentialController',
     'DifferentialSummaryFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialTestPlanFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialTitleFieldSpecification' => 'DifferentialFieldSpecification',
     'DifferentialUnitFieldSpecification' => 'DifferentialFieldSpecification',
     'DiffusionBranchTableView' => 'DiffusionView',
     'DiffusionBrowseController' => 'DiffusionController',
     'DiffusionBrowseFileController' => 'DiffusionController',
     'DiffusionBrowseTableView' => 'DiffusionView',
     'DiffusionChangeController' => 'DiffusionController',
     'DiffusionCommentListView' => 'AphrontView',
     'DiffusionCommentView' => 'AphrontView',
     'DiffusionCommitChangeTableView' => 'DiffusionView',
     'DiffusionCommitController' => 'DiffusionController',
     'DiffusionCommitParentsQuery' => 'DiffusionQuery',
     'DiffusionCommitTagsQuery' => 'DiffusionQuery',
     'DiffusionContainsQuery' => 'DiffusionQuery',
     'DiffusionController' => 'PhabricatorController',
     'DiffusionDiffController' => 'DiffusionController',
     'DiffusionDiffQuery' => 'DiffusionQuery',
     'DiffusionEmptyResultView' => 'DiffusionView',
     'DiffusionExternalController' => 'DiffusionController',
     'DiffusionFileContentQuery' => 'DiffusionQuery',
     'DiffusionGitBranchQuery' => 'DiffusionBranchQuery',
     'DiffusionGitBranchQueryTestCase' => 'PhabricatorTestCase',
     'DiffusionGitBrowseQuery' => 'DiffusionBrowseQuery',
     'DiffusionGitCommitParentsQuery' => 'DiffusionCommitParentsQuery',
     'DiffusionGitCommitTagsQuery' => 'DiffusionCommitTagsQuery',
     'DiffusionGitContainsQuery' => 'DiffusionContainsQuery',
     'DiffusionGitDiffQuery' => 'DiffusionDiffQuery',
     'DiffusionGitFileContentQuery' => 'DiffusionFileContentQuery',
     'DiffusionGitHistoryQuery' => 'DiffusionHistoryQuery',
     'DiffusionGitLastModifiedQuery' => 'DiffusionLastModifiedQuery',
     'DiffusionGitMergedCommitsQuery' => 'DiffusionMergedCommitsQuery',
     'DiffusionGitRawDiffQuery' => 'DiffusionRawDiffQuery',
     'DiffusionGitRenameHistoryQuery' => 'DiffusionRenameHistoryQuery',
     'DiffusionGitRequest' => 'DiffusionRequest',
     'DiffusionGitTagListQuery' => 'DiffusionTagListQuery',
     'DiffusionHistoryController' => 'DiffusionController',
     'DiffusionHistoryQuery' => 'DiffusionQuery',
     'DiffusionHistoryTableView' => 'DiffusionView',
     'DiffusionHomeController' => 'DiffusionController',
     'DiffusionInlineCommentController' => 'PhabricatorInlineCommentController',
     'DiffusionLastModifiedController' => 'DiffusionController',
     'DiffusionLastModifiedQuery' => 'DiffusionQuery',
     'DiffusionMercurialBranchQuery' => 'DiffusionBranchQuery',
     'DiffusionMercurialBrowseQuery' => 'DiffusionBrowseQuery',
     'DiffusionMercurialCommitParentsQuery' => 'DiffusionCommitParentsQuery',
     'DiffusionMercurialCommitTagsQuery' => 'DiffusionCommitTagsQuery',
     'DiffusionMercurialContainsQuery' => 'DiffusionContainsQuery',
     'DiffusionMercurialDiffQuery' => 'DiffusionDiffQuery',
     'DiffusionMercurialFileContentQuery' => 'DiffusionFileContentQuery',
     'DiffusionMercurialHistoryQuery' => 'DiffusionHistoryQuery',
     'DiffusionMercurialLastModifiedQuery' => 'DiffusionLastModifiedQuery',
     'DiffusionMercurialMergedCommitsQuery' => 'DiffusionMergedCommitsQuery',
     'DiffusionMercurialRawDiffQuery' => 'DiffusionRawDiffQuery',
     'DiffusionMercurialRenameHistoryQuery' => 'DiffusionRenameHistoryQuery',
     'DiffusionMercurialRequest' => 'DiffusionRequest',
     'DiffusionMercurialTagListQuery' => 'DiffusionTagListQuery',
     'DiffusionMergedCommitsQuery' => 'DiffusionQuery',
     'DiffusionPathCompleteController' => 'DiffusionController',
     'DiffusionPathQueryTestCase' => 'PhabricatorTestCase',
     'DiffusionPathValidateController' => 'DiffusionController',
     'DiffusionRawDiffQuery' => 'DiffusionQuery',
     'DiffusionRenameHistoryQuery' => 'DiffusionQuery',
     'DiffusionRepositoryController' => 'DiffusionController',
     'DiffusionSvnBrowseQuery' => 'DiffusionBrowseQuery',
     'DiffusionSvnCommitParentsQuery' => 'DiffusionCommitParentsQuery',
     'DiffusionSvnCommitTagsQuery' => 'DiffusionCommitTagsQuery',
     'DiffusionSvnContainsQuery' => 'DiffusionContainsQuery',
     'DiffusionSvnDiffQuery' => 'DiffusionDiffQuery',
     'DiffusionSvnFileContentQuery' => 'DiffusionFileContentQuery',
     'DiffusionSvnHistoryQuery' => 'DiffusionHistoryQuery',
     'DiffusionSvnLastModifiedQuery' => 'DiffusionLastModifiedQuery',
     'DiffusionSvnMergedCommitsQuery' => 'DiffusionMergedCommitsQuery',
     'DiffusionSvnRawDiffQuery' => 'DiffusionRawDiffQuery',
     'DiffusionSvnRenameHistoryQuery' => 'DiffusionRenameHistoryQuery',
     'DiffusionSvnRequest' => 'DiffusionRequest',
     'DiffusionSvnTagListQuery' => 'DiffusionTagListQuery',
     'DiffusionSymbolController' => 'DiffusionController',
     'DiffusionTagListController' => 'DiffusionController',
     'DiffusionTagListQuery' => 'DiffusionQuery',
     'DiffusionTagListView' => 'DiffusionView',
     'DiffusionURITestCase' => 'ArcanistPhutilTestCase',
     'DiffusionView' => 'AphrontView',
     'DrydockAllocatorWorker' => 'PhabricatorWorker',
     'DrydockApacheWebrootBlueprint' => 'DrydockBlueprint',
     'DrydockApacheWebrootInterface' => 'DrydockWebrootInterface',
     'DrydockCommandInterface' => 'DrydockInterface',
     'DrydockController' => 'PhabricatorController',
     'DrydockDAO' => 'PhabricatorLiskDAO',
     'DrydockEC2HostBlueprint' => 'DrydockRemoteHostBlueprint',
     'DrydockLease' => 'DrydockDAO',
     'DrydockLeaseListController' => 'DrydockController',
     'DrydockLeaseStatus' => 'DrydockConstants',
     'DrydockLocalCommandInterface' => 'DrydockCommandInterface',
     'DrydockLocalHostBlueprint' => 'DrydockBlueprint',
     'DrydockLog' => 'DrydockDAO',
     'DrydockLogController' => 'DrydockController',
     'DrydockLogQuery' => 'PhabricatorOffsetPagedQuery',
     'DrydockPhabricatorApplicationBlueprint' => 'DrydockBlueprint',
     'DrydockRemoteHostBlueprint' => 'DrydockBlueprint',
     'DrydockResource' => 'DrydockDAO',
     'DrydockResourceAllocateController' => 'DrydockController',
     'DrydockResourceListController' => 'DrydockController',
     'DrydockResourceStatus' => 'DrydockConstants',
     'DrydockSSHCommandInterface' => 'DrydockCommandInterface',
     'DrydockWebrootInterface' => 'DrydockInterface',
     'HeraldAction' => 'HeraldDAO',
     'HeraldApplyTranscript' => 'HeraldDAO',
     'HeraldCommitAdapter' => 'HeraldObjectAdapter',
     'HeraldCondition' => 'HeraldDAO',
     'HeraldController' => 'PhabricatorController',
     'HeraldDAO' => 'PhabricatorLiskDAO',
     'HeraldDeleteController' => 'HeraldController',
     'HeraldDifferentialRevisionAdapter' => 'HeraldObjectAdapter',
     'HeraldDryRunAdapter' => 'HeraldObjectAdapter',
     'HeraldEditLogQuery' => 'PhabricatorOffsetPagedQuery',
     'HeraldHomeController' => 'HeraldController',
     'HeraldNewController' => 'HeraldController',
     'HeraldRule' => 'HeraldDAO',
     'HeraldRuleController' => 'HeraldController',
     'HeraldRuleEdit' => 'HeraldDAO',
     'HeraldRuleEditHistoryController' => 'HeraldController',
     'HeraldRuleEditHistoryView' => 'AphrontView',
     'HeraldRuleListView' => 'AphrontView',
     'HeraldRuleQuery' => 'PhabricatorOffsetPagedQuery',
     'HeraldTestConsoleController' => 'HeraldController',
     'HeraldTranscript' => 'HeraldDAO',
     'HeraldTranscriptController' => 'HeraldController',
     'HeraldTranscriptListController' => 'HeraldController',
     'JavelinReactorExample' => 'PhabricatorUIExample',
     'JavelinViewExample' => 'PhabricatorUIExample',
     'JavelinViewExampleServerView' => 'AphrontView',
     'LiskFixtureTestCase' => 'PhabricatorTestCase',
     'LiskIsolationTestCase' => 'PhabricatorTestCase',
     'LiskIsolationTestDAO' => 'LiskDAO',
     'ManiphestAction' => 'PhrictionConstants',
     'ManiphestAuxiliaryFieldDefaultSpecification' => 'ManiphestAuxiliaryFieldSpecification',
     'ManiphestBatchEditController' => 'ManiphestController',
     'ManiphestController' => 'PhabricatorController',
     'ManiphestDAO' => 'PhabricatorLiskDAO',
     'ManiphestDefaultTaskExtensions' => 'ManiphestTaskExtensions',
     'ManiphestExportController' => 'ManiphestController',
     'ManiphestReplyHandler' => 'PhabricatorMailReplyHandler',
     'ManiphestReportController' => 'ManiphestController',
     'ManiphestSavedQuery' => 'ManiphestDAO',
     'ManiphestSavedQueryDeleteController' => 'ManiphestController',
     'ManiphestSavedQueryEditController' => 'ManiphestController',
     'ManiphestSavedQueryListController' => 'ManiphestController',
     'ManiphestSubpriorityController' => 'ManiphestController',
     'ManiphestTask' => 'ManiphestDAO',
     'ManiphestTaskAuxiliaryStorage' => 'ManiphestDAO',
     'ManiphestTaskDescriptionChangeController' => 'ManiphestController',
     'ManiphestTaskDescriptionPreviewController' => 'ManiphestController',
     'ManiphestTaskDetailController' => 'ManiphestController',
     'ManiphestTaskEditController' => 'ManiphestController',
     'ManiphestTaskListController' => 'ManiphestController',
     'ManiphestTaskListView' => 'ManiphestView',
     'ManiphestTaskOwner' => 'ManiphestConstants',
     'ManiphestTaskPriority' => 'ManiphestConstants',
     'ManiphestTaskProject' => 'ManiphestDAO',
     'ManiphestTaskProjectsView' => 'ManiphestView',
     'ManiphestTaskStatus' => 'ManiphestConstants',
     'ManiphestTaskSubscriber' => 'ManiphestDAO',
     'ManiphestTaskSummaryView' => 'ManiphestView',
     'ManiphestTransaction' => 'ManiphestDAO',
     'ManiphestTransactionDetailView' => 'ManiphestView',
     'ManiphestTransactionListView' => 'ManiphestView',
     'ManiphestTransactionPreviewController' => 'ManiphestController',
     'ManiphestTransactionSaveController' => 'ManiphestController',
     'ManiphestTransactionType' => 'ManiphestConstants',
     'ManiphestView' => 'AphrontView',
     'MetaMTANotificationType' => 'MetaMTAConstants',
     'Phabricator404Controller' => 'PhabricatorController',
     'PhabricatorAphlictTestPageController' => 'PhabricatorNotificationsController',
     'PhabricatorAuditAddCommentController' => 'PhabricatorAuditController',
     'PhabricatorAuditComment' => 'PhabricatorAuditDAO',
     'PhabricatorAuditCommitListView' => 'AphrontView',
     'PhabricatorAuditController' => 'PhabricatorController',
     'PhabricatorAuditDAO' => 'PhabricatorLiskDAO',
     'PhabricatorAuditInlineComment' => 'PhabricatorAuditDAO',
     'PhabricatorAuditListController' => 'PhabricatorAuditController',
     'PhabricatorAuditListView' => 'AphrontView',
     'PhabricatorAuditPreviewController' => 'PhabricatorAuditController',
     'PhabricatorAuditReplyHandler' => 'PhabricatorMailReplyHandler',
     'PhabricatorAuthController' => 'PhabricatorController',
     'PhabricatorBuiltinPatchList' => 'PhabricatorSQLPatchList',
     'PhabricatorCalendarBrowseController' => 'PhabricatorCalendarController',
     'PhabricatorCalendarController' => 'PhabricatorController',
     'PhabricatorCalendarDAO' => 'PhabricatorLiskDAO',
     'PhabricatorCalendarHoliday' => 'PhabricatorCalendarDAO',
     'PhabricatorCalendarHolidayTestCase' => 'PhabricatorTestCase',
     'PhabricatorChangesetResponse' => 'AphrontProxyResponse',
     'PhabricatorChatLogChannelListController' => 'PhabricatorChatLogController',
     'PhabricatorChatLogChannelLogController' => 'PhabricatorChatLogController',
     'PhabricatorChatLogController' => 'PhabricatorController',
     'PhabricatorChatLogDAO' => 'PhabricatorLiskDAO',
     'PhabricatorChatLogEvent' => 'PhabricatorChatLogDAO',
     'PhabricatorChatLogEventType' => 'PhabricatorChatLogConstants',
     'PhabricatorChatLogQuery' => 'PhabricatorOffsetPagedQuery',
     'PhabricatorConduitAPIController' => 'PhabricatorConduitController',
     'PhabricatorConduitCertificateToken' => 'PhabricatorConduitDAO',
     'PhabricatorConduitConnectionLog' => 'PhabricatorConduitDAO',
     'PhabricatorConduitConsoleController' => 'PhabricatorConduitController',
     'PhabricatorConduitController' => 'PhabricatorController',
     'PhabricatorConduitDAO' => 'PhabricatorLiskDAO',
     'PhabricatorConduitListController' => 'PhabricatorConduitController',
     'PhabricatorConduitLogController' => 'PhabricatorConduitController',
     'PhabricatorConduitMethodCallLog' => 'PhabricatorConduitDAO',
     'PhabricatorConduitTokenController' => 'PhabricatorConduitController',
     'PhabricatorContentSourceView' => 'AphrontView',
     'PhabricatorController' => 'AphrontController',
     'PhabricatorCountdownController' => 'PhabricatorController',
     'PhabricatorCountdownDAO' => 'PhabricatorLiskDAO',
     'PhabricatorCountdownDeleteController' => 'PhabricatorCountdownController',
     'PhabricatorCountdownEditController' => 'PhabricatorCountdownController',
     'PhabricatorCountdownListController' => 'PhabricatorCountdownController',
     'PhabricatorCountdownViewController' => 'PhabricatorCountdownController',
     'PhabricatorDaemon' => 'PhutilDaemon',
     'PhabricatorDaemonCombinedLogController' => 'PhabricatorDaemonController',
     'PhabricatorDaemonConsoleController' => 'PhabricatorDaemonController',
     'PhabricatorDaemonController' => 'PhabricatorController',
     'PhabricatorDaemonDAO' => 'PhabricatorLiskDAO',
     'PhabricatorDaemonLog' => 'PhabricatorDaemonDAO',
     'PhabricatorDaemonLogEvent' => 'PhabricatorDaemonDAO',
     'PhabricatorDaemonLogEventsView' => 'AphrontView',
     'PhabricatorDaemonLogListController' => 'PhabricatorDaemonController',
     'PhabricatorDaemonLogListView' => 'AphrontView',
     'PhabricatorDaemonLogViewController' => 'PhabricatorDaemonController',
     'PhabricatorDaemonTimelineConsoleController' => 'PhabricatorDaemonController',
     'PhabricatorDaemonTimelineEventController' => 'PhabricatorDaemonController',
     'PhabricatorDefaultFileStorageEngineSelector' => 'PhabricatorFileStorageEngineSelector',
     'PhabricatorDefaultSearchEngineSelector' => 'PhabricatorSearchEngineSelector',
     'PhabricatorDirectoryController' => 'PhabricatorController',
     'PhabricatorDirectoryMainController' => 'PhabricatorDirectoryController',
     'PhabricatorDisabledUserController' => 'PhabricatorAuthController',
     'PhabricatorDraft' => 'PhabricatorDraftDAO',
     'PhabricatorDraftDAO' => 'PhabricatorLiskDAO',
     'PhabricatorEdgeConfig' => 'PhabricatorEdgeConstants',
     'PhabricatorEdgeQuery' => 'PhabricatorQuery',
     'PhabricatorEmailLoginController' => 'PhabricatorAuthController',
     'PhabricatorEmailTokenController' => 'PhabricatorAuthController',
     'PhabricatorEmailVerificationController' => 'PhabricatorPeopleController',
     'PhabricatorEnvTestCase' => 'PhabricatorTestCase',
     'PhabricatorErrorExample' => 'PhabricatorUIExample',
     'PhabricatorEvent' => 'PhutilEvent',
     'PhabricatorEventType' => 'PhutilEventType',
     'PhabricatorFeedController' => 'PhabricatorController',
     'PhabricatorFeedDAO' => 'PhabricatorLiskDAO',
     'PhabricatorFeedPublicStreamController' => 'PhabricatorFeedController',
     'PhabricatorFeedStoryAudit' => 'PhabricatorFeedStory',
     'PhabricatorFeedStoryData' => 'PhabricatorFeedDAO',
     'PhabricatorFeedStoryDifferential' => 'PhabricatorFeedStory',
     'PhabricatorFeedStoryManiphest' => 'PhabricatorFeedStory',
     'PhabricatorFeedStoryPhriction' => 'PhabricatorFeedStory',
     'PhabricatorFeedStoryProject' => 'PhabricatorFeedStory',
     'PhabricatorFeedStoryReference' => 'PhabricatorFeedDAO',
     'PhabricatorFeedStoryStatus' => 'PhabricatorFeedStory',
     'PhabricatorFeedStoryTypeConstants' => 'PhabricatorFeedConstants',
     'PhabricatorFeedStoryUnknown' => 'PhabricatorFeedStory',
     'PhabricatorFeedStoryView' => 'PhabricatorFeedView',
     'PhabricatorFeedView' => 'AphrontView',
     'PhabricatorFile' => 'PhabricatorFileDAO',
     'PhabricatorFileController' => 'PhabricatorController',
     'PhabricatorFileDAO' => 'PhabricatorLiskDAO',
     'PhabricatorFileDataController' => 'PhabricatorFileController',
     'PhabricatorFileDeleteController' => 'PhabricatorFileController',
     'PhabricatorFileDropUploadController' => 'PhabricatorFileController',
     'PhabricatorFileImageMacro' => 'PhabricatorFileDAO',
     'PhabricatorFileInfoController' => 'PhabricatorFileController',
     'PhabricatorFileListController' => 'PhabricatorFileController',
     'PhabricatorFileMacroDeleteController' => 'PhabricatorFileController',
     'PhabricatorFileMacroEditController' => 'PhabricatorFileController',
     'PhabricatorFileMacroListController' => 'PhabricatorFileController',
     'PhabricatorFileProxyController' => 'PhabricatorFileController',
     'PhabricatorFileProxyImage' => 'PhabricatorFileDAO',
     'PhabricatorFileShortcutController' => 'PhabricatorFileController',
     'PhabricatorFileSideNavView' => 'AphrontView',
     'PhabricatorFileStorageBlob' => 'PhabricatorFileDAO',
     'PhabricatorFileTransformController' => 'PhabricatorFileController',
     'PhabricatorFileUploadController' => 'PhabricatorFileController',
     'PhabricatorFileUploadView' => 'AphrontView',
     'PhabricatorFlag' => 'PhabricatorFlagDAO',
     'PhabricatorFlagColor' => 'PhabricatorFlagConstants',
     'PhabricatorFlagController' => 'PhabricatorController',
     'PhabricatorFlagDAO' => 'PhabricatorLiskDAO',
     'PhabricatorFlagDeleteController' => 'PhabricatorFlagController',
     'PhabricatorFlagEditController' => 'PhabricatorFlagController',
     'PhabricatorFlagListController' => 'PhabricatorFlagController',
     'PhabricatorFlagListView' => 'AphrontView',
     'PhabricatorFormExample' => 'PhabricatorUIExample',
     'PhabricatorGarbageCollectorDaemon' => 'PhabricatorDaemon',
     'PhabricatorGoodForNothingWorker' => 'PhabricatorWorker',
     'PhabricatorHelpController' => 'PhabricatorController',
     'PhabricatorHelpKeyboardShortcutController' => 'PhabricatorHelpController',
     'PhabricatorIDPagedPolicyQuery' => 'PhabricatorPolicyQuery',
     'PhabricatorIRCBot' => 'PhabricatorDaemon',
     'PhabricatorIRCDifferentialNotificationHandler' => 'PhabricatorIRCHandler',
     'PhabricatorIRCLogHandler' => 'PhabricatorIRCHandler',
     'PhabricatorIRCMacroHandler' => 'PhabricatorIRCHandler',
     'PhabricatorIRCObjectNameHandler' => 'PhabricatorIRCHandler',
     'PhabricatorIRCProtocolHandler' => 'PhabricatorIRCHandler',
     'PhabricatorIRCWhatsNewHandler' => 'PhabricatorIRCHandler',
     'PhabricatorInfrastructureTestCase' => 'PhabricatorTestCase',
     'PhabricatorInlineCommentController' => 'PhabricatorController',
     'PhabricatorInlineSummaryView' => 'AphrontView',
     'PhabricatorJavelinLinter' => 'ArcanistLinter',
     'PhabricatorLintEngine' => 'PhutilLintEngine',
     'PhabricatorLiskDAO' => 'LiskDAO',
     'PhabricatorLocalDiskFileStorageEngine' => 'PhabricatorFileStorageEngine',
     'PhabricatorLocalTimeTestCase' => 'PhabricatorTestCase',
     'PhabricatorLoginController' => 'PhabricatorAuthController',
     'PhabricatorLoginValidateController' => 'PhabricatorAuthController',
     'PhabricatorLogoutController' => 'PhabricatorAuthController',
     'PhabricatorMailImplementationAmazonSESAdapter' => 'PhabricatorMailImplementationPHPMailerLiteAdapter',
     'PhabricatorMailImplementationPHPMailerLiteAdapter' => 'PhabricatorMailImplementationAdapter',
     'PhabricatorMailImplementationSendGridAdapter' => 'PhabricatorMailImplementationAdapter',
     'PhabricatorMailImplementationTestAdapter' => 'PhabricatorMailImplementationAdapter',
     'PhabricatorMetaMTAController' => 'PhabricatorController',
     'PhabricatorMetaMTADAO' => 'PhabricatorLiskDAO',
     'PhabricatorMetaMTAEmailBodyParserTestCase' => 'PhabricatorTestCase',
     'PhabricatorMetaMTAListController' => 'PhabricatorMetaMTAController',
     'PhabricatorMetaMTAMail' => 'PhabricatorMetaMTADAO',
     'PhabricatorMetaMTAMailTestCase' => 'PhabricatorTestCase',
     'PhabricatorMetaMTAMailingList' => 'PhabricatorMetaMTADAO',
     'PhabricatorMetaMTAMailingListEditController' => 'PhabricatorMetaMTAController',
     'PhabricatorMetaMTAMailingListsController' => 'PhabricatorMetaMTAController',
     'PhabricatorMetaMTAReceiveController' => 'PhabricatorMetaMTAController',
     'PhabricatorMetaMTAReceivedListController' => 'PhabricatorMetaMTAController',
     'PhabricatorMetaMTAReceivedMail' => 'PhabricatorMetaMTADAO',
     'PhabricatorMetaMTASendController' => 'PhabricatorMetaMTAController',
     'PhabricatorMetaMTASendGridReceiveController' => 'PhabricatorMetaMTAController',
     'PhabricatorMetaMTAViewController' => 'PhabricatorMetaMTAController',
     'PhabricatorMetaMTAWorker' => 'PhabricatorWorker',
     'PhabricatorMySQLFileStorageEngine' => 'PhabricatorFileStorageEngine',
     'PhabricatorNotificationsController' => 'PhabricatorController',
     'PhabricatorOAuthClientAuthorization' => 'PhabricatorOAuthServerDAO',
     'PhabricatorOAuthClientAuthorizationBaseController' => 'PhabricatorOAuthServerController',
     'PhabricatorOAuthClientAuthorizationDeleteController' => 'PhabricatorOAuthClientAuthorizationBaseController',
     'PhabricatorOAuthClientAuthorizationEditController' => 'PhabricatorOAuthClientAuthorizationBaseController',
     'PhabricatorOAuthClientAuthorizationListController' => 'PhabricatorOAuthClientAuthorizationBaseController',
     'PhabricatorOAuthClientAuthorizationQuery' => 'PhabricatorOffsetPagedQuery',
     'PhabricatorOAuthClientBaseController' => 'PhabricatorOAuthServerController',
     'PhabricatorOAuthClientDeleteController' => 'PhabricatorOAuthClientBaseController',
     'PhabricatorOAuthClientEditController' => 'PhabricatorOAuthClientBaseController',
     'PhabricatorOAuthClientListController' => 'PhabricatorOAuthClientBaseController',
     'PhabricatorOAuthClientViewController' => 'PhabricatorOAuthClientBaseController',
     'PhabricatorOAuthDefaultRegistrationController' => 'PhabricatorOAuthRegistrationController',
     'PhabricatorOAuthDiagnosticsController' => 'PhabricatorAuthController',
     'PhabricatorOAuthFailureView' => 'AphrontView',
     'PhabricatorOAuthLoginController' => 'PhabricatorAuthController',
     'PhabricatorOAuthProviderDisqus' => 'PhabricatorOAuthProvider',
     'PhabricatorOAuthProviderFacebook' => 'PhabricatorOAuthProvider',
     'PhabricatorOAuthProviderGitHub' => 'PhabricatorOAuthProvider',
     'PhabricatorOAuthProviderGoogle' => 'PhabricatorOAuthProvider',
     'PhabricatorOAuthProviderPhabricator' => 'PhabricatorOAuthProvider',
     'PhabricatorOAuthRegistrationController' => 'PhabricatorAuthController',
     'PhabricatorOAuthResponse' => 'AphrontResponse',
     'PhabricatorOAuthServerAccessToken' => 'PhabricatorOAuthServerDAO',
     'PhabricatorOAuthServerAuthController' => 'PhabricatorAuthController',
     'PhabricatorOAuthServerAuthorizationCode' => 'PhabricatorOAuthServerDAO',
     'PhabricatorOAuthServerClient' => 'PhabricatorOAuthServerDAO',
     'PhabricatorOAuthServerClientQuery' => 'PhabricatorOffsetPagedQuery',
     'PhabricatorOAuthServerController' => 'PhabricatorController',
     'PhabricatorOAuthServerDAO' => 'PhabricatorLiskDAO',
     'PhabricatorOAuthServerTestCase' => 'PhabricatorTestCase',
     'PhabricatorOAuthServerTestController' => 'PhabricatorOAuthServerController',
     'PhabricatorOAuthServerTokenController' => 'PhabricatorAuthController',
     'PhabricatorOAuthUnlinkController' => 'PhabricatorAuthController',
     'PhabricatorObjectGraph' => 'AbstractDirectedGraph',
     'PhabricatorObjectHandleStatus' => 'PhabricatorObjectHandleConstants',
     'PhabricatorOffsetPagedQuery' => 'PhabricatorQuery',
     'PhabricatorOwnersController' => 'PhabricatorController',
     'PhabricatorOwnersDAO' => 'PhabricatorLiskDAO',
     'PhabricatorOwnersDeleteController' => 'PhabricatorOwnersController',
     'PhabricatorOwnersDetailController' => 'PhabricatorOwnersController',
     'PhabricatorOwnersEditController' => 'PhabricatorOwnersController',
     'PhabricatorOwnersListController' => 'PhabricatorOwnersController',
     'PhabricatorOwnersOwner' => 'PhabricatorOwnersDAO',
     'PhabricatorOwnersPackage' => 'PhabricatorOwnersDAO',
     'PhabricatorOwnersPath' => 'PhabricatorOwnersDAO',
     'PhabricatorPHID' => 'PhabricatorPHIDDAO',
     'PhabricatorPHIDController' => 'PhabricatorController',
     'PhabricatorPHIDDAO' => 'PhabricatorLiskDAO',
     'PhabricatorPHIDLookupController' => 'PhabricatorPHIDController',
     'PhabricatorPaste' => 'PhabricatorPasteDAO',
     'PhabricatorPasteController' => 'PhabricatorController',
     'PhabricatorPasteDAO' => 'PhabricatorLiskDAO',
     'PhabricatorPasteListController' => 'PhabricatorPasteController',
     'PhabricatorPasteQuery' => 'PhabricatorIDPagedPolicyQuery',
     'PhabricatorPasteViewController' => 'PhabricatorPasteController',
     'PhabricatorPeopleController' => 'PhabricatorController',
     'PhabricatorPeopleEditController' => 'PhabricatorPeopleController',
     'PhabricatorPeopleListController' => 'PhabricatorPeopleController',
     'PhabricatorPeopleLogsController' => 'PhabricatorPeopleController',
     'PhabricatorPeopleProfileController' => 'PhabricatorPeopleController',
     'PhabricatorPeopleQuery' => 'PhabricatorOffsetPagedQuery',
     'PhabricatorPolicies' => 'PhabricatorPolicyConstants',
     'PhabricatorPolicyCapability' => 'PhabricatorPolicyConstants',
     'PhabricatorPolicyQuery' => 'PhabricatorQuery',
     'PhabricatorPolicyTestCase' => 'PhabricatorTestCase',
     'PhabricatorPolicyTestQuery' => 'PhabricatorPolicyQuery',
     'PhabricatorProfileHeaderView' => 'AphrontView',
     'PhabricatorProject' => 'PhabricatorProjectDAO',
     'PhabricatorProjectAffiliation' => 'PhabricatorProjectDAO',
     'PhabricatorProjectController' => 'PhabricatorController',
     'PhabricatorProjectCreateController' => 'PhabricatorProjectController',
     'PhabricatorProjectDAO' => 'PhabricatorLiskDAO',
     'PhabricatorProjectListController' => 'PhabricatorProjectController',
     'PhabricatorProjectProfile' => 'PhabricatorProjectDAO',
     'PhabricatorProjectProfileController' => 'PhabricatorProjectController',
     'PhabricatorProjectProfileEditController' => 'PhabricatorProjectController',
     'PhabricatorProjectSubproject' => 'PhabricatorProjectDAO',
     'PhabricatorProjectTransaction' => 'PhabricatorProjectDAO',
     'PhabricatorProjectTransactionType' => 'PhabricatorProjectConstants',
     'PhabricatorProjectUpdateController' => 'PhabricatorProjectController',
     'PhabricatorRedirectController' => 'PhabricatorController',
     'PhabricatorRefreshCSRFController' => 'PhabricatorAuthController',
     'PhabricatorRemarkupRuleDifferential' => 'PhabricatorRemarkupRuleObjectName',
     'PhabricatorRemarkupRuleDifferentialHandle' => 'PhabricatorRemarkupRuleObjectHandle',
     'PhabricatorRemarkupRuleDiffusion' => 'PhutilRemarkupRule',
     'PhabricatorRemarkupRuleEmbedFile' => 'PhutilRemarkupRule',
     'PhabricatorRemarkupRuleImageMacro' => 'PhutilRemarkupRule',
     'PhabricatorRemarkupRuleManiphest' => 'PhabricatorRemarkupRuleObjectName',
     'PhabricatorRemarkupRuleManiphestHandle' => 'PhabricatorRemarkupRuleObjectHandle',
     'PhabricatorRemarkupRuleMention' => 'PhutilRemarkupRule',
     'PhabricatorRemarkupRuleObjectHandle' => 'PhutilRemarkupRule',
     'PhabricatorRemarkupRuleObjectName' => 'PhutilRemarkupRule',
     'PhabricatorRemarkupRulePaste' => 'PhabricatorRemarkupRuleObjectName',
     'PhabricatorRemarkupRulePhriction' => 'PhutilRemarkupRule',
     'PhabricatorRemarkupRuleProxyImage' => 'PhutilRemarkupRule',
     'PhabricatorRemarkupRuleYoutube' => 'PhutilRemarkupRule',
     'PhabricatorRepository' => 'PhabricatorRepositoryDAO',
     'PhabricatorRepositoryArcanistProject' => 'PhabricatorRepositoryDAO',
     'PhabricatorRepositoryArcanistProjectEditController' => 'PhabricatorRepositoryController',
     'PhabricatorRepositoryAuditRequest' => 'PhabricatorRepositoryDAO',
     'PhabricatorRepositoryCommit' => 'PhabricatorRepositoryDAO',
     'PhabricatorRepositoryCommitChangeParserWorker' => 'PhabricatorRepositoryCommitParserWorker',
     'PhabricatorRepositoryCommitData' => 'PhabricatorRepositoryDAO',
-    'PhabricatorRepositoryCommitDiscoveryDaemon' => 'PhabricatorRepositoryDaemon',
     'PhabricatorRepositoryCommitHeraldWorker' => 'PhabricatorRepositoryCommitParserWorker',
     'PhabricatorRepositoryCommitMessageParserWorker' => 'PhabricatorRepositoryCommitParserWorker',
     'PhabricatorRepositoryCommitOwnersWorker' => 'PhabricatorRepositoryCommitParserWorker',
     'PhabricatorRepositoryCommitParserWorker' => 'PhabricatorWorker',
-    'PhabricatorRepositoryCommitTaskDaemon' => 'PhabricatorRepositoryDaemon',
+    'PhabricatorRepositoryCommitTaskDaemon' => 'PhabricatorDaemon',
     'PhabricatorRepositoryController' => 'PhabricatorController',
     'PhabricatorRepositoryCreateController' => 'PhabricatorRepositoryController',
     'PhabricatorRepositoryDAO' => 'PhabricatorLiskDAO',
-    'PhabricatorRepositoryDaemon' => 'PhabricatorDaemon',
     'PhabricatorRepositoryDefaultCommitMessageDetailParser' => 'PhabricatorRepositoryCommitMessageDetailParser',
     'PhabricatorRepositoryDeleteController' => 'PhabricatorRepositoryController',
     'PhabricatorRepositoryEditController' => 'PhabricatorRepositoryController',
     'PhabricatorRepositoryGitCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker',
-    'PhabricatorRepositoryGitCommitDiscoveryDaemon' => 'PhabricatorRepositoryCommitDiscoveryDaemon',
-    'PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase' => 'PhabricatorTestCase',
     'PhabricatorRepositoryGitCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker',
     'PhabricatorRepositoryListController' => 'PhabricatorRepositoryController',
     'PhabricatorRepositoryMercurialCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker',
-    'PhabricatorRepositoryMercurialCommitDiscoveryDaemon' => 'PhabricatorRepositoryCommitDiscoveryDaemon',
     'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker',
     'PhabricatorRepositoryPullLocalDaemon' => 'PhabricatorDaemon',
+    'PhabricatorRepositoryPullLocalDaemonTestCase' => 'PhabricatorTestCase',
     'PhabricatorRepositoryShortcut' => 'PhabricatorRepositoryDAO',
     'PhabricatorRepositorySvnCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker',
-    'PhabricatorRepositorySvnCommitDiscoveryDaemon' => 'PhabricatorRepositoryCommitDiscoveryDaemon',
     'PhabricatorRepositorySvnCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker',
     'PhabricatorRepositorySymbol' => 'PhabricatorRepositoryDAO',
     'PhabricatorRepositoryTestCase' => 'PhabricatorTestCase',
     'PhabricatorS3FileStorageEngine' => 'PhabricatorFileStorageEngine',
     'PhabricatorSearchAttachController' => 'PhabricatorSearchBaseController',
     'PhabricatorSearchBaseController' => 'PhabricatorController',
     'PhabricatorSearchCommitIndexer' => 'PhabricatorSearchDocumentIndexer',
     'PhabricatorSearchController' => 'PhabricatorSearchBaseController',
     'PhabricatorSearchDAO' => 'PhabricatorLiskDAO',
     'PhabricatorSearchDifferentialIndexer' => 'PhabricatorSearchDocumentIndexer',
     'PhabricatorSearchDocument' => 'PhabricatorSearchDAO',
     'PhabricatorSearchDocumentField' => 'PhabricatorSearchDAO',
     'PhabricatorSearchDocumentRelationship' => 'PhabricatorSearchDAO',
     'PhabricatorSearchEngineElastic' => 'PhabricatorSearchEngine',
     'PhabricatorSearchEngineMySQL' => 'PhabricatorSearchEngine',
     'PhabricatorSearchIndexController' => 'PhabricatorSearchBaseController',
     'PhabricatorSearchManiphestIndexer' => 'PhabricatorSearchDocumentIndexer',
     'PhabricatorSearchPhrictionIndexer' => 'PhabricatorSearchDocumentIndexer',
     'PhabricatorSearchQuery' => 'PhabricatorSearchDAO',
     'PhabricatorSearchResultView' => 'AphrontView',
     'PhabricatorSearchSelectController' => 'PhabricatorSearchBaseController',
     'PhabricatorSearchUserIndexer' => 'PhabricatorSearchDocumentIndexer',
     'PhabricatorSlowvoteChoice' => 'PhabricatorSlowvoteDAO',
     'PhabricatorSlowvoteComment' => 'PhabricatorSlowvoteDAO',
     'PhabricatorSlowvoteController' => 'PhabricatorController',
     'PhabricatorSlowvoteCreateController' => 'PhabricatorSlowvoteController',
     'PhabricatorSlowvoteDAO' => 'PhabricatorLiskDAO',
     'PhabricatorSlowvoteListController' => 'PhabricatorSlowvoteController',
     'PhabricatorSlowvoteOption' => 'PhabricatorSlowvoteDAO',
     'PhabricatorSlowvotePoll' => 'PhabricatorSlowvoteDAO',
     'PhabricatorSlowvotePollController' => 'PhabricatorSlowvoteController',
     'PhabricatorSlugTestCase' => 'PhabricatorTestCase',
     'PhabricatorSortTableExample' => 'PhabricatorUIExample',
     'PhabricatorStandardPageView' => 'AphrontPageView',
     'PhabricatorStatusController' => 'PhabricatorController',
     'PhabricatorStorageManagementDatabasesWorkflow' => 'PhabricatorStorageManagementWorkflow',
     'PhabricatorStorageManagementDestroyWorkflow' => 'PhabricatorStorageManagementWorkflow',
     'PhabricatorStorageManagementDumpWorkflow' => 'PhabricatorStorageManagementWorkflow',
     'PhabricatorStorageManagementStatusWorkflow' => 'PhabricatorStorageManagementWorkflow',
     'PhabricatorStorageManagementUpgradeWorkflow' => 'PhabricatorStorageManagementWorkflow',
     'PhabricatorStorageManagementWorkflow' => 'PhutilArgumentWorkflow',
     'PhabricatorSymbolNameLinter' => 'ArcanistXHPASTLintNamingHook',
     'PhabricatorTaskmasterDaemon' => 'PhabricatorDaemon',
     'PhabricatorTestCase' => 'ArcanistPhutilTestCase',
     'PhabricatorTimelineCursor' => 'PhabricatorTimelineDAO',
     'PhabricatorTimelineDAO' => 'PhabricatorLiskDAO',
     'PhabricatorTimelineEvent' => 'PhabricatorTimelineDAO',
     'PhabricatorTimelineEventData' => 'PhabricatorTimelineDAO',
     'PhabricatorTimer' => 'PhabricatorCountdownDAO',
     'PhabricatorTransactionView' => 'AphrontView',
     'PhabricatorTransformedFile' => 'PhabricatorFileDAO',
     'PhabricatorTrivialTestCase' => 'PhabricatorTestCase',
     'PhabricatorTypeaheadCommonDatasourceController' => 'PhabricatorTypeaheadDatasourceController',
     'PhabricatorTypeaheadDatasourceController' => 'PhabricatorController',
     'PhabricatorUIExampleController' => 'PhabricatorController',
     'PhabricatorUIExampleRenderController' => 'PhabricatorUIExampleController',
     'PhabricatorUIListFilterExample' => 'PhabricatorUIExample',
     'PhabricatorUIPagerExample' => 'PhabricatorUIExample',
     'PhabricatorUITooltipExample' => 'PhabricatorUIExample',
     'PhabricatorUnitsTestCase' => 'PhabricatorTestCase',
     'PhabricatorUser' => 'PhabricatorUserDAO',
     'PhabricatorUserAccountSettingsPanelController' => 'PhabricatorUserSettingsPanelController',
     'PhabricatorUserConduitSettingsPanelController' => 'PhabricatorUserSettingsPanelController',
     'PhabricatorUserDAO' => 'PhabricatorLiskDAO',
     'PhabricatorUserEmail' => 'PhabricatorUserDAO',
     'PhabricatorUserEmailPreferenceSettingsPanelController' => 'PhabricatorUserSettingsPanelController',
     'PhabricatorUserEmailSettingsPanelController' => 'PhabricatorUserSettingsPanelController',
     'PhabricatorUserLog' => 'PhabricatorUserDAO',
     'PhabricatorUserOAuthInfo' => 'PhabricatorUserDAO',
     'PhabricatorUserOAuthSettingsPanelController' => 'PhabricatorUserSettingsPanelController',
     'PhabricatorUserPasswordSettingsPanelController' => 'PhabricatorUserSettingsPanelController',
     'PhabricatorUserPreferenceSettingsPanelController' => 'PhabricatorUserSettingsPanelController',
     'PhabricatorUserPreferences' => 'PhabricatorUserDAO',
     'PhabricatorUserProfile' => 'PhabricatorUserDAO',
     'PhabricatorUserProfileSettingsPanelController' => 'PhabricatorUserSettingsPanelController',
     'PhabricatorUserSSHKey' => 'PhabricatorUserDAO',
     'PhabricatorUserSSHKeysSettingsPanelController' => 'PhabricatorUserSettingsPanelController',
     'PhabricatorUserSearchSettingsPanelController' => 'PhabricatorUserSettingsPanelController',
     'PhabricatorUserSettingsController' => 'PhabricatorPeopleController',
     'PhabricatorUserSettingsPanelController' => 'PhabricatorPeopleController',
     'PhabricatorUserStatus' => 'PhabricatorUserDAO',
     'PhabricatorUserTestCase' => 'PhabricatorTestCase',
     'PhabricatorWorkerDAO' => 'PhabricatorLiskDAO',
     'PhabricatorWorkerTask' => 'PhabricatorWorkerDAO',
     'PhabricatorWorkerTaskData' => 'PhabricatorWorkerDAO',
     'PhabricatorWorkerTaskDetailController' => 'PhabricatorDaemonController',
     'PhabricatorWorkerTaskUpdateController' => 'PhabricatorDaemonController',
     'PhabricatorXHPASTViewController' => 'PhabricatorController',
     'PhabricatorXHPASTViewDAO' => 'PhabricatorLiskDAO',
     'PhabricatorXHPASTViewFrameController' => 'PhabricatorXHPASTViewController',
     'PhabricatorXHPASTViewFramesetController' => 'PhabricatorXHPASTViewController',
     'PhabricatorXHPASTViewInputController' => 'PhabricatorXHPASTViewPanelController',
     'PhabricatorXHPASTViewPanelController' => 'PhabricatorXHPASTViewController',
     'PhabricatorXHPASTViewParseTree' => 'PhabricatorXHPASTViewDAO',
     'PhabricatorXHPASTViewRunController' => 'PhabricatorXHPASTViewController',
     'PhabricatorXHPASTViewStreamController' => 'PhabricatorXHPASTViewPanelController',
     'PhabricatorXHPASTViewTreeController' => 'PhabricatorXHPASTViewPanelController',
     'PhabricatorXHProfController' => 'PhabricatorController',
     'PhabricatorXHProfProfileController' => 'PhabricatorXHProfController',
     'PhabricatorXHProfProfileSymbolView' => 'PhabricatorXHProfProfileView',
     'PhabricatorXHProfProfileTopLevelView' => 'PhabricatorXHProfProfileView',
     'PhabricatorXHProfProfileView' => 'AphrontView',
     'PhameController' => 'PhabricatorController',
     'PhameDAO' => 'PhabricatorLiskDAO',
     'PhameDraftListController' => 'PhamePostListBaseController',
     'PhamePost' => 'PhameDAO',
     'PhamePostDeleteController' => 'PhameController',
     'PhamePostDetailView' => 'AphrontView',
     'PhamePostEditController' => 'PhameController',
     'PhamePostListBaseController' => 'PhameController',
     'PhamePostListController' => 'PhamePostListBaseController',
     'PhamePostListView' => 'AphrontView',
     'PhamePostPreviewController' => 'PhameController',
     'PhamePostQuery' => 'PhabricatorOffsetPagedQuery',
     'PhamePostViewController' => 'PhameController',
     'PhortuneMonthYearExpiryControl' => 'AphrontFormControl',
     'PhortuneStripeBaseController' => 'PhabricatorController',
     'PhortuneStripePaymentFormView' => 'AphrontView',
     'PhortuneStripeTestPaymentFormController' => 'PhortuneStripeBaseController',
     'PhrictionActionConstants' => 'PhrictionConstants',
     'PhrictionChangeType' => 'PhrictionConstants',
     'PhrictionContent' => 'PhrictionDAO',
     'PhrictionController' => 'PhabricatorController',
     'PhrictionDAO' => 'PhabricatorLiskDAO',
     'PhrictionDeleteController' => 'PhrictionController',
     'PhrictionDiffController' => 'PhrictionController',
     'PhrictionDocument' => 'PhrictionDAO',
     'PhrictionDocumentController' => 'PhrictionController',
     'PhrictionDocumentPreviewController' => 'PhrictionController',
     'PhrictionDocumentStatus' => 'PhrictionConstants',
     'PhrictionDocumentTestCase' => 'PhabricatorTestCase',
     'PhrictionEditController' => 'PhrictionController',
     'PhrictionHistoryController' => 'PhrictionController',
     'PhrictionListController' => 'PhrictionController',
     'QueryFormattingTestCase' => 'PhabricatorTestCase',
   ),
   'requires_interface' =>
   array(
     'DefaultDatabaseConfigurationProvider' =>
     array(
       0 => 'DatabaseConfigurationProvider',
     ),
     'DifferentialInlineComment' =>
     array(
       0 => 'PhabricatorInlineCommentInterface',
     ),
     'PhabricatorAuditInlineComment' =>
     array(
       0 => 'PhabricatorInlineCommentInterface',
     ),
     'PhabricatorPaste' =>
     array(
       0 => 'PhabricatorPolicyInterface',
     ),
     'PhabricatorPolicyTestObject' =>
     array(
       0 => 'PhabricatorPolicyInterface',
     ),
   ),
 ));
diff --git a/src/applications/diffusion/query/history/svn/DiffusionSvnHistoryQuery.php b/src/applications/diffusion/query/history/svn/DiffusionSvnHistoryQuery.php
index 860547051..ee2c7573c 100644
--- a/src/applications/diffusion/query/history/svn/DiffusionSvnHistoryQuery.php
+++ b/src/applications/diffusion/query/history/svn/DiffusionSvnHistoryQuery.php
@@ -1,103 +1,107 @@
 <?php
 
 /*
- * Copyright 2011 Facebook, Inc.
+ * Copyright 2012 Facebook, Inc.
  *
  * Licensed 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.
  */
 
 final class DiffusionSvnHistoryQuery extends DiffusionHistoryQuery {
 
   protected function executeQuery() {
     $drequest = $this->getRequest();
 
     $repository = $drequest->getRepository();
     $path = $drequest->getPath();
     $commit = $drequest->getCommit();
 
     $conn_r = $repository->establishConnection('r');
 
     $paths = queryfx_all(
       $conn_r,
       'SELECT id, path FROM %T WHERE pathHash IN (%Ls)',
       PhabricatorRepository::TABLE_PATH,
       array(md5('/'.trim($path, '/'))));
     $paths = ipull($paths, 'id', 'path');
-    $path_id = $paths['/'.trim($path, '/')];
+    $path_id = idx($paths, '/'.trim($path, '/'));
+
+    if (!$path_id) {
+      return array();
+    }
 
     $filter_query = '';
     if ($this->needDirectChanges) {
       if ($this->needChildChanges) {
         $type = DifferentialChangeType::TYPE_CHILD;
         $filter_query = 'AND (isDirect = 1 OR changeType = '.$type.')';
       } else {
         $filter_query = 'AND (isDirect = 1)';
       }
     }
 
     $history_data = queryfx_all(
       $conn_r,
       'SELECT * FROM %T WHERE repositoryID = %d AND pathID = %d
         AND commitSequence <= %d
         %Q
         ORDER BY commitSequence DESC
         LIMIT %d, %d',
       PhabricatorRepository::TABLE_PATHCHANGE,
       $repository->getID(),
       $path_id,
       $commit ? $commit : 0x7FFFFFFF,
       $filter_query,
       $this->getOffset(),
       $this->getLimit());
 
     $commits = array();
     $commit_data = array();
 
     $commit_ids = ipull($history_data, 'commitID');
     if ($commit_ids) {
       $commits = id(new PhabricatorRepositoryCommit())->loadAllWhere(
         'id IN (%Ld)',
         $commit_ids);
       if ($commits) {
         $commit_data = id(new PhabricatorRepositoryCommitData())->loadAllWhere(
           'commitID in (%Ld)',
           $commit_ids);
         $commit_data = mpull($commit_data, null, 'getCommitID');
       }
     }
 
     $history = array();
     foreach ($history_data as $row) {
       $item = new DiffusionPathChange();
 
       $commit = idx($commits, $row['commitID']);
       if ($commit) {
         $item->setCommit($commit);
         $item->setCommitIdentifier($commit->getCommitIdentifier());
         $data = idx($commit_data, $commit->getID());
         if ($data) {
           $item->setCommitData($data);
         }
       }
 
       $item->setChangeType($row['changeType']);
       $item->setFileType($row['fileType']);
 
 
       $history[] = $item;
     }
 
     return $history;
   }
 
 }
diff --git a/src/applications/repository/controller/base/PhabricatorRepositoryController.php b/src/applications/repository/controller/base/PhabricatorRepositoryController.php
index ca865a9cb..2a96aeaa5 100644
--- a/src/applications/repository/controller/base/PhabricatorRepositoryController.php
+++ b/src/applications/repository/controller/base/PhabricatorRepositoryController.php
@@ -1,39 +1,74 @@
 <?php
 
 /*
- * Copyright 2011 Facebook, Inc.
+ * Copyright 2012 Facebook, Inc.
  *
  * Licensed 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.
  */
 
 abstract class PhabricatorRepositoryController extends PhabricatorController {
 
   public function shouldRequireAdmin() {
     // Most of these controllers are admin-only.
     return true;
   }
 
   public function buildStandardPageResponse($view, array $data) {
     $page = $this->buildStandardPageView();
 
     $page->setApplicationName('Repositories');
     $page->setBaseURI('/repository/');
     $page->setTitle(idx($data, 'title'));
     $page->setGlyph("rX");
     $page->appendChild($view);
 
+
     $response = new AphrontWebpageResponse();
     return $response->setContent($page->render());
   }
 
+  private function isPullDaemonRunningOnThisMachine() {
+
+    // This is sort of hacky, but should probably work.
+
+    list($stdout) = execx('ps auxwww');
+    return preg_match('/PhabricatorRepositoryPullLocalDaemon/', $stdout);
+  }
+
+  protected function renderDaemonNotice() {
+    $daemon_running = $this->isPullDaemonRunningOnThisMachine();
+    if ($daemon_running) {
+      return null;
+    }
+
+    $documentation = phutil_render_tag(
+      'a',
+      array(
+        'href' => PhabricatorEnv::getDoclink(
+          'article/Diffusion_User_Guide.html'),
+      ),
+      'Diffusion User Guide');
+
+    $view = new AphrontErrorView();
+    $view->setSeverity(AphrontErrorView::SEVERITY_WARNING);
+    $view->setTitle('Repository Daemon Not Running');
+    $view->appendChild(
+      "<p>The repository daemon is not running on this machine. Without this ".
+      "daemon, Phabricator will not be able to import or update repositories. ".
+      "For instructions on starting the daemon, see ".
+      "<strong>{$documentation}</strong>.</p>");
+
+    return $view;
+  }
+
 }
diff --git a/src/applications/repository/controller/base/__init__.php b/src/applications/repository/controller/base/__init__.php
index 4f185531d..64e880425 100644
--- a/src/applications/repository/controller/base/__init__.php
+++ b/src/applications/repository/controller/base/__init__.php
@@ -1,15 +1,19 @@
 <?php
 /**
  * This file is automatically generated. Lint this module to rebuild it.
  * @generated
  */
 
 
 
 phutil_require_module('phabricator', 'aphront/response/webpage');
 phutil_require_module('phabricator', 'applications/base/controller/base');
+phutil_require_module('phabricator', 'infrastructure/env');
+phutil_require_module('phabricator', 'view/form/error');
 
+phutil_require_module('phutil', 'future/exec');
+phutil_require_module('phutil', 'markup');
 phutil_require_module('phutil', 'utils');
 
 
 phutil_require_source('PhabricatorRepositoryController.php');
diff --git a/src/applications/repository/controller/edit/PhabricatorRepositoryEditController.php b/src/applications/repository/controller/edit/PhabricatorRepositoryEditController.php
index d0c9276ea..5e91d7417 100644
--- a/src/applications/repository/controller/edit/PhabricatorRepositoryEditController.php
+++ b/src/applications/repository/controller/edit/PhabricatorRepositoryEditController.php
@@ -1,690 +1,690 @@
 <?php
 
 /*
  * Copyright 2012 Facebook, Inc.
  *
  * Licensed 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.
  */
 
 final class PhabricatorRepositoryEditController
   extends PhabricatorRepositoryController {
 
   private $id;
   private $view;
   private $repository;
   private $sideNav;
 
   public function willProcessRequest(array $data) {
     $this->id = $data['id'];
     $this->view = idx($data, 'view');
   }
 
   public function processRequest() {
 
     $request = $this->getRequest();
 
     $repository = id(new PhabricatorRepository())->load($this->id);
     if (!$repository) {
       return new Aphront404Response();
     }
 
     $views = array(
       'basic'     => 'Basics',
       'tracking'  => 'Tracking',
     );
 
     $this->repository = $repository;
 
     if (!isset($views[$this->view])) {
       $this->view = head_key($views);
     }
 
     $nav = new AphrontSideNavView();
     foreach ($views as $view => $name) {
       $nav->addNavItem(
         phutil_render_tag(
           'a',
           array(
             'class' => ($view == $this->view
               ? 'aphront-side-nav-selected'
               : null),
             'href'  => '/repository/edit/'.$repository->getID().'/'.$view.'/',
           ),
           phutil_escape_html($name)));
     }
 
+    $nav->appendChild($this->renderDaemonNotice());
+
     $this->sideNav = $nav;
 
     switch ($this->view) {
       case 'basic':
         return $this->processBasicRequest();
       case 'tracking':
         return $this->processTrackingRequest();
       default:
         throw new Exception("Unknown view.");
     }
   }
 
   protected function processBasicRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
     $repository = $this->repository;
     $repository_id = $repository->getID();
 
     $errors = array();
 
     $e_name = true;
 
     if ($request->isFormPost()) {
       $repository->setName($request->getStr('name'));
 
       if (!strlen($repository->getName())) {
         $e_name = 'Required';
         $errors[] = 'Repository name is required.';
       } else {
         $e_name = null;
       }
 
       $repository->setDetail('description', $request->getStr('description'));
       $repository->setDetail('encoding', $request->getStr('encoding'));
 
       if (!$errors) {
         $repository->save();
         return id(new AphrontRedirectResponse())
           ->setURI('/repository/edit/'.$repository_id.'/basic/?saved=true');
       }
     }
 
     $error_view = null;
     if ($errors) {
       $error_view = new AphrontErrorView();
       $error_view->setErrors($errors);
       $error_view->setTitle('Form Errors');
     } else if ($request->getStr('saved')) {
       $error_view = new AphrontErrorView();
       $error_view->setSeverity(AphrontErrorView::SEVERITY_NOTICE);
       $error_view->setTitle('Changes Saved');
       $error_view->appendChild(
         'Repository changes were saved.');
     }
 
     $encoding_doc_link = PhabricatorEnv::getDoclink(
         'article/User_Guide_UTF-8_and_Character_Encoding.html');
 
     $form = new AphrontFormView();
     $form
       ->setUser($user)
       ->setAction('/repository/edit/'.$repository->getID().'/')
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel('Name')
           ->setName('name')
           ->setValue($repository->getName())
           ->setError($e_name)
           ->setCaption('Human-readable repository name.'))
       ->appendChild(
         id(new AphrontFormTextAreaControl())
           ->setLabel('Description')
           ->setName('description')
           ->setHeight(AphrontFormTextAreaControl::HEIGHT_VERY_SHORT)
           ->setValue($repository->getDetail('description')))
       ->appendChild(
         id(new AphrontFormStaticControl())
           ->setLabel('Callsign')
           ->setName('callsign')
           ->setValue($repository->getCallsign()))
       ->appendChild('
         <p class="aphront-form-instructions">'.
           'If source code in this repository uses a character '.
           'encoding other than UTF-8 (for example, ISO-8859-1), '.
           'specify it here. You can usually leave this field blank. '.
           'See User Guide: '.
           '<a href="'.$encoding_doc_link.'">'.
             'UTF-8 and Character Encoding'.
           '</a> for more information.'.
         '</p>')
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setLabel('Encoding')
           ->setName('encoding')
           ->setValue($repository->getDetail('encoding')))
       ->appendChild(
         id(new AphrontFormStaticControl())
           ->setLabel('Type')
           ->setName('type')
           ->setValue($repository->getVersionControlSystem()))
       ->appendChild(
         id(new AphrontFormStaticControl())
           ->setLabel('ID')
           ->setValue($repository->getID()))
       ->appendChild(
         id(new AphrontFormStaticControl())
           ->setLabel('PHID')
           ->setValue($repository->getPHID()))
       ->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue('Save'));
 
     $panel = new AphrontPanelView();
     $panel->setHeader('Edit Repository');
     $panel->appendChild($form);
     $panel->setWidth(AphrontPanelView::WIDTH_FORM);
 
 
     $nav = $this->sideNav;
 
     $nav->appendChild($error_view);
     $nav->appendChild($panel);
 
     return $this->buildStandardPageResponse(
       $nav,
       array(
         'title' => 'Edit Repository',
       ));
   }
 
   private function processTrackingRequest() {
     $request = $this->getRequest();
     $user = $request->getUser();
     $repository = $this->repository;
     $repository_id = $repository->getID();
 
     $errors = array();
 
     $e_uri = null;
     $e_path = null;
 
     $is_git = false;
     $is_svn = false;
     $is_mercurial = false;
 
     $e_ssh_key = null;
     $e_ssh_keyfile = null;
     $e_branch = null;
 
     switch ($repository->getVersionControlSystem()) {
       case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
         $is_git = true;
         break;
       case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
         $is_svn = true;
         break;
       case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
         $is_mercurial = true;
         break;
       default:
         throw new Exception("Unsupported VCS!");
     }
 
     $has_branches       = ($is_git || $is_mercurial);
     $has_local          = ($is_git || $is_mercurial);
     $has_branch_filter  = ($is_git);
     $has_http_support   = $is_svn;
 
     if ($request->isFormPost()) {
       $tracking = ($request->getStr('tracking') == 'enabled' ? true : false);
       $repository->setDetail('tracking-enabled', $tracking);
       $repository->setDetail('remote-uri', $request->getStr('uri'));
       if ($has_local) {
         $repository->setDetail('local-path', $request->getStr('path'));
       }
 
       if ($has_branch_filter) {
         $branch_filter = $request->getStrList('branch-filter');
         $branch_filter = array_fill_keys($branch_filter, true);
 
         $repository->setDetail('branch-filter', $branch_filter);
       }
 
       $repository->setDetail(
         'pull-frequency',
         max(1, $request->getInt('frequency')));
 
       if ($has_branches) {
         $repository->setDetail(
           'default-branch',
           $request->getStr('default-branch'));
         if ($is_git) {
           $branch_name = $repository->getDetail('default-branch');
           if (strpos($branch_name, '/') !== false) {
             $e_branch = 'Invalid';
             $errors[] = "Your branch name should not specify an explicit ".
                         "remote. For instance, use 'master', not ".
                         "'origin/master'.";
           }
         }
       }
 
       $repository->setDetail(
         'default-owners-path',
         $request->getStr(
           'default-owners-path',
           '/'));
 
       $repository->setDetail('ssh-login', $request->getStr('ssh-login'));
       $repository->setDetail('ssh-key', $request->getStr('ssh-key'));
       $repository->setDetail('ssh-keyfile', $request->getStr('ssh-keyfile'));
 
       $repository->setDetail('http-login', $request->getStr('http-login'));
       $repository->setDetail('http-pass',  $request->getStr('http-pass'));
 
       if ($repository->getDetail('ssh-key') &&
           $repository->getDetail('ssh-keyfile')) {
         $errors[] =
           "Specify only one of 'SSH Private Key' and 'SSH Private Key File', ".
           "not both.";
         $e_ssh_key = 'Choose Only One';
         $e_ssh_keyfile = 'Choose Only One';
       }
 
       $repository->setDetail(
         'herald-disabled',
         $request->getInt('herald-disabled', 0));
 
       if ($is_svn) {
         $repository->setUUID($request->getStr('uuid'));
         $subpath = ltrim($request->getStr('svn-subpath'), '/');
         if ($subpath) {
           $subpath = rtrim($subpath, '/').'/';
         }
         $repository->setDetail('svn-subpath', $subpath);
       }
 
       $repository->setDetail(
         'detail-parser',
         $request->getStr(
           'detail-parser',
           'PhabricatorRepositoryDefaultCommitMessageDetailParser'));
 
       if ($tracking) {
         if (!$repository->getDetail('remote-uri')) {
           $e_uri = 'Required';
           $errors[] = "Repository URI is required.";
         } else if ($is_svn &&
           !preg_match('@/$@', $repository->getDetail('remote-uri'))) {
 
           $e_uri = 'Invalid';
           $errors[] = 'Subversion Repository Root must end in a slash ("/").';
         } else {
           $e_uri = null;
         }
 
         if ($has_local) {
           if (!$repository->getDetail('local-path')) {
             $e_path = 'Required';
             $errors[] = "Local path is required.";
           } else {
             $e_path = null;
           }
         }
       }
 
       if (!$errors) {
         $repository->save();
         return id(new AphrontRedirectResponse())
           ->setURI('/repository/edit/'.$repository_id.'/tracking/?saved=true');
       }
     }
 
     $error_view = null;
     if ($errors) {
       $error_view = new AphrontErrorView();
       $error_view->setErrors($errors);
       $error_view->setTitle('Form Errors');
     } else if ($request->getStr('saved')) {
       $error_view = new AphrontErrorView();
       $error_view->setSeverity(AphrontErrorView::SEVERITY_NOTICE);
       $error_view->setTitle('Changes Saved');
-      $error_view->appendChild(
-        'Tracking changes were saved. You may need to restart the daemon '.
-        'before changes will take effect.');
+      $error_view->appendChild('Tracking changes were saved.');
     } else if (!$repository->isTracked()) {
       $error_view = new AphrontErrorView();
       $error_view->setSeverity(AphrontErrorView::SEVERITY_WARNING);
       $error_view->setTitle('Repository Not Tracked');
       $error_view->appendChild(
         'Tracking is currently "Disabled" for this repository, so it will '.
         'not be imported into Phabricator. You can enable it below.');
     }
 
     switch ($repository->getVersionControlSystem()) {
       case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
         $is_git = true;
         break;
       case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
         $is_svn = true;
         break;
     }
 
     $doc_href = PhabricatorEnv::getDoclink('article/Diffusion_User_Guide.html');
     $user_guide_link = phutil_render_tag(
       'a',
       array(
         'href' => $doc_href,
       ),
       'Diffusion User Guide');
 
     $form = new AphrontFormView();
     $form
       ->setUser($user)
       ->setAction('/repository/edit/'.$repository->getID().'/tracking/')
       ->appendChild(
         '<p class="aphront-form-instructions">Phabricator can track '.
         'repositories, importing commits as they happen and notifying '.
         'Differential, Diffusion, Herald, and other services. To enable '.
         'tracking for a repository, configure it here and then start (or '.
         'restart) the daemons. More information is available in the '.
         '<strong>'.$user_guide_link.'</strong>.</p>');
 
     $form
       ->appendChild(
         id(new AphrontFormInsetView())
           ->setTitle('Basics')
           ->appendChild(id(new AphrontFormStaticControl())
             ->setLabel('Repository Name')
             ->setValue($repository->getName()))
           ->appendChild(id(new AphrontFormSelectControl())
             ->setName('tracking')
             ->setLabel('Tracking')
             ->setOptions(array(
                 'disabled'  => 'Disabled',
                 'enabled'   => 'Enabled',
                 ))
             ->setValue(
               $repository->isTracked()
               ? 'enabled'
               : 'disabled')));
 
     $inset = new AphrontFormInsetView();
     $inset->setTitle('Remote URI');
 
     $clone_command = null;
     $fetch_command = null;
     if ($is_git) {
       $clone_command = 'git clone';
       $fetch_command = 'git fetch';
     } else if ($is_mercurial) {
       $clone_command = 'hg clone';
       $fetch_command = 'hg pull';
     }
 
     $uri_label = 'Repository URI';
     if ($has_local) {
       if ($is_git) {
         $instructions =
           'Enter the URI to clone this repository from. It should look like '.
           '<tt>git@github.com:example/example.git</tt>, '.
           '<tt>ssh://user@host.com/git/example.git</tt>, or '.
           '<tt>file:///local/path/to/repo</tt>';
       } else if ($is_mercurial) {
         $instructions =
           'Enter the URI to clone this repository from. It should look '.
           'something like <tt>ssh://user@host.com/hg/example</tt>';
       }
       $inset->appendChild(
         '<p class="aphront-form-instructions">'.$instructions.'</p>');
     } else if ($is_svn) {
       $instructions =
         'Enter the <strong>Repository Root</strong> for this SVN repository. '.
         'You can figure this out by running <tt>svn info</tt> and looking at '.
         'the value in the <tt>Repository Root</tt> field. It should be a URI '.
         'and look like <tt>http://svn.example.org/svn/</tt> or '.
         '<tt>svn+ssh://svn.example.com/svnroot/</tt>';
       $inset->appendChild(
         '<p class="aphront-form-instructions">'.$instructions.'</p>');
       $uri_label = 'Repository Root';
     }
 
     $inset
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('uri')
           ->setLabel($uri_label)
           ->setID('remote-uri')
           ->setValue($repository->getDetail('remote-uri'))
           ->setError($e_uri));
 
     $inset->appendChild(
       '<div class="aphront-form-instructions">'.
         'If you want to connect to this repository over SSH, enter the '.
         'username and private key to use. You can leave these fields blank if '.
         'the repository does not use SSH.'.
       '</div>');
 
     $inset
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('ssh-login')
           ->setLabel('SSH User')
           ->setValue($repository->getDetail('ssh-login')))
       ->appendChild(
         id(new AphrontFormTextAreaControl())
           ->setName('ssh-key')
           ->setLabel('SSH Private Key')
           ->setHeight(AphrontFormTextAreaControl::HEIGHT_VERY_SHORT)
           ->setValue($repository->getDetail('ssh-key'))
           ->setError($e_ssh_key)
           ->setCaption('Specify the entire private key, <em>or</em>...'))
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('ssh-keyfile')
           ->setLabel('SSH Private Key File')
           ->setValue($repository->getDetail('ssh-keyfile'))
           ->setError($e_ssh_keyfile)
           ->setCaption(
             '...specify a path on disk where the daemon should '.
             'look for a private key.'));
 
     if ($has_http_support) {
       $inset
         ->appendChild(
           '<div class="aphront-form-instructions">'.
             'If you want to connect to this repository over HTTP Basic Auth, '.
             'enter the username and password to use. You can leave these '.
             'fields blank if the repository does not use HTTP Basic Auth.'.
           '</div>')
         ->appendChild(
           id(new AphrontFormTextControl())
             ->setName('http-login')
             ->setLabel('HTTP Basic Login')
             ->setValue($repository->getDetail('http-login')))
         ->appendChild(
           id(new AphrontFormPasswordControl())
             ->setName('http-pass')
             ->setLabel('HTTP Basic Password')
             ->setValue($repository->getDetail('http-pass')));
     }
 
     $inset
       ->appendChild(
         '<div class="aphront-form-important">'.
           'To test your authentication configuration, <strong>save this '.
           'form</strong> and then run this script:'.
           '<code>'.
             'phabricator/ $ ./scripts/repository/test_connection.php '.
             phutil_escape_html($repository->getCallsign()).
           '</code>'.
           'This will verify that your configuration is correct and the '.
           'daemons can connect to the remote repository and pull changes '.
           'from it.'.
         '</div>');
 
     $form->appendChild($inset);
 
     $inset = new AphrontFormInsetView();
     $inset->setTitle('Repository Information');
 
     if ($has_local) {
       $inset->appendChild(
         '<p class="aphront-form-instructions">Select a path on local disk '.
         'which the daemons should <tt>'.$clone_command.'</tt> the repository '.
         'into. This must be readable and writable by the daemons, and '.
         'readable by the webserver. The daemons will <tt>'.$fetch_command.
         '</tt> and keep this repository up to date.</p>');
       $inset->appendChild(
         id(new AphrontFormTextControl())
           ->setName('path')
           ->setLabel('Local Path')
           ->setValue($repository->getDetail('local-path'))
           ->setError($e_path));
     } else if ($is_svn) {
       $inset->appendChild(
         '<p class="aphront-form-instructions">If you only want to parse one '.
         'subpath of the repository, specify it here, relative to the '.
         'repository root (e.g., <tt>trunk/</tt> or <tt>projects/wheel/</tt>). '.
         'If you want to parse multiple subdirectories, create a separate '.
         'Phabricator repository for each one.</p>');
       $inset->appendChild(
         id(new AphrontFormTextControl())
           ->setName('svn-subpath')
           ->setLabel('Subpath')
           ->setValue($repository->getDetail('svn-subpath'))
           ->setError($e_path));
     }
 
     if ($has_branch_filter) {
       $branch_filter_str = implode(
         ', ',
         array_keys($repository->getDetail('branch-filter', array())));
       $inset
         ->appendChild(
           id(new AphrontFormTextControl())
             ->setName('branch-filter')
             ->setLabel('Track Only')
             ->setValue($branch_filter_str)
             ->setCaption(
               'Optional list of branches to track. Other branches will be '.
               'completely ignored. If left empty, all branches are tracked. '.
               'Example: <tt>master, release</tt>'));
     }
 
     $inset
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('frequency')
           ->setLabel('Pull Frequency')
           ->setValue($repository->getDetail('pull-frequency', 15))
           ->setCaption(
             'Number of seconds daemon should sleep between requests. Larger '.
             'numbers reduce load but also decrease responsiveness.'));
 
     $form->appendChild($inset);
 
     $inset = new AphrontFormInsetView();
     $inset->setTitle('Application Configuration');
 
     if ($has_branches) {
 
       $default_branch_name = null;
       if ($is_mercurial) {
         $default_branch_name = 'default';
       } else if ($is_git) {
         $default_branch_name = 'master';
       }
 
       $inset
         ->appendChild(
           id(new AphrontFormTextControl())
             ->setName('default-branch')
             ->setLabel('Default Branch')
             ->setValue(
               $repository->getDetail(
                 'default-branch',
                 $default_branch_name))
             ->setError($e_branch)
             ->setCaption(
               'Default branch to show in Diffusion.'));
     }
 
     $inset
       ->appendChild(
         id(new AphrontFormTextControl())
           ->setName('default-owners-path')
           ->setLabel('Default Owners Path')
           ->setValue(
             $repository->getDetail(
               'default-owners-path',
               '/'))
           ->setCaption('Default path in Owners tool.'));
 
     $inset
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('herald-disabled')
           ->setLabel('Herald Enabled')
           ->setValue($repository->getDetail('herald-disabled', 0))
           ->setOptions(
             array(
               0 => 'Enabled - Send Email',
               1 => 'Disabled - Do Not Send Email',
             ))
           ->setCaption(
             'You can temporarily disable Herald commit notifications when '.
             'reparsing a repository or importing a new repository.'));
 
     $parsers = id(new PhutilSymbolLoader())
       ->setAncestorClass('PhabricatorRepositoryCommitMessageDetailParser')
       ->selectSymbolsWithoutLoading();
     $parsers = ipull($parsers, 'name', 'name');
 
     $inset
       ->appendChild(
         '<p class="aphront-form-instructions">If you extend the commit '.
         'message format, you can provide a new parser which will extract '.
         'extra information from it when commits are imported. This is an '.
         'advanced feature, and using the default parser will be suitable '.
         'in most cases.</p>')
       ->appendChild(
         id(new AphrontFormSelectControl())
           ->setName('detail-parser')
           ->setLabel('Detail Parser')
           ->setOptions($parsers)
           ->setValue(
             $repository->getDetail(
               'detail-parser',
               'PhabricatorRepositoryDefaultCommitMessageDetailParser')));
 
     if ($is_svn) {
       $inset
         ->appendChild(
           id(new AphrontFormTextControl())
             ->setName('uuid')
             ->setLabel('UUID')
             ->setValue($repository->getUUID())
             ->setCaption('Repository UUID from <tt>svn info</tt>.'));
     }
 
     $form->appendChild($inset);
 
     $form
       ->appendChild(
         id(new AphrontFormSubmitControl())
           ->setValue('Save Configuration'));
 
     $panel = new AphrontPanelView();
     $panel->setHeader('Repository Tracking');
     $panel->appendChild($form);
     $panel->setWidth(AphrontPanelView::WIDTH_WIDE);
 
     $nav = $this->sideNav;
     $nav->appendChild($error_view);
     $nav->appendChild($panel);
 
     return $this->buildStandardPageResponse(
       $nav,
       array(
         'title' => 'Edit Repository Tracking',
       ));
   }
 
 }
diff --git a/src/applications/repository/controller/list/PhabricatorRepositoryListController.php b/src/applications/repository/controller/list/PhabricatorRepositoryListController.php
index e2c2bf112..e2ed76284 100644
--- a/src/applications/repository/controller/list/PhabricatorRepositoryListController.php
+++ b/src/applications/repository/controller/list/PhabricatorRepositoryListController.php
@@ -1,168 +1,169 @@
 <?php
 
 /*
  * Copyright 2012 Facebook, Inc.
  *
  * Licensed 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.
  */
 
 final class PhabricatorRepositoryListController
   extends PhabricatorRepositoryController {
 
   public function shouldRequireAdmin() {
     return false;
   }
 
   public function processRequest() {
 
     $request = $this->getRequest();
     $user = $request->getUser();
     $is_admin = $user->getIsAdmin();
 
     $repos = id(new PhabricatorRepository())->loadAll();
 
     $rows = array();
     foreach ($repos as $repo) {
 
       if ($repo->isTracked()) {
         $diffusion_link = phutil_render_tag(
           'a',
           array(
             'href' => '/diffusion/'.$repo->getCallsign().'/',
           ),
           'View in Diffusion');
       } else {
         $diffusion_link = '<em>Not Tracked</em>';
       }
 
       $rows[] = array(
         phutil_escape_html($repo->getCallsign()),
         phutil_escape_html($repo->getName()),
         PhabricatorRepositoryType::getNameForRepositoryType(
           $repo->getVersionControlSystem()),
         $diffusion_link,
         phutil_render_tag(
           'a',
           array(
             'class' => 'button small grey',
             'href'  => '/repository/edit/'.$repo->getID().'/',
           ),
           'Edit'),
         javelin_render_tag(
           'a',
           array(
             'class' => 'button small grey',
             'href'  => '/repository/delete/'.$repo->getID().'/',
             'sigil' => 'workflow',
           ),
           'Delete'),
       );
     }
 
     $table = new AphrontTableView($rows);
     $table->setHeaders(
       array(
         'Callsign',
         'Repository',
         'Type',
         'Diffusion',
         '',
         ''
       ));
     $table->setColumnClasses(
       array(
         null,
         'wide',
         null,
         null,
         'action',
         'action',
       ));
 
     $table->setColumnVisibility(
       array(
         true,
         true,
         true,
         true,
         $is_admin,
         $is_admin,
       ));
 
     $panel = new AphrontPanelView();
     $panel->setHeader('Repositories');
     if ($is_admin) {
       $panel->setCreateButton('Create New Repository', '/repository/create/');
     }
     $panel->appendChild($table);
 
     $projects = id(new PhabricatorRepositoryArcanistProject())->loadAll();
 
     $rows = array();
     foreach ($projects as $project) {
       $repo = idx($repos, $project->getRepositoryID());
       if ($repo) {
         $repo_name = phutil_escape_html($repo->getName());
       } else {
         $repo_name = '-';
       }
 
       $rows[] = array(
         phutil_escape_html($project->getName()),
         $repo_name,
         phutil_render_tag(
           'a',
           array(
             'href' => '/repository/project/'.$project->getID().'/',
             'class' => 'button grey small',
           ),
           'Edit'),
       );
     }
 
     $project_table = new AphrontTableView($rows);
     $project_table->setHeaders(
       array(
         'Project ID',
         'Repository',
         '',
       ));
     $project_table->setColumnClasses(
       array(
         '',
         'wide',
         'action',
       ));
 
     $project_table->setColumnVisibility(
       array(
         true,
         true,
         $is_admin,
       ));
 
     $project_panel = new AphrontPanelView();
     $project_panel->setHeader('Arcanist Projects');
     $project_panel->appendChild($project_table);
 
     return $this->buildStandardPageResponse(
       array(
+        $this->renderDaemonNotice(),
         $panel,
         $project_panel,
       ),
       array(
         'title' => 'Repository List',
       ));
   }
 
 }
diff --git a/src/applications/repository/daemon/base/PhabricatorRepositoryDaemon.php b/src/applications/repository/daemon/base/PhabricatorRepositoryDaemon.php
deleted file mode 100644
index e9f2a3531..000000000
--- a/src/applications/repository/daemon/base/PhabricatorRepositoryDaemon.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/*
- * Copyright 2011 Facebook, Inc.
- *
- * Licensed 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.
- */
-
-abstract class PhabricatorRepositoryDaemon extends PhabricatorDaemon {
-
-  protected function loadRepository() {
-    $argv = $this->getArgv();
-    if (count($argv) !== 1) {
-      throw new Exception("No repository PHID provided!");
-    }
-
-    $repository = id(new PhabricatorRepository())->loadOneWhere(
-      'phid = %s',
-      $argv[0]);
-
-    if (!$repository) {
-      throw new Exception("No such repository exists!");
-    }
-
-    return $repository;
-  }
-
-}
diff --git a/src/applications/repository/daemon/base/__init__.php b/src/applications/repository/daemon/base/__init__.php
deleted file mode 100644
index 97230a3be..000000000
--- a/src/applications/repository/daemon/base/__init__.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-/**
- * This file is automatically generated. Lint this module to rebuild it.
- * @generated
- */
-
-
-
-phutil_require_module('phabricator', 'applications/repository/storage/repository');
-phutil_require_module('phabricator', 'infrastructure/daemon/base');
-
-phutil_require_module('phutil', 'utils');
-
-
-phutil_require_source('PhabricatorRepositoryDaemon.php');
diff --git a/src/applications/repository/daemon/commitdiscovery/base/PhabricatorRepositoryCommitDiscoveryDaemon.php b/src/applications/repository/daemon/commitdiscovery/base/PhabricatorRepositoryCommitDiscoveryDaemon.php
deleted file mode 100644
index c4d60a6d9..000000000
--- a/src/applications/repository/daemon/commitdiscovery/base/PhabricatorRepositoryCommitDiscoveryDaemon.php
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-/*
- * Copyright 2012 Facebook, Inc.
- *
- * Licensed 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.
- */
-
-abstract class PhabricatorRepositoryCommitDiscoveryDaemon
-  extends PhabricatorRepositoryDaemon {
-
-  private $repository;
-  private $commitCache = array();
-
-  final protected function getRepository() {
-    return $this->repository;
-  }
-
-  final public function run() {
-    while (true) {
-      // Reload the repository every time to pick up changes from the web
-      // console.
-      $this->repository = $this->loadRepository();
-      $this->discoverCommits();
-
-      $sleep = max(2, $this->getRepository()->getDetail('pull-frequency'));
-      $this->sleep($sleep);
-    }
-  }
-
-  final public function runOnce() {
-    $this->repository = $this->loadRepository();
-    $this->discoverCommits();
-  }
-
-  protected function isKnownCommit($target) {
-    if (isset($this->commitCache[$target])) {
-      return true;
-    }
-
-    $commit = id(new PhabricatorRepositoryCommit())->loadOneWhere(
-      'repositoryID = %s AND commitIdentifier = %s',
-      $this->getRepository()->getID(),
-      $target);
-
-    if (!$commit) {
-      return false;
-    }
-
-    $this->commitCache[$target] = true;
-    while (count($this->commitCache) > 64) {
-      array_shift($this->commitCache);
-    }
-
-    return true;
-  }
-
-  protected function recordCommit($commit_identifier, $epoch) {
-    $repository = $this->getRepository();
-
-    $commit = new PhabricatorRepositoryCommit();
-    $commit->setRepositoryID($repository->getID());
-    $commit->setCommitIdentifier($commit_identifier);
-    $commit->setEpoch($epoch);
-
-    try {
-      $commit->save();
-      $event = new PhabricatorTimelineEvent(
-        'cmit',
-        array(
-          'id' => $commit->getID(),
-        ));
-      $event->recordEvent();
-
-      queryfx(
-        $repository->establishConnection('w'),
-        'INSERT INTO %T (repositoryID, size, lastCommitID, epoch)
-          VALUES (%d, 1, %d, %d)
-          ON DUPLICATE KEY UPDATE
-            size = size + 1,
-            lastCommitID =
-              IF(VALUES(epoch) > epoch, VALUES(lastCommitID), lastCommitID),
-            epoch = IF(VALUES(epoch) > epoch, VALUES(epoch), epoch)',
-        PhabricatorRepository::TABLE_SUMMARY,
-        $repository->getID(),
-        $commit->getID(),
-        $epoch);
-
-      $this->commitCache[$commit_identifier] = true;
-    } catch (AphrontQueryDuplicateKeyException $ex) {
-      // Ignore. This can happen because we discover the same new commit
-      // more than once when looking at history, or because of races or
-      // data inconsistency or cosmic radiation; in any case, we're still
-      // in a good state if we ignore the failure.
-      $this->commitCache[$commit_identifier] = true;
-    }
-
-    $this->stillWorking();
-  }
-
-  abstract protected function discoverCommits();
-
-}
diff --git a/src/applications/repository/daemon/commitdiscovery/base/__init__.php b/src/applications/repository/daemon/commitdiscovery/base/__init__.php
deleted file mode 100644
index d26ee49b1..000000000
--- a/src/applications/repository/daemon/commitdiscovery/base/__init__.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-/**
- * This file is automatically generated. Lint this module to rebuild it.
- * @generated
- */
-
-
-
-phutil_require_module('phabricator', 'applications/repository/daemon/base');
-phutil_require_module('phabricator', 'applications/repository/storage/commit');
-phutil_require_module('phabricator', 'applications/repository/storage/repository');
-phutil_require_module('phabricator', 'infrastructure/daemon/timeline/storage/event');
-phutil_require_module('phabricator', 'storage/queryfx');
-
-phutil_require_module('phutil', 'utils');
-
-
-phutil_require_source('PhabricatorRepositoryCommitDiscoveryDaemon.php');
diff --git a/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php b/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php
deleted file mode 100644
index ee6d09fbb..000000000
--- a/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php
+++ /dev/null
@@ -1,162 +0,0 @@
-<?php
-
-/*
- * Copyright 2012 Facebook, Inc.
- *
- * Licensed 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.
- */
-
-final class PhabricatorRepositoryGitCommitDiscoveryDaemon
-  extends PhabricatorRepositoryCommitDiscoveryDaemon {
-
-  protected function discoverCommits() {
-    // NOTE: PhabricatorRepositoryGitFetchDaemon does the actual pulls, this
-    // just parses HEAD.
-
-    $repository = $this->getRepository();
-
-    $vcs = $repository->getVersionControlSystem();
-    if ($vcs != PhabricatorRepositoryType::REPOSITORY_TYPE_GIT) {
-      throw new Exception("Repository is not a git repository.");
-    }
-
-    list($remotes) = $repository->execxLocalCommand(
-      'remote show -n origin');
-
-    $matches = null;
-    if (!preg_match('/^\s*Fetch URL:\s*(.*?)\s*$/m', $remotes, $matches)) {
-      throw new Exception(
-        "Expected 'Fetch URL' in 'git remote show -n origin'.");
-    }
-
-    self::verifySameGitOrigin(
-      $matches[1],
-      $repository->getRemoteURI(),
-      $repository->getLocalPath());
-
-    list($stdout) = $repository->execxLocalCommand(
-      'branch -r --verbose --no-abbrev');
-
-    $branches = DiffusionGitBranchQuery::parseGitRemoteBranchOutput(
-      $stdout,
-      $only_this_remote = DiffusionBranchInformation::DEFAULT_GIT_REMOTE);
-
-    $got_something = false;
-    $tracked_something = false;
-    foreach ($branches as $name => $commit) {
-      if (!$repository->shouldTrackBranch($name)) {
-        continue;
-      }
-
-      $tracked_something = true;
-
-      if ($this->isKnownCommit($commit)) {
-        continue;
-      } else {
-        $this->discoverCommit($commit);
-        $got_something = true;
-      }
-    }
-
-    if (!$tracked_something) {
-      $repo_name = $repository->getName();
-      $repo_callsign = $repository->getCallsign();
-      throw new Exception(
-        "Repository r{$repo_callsign} '{$repo_name}' has no tracked branches! ".
-        "Verify that your branch filtering settings are correct.");
-    }
-
-    return $got_something;
-  }
-
-  private function discoverCommit($commit) {
-    $discover = array();
-    $insert = array();
-
-    $repository = $this->getRepository();
-
-    $discover[] = $commit;
-    $insert[] = $commit;
-
-    $seen_parent = array();
-
-    while (true) {
-      $target = array_pop($discover);
-      list($parents) = $repository->execxLocalCommand(
-        'log -n1 --pretty="%%P" %s',
-        $target);
-      $parents = array_filter(explode(' ', trim($parents)));
-      foreach ($parents as $parent) {
-        if (isset($seen_parent[$parent])) {
-          // We end up in a loop here somehow when we parse Arcanist if we
-          // don't do this. TODO: Figure out why and draw a pretty diagram
-          // since it's not evident how parsing a DAG with this causes the
-          // loop to stop terminating.
-          continue;
-        }
-        $seen_parent[$parent] = true;
-        if (!$this->isKnownCommit($parent)) {
-          $discover[] = $parent;
-          $insert[] = $parent;
-        }
-      }
-      if (empty($discover)) {
-        break;
-      }
-      $this->stillWorking();
-    }
-
-    while (true) {
-      $target = array_pop($insert);
-      list($epoch) = $repository->execxLocalCommand(
-        'log -n1 --pretty="%%ct" %s',
-        $target);
-      $epoch = trim($epoch);
-
-      $this->recordCommit($target, $epoch);
-
-      if (empty($insert)) {
-        break;
-      }
-    }
-  }
-
-  public static function verifySameGitOrigin($remote, $expect, $where) {
-    $remote_uri = PhabricatorRepository::newPhutilURIFromGitURI($remote);
-    $expect_uri = PhabricatorRepository::newPhutilURIFromGitURI($expect);
-
-    $remote_path = $remote_uri->getPath();
-    $expect_path = $expect_uri->getPath();
-
-    $remote_match = self::normalizeGitPath($remote_path);
-    $expect_match = self::normalizeGitPath($expect_path);
-
-    if ($remote_match != $expect_match) {
-      throw new Exception(
-        "Working copy at '{$where}' has a mismatched origin URL. It has ".
-        "origin URL '{$remote}' (with remote path '{$remote_path}'), but the ".
-        "configured URL '{$expect}' (with remote path '{$expect_path}') is ".
-        "expected. Refusing to proceed because this may indicate that the ".
-        "working copy is actually some other repository.");
-    }
-  }
-
-  private static function normalizeGitPath($path) {
-    // Strip away trailing "/" and ".git", so similar paths correctly match.
-
-    $path = rtrim($path, '/');
-    $path = preg_replace('/\.git$/', '', $path);
-    return $path;
-  }
-
-}
diff --git a/src/applications/repository/daemon/commitdiscovery/git/__init__.php b/src/applications/repository/daemon/commitdiscovery/git/__init__.php
deleted file mode 100644
index f06c780f9..000000000
--- a/src/applications/repository/daemon/commitdiscovery/git/__init__.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-/**
- * This file is automatically generated. Lint this module to rebuild it.
- * @generated
- */
-
-
-
-phutil_require_module('phabricator', 'applications/diffusion/data/branch');
-phutil_require_module('phabricator', 'applications/diffusion/query/branch/git');
-phutil_require_module('phabricator', 'applications/repository/constants/repositorytype');
-phutil_require_module('phabricator', 'applications/repository/daemon/commitdiscovery/base');
-phutil_require_module('phabricator', 'applications/repository/storage/repository');
-
-
-phutil_require_source('PhabricatorRepositoryGitCommitDiscoveryDaemon.php');
diff --git a/src/applications/repository/daemon/commitdiscovery/mercurial/PhabricatorRepositoryMercurialCommitDiscoveryDaemon.php b/src/applications/repository/daemon/commitdiscovery/mercurial/PhabricatorRepositoryMercurialCommitDiscoveryDaemon.php
deleted file mode 100644
index 6094d3a0f..000000000
--- a/src/applications/repository/daemon/commitdiscovery/mercurial/PhabricatorRepositoryMercurialCommitDiscoveryDaemon.php
+++ /dev/null
@@ -1,137 +0,0 @@
-<?php
-
-/*
- * Copyright 2012 Facebook, Inc.
- *
- * Licensed 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.
- */
-
-final class PhabricatorRepositoryMercurialCommitDiscoveryDaemon
-  extends PhabricatorRepositoryCommitDiscoveryDaemon {
-
-  protected function discoverCommits() {
-    $repository = $this->getRepository();
-
-    $vcs = $repository->getVersionControlSystem();
-    if ($vcs != PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL) {
-      throw new Exception("Repository is not a Mercurial repository.");
-    }
-
-    $repository_phid = $repository->getPHID();
-
-    list($stdout) = $repository->execxLocalCommand('branches');
-
-    $branches = ArcanistMercurialParser::parseMercurialBranches($stdout);
-    $got_something = false;
-    foreach ($branches as $name => $branch) {
-      $commit = $branch['rev'];
-      $commit = $this->getFullHash($commit);
-      if ($this->isKnownCommit($commit)) {
-        continue;
-      } else {
-        $this->discoverCommit($commit);
-        $got_something = true;
-      }
-    }
-
-    return $got_something;
-  }
-
-  private function getFullHash($commit) {
-
-    // NOTE: Mercurial shortens hashes to 12 characters by default. This
-    // implies collisions with as few as a few million commits. The
-    // documentation sensibly advises "Do not use short-form IDs for
-    // long-lived representations". It then continues "You can use the
-    // --debug option to display the full changeset ID". What?! Yes, this
-    // is in fact the only way to turn on full hashes, and the hg source
-    // code is littered with "hexfn = ui.debugflag and hex or short" and
-    // similar. There is no more-selective flag or config option.
-    //
-    // Unfortunately, "hg --debug" turns on tons of other extra output,
-    // including full commit messages in "hg log" and "hg parents" (which
-    // ignore --style); this renders them unparseable. So we have to use
-    // "hg id" to convert short hashes into full hashes. See:
-    //
-    // <http://mercurial.selenic.com/wiki/ChangeSetID>
-    //
-    // Of course, this means that if there are collisions we will break here
-    // (the short commit identifier won't be unambiguous) but maybe Mercurial
-    // will have a --full-hashes flag or something by then and we can fix it
-    // properly. Until we run into that, this allows us to store data in the
-    // right format so when we eventually encounter this we won't have to
-    // reparse every Mercurial repository.
-
-    $repository = $this->getRepository();
-    list($stdout) = $repository->execxLocalCommand(
-      'id --debug -i --rev %s',
-      $commit);
-    return trim($stdout);
-  }
-
-  private function discoverCommit($commit) {
-    $discover = array();
-    $insert = array();
-
-    $repository = $this->getRepository();
-
-    $discover[] = $commit;
-    $insert[] = $commit;
-
-    $seen_parent = array();
-
-    // For all the new commits at the branch heads, walk backward until we find
-    // only commits we've aleady seen.
-    while (true) {
-      $target = array_pop($discover);
-      list($stdout) = $repository->execxLocalCommand(
-        'parents --style default --rev %s',
-        $target);
-      $parents = ArcanistMercurialParser::parseMercurialLog($stdout);
-      if ($parents) {
-        foreach ($parents as $parent) {
-          $parent_commit = $parent['rev'];
-          $parent_commit = $this->getFullHash($parent_commit);
-          if (isset($seen_parent[$parent_commit])) {
-            continue;
-          }
-          $seen_parent[$parent_commit] = true;
-          if (!$this->isKnownCommit($parent_commit)) {
-            $discover[] = $parent_commit;
-            $insert[] = $parent_commit;
-          }
-        }
-      }
-      if (empty($discover)) {
-        break;
-      }
-      $this->stillWorking();
-    }
-
-    while (true) {
-      $target = array_pop($insert);
-      list($stdout) = $repository->execxLocalCommand(
-        'log --rev %s --template %s',
-        $target,
-        '{date|rfc822date}');
-      $epoch = strtotime($stdout);
-
-      $this->recordCommit($target, $epoch);
-
-      if (empty($insert)) {
-        break;
-      }
-    }
-  }
-
-}
diff --git a/src/applications/repository/daemon/commitdiscovery/mercurial/__init__.php b/src/applications/repository/daemon/commitdiscovery/mercurial/__init__.php
deleted file mode 100644
index e18b3c394..000000000
--- a/src/applications/repository/daemon/commitdiscovery/mercurial/__init__.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-/**
- * This file is automatically generated. Lint this module to rebuild it.
- * @generated
- */
-
-
-
-phutil_require_module('arcanist', 'repository/parser/mercurial');
-
-phutil_require_module('phabricator', 'applications/repository/constants/repositorytype');
-phutil_require_module('phabricator', 'applications/repository/daemon/commitdiscovery/base');
-
-
-phutil_require_source('PhabricatorRepositoryMercurialCommitDiscoveryDaemon.php');
diff --git a/src/applications/repository/daemon/commitdiscovery/svn/PhabricatorRepositorySvnCommitDiscoveryDaemon.php b/src/applications/repository/daemon/commitdiscovery/svn/PhabricatorRepositorySvnCommitDiscoveryDaemon.php
deleted file mode 100644
index c3a7a2fbf..000000000
--- a/src/applications/repository/daemon/commitdiscovery/svn/PhabricatorRepositorySvnCommitDiscoveryDaemon.php
+++ /dev/null
@@ -1,123 +0,0 @@
-<?php
-
-/*
- * Copyright 2012 Facebook, Inc.
- *
- * Licensed 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.
- */
-
-final class PhabricatorRepositorySvnCommitDiscoveryDaemon
-  extends PhabricatorRepositoryCommitDiscoveryDaemon {
-
-  protected function discoverCommits() {
-    $repository = $this->getRepository();
-
-    $vcs = $repository->getVersionControlSystem();
-    if ($vcs != PhabricatorRepositoryType::REPOSITORY_TYPE_SVN) {
-      throw new Exception("Repository is not a svn repository.");
-    }
-
-    $uri = $this->getBaseSVNLogURI();
-    list($xml) = $repository->execxRemoteCommand(
-      'log --xml --quiet --limit 1 %s@HEAD',
-      $uri);
-
-    $results = $this->parseSVNLogXML($xml);
-    $commit = head_key($results);
-    $epoch  = head($results);
-
-    if ($this->isKnownCommit($commit)) {
-      return false;
-    }
-
-    $this->discoverCommit($commit, $epoch);
-
-    return true;
-  }
-
-  private function discoverCommit($commit, $epoch) {
-    $uri = $this->getBaseSVNLogURI();
-    $repository = $this->getRepository();
-
-    $discover = array(
-      $commit => $epoch,
-    );
-    $upper_bound = $commit;
-
-    $limit = 1;
-    while ($upper_bound > 1 && !$this->isKnownCommit($upper_bound)) {
-      // Find all the unknown commits on this path. Note that we permit
-      // importing an SVN subdirectory rather than the entire repository, so
-      // commits may be nonsequential.
-      list($err, $xml, $stderr) = $repository->execRemoteCommand(
-        ' log --xml --quiet --limit %d %s@%d',
-        $limit,
-        $uri,
-        $upper_bound - 1);
-      if ($err) {
-        if (preg_match('/(path|File) not found/', $stderr)) {
-          // We've gone all the way back through history and this path was not
-          // affected by earlier commits.
-          break;
-        } else {
-          throw new Exception("svn log error #{$err}: {$stderr}");
-        }
-      }
-      $discover += $this->parseSVNLogXML($xml);
-
-      $upper_bound = min(array_keys($discover));
-
-      // Discover 2, 4, 8, ... 256 logs at a time. This allows us to initially
-      // import large repositories fairly quickly, while pulling only as much
-      // data as we need in the common case (when we've already imported the
-      // repository and are just grabbing one commit at a time).
-      $limit = min($limit * 2, 256);
-    }
-
-    // NOTE: We do writes only after discovering all the commits so that we're
-    // never left in a state where we've missed commits -- if the discovery
-    // script terminates it can always resume and restore the import to a good
-    // state. This is also why we sort the discovered commits so we can do
-    // writes forward from the smallest one.
-
-    ksort($discover);
-    foreach ($discover as $commit => $epoch) {
-      $this->recordCommit($commit, $epoch);
-    }
-  }
-
-  private function parseSVNLogXML($xml) {
-    $xml = phutil_utf8ize($xml);
-
-    $result = array();
-
-    $log = new SimpleXMLElement($xml);
-    foreach ($log->logentry as $entry) {
-      $commit = (int)$entry['revision'];
-      $epoch  = (int)strtotime((string)$entry->date[0]);
-      $result[$commit] = $epoch;
-    }
-
-    return $result;
-  }
-
-
-  private function getBaseSVNLogURI() {
-    $repository = $this->getRepository();
-
-    $uri = $repository->getDetail('remote-uri');
-    $subpath = $repository->getDetail('svn-subpath');
-
-    return $uri.$subpath;
-  }
-}
diff --git a/src/applications/repository/daemon/commitdiscovery/svn/__init__.php b/src/applications/repository/daemon/commitdiscovery/svn/__init__.php
deleted file mode 100644
index e8b0dd6f2..000000000
--- a/src/applications/repository/daemon/commitdiscovery/svn/__init__.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-/**
- * This file is automatically generated. Lint this module to rebuild it.
- * @generated
- */
-
-
-
-phutil_require_module('phabricator', 'applications/repository/constants/repositorytype');
-phutil_require_module('phabricator', 'applications/repository/daemon/commitdiscovery/base');
-
-phutil_require_module('phutil', 'utils');
-
-
-phutil_require_source('PhabricatorRepositorySvnCommitDiscoveryDaemon.php');
diff --git a/src/applications/repository/daemon/committask/PhabricatorRepositoryCommitTaskDaemon.php b/src/applications/repository/daemon/committask/PhabricatorRepositoryCommitTaskDaemon.php
index 0a041ee1e..4773feac9 100644
--- a/src/applications/repository/daemon/committask/PhabricatorRepositoryCommitTaskDaemon.php
+++ b/src/applications/repository/daemon/committask/PhabricatorRepositoryCommitTaskDaemon.php
@@ -1,80 +1,80 @@
 <?php
 
 /*
  * Copyright 2012 Facebook, Inc.
  *
  * Licensed 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.
  */
 
 final class PhabricatorRepositoryCommitTaskDaemon
-  extends PhabricatorRepositoryDaemon {
+  extends PhabricatorDaemon {
 
   final public function run() {
     do {
       $iterator = new PhabricatorTimelineIterator('cmittask', array('cmit'));
       foreach ($iterator as $event) {
         $data = $event->getData();
 
         if (!$data) {
           // TODO: This event can't be processed, provide some way to
           // communicate that?
           continue;
         }
 
         $commit = id(new PhabricatorRepositoryCommit())->load($data['id']);
         if (!$commit) {
           // TODO: Same as above.
           continue;
         }
 
         // TODO: Cache these.
         $repository = id(new PhabricatorRepository())->load(
           $commit->getRepositoryID());
         if (!$repository) {
           // TODO: As above, although this almost certainly means the user just
           // deleted the repository and we're correct to ignore the event in
           // the timeline.
           continue;
         }
 
         $vcs = $repository->getVersionControlSystem();
         switch ($vcs) {
           case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
             $class = 'PhabricatorRepositoryGitCommitMessageParserWorker';
             break;
           case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
             $class = 'PhabricatorRepositorySvnCommitMessageParserWorker';
             break;
           case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
             $class = 'PhabricatorRepositoryMercurialCommitMessageParserWorker';
             break;
           default:
             throw new Exception("Unknown repository type.");
         }
 
         $task = new PhabricatorWorkerTask();
         $task->setTaskClass($class);
         $task->setData(
           array(
             'commitID' => $commit->getID(),
           ));
         $task->save();
 
         $this->stillWorking();
       }
       sleep(1);
       $this->stillWorking();
     } while (true);
   }
 
 }
diff --git a/src/applications/repository/daemon/committask/__init__.php b/src/applications/repository/daemon/committask/__init__.php
index 3e85d352f..cbcfacde8 100644
--- a/src/applications/repository/daemon/committask/__init__.php
+++ b/src/applications/repository/daemon/committask/__init__.php
@@ -1,19 +1,19 @@
 <?php
 /**
  * This file is automatically generated. Lint this module to rebuild it.
  * @generated
  */
 
 
 
 phutil_require_module('phabricator', 'applications/repository/constants/repositorytype');
-phutil_require_module('phabricator', 'applications/repository/daemon/base');
 phutil_require_module('phabricator', 'applications/repository/storage/commit');
 phutil_require_module('phabricator', 'applications/repository/storage/repository');
+phutil_require_module('phabricator', 'infrastructure/daemon/base');
 phutil_require_module('phabricator', 'infrastructure/daemon/timeline/cursor/iterator');
 phutil_require_module('phabricator', 'infrastructure/daemon/workers/storage/task');
 
 phutil_require_module('phutil', 'utils');
 
 
 phutil_require_source('PhabricatorRepositoryCommitTaskDaemon.php');
diff --git a/src/applications/repository/daemon/pulllocal/PhabricatorRepositoryPullLocalDaemon.php b/src/applications/repository/daemon/pulllocal/PhabricatorRepositoryPullLocalDaemon.php
index fd001910c..d4e16df73 100644
--- a/src/applications/repository/daemon/pulllocal/PhabricatorRepositoryPullLocalDaemon.php
+++ b/src/applications/repository/daemon/pulllocal/PhabricatorRepositoryPullLocalDaemon.php
@@ -1,309 +1,781 @@
 <?php
 
 /*
  * Copyright 2012 Facebook, Inc.
  *
  * Licensed 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.
  */
 
 /**
  * Run pull commands on local working copies to keep them up to date. This
  * daemon handles all repository types.
  *
  * By default, the daemon pulls **every** repository. If you want it to be
  * responsible for only some repositories, you can launch it with a list of
  * PHIDs or callsigns:
  *
- *   ./phd launch repositorypulllocal X Q Z
+ *   ./phd launch repositorypulllocal -- X Q Z
+ *
+ * You can also launch a daemon which is responsible for all //but// one or
+ * more repositories:
+ *
+ *   ./phd launch repositorypulllocal -- --not A --not B
  *
  * If you have a very large number of repositories and some aren't being pulled
  * as frequently as you'd like, you can either change the pull frequency of
  * the less-important repositories to a larger number (so the daemon will skip
  * them more often) or launch one daemon for all the less-important repositories
  * and one for the more important repositories (or one for each more important
  * repository).
  *
  * @task pull   Pulling Repositories
  * @task git    Git Implementation
  * @task hg     Mercurial Implementation
  */
 final class PhabricatorRepositoryPullLocalDaemon
   extends PhabricatorDaemon {
 
+  private static $commitCache = array();
+
 
 /* -(  Pulling Repositories  )----------------------------------------------- */
 
 
   /**
    * @task pull
    */
   public function run() {
+    $argv = $this->getArgv();
+    array_unshift($argv, __CLASS__);
+    $args = new PhutilArgumentParser($argv);
+    $args->parse(
+      array(
+        array(
+          'name'      => 'no-discovery',
+          'help'      => 'Pull only, without discovering commits.',
+        ),
+        array(
+          'name'      => 'not',
+          'param'     => 'repository',
+          'repeat'    => true,
+          'help'      => 'Do not pull __repository__.',
+        ),
+        array(
+          'name'      => 'repositories',
+          'wildcard'  => true,
+          'help'      => 'Pull specific __repositories__ instead of all.',
+        ),
+      ));
+
+    $no_discovery   = $args->getArg('no-discovery');
+    $repo_names     = $args->getArg('repositories', array());
+    $exclude_names  = $args->getArg('not', array());
 
     // Each repository has an individual pull frequency; after we pull it,
     // wait that long to pull it again. When we start up, try to pull everything
     // serially.
     $retry_after = array();
 
+    $min_sleep = 15;
+
     while (true) {
-      $repositories = $this->loadRepositories();
+      $repositories = $this->loadRepositories($repo_names);
+      if ($exclude_names) {
+        $exclude = $this->loadRepositories($exclude_names);
+        $repositories = array_diff_key($repositories, $exclude);
+      }
 
       // Shuffle the repositories, then re-key the array since shuffle()
       // discards keys. This is mostly for startup, we'll use soft priorities
       // later.
       shuffle($repositories);
       $repositories = mpull($repositories, null, 'getID');
 
       // If any repositories were deleted, remove them from the retry timer map
       // so we don't end up with a retry timer that never gets updated and
       // causes us to sleep for the minimum amount of time.
       $retry_after = array_select_keys(
         $retry_after,
         array_keys($repositories));
 
       // Assign soft priorities to repositories based on how frequently they
       // should pull again.
       asort($retry_after);
       $repositories = array_select_keys(
         $repositories,
         array_keys($retry_after)) + $repositories;
 
       foreach ($repositories as $id => $repository) {
         $after = idx($retry_after, $id, 0);
-        if ($after >= time()) {
+        if ($after > time()) {
+          continue;
+        }
+
+        $tracked = $repository->isTracked();
+        if (!$tracked) {
           continue;
         }
 
         try {
           self::pullRepository($repository);
-          $sleep_for = $repository->getDetail('pull-frequency', 15);
+
+          if (!$no_discovery) {
+            // TODO: It would be nice to discover only if we pulled something,
+            // but this isn't totally trivial.
+            self::discoverRepository($repository);
+          }
+
+          $sleep_for = $repository->getDetail('pull-frequency', $min_sleep);
           $retry_after[$id] = time() + $sleep_for;
         } catch (Exception $ex) {
-          $retry_after[$id] = time() + 15;
+          $retry_after[$id] = time() + $min_sleep;
           phlog($ex);
         }
+
+        $this->stillWorking();
       }
 
-      $sleep_until = max(min($retry_after), time() + 15);
-      sleep($sleep_until - time());
+      if ($retry_after) {
+        $sleep_until = max(min($retry_after), time() + $min_sleep);
+      } else {
+        $sleep_until = time() + $min_sleep;
+      }
+
+      $this->sleep($sleep_until - time());
     }
   }
 
 
   /**
    * @task pull
    */
-  protected function loadRepositories() {
-    $argv = $this->getArgv();
-    if (!count($argv)) {
+  protected function loadRepositories(array $names) {
+    if (!count($names)) {
       return id(new PhabricatorRepository())->loadAll();
     } else {
-      return PhabricatorRepository::loadAllByPHIDOrCallsign($argv);
+      return PhabricatorRepository::loadAllByPHIDOrCallsign($names);
     }
   }
 
 
   /**
    * @task pull
    */
   public static function pullRepository(PhabricatorRepository $repository) {
-    $tracked = $repository->isTracked();
-    if (!$tracked) {
-      return;
-    }
-
     $vcs = $repository->getVersionControlSystem();
 
     $is_svn = ($vcs == PhabricatorRepositoryType::REPOSITORY_TYPE_SVN);
     $is_git = ($vcs == PhabricatorRepositoryType::REPOSITORY_TYPE_GIT);
     $is_hg = ($vcs == PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL);
 
     if ($is_svn) {
       return;
     }
 
     $callsign = $repository->getCallsign();
 
     if (!$is_git && !$is_hg) {
       throw new Exception(
         "Unknown VCS '{$vcs}' for repository '{$callsign}'!");
     }
 
     $local_path = $repository->getDetail('local-path');
     if (!$local_path) {
       throw new Exception(
         "No local path is available for repository '{$callsign}'.");
     }
 
     if (!Filesystem::pathExists($local_path)) {
       $dirname = dirname($local_path);
       if (!Filesystem::pathExists($dirname)) {
         echo "Creating new directory '{$dirname}' ".
              "for repository '{$callsign}'.\n";
         Filesystem::createDirectory($dirname, 0755, $recursive = true);
       }
 
       if ($is_git) {
-        self::executeGitCreate($repository, $local_path);
+        return self::executeGitCreate($repository, $local_path);
       } else if ($is_hg) {
-        self::executeHgCreate($repository, $local_path);
+        return self::executeHgCreate($repository, $local_path);
       }
     } else {
       if ($is_git) {
-        self::executeGitUpdate($repository, $local_path);
+        return self::executeGitUpdate($repository, $local_path);
       } else if ($is_hg) {
-        self::executeHgUpdate($repository, $local_path);
+        return self::executeHgUpdate($repository, $local_path);
       }
     }
   }
 
+  public static function discoverRepository(PhabricatorRepository $repository) {
+    $vcs = $repository->getVersionControlSystem();
+    switch ($vcs) {
+      case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
+        return self::executeGitDiscover($repository);
+      case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
+        return self::executeSvnDiscover($repository);
+      case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL:
+        return self::executeHgDiscover($repository);
+      default:
+        throw new Exception("Unknown VCS '{$vcs}'!");
+    }
+  }
+
+
+  private static function isKnownCommit(
+    PhabricatorRepository $repository,
+    $target) {
+
+    if (self::getCache($repository, $target)) {
+      return true;
+    }
+
+    $commit = id(new PhabricatorRepositoryCommit())->loadOneWhere(
+      'repositoryID = %s AND commitIdentifier = %s',
+      $repository->getID(),
+      $target);
+
+    if (!$commit) {
+      return false;
+    }
+
+    self::setCache($repository, $target);
+    while (count(self::$commitCache) > 2048) {
+      array_shift(self::$commitCache);
+    }
+
+    return true;
+  }
+
+  private static function recordCommit(
+    PhabricatorRepository $repository,
+    $commit_identifier,
+    $epoch) {
+
+    $commit = new PhabricatorRepositoryCommit();
+    $commit->setRepositoryID($repository->getID());
+    $commit->setCommitIdentifier($commit_identifier);
+    $commit->setEpoch($epoch);
+
+    try {
+      $commit->save();
+      $event = new PhabricatorTimelineEvent(
+        'cmit',
+        array(
+          'id' => $commit->getID(),
+        ));
+      $event->recordEvent();
+
+      queryfx(
+        $repository->establishConnection('w'),
+        'INSERT INTO %T (repositoryID, size, lastCommitID, epoch)
+          VALUES (%d, 1, %d, %d)
+          ON DUPLICATE KEY UPDATE
+            size = size + 1,
+            lastCommitID =
+              IF(VALUES(epoch) > epoch, VALUES(lastCommitID), lastCommitID),
+            epoch = IF(VALUES(epoch) > epoch, VALUES(epoch), epoch)',
+        PhabricatorRepository::TABLE_SUMMARY,
+        $repository->getID(),
+        $commit->getID(),
+        $epoch);
+
+      self::setCache($repository, $commit_identifier);
+    } catch (AphrontQueryDuplicateKeyException $ex) {
+      // Ignore. This can happen because we discover the same new commit
+      // more than once when looking at history, or because of races or
+      // data inconsistency or cosmic radiation; in any case, we're still
+      // in a good state if we ignore the failure.
+      self::setCache($repository, $commit_identifier);
+    }
+  }
+
+  private static function setCache(
+    PhabricatorRepository $repository,
+    $commit_identifier) {
+
+    $key = self::getCacheKey($repository, $commit_identifier);
+    self::$commitCache[$key] = true;
+  }
+
+  private static function getCache(
+    PhabricatorRepository $repository,
+    $commit_identifier) {
+
+    $key = self::getCacheKey($repository, $commit_identifier);
+    return idx(self::$commitCache, $key, false);
+  }
+
+  private static function getCacheKey(
+    PhabricatorRepository $repository,
+    $commit_identifier) {
+
+    return $repository->getID().':'.$commit_identifier;
+  }
+
+
 
 /* -(  Git Implementation  )------------------------------------------------- */
 
 
   /**
    * @task git
    */
   private static function executeGitCreate(
     PhabricatorRepository $repository,
     $path) {
 
     $repository->execxRemoteCommand(
       'clone --origin origin %s %s',
       $repository->getRemoteURI(),
       rtrim($path, '/'));
   }
 
 
   /**
    * @task git
    */
   private static function executeGitUpdate(
     PhabricatorRepository $repository,
     $path) {
 
     // Run a bunch of sanity checks to detect people checking out repositories
     // inside other repositories, making empty directories, pointing the local
     // path at some random file or path, etc.
 
     list($err, $stdout) = $repository->execLocalCommand(
       'rev-parse --show-toplevel');
 
     if ($err) {
 
       // Try to raise a more tailored error message in the more common case
       // of the user creating an empty directory. (We could try to remove it,
       // but might not be able to, and it's much simpler to raise a good
       // message than try to navigate those waters.)
       if (is_dir($path)) {
         $files = Filesystem::listDirectory($path, $include_hidden = true);
         if (!$files) {
           throw new Exception(
             "Expected to find a git repository at '{$path}', but there ".
             "is an empty directory there. Remove the directory: the daemon ".
             "will run 'git clone' for you.");
         }
       }
 
       throw new Exception(
         "Expected to find a git repository at '{$path}', but there is ".
         "a non-repository directory (with other stuff in it) there. Move or ".
         "remove this directory (or reconfigure the repository to use a ".
         "different directory), and then either clone a repository yourself ".
         "or let the daemon do it.");
     } else {
       $repo_path = rtrim($stdout, "\n");
 
       if (empty($repo_path)) {
         throw new Exception(
           "Expected to find a git repository at '{$path}', but ".
           "there was no result from `git rev-parse --show-toplevel`. ".
           "Something is misconfigured or broken. The git repository ".
           "may be inside a '.git/' directory.");
       }
 
       if (!Filesystem::pathsAreEquivalent($repo_path, $path)) {
         throw new Exception(
           "Expected to find repo at '{$path}', but the actual ".
           "git repository root for this directory is '{$repo_path}'. ".
           "Something is misconfigured. The repository's 'Local Path' should ".
           "be set to some place where the daemon can check out a working ".
           "copy, and should not be inside another git repository.");
       }
     }
 
 
     // This is a local command, but needs credentials.
     $future = $repository->getRemoteCommandFuture('fetch --all --prune');
     $future->setCWD($path);
     $future->resolvex();
   }
 
 
+  /**
+   * @task git
+   */
+  private static function executeGitDiscover(
+    PhabricatorRepository $repository) {
+
+    list($remotes) = $repository->execxLocalCommand(
+      'remote show -n origin');
+
+    $matches = null;
+    if (!preg_match('/^\s*Fetch URL:\s*(.*?)\s*$/m', $remotes, $matches)) {
+      throw new Exception(
+        "Expected 'Fetch URL' in 'git remote show -n origin'.");
+    }
+
+    self::executeGitverifySameOrigin(
+      $matches[1],
+      $repository->getRemoteURI(),
+      $repository->getLocalPath());
+
+    list($stdout) = $repository->execxLocalCommand(
+      'branch -r --verbose --no-abbrev');
+
+    $branches = DiffusionGitBranchQuery::parseGitRemoteBranchOutput(
+      $stdout,
+      $only_this_remote = DiffusionBranchInformation::DEFAULT_GIT_REMOTE);
+
+    $tracked_something = false;
+    foreach ($branches as $name => $commit) {
+      if (!$repository->shouldTrackBranch($name)) {
+        continue;
+      }
+
+      $tracked_something = true;
+
+      if (self::isKnownCommit($repository, $commit)) {
+        continue;
+      } else {
+        self::executeGitDiscoverCommit($repository, $commit);
+      }
+    }
+
+    if (!$tracked_something) {
+      $repo_name = $repository->getName();
+      $repo_callsign = $repository->getCallsign();
+      throw new Exception(
+        "Repository r{$repo_callsign} '{$repo_name}' has no tracked branches! ".
+        "Verify that your branch filtering settings are correct.");
+    }
+  }
+
+
+  /**
+   * @task git
+   */
+  private static function executeGitDiscoverCommit(
+    PhabricatorRepository $repository,
+    $commit) {
+
+    $discover = array($commit);
+    $insert = array($commit);
+
+    $seen_parent = array();
+
+    while (true) {
+      $target = array_pop($discover);
+      list($parents) = $repository->execxLocalCommand(
+        'log -n1 --pretty="%%P" %s',
+        $target);
+      $parents = array_filter(explode(' ', trim($parents)));
+      foreach ($parents as $parent) {
+        if (isset($seen_parent[$parent])) {
+          // We end up in a loop here somehow when we parse Arcanist if we
+          // don't do this. TODO: Figure out why and draw a pretty diagram
+          // since it's not evident how parsing a DAG with this causes the
+          // loop to stop terminating.
+          continue;
+        }
+        $seen_parent[$parent] = true;
+        if (!self::isKnownCommit($repository, $parent)) {
+          $discover[] = $parent;
+          $insert[] = $parent;
+        }
+      }
+      if (empty($discover)) {
+        break;
+      }
+    }
+
+    while (true) {
+      $target = array_pop($insert);
+      list($epoch) = $repository->execxLocalCommand(
+        'log -n1 --pretty="%%ct" %s',
+        $target);
+      $epoch = trim($epoch);
+
+      self::recordCommit($repository, $target, $epoch);
+
+      if (empty($insert)) {
+        break;
+      }
+    }
+  }
+
+
+  /**
+   * @task git
+   */
+  public static function executeGitVerifySameOrigin($remote, $expect, $where) {
+    $remote_uri = PhabricatorRepository::newPhutilURIFromGitURI($remote);
+    $expect_uri = PhabricatorRepository::newPhutilURIFromGitURI($expect);
+
+    $remote_path = $remote_uri->getPath();
+    $expect_path = $expect_uri->getPath();
+
+    $remote_match = self::executeGitNormalizePath($remote_path);
+    $expect_match = self::executeGitNormalizePath($expect_path);
+
+    if ($remote_match != $expect_match) {
+      throw new Exception(
+        "Working copy at '{$where}' has a mismatched origin URL. It has ".
+        "origin URL '{$remote}' (with remote path '{$remote_path}'), but the ".
+        "configured URL '{$expect}' (with remote path '{$expect_path}') is ".
+        "expected. Refusing to proceed because this may indicate that the ".
+        "working copy is actually some other repository.");
+    }
+  }
+
+
+  /**
+   * @task git
+   */
+  private static function executeGitNormalizePath($path) {
+    // Strip away trailing "/" and ".git", so similar paths correctly match.
+
+    $path = rtrim($path, '/');
+    $path = preg_replace('/\.git$/', '', $path);
+    return $path;
+  }
+
+
 /* -(  Mercurial Implementation  )------------------------------------------- */
 
 
   /**
    * @task hg
    */
   private static function executeHgCreate(
     PhabricatorRepository $repository,
     $path) {
 
     $repository->execxRemoteCommand(
       'clone %s %s',
       $repository->getRemoteURI(),
       rtrim($path, '/'));
   }
 
 
   /**
    * @task hg
    */
   private static function executeHgUpdate(
     PhabricatorRepository $repository,
     $path) {
 
     // This is a local command, but needs credentials.
     $future = $repository->getRemoteCommandFuture('pull -u');
     $future->setCWD($path);
 
     try {
       $future->resolvex();
     } catch (CommandException $ex) {
       $err = $ex->getError();
       $stdout = $ex->getStdOut();
 
       // NOTE: Between versions 2.1 and 2.1.1, Mercurial changed the behavior
       // of "hg pull" to return 1 in case of a successful pull with no changes.
       // This behavior has been reverted, but users who updated between Feb 1,
       // 2012 and Mar 1, 2012 will have the erroring version. Do a dumb test
       // against stdout to check for this possibility.
       // See: https://github.com/facebook/phabricator/issues/101/
 
       // NOTE: Mercurial has translated versions, which translate this error
       // string. In a translated version, the string will be something else,
       // like "aucun changement trouve". There didn't seem to be an easy way
       // to handle this (there are hard ways but this is not a common problem
       // and only creates log spam, not application failures). Assume English.
 
       // TODO: Remove this once we're far enough in the future that deployment
       // of 2.1 is exceedingly rare?
       if ($err == 1 && preg_match('/no changes found/', $stdout)) {
         return;
       } else {
         throw $ex;
       }
     }
   }
 
+  private static function executeHgDiscover(PhabricatorRepository $repository) {
+    // NOTE: "--debug" gives us 40-character hashes.
+    list($stdout) = $repository->execxLocalCommand('--debug branches');
+
+    $branches = ArcanistMercurialParser::parseMercurialBranches($stdout);
+    $got_something = false;
+    foreach ($branches as $name => $branch) {
+      $commit = $branch['rev'];
+      if (self::isKnownCommit($repository, $commit)) {
+        continue;
+      } else {
+        self::executeHgDiscoverCommit($repository, $commit);
+        $got_something = true;
+      }
+    }
+
+    return $got_something;
+  }
+
+  private static function executeHgDiscoverCommit(
+    PhabricatorRepository $repository,
+    $commit) {
+
+    $discover = array($commit);
+    $insert = array($commit);
+
+    $seen_parent = array();
+
+    // For all the new commits at the branch heads, walk backward until we find
+    // only commits we've aleady seen.
+    while (true) {
+      $target = array_pop($discover);
+      list($stdout) = $repository->execxLocalCommand(
+        'parents --rev %s --template %s',
+        $target,
+        '{node}\n');
+      $parents = array_filter(explode("\n", trim($stdout)));
+      foreach ($parents as $parent) {
+        if (isset($seen_parent[$parent])) {
+          continue;
+        }
+        $seen_parent[$parent] = true;
+        if (!self::isKnownCommit($repository, $parent)) {
+          $discover[] = $parent;
+          $insert[] = $parent;
+        }
+      }
+      if (empty($discover)) {
+        break;
+      }
+    }
+
+    while (true) {
+      $target = array_pop($insert);
+      list($stdout) = $repository->execxLocalCommand(
+        'log --rev %s --template %s',
+        $target,
+        '{date|rfc822date}');
+      $epoch = strtotime($stdout);
+
+      self::recordCommit($repository, $target, $epoch);
+
+      if (empty($insert)) {
+        break;
+      }
+    }
+  }
+
+
+/* -(  Subversion Implementation  )------------------------------------------ */
+
+
+  private static function executeSvnDiscover(
+    PhabricatorRepository $repository) {
+
+    $uri = self::executeSvnGetBaseSVNLogURI($repository);
+
+    list($xml) = $repository->execxRemoteCommand(
+      'log --xml --quiet --limit 1 %s@HEAD',
+      $uri);
+
+    $results = self::executeSvnParseLogXML($xml);
+    $commit = head_key($results);
+    $epoch  = head($results);
+
+    if (self::isKnownCommit($repository, $commit)) {
+      return false;
+    }
+
+    self::executeSvnDiscoverCommit($repository, $commit, $epoch);
+    return true;
+  }
+
+  private static function executeSvnDiscoverCommit(
+    PhabricatorRepository $repository,
+    $commit,
+    $epoch) {
+
+    $uri = self::executeSvnGetBaseSVNLogURI($repository);
+
+    $discover = array(
+      $commit => $epoch,
+    );
+    $upper_bound = $commit;
+
+    $limit = 1;
+    while ($upper_bound > 1 &&
+           !self::isKnownCommit($repository, $upper_bound)) {
+      // Find all the unknown commits on this path. Note that we permit
+      // importing an SVN subdirectory rather than the entire repository, so
+      // commits may be nonsequential.
+      list($err, $xml, $stderr) = $repository->execRemoteCommand(
+        ' log --xml --quiet --limit %d %s@%d',
+        $limit,
+        $uri,
+        $upper_bound - 1);
+      if ($err) {
+        if (preg_match('/(path|File) not found/', $stderr)) {
+          // We've gone all the way back through history and this path was not
+          // affected by earlier commits.
+          break;
+        } else {
+          throw new Exception("svn log error #{$err}: {$stderr}");
+        }
+      }
+      $discover += self::executeSvnParseLogXML($xml);
+
+      $upper_bound = min(array_keys($discover));
+
+      // Discover 2, 4, 8, ... 256 logs at a time. This allows us to initially
+      // import large repositories fairly quickly, while pulling only as much
+      // data as we need in the common case (when we've already imported the
+      // repository and are just grabbing one commit at a time).
+      $limit = min($limit * 2, 256);
+    }
+
+    // NOTE: We do writes only after discovering all the commits so that we're
+    // never left in a state where we've missed commits -- if the discovery
+    // script terminates it can always resume and restore the import to a good
+    // state. This is also why we sort the discovered commits so we can do
+    // writes forward from the smallest one.
+
+    ksort($discover);
+    foreach ($discover as $commit => $epoch) {
+      self::recordCommit($repository, $commit, $epoch);
+    }
+  }
+
+  private static function executeSvnParseLogXML($xml) {
+    $xml = phutil_utf8ize($xml);
+
+    $result = array();
+
+    $log = new SimpleXMLElement($xml);
+    foreach ($log->logentry as $entry) {
+      $commit = (int)$entry['revision'];
+      $epoch  = (int)strtotime((string)$entry->date[0]);
+      $result[$commit] = $epoch;
+    }
+
+    return $result;
+  }
+
+
+  private static function executeSvnGetBaseSVNLogURI(
+    PhabricatorRepository $repository) {
+
+    $uri = $repository->getDetail('remote-uri');
+    $subpath = $repository->getDetail('svn-subpath');
+
+    return $uri.$subpath;
+  }
+
 }
diff --git a/src/applications/repository/daemon/pulllocal/__init__.php b/src/applications/repository/daemon/pulllocal/__init__.php
index cb9709df5..c0c306a6b 100644
--- a/src/applications/repository/daemon/pulllocal/__init__.php
+++ b/src/applications/repository/daemon/pulllocal/__init__.php
@@ -1,18 +1,26 @@
 <?php
 /**
  * This file is automatically generated. Lint this module to rebuild it.
  * @generated
  */
 
 
 
+phutil_require_module('arcanist', 'repository/parser/mercurial');
+
+phutil_require_module('phabricator', 'applications/diffusion/data/branch');
+phutil_require_module('phabricator', 'applications/diffusion/query/branch/git');
 phutil_require_module('phabricator', 'applications/repository/constants/repositorytype');
+phutil_require_module('phabricator', 'applications/repository/storage/commit');
 phutil_require_module('phabricator', 'applications/repository/storage/repository');
 phutil_require_module('phabricator', 'infrastructure/daemon/base');
+phutil_require_module('phabricator', 'infrastructure/daemon/timeline/storage/event');
+phutil_require_module('phabricator', 'storage/queryfx');
 
 phutil_require_module('phutil', 'error');
 phutil_require_module('phutil', 'filesystem');
+phutil_require_module('phutil', 'parser/argument/parser');
 phutil_require_module('phutil', 'utils');
 
 
 phutil_require_source('PhabricatorRepositoryPullLocalDaemon.php');
diff --git a/src/applications/repository/daemon/commitdiscovery/git/__tests__/PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase.php b/src/applications/repository/daemon/pulllocal/__tests__/PhabricatorRepositoryPullLocalDaemonTestCase.php
similarity index 94%
rename from src/applications/repository/daemon/commitdiscovery/git/__tests__/PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase.php
rename to src/applications/repository/daemon/pulllocal/__tests__/PhabricatorRepositoryPullLocalDaemonTestCase.php
index 1bef77e5c..43130bd6b 100644
--- a/src/applications/repository/daemon/commitdiscovery/git/__tests__/PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase.php
+++ b/src/applications/repository/daemon/pulllocal/__tests__/PhabricatorRepositoryPullLocalDaemonTestCase.php
@@ -1,113 +1,113 @@
 <?php
 
 /*
  * Copyright 2012 Facebook, Inc.
  *
  * Licensed 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.
  */
 
-final class PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase
+final class PhabricatorRepositoryPullLocalDaemonTestCase
   extends PhabricatorTestCase {
 
-  public function testVerifySameGitOrigin() {
+  public function testExecuteGitVerifySameOrigin() {
     $cases = array(
       array(
         'ssh://user@domain.com/path.git',
         'ssh://user@domain.com/path.git',
         true,
         'Identical paths should pass.',
       ),
       array(
         'ssh://user@domain.com/path.git',
         'https://user@domain.com/path.git',
         true,
         'Protocol changes should pass.',
       ),
       array(
         'ssh://user@domain.com/path.git',
         'git@domain.com:path.git',
         true,
         'Git implicit SSH should pass.',
       ),
       array(
         'ssh://user@gitserv001.com/path.git',
         'ssh://user@gitserv002.com/path.git',
         true,
         'Domain changes should pass.',
       ),
       array(
         'ssh://alincoln@domain.com/path.git',
         'ssh://htaft@domain.com/path.git',
         true,
         'User/auth changes should pass.',
       ),
       array(
         'ssh://user@domain.com/apples.git',
         'ssh://user@domain.com/bananas.git',
         false,
         'Path changes should fail.',
       ),
       array(
         'ssh://user@domain.com/apples.git',
         'git@domain.com:bananas.git',
         false,
         'Git implicit SSH path changes should fail.',
       ),
       array(
         'user@domain.com:path/repo.git',
         'user@domain.com:path/repo',
         true,
         'Optional .git extension should not prevent matches.',
       ),
       array(
         'user@domain.com:path/repo/',
         'user@domain.com:path/repo',
         true,
         'Optional trailing slash should not prevent matches.',
       ),
       array(
         'file:///path/to/local/repo.git',
         'file:///path/to/local/repo.git',
         true,
         'file:// protocol should be supported.',
       ),
       array(
         '/path/to/local/repo.git',
         'file:///path/to/local/repo.git',
         true,
         'Implicit file:// protocol should be recognized.',
       ),
     );
 
     foreach ($cases as $case) {
       list($remote, $config, $expect, $message) = $case;
 
       $ex = null;
       try {
-        PhabricatorRepositoryGitCommitDiscoveryDaemon::verifySameGitOrigin(
+        PhabricatorRepositoryPullLocalDaemon::executeGitverifySameOrigin(
           $remote,
           $config,
           '(a test case)');
       } catch (Exception $exception) {
         $ex = $exception;
       }
 
       $this->assertEqual(
         $expect,
         !$ex,
         "Verification that '{$remote}' and '{$config}' are the same origin ".
         "had a different outcome than expected: {$message}");
     }
   }
 
 }
diff --git a/src/applications/repository/daemon/commitdiscovery/git/__tests__/__init__.php b/src/applications/repository/daemon/pulllocal/__tests__/__init__.php
similarity index 68%
rename from src/applications/repository/daemon/commitdiscovery/git/__tests__/__init__.php
rename to src/applications/repository/daemon/pulllocal/__tests__/__init__.php
index d72145acf..92606421a 100644
--- a/src/applications/repository/daemon/commitdiscovery/git/__tests__/__init__.php
+++ b/src/applications/repository/daemon/pulllocal/__tests__/__init__.php
@@ -1,13 +1,13 @@
 <?php
 /**
  * This file is automatically generated. Lint this module to rebuild it.
  * @generated
  */
 
 
 
-phutil_require_module('phabricator', 'applications/repository/daemon/commitdiscovery/git');
+phutil_require_module('phabricator', 'applications/repository/daemon/pulllocal');
 phutil_require_module('phabricator', 'infrastructure/testing/testcase');
 
 
-phutil_require_source('PhabricatorRepositoryGitCommitDiscoveryDaemonTestCase.php');
+phutil_require_source('PhabricatorRepositoryPullLocalDaemonTestCase.php');