[397017] Move EMF Query website to git
diff --git a/.project b/.project
new file mode 100644
index 0000000..032f09c
--- /dev/null
+++ b/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>emf-query</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/_projectCommon.php b/_projectCommon.php
new file mode 100644
index 0000000..c695daf
--- /dev/null
+++ b/_projectCommon.php
@@ -0,0 +1,90 @@
+<?php
+/*******************************************************************************
+ * Copyright (c) 2009, 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:
+*		Eclipse Foundation - Initial version
+*		Anthony Hunter - changes for EMF Query
+********************************************************************************/
+$Nav->setLinkList(null);
+
+$PR = "emf-query";
+$projectName = "EMF Query";
+$topLevel = "modeling/emf";
+
+$debug = (isset ($_GET["debug"]) && preg_match("/^\d+$/", $_GET["debug"]) ? $_GET["debug"] : -1);
+
+$rooturl = "http://" . $_SERVER["HTTP_HOST"] . "/$PR";
+$downurl = "http://www.eclipse.org";
+$bugurl = "https://bugs.eclipse.org";
+
+$extraprojects = array(); //components with only downloads, no info yet, "prettyname" => "directory"
+$nodownloads = array(); //components with only information, no downloads, or no builds available yet, "projectkey"
+$nonewsgroup = array(); //components without newsgroup
+$nomailinglist = array(); //components without mailinglist
+$incubating = array(); // components which are incubating
+$nomenclature = "Project"; //are we dealing with "components" or "projects"?
+
+include_once($_SERVER["DOCUMENT_ROOT"] . "/emf-query/downloads/scripts.php");
+
+$regs = null;
+$projects = array("EMF Query" => "emf-query");
+$proj = "/modeling"; // (isset($_GET["project"]) && preg_match("/^(" . join("|", $projects) . ")$/", $_GET["project"], $regs) ? $regs[1] : getProjectFromPath($PR));
+$projct= "emf-query";
+
+$buildtypes = array(
+		"R" => "Release",
+		"S" => "Stable",
+		"I" => "Integration",
+		"M" => "Maintenance",
+		"N" => "Nightly"
+);
+
+# Set the theme for your project's web pages.
+# See http://eclipse.org/phoenix/
+$theme = "Nova";
+
+# Define your project-wide Navigation here
+# This appears on the left of the page if you define a left nav
+# Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
+# these are optional
+
+# If you want to override the eclipse.org navigation, uncomment below.
+# $Nav->setLinkList(array());
+
+# Break the navigation into sections
+$Nav->addNavSeparator("EMF Query", 	"/emf-query");
+$Nav->addCustomNav("Downloads", "/emf-query/downloads.php", "_self", 3);
+$Nav->addCustomNav("Documentation", "/emf-query/documentation.php", "_self", 3);
+$Nav->addCustomNav("Wiki", "http://wiki.eclipse.org/EMF", "_self", 3);
+$Nav->addCustomNav("Support", "/emf-query/support.php", "_self", 3);
+$Nav->addCustomNav("Newsgroup", "http://dev.eclipse.org/newslists/news.eclipse.modeling.emf/maillist.html", "_self", 3);
+$Nav->addCustomNav("Mailing List", "https://dev.eclipse.org/mailman/listinfo/emf-dev", "_self", 3);
+$Nav->addCustomNav("Modeling Corner", "http://wiki.eclipse.org/Modeling_Corner", "_self", 3);
+
+# Define keywords, author and title here, or in each PHP page specifically
+$pageKeywords	= "eclipse, emf, emf query";
+$pageAuthor		= "Anthony Hunter";
+
+# top navigation bar
+# To override and replace the navigation with your own, uncomment the line below.
+$Menu->setMenuItemList(array());
+$Menu->addMenuItem("Eclipse", "/", "_self");
+$Menu->addMenuItem("EMF Query", "/emf-query", "_self");
+$Menu->addMenuItem("Downloads", "/emf-query/downloads.php", "_self");
+$Menu->addMenuItem("Documentation", "/emf-query/documentation.php", "_self");
+$Menu->addMenuItem("About", "http://www.eclipse.org/projects/project_summary.php?projectid=modeling.emf.emf-query", "_self");
+
+# To define additional CSS or other pre-body headers
+$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="/emf-query/style.css"/>');
+
+# To enable occasional Eclipse Foundation Promotion banners on your pages (EclipseCon, etc)
+$App->Promotion = TRUE;
+
+# If you have Google Analytics code, use it here
+# $App->SetGoogleAnalyticsTrackingCode("YOUR_CODE");
+?>
\ No newline at end of file
diff --git a/description.html b/description.html
deleted file mode 100644
index 10edabc..0000000
--- a/description.html
+++ /dev/null
@@ -1 +0,0 @@
-This project was just provisioned, so there isn't much to see here. You can find links to the propsal on this page.  Stay tuned for great things. 
\ No newline at end of file
diff --git a/documentation.php b/documentation.php
new file mode 100644
index 0000000..ef440ae
--- /dev/null
+++ b/documentation.php
@@ -0,0 +1,34 @@
+<?php
+/*******************************************************************************
+ * Copyright (c) 2009, 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:
+*		Eclipse Foundation - Initial version
+*		Anthony Hunter - changes for EMF Query
+********************************************************************************/
+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());
+
+$pageTitle 		= "EMF Query Documentation";
+$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="/emf-query/style.css"/>');
+
+$html  = <<<EOHTML
+<div id="midcolumn">
+<h2>$pageTitle</h2>
+<h3>Reference Documentation</h3>
+<p>Reference information can be found on the <a href="http://www.eclipse.org/modeling/emf/docs/">EMF Documentation</a> page.</p>
+</div>
+EOHTML;
+
+# Generate the web page
+$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>
diff --git a/downloads.php b/downloads.php
new file mode 100644
index 0000000..16e6e34
--- /dev/null
+++ b/downloads.php
@@ -0,0 +1,54 @@
+<?php  																														
+/*******************************************************************************
+ * Copyright (c) 2009, 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:
+*		Eclipse Foundation - Initial version
+*		Anthony Hunter - changes for EMF Query
+********************************************************************************/
+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());
+
+$pageTitle = "EMF Query Downloads";
+$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="/emf-query/style.css"/>');
+
+$html  = <<<EOHTML
+<div id="midcolumn">
+<h2>$pageTitle</h2>
+<p>All downloads are provided under the terms and conditions of the
+<a href="/legal/epl/notice.php">Eclipse Foundation Software User Agreement</a>
+unless otherwise specified.</p>
+
+<h3>Installation via Eclipse Update Manager</h3>
+<p>Using the Eclipse Update Manager (see <a href="http://help.eclipse.org/juno/index.jsp?topic=/org.eclipse.platform.doc.user/tasks/tasks-129.htm">Eclipse Help</a> for detailed instructions) EMF Query can be installed from the following update sites:
+<ul>
+	<li>Releases: <a href="http://download.eclipse.org/modeling/emf/emf-query/updates/releases/">http://download.eclipse.org/modeling/emf/emf-query/updates/releases/</a></li>
+	<li>Milestones: <a href="http://download.eclipse.org/modeling/emf/emf-query/updates/milestones/">http://download.eclipse.org/modeling/emf/emf-query/updates/milestones/</a></li>
+	<li>Integration: <a href="http://download.eclipse.org/modeling/emf/emf-query/updates/interim/">http://download.eclipse.org/modeling/emf/emf-query/updates/interim/</a></li>
+	<li>Maintenance: <a href="http://download.eclipse.org/modeling/emf/emf-query/updates/maintenance/">http://download.eclipse.org/modeling/emf/emf-query/updates/maintenance/</a></li>
+</ul>
+
+<h3>Downloadable P2 Repositories and SDK dropins</h3>
+<p>If you prefer an update-site or an SDK archive, you can download it from <a href="downloads/index.php">here directly</a>.</p>
+
+<h3>Nightly Builds</h3>
+<p>The nightly builds can also be used as a P2 repository. The nightly builds for the Luna simultanious release can be accessed from <a href="https://hudson.eclipse.org/emf-query-master/">Hudson</a>.</p>
+
+<h3>Translations</h3>
+<p>Translations packages can be downloaded from the <a href="http://www.eclipse.org/babel/downloads.php">Babel project downloads page</a>.</p>
+
+</div>
+EOHTML;
+
+# Generate the web page
+$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>
\ No newline at end of file
diff --git a/downloads/downloads-common.php b/downloads/downloads-common.php
new file mode 100644
index 0000000..5646948
--- /dev/null
+++ b/downloads/downloads-common.php
@@ -0,0 +1,160 @@
+<?php
+/******************************************************************************
+ * Copyright (c) 2013, 2014 IBM Corporation 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:
+*    IBM Corporation - initial implementation
+****************************************************************************/
+
+$deps = array(
+	"eclipse" => "<a href=\"http://www.eclipse.org/eclipse/\">Eclipse</a>",
+);
+
+require_once($_SERVER["DOCUMENT_ROOT"] . "/emf-query/downloads/downloads-scripts.php");
+
+if (is_array($projects))
+{
+	$projectArray = getProjectArray($projects, $extraprojects, $nodownloads, $PR);
+	$proj = "/" . (isset($_GET["project"]) && preg_match("/^(?:" . join("|", $projects) . ")$/", $_GET["project"]) ? $_GET["project"] :	""); # default
+}
+else
+{
+	$proj = "";
+}
+
+$proj = $PR;
+$projct = $PR;
+if (strstr($PR, "/") !== false)
+{
+	list($topProj, $parentProj) = explode("/", $PR); # modeling, emf
+}
+else
+{
+	list($topProj, $parentProj) = array("NONE", $PR); # NONE, gef
+}
+
+if (isset($projct) && isset($hasmoved) && is_array($hasmoved) && array_key_exists($projct,$hasmoved))
+{
+	header("Location: http://www.eclipse.org/modeling/" . $hasmoved[$projct] . "/downloads/?" . $_SERVER["QUERY_STRING"]);
+	exit;
+}
+
+$numzips = isset($extraZips) ? 0 - sizeof($extraZips) : 0; // if extra zips (new zips added later), reduce the "required" count when testing a build
+if (isset($dls[$proj]) && is_array($dls[$proj]))
+{
+	foreach (array_keys($dls[$proj]) as $z)
+	{
+		$numzips += sizeof($dls[$proj][$z]);
+	}
+}
+
+# store an array of paths to hide
+$hiddenBuilds = is_readable($_SERVER["DOCUMENT_ROOT"] . "/$PR/downloads/hidden.txt") ? file($_SERVER["DOCUMENT_ROOT"] . "/$PR/downloads/hidden.txt") : array();
+
+// include extras-$proj.php or extras-$PR.php
+$files = array ($_SERVER["DOCUMENT_ROOT"] . "/$PR/downloads/extras-" . $projct . ".php", $_SERVER["DOCUMENT_ROOT"] . "/$PR/downloads/extras-" . $PR . ".php");
+foreach ($files as $file)
+{
+	if (file_exists($file))
+	{
+		include_once($file);
+		break;
+	}
+}
+
+$hadLoadDirSimpleError = 1; //have we echoed the loadDirSimple() error msg yet? if 1, omit error; if 0, echo at most 1 error
+$sortBy = (isset($_GET["sortBy"]) && preg_match("/^(date)$/", $_GET["sortBy"], $regs) ? $regs[1] : "");
+$showAll = (isset($_GET["showAll"]) && preg_match("/^(1)$/", $_GET["showAll"], $regs) ? $regs[1] : "0");
+$showMax = (isset($_GET["showMax"]) && preg_match("/^(\d+)$/", $_GET["showMax"], $regs) ? $regs[1] : ($sortBy == "date" ? "10" : "5"));
+$showBuildResults = !isset($_GET["light"]) && !isset($_GET["nostatus"]); // suppress display of status to render page faster
+
+$PWD = "/home/data2/httpd/download.eclipse.org/$topLevel/$PR/downloads/drops";
+
+$downloadScript = getdownloadScript();
+$downloadPre = "";
+
+print "<div id=\"midcolumn\">\n";
+print "<h2>EMF Query P2 Repositories & SDK Dropins</h2>\n";
+print "<p>This page provides a bundled P2 repository and different SDK dropins (in runnable form) for each build.</p>";
+
+$branches = loadDirSimple($PWD, ".*", "d");
+rsort($branches);
+$buildTypes = getBuildTypes($branches, $buildtypes);
+
+$builds = getBuildsFromDirs();
+$releases = array();
+if ($sortBy != "date")
+{
+
+	$builds = reorderAndSplitArray($builds, $buildTypes);
+	$releases = $builds[1];
+	$builds = $builds[0];
+}
+else
+{
+	krsort($builds); reset($builds);
+}
+
+print "<div id=\"midcolumn\">\n";
+if (sizeof($builds) == 0 && sizeof($releases) == 0)
+{
+	print "<h2>Builds</h2>\n";
+	print "<ul>\n";
+	if (is_array($projectArray) && !in_array($projct, $projectArray))
+	{
+		print "<li><i><b>Sorry!</b></i> There are no builds yet available for this component.</li>";
+	}
+	else
+	{
+		print "<li><i><b>Error!</b></i> No builds found on this server!</li>";
+	}
+	print "</ul>\n";
+}
+
+if ($sortBy != "date")
+{
+	doLatest($releases, "Releases");
+
+	$c = 0;
+	foreach ($builds as $branch => $types)
+	{
+		foreach ($types as $type => $IDs)
+		{
+			print "<h3>" . $buildTypes[$branch][$type] . "s</h3>\n";
+			print "<ul>\n";
+			$i = 0;
+			foreach ($IDs as $ID)
+			{
+				print outputBuild($branch, $ID, $c++);
+				$i++;
+
+				if (!$showAll && $i == $showMax && $i < sizeof($IDs))
+				{
+					print showToggle($showAll, $showMax, $sortBy, sizeof($IDs));
+					break;
+				}
+				else if ($showAll && sizeof($IDs) > $showMax && $i == sizeof($IDs))
+				{
+					print showToggle($showAll, $showMax, $sortBy, sizeof($IDs));
+				}
+			}
+			print "</ul>\n";
+		}
+	}
+}
+else if ($sortBy == "date")
+{
+	doLatest($builds, "Builds");
+}
+
+if (isset($oldrels) && is_array($oldrels) && sizeof($oldrels) > 0)
+{
+	showArchived($oldrels);
+	showNotes();
+}
+print "</div>\n";
+?>
diff --git a/downloads/downloads-scripts.php b/downloads/downloads-scripts.php
new file mode 100644
index 0000000..53a2e33
--- /dev/null
+++ b/downloads/downloads-scripts.php
@@ -0,0 +1,856 @@
+<?php
+/******************************************************************************
+ * Copyright (c) 2013, 2014 IBM Corporation 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:
+*    IBM Corporation - initial implementation
+****************************************************************************/
+
+function doLatest($releases, $label = "Releases")
+{
+	#global $rssfeed, $showMax, $showAll, $sortBy;
+	global $showMax, $showAll, $sortBy;
+	if (sizeof($releases)>0)
+	{
+		print "<div class=\"homeitem3col\">\n";
+		#print "<a name=\"latest\"></a><h3>${rssfeed}Latest $label</h3>\n";
+		print "<a name=\"latest\"></a><h3>Latest $label</h3>\n";
+		print "<ul class=\"releases\">\n";
+		$c = 0;
+		foreach ($releases as $rID => $rbranch)
+		{
+			$ID = preg_replace("/^(\d{12})([IMNRS])$/", "$2$1", $rID);
+			$branch = preg_replace("/.$/", "", $rbranch);
+			print outputBuild($branch, $ID, $c++);
+			if (!$showAll && $c == $showMax && $c < sizeof($releases))
+			{
+				print showToggle($showAll, $showMax, $sortBy, sizeof($releases));
+				break;
+			}
+			else if ($showAll && sizeof($releases) > $showMax && $c == sizeof($releases))
+			{
+				print showToggle($showAll, $showMax, $sortBy, sizeof($releases));
+			}
+		}
+		print "</ul>\n";
+		print "</div>\n";
+	}
+}
+
+function reorderAndSplitArray($arr, $buildTypes)
+{
+	// the first dimension's order is preserved (kept as it is in the config file)
+	// sort the second dimension using the IMNRS order in $buildTypes
+	// rsort the third dimension
+
+	$new = array();
+	$rels = array();
+	foreach ($buildTypes as $br => $types)
+	{
+		foreach ($types as $bt => $names)
+		{
+			if ($bt == "R" && isset($arr[$br][$bt]))
+			{
+				$id = $arr[$br][$bt][0];
+				$rels[substr($id,1) . $bt] = $br . $bt;
+			}
+			else if (array_key_exists($br, $arr) && array_key_exists($bt, $arr[$br]) && is_array($arr[$br][$bt]))
+			{
+				$new[$br][$bt] = $arr[$br][$bt];
+				rsort($new[$br][$bt]);
+			}
+		}
+	}
+	return array($new,$rels);
+}
+
+function getBuildsFromDirs() // massage the builds into more useful structures
+{
+	global $PWD, $sortBy;
+
+	$branchDirs = loadDirSimple($PWD, ".*", "d");
+	$buildDirs = array();
+
+	foreach ($branchDirs as $branch)
+	{
+		if ($branch != "OLD")
+		{
+			$buildDirs[$branch] = loadDirSimple("$PWD/$branch", "[IMNRS]\d{12}", "d");
+		}
+	}
+
+	$builds_temp = array();
+	foreach ($buildDirs as $br => $dirList)
+	{
+		foreach ($dirList as $dir)
+		{
+			$ty = substr($dir, 0, 1); //first char
+
+			if ($sortBy != "date")
+			{
+				$builds_temp[$br][$ty][] = $dir;
+			}
+			else
+			{
+				$dttm = substr($dir, 1); // last 12 digits
+				$a = $dttm . $ty;
+				$b = $br . $ty;
+
+				$builds_temp[$a] = $b;
+			}
+		}
+	}
+
+	return $builds_temp;
+}
+
+function getBuildTypes($branches, $buildtypes)
+{
+	$arr = array();
+
+	foreach ($branches as $branch)
+	{
+		foreach (array_keys($buildtypes) as $z)
+		{
+			if (!array_key_exists($branch, $arr))
+			{
+				$arr[$branch] = array();
+			}
+
+			// [2.0][N]
+			$arr[$branch][$z] = "$branch {$buildtypes[$z]} Build";
+		}
+	}
+
+	return $arr;
+}
+
+function IDtoDateStamp($ID, $style) // given N200402121441, return date("D, j M Y -- H:i (O)")
+{
+	$styles = array('Y/m/d H:i', "D, j M Y -- H:i (O)", 'Y/m/d');
+	$m = null;
+	if (preg_match("/(\d{4})(\d\d)(\d\d)(?:_)?(\d\d)(\d\d)/", $ID, $m))
+	{
+		$ts = mktime($m[4], $m[5], 0, $m[2], $m[3], $m[1]);
+		return date($styles[$style], $ts);
+	}
+
+	return "";
+}
+
+function createFileLinks($dls, $PWD, $branch, $ID, $pre2, $filePreProj, $ziplabel = "") // the new way - use a ziplabel pregen'd from a dir list!
+{
+	global $PR, $suf, $proj, $projct, $filePreStatic, $extraZips, $projects, $showBuildResults;
+	$uu = 0;
+
+	if (!$ziplabel)
+	{
+		$zips_in_folder = loadDirSimple("$PWD/$branch/$ID/", "(\.zip|\.tar\.gz)", "f");
+		$ziplabel = preg_replace("/(.+)\-([^\-]+)(\.zip|\.tar\.gz)/", "$2", $zips_in_folder[0]); // grab first entry
+	}
+
+	$cnt=-1; // for use with static prefix list
+
+	if (!isset($dls[$proj]) && isset($dls["/"]))
+	{
+		$dls[$proj] = $dls["/"];
+	}
+	if (!isset($dls[$proj]))
+	{
+		// set default
+		$flip = array_flip($projects);
+		$dls[$proj] = array($flip[$projct] => array(
+				"<acronym title=\"Archived Update Site\"><img alt=\"Click to download archived All-In-One p2 Repo Update Site\" src=\"/modeling/images/dl-icon-update-zip.gif\"/> <b style=\"color:green\">All-In-One Update Site</b></acronym>" => "emf-query-Update",
+				"SDK (Runtime, Source)" => "emf-sdk-query",
+				"Runtime" => "emf-query",
+				"Automated Tests" => "emf-tests-query"
+		));
+	}
+
+	$echo_out_all = "";
+
+	if (!$showBuildResults)
+	{
+		foreach (array_keys($dls[$proj]) as $z)
+		{
+			$echo_out_all .= "<li class=\"separator\"><img src=\"/modeling/images/dl.gif\" alt=\"Download\"/> " . fileFound("$PWD/", "$branch/$ID/", "$z Build Artifacts") . "</li>\n";
+			break;
+		}
+	}
+	else
+	{
+		foreach (array_keys($dls[$proj]) as $z)
+		{
+			$echo_out = "";
+			foreach ($dls[$proj][$z] as $label => $u)
+			{
+				$cnt++;
+				if (!is_array($u)) // for compatibilty with uml2, where there's no "RT" value in $u
+				{
+					$u = $u ? array("$u") : array("");
+				}
+
+				// support EMF page with three different valid prefixes which can
+				// overlap when searched using dynamic check below
+				if ($filePreStatic && is_array($filePreStatic) && array_key_exists($proj,$filePreStatic))
+				{
+					$filePreProj = array($filePreStatic[$proj][$cnt]); // just one value to check
+				}
+
+				$tries = array();
+				foreach ($u as $ux)
+				{
+					foreach ($filePreProj as $filePre)
+					{ 
+						$tries[] = "$branch/$ID/$pre2$filePre$ux-$ziplabel.zip"; // for compatibilty with uml2, where there's no "runtime" value in $ux
+						$tries[] = "$branch/$ID/$filePre$ux-$ziplabel.zip"; // for compatibilty with uml2, where there's no "runtime" value in $ux
+						$tries[] = "$branch/$ID/$pre2$filePre$ux-incubation-$ziplabel.zip"; // for compatibilty with uml2, where there's no "runtime" value in $ux
+						$tries[] = "$branch/$ID/$filePre$ux-incubation-$ziplabel.zip"; // for compatibilty with uml2, where there's no "runtime" value in $ux
+						$tries[] = "$branch/$ID/$ux-$ziplabel.zip"; // for compatibilty with uml2, where there's no "runtime" value in $ux
+					}
+				}
+				$outNotFound = "<i><b>$pre2</b>$filePre";
+				if (sizeof($u) > 1 ) {
+					$outNotFound .= "</i>{"; foreach ($u as $ui => $ux) {
+						$outNotFound .= ($ui>0 ? "," : "") . $ux;
+					} $outNotFound .= "}<i>";
+				}
+				else
+				{
+					$outNotFound .= $u[0];
+				}
+				$outNotFound .= "-$ziplabel ...</i>";
+				$out = "";
+				foreach ($tries as $y)
+				{
+					if (is_file("$PWD/$y"))
+					{
+						$out = fileFound("$PWD/", $y, $label);
+						break;
+					}
+				}
+				if ($out)
+				{
+					$echo_out .= "<li class=\"separator\">\n";
+					$echo_out .= $out;
+					$echo_out .= "</li>\n";
+				}
+				else if (!isset($extraZips) || !is_array($extraZips) || !in_array($filePre . $u[0],$extraZips)) // $extraZips defined in downloads/index.php if necessary
+				{
+					$echo_out .= "<li>\n";
+					$echo_out .= $outNotFound;
+					$echo_out .= "</li>\n";
+				}
+				$uu++;
+			}
+			if ($echo_out) // if the whole category is empty, don't show it (eg., GEF)
+			{
+				$echo_out_all .= "<li><img src=\"/modeling/images/dl.gif\" alt=\"Download\"/> $z\n<ul>\n" . $echo_out . "</ul>\n</li>\n";
+			}
+		}
+	}
+	return $echo_out_all;
+}
+
+/* if $styled = 0 or false, return text only */
+function showBuildResults($PWD, $path, $styled=1) // given path to /../downloads/drops/M200402021234/
+{
+	global $downloadPre, $pre, $numzips, $PR, $projct;
+	$mid = "$downloadPre/$PR" . ($projct == "" ? $projct : "/$projct") . "/downloads/drops/";
+	$out = "";
+	$buildlog = "$PWD${path}buildlog.txt";
+	$buildlog_cache = null;
+	clearstatcache();
+
+	$warnings = 0;
+	$errors = 0;
+	$failures = 0;
+	$didnotruns = 0;
+
+	$result = "";
+	$icon = "";
+
+	$indexHTML = "";
+	$compilelogSummary = "";
+
+	$link = "";
+	$link2 = "";
+
+	$ID = substr($path, -14);
+
+	if (!$icon && (is_file("$PWD${path}index.html") || is_file("$PWD${path}index.php")))
+	{
+		$indexHTML = is_file("$PWD${path}index.html") ? file_get_contents("$PWD${path}index.html") : "";
+		$zips = loadDirSimple($PWD . $path, "(\.zip|\.tar\.gz)", "f"); // get files count
+		$md5s = is_dir($PWD . $path . "/checksum") ? loadDirSimple($PWD . $path . "/checksum", "(\.zip\.md5|\.tar\.gz\.md5)", "f") :
+		loadDirSimple($PWD . $path, "(\.zip\.md5|\.tar\.gz\.md5)", "f"); // get files count
+
+		if ((sizeof($zips) >= $numzips && sizeof($md5s) >= $numzips))
+		{
+			//check testresults/chkpii/ for results
+			if (is_file("$PWD${path}testresults/chkpii/org.eclipse.nls.summary.txt"))
+			{
+				$chkpiiResults = file_get_contents("$PWD${path}testresults/chkpii/org.eclipse.nls.summary.txt");
+				// eg, file contains:
+				//htm: 6 E, 0 W
+				//xml: 1 E, 1 W
+				//properties: 0 E, 2 W
+				$regs = null;
+				preg_match_all("/^\S+: (\d+) E, (\d+) W$/m", $chkpiiResults, $regs);
+				for ($i = 0; $i < sizeof($regs[0]); $i++)
+				{
+					$errors += $regs[1][$i];
+					$warnings += $regs[2][$i];
+					$icon = "not";
+					$link = "$pre$mid${path}testresults/chkpii/";
+					$link2 = "$pre$mid${path}testresults/chkpii/";
+				}
+			}
+
+			// check JUnit results
+			$files = loadDirSimple("$PWD${path}testresults/xml/", ".xml", "f");
+			$out = "";
+			$noProblems = true;
+			foreach ($files as $file)
+			{
+				$results = getTestResultsJUnitXML("$PWD${path}testresults/xml/" . $file);
+				if ($results && is_array($results))
+				{
+					$errors += $results[0];
+					$failures += $results[1];
+					$didnotruns += $results[2];
+					$icon = "not";
+					$results = null;
+				}
+			}
+
+			//check compilelogs/summary.txt for results
+			if (is_file("$PWD${path}compilelogs/summary.txt"))
+			{
+				$compilelogSummary = file_get_contents("$PWD${path}compilelogs/summary.txt");
+				$link2 = "http://www.eclipse.org/$PR/downloads/testResults.php?hl=1&amp;project=$projct&amp;ID=" . substr($path, 0, strlen($path) - 1);
+				if ($compilelogSummary)
+				{
+					$m = null;
+					if (preg_match("/(\d+)P, (\d+)W, (\d+)E, (\d+)F/", $compilelogSummary, $m))
+					{
+						$warnings += $m[2];
+						$errors += $m[3];
+						$failures += $m[4];
+					}
+				}
+			}
+
+			if ($errors)
+			{
+				$icon = "not";
+				$result = "ERROR";
+			}
+			else if ($didnotruns)
+			{
+				$icon = "not";
+				$result = "CAUTION";
+			}
+			else
+			{
+				$icon = ($warnings ? "check-maybe" : "check");
+				$result = "";
+			}
+
+			//parse out the check/fail icons in index.html, if we haven't failed already
+			if ($icon != "not" && $indexHTML)
+			{
+				if (preg_match("/<font size=\"-1\" color=\"#FF0000\">skipped<\/font>/", $indexHTML))
+				{
+					$icon = "check-maybe";
+					$result = "Skipped ";
+				}
+				else if (preg_match("/(?:<!-- Examples -->.*FAIL\.gif|FAIL\.gif.*<!-- Automated Tests -->)/s", $indexHTML))
+				{
+					$icon = "not";
+					$result = "FAILED ";
+				}
+				else if (preg_match("/<!-- Automated Tests -->.*FAIL\.gif.*<!-- Examples -->/s", $indexHTML))
+				{
+					$icon = "check-tests-failed";
+					$result = "TESTS FAILED ";
+				}
+			}
+		}
+	}
+
+	if (!$icon)
+	{
+		// display in progress icon & link to log
+		$result = "...";
+		$icon = "question";
+	}
+
+	clearstatcache();
+
+	if (!$result && !is_dir("$PWD${path}testresults/xml/"))
+	{
+		$result = "Skipped ";
+		$icon = "check-maybe";
+	}
+
+	if (!$link) // return a string with icon, result, and counts (if applic)
+	{
+		$link = "http://download.eclipse.org/" . $mid . $path . "buildlog.txt";
+	}
+
+	if (!$link2) // link to console log in progress if it exists
+	{
+		$ID = substr($path, -14);
+		$conlog = "${path}testing/${ID}testing/linux.gtk_consolelog.txt";
+		$testlog = "http://www.eclipse.org/$PR/downloads/testResults.php?hl=1&amp;project=$projct&amp;ID=" . substr($path, 0, strlen($path) - 1);
+		$link2 = (is_file("$PWD$conlog") ? "$mid$conlog" : (is_file("$PWD$testlog") ? "$testlog" : $link));
+		$result = (is_file("$PWD$conlog") ? "Testing..." : $result);
+	}
+
+	if ($styled)
+	{
+		$out .= "<a " .
+			(preg_match("/FAIL|CAUTION|ERROR/", $result) || $didnotruns > 0 || $errors > 0 || $failures > 0 ? "class=\"fail\" " :
+					(preg_match("/Testing|Stalled|Skipped/",$result) || $warnings > 0 ? "class=\"warning\" " :
+							"class=\"success\" ") ) .
+							"href=\"$link2\">$result";
+	}
+	else
+	{
+		$out .= (preg_match("/FAIL|CAUTION|ERROR/", $result) || $didnotruns > 0 || $errors > 0 || $failures > 0 ? "FAILURE / " :
+			(preg_match("/Testing|Stalled|Skipped/",$result) || $warnings > 0 ? "WARNING / " :
+					"SUCCESS / ") ) .
+					"$result";
+	}
+	if ($errors == 0 && $failures == 0 && $warnings == 0 && !$result)
+	{
+		$out .= "OK";
+	}
+	else
+	{
+		$out  .= ($result && $result != "..."  && $result != "Skipped" ? ": " : "");
+		$out2  = "";
+		$out2 .= ($didnotruns > 0 ? "$didnotruns D N R, " : "");
+		$out2 .= ($errors > 0 ? "$errors E, " : "");
+		$out2 .= ($failures > 0 ? "$failures F, " : "");
+		$out2 .= ($warnings > 0 ? "$warnings W" : "");
+		$out  .= preg_replace("/^(.+), $/","$1",$out2);
+	}
+	if ($styled)
+	{
+		$out .= "</a> <a href=\"$link\"><img src=\"/modeling/images/$icon.gif\" alt=\"$icon\"/></a>";
+	}
+
+	$replacements = array(
+		"SUCCESS / Success" => "SUCCESS",
+		"SUCCESS / ..." => "UNKNOWN",
+		"FAILURE / FAILED: " => "FAILED"
+	);
+	foreach ($replacements as $match => $replace)
+	{
+		if ($out == $match) $out = $replace;
+	}
+
+	return array(
+		$out,
+		$link2,
+		$link
+	);
+}
+
+function fileFound($PWD, $url, $label, $md5AlignRight = true, $icon = null)
+{
+	global $downloadScript, $downloadPre, $PR, $proj;
+
+	$out = "";
+	$mid = "$downloadPre/$topLevel/$proj/downloads/drops/"; 
+	$md5files = array("$url.md5", preg_replace("#/([^/]+$)#", "/checksum/$1", $url) . ".md5");
+	foreach ($md5files as $md5file)
+	{
+		if (is_file($PWD.$md5file))
+		{
+			$out .= "<span style=\"float:right;\">&nbsp;&nbsp;" . pretty_size(filesize("$PWD$url")) . " (<a href=\"" . "http://download.eclipse.org" .
+			"$mid$md5file\">md5</a>)</span>"; break;
+		}
+	}
+	#return $md5AlignRight ? $out . "<a href=\"$downloadScript$mid$url\">$label</a>" :
+	#	"<a href=\"$downloadScript$mid$url\">$icon</a>&nbsp;<a href=\"$downloadScript$mid$url\">$label</a>" . $out;
+	return "<span style=\"float:left;clear:left;\"><a href=\"$downloadScript$mid$url\">$icon</a>&nbsp;<a href=\"$downloadScript$mid$url\">$label</a></span>" . $out;
+}
+
+function doNLSLinksList($packs, $cols, $subcols, $packSuf, $folder, $isArchive = false)
+{
+	global $downloadScript, $downloadPre, $PR, $proj, $projct;
+
+	foreach ($packs as $name => $packPre)
+	{
+		foreach ($cols as $alt => $packMid)
+		{
+			print "<li><img src=\"/modeling/images/dl.gif\" alt=\"$alt\"/> $alt: ";
+			$ret = array();
+			if (sizeof($subcols) > 2)
+			{
+				print "<ul>\n";
+				$cnt = 0;
+				foreach ($subcols as $alt2 => $packMid2)
+				{
+					if ($cnt > 0 && $cnt % 2 == 0)
+					{
+						print "<li>" . join(", ", $ret) . "</li>\n";
+						$ret = array();
+					}
+					$ret[] = "<a href=\"" . ($isArchive ? "http://archive.eclipse.org" : $downloadScript) .
+					"$downloadPre/$PR$proj/downloads/drops/$folder$packPre$packMid-$packMid2$packSuf\">$alt2</a>";
+					$cnt++;
+				}
+				if (sizeof($ret) > 0)
+				{
+					print "<li>" . join(", ", $ret) . "</li>\n";
+				}
+				print "</ul>\n";
+			}
+			else
+			{
+				foreach ($subcols as $alt2 => $packMid2)
+				{
+					$ret[] = "<a href=\"" . ($isArchive ? "http://archive.eclipse.org" : $downloadScript) .
+					"$downloadPre/$PR$proj/downloads/drops/$folder$packPre$packMid-$packMid2$packSuf\">$alt2</a>";
+				}
+				print join(", ", $ret);
+			}
+			print "</li>\n";
+		}
+	}
+}
+
+function grep($pattern, $file, $file_cache = null)
+{
+	$filec = $file_cache ? $file_cache : loadFile($file);
+
+	foreach ($filec as $z)
+	{
+		if (preg_match($pattern, $z))
+		{
+			$filec = array();
+			return true;
+		}
+	}
+
+	$filec = array();
+	return false;
+}
+
+function loadFile($file)
+{
+	$maxfilesize = 64*1024; // 64K file limit
+	$filec = array();
+	if (is_file($file) && is_readable($file))
+	{
+		if (filesize($file) < ($maxfilesize))
+		{
+			$filec = file($file);
+		}
+		else
+		{
+			exec("tail -n50 $file", $filec); // just grab the last n lines
+		}
+	}
+
+	return $filec;
+}
+
+/* if $styled = 0 or false, return text only */
+function getExtraTestsResults($branch, $ID, $styled=1)
+{
+	global $jdk14testsPWD, $jdk50testsPWD, $jdk60testsPWD, $testsPWD;
+	$tests = "";
+	$s = array(0 => "");
+	$t = array(0 => "");
+	return array($s, $t, $tests);
+}
+
+function toPlainTextSummaries($summary)
+{
+	global $debug, $PR, $projct;
+	if ($debug > 0) print htmlspecialchars($summary)."<br/>";
+
+	$miniSummary  = "";
+	$textSummary  = "";
+	// <a href="/modeling/emf/build/log-viewer.php?jdk50test=2.2.4/R200710030400/200710030422/" class="warning">511 W, 3 D</a>
+	// <a href="/modeling/emf/build/log-viewer.php?jdk50test=2.2.4/R200710030400/200710030422/"><img src="/modeling/images/check.gif" alt="OK"/></a>
+	// <a href="/modeling/emf/build/log-viewer.php?jdk50test=2.4.0/N200712241351/200712241410/">...</a>
+	$pattern = "#<a href=\"[^\"]+\?([^\"]+)=([^\"]+)\"(| class=\"[^\"]+\")>([^<]+)</a>#";
+	preg_match_all($pattern, $summary, $out, PREG_SET_ORDER);
+	/* [1] => jdk50test
+	 [2] => /modeling/emf/build/log-viewer.php?jdk50test=2.2.4/R200710030400/200710030422/
+	[4] => 511 W, 3 D
+	*/
+	if (sizeof($out) > 0)
+	{
+		if ($debug > 0) {
+			print "\n-------1-------\n<br/><pre>"; print_r($out); print "</pre><br/>\n";
+		}
+		foreach ($out as $set)
+		{
+			$url = "http://" . $_SERVER["SERVER_NAME"] . "/" . $PR . "/" . $projct . "/" . $set[1] . "s/" . $set[2] . "testlog.txt";
+			$miniSummary .= " [" . strtoupper(str_replace("test", "", $set[1])) . ": " . $set[4] . "]";
+			$textSummary .= strtoupper(str_replace("test", "", $set[1])) . " Test (" . $set[4] . ")\t" . $url . "\n";
+		}
+	}
+
+	$patterns = array(
+			// <a href="../../../modeling/emf/tests/2.2.4/R200710030400/200710030422/results/svt.html"><img src="/modeling/images/check.gif" alt="OK"/></a>
+			"#<a href=\"([^\"]+/results/([^\"]+).html)\"><img src=\"[^\"]+/images/[^\"]+.gif\" alt=\"([^\"]+)\"\/></a>#",
+
+			// <a href="../../../modeling/emf/tests/2.2.4/R200710030400/200710030432/results/svt.html" class="fail">1 F</a>
+			"#<a href=\"([^\"]+/results/([^\"]+).html)\" class=\"[^\"]+\">([^\<]+)</a>#",
+	);
+
+	$failedPattern =
+	// <a href="../../../modeling/emf/tests/2.4.0/N200712241351/200712241410/testlog.txt"><img src="/modeling/images/not.gif" alt="FAILED"/></a>
+	"#<a href=\"([^\"]+/modeling/emf/(tests)/[^\"]+)\"><img src=\"[^\"]+/images/[^\"]+.gif\" alt=\"([^\"]+)\"\/></a>#"
+			;
+
+			$foundURLs = array();
+			foreach ($patterns as $pattern)
+			{
+				$set = null;
+				$out = array();
+				$outFail = array();
+				preg_match_all($pattern, $summary, $out, PREG_SET_ORDER);
+				preg_match_all($failedPattern, $summary, $outFail, PREG_SET_ORDER);
+				/* [1] => ../../../modeling/emf/tests/2.2.4/R200710030400/200710030422/results/bvt.html
+				 [2] => bvt
+				[3] => OK
+				*/
+				$sets = sizeof($out) > 0 ? $out : $outFail;
+				if ($debug > 0) {
+					print "\n-------2-------\n<br/><pre>"; print_r($sets); print "</pre><br/>\n";
+				}
+				foreach ($sets as $set)
+				{
+					if (!in_array($set[1], $foundURLs)) {
+						$foundURLs[] = $set[1];
+						$url = str_replace("../../..", "http://" . $_SERVER["SERVER_NAME"], $set[1]);
+						$miniSummary .= " [" . strtoupper($set[2]) . ": " . $set[3] . "]";
+						$textSummary .= strtoupper($set[2]) . " Test (" . $set[3] . ")\t" . $url . "\n";
+					}
+				}
+			}
+
+			return array($miniSummary,$textSummary);
+}
+
+function outputBuild($branch, $ID, $c)
+{
+	global $PWD, $dls, $filePre, $proj, $showBuildResults, $sortBy, $projct, $jdk14testsPWD, $jdk50testsPWD, $jdk60testsPWD, $testsPWD, $deps, $PR, $hiddenBuilds;
+
+	# suppress hidden builds for public server
+	foreach ($hiddenBuilds as $hb) {
+		if (trim($hb) == "$PR/$branch/$ID")
+		{
+			debug("Build $PR/$branch/$ID is hidden, pending mirror replication.", 1);
+			return "";
+		}
+	}
+	$pre2 = (is_dir("$PWD/$branch/$ID/eclipse/$ID/") ? "eclipse/$branch/$ID/" : "");
+
+	$zips_in_folder = loadDirSimple("$PWD/$branch/$ID/", "(\.zip|\.tar\.gz)", "f");
+	$ziplabel = (sizeof($zips_in_folder) < 1) ? $ID :
+	preg_replace("/(.+)\-([^\-]+)(\.zip|\.tar\.gz)/", "$2", $zips_in_folder[0]); // grab first entry
+
+	// generalize for any relabelled build, thus 2.0.1/M200405061234/*-2.0.2.zip is possible; label = 2.0.2
+	$IDlabel = $ziplabel;
+
+	$opts = loadBuildConfig("$PWD/$branch/$ID/build.cfg", $deps);
+
+	$ret = "<li>\n";
+	$buildResults = $showBuildResults ? showBuildResults("$PWD/", "$branch/$ID/") && !isset($opts["hudson.job.url"]) : array("");
+	$extraTestsResults = $showBuildResults ? getExtraTestsResults($branch, $ID) : array(array(), "", "");
+	$ret .= "<div>" . $buildResults[0] .  join("", preg_replace("/^(.+)$/", "<span>$1</span>", $extraTestsResults[0])) . "</div>";
+	$ret .= "<a href=\"javascript:toggle('r$ID')\">" .
+	"<i>" . ($sortBy == "date" && $IDlabel != $branch ? "$branch / " : "") . "$IDlabel</i> " .
+	"(" . IDtoDateStamp($ID, 2) . ")" .
+	"</a>" .
+	"<a name=\"$ID\"></a> " .
+	"<a href=\"?showAll=1&amp;hlbuild=$ID" .
+	($sortBy == "date" ? "&amp;sortBy=date" : "") .
+	"&amp;project=$projct#$ID\">" .
+	"<img alt=\"Link to this build\" src=\"/modeling/images/link.png\"/>" .
+	"</a>" .
+	((isset($opts["noclean"]) && $opts["noclean"]) || is_dir("$PWD/$branch/$ID/eclipse/$ID") ? doNoclean("$PWD/$branch/$ID") : "");
+
+	$ret .= "<ul id=\"r$ID\"" . (($c == 0 && !isset($_GET["hlbuild"])) || isset($_GET["hlbuild"]) && $ID == $_GET["hlbuild"] ? "" : " style=\"display: none\"") . ">\n";
+
+	if (!isset($filePre[$proj]) && isset($filePre["/"]))
+	{
+		$filePre[$proj] = $filePre["/"];
+	}
+	if (!isset($filePre[$proj]))
+	{
+		$topProj = preg_replace("#.+/(.+)#","$1", $PR);
+		$filePre[$proj] = array($projct);
+	}
+	
+	$ret .= createFileLinks($dls, $PWD, $branch, $ID, $pre2, $filePre[$proj], $ziplabel);
+
+	$ret .= $extraTestsResults[2];
+	$ret .= getBuildArtifacts("$PWD", "$branch/$ID");
+	$ret .= "</ul>\n";
+	$ret .= "</li>\n";
+
+	return $ret;
+}
+
+function doNoclean($dir)
+{
+	global $PR,$projct;
+	$sizeondisk = pretty_size(dirsize($dir));
+	$versionAndBuildID = explode("/",$dir); $versionAndBuildID = $versionAndBuildID[sizeof($versionAndBuildID) - 2] . "/" . $versionAndBuildID[sizeof($versionAndBuildID) - 1];
+	return " <a href=\"/$PR/$projct/build/clean.php?versionAndBuildID=$versionAndBuildID\"><span class=\"noclean\"><acronym title=\"Failed builds do not purge temp files automatically -- click here to do so!\">Size on disk: $sizeondisk</acronym></span>" .
+	" <img alt=\"Purge releng materials before promoting this build!\" src=\"/modeling/images/bug.png\"/></a>";
+}
+
+function loadBuildConfig($file, $deps)
+{
+	$lines = (is_file($file) && is_readable($file) ? file($file) : array());
+
+	$opts = array();
+	foreach ($lines as $z)
+	{
+		$regs = null;
+		// Modeling build style
+		if (preg_match("/^((?:" . join("|", array_keys($deps)) . ")(?:DownloadURL|File|BuildURL))=(.{2,})$/", $z, $regs))
+		{
+			$opts[$regs[1]] = $regs[2];
+		}
+		// Athena build style
+		else if (preg_match("/^(.+\.(?:download\.url|file|buildurl|url|name|id))=(.{2,})$/", $z, $regs))
+		{
+			#print "[ " . $regs[1] . " = " . $regs[2] . " ]<br/>";
+			$opts[$regs[1]] = $regs[2];
+		}
+		else if (preg_match("#^(buildAlias|noclean)=(.+)$#", $z, $regs))
+		{
+			$opts[$regs[1]] = trim($regs[2]);
+		}
+		else if (preg_match("#^(javaHome|JAVA_HOME|java.home)=(.+)$#", $z, $regs))
+		{
+			# TODO: change this to an exec to use java --version instead
+			# TODO: why is build.cfg not being found?
+			$rp = realpath($regs[2]);
+			$opts[$regs[1]] = ($rp && $rp != $regs[2] ? preg_replace("#.+/([^/]+)#", "$1", $regs[2]) . " (" . preg_replace("#.+/([^/]+)#", "$1", $rp) . ")" : preg_replace("#.+/([^/]+)#", "$1", $regs[2]));
+		}
+	}
+	return $opts;
+}
+
+function getBuildArtifacts($dir, $branchID)
+{
+	global $downloadPre, $PR, $deps, $proj, $projct, $debug;
+
+	$PR = "$PR" . ($proj != "/" ? $proj : ""); # to allow for modeling/emf
+	$mid = "$downloadPre/$PR" . "/downloads/drops/";
+	$file = "$dir/$branchID/build.cfg";
+	$havedeps = array();
+	$opts = loadBuildConfig($file, $deps);
+
+	$ret = "";
+
+	# ANy: Added to depict details via Hudson build job
+	if (isset($opts["hudson.job.url"])){
+		$ret .= "<li>\n";
+		$ret .= "<img src=\"/modeling/images/dl-more.gif\" alt=\"More info about this build\"/> Build Details\n";
+		$ret .= "<ul>\n";
+		$ret .= "<li>Hudson job <a href=\"" . $opts["hudson.job.url"] . "\">" . $opts["hudson.job.name"] . " #" . $opts["hudson.job.id"] . "</a></li>\n";
+		$ret .= "</ul>\n";
+		$ret .= "</li>\n";
+	}
+	return $ret;
+}
+
+function hudsonURLcleanup($vanity)
+{
+	$vanity = preg_replace("#hudson job cbi#","",$vanity);
+	$vanity = preg_replace("#Snapshot|snapshot#","",$vanity);
+	$vanity = preg_replace("#(lastSuccessful[^ ]+|lastStable[^ ]+)#","",$vanity);
+	$vanity = preg_replace("#artifact#","",$vanity);
+	$vanity = preg_replace("#base#","",$vanity);
+	$vanity = preg_replace("#[ ]+#"," ",$vanity);
+	return $vanity;
+}
+
+
+function showToggle($showAll, $showMax, $sortBy, $count)
+{
+	global $projct;
+	$ret = "<li><a href=\"" . $_SERVER["PHP_SELF"] . "?project=".$projct."&amp;showAll=" . ($showAll == "1" ? "" : "1") . "&amp;showMax=$showMax&amp;sortBy=$sortBy\">" . ($showAll != "1" ? "show all $count" : "show only $showMax") . "...</a></li>\n";
+	return $ret;
+}
+
+function showArchived($oldrels)
+{
+	global $PR, $proj;
+
+	$thresh = sizeof($oldrels) > 5 ? ceil(sizeof($oldrels)/3) : 6;
+	#print "<div id=\"midcolumn\">\n";
+	print "<h3><a name=\"archives\"></a>Archived Releases</h3>\n";
+	print "<p>Older " . project_name($proj) . " releases have been moved to archive.eclipse.org, and can be accessed here:</p>";
+	print '<table cellspacing="0" cellpadding="0" border="0" style="margin:0"><tr valign="top">'."\n";
+	print "<td><ul id=\"archives\">\n";
+	$cnt=-1;
+	foreach (array_keys($oldrels) as $z)
+	{
+		$cnt++;
+		if ($cnt % $thresh == 0)
+		{
+			print "</ul></td><td><ul id=\"archives\">\n";
+		}
+		if (!$z || $oldrels[$z] === null)
+		{
+			$cnt--; # spacer
+		}
+		else if (!is_array($oldrels[$z]))
+		{
+			print "<li style=''><a href=\"http://archive.eclipse.org/$PR$proj/downloads/drops/$z/R$oldrels[$z]/\">$z</a> (" . IDtoDateStamp($oldrels[$z], 2) . ")</li>\n";
+		}
+		else // optional syntax with hardcoded datestamp and URL, like for old EMF/SDO/XSD 1.x builds
+		{
+			print "<li><a href=\"" . $oldrels[$z][1] . "\">$z</a> (" . $oldrels[$z][0] . ")</li>\n";
+		}
+	}
+	print "</ul>\n";
+	print "</td>";
+	print "</tr></table>\n";
+	#print "</div>\n";
+}
+
+function getTestResultsJUnitXML($file)
+{
+	$data = array();
+	exec("head -3 $file | grep \"<testsuite\"", $data); // possibly faster than file($file), but might break on some servers (eg., exec() is disabled on www.eclipse.org, so warnings are thrown)
+	foreach ($data as $line)
+	{
+		// <testsuite errors="0" failures="0" ...>
+		$matches = null;
+		if (preg_match("/<testsuite errors=\"(\d+)\" failures=\"(\d+).+\"/", $line, $matches))
+		{
+			return array($matches[1], $matches[2], 0);
+		}
+		else if (preg_match("/<testsuite.+failures=\"(\d+)\" errors=\"(\d+)\".+/", $line, $matches))
+		{
+			return array($matches[2], $matches[1], 0);
+		}
+		else if (false!==strpos($line,"<testsuites/>") || false!==strpos($line,"<testsuites />") || false!==strpos($line,"<testsuites></testsuites>") || false!==strpos($line,"Failed to invoke suite")) // no tests run!
+		{
+			return array(0, 0, 1);
+		}
+	}
+	return array(0, 0, 0); # Errors, Failures, DNRs
+}
+?>
diff --git a/downloads/downloads.js b/downloads/downloads.js
new file mode 100644
index 0000000..8af1892
--- /dev/null
+++ b/downloads/downloads.js
@@ -0,0 +1,5 @@
+function toggle(id)
+{
+        e = document.getElementById(id);
+        e.style.display = (e.style.display == "" ? "none" : "");
+}
diff --git a/downloads/extras-emf-query.php b/downloads/extras-emf-query.php
new file mode 100644
index 0000000..84b77fa
--- /dev/null
+++ b/downloads/extras-emf-query.php
@@ -0,0 +1,28 @@
+<?php
+/******************************************************************************
+ * Copyright (c) 2013, 2014 IBM Corporation 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:
+ *    IBM Corporation - initial implementation 
+ ****************************************************************************/
+
+$oldrels = array(
+	"1.1.0" => array("2007/06/20","http://archive.eclipse.org/modeling/emf/query/downloads/drops/1.1.0/R200706201159"),
+	"1.0.2" => array("2006/11/16","http://archive.eclipse.org/modeling/emf/query/downloads/drops/1.0.2/R200611161603"),
+	"1.0.1" => array("2006/09/25","http://archive.eclipse.org/modeling/emf/query/downloads/drops/1.0.1/R200609250852"),
+	"1.0.0" => array("2006/06/26","http://archive.eclipse.org/modeling/emf/query/downloads/drops/1.0.0/R200606261130"),
+);
+
+function showNotes()
+{
+?>
+	<div class="homeitem3col">
+		<p>All downloads are provided under the terms and conditions of the <a href="http://www.eclipse.org/legal/epl/notice.html">Eclipse Foundation Software User Agreement</a> unless otherwise specified.</p>
+	</div>
+<?php
+}
+?>
diff --git a/downloads/hidden.txt b/downloads/hidden.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/downloads/hidden.txt
diff --git a/downloads/index.php b/downloads/index.php
new file mode 100644
index 0000000..892c166
--- /dev/null
+++ b/downloads/index.php
@@ -0,0 +1,75 @@
+<?php
+/******************************************************************************
+ * Copyright (c) 2013, 2014 IBM Corporation 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:
+*    IBM Corporation - initial implementation
+****************************************************************************/
+$defaultProj = "";
+unset($_GET["project"]); // gef has no subprojects, so this should be blank
+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());
+ob_start();
+
+/* config */
+
+/* zips that are allowed to be absent from the downloads page (eg., new ones added mid-stream) */
+$extraZips = array(
+		"emf-examples-pde", "EMF-examples-pde", "emf-xpand", "emf-emf-Update"
+);
+
+/* $project => sections/Project Name => (prettyname => filename) */
+/* only required if using something other than the default 4; otherwise will be generated */
+$dls = array(
+		/*"/newProj" => array(
+		 "Project Name" => array( # same as value in _projectCommon.php's $projects array
+		 		"<acronym title=\"Click to download archived All-In-One p2 Repo Update Site\"><img alt=\"Click to download archived All-In-One p2 Repo Update Site\" src=\"/modeling/images/dl-icon-update-zip.gif\"/> <b style=\"color:green\">All-In-One Update Site</b></acronym>" => "Update",
+		 		"SDK (Runtime, Source)" => "SDK",
+		 		"Runtime" => "runtime",
+		 		"Examples" => "examples",
+		 		"Automated Tests" => "automated-tests"
+		 )
+		),*/
+		"/emf-query" => array(
+				"EMF Query" => array(
+						"<acronym title=\"Click to download archived All-In-One p2 Repo Update Site\"><img alt=\"Click to download archived All-In-One p2 Repo Update Site\" src=\"/modeling/images/dl-icon-update-zip.gif\"/> <b style=\"color:green\">All-In-One Update Site</b></acronym>" => "Update",
+						"EMF Query Master" => "query-Master",
+						"EMF Query SDK" => "sdk-query",
+						"EMF Query" => "query",
+				)
+		),
+);
+
+/* list of valid file prefixes for projects who have been renamed; keys have leading / to match $proj */
+/* only required if using something other than the default; otherwise will be generated */
+$filePre = array( # use "/" because GEF has no parent or child projects/components
+		"/emf-query" => array("emf"),
+);
+
+/* define showNotes(), $oldrels, doLanguagePacks() in extras-$proj.php (or just extras.php for flat projects) if necessary, downloads-common.php will include them */
+/* end config */
+require_once($_SERVER["DOCUMENT_ROOT"] . "/emf-query/downloads/downloads-common.php");
+
+$html = ob_get_contents();
+ob_end_clean();
+
+$trans = array_flip($projects);
+$pageTitle = "EMF Query P2 Repositories and Zip Downloads";
+$pageKeywords = "emf query";
+$pageAuthor = "Anthony Hunter";
+
+# Generate the web page
+$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="/emf-query/style.css"/>' . "\n");
+$App->AddExtraHtmlHeader('<script src="/emf-query/downloads/downloads.js" type="text/javascript"></script>' . "\n"); //ie doesn't understand self closing script tags, and won't even try to render the page if you use one
+$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+
+?>
diff --git a/downloads/scripts.php b/downloads/scripts.php
new file mode 100644
index 0000000..044a396
--- /dev/null
+++ b/downloads/scripts.php
@@ -0,0 +1,608 @@
+<?php
+/******************************************************************************
+ * Copyright (c) 2013, 2014 IBM Corporation 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:
+*    IBM Corporation - initial implementation
+****************************************************************************/
+
+function PWD_check($PWD, $suf)
+{
+	debug ("&#160; &#160; <b>PWD = </b>$PWD; <b>suf = </b>$suf;<br/>&#160; &#160; &#160; is_dir? <b style='color:green'>" . is_dir($PWD) . "</b>; is_readable? <b style='color:green'>" . is_readable($PWD) . "</b>; is_writable? <b style='color:green'>" . is_writable($PWD) . "</b><br/>", 2);
+	return(!is_dir($PWD) || !is_readable($PWD) ||($suf == "logs" && !is_writable($PWD)));
+}
+
+function getPWD($suf = "", $doDynCheck = true, $debug_echoPWD = 1) // set 0 to hide (for security purposes!)
+{
+	global $PR, $App;
+	debug ("<br/>getPWD <b>PR = </b>$PR, <b>suf = </b>$suf</br>", 2);
+	$PWDs = array();
+
+	if($doDynCheck)
+	{
+		//dynamic assignments
+		$PWD = $App->getDownloadBasePath() . "/$PR/" . $suf;
+		$PWDs[] = $PWD;
+
+		//second dynamic assignment
+		if(PWD_check($PWD, $suf))
+		{
+			$PWD = $_SERVER["DOCUMENT_ROOT"] . "/$PR/" . $suf;
+			$PWDs[] = $PWD;
+		}
+
+		if(!PWD_check($PWD, $suf))
+		{
+			debug("'$suf' ended up with first '$PWD' (is_readable: <b style='color:green'>" . is_readable($PWD) . "</b>, is_dir: <b style='color:green'>" . is_dir($PWD) . "</b>)");
+			return $PWD;
+		}
+	}
+	$PWD = "";
+
+	//static assignments
+	if(PWD_check($PWD, $suf))
+	{
+		$servers = array(
+				"/buildbox(?:\.torolab\.ibm\.com)?/" => "/home/www-data/build",
+				"/build\.eclipse\.org/" => "/opt/public/modeling/build",
+				"/emf(?:\.torolab\.ibm\.com)?/" => "/home/www-data/build",
+				"/(emft|modeling)(?:\.eclipse\.org)?/" => "/home/www-data/build",
+				"/localhost/" => "/home/www-data/build",
+				"/download1\.eclipse\.org/" => "/home/local/data/httpd/download.eclipse.org",
+				"/fullmoon\.torolab\.ibm\.com/" => "/home/www");
+
+		foreach(array_keys($servers) as $z)
+		{
+			$PWD = $servers[$z] . "/$PR/$suf";
+			if(preg_match($z, $_SERVER["HTTP_HOST"]) && !PWD_check($PWD, $suf))
+			{
+				$PWDs[] = $PWD;
+			}
+		}
+		foreach(array_keys($servers) as $z)
+		{
+			$PWD = $servers[$z] . "/$suf";
+			if(preg_match($z, $_SERVER["HTTP_HOST"]) && !PWD_check($PWD, $suf))
+			{
+				$PWDs[] = $PWD;
+			}
+		}
+	}
+	$PWD = "";
+
+	//try a default guess: /home/www, two options
+	if(PWD_check($PWD, $suf))
+	{
+		$data = array(
+				4 => array(
+						"checkdir" => "/home/data/httpd/download.eclipse.org/",
+						"tries" => array("/home/data/httpd/download.eclipse.org/$suf",
+								"/home/data/httpd/download.eclipse.org/$PR/$suf",)
+				),
+				5 => array("checkdir" => "/home/data2/httpd/download.eclipse.org/",
+						"tries" => array("/home/data2/httpd/download.eclipse.org/$suf",
+								"/home/data2/httpd/download.eclipse.org/$PR/$suf",)
+				),
+				6 => array("checkdir" => "/home/local/data/httpd/download.eclipse.org/",
+						"tries" => array($doDynCheck ? $App->getDownloadBasePath() . "/$PR/" . $suf : null,
+								"/home/local/data/httpd/download.eclipse.org/$suf",
+								"/home/local/data/httpd/download.eclipse.org/$PR/$suf",)
+				),
+				7 => array("checkdir" => "/var/www/",
+						"tries" => array("/var/www/$PR/$suf",
+								"/var/www/html/$PR/$suf",)
+				)
+		);
+
+		foreach(array_keys($data) as $y)
+		{
+			$PWD = $data[$y]["checkdir"];
+			if(is_dir($PWD) && is_readable($PWD))
+			{
+				foreach(array_keys($data[$y]["tries"]) as $z)
+				{
+					#debug("&#160; &#160; &#160; &#160; &#160; \$data[$y][\"tries\"][$z] = " . $data[$y]["tries"][$z],3);
+					$PWD = $data[$y]["tries"][$z];
+					if($PWD && !PWD_check($PWD, $suf))
+					{
+						$PWDs[] = $PWD;
+						break 2;
+				}
+			}
+		}
+	}
+}
+$PWD = "/home/data2/httpd/download.eclipse.org/emf-query/emf-query/downloads/drops";
+
+krsort($PWDs);
+reset($PWDs);
+	debug_r($PWDs, "<hr>PWDs: ", "<hr>", 2);
+foreach($PWDs as $i => $PWD)
+{
+	debug(" &#160; &#160; $i : $PWD", 9);
+	if(!PWD_check($PWD, $suf))
+	{
+		debug("'$suf' ended up with second '$PWD' (is_readable: <b style='color:green'>" . is_readable($PWD) . "</b>, is_dir: <b style='color:green'>" . is_dir($PWD) . "</b>)");
+		return $PWD;
+	}
+}
+
+debug("<!-- PWD not found! -->");
+debug("'$suf' ended up with third '$PWD' (is_readable: <b style='color:green'>" . is_readable($PWD) . "</b>, is_dir: <b style='color:green'>" . is_dir($PWD) . "</b>)");
+return $PWD;
+}
+
+function loadDirSimple($dir, $ext, $type) // 1D array, not 2D
+{
+	$stuff = array();
+
+	if(is_dir($dir) && is_readable($dir))
+	{
+		$handle = opendir($dir);
+		while(($file = readdir($handle)) !== false)
+		{
+			if(preg_match("/$ext$/", $file) && !preg_match("/^\.{1,2}$/", $file))
+			{
+				if(($type == "d" && is_dir("$dir/$file")) ||($type == "f" && is_file("$dir/$file")))
+				{
+					$stuff[] = $file;
+				}
+			}
+		}
+		closedir($handle);
+	}
+	else
+	{
+		global $hadLoadDirSimpleError;
+		if(!$hadLoadDirSimpleError)
+		{
+			$issue =(!is_dir($dir) ? "NOT FOUND" :(!is_readable($dir) ? "NOT READABLE" : "PROBLEM"));
+			print "<p>Directory ($dir) <b>$issue</b> on mirror: <b>" . $_SERVER["HTTP_HOST"] . "</b>!</p>";
+			print "<p>Please report this error to <a href=\"mailto:webmaster@eclipse.org?Subject=Directory ($dir) $issue in scripts.php::loadDirSimple() on mirror " . $_SERVER["HTTP_HOST"] . "\">webmaster@eclipse.org</a>, or make directory readable.</p>";
+			$hadLoadDirSimpleError = 1;
+		}
+	}
+
+	return $stuff;
+}
+
+function wArr($arr)
+{
+	print "<pre>\n";
+	print_r($arr);
+	print "</pre>\n";
+}
+
+function w($s, $br = "") // shortcut for echo() with second parameter: "add break+newline"
+{
+	if(stristr($br, "n"))
+	{
+		$br = "\n";
+	}
+	else
+	if($br)
+	{
+		$br = "<br/>\n";
+	}
+
+	print $s . $br;
+}
+
+function getNews($lim, $key, $xml = "", $linkOnly = false, $dateFmtPre = "", $dateFmtSuf = "") // allow overriding in case the file's not in /$PR/
+{
+	global $PR;
+
+	$xml =($xml ? $xml : file_get_contents($_SERVER["DOCUMENT_ROOT"] . "/$PR/" . "news/news.xml"));
+	$news_regex = "%
+			<news\ date=\"([^\"]+)\"\ showOn=\"([^\"]+)\">.*\\n
+			(.+)\\n
+			</news>.*\\n
+			%mx";
+
+	if(!$xml)
+	{
+		print "<p><b><i>Error</i></b> Couldn't find any news!</p>\n";
+	}
+
+	$regs = null;
+	preg_match_all($news_regex, $xml, $regs);
+	$i_real = 0;
+	foreach(array_keys($regs[0]) as $i)
+	{
+		if($i_real >= $lim && $lim > 0)
+		{
+			return;
+		}
+
+		$showOn = explode(",", $regs[2][$i]);
+		if($key == "all" || in_array($key, $showOn))
+		{
+			$i_real++;
+			print "<p>\n";
+			if(strtotime($regs[1][$i]) > strtotime("-3 weeks"))
+			{
+				if(preg_match("/update/i", $regs[3][$i]))
+				{
+					print '<img src="/modeling/images/updated.gif" alt="Updated!"/> ';
+				}
+				else
+				{
+					print '<img src="/modeling/images/new.gif" alt="New!"/> ';
+				}
+
+			}
+			if(!$dateFmtPre && !$dateFmtSuf)
+			{
+				$app =(date("Y", strtotime($regs[1][$i])) < date("Y") ? ", Y" : "");
+				print date("M" . '\&\n\b\s\p\;jS' . $app, strtotime($regs[1][$i])) . ' - ' . "\n";
+			}
+			else
+			if($dateFmtPre)
+			{
+				print date($dateFmtPre, strtotime($regs[1][$i]));
+			}
+			if($linkOnly)
+			{
+				$link = preg_replace("#.+(<a .+</a>).+#", "$1", $regs[3][$i]);
+			}
+			else
+			{
+				$link = $regs[3][$i];
+			}
+			print $link;
+			if($dateFmtSuf)
+			{
+				print date($dateFmtSuf, strtotime($regs[1][$i]));
+			}
+			print "</p>\n";
+		}
+	}
+}
+
+/* TODO: remove this when we upgrade php to >= 4.3.0 everywhere */
+if(!function_exists("file_get_contents"))
+{
+	function file_get_contents($file)
+	{
+		return(is_file($file) ? join("", file($file)) : "");
+	}
+}
+
+function getProjectArray($projects, $extraprojects, $nodownloads, $PR) //only the projects we have the files for
+{
+	$pwd = getPWD();
+
+	$projs = loadDirSimple($pwd, ".*", "d"); // locally available
+	foreach($nodownloads as $z)
+	{
+		/* php <4.2.0 returns NULL on array_search() failure, but php >=4.2.0 returns FALSE on array_search() failure, so don't check that */
+		if(is_numeric($s = array_search($z, $projs)))
+		{
+			unset($projs[$s]);
+		}
+	}
+
+	return array_intersect(array_merge($projects, $extraprojects), $projs);
+}
+
+function doSelectProject($projectArray, $proj, $nomenclature, $style = "homeitem3col", $showAll = "", $showMax = "", $sortBy = "")
+{
+	global $incubating;
+	$vars = array("showAll", "showMax", "sortBy", "hlbuild");
+	$tmp = preg_replace("#^/#", "", $proj);
+
+	$hlbuild =(isset($_GET["hlbuild"]) && preg_match("/^[IMNRS]\d{12}$/", $_GET["hlbuild"]) ? $_GET["hlbuild"] : "");
+
+	$out = "<div class=\"" .($style == "sideitem" ? "sideitem" : "homeitem3col") . "\">\n";
+	$tag =($style == "sideitem" ? "h6" : "h3");
+	$out .= "<$tag>";
+	if($style != "sideitem" && isset($incubating) && in_array($tmp, $incubating))
+	{
+		$out .= '<a href="http://www.eclipse.org/projects/what-is-incubation.php"><img style="float:right"
+				src="http://www.eclipse.org/modeling/images/egg-icon.png" alt="Validation (Incubation) Phase"
+				border="0" /></a>';
+	}
+	$out .= "$nomenclature selection</$tag>\n";
+	$out .= "<form action=\"" . $_SERVER["SCRIPT_NAME"] . "\" method=\"get\" id=\"subproject_form\">\n";
+	$out .= "<p>\n";
+	$out .= "<label for=\"project\">$nomenclature: </label>\n";
+
+	$out .= "<select id=\"project\" name=\"project\" onchange=\"javascript:document.getElementById('subproject_form').submit()\">\n";
+	foreach($projectArray as $k => $v)
+	{
+		$out .= "<option value=\"$v\">$k</option>\n";
+	}
+	$out .= "</select>\n";
+	foreach($vars as $z)
+	{
+		if($$z !== "")
+		{
+			$out .= "<input type=\"hidden\" name=\"$z\" value=\"" . $$z . "\"/>\n";
+		}
+	}
+	$out = preg_replace("#<option (value=\"$tmp\")>#", "<option selected=\"selected\" $1>", $out);
+	$out .= "<input type=\"submit\" value=\"Go!\"/>\n";
+	$out .= "</p>\n";
+	$out .= "</form>\n";
+	$out .= "</div>\n";
+
+	return $out;
+}
+
+function project_name($proj)
+{
+	global $projects, $PR;
+
+	if (isset($projects))
+	{
+		$tmp = array_flip($projects);
+		$proj = preg_replace("#^/#", "", $proj);
+		return isset($tmp[$proj]) ? $tmp[$proj] :(isset($tmp[$PR]) ? $tmp[$PR] : "");
+	}
+	else
+	{
+		return strtoupper($proj);
+	}
+
+}
+
+function debug($str, $level = 0)
+{
+	global $debug;
+
+	if($debug > $level)
+	{
+		print "<div class=\"debug\">$str</div>\n";
+	}
+}
+
+function debug_r($str, $header = "", $footer = "", $level = 0, $isPreformatted = false)
+{
+	global $debug;
+
+	if($debug > $level)
+	{
+		if($header)
+		{
+			print "<div class=\"debug\">";
+			print $header;
+			print "</div>\n";
+		}
+		print "<div class=\"debug\">";
+		print $isPreformatted ? "<pre><small>" : "";
+		print_r($str);
+		print $isPreformatted ? "</small></pre>" : "";
+		print "</div>\n";
+		if($footer)
+		{
+			print "<div class=\"debug\">";
+			print $footer;
+			print "</div>\n";
+		}
+	}
+}
+
+function domainSuffix($domain)
+{
+	return preg_replace("/.*([^\.]+\.[^\.]+)$/", "$1", $domain);
+}
+
+/* convert a wiki category page into a series of <li> items */
+function wikiCategoryToListItems($category)
+{
+	$wiki_contents = "";
+
+	// insert wiki content
+	$host = "wiki.eclipse.org";
+	$url = "/Category:" . $category;
+
+	$header = "Host: $host\r\n";
+	$header .= "User-Agent: PHP Script\r\n";
+	$header .= "Connection: close\r\n\r\n";
+
+	$fp = fsockopen($host, 80, $errno, $errstr, 30);
+	if(!$fp)
+	{
+		$out .= "<li><i>$errstr ($errno)</i></li>\n";
+	}
+	else
+	{
+		fputs($fp, "GET $url HTTP/1.1\r\n");
+		fputs($fp, $header);
+		while(!feof($fp))
+		{
+			$wiki_contents .= fgets($fp, 128);
+		}
+		fclose($fp);
+	}
+
+	$out = "";
+	if($wiki_contents)
+	{
+		$m = null;
+		if(preg_match("#<div id=\"mw-pages\">(.+)</div>[ \t\n]*<div class=\"printfooter\">#s", $wiki_contents, $m))
+		{
+			$links = null;
+			if(preg_match_all("#<a href=\"([^\"]+)\" title=\"([^\"]+)\">([^<]+)</a>#", $m[1], $links, PREG_SET_ORDER))
+			{
+				foreach($links as $z)
+				{
+					$out .= "<li><a href=\"http://wiki.eclipse.org/$z[1]\" title=\"$z[2]\">$z[3]</a></li>\n";
+				}
+			}
+		}
+	}
+	return $out;
+}
+
+function getProjectFromPath($PR)
+{
+	$m = null;
+	return preg_match("#/" . $PR . "/([^/]+)/build/.+#", $_SERVER["PHP_SELF"], $m) ? $m[1] :(preg_match("#/(" .
+			$PR . ")/build/.+#", $_SERVER["PHP_SELF"], $m) ? $m[1] : "");
+}
+
+function cvsminus($rev)
+{
+	if(preg_match("/^1\.1$/", $rev)) // "1.10" == "1.1" returns true, curiously enough
+	{
+		return $rev;
+	}
+	else
+	{
+		if(preg_match("/\.1$/", $rev))
+		{
+			return preg_replace("/^(\d+\.\d+)\..+$/", "$1", $rev);
+		}
+		else
+		{
+			return preg_replace("/^(.+\.)(\d+)$/e", "\"$1\" . ($2 - 1);", $rev);
+		}
+	}
+}
+
+function changesetForm($bugid = "")
+{
+	?>
+<form action="http://www.eclipse.org/modeling/emf/news/changeset.php"
+	method="get" target="_blank">
+	<p>
+		<label for="bugid">Bug ID: </label><input size="7" type="text"
+			name="bugid" id="bugid" value="<?php print $bugid; ?>" /> <input
+			type="submit" value="Go!" />
+	</p>
+	<p>
+		<a href="javascript:void(0)"
+			onclick="javascript:this.style.display = 'none'; document.getElementById('changesetinfo').style.display = 'block';">How
+			does this work?</a>
+	</p>
+	<div id="changesetinfo" style="display: none">
+		<p>Use this form to generate a bash shell script which can be run
+			against the projects and plugins in your workspace to produce a patch
+			file showing all changes for a given bug.</p>
+		<p>
+			The requested bug must be indexed in the <a
+				href="http://www.eclipse.org/modeling/searchcvs.php?q=190525">Search
+				CVS</a> database. Download the generated script for more
+			information. If the script is empty, then the bug was not found.
+		</p>
+	</div>
+</form>
+<?php
+
+}
+
+function tokenize($in) # split a shell command into flag/value pairs
+{
+	/* 17722 ? Ss 0:00 /bin/bash /home/www-data/build/modeling/scripts/start.sh -proj emf
+	 * -sub emf -version 2.1.0 -branch HEAD
+	* -URL http://download.eclipse.org/eclipse/downloads/drops/S-3.4M7-200805020100/eclipse-SDK-3.4M7-linux-gtk.tar.gz
+	* -URL http://download.eclipse.org/modeling/emf/emf/downloads/drops/2.4.0/S200805052017/emf-sdo-xsd-SDK-2.4.0M7.zip
+	* -URL http://download.eclipse.org/modeling/mdt/uml2/downloads/drops/2.2.0/S200805052208/mdt-uml2-SDK-2.2.0M7.zip
+	* -URL http://download.eclipse.org/tools/orbit/downloads/drops/S20080427194908/orbitBundles-S20080427194908.map
+	* -URL http://emft.eclipse.org/modeling/mdt/ocl/downloads/drops/1.2.0/S200805061053/mdt-ocl-SDK-1.2.0M7.zip
+	* -URL http://emft.eclipse.org/modeling/emf/query/downloads/drops/1.2.0/S200805061125/emf-query-SDK-1.2.0M7.zip
+	* -URL http://download.eclipse.org/modeling/emf/transaction/downloads/drops/1.2.0/S200805061205/emf-transaction-SDK-1.2.0M7.zip
+	* -URL http://emft.eclipse.org/modeling/emf/validation/downloads/drops/1.2.0/S200805061125/emf-validation-SDK-1.2.0M7.zip
+	* -URL http://download.eclipse.org/tools/gef/downloads/drops/3.4.0/S200804291800/GEF-ALL-3.4.0M7.zip -antTarget run
+	* -mapfileRule use-false -buildType I -javaHome /opt/sun-java2-5.0 -downloadsDir /home/www-data/build/downloads
+	* -buildDir /home/www-data/build/modeling/emf/emf/downloads/drops/2.1.0/I200805072353
+	* -email emf-releng@eclipse.org,nickboldt@gmail.com,max.feldman@borland.com,anthonyh@ca.ibm.com
+	* -basebuilderBranch RC1_34
+	*/
+	$bits = explode(" -", $in);
+	$pairs["cmd"] = $bits[0];
+	for($i = 1; $i < sizeof($bits); $i++)
+	{
+		$pair = explode(" ", $bits[$i]);
+		if(isset($pair[0]) && isset($pair[1]))
+		{
+			$pairs[$pair[0]] = $pair[1];
+		}
+		else
+		if(isset($pair[0]))
+		{
+			$pairs[$pair[0]] = "";
+		}
+	}
+	return $pairs;
+}
+
+function addGoogleAnalyticsTrackingCodeToHeader($UA = "UA-2566337-8")
+{
+	# http://wiki.eclipse.org/Using_Phoenix#Google_Analytics
+	global $App;
+	$App->SetGoogleAnalyticsTrackingCode("$UA");
+}
+
+function getDownloadScript()
+{
+	global $PR;
+	if(strstr($PR, "/") !== false)
+	{
+		list($topProj, $parentProj) = explode("/", $PR); # modeling, emf
+	}
+	else
+	{
+		list($topProj, $parentProj) = array("NONE", $PR); # NONE, gef
+	}
+
+	# if this is a Modeling page, use /modeling/download.php;
+	# if this is a GEF page, use /gef/download.php
+	# if /foo/download.php doesn't exist, revert to /downloads/download.php
+	$dlScriptFile = $_SERVER["DOCUMENT_ROOT"] . "/" .($topProj == "NONE" ? $parentProj : $topProj) . "/download.php";
+	#print "[$dlScriptFile =? " . is_file($dlScriptFile) . "]<br>";
+	if(is_file($dlScriptFile))
+	{
+		$downloadScript = "http://www.eclipse.org/" .($topProj == "NONE" ? $parentProj : $topProj) . "/download.php?file=";
+	}
+	else
+	{
+		$downloadScript = "http://www.eclipse.org/downloads/download.php?file=";
+	}
+	return $downloadScript;
+}
+
+/* thanks to http://www.php.net/manual/en/function.filesize.php#80995 */
+function dirsize($path)
+{
+	$dirsize = exec("du -s $path");
+	if($dirsize)
+	{
+		$dirsize = explode(" ", $dirsize);
+		return($dirsize[0] - 0) * 1024;
+	}
+	if(!is_dir($path))
+	{
+		return filesize($path);
+	}
+	$size = 0;
+	foreach(scandir($path) as $file)
+	{
+		if($file != '.' && $file != '..')
+		{
+			$size += dirsize($path . '/' . $file);
+		}
+	}
+	return $size;
+}
+
+function pretty_size($bytes)
+{
+	$sufs = array("B", "K", "M", "G", "T", "P"); //we shouldn't be larger than 999.9 petabytes any time soon, hopefully
+	$suf = 0;
+
+	while($bytes >= 1000)
+	{
+		$bytes /= 1024;
+		$suf++;
+	}
+
+	return sprintf("%3.1f%s", $bytes, $sufs[$suf]);
+}
+
+?>
diff --git a/downloads/testResults.php b/downloads/testResults.php
new file mode 100644
index 0000000..d055fb0
--- /dev/null
+++ b/downloads/testResults.php
@@ -0,0 +1,13 @@
+<?php
+/******************************************************************************
+ * Copyright (c) 2013, 2014 IBM Corporation 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:
+*    IBM Corporation - initial implementation
+****************************************************************************/
+include($_SERVER["DOCUMENT_ROOT"] . "/modeling/includes/testResults-common.php");
+?>
diff --git a/getting_involved.php b/getting_involved.php
new file mode 100644
index 0000000..596b6d6
--- /dev/null
+++ b/getting_involved.php
@@ -0,0 +1,45 @@
+<?php
+/*******************************************************************************
+ * Copyright (c) 2009, 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:
+*		Eclipse Foundation - Initial version
+*		Anthony Hunter - changes for EMF Query
+********************************************************************************/
+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());
+
+$pageTitle 		= "EMF Query Getting Involved";
+$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="/emf-query/style.css"/>');
+
+$html  = <<<EOHTML
+<div id="midcolumn">
+<h2>$pageTitle</h2>
+
+<p>As every Eclipse project, EMF Query is strongly dependent on active support by its community.
+You may become part of that community and get involved by reporting bugs or enhancement request,
+by contributing patches, by participation in discussions on the mailing list, or by supporting the
+maintaining of the EMF wiki.</p>
+
+<h3>Contributor Mailing List</h3>
+<p>Technical or organizational discussions (no help wanted questions) around the EMF project take place
+at the <a href="http://dev.eclipse.org/mailman/listinfo/emf-dev">EMF Developer Mailing List</a>.
+It is intended for use by developers actually working on or otherwise contributing to day-to-day
+development of the EMF project itself. Older discussions can be found in the
+<a href="http://dev.eclipse.org/mhonarc/lists/emf-dev/maillist.html">Mailing List Archive</a>.</p>
+
+</div>
+EOHTML;
+
+# Generate the web page
+$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>
\ No newline at end of file
diff --git a/images/backgroundMain.png b/images/backgroundMain.png
new file mode 100644
index 0000000..3136946
--- /dev/null
+++ b/images/backgroundMain.png
Binary files differ
diff --git a/images/buttonDocumentation.png b/images/buttonDocumentation.png
new file mode 100644
index 0000000..bbfdde0
--- /dev/null
+++ b/images/buttonDocumentation.png
Binary files differ
diff --git a/images/buttonDocumentation_sel.png b/images/buttonDocumentation_sel.png
new file mode 100644
index 0000000..8affb93
--- /dev/null
+++ b/images/buttonDocumentation_sel.png
Binary files differ
diff --git a/images/buttonDownload.png b/images/buttonDownload.png
new file mode 100644
index 0000000..e620092
--- /dev/null
+++ b/images/buttonDownload.png
Binary files differ
diff --git a/images/buttonDownload_sel.png b/images/buttonDownload_sel.png
new file mode 100644
index 0000000..d3a0330
--- /dev/null
+++ b/images/buttonDownload_sel.png
Binary files differ
diff --git a/images/buttonInvolved.png b/images/buttonInvolved.png
new file mode 100644
index 0000000..b3e9a82
--- /dev/null
+++ b/images/buttonInvolved.png
Binary files differ
diff --git a/images/buttonInvolved_sel.png b/images/buttonInvolved_sel.png
new file mode 100644
index 0000000..346a452
--- /dev/null
+++ b/images/buttonInvolved_sel.png
Binary files differ
diff --git a/images/buttonSupport.png b/images/buttonSupport.png
new file mode 100644
index 0000000..bd36086
--- /dev/null
+++ b/images/buttonSupport.png
Binary files differ
diff --git a/images/buttonSupport_sel.png b/images/buttonSupport_sel.png
new file mode 100644
index 0000000..a535fe8
--- /dev/null
+++ b/images/buttonSupport_sel.png
Binary files differ
diff --git a/index.php b/index.php
index 55ae2a0..1d4a695 100644
--- a/index.php
+++ b/index.php
@@ -1 +1,82 @@
-<?php header('Location: http://www.eclipse.org/projects/project.php?id=modeling.emf.query'); ?>
\ No newline at end of file
+<?php
+/*******************************************************************************
+ * Copyright (c) 2009, 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:
+*		Eclipse Foundation - Initial version
+*		Anthony Hunter - changes for EMF Query
+********************************************************************************/
+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());
+
+$localVersion = false;
+
+$pageTitle 		= "Eclipse EMF Query";
+
+// 	# Paste your HTML content between the EOHTML markers!
+$html = <<<EOHTML
+<div id="bigbuttons">
+<h3>Primary Links</h3>
+<ul>
+<li><a id="buttonDownload" href="downloads.php" title="Download">
+	Downloads, Software Install Site</a></li>
+<li><a id="buttonDocumentation" href="documentation.php" title="Documentation">
+	Tutorials, Examples, Reference Documentation</a></li>
+<li><a id="buttonSupport" href="support.php" title="Support">
+	Bug Tracker, Newsgroup</a></li>
+<li><a id="buttonInvolved" href="getting_involved.php" title="Getting Involved">
+	git, Workspace Setup, Wiki, Committers</a></li>
+</ul>
+</div>
+
+<div id="midcolumn">
+<h3>Eclipse Modeling Framework (EMF) Model Query</h3>
+
+<div id="introText">
+
+<p>EMF model query facilitates the process of search and retrieval of model elements of interest in a flexible yet controlled and structured manner. Provides API support for the basic EObject based Condition objects that are used to formulate queries for EMF models.</p>
+<p>EMF model query provides the following classes/interfaces to support queries.</p>
+<p><ol>
+	<li>The IEObjectSource interface provides the search scope elements to be used in a query.</li>
+	<li>The SELECT class implements a template-function that does the iteration over model elements and applies the search condition on each; it collects the resulting elements into a QueryResultSet object and returns it to the caller.</li>
+	<li>The FROM class represents the elements to search. It is responsible of providing an appropriate iterator for the elements in the search space.</li>
+	<li>The WHERE class applies the search conditions over the elements in the search set.</li>
+	<li>The UPDATE class passes the elements who satisfy the search condition to a caller-supplied modification function. It collects the modified elements into a QueryResultSet object and returns it to the caller.</li>
+	<li>The QueryResultSet class represents the set of elements returned by a given query.</li>
+	<li>The EObjectCondition class is the abstract parent of all conditions that deal with model-elements (i.e., EObjects). It incorporates the services of a PruneHandler in order to answers whether or not to prune the element tree at a specific element and thus ignore its children.</li>
+	<li>The ConditionPolicy class is used to allow the user to decide how to apply a given condition on a collection of a model-element EAttributes or EReferences values. Supports both the: exists (ANY) and for-all (ALL) semantics.</li>
+	<li>The EObjectStructuralFeatureValueCondition class is the parent class for conditions that are responsible for checking the values held in model-elements attributes or references.</li>
+</ol></p>
+
+</div>
+
+</div>
+
+<div id="rightcolumn">
+
+<div>
+<h3>Current Status</h3>
+<p>Development is underway for the proposed EMF Query 1.8.0 release for Eclipse Luna, due June 2014.</p>
+</div>
+
+<div id="headlines">
+<h3>EMF Query 1.7.0 Now Available</h3>
+<p><i>June 26, 2013 -</i> EMF Query 1.7.0 for Eclipse Kepler has been released. Check the <a href="/emf-query/downloads.php">Download</a> page.</p>
+</div>
+
+</div>
+EOHTML;
+
+# Generate the web page
+$App->generatePage($theme, $Menu, null, $pageAuthor, $pageKeywords, $pageTitle, $html);
+
+?>
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..75d277a
--- /dev/null
+++ b/style.css
@@ -0,0 +1,181 @@
+@CHARSET "UTF-8";
+#novaContent {
+	background: url("images/backgroundMain.png") no-repeat;
+	padding-top: 210px;
+}
+
+#midcolumn {
+	width: 640px;
+	padding: 0 10px 10px 10px;
+}
+
+#rightcolumn {
+	width: 260px;
+}
+
+
+h3 {
+	clear: both;
+}
+
+h7 {
+	font-weight: bold;
+	padding: 5px;
+}
+
+a strong {
+	text-decoration: underline;
+}
+
+img.displayed {
+	display: block;
+	margin-left: auto;
+	margin-right: auto;
+}
+
+#novaContent {
+	background: url("images/backgroundMain.png") no-repeat white;
+	padding-top: 170px;
+}
+
+#introText p.left {
+	width: 48%;
+	float: left;
+}
+
+#introText p.right {
+	width: 48%;
+	float: right;
+}
+
+#feature_1 {
+	float: left;
+	width: 30%;
+	margin-right: 3%;
+}
+
+#feature_2 {
+	float: left;
+	width: 30%;
+	margin-right: 3%
+}
+
+#feature_3 {
+	float: left;
+	width: 30%;
+}
+
+#feature_4 {
+	clear: both;
+	float: left;
+	width: 63%;
+	margin-right: 3%;	
+}
+
+#feature_more {
+	float: left;
+	width: 30%;
+}
+	
+#bigbuttons {
+	position: relative;
+	left: 420px;
+	top: -170px;
+}
+#bigbuttons h3{
+	visibility: hidden;
+}
+
+#bigbuttons a {
+}
+
+#bigbuttons ul li {
+   display:block;
+   list-style-type:none;
+   background-color: red;
+   padding: 0;
+   margin: 0;
+}
+
+#bigbuttons a:hover {
+	text-decoration: none;
+}
+
+#bigbuttons a {
+   display: block;
+   height:77px; width:250px;
+   padding: 0;
+   margin: 20px;
+   text-indent: -9000px;
+   position: absolute;
+}
+
+#buttonDownload {
+   background:transparent url("images/buttonDownload.png") no-repeat 0 0;
+   top: 0px;
+   left: 0px;
+}
+
+#buttonDownload:hover {
+   background:transparent url("images/buttonDownload_sel.png") no-repeat 0 0;
+}
+
+   
+#buttonDocumentation {
+   background:transparent url("images/buttonDocumentation.png") no-repeat 0 0;
+   top: 87px;
+   left: 0px;
+}
+
+#buttonDocumentation:hover {
+   background:transparent url("images/buttonDocumentation_sel.png") no-repeat 0 0;
+}
+
+#buttonSupport {
+   background:transparent url("images/buttonSupport.png") no-repeat 0 0;
+   top: 0px;
+   left: 280px;
+}
+
+#buttonSupport:hover {
+   background:transparent url("images/buttonSupport_sel.png") no-repeat 0 0;
+}
+
+#buttonInvolved {
+   background:transparent url("images/buttonInvolved.png") no-repeat 0 0;
+   top: 87px;
+   left: 280px;
+}
+
+#buttonInvolved:hover {
+   background:transparent url("images/buttonInvolved_sel.png") no-repeat 0 0;
+}
+
+#bigbuttons a * {
+	visibility: hidden;
+}
+
+#headlines {
+}
+
+#headlines ul li {
+	margin: 0 0;
+	list-style-type: none;
+	list-style-image: none;
+}
+
+	
+#headlines div.title {
+	display: inline;
+	margin-right: 0.5em;
+}
+
+#headlines div.meta {
+	display: inline;
+	color: #444444;
+	font-size: smaller;  
+}
+
+#headlines div.item {
+	display: block;
+}
\ No newline at end of file
diff --git a/support.php b/support.php
new file mode 100644
index 0000000..45d7049
--- /dev/null
+++ b/support.php
@@ -0,0 +1,48 @@
+<?php
+/*******************************************************************************
+ * Copyright (c) 2009, 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:
+*		Eclipse Foundation - Initial version
+*		Anthony Hunter - changes for EMF Query
+********************************************************************************/
+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());
+
+$pageTitle 		= "EMF Query Support";
+$App->AddExtraHtmlHeader('<link rel="stylesheet" type="text/css" href="/emf-query/style.css"/>');
+
+$html  = <<<EOHTML
+<div id="midcolumn">
+<h2>$pageTitle</h2>
+<p>EMF Query support is provided by the community on a volunteer basis. You may use the following means to reach this community.</p>
+
+<h3>Frequently Asked Questions (FAQs)</h3>
+<p>For frequently asked questions and known pitfalls please refer to the <a href="http://wiki.eclipse.org/EMF-Query-FAQ">EMF Query FAQ</a>. You might also consider the
+the <a href="http://wiki.eclipse.org/EMF/FAQ">EMF FAQ</a> or the <a href="http://wiki.eclipse.org/index.php/Eclipse_FAQs">Eclipse FAQs</a>.
+</p>
+
+<h3>Forum & Newsgroup</h3>
+<p>Ask questions on the <a href="http://www.eclipse.org/forums/index.php?t=thread&frm_id=16">EMF Community Forum</a>
+or the <a href="news://news.eclipse.org/eclipse.tools.emf" target="_top">EMF newsgroup</a> (same contents).
+</p>
+
+<h3>Bugzilla</h3>
+<p>Report defects and ask for enhancements by creating a
+<a href="https://bugs.eclipse.org/bugs/enter_bug.cgi?product=EMF">new bug entry</a> in the <a href="https://bugs.eclipse.org/bugs/">Eclipse Bugzilla</a>.
+</p>
+</div>
+EOHTML;
+
+# Generate the web page
+$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+?>
\ No newline at end of file