diff --git a/planning/SimultaneousReleaseFunctions.php b/planning/SimultaneousReleaseFunctions.php
deleted file mode 100644
index 26c1648..0000000
--- a/planning/SimultaneousReleaseFunctions.php
+++ /dev/null
@@ -1,589 +0,0 @@
-<?php 
-require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/common.php");
-
-function get_fields_names($App,$release){
-		return array('basics','Planning','IP-Documentation','Release-Review','commonrepo','Communication-and-Availability','API','Message-Bundles','Version-Numbering','OSGi-Bundle-Format','Execution-Environment','Signing','Jarred-Bundles','Re-use','Optimization','Provide-p2-Repository','Capabilities','Support-Translations','Excel-in-NL-Support','Branding','Do-No-Harm','License-Text-Consistency','be_a_good_eclipse_citizen','Engage-Community','Usability','Performance','Test-Localization','Enable-Use-with-All-Languages','Builds','Ramp-Down-Planned-and-Defined','Accessibility','Unit-Tests','API-Policy-Defined-and-Documented','Retention-Policy','Project-Metrics');
-		
-		$release = $App->sqlSanitize($release);
-		/*
-		 * fetch all the long/short descriptions for the tracker fields
-		 */
-		$query = "select * from simultaneous_release_tracker_fields where therelease = '".addslashes($release)."'";
-		$res = $App->portal_sql($query);
-		$field_descriptions = array();
-		while($row = mysql_fetch_assoc($res)){
-			$field_descriptions[$row['field']] = $row;
-		}
-		return $field_descriptions;
-}
-
-function get_projects_tracking_by_parent($App){
-	$dbhc = new DBConnectionPortalRO();
-	$dbh = $dbhc->connect();
-	$query = "select * from simultaneous_release_tracker_project_relationships";
-	$res = mysql_query($query,$dbh);
-	
-	/*
-	 * fetch all the project tracking with thier parent
-	 */
-	$projects_tracking_with_parent = array();
-	while($row = mysql_fetch_assoc($res)){
-		$projects_tracking_with_parent[$row['projectid']] = $row['tracked_by_projectid'];
-	}
-	
-	if($_GET['debug'] == "true"){
-		print "<pre>projects_tracking_with_parent<br>";
-		print_r($projects_tracking_with_parent);
-	}
-	
-	return $projects_tracking_with_parent;
-}
- 
-function get_projects_tracking($App){
-	$projects_tracking_with_parent = get_projects_tracking_by_parent($App);
-	/*
-	 * fetch all the project data
-	 */
-	$query = "select 
-				distinct ProjectID 
-			  from 
-			  	ProjectInfo, 
-			  	ProjectInfoValues 
-			  where 
-			  	MainKey = 'simultaneousrelease' 
-			  and 
-			  	Subkey = 'indigo' 
-			  and 
-			  	Value = 1 
-			  and 
-			  	ProjectInfo.ProjectInfoID = ProjectInfoValues.ProjectInfoID
-			  order by ProjectID
-			  	";
-	$res = $App->eclipse_sql($query);
-	$projects_tracking = array();
-	while($row = mysql_fetch_assoc($res)){
-		if(isset($projects_tracking_with_parent[$row['ProjectID']])){
-			continue;
-		}
-		$projects_tracking[] = $row['ProjectID'];
-	}
-	if($_GET['debug'] == "true"){
-		print "<pre>projects_tracking<br>";
-		print_r($projects_tracking);
-	}
-	
-	return $projects_tracking;	
-	
-	#todo - get read access for this script worked out
-	/*
-	 * fetch all the project data
-	$query = "select * from Projects where ProjectID in ('".implode("','",$projects_tracking)."')";
-	$res = $App->eclipse_sql($query);
-	$projects = array();
-	while($row = mysql_fetch_assoc($res)){
-		$projects[$row['ProjectID']] = $row;
-	}	
-		
-	return $projects;
-	 */
-	
-}
-
-function get_project_tracking($App,$projectid){
-	if (!is_valid_project_name($projectid)) return null;
-	
-	$dbhc = new DBConnectionPortalRO(); 
-	$dbh = $dbhc->connect();
-	/*
-	 * fetch all the tracking data for this project
-	 */
-	$query = "select * from simultaneous_release_tracker where projectid = '".addslashes($projectid)."'";
-	$res = mysql_query($query,$dbh);	
-	//	$res = $App->portal_sql($query);
-	$rows = array();
-	while($row = mysql_fetch_assoc($res)){
-		$rows[$row['track_key']] = $row['track_value'];
-		$exception = $row['track_key']."_exception";
-		$rows[$exception] = $row['exception'];
-	}
-
-	if($_GET['debug'] == "true"){
-		print "<pre>project_tracking for: $projectid<br>";
-		print_r($rows);
-	}
-	
-	// WTB Experimental
-//	$projectId = addslashes($projectid);
-//	$sql = "SELECT distinct
-//			r.ProjectName, r.ProjectId, 
-//			SlidesURL, IPLogURL,
-//			s.status as Status, s.value as Date 
-//		FROM 
-//			ProjectReviews as r 
-//			left join ProjectReviewStatus as s on (r.id = s.id and s.Status = 'IP Log Posted')
-//		WHERE
-//			reviewName = 'Indigo Release'
-//			and r.ProjectId=$projectid";
-//	
-//	$result = $App->foundation_sql($sql);
-//	while ($row = mysql_fetch_assoc($result)) {
-//		$rows['ip_log_posted'] = $row['Status'] == 'IP Log Posted' ? 'on' : '';
-//		$rows['ip_log_url'] = $row['IPLogURL'];
-//		$rows['slides_url'] = $row['SlidesURL'];
-//	}
-	
-	
-	return $rows;
-}
-
-
-function get_fields(){
-	$thefields = array();
-	//		Do the basics ... early
-		$fields = array();
-		$thefields['basics'] = array (
-			'fields' => $fields,
-			'name' => 'Basic Requirements',
-			'one_line_summary' => 'The requirements and conditions stated in this section are the basic minimum required for a project to claim they are part of the yearly Simultaneous Release.'
-		);
-		
-		/*
-		 * Offset
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'offset', 'label'=>'Offset', 'type'=>'select', 'options' =>array('+0'=>'+0','+1'=>'+1','+2'=>'+2','+3'=>'+3'),'check'=>'noquery','allow_excpetion' => false);
-		$thefields['Offset'] = array (
-			'fields' => $fields,
-			'name' => 'Offset',
-		
-		);
-		
-		/*
-		 * PLANNING URL
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'planning_url', 'label'=>'URL', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Planning'] = array (
-			'fields' => $fields,
-			'name' => 'Planning',
-		);
-
-		/*
-		 * IP DOCUMENTATION
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'ip_documentation_IP_URL', 'label'=>'URL to IP Log', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
-		$thefields['IP-Documentation'] =array (
-			'fields' => $fields ,
-			'name' => 'IP-Documentation',
-		);
-		
-		/*
-		 * RELEASE REVIEW
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'release_review_PMC_executive_summary', 'label'=>'URL to PMC\'s Executive Summary (by RC2)', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
-//		$fields[] = array ('key'=>'release_review__checklist_url', 'label'=>'URL to checklists', 'type'=>'textfield','check'=>'req noquery','allow_excpetion' => true);
-		$thefields['Release-Review'] =array (
-			'fields' => $fields ,
-			'name' => 'Release-Review',
-		);
-		
-		
-		/*
-		 * Common Repo
-		 */
-		$fields = array();
-		$thefields['commonrepo'] = array (
-			'fields' => $fields,
-			'name' => 'Common Repository Requirements',
-		);
-		
-		/*
-		 * Communication and Availability
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'communication_and_availability', 'label'=>'Subscriptions confirmed and contact info sent.', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'communication_and_availability_releng_contacts', 'label'=>'Releng Contact Names. [the expectation being names only, not contact info]', 'type'=>'shorttextarea','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Communication-and-Availability'] =array (
-			'fields' => $fields ,
-			'name' => 'Communication-and-Availability',
-		);
-		
-		/*
-		 * API
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'bugzilla_api_clean', 'label'=>'Bugzillas open, or can "prove" API clean.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'url_api_reports', 'label'=>'Link to API check reports', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'list_bugzilla_api_deviations', 'label'=>'List of Bugilla\'s open for API deviations', 'type'=>'shorttextarea','check'=>'noquery','allow_excpetion' => true);
-		$thefields['API'] =array (
-			'fields' => $fields ,
-			'name' => 'API',
-			'one_line_summary' => 'Projects should leverage only published APIs of dependencies.',
-			'details' => 'Projects should leverage only published APIs of dependencies. All deviations must be documented in bugzillas. These bugzillas may be of the type that a dependent project should provide a required API, or of the type that a consuming project must move to some API that already exists. Note that technically there is no obligation for consumed projects to provide API that is requested ... that depends on many things ... but the main goal of requiring these bugzilla entries is to provide some documentation and measure of the amount of risk associated with non-API use.'
-		);
-		
-		/*
-		 * Message Bundles
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'message_bundles_used_throughout', 'label'=>'Message Bundles used throughout.', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-//		$fields[] = array ('key'=>'message_bundles_exception', 'label'=>'Message Bundle Exception. Give description of technical reasons, and link to Planning Councils approval.', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Message-Bundles'] =array (
-			'fields' => $fields ,
-			'name' => 'Message-Bundles',
-			'one_line_summary' => 'Projects must use Eclipse message bundles unless there are technical reasons not to.',
-			'details' => 'Projects must use <a target="_blank" href="http://help.eclipse.org/galileo/topic/org.eclipse.platform.doc.isv/reference/misc/message_bundles.html">Eclipse message bundles</a> unless there are technical reasons not to.'
-		);
-		
-		/*
-		 * Version Numbering
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'standard_versioning_used', 'label'=>'Standard Versioning used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-//		$fields[] = array ('key'=>'standard_versioning_exceptions', 'label'=>'Exceptions', 'type'=>'shorttextarea','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Version-Numbering'] =array (
-			'fields' => $fields ,
-			'name' => 'Version-Numbering',
-			'one_line_summary' => 'Projects must use 4-part version numbers.',
-			'details' => 'Projects must use <a target="_blank" href="http://wiki.eclipse.org/Version_Numbering">4-part version numbers</a>.',
-		);
-		
-		/*
-		 * OSGi bundle format
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'using_osgi_bundle_format', 'label'=>'OSGi bundle format used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['OSGi-Bundle-Format'] =array (
-			'fields' => $fields ,
-			'name' => 'OSGi-Bundle-Format',
-			'one_line_summary' => 'All plug-ins (bundles) must use the true bundle form.',
-			'details' => 'All plug-ins (bundles) must use the true bundle form. That is, provide a manifest.mf file, and not rely on the plugin.xml file being \'translated\' into a manifest.mf file at initial startup. With that, empty plugin.xml files in the presence of a manifest.mf file should not be included in a bundle. (For some old history, see <a target="_blank" href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=130598">bug 130598</a>.)'
-		);
-			
-		/*
-		 * Execution Environment
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'using_bundle_required_execution_environment', 'label'=>'Bundle Required Execution Environment used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Execution-Environment'] =array (
-			'fields' => $fields ,
-			'name' => 'Execution-Environment',
-			'one_line_summary' => 'All plug-ins must correctly list their Bundle Required Execution Environment (BREE).',
-			'details' => 'All plug-ins must <a target="_blank" href="http://wiki.eclipse.org/Execution_Environments">correctly list their Bundle Required Execution Environment (BREE)</a>.',
-		);
-		
-		/*
-		 * Signing
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'using_signing', 'label'=>'Signing used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Signing'] =array (
-			'fields' => $fields ,
-			'name' => 'Signing',
-			'one_line_summary' => 'Projects must use signed plugins using the Eclipse certificate</a>.',
-			'details' => 'Projects must use <a target="_blank" href="http://wiki.eclipse.org/JAR_Signing">signed plugins using the Eclipse certificate</a>.',
-		);
-		
-		
-		/*
-		 * Jarred Bundles
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'used_jarred_bundles', 'label'=>'Jarred Bundles used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Jarred-Bundles'] =array (
-			'fields' => $fields ,
-			'name' => 'Jarred-Bundles',
-			'one_line_summary' => 'Projects must use jarred plug-ins.',
-			'details' => 'Projects must use jarred plug-ins (with unpack=false) unless authorized by the planning council for technical exceptions. Also, nested jars should be avoided if possible since it creates problems for projects that has dependencies to such plug-ins. The OSGi runtime is fine with it but the PDE environment is not able to handle classpaths that contain nested jars.'
-		);
-		
-		/*
-		 * Re-use
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'used_reuse_orbit', 'label'=>'Re use from Orbit.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Re-use'] =array (
-			'fields' => $fields ,
-			'name' => 'Re-use',
-			'one_line_summary' => 'Re-use and share common third party jars.',
-			'details' => 'Re-use and share common third party jars. Any third-party plug-ins that are common between projects must be consumed via <a traget="_blank" href="http://www.eclipse.org/orbit">Orbit</a>; a Simultaneous Release will not have duplicate third-party libraries (note that this only applies to identical versions of the libraries; thus if project A requires foo.jar 1.6 and project B uses foo.jar 1.7, that\'s ok, as long as it is required and has a documented reason).'
-		);
-		
-		
-		/*
-		 * Optimization
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'used_optimize_p2_repositories', 'label'=>'Optimize p2 repositories used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Optimization'] =array (
-			'fields' => $fields ,
-			'name' => 'Optimization',
-			'one_line_summary' => 'Projects must optimize their p2 repositories to reduce bandwidth utilization and provide a better install and update experience for users.',
-		);
-		
-		 
-		/*
-		 * Provide p2 repository
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'provide_p2_repository', 'label'=>'Provide p2 repository.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Provide-p2-Repository'] =array (
-			'fields' => $fields ,
-			'name' => 'Provide-p2-Repository',
-			'one_line_summary' => 'Projects must provide their own project p2 repository.',
-			'details' => 'Projects must provide their own project p2 repository for their own project and updates. In addition, they must provide their archives and metadata in a specified format and method to allow at least parts of their repository to be aggregated and mirrored to a common repository. The <a target="_blank" href="http://wiki.eclipse.org/Indigo/Contributing_to_Indigo_Build">current process</a> may be modified throughout the year, if improvements can be made.'
-		);
-		
-		
-
-		
-		/*
-		 * Capabilities.
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'url_capabilities_description', 'label'=>'URL to a project\'s description of their capabilities (even if sample) and/or plugin names adopters can use', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'url_discover_strategy', 'label'=>'URL to a project\'s description of their progressive discover strategy or documentation', 'type'=>'textfield','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Capabilities'] =array (
-			'fields' => $fields ,
-			'name' => 'Capabilities',
-			'one_line_summary' => 'Each project will provide basic capability/activity definitions to allow for their UI contributions to be hidden.',
-			'details' => 'Each project will provide basic capability/activity definitions to allow for their UI contributions to be hidden. These may be provided in a separate plugins and features to facilitate inclusion and reuse by consumers in product development, or simply well documented so adopters can reuse via copy/paste. Ideally, projects should also provide triggers to facilitate progressive discovery of functionality.'
-		);
-		
-		/*
-		 * Support Translations
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'used_support_translations', 'label'=>'Translation support used.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Support-Translations'] =array (
-			'fields' => $fields ,
-			'name' => 'Support-Translations',
-			'one_line_summary' => 'All strings must be externalized, and Projects must participate in Babel.',
-			'details' => 'All strings must be externalized, and Projects must participate in Babel, meaning it is registered and available for string translation, etc. Projects must freeze the UI sufficiently early to allow the Babel project time to translate strings so there can be simultaneous release of translated versions. The UI should be frozen by M6 (a "freeze" all major changes and additions are done by M6, and changes after that are done in a controlled, well documented fashion, so Babel translators can more easily "keep up" with late changes).'
-		);
-		
-		/*
-		 * Excel in NL support
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'used_ICU4J', 'label'=>'ICU4J used where appropriate.<br>', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-//		$fields[] = array ('key'=>'exceptions_ICU4J', 'label'=>'Exceptions', 'type'=>'shorttextarea','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Excel-in-NL-Support'] =array (
-			'fields' => $fields ,
-			'name' => 'Excel-in-NL-Support',
-			'one_line_summary' => 'The Project must use ICU4J, where appropriate, to excel in NL support. (The latest ICU4J bundles will be in Orbit)',
-			'details' => 'The Project must use <a traget="_blank" href="http://wiki.eclipse.org/ICU4J">ICU4J</a>, where appropriate, to excel in NL support. (The latest ICU4J bundles will be in Orbit)',
-		);
-		
-		/*
-		 * Branding
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'used_branding', 'label'=>'Branding used.', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Branding'] =array (
-			'fields' => $fields ,
-			'name' => 'Branding',
-			'one_line_summary' => 'Each major project (as determined by participating PMCs) must have an \'About\' dialog icon with hover text that displays the provider name.',
-			'details' => ' Each major project (as determined by participating PMCs) must have an \'About\' dialog icon with hover text that displays the provider name. Every plug-in and feature must specify a descriptive provider-name (for features), or Bundle-Vendor header (for plug-ins), as determined by the project\'s PMC (e.g. "Eclipse Modeling Project" rather than "Eclipse.org"). Also, Projects must contribute to the welcome page when appropriate.'
-		);
-		
-		
-		/*
-		 * No Unresolved Bugs
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'no_unresolved_bugs', 'label'=>'No unresolved bugs or known issues causing interference with others', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['Do-No-Harm'] =array (
-			'fields' => $fields ,
-			'name' => 'Do-No-Harm',
-			'one_line_summary' => 'Projects must work together in any combination of any install.',
-			'details' => 'Projects must work together in any combination of any install. Put another way, this means that users can install any subset of the projects and each of the installed projects will work as well as if it had been loaded independently. If such a problem is identified, the affected projects must track down and fix the problem.',
-		);
-				
-		/*
-		 * License text consistency
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'used_standard_license_form', 'label'=>'Standard forms of license used', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$thefields['License-Text-Consistency'] =array (
-			'fields' => $fields ,
-			'name' => 'License-Text-Consistency',
-			'one_line_summary' => '[New this year.]  Use standard forms of license documents.',
-			'details' => '[New this year.]  Use standard forms of license documents so it is displayed in the most usable, and concise way during install and update. It is a normal requirement to use a standard Eclipse Foundation "about" template, but where those templates are edited by each project, care must be taken to be sure they are edited in similar ways.'
-		);
-		
-		
-		
-		
-		
-//		Be a good Eclipse Citizen ... and document it
-		$fields = array();
-		$thefields['be_a_good_eclipse_citizen'] = array (
-			'fields' => $fields,
-			'name' => 'Eclipse Citizenship',
-			'one_line_summary' => 'Projects should exhibit good Eclipse Citizenship, to Release and participate in Common Discovery Site and EPP Packages. These are often "best practices" that some projects have found helpful at Eclipse. These criteria often speak to the quality of the Project, as an Eclipse Project, as opposed to their code or architecture. They are a bit more subjective than some of the other criteria, and the relevancy to any particular project may not be as universal, so there is no set number of items to satisfy. But, it is required that each project document their level of compliance to each item. Especially good Eclipse Citizens will get a gold star, and especially bad ones might get a frowny face.'
-		);
-		/*
-		 * Engage Community
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'engage_community', 'label'=>'Engage Community', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'engage_community_new_and_noteworthy', 'label'=>'New & Noteworthy URL or description', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['Engage-Community'] =array (
-			'fields' => $fields ,
-			'name' => 'Engage-Community',
-			'one_line_summary' => 'The Project should actively engage their community to get feedback on milestone builds, and document how they do that.',
-			'details' => 'The Project should actively engage their community to get feedback on milestone builds, and document how they do that. One way to do this is to have a <a  target="_blank" href="http://wiki.eclipse.org/Architecture_Council/New_and_Noteworthy">New & Noteworthy</a> for each milestone. New and Noteworthy documents should be something readable and usable not just a static list of all the bugs. Corollary: individual new & noteworthy should be linked in to the collective New & Noteworthy.'
-		);
-		/*
-		 * Usability
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'following_usability_guidelines', 'label'=>'Usability', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'following_usability_guidelines_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['Usability'] =array (
-			'fields' => $fields ,
-			'name' => 'Usability',
-			'one_line_summary' => 'The Project should follow the User Interface Guidelines.',
-			'details' => 'The Project should follow the User Interface Guidelines. The UI Checklist is a good place to start. Also, should participate in a User Interface Best Practices Working Group  UI walkthrough.',
-		);
-		/*
-		 * Performance
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'measurable_performance_criteria', 'label'=>'Performance', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'measurable_performance_criteria_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['Performance'] =array (
-			'fields' => $fields ,
-			'name' => 'Performance',
-			'one_line_summary' => 'Project should have measurable performance criteria that are regularly tested against. Projects should devote at least one milestone to performance and scalability improvements.'
-		);
-
-		/*
-		 * Test Localization
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'use_babel_pseudo_translation', 'label'=>'Test Localization', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'use_babel_pseudo_translation_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['Test-Localization'] =array (
-			'fields' => $fields ,
-			'name' => 'Test-Localization',
-			'one_line_summary' => 'The project should use the Babel Pseudo Translation Test to verify their translatability.',
-		);
-		
-		/*
-		 * Enable Use with All Languages
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'enable_use_with_all_languages', 'label'=>'Enable Use with All Languages', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'enable_use_with_all_languages_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['Enable-Use-with-All-Languages'] =array (
-			'fields' => $fields ,
-			'name' => 'Enable-Use-with-All-Languages',
-			'one_line_summary' => 'Should design and test for enabling all languages including bidi, unicode characters, etc. This is different than "translating" the program. For example, while using an English version of Eclipse Web Tools, someone should be able to create a Chinese language web application.'
-		);
-		
-		/*
-		 * Builds
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'builds', 'label'=>'Builds', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'builds_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['Builds'] =array (
-			'fields' => $fields ,
-			'name' => 'Builds',
-			'one_line_summary' => 'Projects must have a mature, stable build process: documented, scripted, repeatable, and executable by others.'
-		);
-		
-
-		/*
-		 * Ramp Down Planned and Defined
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'ramp_down_planned_and_defined', 'label'=>'Ramp Down Planned and Defined', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'ramp_down_planned_and_defined_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['Ramp-Down-Planned-and-Defined'] =array (
-			'fields' => $fields ,
-			'name' => 'Ramp-Down-Planned-and-Defined',
-			'one_line_summary' => 'Projects must have a written ramp down policy by M6, at the latest, and provide link. The plan should describe when the project plans to be feature complete, have API frozen, and similar. See Platform 3.5 Endgame plan as a guideline.)'
-		);
-				
-		/*
-		 * Accessibility
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'accessibility', 'label'=>'Accessibility', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'accessibility_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['Accessibility'] =array (
-			'fields' => $fields ,
-			'name' => 'Accessibility',
-			'one_line_summary' => 'Projects should design and test for accessibility compliance, following established guidelines and Eclipse fundamental techniques to achieve accessibility.',
-			'details' => 'Projects should design and test for accessibility compliance, following established guidelines and Eclipse fundamental techniques to achieve accessibility. Projects must document their accessibility work and compliance. Ideally this would be by using a publicly available checklists, such as
-							<ul>
-							    <li> <a target="_blank" href="http://www.itic.org/resources/voluntary-product-accessibility-template-vpat/">http://www.itic.org/resources/voluntary-product-accessibility-template-vpat/</a>
-							    <li> <a target="_blank" href="http://www.section508.gov/">http://www.section508.gov/</a>
-							    <li> <a target="_blank" href="http://www.w3.org/TR/WCAG/">http://www.w3.org/TR/WCAG/</a>
-							</ul>
-							but, given the advice of the <a target="_blank" href="http://wiki.eclipse.org/Planning_Council/Cross_Project_Teams/Accessibility">Accessibility Cross Project Team</a>, for this year\'s Simultaneous Release, projects can document their work or compliance as a negative, such as "we did not do any accessibility work or testing and do not know the degree of our compliance". But its important to document, so adopters know. If possible, and appropriate, accessibility testing tools can be leveraged such as <a target="_blank" href="http://www.nvda-project.org/">NVDA</a>. The main <a target="_blank" href="http://www.eclipse.org/articles/article.php?file=Article-Accessibility351/index.html">accessibility article at Eclipse Corner</a> has been made current (thanks goes to Todd Creasey).'
-		);
-
-		
-		/*
-		 * Unit Tests
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'unit_tests', 'label'=>'Unit Tests', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'unit_tests_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['Unit-Tests'] =array (
-			'fields' => $fields ,
-			'name' => 'Unit-Tests',
-			'one_line_summary' => '[New this year.] Projects must have some unit tests that can verify at least basic functionality of a build or distribution. The steps to build and run the tests must be documented and executable by others.'
-		);
-		
-		/*
-		 *  API Policy Defined and Documented
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'api_policy_defined_and_documented', 'label'=>'API Policy Defined and Documented', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'api_policy_defined_and_documented_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['API-Policy-Defined-and-Documented'] =array (
-			'fields' => $fields ,
-			'name' => 'API-Policy-Defined-and-Documented',
-			'one_line_summary' => '[New this year.] Typically would include how \'APIs\' are distinguished from non-API and \'provisional\' API, if any. It is recommended that non-API be marked with x-internal in the bundles manifest. Also, should include what the commitment is to API, how long maintained after deprecated, etc.',
-			'details' => '[New this year.] Typically would include how \'APIs\' are distinguished from non-API and \'provisional\' API, if any. It is recommended that non-API be marked with x-internal in the bundles manifest. Also, should include what the commitment is to API, how long maintained after deprecated, etc. As one example, see <a target="_blank" href="http://wiki.eclipse.org/WTP_API_Policy">WTP API Policy</a>.'
-			);
-		
-		/*
-		 *  Retention Policy
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'retention_policy', 'label'=>'Retention Policy', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'retention_policy_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['Retention-Policy'] =array (
-			'fields' => $fields ,
-			'name' => 'Retention-Policy',
-			'one_line_summary' => '[New this year.] Projects should define and document their retention policy. This should include both zip distributions and repositories.',
-			'details' => '[New this year.] Projects should define and document their retention policy. This should include both zip distributions and repositories. For examples, see <a target="_blank" href="http://wiki.eclipse.org/WTP/Retention_Policy">WTP Retention Policy</a> and <a target="_blank" href="http://wiki.eclipse.org/Eclipse_Project_Update_Sites">Eclipse Project Update Sites</a>'
-			);
-		
-		
-		/*
-		 * Project Metrics
-		 */
-		$fields = array();
-		$fields[] = array ('key'=>'project_metrics', 'label'=>'Project Metrics', 'type'=>'checkbox','check'=>'noquery','allow_excpetion' => true);
-		$fields[] = array ('key'=>'project_metrics_new_and_noteworthy', 'label'=>'Please describe or provide URL', 'type'=>'shorttextarea','check'=>'noquery');
-		$thefields['Project-Metrics'] =array (
-			'fields' => $fields ,
-			'name' => 'Project-Metrics',
-			'one_line_summary' => '[New this year.] Projects should provide some summary metrics.',
-			'details' => '[New this year.] Projects should provide some summary metrics, such as number of bundles, number of committers, lines of code, number of bugs opened and fixed. This is so some statements can be made and tracked year-to-year about the size of the simultaneous release.'
-			);
-			
-	return $thefields;	
-}
-
-
-?>
\ No newline at end of file
diff --git a/planning/SimultaneousReleaseGrid.php b/planning/SimultaneousReleaseGrid.php
index 16f3375..6be78cb 100644
--- a/planning/SimultaneousReleaseGrid.php
+++ b/planning/SimultaneousReleaseGrid.php
@@ -1,338 +1,3 @@
-<html>
-<head>
-	<title>Simultaneous Release Summary Matrix</title>
-</head>
-<?php  
-require('/home/data/httpd/eclipse-php-classes/system/dbconnection_portal_ro.class.php');																														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('SimultaneousReleaseFunctions.php');
-
-ob_start();
-?>
-<!-- include empty lef nav col for now -->
-
-<div id="maincontent">
-	<div id="midcolumn">
-		<div style='float: left; margin-left: 50px; margin-right: 50px;'>
-			<a href="http://eclipse.org/indigo/planning/SimultaneousRleaseOverview.php">Back to Project List</a>
-			<br>
-			<?php
-				if(isset($_GET['showallprojects'])){
-					?><a href="?">Top Level Overview Grid</a><?php
-				}else{
-					?><a href="?showallprojects=true">All Projects Overview Grid</a><?php
-				}
-			?>
-		</div>
-		<div>
-			<h1><?= $pageTitle ?></h1>
-			<h2>Simultaneous Release Compliance Grid</h2>
-			<p style='width: 60%; margin-left: 50px;'> 
-			This page is to summarize progress towards the yearly <a target="_blank" href="http://wiki.eclipse.org/Indigo/Simultaneous_Release_Plan">Simultaneous Release</a> as the data has been provided by the projects, at the <a target="_blank" href="https://dev.eclipse.org/portal/myfoundation/portal/portal.php">Eclipse Foundations Portal Tracking Tool</a>. For details on the requirements see <a target="_blank" href="http://www.eclipse.org/indigo/planning/EclipseSimultaneousRelease.php">requirements for the Simultaneous Release</a>.
-			<br>
-			If questions please see <a target="_blank" href="http://wiki.eclipse.org/SimRel/Simultaneous_Release_Tracker_FAQ">Simultaneous Release Tracker FAQ</a> or ask the question on <a href="mailto:cross-project-issues-dev@eclipse.org">cross-project dev list</a>. 
-			</p>
-		</div>		
-		
-		<?php 
-		$projects_tracking_with_parent = get_projects_tracking_by_parent($App);
-		$tracking_projects = get_projects_tracking($App);
-
-		
-		$all_the_fields = get_fields($App,'indigo');
-		$projects = array();
-		foreach($tracking_projects as $projectid){
-			$projects[$projectid] = get_project_tracking($App,$projectid);
-		}
-
-		
-		
-		if(!isset($_GET['projectid']) and !isset($_GET['showallprojects']) ){
-			/*
-			 * roll up all sub projects with their parent
-			 */
-			foreach($projects as $projectid => $project){
-				$project_id_parts = explode(".",$projectid);
-				/*
-				 * if a sub proejct
-				 */
-				if(count($project_id_parts) > 1){
-					$parent_project_id = $project_id_parts[0];
-					if (isset($_GET['debug']) && $parent_project_id == 'eclipse') echo "!!!!Eclipse Project rollup: $projectid !!!!";
-					$top_level_already_exists = true;
-					if(!isset($projects[$parent_project_id])){
-						$top_level_already_exists = false;;
-					}
-					
-					/*
-					 * combine the release fields into the parent
-					 */
-					$parent_project = $projects[$parent_project_id];
-					foreach($all_the_fields as $fieldlabel => $fields){
-				    	if(empty($fields['fields'])){
-					    		$group_type = $shown_field;
-					    		continue;
-				    	}	
-				    	foreach($fields['fields'] as $afield){
-				    		if($top_level_already_exists != true){
-				    			$parent_project[$afield['key']] = $project[$afield['key']];
-				    		}elseif(!isset($project[$afield['key']]) and isset($parent_project[$afield['key']])){
-				    			unset($parent_project[$afield['key']]);
-				    		}
-				    	}
-					}
-					/*
-					 * remove the old child project
-					 */
-					$key = 	array_search($projectid,$tracking_projects);
-					unset($tracking_projects[$key]);
-					/*
-					 * add the parent project to the list of tracking project if not already there
-					 */
-					if(!in_array($parent_project_id,$tracking_projects)){
-						$tracking_projects[] = $parent_project_id;
-					}
-					/*
-					 * udpate the project values
-					 */
-					$parent_project['parent_projectid'] = $parent_project_id;
-					$projects[$parent_project_id]= $parent_project;
-				}
-			}
-			sort($tracking_projects);
-		}elseif(isset($_GET['projectid'])){
-			$parent_projectid = $_GET['projectid'];
-			foreach($tracking_projects as $k => $projectid){
-				if(!preg_match("/^$parent_projectid*/i",$projectid)){
-					unset($tracking_projects[$k]);
-				}
-			}
-		}
-		?>
-		<table BORDER=2>
-		<tr>
-			<td width="<?= (((count($tracking_projects)+1)/100.0))*100 ?>%">&nbsp;</td>
-			<?php
-			/*
-			 * show the project along the top
-			 */
-			foreach($tracking_projects as $projectid){
-		    	$project_tracking = $projects[$projectid];
-				$project_id_cleaned = str_replace(".","<br>",$projectid);
-				?>
-				<td ALIGN="center" width="<?= (((count($tracking_projects)+1)/100.0))*100 ?>%">
-					<?php 
-					if(isset($project_tracking['parent_projectid']) and $project_tracking['parent_projectid'] != ""){
-						?>
-						<a href="http://eclipse.org/indigo/planning/SimultaneousReleaseGrid.php?projectid=<?=$project_tracking['parent_projectid']?>"><?= $project_id_cleaned?></a>
-						<?
-					}else{
-						?>
-						<a href="http://eclipse.org/indigo/planning/SimultaneousReleaseOverview.php?action=project&projectid=<?=$projectid?>"><?= $project_id_cleaned?></a>
-						<?
-					}
-					?>
-				</td>
-				<?php			
-			}
-			?>
-		</tr>
-		<?php 
-		foreach($all_the_fields as $fieldlabel => $fields){
-	    	if(empty($fields['fields'])){
-		    		$group_type = $shown_field;
-		    		continue;
-	    	}
-			?>
-			<tr>
-				<td ALIGN="center"><?=(str_replace("-"," ",$fields['name']))?></td>
-				<?php
-					$group_type ="";
-					foreach($tracking_projects as $projectid){
-				    	$project_tracking = $projects[$projectid];
-						?>
-						<td ALIGN="center">
-				    	<?php
-			    		if(count($fields['fields']) == 1){
-			    			show_line($group_type,$project_tracking,$fields['fields'][0]['key'],false);
-			    		}else{
-			    			$all_completed = true;
-				    		foreach($fields['fields'] as $afield){
-//				    			show_line($group_type,$project_tracking,$afield['key'],false);
-				    			if(!$project_tracking[$afield['key']]){
-				    				$all_completed = false;
-				    				$key = $afield['key'];
-				    			}else{
-				    				if($key == ""){
-					    				$key = $afield['key'];
-				    				}
-				    			}
-					    	}
-			    			show_line($group_type,$project_tracking,$key,false);
-			    		}
-						?>
-						</td>
-						<?php 
-					}
-				?>
-			</tr>
-			<?php
-		}
-		
-		/*
-		 * Due to some restrictions on database access, this script cannot connect to
-		 * the Foundation database to get the IP Log and Release Documentation information.
-		 * Instead, we have to connect via Ajax call from the browser and do a little
-		 * JavaScript magic. At this point, we just insert a row into the table to
-		 * act as a placeholder for this information. The script at the bottom of this
-		 * file takes care of population.
-		 */
-		echo "<tr><td align=\"centre\">IP Log</td>";
-		foreach($tracking_projects as $projectid) {
-			echo "<td align=\"center\"><div id=\"$projectid-iplog\"><span style='color:yellow; font-size: 150%;'>&diams;</span></div></td>";
-		}
-		echo "</tr>";
-		
-		echo "<tr><td align=\"centre\">Release Docuware</td>";
-		foreach($tracking_projects as $projectid) {
-			echo "<td align=\"center\"><div id=\"$projectid-docuware\"><span style='color:yellow; font-size: 150%;'>&diams;</span></div></td>";
-		}
-		echo "</tr>";
-			
-		?>
-		</table>
-		
-<?php include('SimultaneousReleaseKey.php');?>
-		
-	</div>
-</div>
 <?php
-$html = ob_get_contents();
-ob_end_clean();
-
-print $html;
-
-# Generate the web page
-//$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
-
-function show_line($group_type,$project_tracking,$key,$show_more_than_diamond = true){
-    $color = 'yellow';
-    $value = "";
-    
-    /*
-     * check if before M7 and in group baisc/commonrepo
-     */
-    if(($group_type == 'basics' or $group_type == 'commonrepo') and strtotime('now') > strtotime('2010-05-06')){
-    	$color = 'red';
-    }
-    
-    /*
-     * check if data is prensent
-     */
-    if(isset($project_tracking[$key])){
-		$color = 'green';
-		$value = $project_tracking[$key];
-    }
-    
-    /*
-     * check for an excpetion
-     */
-    if(isset($project_tracking[$key.'_exception']) and  $project_tracking[$key.'_exception'] != ""){
-		$color = 'lightgreen';
-		$value = $project_tracking[$key.'_exception'];
-    } 
-    
-    /*
-     * swap out new and noteworthy
-     */
-    $sub_field = str_replace("_"," ",$key);
-    if(preg_match("/New And Noteworthy/i",$sub_field)){
-    	$sub_field = "Link to Supporting Documentation";
-    }
-    
-    /*
-     * display colored diamond
-     */
-    if($show_more_than_diamond){
-    	print "&nbsp;&nbsp;";
-    }
-    print "<span style='color:$color; font-size: 150%;'>&diams;</span>";
-    /*
-	* check value
-	*/
-	if($value != ""){
-        /*
-         * if the value is a link
-         */
-        if(preg_match("/http:\/\/|https:\/\//i",$value)){
-        	/*
-        	 * then make the label a link
-        	 */
-             if($show_more_than_diamond){
-        		echo "<a href='$value'>".ucwords($sub_field)."</a>";
-             }
-        }else{
-        	if($show_more_than_diamond){
-	        	print ucwords($sub_field);
-        	}
-        	/*
-        	 * display value if not keyword 'on'
-        	 */
-        	if(!preg_match("/^on$/i",trim($value)) and $show_more_than_diamond){
-        		echo ": ".$value;
-        	}
-        }
-        }else{
-        /*
-         * show the field
-         */
-        	if($show_more_than_diamond){
-				print ucwords($sub_field);
-        	}
-        }
-        if($show_more_than_diamond){
-        	print "<br>";
-        }
-}
-
-?>
-
-	<script src="http://yui.yahooapis.com/2.8.0r4/build/yahoo/yahoo.js"></script> 
-	<script src="http://yui.yahooapis.com/2.8.0r4/build/event/event.js"></script>
-	<script src="http://yui.yahooapis.com/2.8.0r4/build/connection/connection.js"></script>
-	<script>
-		function successHandler(o){		 
-			var root = o.responseXML.documentElement;
-			var reviews = root.getElementsByTagName('review');
-			var index = 0;
-			for(index=0;index<reviews.length;index++) {
-				var review = reviews[index];
-				var name = review.getAttribute("name");
-				var id = review.getAttribute("projectid");
-				var iplog = review.getAttribute("iplog");
-				var iplog_date = review.getAttribute("iplog-date");
-				var docuware = review.getAttribute("docuware");
-				var docuware_date = review.getAttribute("docuware-date");
-
-				var iplog_div = document.getElementById(id + '-iplog');
-				if (iplog_div) {
-					var status = "<span style='color:green; font-size: 150%;'>&diams;</span>";
-					if (!iplog) status = "<span style='color:lightgreen; font-size: 150%;'>&diams;</span>";
-					if (!iplog_date) status = "<span style='color:red; font-size: 150%;'>&diams;</span>";
-
-					iplog_div.innerHTML = status;
-				}
-				
-				var docuware_div = document.getElementById(id + '-docuware');
-				if (docuware_div) {
-					var status = "<span style='color:green; font-size: 150%;'>&diams;</span>";
-					if (!docuware) status = "<span style='color:lightgreen; font-size: 150%;'>&diams;</span>";
-					if (!docuware_date) status = "<span style='color:red; font-size: 150%;'>&diams;</span>";
-
-					docuware_div.innerHTML = status;
-				}
-			}		 
-		}
-		YAHOO.util.Connect.asyncRequest('GET', 'http://<?= $_SERVER['SERVER_NAME'] ?>/projects/xml/review_status.php?name=Indigo', { success:successHandler });
-	</script>
-
-</html>
\ No newline at end of file
+header("Location:http://www.eclipse.org/projects/releases/releases.php?release=indigo");
+?>
\ No newline at end of file
diff --git a/planning/SimultaneousReleaseGrid2.php b/planning/SimultaneousReleaseGrid2.php
deleted file mode 100644
index 75aaed0..0000000
--- a/planning/SimultaneousReleaseGrid2.php
+++ /dev/null
@@ -1,208 +0,0 @@
-<html>
-<head>
-	<title>Simultaneous Summary Matrix</title>
-</head>
-<?php  
-require('/home/data/httpd/eclipse-php-classes/system/dbconnection_portal_ro.class.php');																														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('SimultaneousReleaseFunctions.php');
-
-class ReleaseData {
-	var $projects = array();	
-	
-	function &getProjectReleaseData($id) {
-		return $projects[$id];
-	}
-}
-
-class ProjectReleaseData {
-	var $id;
-	var $data = array();
-	
-	function getStatus($key) {
-		return $data[$key];
-	}
-}
-
-function getReleaseData() {
-	global $App;
-	
-	$query = "select 
-				distinct ProjectID 
-			  from 
-			  	ProjectInfo, 
-			  	ProjectInfoValues 
-			  where 
-			  	MainKey = 'simultaneousrelease' 
-			  and 
-			  	Subkey = 'indigo' 
-			  and 
-			  	Value = 1 
-			  and 
-			  	ProjectInfo.ProjectInfoID = ProjectInfoValues.ProjectInfoID
-			  order by ProjectID
-			  	";
-	$results = $App->eclipse_sql($query);
-	
-	$releaseData = new ReleaseData();
-	while($row = mysql_fetch_assoc($results)){
-		$id = $row['ProjectID'];
-		$projectReleaseData =  new ProjectReleaseData();
-		$projectReleaseData->id = $id;
-		$releaseData->projects[$id] = $projectReleaseData;
-	}
-	
-	$dbhc = new DBConnectionPortalRO(); 
-	$dbh = $dbhc->connect();
-	
-	$query = "select projectid, track_key, track_value, exception, therelease from simultaneous_release_tracker";
-	$results = mysql_query($query,$dbh);	
-	while ($row = mysql_fetch_assoc($results)) {
-		$id = $row['projectid'];
-		$key = $row['track_key'];
-		$releaseData->projects[$id]->data[$key] = $row;
-	}
-	
-//	Array
-//(
-//    [projectid] => modeling.emf.transaction
-//    [track_key] => unit_tests
-//    [track_value] => on
-//    [exception] => 
-//    [therelease] => 
-//)
-
-	return $releaseData;
-}
-
-$releaseData = getReleaseData();
-$all_fields = get_fields();
-
-print_r($all_fields);
-
-ob_start();
-?>
-<!-- include empty lef nav col for now -->
-
-<div id="maincontent">
-	<div id="midcolumn">
-		<div style='float: left; margin-left: 50px; margin-right: 50px;'>
-			<a href="http://eclipse.org/indigo/planning/SimultaneousRleaseOverview.php">Back to Project List</a>
-			<br>
-			<?php
-				if(isset($_GET['showallprojects'])){
-					?><a href="?">Top Level Overview Grid</a><?php
-				}else{
-					?><a href="?showallprojects=true">All Projects Overview Grid</a><?php
-				}
-			?>
-		</div>
-		<div>
-			<h1><?= $pageTitle ?></h1>
-			<h2>Simultaneous Release Compliance Grid</h2>
-			<p style='width: 60%; margin-left: 50px;'> 
-			This page is to summarize progress towards the yearly <a target="_blank" href="http://wiki.eclipse.org/Indigo/Simultaneous_Release_Plan">Simultaneous Release</a> as the data has been provided by the projects, at the <a target="_blank" href="https://dev.eclipse.org/portal/myfoundation/portal/portal.php">Eclipse Foundations Portal Tracking Tool</a>. For details on the requirements see <a target="_blank" href="http://www.eclipse.org/indigo/planning/EclipseSimultaneousRelease.php">requirements for the Simultaneous Release</a>.
-			<br>
-			If questions please see <a target="_blank" href="http://wiki.eclipse.org/SimRel/Simultaneous_Release_Tracker_FAQ">Simultaneous Release Tracker FAQ</a> or ask the question on <a href="mailto:cross-project-issues-dev@eclipse.org">cross-project dev list</a>. 
-			</p>
-		</div>		
-		
-		<table BORDER=2>
-		<tr>
-			<td>&nbsp;</td>
-			<?php
-			/*
-			 * show the projects along the top
-			 */
-			foreach($releaseData->projects as $id => $project) {
-				$pretty_id = str_replace(".","<br>",$id);
-				echo "<td ALIGN=\"center\">";
-				echo "<a href=\"http://eclipse.org/indigo/planning/SimultaneousReleaseOverview.php?action=project&projectid=$id\">$pretty_id</a>";
-			}
-			
-			foreach($all_fields as $fieldlabel => $fields) {
-		    	if(empty($fields['fields'])) continue;
-				echo "<tr>";
-				echo "<td ALIGN=\"center\">". str_replace("-"," ",$fields['name']) . "</td>";
-				
-				foreach($releaseData->projects as $project) {
-					$status = $project->getStatus($fields['fields'][0]['key']);
-					echo "<td>" . $status . "</td>";
-				}
-				echo "</tr>";
-			}
-		
-			/*
-			 * Due to some restrictions on database access, this script cannot connect to
-			 * the Foundation database to get the IP Log and Release Documentation information.
-			 * Instead, we have to connect via Ajax call from the browser and do a little
-			 * JavaScript magic. At this point, we just insert a row into the table to
-			 * act as a placeholder for this information. The script at the bottom of this
-			 * file takes care of population.
-			 */
-			echo "<tr><td align=\"centre\">IP Log</td>";
-			foreach($releaseData as $id => $project) {
-				echo "<td align=\"center\"><div id=\"$id-iplog\"><span style='color:yellow; font-size: 150%;'>&diams;</span></div></td>";
-			}
-			echo "</tr>";
-			
-			echo "<tr><td align=\"centre\">Release Docuware</td>";
-			foreach($releaseData as $id => $projectid) {
-				echo "<td align=\"center\"><div id=\"$id-docuware\"><span style='color:yellow; font-size: 150%;'>&diams;</span></div></td>";
-			}
-			echo "</tr>";
-			
-		?>
-		</table>
-		
-<?php include('SimultaneousReleaseKey.php');?>
-		
-	</div>
-</div>
-<?php
-$html = ob_get_contents();
-ob_end_clean();
-
-print $html;
-
-?>
-
-	<script src="http://yui.yahooapis.com/2.8.0r4/build/yahoo/yahoo.js"></script> 
-	<script src="http://yui.yahooapis.com/2.8.0r4/build/event/event.js"></script>
-	<script src="http://yui.yahooapis.com/2.8.0r4/build/connection/connection.js"></script>
-	<script>
-		function successHandler(o){		 
-			var root = o.responseXML.documentElement;
-			var reviews = root.getElementsByTagName('review');
-			var index = 0;
-			for(index=0;index<reviews.length;index++) {
-				var review = reviews[index];
-				var name = review.getAttribute("name");
-				var id = review.getAttribute("projectid");
-				var iplog = review.getAttribute("iplog");
-				var iplog_date = review.getAttribute("iplog-date");
-				var docuware = review.getAttribute("docuware");
-				var docuware_date = review.getAttribute("docuware-date");
-
-				var iplog_div = document.getElementById(id + '-iplog');
-				if (iplog_div) {
-					var status = "<span style='color:green; font-size: 150%;'>&diams;</span>";
-					if (!iplog) status = "<span style='color:lightgreen; font-size: 150%;'>&diams;</span>";
-					if (!iplog_date) status = "<span style='color:red; font-size: 150%;'>&diams;</span>";
-
-					iplog_div.innerHTML = status;
-				}
-				
-				var docuware_div = document.getElementById(id + '-docuware');
-				if (docuware_div) {
-					var status = "<span style='color:green; font-size: 150%;'>&diams;</span>";
-					if (!docuware) status = "<span style='color:lightgreen; font-size: 150%;'>&diams;</span>";
-					if (!docuware_date) status = "<span style='color:red; font-size: 150%;'>&diams;</span>";
-
-					docuware_div.innerHTML = status;
-				}
-			}		 
-		}
-		YAHOO.util.Connect.asyncRequest('GET', 'http://<?= $_SERVER['SERVER_NAME'] ?>/projects/xml/review_status.php?name=Indigo', { success:successHandler });
-	</script>
-
-</html>
\ No newline at end of file
diff --git a/planning/SimultaneousReleaseKey.php b/planning/SimultaneousReleaseKey.php
deleted file mode 100644
index 24e97d9..0000000
--- a/planning/SimultaneousReleaseKey.php
+++ /dev/null
@@ -1,7 +0,0 @@
-
-	<ul style='margin: 0px; margin-top: 10px; list-style: none;'><b>Key</b>
-		<li style='padding: 0px; list-style: none;'><span style='color: green; font-size: 150%;'>&diams;</span>Completed</li>
-		<li style='padding: 0px; list-style: none;'><span style='color: yellow; font-size: 150%;'>&diams;</span>No Data</li>
-		<li style='padding: 0px; list-style: none;'><span style='color: red; font-size: 150%;'>&diams;</span>Not Completed</li>	
-		<li style='padding: 0px; list-style: none;'><span style='color: lightgreen; font-size: 150%;'>&diams;</span>Completed, with exception</li>	
-	</ul>
diff --git a/planning/SimultaneousReleaseLeftCol.php b/planning/SimultaneousReleaseLeftCol.php
deleted file mode 100644
index 7646cf0..0000000
--- a/planning/SimultaneousReleaseLeftCol.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php 
-	if(isset($_GET['action']) and $_GET['action'] == 'project'){
-		?>
-		<a href="http://eclipse.org/indigo/planning/SimultaneousRleaseOverview.php">Back to Project List</a>
-		<br> 
-		<?php
-	}else{
-		?>
-		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-		<?php
-	}
-?>
-	<a href="http://eclipse.org/indigo/planning/SimultaneousReleaseGrid.php">Top Level Overview Grid</a>
-	<br>
-	<a href="http://eclipse.org/indigo/planning/SimultaneousReleaseGrid.php?showallprojects=true">All Projects Overview Grid</a>
-<?php 
-	if(isset($_GET['action']) and $_GET['action'] == 'project'){
-		include('SimultaneousReleaseKey.php');
-	}
-?>
\ No newline at end of file
diff --git a/planning/SimultaneousReleaseOverview.php b/planning/SimultaneousReleaseOverview.php
index ecf3af3..6be78cb 100644
--- a/planning/SimultaneousReleaseOverview.php
+++ b/planning/SimultaneousReleaseOverview.php
@@ -1,171 +1,3 @@
-<?php  
-require('/home/data/httpd/eclipse-php-classes/system/dbconnection_portal_ro.class.php');																														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('SimultaneousReleaseFunctions.php');
-
-# Begin: page-specific settings.
-$pageTitle 		= "Indigo Summary of Projects";
-$pageKeywords	= "Eclipse Planning Council";
-$pageAuthor		= "Gabe O'BRien";
-$theme = "Nova";
-# Paste your HTML content between the markers!
-ob_start();
-?>
-<!-- include empty lef nav col for now -->
-<div id="leftcol">
-	<?php  include("SimultaneousReleaseLeftCol.php"); ?>
-</div>
-<div id="maincontent">
-	<div id="midcolumn">
-		<h1><?= $pageTitle ?></h1>
-		<h2>Simultaneous Release Compliance</h2>
-		<?php 
-			switch($_GET['action']){
-				case 'project':
-					show_a_project($App,$_GET['projectid']);
-					break;
-				case 'show_list':
-				default:
-					show_list_of_projects($App);
-			}
-		?>
-	</div>
-</div>
 <?php
-$html = ob_get_contents();
-ob_end_clean();
-
-# Generate the web page
-$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
-
-function show_a_project($App,$projectid){
-	$project_tracking = get_project_tracking($App,$projectid);
-	$all_the_fields = get_fields($App,'indigo');
-	?>
-	<div style="float: right;">
-		<a target="_blank" href="https://dev.eclipse.org/portal/myfoundation/portal/portal.php">Edit this data at the Foundation's Portal</a>
-	</div>
-	<ul style=''>
-		<li></>Project: <?=$projectid?><br>
-		<li></>Date: <?=date('c');?><br>
-	</ul>
-	<?php
-	$group_type = "";
-    foreach($all_the_fields as $fieldlabel => $fields){
-    	$shown_field = str_replace("-"," ",$fieldlabel);
-    	if(empty($fields['fields'])){
-    		$group_type = $shown_field;
-    	    ?><h3><?=ucwords($fields['name'])?></h3><?php
-    	}else{
-    		if(count($fields['fields']) == 1){
-//	    		print "<b>".ucwords($shown_field)."</b><br>";
-    			show_line($group_type,$project_tracking,$fields['fields'][0]['key']);
-    		}else{
-	    		print "<b>".ucwords($shown_field)."</b><br>";
-	    		foreach($fields['fields'] as $afield){
-	    			show_line($group_type,$project_tracking,$afield['key']);
-		    	}
-    		}
-    	}
-    }
-}
-
-
-function show_line($group_type,$project_tracking,$key){
-    $color = 'yellow';
-    $value = "";
-    
-    /*
-     * check if before M7 and in group baisc/commonrepo
-     */
-    if(($group_type == 'basics' or $group_type == 'commonrepo') and strtotime('now') > strtotime('2010-05-06')){
-    	$color = 'red';
-    }
-    
-    /*
-     * check if data is prensent
-     */
-    if(isset($project_tracking[$key])){
-		$color = 'green';
-		$value = $project_tracking[$key];
-    }
-    
-    /*
-     * check for an excpetion
-     */
-    if(isset($project_tracking[$key.'_exception']) and  $project_tracking[$key.'_exception'] != ""){
-		$color = 'lightgreen';
-		if($project_tracking[$key] != ""){
-			$value = $project_tracking[$key];
-		}else{
-			$value = $project_tracking[$key.'_exception'];
-		}
-    } 
-    
-    /*
-     * swap out new and noteworthy
-     */
-    $sub_field = str_replace("_"," ",$key);
-    if(preg_match("/New And Noteworthy/i",$sub_field)){
-    	$sub_field = "Link to Supporting Documentation";
-    }
-    
-    /*
-     * display colored diamond
-     */
-	print "&nbsp;&nbsp;<span style='color:$color; font-size: 150%;'>&diams;</span>";
-        
-	/*
-	* check value
-	*/
-	if($value != ""){
-        /*
-         * if the value is a link
-         */
-        if(preg_match("/http:\/\/|https:\/\//i",$value)){
-        	/*
-        	 * then make the label a link
-        	 */
-        	echo "<a href='$value'>".ucwords($sub_field)."</a>";
-        }else{
-        	print ucwords($sub_field);
-        	/*
-        	 * display value if not keyword 'on'
-        	 */
-        	if(!preg_match("/^on$/i",trim($value))){
-        		echo ": ".$value;
-        	}
-        }
-        }else{
-        /*
-         * show the field
-         */
-                print ucwords($sub_field);
-        }
-        print "<br>";
-
-}
-
-
-function show_list_of_projects($App){
-	$projects_tracking_with_parent = get_projects_tracking_by_parent($App);
-	$tracking_projects = get_projects_tracking($App);
-	foreach($tracking_projects as $projectid){
-		?>
-			<a href="?action=project&projectid=<?=$projectid?>"><?=$projectid?></a>
-			<?php
-			foreach($projects_tracking_with_parent as $k => $v){
-				if($v == $projectid){
-					?>
-					<br>
-					&nbsp;&nbsp;&nbsp;
-					<?=$k?>
-					<?php 
-				}
-			}
-			?>
-			<br>
-		<?php
-	}
-}
-
+header("Location:http://www.eclipse.org/projects/releases/releases.php?release=indigo");
 ?>
\ No newline at end of file
diff --git a/planning/SimultaneousRleaseOverview.php b/planning/SimultaneousRleaseOverview.php
deleted file mode 100644
index cb4a7f7..0000000
--- a/planning/SimultaneousRleaseOverview.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php 
-	header("location: SimultaneousReleaseOverview.php");
-?>
\ No newline at end of file
diff --git a/planning/grid.php b/planning/grid.php
index cc3b1ad..6be78cb 100644
--- a/planning/grid.php
+++ b/planning/grid.php
@@ -1,368 +1,3 @@
 <?php
-/*******************************************************************************
- * Copyright (c) 2009-2010 Eclipse Foundation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Gabe O'Brien (Eclipse Foundation) - initial API and implementation
- *    Wayne Beaton (Eclipse Foundation) - Generalized and updated.
- *******************************************************************************/
-require_once($_SERVER['DOCUMENT_ROOT']) . "/projects/classes/debug.php";
-	
-require('/home/data/httpd/eclipse-php-classes/system/dbconnection_portal_ro.class.php');
-
-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('SimultaneousReleaseFunctions.php');
-
-$release = isset($_GET['release']) ? $_GET['release'] : 'indigo';
-if (!in_array($release, array('indigo', 'helios'))) $release = 'indigo';
-
-$release_name = ucwords($release);
-$pageTitle = "Coordinated Release Summary Matrix ($release_name)";
-$release_plan_url = "http://wiki.eclipse.org/$release_name/Simultaneous_Release_Plan";
-$release_tracker_faq_url = "http://wiki.eclipse.org/SimRel/Simultaneous_Release_Tracker_FAQ";
-$release_status_url = 'http://' . $_SERVER['SERVER_NAME'] . "/projects/xml/review_status.php?name=$review_name>";
-
-ob_start();
-?>
-<html>
-<head>
-	<title><?php echo $pageTitle; ?></title>
-</head>
-<!-- include empty lef nav col for now -->
-
-<div id="maincontent">
-	<div id="midcolumn">
-		<div style='float: left; margin-left: 50px; margin-right: 50px;'>
-			<br>
-			<?php
-				if(isset($_GET['showallprojects'])){
-					?><a href="?">Top Level Overview Grid</a><?php
-				}else{
-					?><a href="?showallprojects=true">All Projects Overview Grid</a><?php
-				}
-			?>
-		</div>
-		<div>
-			<h1><?= $pageTitle ?></h1>
-			<h2>Simultaneous Release Compliance Grid</h2>
-			<p style='width: 60%; margin-left: 50px;'> 
-			This page is to summarize progress towards the yearly <a target="_blank" href="<?php echo $release_plan_url; ?>">Simultaneous Release</a> as the data has been provided by the projects, at the <a target="_blank" href="https://dev.eclipse.org/portal/myfoundation/portal/portal.php">Eclipse Foundations Portal Tracking Tool</a>. For details on the requirements see <a target="_blank" href="http://www.eclipse.org/indigo/planning/EclipseSimultaneousRelease.php">requirements for the Simultaneous Release</a>.
-			<br>
-			If questions please see <a target="_blank" href="<?php echo $release_tracker_faq_url; ?>">Simultaneous Release Tracker FAQ</a> or ask the question on <a href="mailto:cross-project-issues-dev@eclipse.org">cross-project dev list</a>. 
-			</p>
-		</div>		
-		
-		<?php 
-		$projects_tracking_with_parent = get_projects_tracking_by_parent($App);
-		$tracking_projects = get_projects_tracking($App);
-
-		
-		$all_the_fields = get_fields($App,$release);
-		$projects = array();
-		foreach($tracking_projects as $projectid){
-			$projects[$projectid] = get_project_tracking($App,$projectid);
-		}
-
-		
-		
-		if(!isset($_GET['projectid']) and !isset($_GET['showallprojects']) ){
-			/*
-			 * roll up all sub projects with their parent
-			 */
-			foreach($projects as $projectid => $project){
-				$project_id_parts = explode(".",$projectid);
-				/*
-				 * if a sub proejct
-				 */
-				if(count($project_id_parts) > 1){
-					$parent_project_id = $project_id_parts[0];
-					if (isset($_GET['debug']) && $parent_project_id == 'eclipse') echo "!!!!Eclipse Project rollup: $projectid !!!!";
-					$top_level_already_exists = true;
-					if(!isset($projects[$parent_project_id])){
-						$top_level_already_exists = false;;
-					}
-					
-					/*
-					 * combine the release fields into the parent
-					 */
-					$parent_project = $projects[$parent_project_id];
-					foreach($all_the_fields as $fieldlabel => $fields){
-				    	if(empty($fields['fields'])){
-					    		$group_type = $shown_field;
-					    		continue;
-				    	}	
-				    	foreach($fields['fields'] as $afield){
-				    		if($top_level_already_exists != true){
-				    			$parent_project[$afield['key']] = $project[$afield['key']];
-				    		}elseif(!isset($project[$afield['key']]) and isset($parent_project[$afield['key']])){
-				    			unset($parent_project[$afield['key']]);
-				    		}
-				    	}
-					}
-					/*
-					 * remove the old child project
-					 */
-					$key = 	array_search($projectid,$tracking_projects);
-					unset($tracking_projects[$key]);
-					/*
-					 * add the parent project to the list of tracking project if not already there
-					 */
-					if(!in_array($parent_project_id,$tracking_projects)){
-						$tracking_projects[] = $parent_project_id;
-					}
-					/*
-					 * udpate the project values
-					 */
-					$parent_project['parent_projectid'] = $parent_project_id;
-					$projects[$parent_project_id]= $parent_project;
-				}
-			}
-			sort($tracking_projects);
-		}elseif(isset($_GET['projectid'])){
-			$parent_projectid = $_GET['projectid'];
-			foreach($tracking_projects as $k => $projectid){
-				if(!preg_match("/^$parent_projectid*/i",$projectid)){
-					unset($tracking_projects[$k]);
-				}
-			}
-		}
-		?>
-		<table BORDER=2>
-		<tr>
-			<td width="<?= (((count($tracking_projects)+1)/100.0))*100 ?>%">&nbsp;</td>
-			<?php
-			/*
-			 * show the project along the top
-			 */
-			foreach($tracking_projects as $projectid){
-		    	$project_tracking = $projects[$projectid];
-				$project_id_cleaned = str_replace(".","<br>",$projectid);
-				?>
-				<td ALIGN="center" width="<?= (((count($tracking_projects)+1)/100.0))*100 ?>%">
-					<?php 
-					if(isset($project_tracking['parent_projectid']) and $project_tracking['parent_projectid'] != ""){
-						?>
-						<a href="http://eclipse.org/indigo/planning/SimultaneousReleaseGrid.php?projectid=<?=$project_tracking['parent_projectid']?>"><?= $project_id_cleaned?></a>
-						<?
-					}else{
-						?>
-						<a href="http://eclipse.org/indigo/planning/SimultaneousReleaseOverview.php?action=project&projectid=<?=$projectid?>"><?= $project_id_cleaned?></a>
-						<?
-					}
-					?>
-				</td>
-				<?php			
-			}
-			?>
-		</tr>
-		<?php 
-		foreach($all_the_fields as $fieldlabel => $fields){
-	    	if(empty($fields['fields'])){
-		    		$group_type = $shown_field;
-		    		continue;
-	    	}
-			?>
-			<tr>
-				<td ALIGN="center"><?=(str_replace("-"," ",$fields['name']))?></td>
-				<?php
-					$group_type ="";
-					foreach($tracking_projects as $projectid){
-				    	$project_tracking = $projects[$projectid];
-						?>
-						<td ALIGN="center">
-				    	<?php
-			    		if(count($fields['fields']) == 1){
-			    			show_line($group_type,$project_tracking,$fields['fields'][0]['key'],false);
-			    		}else{
-			    			$all_completed = true;
-				    		foreach($fields['fields'] as $afield){
-//				    			show_line($group_type,$project_tracking,$afield['key'],false);
-				    			if(!$project_tracking[$afield['key']]){
-				    				$all_completed = false;
-				    				$key = $afield['key'];
-				    			}else{
-				    				if($key == ""){
-					    				$key = $afield['key'];
-				    				}
-				    			}
-					    	}
-			    			show_line($group_type,$project_tracking,$key,false);
-			    		}
-						?>
-						</td>
-						<?php 
-					}
-				?>
-			</tr>
-			<?php
-		}
-		
-		/*
-		 * Due to some restrictions on database access, this script cannot connect to
-		 * the Foundation database to get the IP Log and Release Documentation information.
-		 * Instead, we have to connect via Ajax call from the browser and do a little
-		 * JavaScript magic. At this point, we just insert a row into the table to
-		 * act as a placeholder for this information. The script at the bottom of this
-		 * file takes care of population.
-		 */
-		echo "<tr><td align=\"centre\">IP Log</td>";
-		foreach($tracking_projects as $projectid) {
-			echo "<td align=\"center\"><div id=\"$projectid-iplog\"><span style='color:yellow; font-size: 150%;'>&diams;</span></div></td>";
-		}
-		echo "</tr>";
-		
-		echo "<tr><td align=\"centre\">Release Docuware</td>";
-		foreach($tracking_projects as $projectid) {
-			echo "<td align=\"center\"><div id=\"$projectid-docuware\"><span style='color:yellow; font-size: 150%;'>&diams;</span></div></td>";
-		}
-		echo "</tr>";
-			
-		?>
-		</table>
-		
-<?php include('SimultaneousReleaseKey.php');?>
-		
-	</div>
-</div>
-<?php
-$html = ob_get_contents();
-ob_end_clean();
-
-print $html;
-
-# Generate the web page
-//$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
-
-function show_line($group_type,$project_tracking,$key,$show_more_than_diamond = true){
-    $color = 'yellow';
-    $value = "";
-    
-    /*
-     * check if before M7 and in group baisc/commonrepo
-     */
-    if(($group_type == 'basics' or $group_type == 'commonrepo') and strtotime('now') > strtotime('2010-05-06')){
-    	$color = 'red';
-    }
-    
-    /*
-     * check if data is prensent
-     */
-    if(isset($project_tracking[$key])){
-		$color = 'green';
-		$value = $project_tracking[$key];
-    }
-    
-    /*
-     * check for an excpetion
-     */
-    if(isset($project_tracking[$key.'_exception']) and  $project_tracking[$key.'_exception'] != ""){
-		$color = 'lightgreen';
-		$value = $project_tracking[$key.'_exception'];
-    } 
-    
-    /*
-     * swap out new and noteworthy
-     */
-    $sub_field = str_replace("_"," ",$key);
-    if(preg_match("/New And Noteworthy/i",$sub_field)){
-    	$sub_field = "Link to Supporting Documentation";
-    }
-    
-    /*
-     * display colored diamond
-     */
-    if($show_more_than_diamond){
-    	print "&nbsp;&nbsp;";
-    }
-    print "<span style='color:$color; font-size: 150%;'>&diams;</span>";
-    /*
-	* check value
-	*/
-	if($value != ""){
-        /*
-         * if the value is a link
-         */
-        if(preg_match("/http:\/\/|https:\/\//i",$value)){
-        	/*
-        	 * then make the label a link
-        	 */
-             if($show_more_than_diamond){
-        		echo "<a href='$value'>".ucwords($sub_field)."</a>";
-             }
-        }else{
-        	if($show_more_than_diamond){
-	        	print ucwords($sub_field);
-        	}
-        	/*
-        	 * display value if not keyword 'on'
-        	 */
-        	if(!preg_match("/^on$/i",trim($value)) and $show_more_than_diamond){
-        		echo ": ".$value;
-        	}
-        }
-        }else{
-        /*
-         * show the field
-         */
-        	if($show_more_than_diamond){
-				print ucwords($sub_field);
-        	}
-        }
-        if($show_more_than_diamond){
-        	print "<br>";
-        }
-}
-
-?>
-
-	<script src="http://yui.yahooapis.com/2.8.0r4/build/yahoo/yahoo.js"></script> 
-	<script src="http://yui.yahooapis.com/2.8.0r4/build/event/event.js"></script>
-	<script src="http://yui.yahooapis.com/2.8.0r4/build/connection/connection.js"></script>
-	<script>
-		function successHandler(o){		 
-			var root = o.responseXML.documentElement;
-			var reviews = root.getElementsByTagName('review');
-			var index = 0;
-			for(index=0;index<reviews.length;index++) {
-				var review = reviews[index];
-				var name = review.getAttribute("name");
-				var id = review.getAttribute("projectid");
-				var iplog = review.getAttribute("iplog");
-				var iplog_date = review.getAttribute("iplog-date");
-				var docuware = review.getAttribute("docuware");
-				var docuware_date = review.getAttribute("docuware-date");
-
-				var iplog_div = document.getElementById(id + '-iplog');
-				if (iplog_div) {
-					var status = "<span style='color:green; font-size: 150%;'>&diams;</span>";
-					if (!iplog) status = "<span style='color:lightgreen; font-size: 150%;'>&diams;</span>";
-					if (!iplog_date) status = "<span style='color:red; font-size: 150%;'>&diams;</span>";
-
-					iplog_div.innerHTML = status;
-				}
-				
-				var docuware_div = document.getElementById(id + '-docuware');
-				if (docuware_div) {
-					var status = "<span style='color:green; font-size: 150%;'>&diams;</span>";
-					if (!docuware) status = "<span style='color:lightgreen; font-size: 150%;'>&diams;</span>";
-					if (!docuware_date) status = "<span style='color:red; font-size: 150%;'>&diams;</span>";
-
-					docuware_div.innerHTML = status;
-				}
-			}		 
-		}
-		YAHOO.util.Connect.asyncRequest('GET', '<?php echo $release_status_url; ?>', { success:successHandler });
-	</script>
-
-</html>
\ No newline at end of file
+header("Location:http://www.eclipse.org/projects/releases/releases.php?release=indigo");
+?>
\ No newline at end of file
diff --git a/planning/index.php b/planning/index.php
index b12a13e..6be78cb 100644
--- a/planning/index.php
+++ b/planning/index.php
@@ -1,35 +1,3 @@
-<?php  																														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());    # All on the same line to unclutter the user's desktop'
-
-#
-# Begin: page-specific settings.
-$pageTitle 		= "Eclipse Planning Council";
-$pageKeywords	= "Eclipse Planning Council";
-$pageAuthor		= "David Williams";
-$theme = "Nova";
-# Paste your HTML content between the markers!
-ob_start();
-?>
-
-
-	<!-- include empty lef nav col for now -->
-	<div id="leftcol">
-	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-	</div>
-	
-<div id="maincontent">
-<div id="midcolumn">
-<h1><?= $pageTitle ?></h1>
-<h2>Purpose</h2>
-<p>This 'planning' directory at this URL is to hold Planning Council specific web
-pages and web apps. Most Planning Council information is available on
-the <a href="http://wiki.eclipse.org/Planning_Council">Eclipse Planning
-Council Wiki Pages</a></p>
-</div>
-</div> 
-
 <?php
-$html = ob_get_contents();
-ob_end_clean();
-
-# Generate the web page
-$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
+header("Location:http://www.eclipse.org/projects/releases/releases.php?release=indigo");
+?>
\ No newline at end of file
