Index: typo3/alt_menu.php
===================================================================
--- typo3/alt_menu.php	(Revision 1955)
+++ typo3/alt_menu.php	(Arbeitskopie)
@@ -111,6 +111,15 @@
 		$TBE_TEMPLATE->docType='xhtml_trans';
 		$TBE_TEMPLATE->divClass='vertical-menu';
 		$TBE_TEMPLATE->bodyTagAdditions = 'onload="top.restoreHighlightedModuleMenuItem()"';
+		$TBE_TEMPLATE->JScodeArray[] = "
+		function refresh_menu() { window.setTimeout('_refresh_menu();',0); }
+		function _refresh_menu()	{
+			var r = new Date();
+			// randNum is useful so pagetree does not get cached in browser cache when refreshing
+			window.location.href = 'alt_menu.php?randNum='+r.getTime();
+		}
+";
+		
 		$this->content.=$TBE_TEMPLATE->startPage('Vertical Backend Menu');
 		$backPath = $GLOBALS['BACK_PATH'];
 
Index: typo3/mod/tools/em/class.em_index.php
===================================================================
--- typo3/mod/tools/em/class.em_index.php	(Revision 1955)
+++ typo3/mod/tools/em/class.em_index.php	(Arbeitskopie)
@@ -318,7 +318,8 @@
 	var $inst_keys = array();			// Storage of installed extensions
 	var $gzcompress = 0;				// Is set true, if system support compression.
 
-	var $terConnection;			// instance of TER connection handler
+	var $terConnection;					// instance of TER connection handler
+	var $JScode;						// JavaScript code to be forwared to $this->doc->JScode
 
 		// GPvars:
 	var $CMD = array();					// CMD array
@@ -394,6 +395,7 @@
 			function jumpToUrl(URL)	{	//
 				window.location.href = URL;
 			}
+			'.$this->JScode.'
 		');
 		$this->doc->form = '<form action="index.php" method="post" name="pageform">';
 
@@ -411,6 +413,34 @@
 	}
 
 	/**
+	 * This method triggers a restart of this instance.
+	 *
+	 * @param	array	$getParams: Array of GET parameters to include
+	 * @return	void
+	 */
+	function restart($getParams=array()) {
+			// Handle GET parameters to include:
+		$params = t3lib_div::_GET();
+		foreach($getParams as $k => $v)	{
+			if (strcmp($v,''))	{
+				$params[$k]=$v;
+			} else unset($params[$k]);
+		}
+		t3lib_div::_GETset($params);
+			// Reset POST parameters:
+		t3lib_div::_POSTset(array());
+			// Reset content:
+		$this->content = '';
+			// Reload loaded extensions TCA, etc:
+		$this->refreshGlobalExtList();
+			// Restart like index.php would have done:
+		$this->init();
+		$this->checkExtObj();
+		$this->main();
+		$this->printContent();
+	}
+
+	/**
 	 * This function is a copy of the same function in t3lib_SCbase with one modification:
 	 * In contrast to t3lib_SCbase::handleExternalFunctionValue() this function merges the $this->extClassConf array
 	 * instead of overwriting it. That was necessary for including the Kickstarter as a submodule into the 'singleDetails'
@@ -1927,8 +1957,21 @@
 							} else {
 								$vA = array('CMD'=>Array('showExt'=>$extKey));
 							}
+								// Determine if modules were affected:
+							$techInfo = $this->makeDetailedExtensionAnalysis($extKey, $list[$extKey]);
+							$changedModules = is_array($techInfo['flags']) && in_array('Module', $techInfo['flags'], true);
+								// Extension was installed stand-alone in a separate window:
 							if($this->CMD['standAlone'] || t3lib_div::_GP('standAlone')) {
-								$this->content .= 'Extension has been '.($this->CMD['load'] ? 'installed' : 'removed').'.<br /><br /><a href="javascript:opener.top.content.document.forms[0].submit();window.close();">Close window and recheck dependencies</a>';
+								if ($changedModules) {
+									$refreshMenu = 'opener.top.menu.refresh_menu();';
+								}
+								$this->content .= 'Extension has been '.($this->CMD['load'] ? 'installed' : 'removed').'.<br /><br /><a href="javascript:opener.top.content.document.forms[0].submit();'.$refreshMenu.'window.close();">Close window and recheck dependencies</a>';
+								// Modules were installed or remove, so we have to reload the menu frame:
+							} elseif($changedModules) {
+								$this->JScode = 'top.menu.refresh_menu();';
+								$this->restart($vA);
+								exit;
+								// No modules were affected:
 							} else {
 								header('Location: '.t3lib_div::linkThisScript($vA));
 							}
Index: t3lib/class.t3lib_div.php
===================================================================
--- t3lib/class.t3lib_div.php	(Revision 1955)
+++ t3lib/class.t3lib_div.php	(Arbeitskopie)
@@ -322,6 +322,25 @@
 	}
 
 	/**
+	 * Writes input value to $_POST
+	 * Usage: 1
+	 *
+	 * @param	array		Array to write to $_POST. Values should NOT be escaped at input time (but will be escaped before writing according to TYPO3 standards).
+	 * @param	string		Alternative key; If set, this will not set the WHOLE POST array, but only the key in it specified by this value!
+	 * @return	void
+	 */
+	function _POSTset($inputPost,$key='')	{
+			// ADDS slashes since TYPO3 standard currently is that slashes MUST be applied (regardless of magic_quotes setting).
+		if (strcmp($key,''))	{
+			if (is_array($inputPost))	{ t3lib_div::addSlashesOnArray($inputPost); } else { $inputPost = addslashes($inputPost); }
+			$GLOBALS['HTTP_POST_VARS'][$key] = $_POST[$key] = $inputPost;
+		} elseif (is_array($inputPost)){
+			t3lib_div::addSlashesOnArray($inputPost);
+			$GLOBALS['HTTP_POST_VARS'] = $_POST = $inputPost;
+		}
+	}
+
+	/**
 	 * GET/POST variable
 	 * Returns the 'GLOBAL' value of incoming data from POST or GET, with priority to POST (that is equalent to 'GP' order)
 	 * Strips slashes of string-outputs, but not arrays UNLESS $strip is set. If $strip is set all output will have escaped characters unescaped.
