diff --git a/classes/Project.class.php b/classes/Project.class.php
index 7a91998..385a8ce 100644
--- a/classes/Project.class.php
+++ b/classes/Project.class.php
@@ -62,39 +62,6 @@
 }
 
 /**
- * This function returns an instance of Project representing the project
- * with the provided $id.
- * Note that this function preserves object
- * identity: if called twice with the same value, it will return the
- * exact same object.
- *
- * @deprecated Use Project::getProject($id)
- * @return Project
- */
-function getProject($id) {
-  return Project::getProject($id);
-}
-
-/**
- *
- * @deprecated Use Project::getProject($id)
- * @return Project
- */
-function get_project($id) {
-  return Project::getProject($id);
-}
-
-/**
- * This function returns all the active projects.
- *
- * @deprecated Use Project::getActiveProjects()
- * @return Project[]
- */
-function getActiveProjects() {
-  return Project::getActiveProjects();
-}
-
-/**
  * Instances of the subclasses of Project represent a single Eclipse Foundation
  * Project.
  * Projects may be in any of the forges supported by the Eclipse
diff --git a/classes/common.php b/classes/common.php
index 0c23f3f..165c692 100644
--- a/classes/common.php
+++ b/classes/common.php
@@ -9,7 +9,6 @@
  * SPDX-License-Identifier: EPL-2.0
  */
 
-// TODO Merge with web-api/common.inc
 require_once (dirname(__FILE__) . "/debug.php");
 trace_file_info(__FILE__);
 
@@ -37,83 +36,6 @@
 }
 
 /**
- * Answers <code>true</code> if $name represents a valid project name;
- * <code>false</code> otherwise.
- *
- * @deprecated use isValidProjectId($id) instead.
- * @param string $name
- *        Must not be <code>null</code>
- * @return bool
- */
-function isValidProjectName($name) {
-  return isValidProjectId($name);
-}
-
-/**
- * Answers <code>true</code> if $name represents a valid project name;
- * <code>false</code> otherwise.
- *
- * @deprecated use isValidProjectId($id) instead.
- * @param string $name
- *        Must not be <code>null</code>
- * @return bool
- */
-function is_valid_project_name($name) {
-  return isValidProjectId($name);
-}
-
-/**
- * Returns the name of the parent project, or <code>null</code> is there
- * is no parent project.
- * Current implementation infers the name of the parent
- * from the given name by lopping off the last segment. e.g.
- *
- * getParentProjectId('eclipse.jdt.debugging') return 'eclipse.jdt'
- * .
- *
- * @param string $name
- *        Must not be <code>null</code>
- * @return string
- */
-function getParentProjectId($name) {
-  if (!$name)
-    return null;
-  global $projectNamePattern, $projectNameSegmentPattern;
-  $matches = null;
-  if (preg_match("/^($projectNamePattern)\\.$projectNameSegmentPattern$/", $name, $matches))
-    return $matches[1];
-  return null;
-}
-
-/**
- *
- * @deprecated
- *
- * @see getParentProjectId()
- * @param string $name
- */
-function get_project_parent_id($name) {
-  return getParentProjectId($name);
-}
-
-/**
- * Returns <code>true</code> if the second parameter represents a
- * valid subproject of the first parameter.
- * Note that this only checks
- * to see if the names are compatible; no check is done to confirm that
- * either parameter represents the name of an actual existing project.
- *
- * @param string $parent
- *        Must not be <code>null</code>
- * @param string $name
- *        Must not be <code>null</code>
- * @return bool
- */
-function is_valid_subproject_id($parent, $name) {
-  return preg_match("/^$parent\\./", $name);
-}
-
-/**
  * This function normalizes the provided URL to a valid 'eclipse.org' HTTP
  * form.
  * Input should be a valid eclipse.org URL or a relative URL
@@ -216,7 +138,7 @@
  *
  * Usage:
  *
- * extractcRelativeUrl('http://www.eclipse.org/woolsey/para.html');
+ * normalizeRelativeUrl('http://www.eclipse.org/woolsey/para.html');
  *
  * @param string $url
  *        Must not be <code>null</code>
@@ -253,15 +175,6 @@
 }
 
 /**
- *
- * @deprecated use #mustBeCommitter() instead.
- * @return Friend
- */
-function login_committer() {
-  return mustBeCommitter();
-}
-
-/**
  * If the user is logged in and is either an Eclipse committer
  * or a staff member of the Eclipse Foundation, this method
  * returns without side effect. If there is no currently logged
@@ -399,162 +312,6 @@
 	exit ();
 }
 
-/**
- * This function returns an instance of Friend corresponding to the
- * currently logged in committer, or null if nobody is logged in or
- * the currently logged in user is not a committer.
- * Note that this
- * function may return a different instance of Friend on subsequent
- * calls (i.e. do not assume that the instance is cached; don't assume
- * that it isn't cached either, these things change).
- *
- * This function assumes that the $App variable exists and has been
- * assigned an instance of the App class (from app.class.php).
- *
- * @return Friend
- */
-function get_committer() {
-  global $App;
-
-  require_once ($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/friends/friend.class.php");
-
-  if ($App->devmode) {
-    $friend = new Friend();
-    // $friend->setBugzillaID(12345);
-    $friend->setFirstName("John");
-    $friend->setLastName("Smith");
-
-    return $friend;
-  }
-
-  $Session = $App->useSession("optional");
-  $friend = $Session->getFriend();
-
-  if (!$friend->getBugzillaID())
-    return null;
-  if (!$friend->getIsCommitter())
-    return null;
-
-  return $friend;
-}
-
-/**
- * This function returns a string that describes the current
- * "login" state, e.g.
- * "You are logged in as Wayne Beaton."
- *
- * @deprecated
- * @return string
- */
-function user_info_html() {
-  $friend = get_committer();
-
-  $login = "https://accounts.eclipse.org/user/login?takemeback=" . $_SERVER['SCRIPT_URI'];
-  $logout = "https://accounts.eclipse.org/user/login?submit=Logout&takemeback=" . $_SERVER['SCRIPT_URI'];
-
-  if (!$friend)
-    return "You must <a href=\"$login\">log in</a> as a committer (using your Eclipse Foundation Account) to use these tools.";
-
-  $first = $friend->getFirstName();
-  $last = $friend->getLastName();
-  $message = $friend->getIsCommitter() ? "<a href=\"$logout\">Log out</a>" : " You are not a committer; you must <a href=\"$login\">log in</a> as a committer to use these tools";
-
-  return "You are logged in as $first $last. $message.";
-}
-
-/**
- * This function extracts the bundle name from the provided file name.
- *
- * Example:
- *
- * extract_bundle_name_and_version('javax.persistence.source_2.0.1.v201006031150.jar')
- * returns 'javax.persistence.source_2.0.1'
- *
- * Returns <code>null</code> if the bundle name cannot be determined.
- *
- * @param string $name
- *        name of the file to extract from
- * @return string
- */
-function extract_bundle_name_and_version($name) {
-  if (preg_match('/^([a-zA-Z0-9\.-_]+[_-](\d+\.){3}).*\\.jar/', $name, $matches)) {
-    return $matches[1];
-  }
-  if (preg_match('/^([a-zA-Z0-9\.-_]+[_-]([\d\.]*))[-_].*\\.jar/', $name, $matches)) {
-    return $matches[1];
-  }
-  return null;
-}
-
-/**
- * The xmlentities function performs a similar function to the
- * htmlentities function, but with XML in mind.
- * The current
- * implementation runs the string through htmlentities and--
- * from the result--prunes out any entity that should no be
- * in the result. A future version of this function will be
- * smarter.
- *
- * @param string $string
- * @return string
- */
-function xmlentities($string) {
-  $html = htmlentities($string, ENT_QUOTES, 'UTF-8');
-  return preg_replace_callback('/&[\w]+;/', '_xmlentitiescallback', $html);
-}
-
-/**
- *
- * @internal
- *
- * @param string[] $matches
- */
-function _xmlentitiescallback($matches) {
-  if (in_array($matches[0], array(
-    '&amp;',
-    '&lt;',
-    '&gt;',
-    '&quot;',
-    '&apos;'
-  )))
-    return $matches[0];
-  return '';
-}
-
-/**
- * This function tests the provided value to determine whether or
- * not is represents a well-formed project id.
- * If the value fails the
- * test, a ValidationException is thrown. Callers can use this method
- * to make sure that their parameter values are reasonable.
- *
- * @param string $id
- * @throws ValidationException
- * @return void
- */
-function mustBeValidProjectId($id) {
-  if (!is_valid_project_name($id))
-    throw new ValidationException("Valid project id expected.");
-}
-class ValidationException extends Exception {
-
-}
-
-/**
- * This function answers an array containing the base
- * URLs for all forges.
- *
- * @deprecated use Forge::getForges()
- * @return string[]
- */
-function getForges() {
-  $forges = array();
-  foreach (Forge::getForges() as $forge) {
-    $forges[] = $forge->getUrl();
-  }
-  return $forges;
-}
-
 function getUrlContents($url) {
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
@@ -564,26 +321,6 @@
   return $page;
 }
 
-function findPreviousThursday($start = 'now') {
-  $date = strtotime($start);
-  $diff = date('w', $date) - 4; // 4 == Thursday
-  if ($diff < 0)
-    $diff += 7;
-  $thursday = $date - ($diff * 24 * 60 * 60);
-
-  return date('Y-m-d', $thursday);
-}
-
-function findNextWednesday($start = 'now') {
-  $date = strtotime($start);
-  $diff = 3 - date('w', $date); // 3 == Wednesday
-  if ($diff < 0)
-    $diff += 7;
-  $wednesday = $date + ($diff * 24 * 60 * 60);
-
-  return date('Y-m-d', $wednesday);
-}
-
 function implodeWithConjunction($values, $conjunction = 'and', $start = 0) {
  $end = count($values) - 1;
  if ($start > $end) {
@@ -663,7 +400,9 @@
 			'*/*/org.glassfish.grizzly/*/2.4.4+' => 'ee4j.grizzly',
 			'*/*/org.glassfish.hk2*/*/2.6+' => 'ee4j.glassfish',
 			'*/*/org.glassfish.mq/*/5.1.3+' => 'ee4j.openmq',
-			'*/*/org.glassfish.tyrus*/*/1.15+' => 'ee4j.tyrus'
+			'*/*/org.glassfish.tyrus*/*/1.15+' => 'ee4j.tyrus',
+
+			'*/*/org.glassfish/jsonp-jaxrs/1.1.5+' => 'ee4j.jsonp'
 	);
 
 	// This list is stable, I think. I believe that we can expand this out and
diff --git a/tools/scan_downloads.php b/tools/scan_downloads.php
deleted file mode 100755
index fc9f985..0000000
--- a/tools/scan_downloads.php
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php 	
-/*******************************************************************************
- * Copyright (c) 2010 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 - initial API and implementation
- *******************************************************************************/
-
-// FIXME Work in progress. Currently works only on Wayne's desktop.
-
-require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/common.php");
-require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/debug.php");
-trace_file_info(__FILE__);
-
-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();	
-
-$scans_path = '/home/wayne/downloads_scan/';
-
-$projectid = $App->getHttpParameter('id');
-if (!preg_match('/^[a-zA-Z0-9]+(.[a-zA-Z0-9]+)*$/', $projectid) > 0) {
-	$projectid = null;
-}
-
-ob_start();
-
-$pageKeywords = "";
-$pageTitle = "Project Downloads Scan";
-$pageAuthor = "Wayne Beaton";
-?>
-
-<div id="midcolumn">
-<h1><?= $pageTitle ?></h1>
-
-<div>
-
-<form method="get">
-<p>Select a project:
-	<select name="id">
-	<?php 
-		$directory = opendir($scans_path);
-		while($file = readdir($directory)) {
-			if (preg_match('/^(.*)\.xml$/', $file, $matches)) {
-				$ids[] = $matches[1];
-			}
-			$dirArray[] = $entryName;
-		}
-		closedir($directory);
-
-		sort($ids);
-		
-		foreach($ids as $id) {
-			$selected = $id == $projectid ? ' selected="true"' : '';
-			echo "<option value=\"$id\"$selected>$id</OPTION>";
-		}
-	?>
-	</select>
-	<input type="submit" value="Go!"/>
-</p>
-</form>
-
-<?php 
-
-$files = array();
-$xml = simplexml_load_file($scans_path . $projectid . '.xml');
-foreach($xml->path as $path) {
-	$location = $path['path'];
-	foreach($path->file as $file) {
-		$name = (String)$file['name'];
-		
-		$bundle = extract_bundle_name_and_version($name);
-		if ($bundle) {
-			$name = $bundle;
-		} else {
-			if (preg_match('/(.*)\\.jar$/', $name, $matches)) {
-				$name = $matches[1];
-			}
-		}
-		$files[$name][] = $location;
-	}
-}
-
-foreach ($files as $file => $locations) {
-	echo "<h3>$file</h3>";
-	echo "<ul>";
-	foreach ($locations as $path) {
-		echo "<li>$path</li>";
-	}
-	echo "</ul>";
-}
-
-echo get_trace_html();
-
-?>
-</div>
-</div>
-
-<?php 
-$html = ob_get_contents();
-ob_end_clean();
-$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
-?>
\ No newline at end of file
diff --git a/web-api/commit-companies.php b/web-api/commit-companies.php
deleted file mode 100644
index 14ae4a9..0000000
--- a/web-api/commit-companies.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/*******************************************************************************
- * Copyright (c) 2010 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(dirname(__FILE__) . '/common.inc');
-mustBeEclipseFoundationCaller();
-
-header("Content-type: text/plain");
-require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection_foundation_ro.class.php";
-
-  $_dbcf = new DBConnectionFoundation();
-  $_dbhf = $_dbcf->connect();
-
-    $foundation_query = "SELECT DISTINCT People.PersonID, Name1, Name2, FName, LName from People
-		LEFT JOIN OrganizationContacts ON People.PersonID = OrganizationContacts.PersonID AND Relation IN ('CC', 'EMPLY')
-		LEFT JOIN Organizations ON Organizations.OrganizationID = OrganizationContacts.OrganizationID
-		;";
-//    echo( $foundation_query . "\n" );
-    $result = mysql_query($foundation_query, $_dbhf);
-    if( !$result ) {
-        echo("MySQL Error: ". mysql_error());
-        echo( $foundation_query . "\n" );
-        exit( "Stopped because error\n" );
-    }
-    while( $row = mysql_fetch_array($result) ) {
-    	$company = $row[1] . $row[2];
-	    //$company = preg_replace( "/[^A-Za-z0-9_\.\-]/", "", $company );
-	    $login = trim($row[0]);
-	    $fullname = $row[3] . " " . $row[4];
-	    if( $company == "" ) $company = "individual";
-	    echo "$login\t$company\t$fullname\n";
-    }
-
-?>
diff --git a/web-api/commit-company-active-projects.php b/web-api/commit-company-active-projects.php
deleted file mode 100755
index 15765ed..0000000
--- a/web-api/commit-company-active-projects.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/*******************************************************************************
- * Copyright (c) 2014 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");
-$App = new App();
-
-/**
- * @deprecated Use getActiveProjectsForOrganization() in Project.class.php
- * @param int $orgId
- * @return string[]
- */
-function get_projects_this_company_is_active_on( $orgId ) {
-	global $App;
-	
-	$sql = "select distinct project from ProjectCompanyActivity where orgId=$orgId";
-	$result = $App->dashboard_sql($sql);
-	
-	$projects = array();
-	while ($row = mysql_fetch_assoc($result)) {
-		$projects[] = $row['project'];
-	}
-	return $projects;
-}
-?>
diff --git a/web-api/commit-execute-query.php b/web-api/commit-execute-query.php
deleted file mode 100644
index dc62171..0000000
--- a/web-api/commit-execute-query.php
+++ /dev/null
@@ -1,67 +0,0 @@
-Version 30 <br>
-<?php
-$logfile = "/home/data/httpd/writable/community/commit-inserts.log";
-if( !preg_match( "/24.20.10.28/", $_SERVER['REMOTE_ADDR'] ) // Bjorn's home office
- && !preg_match( "/168.103.234.47/", $_SERVER['REMOTE_ADDR'] ) // Eclipse Portland office
- ) {
-   $log = fopen( $logfile, "a" );
-   fwrite( $log, date('Y-m-d.H:i:s') . " " . $_SERVER['REMOTE_ADDR'] . " is an invalid caller of commit-execute-query\n" );
-   fclose( $log );
-   echo $_SERVER['REMOTE_ADDR'] . " is an invalid caller<br>\n";
-   exit;
-}
-?>include..<br><?php
-/*
- * Execute the query in the writable/community/query.txt file
- * Check that it is owned by Bjorn and not group or world writable
- * in order to prevent db attacks.
- */
-include "/home/data/httpd/eclipse-php-classes/system/dbconnection_foundation_ro.class.php";
-
-?>exists..<br><?php
-  $filename = "/home/data/httpd/writable/community/query.txt";
-  if( !file_exists( $filename ) ) {
-    echo "query.txt does not exist - exiting";
-    exit;
-  }
-?>group..<br><?php
-//  $a = posix_getpwuid( fileowner( $filename ));
-//  if( $a['name'] != "bfreeman" ) {
-//    echo "query.txt is not owned by bfreeman - exiting";
-//    exit;
-//  }
-?>permissions..<br><?php
-  $p = fileperms( $filename );
-  if( ($p & 0x0012) != 0 ) {
-    echo "query.txt is group or world writable - exiting";
-    exit;
-  }
-?>load..<br><?php
-  $q1 = file( $filename );
-  $q2 = implode( "", $q1 );
-  $q3 = explode( ";", $q2 );
-  
-  $_dbc = new DBConnectionFoundation();
-  $_dbh = $_dbc->connect();
-  for( $j = 0; $j < count($q3); $j++ ) {
-    $_query = $q3[$j];
-    $_query = rtrim( $_query );
-    if( $_query == "" ) continue;
-    echo "<b>/$_query/</b><br>\n";
-    flush();
-
-    $result = mysql_query($_query,$_dbh);
-    if (!$result) {
-        echo("MySQL Error: ".mysql_error());
-    } else {
-      while( $row = mysql_fetch_array($result) ) {
-        for( $i = 0; $i < count($row); $i++ ) {
-          echo "/$row[$i]/\t";
-        }
-        echo "<br>\n";
-      }
-    }
-  }
-?>
-<p>
-End of query.
diff --git a/web-api/commit-inactives.php b/web-api/commit-inactives.php
deleted file mode 100644
index ec6d09c..0000000
--- a/web-api/commit-inactives.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-$logfile = "/home/data/httpd/writable/community/commit-inserts.log";
-if( !preg_match( "/206\.191\.52\.40|209\.217\.126\.125/", $_SERVER['REMOTE_ADDR'] ) ) { /* dash.eclipse.org */
-   $log = fopen( $logfile, "a" );
-   fwrite( $log, date('Y-m-d.H:i:s') . " " . $_SERVER['REMOTE_ADDR'] . " is an invalid caller\n" );
-   fclose( $log );
-   echo $_SERVER['REMOTE_ADDR'] . " is an invalid caller<br>\n";
-   exit;
-}
-header("Content-type: text/plain");
-require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection_foundation_ro.class.php";
-
-  $_dbcf = new DBConnectionFoundation();
-  $_dbhf = $_dbcf->connect();
-
-    $foundation_query = "SELECT PersonID, ProjectID from PeopleProjects WHERE Relation = 'CM' and InactiveDate is not null
-		;";
-//    echo( $foundation_query . "\n" );
-    $result = mysql_query($foundation_query, $_dbhf);
-    if( !$result ) {
-        echo("MySQL Error: ". mysql_error());
-        echo( $foundation_query . "\n" );
-        exit( "Stopped because error\n" );
-    }
-    while( $row = mysql_fetch_array($result) ) {
-    	print $row[0] . "\t" . $row[1] . "\n";
-    }
-
-?>
diff --git a/web-api/commit-projects-committers.php b/web-api/commit-projects-committers.php
deleted file mode 100644
index 0e4f961..0000000
--- a/web-api/commit-projects-committers.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-$logfile = "/home/data/httpd/writable/community/commit-inserts.log";
-if( !preg_match( "/206\.191\.52\.40|209\.217\.126\.125/", $_SERVER['REMOTE_ADDR'] ) ) { /* dash.eclipse.org */
-   $log = fopen( $logfile, "a" );
-   fwrite( $log, date('Y-m-d.H:i:s') . " " . $_SERVER['REMOTE_ADDR'] . " is an invalid caller\n" );
-   fclose( $log );
-   echo $_SERVER['REMOTE_ADDR'] . " is an invalid caller<br>\n";
-   exit;
-}
-header("Content-type: text/plain");
-require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection_foundation_ro.class.php";
-
-  $_dbcf = new DBConnectionFoundation();
-  $_dbhf = $_dbcf->connect();
-
-    $foundation_query = "select ProjectID, PersonID, Relation, ActiveDate from PeopleProjects
-		where InactiveDate is null
-		;";
-//    echo( $foundation_query . "\n" );
-    $result = mysql_query($foundation_query, $_dbhf);
-    if( !$result ) {
-        echo("MySQL Error: ". mysql_error());
-        echo( $foundation_query . "\n" );
-        exit( "Stopped because error\n" );
-    }
-    while( $row = mysql_fetch_array($result) ) {
-	    $logins = explode( " ", $row[0] );
-	    foreach( $logins as $login ) {
-	    	echo "$login	$row[1]	$row[2]	$row[3]\n";
-        }
-    }
-
-?>
diff --git a/web-api/commit-set-actives.php b/web-api/commit-set-actives.php
deleted file mode 100644
index fd06451..0000000
--- a/web-api/commit-set-actives.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-$logfile = "/home/data/httpd/writable/community/commit-inserts.log";
-if( !preg_match( "/206\.191\.52\.40|209\.217\.126\.125/", $_SERVER['REMOTE_ADDR'] ) ) { /* dash.eclipse.org */
-   $log = fopen( $logfile, "a" );
-   fwrite( $log, date('Y-m-d.H:i:s') . " " . $_SERVER['REMOTE_ADDR'] . " is an invalid caller\n" );
-   fclose( $log );
-   echo $_SERVER['REMOTE_ADDR'] . " is an invalid caller<br>\n";
-   exit;
-}
-header("Content-type: text/plain");
-require_once("/home/data/httpd/eclipse-php-classes/system/dbconnection_portal_rw.class.php");
-
-	$dbconnect = new DBConnectionPortalRW();
-	$pdbh = $dbconnect->connect();
-
-    $sql = "SELECT PersonID, ProjectID FROM PeopleProjectActives
-			WHERE DATEDIFF(NOW(),ActiveDate) < 180
-		;";
-    $result = mysql_query($sql, $pdbh);
-    if( !$result ) {
-        echo("MySQL Error: ". mysql_error());
-        echo( $foundation_query . "\n" );
-        exit( "Stopped because error\n" );
-    }
-    while( $row = mysql_fetch_array($result) ) {
-    	print $row[0] . "\t" . $row[1] . "\n";
-    }
-
-?>
diff --git a/web-api/common.inc b/web-api/common.inc
deleted file mode 100644
index 73e974b..0000000
--- a/web-api/common.inc
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php 
-/*******************************************************************************
- * Copyright (c) 2010 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
- *******************************************************************************/
-
-// @deprecated File to be removed. Use /projects/classes/common.php instead.
-
-require_once dirname(__FILE__) . '/../classes/common.php';
-
-?>
\ No newline at end of file
diff --git a/web-api/email-id-map.php b/web-api/email-id-map.php
deleted file mode 100644
index fc51e85..0000000
--- a/web-api/email-id-map.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-/*******************************************************************************
- * Copyright (c) 2010,2011 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
- *    Wayne Beaton (Eclipse Foundation) - Bug 355885.
- *******************************************************************************/
-
-require_once(dirname(__FILE__) . '/common.inc');
-mustBeEclipseFoundationCaller();
-
-require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");	
-$App = new App();	
-
-header("Content-type: text/plain");
-$result = $App->foundation_sql("SELECT distinct People.PersonID as id, People.EMail as email, People.Comments as comment FROM People join PeopleProjects on (People.PersonID = PeopleProjects.PersonId) where relation='CM'");
-
-while($row = mysql_fetch_assoc($result)) {
-	$emails = extractEmails($row['email'], $row['comment']);
-	$id = $row['id'];
-	
-	foreach($emails as $email) {
-		echo "$email\t$id\n";
-	}
-}
-
-/**
- * This function extract the email addresses from the comment and returns 
- * them--along with the provided primary email address--in an array.
- * 
- * This is a stop-gap solution for the need to represent multiple email addresses
- * for some users in some contexts. Alternative email addresses are represented in
- * the comment field in the form 'alt-email:somebody@someplace.com'. Multiple
- * alternative addresses can be provided. The tag can occur anywhere in the comment
- * and--while it is not always required--it is good practice to leave a space
- * between multiple entries.
- * 
- * WTB Bug 355885
- */
-function extractEmails($primary, $comment) {
-	preg_match_all('/alt-email:(\S*)/i', $comment, $matches);
-	$emails = array();
-	$emails[] = $primary;
-	foreach($matches[1] as $email) {
-		if ($primary == $email) continue;
-		$emails[] = $email;
-	}
-	return $emails;
-}
-?>
\ No newline at end of file
diff --git a/web-api/inactive-non-corporate-committers.php b/web-api/inactive-non-corporate-committers.php
deleted file mode 100755
index a9a8d6e..0000000
--- a/web-api/inactive-non-corporate-committers.php
+++ /dev/null
@@ -1,54 +0,0 @@
-Version 3
-<ul>
-<?php
-require_once "/home/data/httpd/eclipse-php-classes/system/dbconnection_foundation_ro.class.php";
-
-$_dbcf = new DBConnectionFoundation();
-$_dbhf = $_dbcf->connect();
-
-$peeps = array();
-$activ = array();
-$anyact = array();
-
-$sql = "
-select distinct People.PersonID, ProjectID 
-from People, PeopleProjects 
-where People.PersonID = PeopleProjects.PersonID 
-  and People.IsMember
-  and PeopleProjects.Relation = 'CM' 
-  and PeopleProjects.InactiveDate is null 
-  and People.PersonID NOT IN (
-  		SELECT PersonID 
-  		FROM OrganizationContacts 
-  		WHERE Relation = 'EMPLY') 
-  AND Email NOT LIKE '%ibm%' ORDER BY ProjectID
-";
-$result = mysql_query( $sql, $_dbhf );
-while( $row = mysql_fetch_array($result) ) {
-	$peeps[$row[0] . ' x ' . $row[1]] = $row[0];
-}
-/*
- * Get all the committer activity
- */
-$blob = file("http://dash.eclipse.org/dash/commits/web-api/commits-index.php");
-foreach( $blob as $line ) {
-	$words = split( "\t", $line );
-	if( substr($words[0],0,1) == '#' ) {
-		continue;
-	}
-	if( $words[2] == 9 && $words[1] > 0 )  {
-		$activ[$words[0] . ' x ' . $words[3]] = 1;
-		$anyact[$words[0]] = 1;
-	}
-}
-/*
- * Figure out which non-corporate committers are inactive
- */
-foreach( $peeps as $key => $value ) {
-	if( !isset($activ[$key]) ) {
-		if( !isset($anyact[$value]) ) 
-			echo "<li>$key</li>";
-	}
-}
-?>
-</ul>
diff --git a/web-api/kpi-organization-committers.php b/web-api/kpi-organization-committers.php
deleted file mode 100644
index 69cb9db..0000000
--- a/web-api/kpi-organization-committers.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/*******************************************************************************
- * Copyright (c) 2012 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");
-$App = new App();
-
-$result = $App->foundation_sql("select year(min(EntryDate)) as year, month(min(EntryDate)) as month from OrganizationMemberships where EntryDate<>date(0)");
-if ($row = mysql_fetch_assoc($result)) {
-	$year = $result['year'];
-	$month = $result['month'];
-} else {
-	die();
-}
-
-if (!$year) $year = '2001';
-if (!$month) $month = '11';
-
-$start = strtotime("$year-$month-01");
-while ($start < time()) {
-	$end = strtotime("+1 month", $start);
-	
-	$period = date('Ym', $start);
-	$startDate = date('Y-m-d', $start);
-	$endDate = date('Y-m-d', $end);
-	$sql = "select count(distinct o.OrganizationId) as count
-		from Organizations as o 
-			join OrganizationMemberships as om 
-				on o.OrganizationId=om.OrganizationId 
-				and om.EntryDate < date('$endDate')
-				and (om.ExpiryDate=date(0) or date('$startDate') <= om.ExpiryDate)
-			join OrganizationContacts as oc on om.OrganizationId=oc.OrganizationId
-			join People as p on oc.PersonId=p.PersonId and p.PersonId in (select distinct pp.PersonId from PeopleProjects as pp where pp.Relation='CM' and pp.InactiveDate is null)";
-	$result = $App->foundation_sql($sql);
-	while ($row = mysql_fetch_assoc($result)) {
-		$count = $row['count'];
-		echo "$period,$count\n";
-	}
-	$start = $end;
-}
-
-?>
\ No newline at end of file
diff --git a/web-api/project_release_versions.php b/web-api/project_release_versions.php
deleted file mode 100755
index f2d87f6..0000000
--- a/web-api/project_release_versions.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-/**
- * Copyright (c)  2008 Eclipse Foundation and others.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * Contributors:
- *    Denis Roy (Eclipse Foundation) - initial API and implementation
- *
- * SPDX-License-Identifier: EPL-2.0
- */
-
-include "/home/data/httpd/eclipse-php-classes/system/dbconnection.class.php";
-
-$dbc = new DBConnection();
-$dbh = $dbc->connect();
-
-$sql = "SELECT * FROM v_project_versions ORDER BY project_id";
-$result = mysql_query($sql,$dbh);
-while($myrow = mysql_fetch_assoc($result)) {
-  echo $myrow['project_id'] . "," . $myrow['product'] . "," . $myrow['product_id'] . "," . $myrow['version'] . "\n";
-}
-$dbc->disconnect();
\ No newline at end of file
diff --git a/web-api/repos.php b/web-api/repos.php
deleted file mode 100755
index 41bf9a8..0000000
--- a/web-api/repos.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-/*******************************************************************************
- * Copyright (c) 2011 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
- *******************************************************************************/
-
-header("Content-type: text/plain");
-
-require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
-$App = new App();
-
-require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/Project.class.php");
-require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/debug.php");
-trace_file_info(__FILE__);
-
-
-if (in_array($_REQUEST['type'], array('cvs', 'svn', 'git')))
-	$type = $_REQUEST['type'];
-else $type = 'cvs';
-
-$projects = getActiveProjects();
-
-foreach($projects as $project) {
-	/* @var $project Project */
-	$id = $project->getId();
-	if (!$pmi = get_project_from_pmi($id)) continue;
-	foreach ($pmi->getSourceRepositories() as $repository) {
-		/* @var $repository SourceRepository */
-		if ($repository->getType() != $type) continue;
-		$path = $repository->getPath();
-		
-		echo "$id\t$path\n";
-	}
-}
-
-?>
\ No newline at end of file
diff --git a/web-api/roots-generator.php b/web-api/roots-generator.php
deleted file mode 100644
index e6f0a5b..0000000
--- a/web-api/roots-generator.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/*******************************************************************************
- * Copyright (c) 2010, 2013 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
- *******************************************************************************/
-
-/**
- * @deprecated
- * 
- * Updated to pull Git data from the PMI. We need to re-evaluate how we
- * interact between project data and Dash/Git. Today, Dash (and other services)
- * use this script to determine what repositories it should care about and who
- * owns them. Dash needs to be more self-contained.
- */
-require_once(dirname(__FILE__) . '/common.inc');
-require_once(dirname(__FILE__) . '/../classes/Project.class.php');
-mustBeEclipseFoundationCaller();
-
-header("Content-type: text/plain");
-switch($_REQUEST['type']) {
-	default:
-	case 'cvs': $type = 'LIKE "%cvsroot%"'; break;
-	case 'svn': $type = 'NOT LIKE "%cvsroot%" AND VALUE NOT LIKE "%git%"'; break;
-	case 'git': return getGitRepositories();
-}
-
-require_once ("/home/data/httpd/eclipse-php-classes/system/dbconnection.class.php");
-require_once ("/home/data/httpd/eclipse-php-classes/system/dbconnection_foundation_ro.class.php");
-
-$_dbcf = new DBConnectionFoundation();
-$_dbhf = $_dbcf->connect();
-
-$resultf = mysql_query("SELECT ProjectID FROM Projects
-		WHERE IsActive = TRUE", $_dbhf);
-$active_projects = array();
-while( $rowf = mysql_fetch_assoc($resultf) ) {
-	$active_projects[$rowf['ProjectID']] = 1;
-}
-
-$dbc = new DBConnection();
-$dbh = $dbc->connect();
-
-$result = mysql_query("SELECT ProjectID, Value FROM v_projectinfo_merged
-		WHERE MainKey = 'sourcerepository' AND Value $type AND Value != ''", $dbh);
-
-while($row = mysql_fetch_assoc($result)) {
-	if( $active_projects[$row['ProjectID']] ) {
-		$repo = getSourceRepository($row['Value']);
-		echo $row['ProjectID'] . "\t" . $repo->getPath() . "\n";
-	}
-}
-
-function getGitRepositories() {
-	$json = json_decode(file_get_contents('https://projects.eclipse.org/json/repos/git'), true);
-	foreach($json as $project => $repositories) {
-		foreach($repositories as $repository) {
-			echo "$project\t$repository\n";
-		}
-	}
-}
-?>
\ No newline at end of file
diff --git a/web-parts/project_summary.php b/web-parts/project_summary.php
deleted file mode 100755
index 74de85d..0000000
--- a/web-parts/project_summary.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-/*******************************************************************************
- * Copyright (c) 2010 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");
-$App = new App();
-
-require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/Project.class.php");
-require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/debug.php");
-trace_file_info(__FILE__);
-
-$smallIconDir = "http://dev.eclipse.org/small_icons";
-
-$incubationInfoUrl = "http://wiki.eclipse.org/Development_Resources/HOWTO/Incubation_Phase";
-
-$id = $_GET['id'];
-if (is_valid_project_name($id)) {
-	$project = get_project($id);
-} else {
-	trace("The provided project id is invalid.");
-}
-
-if (!$project) {
-	echo "
-		<p>A Project is the main operational unit at Eclipse. 
-		Specifically, all open source software development at 
-		Eclipse occurs within the context of a Project. Projects 
-		have leaders, developers, code, builds, downloads, websites, 
-		and more. Projects are more than just the sum of their 
-		many parts, they are the means by which open source work 
-		is organized when presented to the communities of developers, 
-		adopters, and users. Projects provide structure that helps 
-		developers expose their hard work to a broad audience of 
-		consumers.</p>
-		<p>Select a project on the left to learn more.</p>";
-	echo get_trace_html();
-	exit;
-}
-
-echo "<div id=\"project-summary-box\">";
-
-renderBasic($project);
-renderInformation($project);
-renderNewsgroups($project);
-
-echo get_trace_html();
-
-echo "</div>";
-
-function renderBasic(&$project) {
-	$name = $project->getName();
-	$description = $project->getShortDescription();	
-		
-	if ($project->isInIncubationPhase())
-		echo "<img src=\"/projects/images/egg.gif\" title=\"This project in the Incubation Phase\" align=\"right\"/>";
-		
-	echo "<h4>$name</h4>";
-	
-	if ($project->isInIncubationPhase()) 
-		echo "<em>This project is in the <a href=\"$incubationInfoUrl\">Incubation Phase</a></em>.";
-	
-	if ($description)
-		echo "<p>$description</p>";
-}
-
-function renderInformation(&$project) {
-	global $smallIconDir;
-	
-	$projectSummaryImage = "$smallIconDir/apps/help-browser.png";
-	$wikiImage = "/home/categories/images/wiki.gif";
-	$documentationImage = "$smallIconDir/apps/system-installer.png";
-	$downloadsImage = "$smallIconDir/status/software-update-available.png";
-	
-	echo "<h5>Information</h5>";
-	
-	echo "<ul>";
-	
-	$id = $project->getId();
-	$projectSummaryUrl = "/projects/project.php?id=$id";
-	echo "<li style=\"list-style-image: url('$projectSummaryImage')\"><a href=\"$projectSummaryUrl\">Project Summary</a></li>";
-	
-	$wikiUrl = $project->getWikiUrl();
-	if ($wikiUrl) 
-		echo "<li style=\"list-style-image: url('$wikiImage')\"><a href=\"$wikiUrl\">Wiki Page</a></li>";
-	
-	$documentationUrl = $project->getDocumentationUrl();
-	if ($documentationUrl) 
-		echo "<li style=\"list-style-image: url('$documentationImage')\"><a href=\"$documentationUrl\">Documentation</a></li>";	
-				
-	$downloadsUrl = $project->getDownloadsUrl();
-	if ($downloadsUrl) 
-		echo "<li style=\"list-style-image: url('$downloadsImage')\"><a href=\"$downloadsUrl\">Downloads</a></li>";		
-
-	echo "</ul>";
-}
-
-function renderNewsgroups(&$project) {
-	global $smallIconDir;
-	
-	$icon = "$smallIconDir/apps/internet-news-reader.png";
-	
-	$newsgroups = $project->getNewsgroups();
-	if ($newsgroups) {
-		echo "<h5>Forums</h5>";
-		echo "<p>Communicate with the project committers via project <a href=\"/forums\">forums</a>.";
-		echo "<ul>";
-		foreach($newsgroups as $newsgroup) {
-			$type = $newsgroup->getType();
-			$name = $newsgroup->getName();
-			if (!$name) continue;
-			$description = $newsgroup->getDescription();
-			$forumUrl = "http://www.eclipse.org/forums/$name";
-			
-			$info = "<a href=\"$forumUrl\">$name</a>";
-			if ($description)
-				$info .= "<blockquote>$description</blockquote>";
-			echo "<li>$info</li>";
-		}
-		echo "</ul>";
-	}
-}
-?>
\ No newline at end of file
