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
