diff --git a/downloadsites/committers/README.txt b/downloadsites/committers/README.txt
new file mode 100644
index 0000000..27fb60f
--- /dev/null
+++ b/downloadsites/committers/README.txt
@@ -0,0 +1,3 @@
+Most of the files in this directory are 
+maintained in webtools cvs's releng.wtptools 
+project, in the downloadsites directory. 
diff --git a/downloadsites/committers/access_err.gif b/downloadsites/committers/access_err.gif
new file mode 100644
index 0000000..4f0748a
--- /dev/null
+++ b/downloadsites/committers/access_err.gif
Binary files differ
diff --git a/downloadsites/committers/access_warn.gif b/downloadsites/committers/access_warn.gif
new file mode 100644
index 0000000..8386e3e
--- /dev/null
+++ b/downloadsites/committers/access_warn.gif
Binary files differ
diff --git a/downloadsites/committers/api_err.gif b/downloadsites/committers/api_err.gif
new file mode 100644
index 0000000..4054878
--- /dev/null
+++ b/downloadsites/committers/api_err.gif
Binary files differ
diff --git a/downloadsites/committers/api_junit.gif b/downloadsites/committers/api_junit.gif
new file mode 100644
index 0000000..c372377
--- /dev/null
+++ b/downloadsites/committers/api_junit.gif
Binary files differ
diff --git a/downloadsites/committers/api_removed.gif b/downloadsites/committers/api_removed.gif
new file mode 100644
index 0000000..2b1d438
--- /dev/null
+++ b/downloadsites/committers/api_removed.gif
Binary files differ
diff --git a/downloadsites/committers/cleanup.sh b/downloadsites/committers/cleanup.sh
new file mode 100644
index 0000000..54cf1b8
--- /dev/null
+++ b/downloadsites/committers/cleanup.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+# script to delete warm-up builds, except the one promoted
+# the promoted on is left just for safety
+
+
+declaredStream=$1
+declaredDir=$2
+# make sure directories to delete start with same 3 chars as target
+pattern=${declaredDir:0:5}
+
+
+echo restrict to directory names that match $pattern
+echo act on directories older than $declaredDir
+
+
+# example of full form from command line
+# find ./drops -maxdepth 1 -type d -name I-I* -not -cnewer drops/I-I200603180020-200603180020  -exec rm -fr {} \;
+
+
+if [ "$3" != "-doit" ] ; then
+   echo "    This is a dry run. Add -doit to actually remove"
+   thisCommand=" echo " 
+else 
+   thisCommand=" rm -fr "
+fi 
+
+
+
+find ./drops -maxdepth 2 -type d -name "$pattern*" -not -newer "./drops/$declaredStream/$declaredDir" -exec $thisCommand  {} \; 
+
+
+
+
diff --git a/downloadsites/committers/compile_err.gif b/downloadsites/committers/compile_err.gif
new file mode 100644
index 0000000..c2bfdd6
--- /dev/null
+++ b/downloadsites/committers/compile_err.gif
Binary files differ
diff --git a/downloadsites/committers/compile_warn.gif b/downloadsites/committers/compile_warn.gif
new file mode 100644
index 0000000..cf4fdf9
--- /dev/null
+++ b/downloadsites/committers/compile_warn.gif
Binary files differ
diff --git a/downloadsites/committers/declare.sh b/downloadsites/committers/declare.sh
new file mode 100644
index 0000000..fa8b52c
--- /dev/null
+++ b/downloadsites/committers/declare.sh
@@ -0,0 +1,24 @@
+echo $1 $2
+
+declaredStream=$1
+declaredDir=$2
+
+FROMDIR=../committers/drops
+TODIR=../downloads/drops/${declaredStream}
+FROMDIR=$FROMDIR/${declaredStream}/${declaredDir}
+echo  "declaring build ${declaredDir} on buildstream  ${declaredStream}"
+echo  "   into ${TODIR}"
+echo  "   using the build from ${FROMDIR}"
+
+
+cp -R ${FROMDIR} ${TODIR}
+
+fromString="committers/drops/${declaredStream}/"
+toString="downloads/drops/${declaredStream}/"
+replaceCommand="s!${fromString}!${toString}!g"
+
+perl -w -pi -e ${replaceCommand} ${TODIR}/${declaredDir}/*.php
+
+#       update the update site
+#cp -ruv $HOME/downloads/webtools/committers/drops/$1/updateSite/features/   $HOME/downloads/webtools/milestones/
+#cp -ruv $HOME/downloads/webtools/committers/drops/$1/updateSite/plugins/   $HOME/downloads/webtools/milestones/
diff --git a/downloadsites/committers/declareUpdates.sh b/downloadsites/committers/declareUpdates.sh
new file mode 100644
index 0000000..0095491
--- /dev/null
+++ b/downloadsites/committers/declareUpdates.sh
@@ -0,0 +1,17 @@
+
+declaredStream=$1
+declaredDir=$2
+
+FROMDIR=$HOME/downloads/webtools/committers/drops
+FROMDIR=$FROMDIR/${declaredStream}/${declaredDir}/updateSite
+
+TODIR=$HOME/downloads/webtools/declaredUpdates
+
+echo  "declaring update ${declaredDir} on buildstream  ${declaredStream}"
+echo  "   into ${TODIR}"
+echo  "   using the build from ${FROMDIR}"
+
+
+# update the update site with changes only
+rsync --ignore-existing -rv $FROMDIR/features $TODIR
+rsync --ignore-existing -rv $FROMDIR/plugins $TODIR
diff --git a/downloadsites/committers/dlconfig.txt b/downloadsites/committers/dlconfig.txt
new file mode 100644
index 0000000..8cf2851
--- /dev/null
+++ b/downloadsites/committers/dlconfig.txt
@@ -0,0 +1,11 @@
+dropPrefix[]=R&
+dropPrefix[]=M&
+dropPrefix[]=S&
+dropPrefix[]=I&
+dropPrefix[]=N&
+
+dropType[]=<b>R</b>eleased (In progress)&
+dropType[]=<b>M</b>aintenance (In progress)&
+dropType[]=<b>S</b>table (Milestone) (In progress)&
+dropType[]=<b>I</b>ntegration (In progress)&
+dropType[]=<b>N</b>ightly (Head) Build&
diff --git a/downloadsites/committers/fixPendingHack.sh b/downloadsites/committers/fixPendingHack.sh
new file mode 100644
index 0000000..27e88f5
--- /dev/null
+++ b/downloadsites/committers/fixPendingHack.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+
+
+fromString="\<font size=\"-1\" color=\"#FF0000\"\>pending\</font\>"
+toString="\<img src = \"OK.gif\" width=19 height=23\>"
+replaceCommand="s!${fromString}!${toString}!g"
+echo "replaceCommand: ${replaceCommand}"
+perl -w -pi -e "${replaceCommand}" index.php
+ 
diff --git a/downloadsites/committers/index.php b/downloadsites/committers/index.php
new file mode 100644
index 0000000..b3d302c
--- /dev/null
+++ b/downloadsites/committers/index.php
@@ -0,0 +1,583 @@
+<html>
+<head>
+<link rel="stylesheet" href="http://dev.eclipse.org/default_style.css">
+<title>Eclipse Web Tools Platform (WTP) Downloads - for Committers and
+Early Testers</title>
+</head>
+<body>
+
+<!-- heading start -->
+<?php
+
+// tiny banner to remind when looking at "local" machine results
+$serverName = $_SERVER["SERVER_NAME"];
+
+if (!stristr($serverName, "eclipse.org") && !stristr($serverName,"you.are.at.eclipsecon.org")) {
+  echo '<center><p>Reminder: this is <font color="#FF0000">', $serverName,'</font>  See also <a href="http://download.eclipse.org/webtools/downloads" target="_top">Live public eclipse site</a>.</center><hr />';
+}
+
+if (function_exists("date_default_timezone_set")) {
+  date_default_timezone_set("UTC");
+  //echo "<p>default timezone: ";
+  //echo date_default_timezone_get();
+  //echo "</p>";
+}
+
+?>
+
+
+<?php
+//ini_set("display_errors", "true");
+//error_reporting (E_ALL);
+?>
+
+<?php
+$QString = $_SERVER['QUERY_STRING'];
+$C = strcmp($QString, "test");
+?>
+
+
+<table border=0 cellpadding=0 width="100%">
+<tr>
+<td width="35%"><font class=indextop> Web Tools Platform<br>
+committer downloads</font><br>
+<font class=indexsub>Latest early trial downloads from the Web Tools Platform project</font></td>
+<td width="35%" align="right"><a href="http://www.eclipse.org/webtools/main.html"><img border="0"src="wtplogonarrow.jpg" height="95" width="207"></a></td>
+</tr>
+</table>
+
+<!-- heading end -->
+
+
+<hr />
+<table border=0 cellpadding=2 width="70%" align="center">
+	<tr>
+		<td>
+		<p>This is the starting page for where you can find the latest <a
+			href="http://wiki.eclipse.org/index.php/WTP_Build_Types">continuous build</a> produced by the <a
+			href="http://www.eclipse.org/webtools/main.html">Eclipse Web Tools
+		Platform (WTP) Project</a>. Please note that each build page details
+		the pre-reqs for that particular build.</p>
+
+		<p>If you got here to this continuous-build site by accident or casual
+		browsing, please be aware that <a
+			href="http://download.eclipse.org/webtools/downloads/" target="_top">
+		declared builds</a> are available!</p>
+		</td>
+	</tr>
+</table>
+
+<?php
+$contents = substr(file_get_contents('dlconfig.txt'),0,-1);
+$contents = str_replace("\n", "", $contents);
+
+#split the content file by & and fill the arrays
+$elements = explode("&",$contents);
+$t = 0;
+$p = 0;
+for ($c = 0; $c < count($elements); $c++) {
+  $tString = "dropType";
+  $pString = "dropPrefix";
+  if (strstr($elements[$c],$tString)) {
+    $temp = preg_split("/=/",$elements[$c]);
+    $dropType[$t] = trim($temp[1]);
+    $t++;
+  }
+  if (strstr($elements[$c],$pString)) {
+    $temp = preg_split("/=/",$elements[$c]);
+    $dropPrefix[$p] = trim($temp[1]);
+    $p++;
+  }
+}
+
+// debug
+// echo "Debug: droptype count: ", count($dropType), "<br />";
+
+for ($i = 0; $i < count($dropType); $i++) {
+  $dt = $dropType[$i];
+  $dt = trim($dt);
+  $typeToPrefix[$dt] = $dropPrefix[$i];
+
+  //   echo "Debug prefix: ", $dropPrefix[$i], "<br />";
+  //   echo "Debug dropType: ", $dropType[$i], "<br />";
+
+}
+
+$buildBranches = array();
+$buildBranches[0]="R2.0";
+$buildBranches[1]="R1.5";
+$buildBranches[2]="R1.0";
+$buildBranches[3]="R0.7";
+include 'report.php';
+include 'report2.php';
+
+$latestTimeStamp=array();
+$latestFile = array();
+
+echo "<table border=0 cellpadding=2 width=\"100%\"><tr>";
+echo "<td align=\"center\" bgcolor=\"#0080C0\"><b><font color=\"#FFFFFF\" face=\"Arial,Helvetica\">";
+echo "Latest Downloads (In progress, towards a declared build)";
+echo "</td></font></b>";
+echo "</tr></table>";
+
+
+
+foreach ($buildBranches as $buildBranch ) {
+
+  $aBranchDirectoryName = "drops/".$buildBranch;
+  if (file_exists($aBranchDirectoryName) && is_dir($aBranchDirectoryName)) {
+    $aDirectory = dir($aBranchDirectoryName);
+    $latestTimeStamp[$buildBranch] = array();
+    $latestFile[$buildBranch] = array();
+
+
+    while (false !== ($anEntry = $aDirectory->read())) {
+
+      // Short cut because we know aDirectory only contains other directories.
+      if ($anEntry != "." && $anEntry!="..") {
+        // echo "Debug anEntry: $anEntry<br />" ;
+        $aDropDirectoryName = "drops/".$buildBranch."/".$anEntry;
+
+
+        if (is_dir($aDropDirectoryName) && is_Readable($aDropDirectoryName)) {
+          $aDropDirectory = dir($aDropDirectoryName);
+          //echo "Debug aDropDirectory: $aDropDirectory->path <br />" ;
+
+          $fileCount = 0;
+          while ($aDropEntry = $aDropDirectory->read()) {
+            // echo "Debug aDropEntry: $aDropEntry<br />" ;
+            if ( (stristr($aDropEntry, ".tar.gz")) || (stristr($aDropEntry, ".zip")) )  {
+              // Count the dropfile entry in the directory (so we won't display links, if not all there
+              $fileCount = $fileCount + 1;
+            }
+          }
+
+          $aDropDirectory->close();
+
+        }
+        // Read the count file
+        $countFile = "drops/".$buildBranch."/".$anEntry."/files.count";
+        $indexFile = "drops/".$buildBranch."/".$anEntry."/index.html";
+
+
+        if (!file_exists($indexFile)) {
+          $indexFile = "drops/".$buildBranch."/".$anEntry."/index.php";
+        }
+
+
+        if (file_exists($countFile) && file_exists($indexFile)) {
+          $anArray = file($countFile);
+          // debug
+          //echo "Number according to files.count: ", $anArray[0];
+          //echo "   actual counted files: ", $fileCount;
+
+          // If a match - process the directoryVV -- we simply look that there's more
+          // zip's than we expect, since it frequently breaks where the count is slighly
+          // off, such as when we add, after the fact, an all-in-one zip.
+          if ($anArray[0] <= $fileCount) {
+            // debug
+            //echo "yes, counted equaled expected count<br>";
+
+            $entryParts = explode("-", $anEntry);
+            if (count($entryParts) == 3) {
+              // debug
+              //echo "yes, counted parts was 3<br>";
+              $buildTypePart = $entryParts[0];
+              $buckets[$buildBranch][$buildTypePart][] = $anEntry;
+
+              $timePart = $entryParts[2];
+              $year = substr($timePart, 0, 4);
+              $month = substr($timePart, 4, 2);
+              $day = substr($timePart, 6, 2);
+              $hour = substr($timePart,8,2);
+              $minute = substr($timePart,10,2);
+
+              $newTimePart = "$year-$month-$day $hour:$minute UTC";
+
+              $timeStamp = strtotime($newTimePart);
+
+              $timeStamps[$anEntry] = gmdate("D, j M Y -- H:i  \(\U\T\C\)", $timeStamp);
+
+              // debug
+              //  echo "<br />buildBranch:  $buildBranch <br />";
+              //  echo "<br />parts[0]:  -$buildTypePart- <br />";
+              //  echo "latestTimeStamp[buildBranch]:";
+              //  echo $latestTimeStamp[$buildBranch];
+              //  echo "latestTimeStamp:";
+              //  echo $latestTimeStamp;
+
+              if ((sizeof($latestTimeStamp[$buildBranch]) > 0) &&
+              (isset($latestTimeStamp[$buildBranch][$buildTypePart])))
+              {
+                if ($timeStamp > $latestTimeStamp[$buildBranch][$buildTypePart])
+                {
+                  $latestTimeStamp[$buildBranch][$buildTypePart] = $timeStamp;
+                  $latestFile[$buildBranch][$buildTypePart] = $anEntry;
+                }
+              }
+              else
+              {
+                $latestTimeStamp[$buildBranch][$buildTypePart] = $timeStamp;
+                $latestFile[$buildBranch][$buildTypePart] = $anEntry;
+
+              }
+            }
+
+          }
+        }
+
+      }
+    }
+
+    $aDirectory->close();
+  }}
+
+?>
+
+
+<table width="70%" align="center" cellpadding=2>
+<tr>
+<td width="25%"><b>Build Type</b></td>
+<td width="25%"><b>Build Name</b></td>
+<td width="15%"><b>Stream</b></td>
+<td width="40%"><b>Build Date</b></td>
+</tr>
+
+
+
+<?php
+foreach($dropType as $value) {
+  $prefix=$typeToPrefix[$value];
+
+  foreach($buildBranches as $bValue) {
+
+    if (array_key_exists($prefix, $latestFile[$bValue])) {
+      $fileName = $latestFile[$bValue][$prefix];
+      echo "<tr>";
+      echo "<td width=\"25%\">$value</td>";
+
+
+      $fileNameParts = explode("-", $fileName);
+
+      if (sizeof($fileNameParts) > 1) {
+        // Uncomment the line below if we need click through licenses.
+        // echo "<td><a href=license.php?license=drops/$bValue/$fileName>$parts[1]</a></td>";
+
+        // Comment the line below if we need click through licenses.
+        echo "<td  width=\"25%\"><a href=\"drops/$bValue/$fileName/\">$fileNameParts[1]</a></td>";
+        echo "<td width=\"15%\">$bValue</td>";
+        echo "<td width=\"40%\">$timeStamps[$fileName]</td>";
+        echo "</tr>";
+      }
+    }
+  }
+}
+?>
+
+<table border="0" cellpadding="2" width="100%">
+<tr>
+<td bgcolor="#0080C0">
+&nbsp;
+</td>
+</tr></table>
+
+
+</table>
+
+<table border="0" cellpadding="2" width="100%">
+	<tr>
+		<td align="center" bgcolor="#999999"><b><font color="#FFFFFF" face="Arial,Helvetica">Recent History</b></font></td>
+	</tr>
+</table>
+
+<?php
+foreach($dropType as $value) {
+  $prefix=$typeToPrefix[$value];
+
+
+  echo "
+                <table width=\"100%\" cellpadding=2>
+                <tr bgcolor=\"#999999\">
+                <td align=left><b><a name=\"$value\"><font color=\"#FFFFFF\" face=\"Arial,Helvetica\">";
+  echo "$value";
+  echo "</font></a></b></td>";
+  echo "</tr>";
+
+  echo "<tr>
+                <td align=left>
+                <table  width=\"100%\" cellpadding=2>
+                <tr>
+                <td width=\"13%\"><b>Build Name</b></td>
+								<td width=\"8%\"><b>Stream</b></td>
+                <td width=\"20%\"><b>Build Date</b></td>
+                <td></td>
+                </tr>";
+
+  foreach($buildBranches as $bValue) {
+    if (array_key_exists($bValue, $buckets) && $buckets[$bValue] != NULL
+    && array_key_exists($prefix, $buckets[$bValue])) {
+      echo "<tr><td colspan=\"11\"/><hr/></tr>";
+      $aBucket = $buckets[$bValue][$prefix];
+      if (isset($aBucket)) {
+        rsort($aBucket);
+
+        $i = 0;
+        $ts = array();
+        $ts2iv = array();
+        foreach($aBucket as $iv) {
+          $ivParts = explode("-", $iv);
+          $ts[$i] = $ivParts[2];
+          $ts2iv[$ts[$i]] = $iv;
+          $i++;
+        }
+
+        rsort($ts);
+        $i = 0;
+        $aBucket = array();
+        foreach($ts as $tsvalue) {
+          $aBucket[$i] = $ts2iv[$tsvalue];
+          $i++;
+        }
+
+        foreach($aBucket as $innerValue) {
+          
+          $innerValueParts = explode("-", $innerValue);
+          echo "<tr>";
+
+          // Uncomment the line below if we need click through licenses.
+          // echo "<td><a href=\"license.php?license=drops/$bValue/$innerValue\">$innerValueParts[1]</a></td>";
+
+          // Comment the line below if we need click through licenses.
+          echo "<td width=\"13%\"><a href=\"drops/$bValue/$innerValue/\">$innerValueParts[1]</a></td>";
+          echo "<td width=\"8%\">$bValue</td>";
+          echo "<td width=\"20%\">$timeStamps[$innerValue]</td>";
+          echo "<td></td>";
+
+          // if compilelogsSummary.xml exists, assume the "new way" (summary in xml file).
+          // else, assume old way
+          //echo "drops/$bValue/$innerValue/compilelogsSummary.xml";
+          if (file_exists("drops/$bValue/$innerValue/compilelogsSummary.xml"))
+          {
+            $filename = "drops/$bValue/$innerValue/compilelogsSummary.xml";
+            $prefix = "code_";
+            $compileSummary = simplexml_load_file($filename);
+            foreach ($compileSummary->summaryItem as $summaryItem) {
+              $name = $summaryItem->name;
+              $value = $summaryItem->value;
+              $code= "\$" . $prefix . $name . " = " . $value . ";";
+              //echo "<br />code: " . $code;
+              eval($code);
+            }
+            //echo "drops/$bValue/$innerValue/testcompilelogsSummary.xml";
+            $filename = "drops/$bValue/$innerValue/testcompilelogsSummary.xml";
+            $prefix = "test_";
+            $compileSummary = simplexml_load_file($filename);
+            foreach ($compileSummary->summaryItem as $summaryItem) {
+              $name = $summaryItem->name;
+              $value = $summaryItem->value;
+              $code= "\$" . $prefix . $name . " = " . $value . ";";
+              //echo "<br />code: " . $code;
+              eval($code);
+            }
+
+            if (file_exists("drops/$bValue/$innerValue/unitTestsSummary.xml")) {
+              $filename = "drops/$bValue/$innerValue/unitTestsSummary.xml";
+              $prefix = "unittest_";
+              $unitTestsSummary = simplexml_load_file($filename);
+              foreach ($unitTestsSummary->summaryItem as $summaryItem) {
+                $name = $summaryItem->name;
+                $value = $summaryItem->value;
+                $code= "\$" . $prefix . $name . " = " . $value . ";";
+                // echo "<br />code: " . $code;
+                eval($code);
+              }
+            }
+            else {
+              unset($unittest_grandTotalErrors, $unittest_grandTotalTests);
+            }
+
+            $totalCommpileErrors = $code_totalErrors + $test_totalErrors;
+            $totalCompileOtherWarnings = $code_totalWarnings;
+            $totalBundles = $code_totalBundles + $test_totalBundles;
+            $totalForbidden = $code_totalforbiddenAccessWarningCount + $test_totalforbiddenAccessWarningCount;
+            $totalDiscouraged = $code_totaldiscouragedAccessWarningCount + $test_totaldiscouragedAccessWarningCount;
+
+            echo "<td width=\"6%\">($totalBundles)</td>";
+            echo "<td width=\"6%\"><img src=\"compile_err.gif\" width=\"16\" height=\"16\"/><font color=red>$totalCommpileErrors</font></td>";
+            echo "<td width=\"6%\"><img src=\"compile_warn.gif\" width=\"16\" height=\"16\"/><font color=orange>$totalCompileOtherWarnings</font></td>";
+            echo "<td width=\"6%\"><img src=\"access_err.gif\" width=\"16\" height=\"16\"/><font color=red>$totalForbidden</font></td>";
+            echo "<td width=\"6%\"><img src=\"access_warn.gif\" width=\"16\" height=\"16\"/><font color=orange>$totalDiscouraged</font></td>";
+
+            if (isset($unittest_grandTotalErrors)) {
+              echo "<td width=\"6%\"><img src=\"junit_err.gif\" width=\"16\" height=\"16\"/><font color=red>$unittest_grandTotalErrors</font></td>";
+              echo "<td width=\"6%\">($unittest_grandTotalTests)</td>";
+            }
+            else {
+              echo "<td width=\"6%\"><img src=\"pending.gif\" width=\"16\" height=\"16\"/></td>";
+              echo "<td width=\"6%\"><img src=\"pending.gif\" width=\"16\" height=\"16\"/></td>";
+            }
+            echo "</tr>";
+          }
+          // if compileResults.php exists, assume the "new way" (testResults and compileResult seperated).
+          // else, assume old way
+          else if (file_exists("drops/$bValue/$innerValue/compileResults.php"))
+          {
+            $testResults = parse2_testResults("drops/$bValue/$innerValue/testResults.php");
+            list ($junitFailures) = $testResults;
+
+            $compileResults = parse2_compileResults("drops/$bValue/$innerValue/compileResults.php");
+            list ($compileErrors, $compileAccessWarnings, $compileOtherWarnings) = $compileResults;
+            $testCompileResults = parse2_compileResults("drops/$bValue/$innerValue/testCompileResults.php");
+            list ($testCompileErrors, $testCompileAccessWarnings, $testCompileOtherWarnings) = $testCompileResults;
+
+            $totalCommpileErrors = $compileErrors + $testCompileErrors;
+            // we'll just use code for warnning summaries, for now
+            $totalAccessWarnings = $compileAccessWarnings;
+            $totalCompileOtherWarnings = $compileOtherWarnings;
+
+            echo "<td width=\"6%\">&nbsp;</td>";
+            echo "<td width=\"6%\"><img src=\"compile_err.gif\" width=\"16\" height=\"16\"/><font color=red>$totalCommpileErrors</font></td>";
+            echo "<td width=\"6%\"><img src=\"compile_warn.gif\" width=\"16\" height=\"16\"/><font color=orange>$totalCompileOtherWarnings</font></td>";
+						if ($junitFailures < 0) {
+									echo "<td width=\"6%\"><img src=\"pending.gif\" width=\"16\" height=\"16\"/><font color=red>&nbsp;</font></td>";
+						}
+						else {
+									echo "<td width=\"6%\"><img src=\"junit_err.gif\" width=\"16\" height=\"16\"/><font color=red>$junitFailures</font></td>";
+						}
+
+            echo "</tr>";
+
+          }
+          else {
+            $testResults = parse_testResult("drops/$bValue/$innerValue/testResults.php");
+            list ($compileErrors, $compileWarnings, $junitFailures) = $testResults;
+
+            echo "<td width=\"6%\">&nbsp;</td>";
+            echo "<td width=\"6%\"><img src=\"compile_err.gif\" width=\"16\" height=\"16\"/><font color=red>$compileErrors</font></td>";
+            echo "<td width=\"6%\"><img src=\"compile_warn.gif\" width=\"16\" height=\"16\"/><font color=orange>$compileWarnings</font></td>";
+           	echo "<td width=\"6%\"><img src=\"junit_err.gif\" width=\"16\" height=\"16\"/><font color=red>$junitFailures</font></td>";
+
+            echo "</tr>";
+          }
+        }
+      }}}
+      echo "</table></table>";
+}
+?>
+
+<table border="0" cellpadding="2" width="100%">
+	<tr>
+		<td bgcolor="#999999">&nbsp;</td>
+	</tr>
+</table>
+
+
+<table border="0" width="100%" cellpadding="2">
+	<tbody>
+		<tr>
+			<td valign="top" width="40%">
+
+
+			<table border="0" cellpadding="2">
+				<tbody>
+					<tr>
+						<td width="100%" bgcolor="#0080c0" valign="top"><b><font
+							face="Arial,Helvetica"><font color="#ffffff">Download Related
+						Links</font> </font></b></td>
+					</tr>
+					<tr>
+						<td valign="top">
+
+
+						<p><a
+							href="http://archive.eclipse.org/webtools/downloads/index.php"
+							target="_top">Archived Builds</a> are previously significant
+						builds that are no longer required, but which we keep on a
+						non-mirrored site, for historical and academic use.</p>
+
+						<p><a href="http://download.eclipse.org/webtools/downloads/"
+							target="_top">Declared builds</a> are available which are for
+						end-users and adopters.</p>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+
+			</td>
+
+			<td />
+			
+			
+			<td width="45%" valign="top">
+			<table border="0" cellpadding="2">
+				<tbody>
+					<tr>
+						<td width="100%" colspan="4" bgcolor="#0080c0" valign="top"><b><font
+							face="Arial,Helvetica"><font color="#ffffff">Metrics Legend</font>
+						</font></b></td>
+					</tr>
+
+					<tr>
+						<td valign="top"><img src="compile_err.gif" width="16" height="16" /></td>
+						<td valign="top" width="50%">compilation errors.</td>
+						<td valign="top"><img src="compile_warn.gif" width="16" height="16" /></td>
+						<td valign="top" width="50%">compilation warnings.</td>
+					</tr>
+					<tr>
+						<td valign="top"><img src="access_err.gif" width="16" height="16" /></td>
+						<td valign="top" width="50%">Access Rule Violations</td>
+						<td valign="top"><img src="access_warn.gif" width="16" height="16" /></td>
+						<td valign="top" width="50%">Access Rule Warnings</td>
+					</tr>
+					<tr>
+						<td valign="top"><img src="junit_err.gif" width="16" height="16" /></td>
+						<td valign="top" width="50%">junit failures.</td>
+						<td valign="top"><img src="pending1.gif" width="16" height="16" /></td>
+						<td valign="top" width="50%">Pending results</td>
+					</tr>
+					<tr>
+						<td valign="top"><img src="api_err.gif" width="16" height="16" /></td>
+						<td valign="top" width="50%">API violations.</td>
+
+						<td valign="top"><img src="api_junit.gif" width="16" height="16" /></td>
+						<td valign="top" width="50%">APIs without junit testcases.</td>
+					</tr>
+					<tr>
+						<td valign="top"><img src="api_removed.gif" width="16" height="16" /></td>
+						<td valign="top" width="50%">removed APIs.</td>
+					</tr>
+					<tr>
+						<td valign="top"><b>(</b>nnn<b>)</b></td>
+						<td valign="top">Number of bundles, jars, and wars, or number of
+						unit tests.</td>
+
+						<td valign="top"><b>NA</b></td>
+						<td valign="top"><b>N</b>ot <b>A</b>vailable</td>
+					</tr>
+				</tbody>
+			</table>
+			</td>
+		</tr>
+	</tbody>
+</table>
+
+<!-- footer -->
+<center>
+<hr />
+<p>All downloads are provided under the terms and conditions of the <a
+	href="http://www.eclipse.org/legal/notice.html">Eclipse.org Software
+User Agreement</a> unless otherwise specified.</p>
+
+<p>If you have problems downloading the drops, contact the <font
+	size="-1" face="arial,helvetica,geneva"><a
+	href="mailto:webmaster@eclipse.org">webmaster</a></font>.</p>
+</center>
+<!-- end footer -->
+
+</body>
+</html>
+<?php
+if (isset($old_error_handler) && sizeof($old_error_handler)) {
+  set_error_handler($old_error_handler);
+}
+?>
diff --git a/downloadsites/committers/junit_err.gif b/downloadsites/committers/junit_err.gif
new file mode 100644
index 0000000..1b7ff9d
--- /dev/null
+++ b/downloadsites/committers/junit_err.gif
Binary files differ
diff --git a/downloadsites/committers/pending.gif b/downloadsites/committers/pending.gif
new file mode 100644
index 0000000..66db2a6
--- /dev/null
+++ b/downloadsites/committers/pending.gif
Binary files differ
diff --git a/downloadsites/committers/pending1.gif b/downloadsites/committers/pending1.gif
new file mode 100644
index 0000000..1b2ea6e
--- /dev/null
+++ b/downloadsites/committers/pending1.gif
Binary files differ
diff --git a/downloadsites/committers/report.php b/downloadsites/committers/report.php
new file mode 100644
index 0000000..1d011d2
--- /dev/null
+++ b/downloadsites/committers/report.php
@@ -0,0 +1,148 @@
+<?php
+  function count_pattern($directory, $filenameFilter, $pattern)
+  {
+    $count = 0;
+    $dir = dir($directory);
+    while ($anEntry = $dir->read())
+    {
+      if ($anEntry != "." && $anEntry != "..")
+      {
+        $anEntry = $directory."/".$anEntry;
+        if (is_dir($anEntry))
+        {
+          $count += count_pattern($anEntry, $filenameFilter, $pattern);
+        }
+        else
+        {
+          if (stristr($anEntry, $filenameFilter))
+          {
+
+            $handle = @fopen($anEntry, "r");
+            if (FALSE !== $handle) {
+                    $size = filesize($anEntry);
+                    $content = fread($handle, $size);
+                    fclose($handle);
+                    $count += substr_count($content, $pattern);
+            }
+          }
+        }
+      }
+    }
+    return $count;
+  }
+
+  function parse_testResult($filename)
+  {
+    $junitFailures = 0;
+    $compileErrors = 0;
+    $compileWarnings = 0;
+    if (is_file($filename)) {
+    $handle = @fopen($filename, "r");
+    if ($handle)
+    {
+      $size = filesize($filename);
+      $content = fread($handle, $size);
+      fclose($handle);
+      $junitStart = strpos($content, "Errors &amp; Failures");
+      $junitEnd = strpos($content, "</table>", $junitStart);
+      $junitInfo = substr($content, $junitStart, $junitEnd - $junitStart);
+      $start = strpos($junitInfo, "<td><b><font color=\"#ff0000\">");
+      while ($start !== false)
+      {
+        $start += 29;
+        $stop = strpos($junitInfo, "</font></b></td>", $start);
+        if ($stop !== false)
+        {
+          $result = substr($junitInfo, $start, $stop - $start);
+          if (is_numeric($result))
+          {
+            $junitFailures += $result;
+          }
+          else if (strcmp($result, "DNF") == 0)
+          {
+            $junitFailures++;
+          }
+        }
+        $start = strpos($junitInfo, "<td><b><font color=\"#ff0000\">", $stop);
+      }
+      $compileStart = strpos($content, "Compile Logs (Jar Files)");
+      $compileEnd = strpos($content, "</table>", $compileStart);
+      $compileInfo = substr($content, $compileStart, $compileEnd - $compileStart);
+      $rowStart = strpos($compileInfo, "<tr>");
+      while ($rowStart !== false)
+      {
+        $start += 4;
+        $rowStop = strpos($compileInfo, "</tr>", $rowStart);
+        if ($rowStop !== false)
+        {
+          $row = substr($compileInfo, $rowStart, $rowStop - $rowStart);
+          $cellStart = strpos($row, "<td");
+          $gotError = false;
+          $gotWarning = false;
+          while ($cellStart !== false && (!$gotError || !$gotWarning))
+          {
+            // this parsing logic got a bit more complicated in M2_33 basebuild, as the
+            // tag <td align="center"> was used, instead of <td>
+            // $cellStart += 4;
+            $cellStart = strpos($row, ">", $cellStart);
+            $cellStart = $cellStart + 1;
+            $cellStop = strpos($row, "</td>", $cellStart);
+            if ($cellStop !== false)
+            {
+              $cell = substr($row, $cellStart, $cellStop - $cellStart);
+              if (is_numeric($cell))
+              {
+                if (!$gotError)
+                {
+                  $compileErrors += $cell;
+                  $gotError = true;
+                }
+                else if (!$gotWarning)
+                {
+                  $compileWarnings += $cell;
+                  $gotWarning = true;
+                }
+              }
+            }
+            // this parsing logic got a bit more complicated in M2_33 basebuild, as the
+            // tag <td align="center"> was used, instead of <td>
+            $cellStart = strpos($row, "<td", $cellStop);
+          }
+        }
+        $rowStart = strpos($compileInfo, "<tr>", $rowStop);
+      }
+    }
+    }
+    $results = array($compileErrors, $compileWarnings, $junitFailures);
+    return $results;
+  }
+
+  function parse($filename, $key)
+  {
+    if (!is_readable($filename))
+    {
+      return 0;
+    }
+    $value;
+    $handle = @fopen($filename, "r");
+    if (!$handle)
+    {
+      return 0;
+    }
+    $size = filesize($filename);
+    $content = fread($handle, $size);
+    fclose($handle);
+    $start = strpos($content, $key);
+    while ($start !== false)
+    {
+      $start += strlen($key);
+      $stop = strpos($content, "\"", $start);
+      if ($stop !== false)
+      {
+        $value += substr($content, $start, $stop - $start);
+      }
+      $start = strpos($content, $key, $stop);
+    }
+    return $value;
+  }
+?>
diff --git a/downloadsites/committers/report2.php b/downloadsites/committers/report2.php
new file mode 100644
index 0000000..bf92db5
--- /dev/null
+++ b/downloadsites/committers/report2.php
@@ -0,0 +1,127 @@
+
+        <?php
+
+function parse2_testResults($filename)
+{
+        $junitFailures = -1;
+        if (is_file($filename)) {
+                $handle = @fopen($filename, "r");
+                if ($handle)
+                {
+                        $junitFailures = 0;
+                        $size = filesize($filename);
+                        $content = fread($handle, $size);
+                        fclose($handle);
+                        $junitStart = strpos($content, "Errors &amp; Failures");
+                        $junitEnd = strpos($content, "</table>", $junitStart);
+                        $junitInfo = substr($content, $junitStart, $junitEnd - $junitStart);
+                        $start = strpos($junitInfo, "<td><b><font color=\"#ff0000\">");
+                        while ($start !== false)
+                        {
+                                $start += 29;
+                                $stop = strpos($junitInfo, "</font></b></td>", $start);
+                                if ($stop !== false)
+                                {
+                                        $result = substr($junitInfo, $start, $stop - $start);
+                                        if (is_numeric($result))
+                                        {
+                                                $junitFailures += $result;
+                                        }
+                                        else if (strcmp($result, "DNF") == 0)
+                                        {
+                                                $junitFailures++;
+                                        }
+                                }
+                                $start = strpos($junitInfo, "<td><b><font color=\"#ff0000\">", $stop);
+                        }
+                        $results = array($junitFailures);
+                        return $results;
+                }
+        }
+}
+
+function parse2_compileResults($filename)
+{
+        $compileErrors = 0;
+        $compileAccessWarnings = 0;
+        $compileOtherWarnings = 0;
+        if (is_file($filename)) {
+                //echo "$filename<br />";
+                $handle = @fopen($filename, "r");
+                if ($handle)
+                {
+                        $size = filesize($filename);
+                        //echo "size: $size<br />";
+                        $content = fread($handle, $size);
+                        fclose($handle);
+
+                        //echo "$content";
+                        $compileStart = strpos($content, "<table id=tabledata");
+                        $compileEnd = strpos($content, "</table", $compileStart);
+                        $compileInfo = substr($content, $compileStart, $compileEnd - $compileStart);
+                        //echo "compileInfo: $compileInfo<br />";
+                        $rowStart = strpos($compileInfo, "<tr>");
+                        $rowStart = strpos($compileInfo, "<tr>");
+                        $start = $rowStart+4;
+                        while ($rowStart !== false)
+                        {
+
+                                $start += 4;
+                                $rowStop = strpos($compileInfo, "</tr>", $rowStart);
+                                //if ($rowStop !== false)
+                                //{
+                                        $row = substr($compileInfo, $rowStart, $rowStop - $rowStart);
+                                        //echo "$row";
+                                        //while ($cellStart !== false)
+                                        //{
+                                                // this parsing logic got a bit more complicated in M5_33 basebuild, as the
+                                                // a whole different structure was used.
+                                                // we'll try to quick fix this, but need our own index task
+                                                $cellStart = strpos($row, "#ERROR");
+                                                $cellStart = strpos($row, ">", $cellStart);
+                                                $cellStart = $cellStart + 1;
+                                                $cellStop = strpos($row, "<", $cellStart);
+                                                if ($cellStop !== false)
+                                                {
+                                                        $cell = substr($row, $cellStart, $cellStop - $cellStart);
+                                                        if (is_numeric($cell))
+                                                        {
+                                                                        $compileErrors += $cell;
+                                                        }
+                                                        $cellStart = strpos($row, "#ACCESSRULES_WARNINGS");
+                                                        $cellStart = strpos($row, ">", $cellStart);
+                                                        $cellStart = $cellStart + 1;
+                                                        $cellStop = strpos($row, "<", $cellStart);
+                                                        $cell = substr($row, $cellStart, $cellStop - $cellStart);
+                                                        if (is_numeric($cell))
+                                                        {
+                                                                        $compileAccessWarnings += $cell;
+                                                        }
+                                                        $cellStart = strpos($row, "#OTHER_WARNINGS");
+                                                        $cellStart = strpos($row, ">", $cellStart);
+                                                        $cellStart = $cellStart + 1;
+                                                        $cellStop = strpos($row, "<", $cellStart);
+                                                        $cell = substr($row, $cellStart, $cellStop - $cellStart);
+                                                        if (is_numeric($cell))
+                                                        {
+                                                                        $compileOtherWarnings += $cell;
+                                                        }
+                                                }
+                                                // look for next row.
+                                                //$cellStart = strpos($row, "<tr", $cellStop);
+                                        //}
+                                //}
+                                $rowStart = strpos($compileInfo, "<tr>", $rowStop);
+                        }
+                }
+        }
+
+        $results = array($compileErrors, $compileAccessWarnings, $compileOtherWarnings);
+        return $results;
+}
+
+
+
+?>
+
+
diff --git a/downloadsites/committers/wtplogonarrow.jpg b/downloadsites/committers/wtplogonarrow.jpg
new file mode 100644
index 0000000..c433588
--- /dev/null
+++ b/downloadsites/committers/wtplogonarrow.jpg
Binary files differ
