diff --git a/client/review/vcs/git.inc b/client/review/vcs/git.inc
index 7b7ae22..7fa05cf 100644
--- a/client/review/vcs/git.inc
+++ b/client/review/vcs/git.inc
@@ -32,7 +32,8 @@ class pifr_client_vcs_git extends pifr_client_vcs {
    * Check out a given repository URL into given directory.
    *
    * @param $directory
-   *   Directory to check out into.
+   *   Directory to check out into. If empty, the name of the project (derived
+   *   from the url) is used.
    * @param unknown_type $url
    *   Repo URL, like git://git.drupal.org/project/drupal.git
    * @param $vcs_id
@@ -44,10 +45,16 @@ class pifr_client_vcs_git extends pifr_client_vcs {
   public function checkout($work_tree, $url, $vcs_id) {
     $url = escapeshellarg($url);
     $vcs_id = escapeshellarg("*/$vcs_id");
-    $git_dir = escapeshellarg("$work_tree/.git");
-    if (!empty($work_tree)) {
-      $work_tree = escapeshellarg($work_tree);
+
+    // If $work_tree is empty, we assume we're in the directory where the
+    // clone is to happen.
+    if (empty($work_tree)) {
+      $work_tree = preg_replace('%^.*/([^/]*)\.git.*%', '$1', $url);
+      $work_tree = getcwd() . '/' . $work_tree;
     }
+    $git_dir = escapeshellarg("$work_tree/.git");
+    $work_tree = escapeshellarg($work_tree);
+
     // We can use a reference repository to shortcut the wait for a clone.
     // It can have any or all of the projects that might get checked out.
     // This should be an absolute path to the reference repo or a git URL.
@@ -94,27 +101,32 @@ class pifr_client_vcs_git extends pifr_client_vcs {
   }
 
   /**
-   * Apply a patch.
-   *
-   * This will try patching with the -p possibilities in
-   * $this->patch_levels_to_try.
+   * Apply a patch using git apply.
    *
    * @param $patch
    *   The patch file to apply.
+   * @param $level
+   *   The patch level to use. Normal is -p1.
+   * @param $check_only
+   *   If TRUE, do not attempt to patch, just see if it applies.
+   *
+   * @return
+   *   TRUE on successful patching or successful check, FALSE otherwise.
    */
-  public function apply($patch) {
-    foreach($this->patch_levels_to_try as $patch_level) {
-      $result = pifr_client_review::exec("git apply -p$patch_level --check $patch", TRUE);
-      if ($result) {
-        $this->patch_level = $patch_level;
-        $git_output = "";
-        $git_command_result = pifr_client_review::exec("git apply -v -p$patch_level $patch", TRUE, $git_output);
-        $this->files_affected_by_patch = $this->determine_files_affected_by_patch($git_output);
-        return TRUE;
-      }
+  public function apply($patch, $patch_level = 1, $check_only = FALSE) {
+    $test_result = pifr_client_review::exec("git apply --check -p$patch_level $patch", TRUE);
+    if (!check_only) {
+      return (!$test_result != 0);
+    }
+    if ($test_result) {
+      $this->patch_level = $patch_level;
+      $git_output = "";
+      $git_command_result = pifr_client_review::exec("git apply -v -p$patch_level $patch", TRUE, $git_output);
+      $this->files_affected_by_patch = $this->determine_files_affected_by_patch($git_output);
+      return TRUE;
     }
     return FALSE;
-  }
+}
 
   /**
    * Given output from a git patch application, determine what files changed.
@@ -150,10 +162,6 @@ class pifr_client_vcs_git extends pifr_client_vcs {
   /**
    * Inspect the patch to determine which files should have changed.
    *
-   * $this->patch_level has already been initialized by $this->apply(), and
-   * is the number that was successfully used in "patch -p<number>".
-   * We use this to determine how much to strip out of the +++ line.
-   *
    * @param $patch
    *   The patch which was applied. (It has to have already been applied to
    *   initialize $this->patch_level.
diff --git a/review/client.inc b/review/client.inc
index d3d7ad0..22e8535 100644
--- a/review/client.inc
+++ b/review/client.inc
@@ -565,7 +565,12 @@ abstract class pifr_client_review {
       chdir($directory);
 
       if (!$this->vcs[$this->test['vcs']['main']['repository']['type']]->apply($file)) {
-        $this->set_error(array('@filename' => basename($file)));
+        $error = array('@filename' => basename($file));
+        // If patch application failed, see if it succeeds with -p0 so we can give feedback.
+        if ($this->vcs[$this->test['vcs']['main']['repository']['type']]->apply($file, 0, TRUE)) {
+          $error['@reason'] = t('This may be a -p0 (old style) patch, which is no longer supported by the testbots');
+        }
+        $this->set_error($error);
         return;
       }
 
diff --git a/review/server.inc b/review/server.inc
index ac738ac..e9b810d 100644
--- a/review/server.inc
+++ b/review/server.inc
@@ -98,7 +98,7 @@ abstract class pifr_server_review {
       'active title' => 'detect a non-applicable patch',
       'description' => 'Ensure the patch applies to the tip of the chosen the code-base.',
       'help' => 'The testbot client failed to @type which is induced using the !patch.',
-      'summary' => 'Unable to apply patch @filename',
+      'summary' => 'Unable to apply patch @filename. @reason',
       'confirmation' => 'pifr_server',
     ),
     'syntax' => array(
diff --git a/review/simpletest/pifr_simpletest.client.inc b/review/simpletest/pifr_simpletest.client.inc
index 3ceb3ef..80893e3 100644
--- a/review/simpletest/pifr_simpletest.client.inc
+++ b/review/simpletest/pifr_simpletest.client.inc
@@ -149,8 +149,9 @@ class pifr_client_review_pifr_simpletest extends pifr_client_review_pifr_drupal
     $file = $this->module_directory . '/simpletest/D6-core-simpletest.patch';
     chdir($this->checkout_directory);
     $this->log('Applying in ' . getcwd(). ' file=' . $file);
-    if (!$this->vcs[$this->test['vcs']['main']['repository']['type']]->apply($file)) {
-    	$this->set_error(array('@filename' => basename($file)));
+    if (!$this->vcs[$this->test['vcs']['main']['repository']['type']]->apply($file, 0)) {
+      $error = array('@filename' => basename($file));
+      $this->set_error($error);
     	return FALSE;
     }
 
