diff --git a/classes/Review.class.inc b/classes/Review.class.inc
index 7c52ca0..48b8d31 100644
--- a/classes/Review.class.inc
+++ b/classes/Review.class.inc
@@ -102,6 +102,10 @@
 		return $this->data['status'];
 	}
 
+	public function isPending() {
+		return $this->getStatus() == 'pending';
+	}
+
 	public function getUrl() {
 		return $this->data['url'];
 	}
diff --git a/classes/Review.class.php b/classes/Review.class.php
deleted file mode 100644
index 827741d..0000000
--- a/classes/Review.class.php
+++ /dev/null
@@ -1,375 +0,0 @@
-<?php
-/*******************************************************************************
- * Copyright (c) 2010 Eclipse Foundation and others.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0 which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * SPDX-License-Identifier: EPL-2.0
- *******************************************************************************/
-require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/common.php");
-require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/debug.php");
-
-require_once(dirname(__FILE__) . "/Forge.class.inc");
-require_once(dirname(__FILE__) . "/database.inc");
-
-define('REVIEW_TYPE_CREATION', 'creation');
-define('REVIEW_TYPE_GRADUATION', 'graduation');
-define('REVIEW_TYPE_RELEASE', 'release');
-define('REVIEW_TYPE_RESTRUCTURE', 'restructure');
-define('REVIEW_TYPE_TERMINATION', 'termination');
-
-class Review {
-	var $info;
-
-	function __construct($info) {
-		$this->info = $info;
-	}
-
-	/**
-	 * State should be one of 'complete' or 'upcoming'
-	 *
-	 * @param string $state
-	 * @param int $cutoff Only return reviews that have occurred since this date
-	 * @return Review[]
-	 */
-	public static function getReviews($state = 'upcoming', $cutoff = null) {
-	    $reviews = array();
-
-	    foreach(Forge::getForges() as $forge) {
-	        $url = "{$forge->getUrl()}/json/reviews/$state";
-	        if ($list = json_decode(getUrlContents($url), true)) {
-	            foreach($list as $row) {
-	                $review = new Review($row);
-	                if ($cutoff && ($review->getDate() < $cutoff)) continue;
-	                $review->statuses[] = new ReviewStatus($row);
-	                $reviews[$review->getId()] = $review;
-	            }
-	        }
-	    }
-	    usort($reviews, 'sortReviewsByDate');
-	    return $reviews;
-	}
-
-	/**
-	 * Fetch completed reviews from all forges. The results are sorted by date.
-	 * @return Review[]
-	 */
-	public static function getCompletedReviews() {
-		return self::getReviews('complete');
-	}
-
-	function getId() {
-		return $this->info['Id'];
-	}
-
-	function getProjectName() {
-		$name = @$this->info['ProjectName'];
-		if ($name) return $name;
-
-		/*
-		 * If the name hasn't been specified, use the proposal name instead.
-		 * That is, assume that we're looking at a Creation Review that's
-		 * following a proposal.
-		 */
-		return @$this->info['ProposalName'];
-	}
-
-	function getProjectId() {
-		return $this->info['ProjectId'];
-	}
-
-	function getReviewName() {
-		$name = $this->info['ReviewName'];
-		if ($name) return $name;
-
-		/*
-		 * If the review name has not been provided, but a proposal
-		 * name has been provided, assume that this is a creation review.
-		 */
-		if ($this->info['ProposalName']) return 'Creation';
-
-		return "Unknown";
-	}
-
-	function getTitle() {
-		$projectName = $this->getProjectName();
-		$reviewName = $this->getReviewName();
-
-		return "$projectName $reviewName";
-	}
-
-	function getType() {
-	    if ($this->isCreation()) return REVIEW_TYPE_CREATION;
-	    if ($this->isGraduation()) return REVIEW_TYPE_GRADUATION;
-	    if ($this->isRelease()) return REVIEW_TYPE_RELEASE;
-	    if ($this->isRestructure()) return REVIEW_TYPE_RESTRUCTURE;
-	    if ($this->isTermination()) return REVIEW_TYPE_TERMINATION;
-	    return null;
-	}
-
-	function isCreation() {
-		return preg_match('/Creation/i', $this->getReviewName()) ? true : false;
-	}
-
-	/**
-	 * If the name includes the word "release", or if the name is
-	 * just a number, then it's a release.
-	 *
-	 * @return boolean
-	 */
-	function isRelease() {
-		if (preg_match('/release/i', $this->getReviewName())) return true;
-		if (preg_match('/^\d*(\.\d+){0,}$/', trim($this->getReviewName()))) return true;
-		return false;
-	}
-
-	function isGraduation() {
-		return preg_match('/Graduation/i', $this->getReviewName()) ? true : false;
-	}
-
-	function isRestructure() {
-		if (preg_match('/Restruct/i', $this->getReviewName())) return true;
-		if (preg_match('/Move/i', $this->getReviewName())) return true;
-		return false;
-	}
-
-
-	function isTermination() {
-		if (preg_match('/Termination/i', $this->getReviewName())) return true;
-		if (preg_match('/Archiv/i', $this->getReviewName())) return true;
-		return false;
-	}
-
-	function getVersion() {
-		if (preg_match('/(\d+)(\.\d+)?(\.\d+)?/', $this->getReviewName(), $matches)) {
-			$name = $matches[1];
-			$name .= isset($matches[2]) && $matches[2] ? $matches[2] : '.0';
-			$name .= isset($matches[3]) && $matches[3] ? $matches[3] : '.0';
-			return $name;
-		} else if (preg_match('/(\d+(\.\d+){1,2})/', $this->getReviewName())) {
-			return $match[1];
-		} else {
-			return null;
-		}
-	}
-
-	function getReviewDate() {
-		$date = $this->info['ReviewDate'];
-		if (!$date) return null;
-		return strtotime($date);
-	}
-
-	function getDate() {
-		return $this->getReviewDate();
-	}
-
-	function getProjectUrl() {
-		return $this->info['ProjectURL'];
-	}
-
-	function getBugNumber() {
-		return $this->info['BugNumber'];
-	}
-
-	function getIplogUrl() {
-		return $this->info['IPLogURL'];
-	}
-
-	function getLink() {
-		return $this->getSlidesUrl();
-	}
-
-	function getSlidesUrl() {
-		return $this->info['SlidesURL'];
-	}
-
-	function isWithdrawn() {
-		return $this->getReviewWithdrawn() != null;
-	}
-
-	function isSuccessful() {
-		return $this->getReviewSuccessful() != null;
-	}
-
-	function isUnsuccessful() {
-		return $this->getReviewUnsuccessful() != null;
-	}
-
-	function getReviewSuccessful() {
-		return $this->getStatus('Review Successful');
-	}
-
-	function getReviewWithdrawn() {
-		return $this->getStatus('Review Withdrawn');
-	}
-
-	function getReviewUnsuccessful() {
-		return $this->getStatus('Review Unsuccessful');
-	}
-
-	function getWaitingProvisioning() {
-		return $this->getStatus('Waiting Provisioning');
-	}
-
-	/**
-	 * This function provides a line of HTML that describes the receiver; it
-	 * provides links to the various bits of interesting information about
-	 * the review. Yes, this probably doesn't belong here (it's more of
-	 * UI thing).
-	 *
-	 * @return string
-	 */
-	function asHtml($ignore = null) {
-		global $App;
-
-		$projectName = $this->getProjectName();
-		$reviewName = $this->getReviewName();
-		$projectUrl = $this->getProjectUrl();
-		$reviewUrl = $this->getSlidesUrl();
-		$iplogUrl = $this->getIplogUrl();
-		$reviewDate = $this->getReviewDate();
-
-		$projectName = htmlentities($projectName);
-		$reviewName = htmlentities($reviewName);
-		$suffix = 'Review';
-
-		if ($projectUrl) $projectName = "<a href=\"$projectUrl\">$projectName</a>";
-
-		if ($reviewDate) {
-			$reviewDate = $App->getFormattedDate($reviewDate, 'short');
-			$reviewDate = str_replace(' ', '&nbsp;', $reviewDate);
-		} else {
-			$reviewDate= 'unscheduled';
-		}
-
-		if ($reviewUrl)
-			$suffix = "<a href=\"$reviewUrl\">$suffix</a>";
-
-		$icons = '';
-		if ($iplogUrl) {
-			$icons .= "<a href=\"$iplogUrl\"><img style=\"vertical-align:top\" title=\"IP Log\" src=\"http://dev.eclipse.org/small_icons/status/dialog-information.png\"/></a>";
-		}
-
-		if ($this->isSuccessful()) {
-		    $icons .= "<img style=\"vertical-align:top\" title=\"Review Successful\" src=\"/projects/images/ok.gif\">";
-		}
-
-		if ($this->isUnsuccessful()) {
-			$icons .= "<img style=\"vertical-align:top\" title=\"Review Unsuccessful\" src=\"http://dev.eclipse.org/small_icons/actions/process-stop.png\">";
-		}
-
-		if ($this->isWithdrawn()) {
-			$reviewDate = "<strike>$reviewDate</strike>";
-			$projectName = "<strike>$projectName</strike>";
-			$reviewName = "<strike>$reviewName</strike>";
-			$icons .= "<img style=\"vertical-align:top\" title=\"Review Withdrawn\" src=\"http://dev.eclipse.org/small_icons/actions/process-stop.png\">";
-		}
-
-		return "${projectName} $reviewName <nobr>${suffix}${icons}</nobr>";
-	}
-
-	/**
-	 * THIS IS NOT API
-	 */
-	/* private */ function getStatus($text) {
-		foreach($this->statuses as $status) {
-			if ($status->getText() == $text) return $status;
-		}
-		return null;
-	}
-}
-
-class ReviewStatus {
-	var $info;
-
-	function __construct($info) {
-		$this->info = $info;
-	}
-
-	function getText() {
-		return $this->info['Status'];
-	}
-
-	function getDate() {
-		return strtotime($this->info['Date']);
-	}
-}
-
-
-/**
- * This function provides the list of all reviews. Note that the
- * results are cached.
- *
- * @deprecated use Review::getCompletedReviews()
- * @return Review[]
- */
-function get_reviews() {
-    return Review::getCompletedReviews();
-}
-
-
-/**
- * @deprecated
- * @param string $projectId
- */
-function getReviewsForProject($projectId) {
-    $reviews = array();
-    foreach(Review::getCompletedReviews() as $review) {
-        if ($review->getProjectId() == $projectId)
-            $reviews[] = $review;
-    }
-    return $reviews;
-}
-
-/**
- * State should be one of 'complete' or 'upcoming'
- *
- * @deprecated  use Review::getReviews()
- * @param string $state
- * @param int $cutoff Only return reviews that have occurred since this date
- */
-function getReviews($state = 'upcoming', $cutoff = null) {
-    return Review::getReviews($state, $cutoff);
-}
-
-function sortReviewsByDate($a, $b) {
-	$dateA = $a->getReviewDate();
-	$dateB = $b->getReviewDate();
-
-	if ($dateA == $dateB) return 0;
-	return $dateA > $dateB ? -1 : 1;
-}
-
-/**
- * Compare two Reviews for sorting. The most recently completed
- * reviews are sorted first, followed by everything else. Within
- * the groups, everything is sorted by date and then by project id.
- *
- * @internal
- * @param Review $a
- * @param Review $b
- * @return -1, 0, 1 if <,==,>
- */
-function sortReviewsByUpcoming($a, $b) {
-	$now = strtotime('now');
-	$lastWeek = strtotime('-1 week');
-
-	$aDate = $a->getDate();
-	$bDate = $b->getDate();
-
-	$aRecent = ($aDate < $now) && ($aDate > $lastWeek);
-	$bRecent = ($bDate < $now) && ($bDate > $lastWeek);
-
-	if ($aRecent == $bRecent) {
-		if ($aDate < $bDate) return -1;
-		if ($aDate > $bDate) return 1;
-
-		return strcasecmp($a->getProjectId(),$b->getProjectId());
-	}
-
-	if ($aRecent == 1) return -1;
-	return 1;
-}
-?>
\ No newline at end of file
diff --git a/reviews-rss.php b/reviews-rss.php
index 1fd8b5d..b3b8fa3 100644
--- a/reviews-rss.php
+++ b/reviews-rss.php
@@ -23,7 +23,7 @@
 
 //header("Content-Type: application/rss+xml");
 require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
-require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/Review.class.php");
+require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/Review.class.inc");
 require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/debug.php");
 $App = new App();
 
@@ -33,8 +33,6 @@
 	if (is_numeric($value) && $value > 0) $age = $value;
 }
 
-$activities = getReviews('complete', "-${age} days");
-
 ?>
 <rss version="2.0">
 <channel>
@@ -63,9 +61,11 @@
 </webMaster>
 <?php
 
-foreach($activities as $activity) {
-	$title = htmlentities($activity->getTitle());
-	$link = $activity->getLink();
+Review::get(strtotime("-${age} days"), function($activity) {
+	if ($activity->isPending()) return;
+	$project = Project::getProject($activity->getProjectId());
+	$title = htmlentities("{$project->getFormalName()} {$activity->getName()}");
+	$link = $activity->getUrl();
 	$date = date('r', $activity->getDate());
 	$guid = sha1($link);
 
@@ -75,7 +75,8 @@
 	echo "\t<pubDate>$date</pubDate>\n";
 	echo "\t<guid isPermaLink=\"false\">$guid</guid>\n";
 	echo "</item>\n";
-}
+
+});
 ?>
 </channel>
 </rss>
diff --git a/tools/announce.php b/tools/announce.php
deleted file mode 100644
index 19592f8..0000000
--- a/tools/announce.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-/*******************************************************************************
- * Copyright (c) 2016 Eclipse Foundation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Wayne Beaton (Eclipse Foundation)- initial API and implementation
- *******************************************************************************/
-
-require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");	
-require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); 	
-require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); 	
-$App 	= new App();
-$Nav	= new Nav();
-$Menu 	= new Menu();
-include($App->getProjectCommon());  
-
-require_once (dirname ( __FILE__ ) . '/../classes/Review.class.php');
-require_once (dirname ( __FILE__ ) . '/../classes/Proposal.class.php');
-require_once (dirname ( __FILE__ ) . '/../classes/debug.php');
-
-mustBeFoundationEmployee();
-
-$pageTitle 		= "Open Source Project Announcements";
-$pageKeywords	= "";
-$pageAuthor		= "Wayne Beaton";
-
-function getFutureReviews() {
-    $reviews = array();
-    foreach(getReviews('upcoming') as $review) {
-        if ($review->getReviewDate() < strtotime("now")) continue;
-        if ($review->getReviewDate() > strtotime("+2 weeks")) continue;
-        
-        $reviews[] = $review;
-    }
-    return $reviews;
-}
-
-function dumpInfo() {
-    global $App;
-    
-    dumpReviews($references);
-    dumpProposals($references);
-    
-    $candidates = get_candidate_dates("+1 week");
-    $next = $App->getFormattedDate ($candidates[0], 'long' );
-    $afterThat = $App->getFormattedDate ($candidates[1], 'long' );
-
-    print "<p>We run reviews ending on the first and third Wednesday of each month. Our next scheduled review dates are $next and $afterThat.</p>";
-    
-    $url= "https://www.eclipse.org/projects/handbook/#release";
-    
-    print "For more information about releases and reviews, please see the <a href=\"$url\">Eclipse Project Handbook</a>.";
-}
-
-function get_candidate_dates($date = "now", $max=5) {
-	$date = strtotime($date);
-	$diff = 3 - date('w', $date); // '3' means Wednesday
-	if ($diff < 0) $diff += 7;
-	if ($diff < 7) $diff += 7;
-
-	$date = strtotime("+$diff days", $date);
-	$dates = array();
-	while (true) {
-		if (count($dates) >= $max) break;
-		// There's probably a better way to do this, but
-		// the month boundaries are icky, this works, and is simple.
-		if (project_reviews__is_first_or_third_week($date)) {
-			$dates[] = $date;
-		}
-		$date = strtotime("+1 week", $date);
-	}
-	return $dates;
-}
-function project_reviews__is_first_or_third_week($date) {
-    $day = date('j', $date) - 1; // 0-based day of the month
-    if (floor($day / 7) == 0) return true; // first week
-    if (floor($day / 7) == 2) return true; // third week
-    return false;
-}
-
-function sortReviewsByType (Review $a, Review $b) {
-    if ($a->getReviewDate() == $b->getReviewDate())
-        if ($a->getType() == $b->getType())
-            return strcasecmp($a->getTitle(), $b->getTitle());
-        else
-            return $a->getType() < $b->getType() ? - 1 : 1;
-    else
-        return $a->getReviewDate() < $b->getReviewDate() ? - 1 : 1;
-}
-
-function dumpReviews(&$references) {
-    global $App;
-    if (!$reviews = getFutureReviews ()) return;
-    
-    usort($reviews, 'sortReviewsByType');
-    
-    $lastDate = null;
-    /** @var \Review $review */
-    foreach ( $reviews as $review ) {
-        $date = $App->getFormattedDate ( $review->getDate(), 'long' );
-
-        if ($date != $lastDate) {
-            if ($lastDate) print "</ul>";
-            print "<p>There are some reviews concluding on $date:</p>";
-            print "<ul>";
-        }
-
-        $lastDate = $date;
-
-        $title = trim($review->getTitle());
-        $url = $review->getLink();
-        print "<li><a href=\"$url\">$title</a></li>";
-    }
-    print "</ul>";
-}
-
-function dumpProposals() {
-    if (!$proposals = getProposals()) return;
-    
-    print "<p>We have several proposals open for community review:<p>";
-    print "<ul>";
-    foreach($proposals as $proposal) {
-        $title = $proposal->getName();
-        $url = $proposal->getProposalUrl();
-        
-        print "<li><a href=\"$url\">$title</a></li>";
-    }
-    print "</ul>";
-    
-    $url = "https://www.eclipse.org/forums/eclipse.proposals";
-    
-    print "<p>Please add your comments either directly on the proposal or in the <a href=\"$url\">Proposals forum</a>.</p>";
-}
-
-ob_start();
-
-?>
-<div id="maincontent">
-<div id="midcolumn">
-<h1><?= $pageTitle ?></h1>
-
-<?php dumpInfo(); ?>
-
-</div>
-</div>
-
-<?php
-$html = ob_get_contents();
-ob_end_clean();
-$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
-?>
