Index: language/FlaggedRevs.i18n.php
===================================================================
--- language/FlaggedRevs.i18n.php	(revision 75281)
+++ language/FlaggedRevs.i18n.php	(working copy)
@@ -249,6 +249,13 @@
 	'revreview-restriction-any'    => 'any',
 	'revreview-restriction-none'   => 'none',
 
+	'revreview-reject-header'      => 'Reject changes for $1',
+	'revreview-reject-text'        => 'By completing this action, you will be \'\'\'rejecting\'\'\' the following changes. This will revert the article back to this [$1 older revision]',
+	'revreview-reject-summary'     => 'Edit summary:',
+	'revreview-reject-confirm'     => 'Reject these changes',
+	'revreview-reject-cancel'      => 'Cancel',
+	'revreview-reject-default-summary' => 'Rejecting changes by [[User:$1|$1]] to version $2 by [[User:$3|$3]]',
+
 	'revreview-reviewlink'         => 'pending edits',
 	'revreview-reviewlink-title'   => 'View diff of all pending changes',
 	'revreview-unreviewedpage'     => 'unchecked page',
Index: forms/RevisionReviewForm.php
===================================================================
--- forms/RevisionReviewForm.php	(revision 75281)
+++ forms/RevisionReviewForm.php	(working copy)
@@ -18,6 +18,7 @@
 	protected $approve = false;
 	protected $unapprove = false;
 	protected $reject = false;
+	protected $rejectConfirm = false;
 	protected $oldid = 0;
 	protected $refid = 0;
 	protected $templateParams = '';
@@ -63,6 +64,10 @@
 		$this->trySet( $this->reject, $value );
 	}
 
+	public function setRejectConfirm( $value ) {
+		$this->trySet( $this->rejectConfirm, $value );
+	}
+
 	public function getRefId() {
 		return $this->refid;
 	}
@@ -312,6 +317,11 @@
 		} elseif ( $this->getAction() === 'reject' ) {
 			$newRev = Revision::newFromTitle( $this->page, $this->oldid );
 			$oldRev = Revision::newFromTitle( $this->page, $this->refid );
+
+			if( !$this->rejectConfirm ) {
+				$this->rejectConfirmationForm( $oldRev, $newRev );
+				return false;
+			}
 			# Do not mess with archived/deleted revisions
 			if ( is_null( $oldRev ) || $oldRev->mDeleted ) {
 				return 'review_bad_oldid';
@@ -988,6 +998,63 @@
 		return $form;
 	}
 
+	/**
+	 * Output the "are you sure you want to reject this" form
+	 *
+	 * A bit hacky, but we don't have a way to pass more complicated
+	 * UI things back up, since RevisionReview expects either true
+	 * or a string message key
+	 */
+	private function rejectConfirmationForm( Revision $oldRev, $newRev ) {
+		global $wgOut;
+
+		$thisPage = SpecialPage::getTitleFor( 'RevisionReview' );
+
+		$permaLink = $oldRev->getTitle()->getFullURL( 'oldid=' . $oldRev->getId() );
+		$wgOut->addWikiMsg( 'revreview-reject-text', $permaLink );
+
+		$thisPage->skin = $this->user->getSkin();
+		$dbr = wfGetDB( DB_SLAVE );
+		$oldid = $dbr->addQuotes( $oldRev->getId() );
+		$res = $dbr->select( 'revision', 'rev_id',
+			array( 'rev_id > ' . $oldid, 'rev_page' => $oldRev->getPage() ),
+			__METHOD__
+		);
+
+		$ids = array();
+		foreach( $res as $r ) {
+			$ids[] = $r->rev_id;
+		}
+
+		$list = new RevDel_RevisionList( $thisPage, $oldRev->getTitle(), $ids );
+		for ( $list->reset(); $list->current(); $list->next() ) {
+			$item = $list->current();
+			if ( $item->canView() ) {
+				$wgOut->addHTML( $item->getHTML() );
+			}
+		}
+		$form = Html::openElement( 'form',
+			array( 'method' => 'POST', 'action' => $thisPage->getFullUrl() )
+		);
+		$form .= Html::hidden( 'action', 'reject' );
+		$form .= Html::hidden( 'wpReject', 1 );
+		$form .= Html::hidden( 'wpRejectConfirm', 1 );
+		$form .= Html::hidden( 'oldid', $this->oldid );
+		$form .= Html::hidden( 'refid', $this->refid );
+		$form .= Html::hidden( 'target', $oldRev->getTitle()->getPrefixedDBKey() );
+		$form .= Html::hidden( 'wpEditToken', $this->user->editToken() );
+		$form .= "<br />";
+
+		$defaultSummary = wfMsg( 'revreview-reject-default-summary',
+			$newRev->getUserText(), $oldRev->getId(), $oldRev->getUserText() );
+		$form .= Xml::inputLabel( wfMsg( 'revreview-reject-summary' ), 'wpReason',
+			'wpReason', 120, $defaultSummary ) . "<br />";
+		$form .= Html::input( 'wpSubmit', wfMsg( 'revreview-reject-confirm' ), 'submit' );
+		$form .= Html::input( 'wpCancel', wfMsg( 'revreview-reject-cancel' ), 'button' );
+		$form .= Html::closeElement( 'form' );
+		$wgOut->addHtml( $form );
+	}
+
 	private function getSpecialLinks() {
 		$s = '<p>' . wfMsg( 'returnto',
 			$this->skin->makeLinkObj( SpecialPage::getTitleFor( 'UnreviewedPages' ) ) ) . '</p>';
Index: specialpages/RevisionReview_body.php
===================================================================
--- specialpages/RevisionReview_body.php	(revision 75281)
+++ specialpages/RevisionReview_body.php	(working copy)
@@ -46,6 +46,7 @@
 		$form->setApprove( $wgRequest->getCheck( 'wpApprove' ) );
 		$form->setUnapprove( $wgRequest->getCheck( 'wpUnapprove' ) );
 		$form->setReject( $wgRequest->getCheck( 'wpReject' ) );
+		$form->setRejectConfirm( $wgRequest->getBool( 'wpRejectConfirm' ) );
 		# Rev ID
 		$form->setOldId( $wgRequest->getInt( 'oldid' ) );
 		$form->setRefId( $wgRequest->getInt( 'refid' ) );
@@ -104,7 +105,9 @@
 				} elseif ( $form->getAction() === 'reject' ) {
 					$wgOut->redirect( $this->page->getFullUrl() );
 				}
-			// Failure for flagging or unflagging
+			} elseif( $status === false ) {
+				// Reject confirmation screen. HACKY :(
+				return;
 			} else {
 				if ( $status === 'review_denied' ) {
 					$wgOut->permissionRequired( 'badaccess-group0' ); // protected?
