diff --git a/src/applications/legalpad/controller/LegalpadDocumentEditController.php b/src/applications/legalpad/controller/LegalpadDocumentEditController.php
--- a/src/applications/legalpad/controller/LegalpadDocumentEditController.php
+++ b/src/applications/legalpad/controller/LegalpadDocumentEditController.php
@@ -31,7 +31,6 @@
       $document = id(new LegalpadDocumentQuery())
         ->setViewer($user)
         ->needDocumentBodies(true)
-        ->needSignatures(true)
         ->requireCapabilities(
           array(
             PhabricatorPolicyCapability::CAN_VIEW,
@@ -154,14 +153,7 @@
           $this->getApplicationURI('view/'.$document->getID()));
       $title = pht('Update Document');
       $short = pht('Update');
-      $signatures = $document->getSignatures();
-      if ($signatures) {
-        $form->appendInstructions(pht(
-          'Warning: there are %d signature(s) already for this document. '.
-          'Updating the title or text will invalidate these signatures and '.
-          'users will need to sign again. Proceed carefully.',
-          count($signatures)));
-      }
+
       $crumbs->addTextCrumb(
         $document->getMonogram(),
         $this->getApplicationURI('view/'.$document->getID()));
diff --git a/src/applications/legalpad/query/LegalpadDocumentQuery.php b/src/applications/legalpad/query/LegalpadDocumentQuery.php
--- a/src/applications/legalpad/query/LegalpadDocumentQuery.php
+++ b/src/applications/legalpad/query/LegalpadDocumentQuery.php
@@ -77,10 +77,11 @@
 
     $data = queryfx_all(
       $conn_r,
-      'SELECT d.* FROM %T d %Q %Q %Q %Q',
+      'SELECT d.* FROM %T d %Q %Q %Q %Q %Q',
       $table->getTableName(),
       $this->buildJoinClause($conn_r),
       $this->buildWhereClause($conn_r),
+      $this->buildGroupClause($conn_r),
       $this->buildOrderClause($conn_r),
       $this->buildLimitClause($conn_r));
 
@@ -90,28 +91,6 @@
   }
 
   protected function willFilterPage(array $documents) {
-    if ($this->signerPHIDs) {
-      $document_map = mpull($documents, null, 'getPHID');
-      $signatures = id(new LegalpadDocumentSignatureQuery())
-        ->setViewer($this->getViewer())
-        ->withDocumentPHIDs(array_keys($document_map))
-        ->withSignerPHIDs($this->signerPHIDs)
-        ->execute();
-      $signatures = mgroup($signatures, 'getDocumentPHID');
-      foreach ($document_map as $document_phid => $document) {
-        $sigs = idx($signatures, $document_phid, array());
-        foreach ($sigs as $index => $sig) {
-          if ($sig->getDocumentVersion() != $document->getVersions()) {
-            unset($sigs[$index]);
-          }
-        }
-        $signer_phids = mpull($sigs, 'getSignerPHID');
-        if (array_diff($this->signerPHIDs, $signer_phids)) {
-          unset($documents[$document->getID()]);
-        }
-      }
-    }
-
     if ($this->needDocumentBodies) {
       $documents = $this->loadDocumentBodies($documents);
     }
@@ -126,7 +105,6 @@
 
     if ($this->needViewerSignatures) {
       if ($documents) {
-
         if ($this->getViewer()->getPHID()) {
           $signatures = id(new LegalpadDocumentSignatureQuery())
             ->setViewer($this->getViewer())
@@ -153,63 +131,81 @@
   private function buildJoinClause($conn_r) {
     $joins = array();
 
-    if ($this->contributorPHIDs) {
+    if ($this->contributorPHIDs !== null) {
+      $joins[] = qsprintf(
+        $conn_r,
+        'JOIN edge contributor ON contributor.src = d.phid
+          AND contributor.type = %d',
+        PhabricatorEdgeConfig::TYPE_OBJECT_HAS_CONTRIBUTOR);
+    }
+
+    if ($this->signerPHIDs !== null) {
       $joins[] = qsprintf(
         $conn_r,
-        'JOIN edge e ON e.src = d.phid');
+        'JOIN %T signer ON signer.documentPHID = d.phid
+          AND signer.signerPHID IN (%Ls)',
+        id(new LegalpadDocumentSignature())->getTableName(),
+        $this->signerPHIDs);
     }
 
     return implode(' ', $joins);
   }
 
+  private function buildGroupClause(AphrontDatabaseConnection $conn_r) {
+    if ($this->contributorPHIDs || $this->signerPHIDs) {
+      return 'GROUP BY d.id';
+    } else {
+      return '';
+    }
+  }
+
   protected function buildWhereClause($conn_r) {
     $where = array();
 
-    $where[] = $this->buildPagingClause($conn_r);
-
-    if ($this->ids) {
+    if ($this->ids !== null) {
       $where[] = qsprintf(
         $conn_r,
         'd.id IN (%Ld)',
         $this->ids);
     }
 
-    if ($this->phids) {
+    if ($this->phids !== null) {
       $where[] = qsprintf(
         $conn_r,
         'd.phid IN (%Ls)',
         $this->phids);
     }
 
-    if ($this->creatorPHIDs) {
+    if ($this->creatorPHIDs !== null) {
       $where[] = qsprintf(
         $conn_r,
         'd.creatorPHID IN (%Ls)',
         $this->creatorPHIDs);
     }
 
-    if ($this->dateCreatedAfter) {
+    if ($this->dateCreatedAfter !== null) {
       $where[] = qsprintf(
         $conn_r,
         'd.dateCreated >= %d',
         $this->dateCreatedAfter);
     }
 
-    if ($this->dateCreatedBefore) {
+    if ($this->dateCreatedBefore !== null) {
       $where[] = qsprintf(
         $conn_r,
         'd.dateCreated <= %d',
         $this->dateCreatedBefore);
     }
 
-    if ($this->contributorPHIDs) {
+    if ($this->contributorPHIDs !== null) {
       $where[] = qsprintf(
         $conn_r,
-        'e.type = %s AND e.dst IN (%Ls)',
-        PhabricatorEdgeConfig::TYPE_OBJECT_HAS_CONTRIBUTOR,
+        'contributor.dst IN (%Ls)',
         $this->contributorPHIDs);
     }
 
+    $where[] = $this->buildPagingClause($conn_r);
+
     return $this->formatWhereClause($where);
   }
 
@@ -256,11 +252,6 @@
 
     foreach ($documents as $document) {
       $sigs = idx($signatures, $document->getPHID(), array());
-      foreach ($sigs as $index => $sig) {
-        if ($sig->getDocumentVersion() != $document->getVersions()) {
-          unset($sigs[$index]);
-        }
-      }
       $document->attachSignatures($sigs);
     }
 
diff --git a/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php b/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php
--- a/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php
+++ b/src/applications/legalpad/query/LegalpadDocumentSearchEngine.php
@@ -21,6 +21,10 @@
       'contributorPHIDs',
       $this->readUsersFromRequest($request, 'contributors'));
 
+    $saved->setParameter(
+      'withViewerSignature',
+      $request->getBool('withViewerSignature'));
+
     $saved->setParameter('createdStart', $request->getStr('createdStart'));
     $saved->setParameter('createdEnd', $request->getStr('createdEnd'));
 
@@ -29,9 +33,24 @@
 
   public function buildQueryFromSavedQuery(PhabricatorSavedQuery $saved) {
     $query = id(new LegalpadDocumentQuery())
-      ->needViewerSignatures(true)
-      ->withCreatorPHIDs($saved->getParameter('creatorPHIDs', array()))
-      ->withContributorPHIDs($saved->getParameter('contributorPHIDs', array()));
+      ->needViewerSignatures(true);
+
+    $creator_phids = $saved->getParameter('creatorPHIDs', array());
+    if ($creator_phids) {
+      $query->withCreatorPHIDs($creator_phids);
+    }
+
+    $contributor_phids = $saved->getParameter('contributorPHIDs', array());
+    if ($contributor_phids) {
+      $query->withContributorPHIDs($contributor_phids);
+    }
+
+    if ($saved->getParameter('withViewerSignature')) {
+      $viewer_phid = $this->requireViewer()->getPHID();
+      if ($viewer_phid) {
+        $query->withSignerPHIDs(array($viewer_phid));
+      }
+    }
 
     $start = $this->parseDateTime($saved->getParameter('createdStart'));
     $end = $this->parseDateTime($saved->getParameter('createdEnd'));
@@ -60,8 +79,21 @@
       ->withPHIDs($phids)
       ->execute();
 
+    $viewer_signature = $saved_query->getParameter('withViewerSignature');
+    if (!$this->requireViewer()->getPHID()) {
+      $viewer_signature = false;
+    }
+
     $form
       ->appendChild(
+        id(new AphrontFormCheckboxControl())
+          ->addCheckbox(
+            'withViewerSignature',
+            1,
+            pht('Show only documents I have signed.'),
+            $viewer_signature)
+          ->setDisabled(!$this->requireViewer()->getPHID()))
+      ->appendChild(
         id(new AphrontFormTokenizerControl())
           ->setDatasource('/typeahead/common/users/')
           ->setName('creators')
@@ -89,9 +121,13 @@
   }
 
   public function getBuiltinQueryNames() {
-    $names = array(
-      'all' => pht('All Documents'),
-    );
+    $names = array();
+
+    if ($this->requireViewer()->isLoggedIn()) {
+      $names['signed'] = pht('Signed Documents');
+    }
+
+    $names['all'] = pht('All Documents');
 
     return $names;
   }
@@ -102,6 +138,9 @@
     $query->setQueryKey($query_key);
 
     switch ($query_key) {
+      case 'signed':
+        return $query
+          ->setParameter('withViewerSignature', true);
       case 'all':
         return $query;
     }
diff --git a/src/applications/policy/rule/PhabricatorPolicyRuleLegalpadSignature.php b/src/applications/policy/rule/PhabricatorPolicyRuleLegalpadSignature.php
--- a/src/applications/policy/rule/PhabricatorPolicyRuleLegalpadSignature.php
+++ b/src/applications/policy/rule/PhabricatorPolicyRuleLegalpadSignature.php
@@ -15,6 +15,9 @@
       return;
     }
 
+    // TODO: This accepts signature of any version of the document, even an
+    // older version.
+
     $documents = id(new LegalpadDocumentQuery())
       ->setViewer(PhabricatorUser::getOmnipotentUser())
       ->withPHIDs($values)
diff --git a/src/infrastructure/internationalization/translation/PhabricatorBaseEnglishTranslation.php b/src/infrastructure/internationalization/translation/PhabricatorBaseEnglishTranslation.php
--- a/src/infrastructure/internationalization/translation/PhabricatorBaseEnglishTranslation.php
+++ b/src/infrastructure/internationalization/translation/PhabricatorBaseEnglishTranslation.php
@@ -890,17 +890,6 @@
         '%d Users Need Approval',
       ),
 
-      'Warning: there are %d signature(s) already for this document. '.
-      'Updating the title or text will invalidate these signatures and users '.
-      'will need to sign again. Proceed carefully.' => array(
-        'Warning: there is %d signature already for this document. '.
-        'Updating the title or text will invalidate this signature and the '.
-        'user will need to sign again. Proceed carefully.',
-        'Warning: there are %d signatures already for this document. '.
-        'Updating the title or text will invalidate these signatures and '.
-        'users will need to sign again. Proceed carefully.',
-      ),
-
       '%s older changes(s) are hidden.' => array(
         '%d older change is hidden.',
         '%d older changes are hidden.',