diff --git a/planning/grid.php b/planning/grid.php
new file mode 100644
index 0000000..1114c9d
--- /dev/null
+++ b/planning/grid.php
@@ -0,0 +1,357 @@
+<?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('/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);
+$release_plan_url = "http://wiki.eclipse.org/$release_name/Simultaneous_Release_Plan";
+$release_tracker_faq_url = "http://wiki.eclipse.org/$release_name/Simultaneous_Release_Tracker_FAQ";
+$release_status_url = 'http://' . $_SERVER['SERVER_NAME'] . "/projects/xml/review_status.php?name=$review_name>";
+
+ob_start();
+?>
+<html>
+<head>
+	<title>Coordinated Release Summary Matrix (<?php echo $release_name; ?>)</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/helios/planning/EclipseSimultaneousRelease.php">requirements for the Simultaneous Release</a>.
+			<br>
+			If questions please see <a target="_blank" href="<?php $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/helios/planning/SimultaneousReleaseGrid.php?projectid=<?=$project_tracking['parent_projectid']?>"><?= $project_id_cleaned?></a>
+						<?
+					}else{
+						?>
+						<a href="http://eclipse.org/helios/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
