Index: Resources/Private/Language/emails.xml
===================================================================
--- Resources/Private/Language/emails.xml	(revision 3068)
+++ Resources/Private/Language/emails.xml	(revision )
@@ -20,25 +20,3 @@
 		</languageKey>
 	</data>
 </T3locallang>
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<T3locallang>
-	<meta type="array">
-		<description>Module labels</description>
-		<type>module</type>
-	</meta>
-	<data type="array">
-		<languageKey index="default" type="array">
-			<label index="subject">TYPO3 Workspace Note: Stage Change for ###ELEMENT_NAME###</label>
-			<label index="message">At the TYPO3 site "###SITE_NAME###" (###SITE_URL###)
-in workspace "###WORKSPACE_TITLE###" (###WORKSPACE_UID###)
-the stage has changed for the element(s) "###RECORD_TITLE###" (###ELEMENT_NAME###) at location "###RECORD_PATH###" in the page tree:
-
-=> ###NEXT_STAGE###
-
-User Comment:
-"###COMMENT###"
-
-State was changed by ###USER_FULLNAME### (username: ###USER_USERNAME###)</label>
-		</languageKey>
-	</data>
-</T3locallang>
Index: class.tx_version_tcemain.php
===================================================================
--- class.tx_version_tcemain.php	(revision 3068)
+++ class.tx_version_tcemain.php	(revision )
@@ -113,7 +113,8 @@
 						$this->version_setStage($table, $elementId, $value['stageId'],
 							(isset($value['comment']) && $value['comment'] ? $value['comment'] : $this->generalComment),
 							TRUE,
-							$tcemainObj
+							$tcemainObj,
+							$value['notificationAlternativeRecipients']
 						);
 					}
 				break;
@@ -130,7 +131,7 @@
 	public function processCmdmap_afterFinish(&$tcemainObj) {
 			// Empty accumulation array:
 		foreach ($this->notificationEmailInfo as $notifItem) {
-			$this->notifyStageChange($notifItem['shared'][0], $notifItem['shared'][1], implode(', ', $notifItem['elements']), 0, $notifItem['shared'][2], $tcemainObj);
+			$this->notifyStageChange($notifItem['shared'][0], $notifItem['shared'][1], implode(', ', $notifItem['elements']), 0, $notifItem['shared'][2], $tcemainObj, $notifItem['alternativeRecipients']);
 		}
 
 			// Reset notification array
@@ -286,94 +287,109 @@
 	 * @param	string		Table name of element (or list of element names if $id is zero)
 	 * @param	integer		Record uid of element (if zero, then $table is used as reference to element(s) alone)
 	 * @param	string		User comment sent along with action
+	 * @param	object		TCEmain object
+	 * @param	string		comma separated list of recipients to notificate instead of be_users selected by sys_workspace, list is generated by workspace extension module
 	 * @return	void
 	 */
-	protected function notifyStageChange($stat, $stageId, $table, $id, $comment, $tcemainObj) {
+	protected function notifyStageChange($stat, $stageId, $table, $id, $comment, $tcemainObj, $notificationAlternativeRecipients = FALSE) {
 		$workspaceRec = t3lib_BEfunc::getRecord('sys_workspace', $stat['uid']);
 			// So, if $id is not set, then $table is taken to be the complete element name!
 		$elementName = $id ? $table . ':' . $id : $table;
 
 		if (is_array($workspaceRec)) {
 
+				 // Get the new stage title from workspaces library, if workspaces extension is installed
+			if (t3lib_extMgm::isLoaded('workspaces')) {
+				$stageService = t3lib_div::makeInstance('Tx_Workspaces_Service_Stages');
+				$newStage = $stageService->getStageTitle((int)$stageId);
+			} else {
-				// TODO: CONSTANTS SHOULD BE USED - tx_service_workspace_workspaces
-				// TODO: use localized labels
-				// Compile label:
-			switch ((int)$stageId) {
-				case 1:
-					$newStage = 'Ready for review';
-				break;
-				case 10:
-					$newStage = 'Ready for publishing';
-				break;
-				case -1:
-					$newStage = 'Element was rejected!';
-				break;
-				case 0:
-					$newStage = 'Rejected element was noticed and edited';
-				break;
-				default:
-					$newStage = 'Unknown state change!?';
-				break;
-			}
+					// TODO: CONSTANTS SHOULD BE USED - tx_service_workspace_workspaces
+					// TODO: use localized labels
+					// Compile label:
+				switch ((int)$stageId) {
+					case 1:
+						$newStage = 'Ready for review';
+					break;
+					case 10:
+						$newStage = 'Ready for publishing';
+					break;
+					case -1:
+						$newStage = 'Element was rejected!';
+					break;
+					case 0:
+						$newStage = 'Rejected element was noticed and edited';
+					break;
+					default:
+						$newStage = 'Unknown state change!?';
+					break;
+				}
+			}
 
+			if ($notificationAlternativeRecipients == false) {
-				// Compile list of recipients:
-			$emails = array();
-			switch((int)$stat['stagechg_notification'])	{
-				case 1:
-					switch((int)$stageId)	{
-						case 1:
-							$emails = $this->getEmailsForStageChangeNotification($workspaceRec['reviewers']);
-						break;
-						case 10:
-							$emails = $this->getEmailsForStageChangeNotification($workspaceRec['adminusers'], TRUE);
-						break;
-						case -1:
+					// Compile list of recipients:
+				$emails = array();
+				switch((int)$stat['stagechg_notification'])	{
+					case 1:
+						switch((int)$stageId)	{
+							case 1:
+								$emails = $this->getEmailsForStageChangeNotification($workspaceRec['reviewers']);
+							break;
+							case 10:
+								$emails = $this->getEmailsForStageChangeNotification($workspaceRec['adminusers'], TRUE);
+							break;
+							case -1:
-#							$emails = $this->getEmailsForStageChangeNotification($workspaceRec['reviewers']);
+#								$emails = $this->getEmailsForStageChangeNotification($workspaceRec['reviewers']);
-#							$emails = array_merge($emails,$this->getEmailsForStageChangeNotification($workspaceRec['members']));
+#								$emails = array_merge($emails,$this->getEmailsForStageChangeNotification($workspaceRec['members']));
 
-								// List of elements to reject:
-							$allElements = explode(',', $elementName);
-								// Traverse them, and find the history of each
-							foreach ($allElements as $elRef) {
-								list($eTable, $eUid) = explode(':', $elRef);
+									// List of elements to reject:
+								$allElements = explode(',', $elementName);
+									// Traverse them, and find the history of each
+								foreach ($allElements as $elRef) {
+									list($eTable, $eUid) = explode(':', $elRef);
 
-								$rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
-										'log_data,tstamp,userid',
-										'sys_log',
-										'action=6 and details_nr=30
-										AND tablename=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($eTable, 'sys_log') . '
-										AND recuid=' . intval($eUid),
-										'',
-										'uid DESC'
-								);
-									// Find all implicated since the last stage-raise from editing to review:
-								foreach ($rows as $dat) {
-									$data = unserialize($dat['log_data']);
+									$rows = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
+											'log_data,tstamp,userid',
+											'sys_log',
+											'action=6 and details_nr=30
+											AND tablename=' . $GLOBALS['TYPO3_DB']->fullQuoteStr($eTable, 'sys_log') . '
+											AND recuid=' . intval($eUid),
+											'',
+											'uid DESC'
+									);
+										// Find all implicated since the last stage-raise from editing to review:
+									foreach ($rows as $dat) {
+										$data = unserialize($dat['log_data']);
 
-									$emails = t3lib_div::array_merge($emails, $this->getEmailsForStageChangeNotification($dat['userid'], TRUE));
+										$emails = t3lib_div::array_merge($emails, $this->getEmailsForStageChangeNotification($dat['userid'], TRUE));
 
-									if ($data['stage'] == 1) {
-										break;
-									}
-								}
-							}
-						break;
+										if ($data['stage'] == 1) {
+											break;
+										}
+									}
+								}
+							break;
 
-						case 0:
-							$emails = $this->getEmailsForStageChangeNotification($workspaceRec['members']);
-						break;
+							case 0:
+								$emails = $this->getEmailsForStageChangeNotification($workspaceRec['members']);
+							break;
 
-						default:
-							$emails = $this->getEmailsForStageChangeNotification($workspaceRec['adminusers'], TRUE);
-						break;
-					}
-				break;
-				case 10:
-					$emails = $this->getEmailsForStageChangeNotification($workspaceRec['adminusers'], TRUE);
-					$emails = t3lib_div::array_merge($emails, $this->getEmailsForStageChangeNotification($workspaceRec['reviewers']));
-					$emails = t3lib_div::array_merge($emails, $this->getEmailsForStageChangeNotification($workspaceRec['members']));
-				break;
-			}
+							default:
+								$emails = $this->getEmailsForStageChangeNotification($workspaceRec['adminusers'], TRUE);
+							break;
+						}
+					break;
+					case 10:
+						$emails = $this->getEmailsForStageChangeNotification($workspaceRec['adminusers'], TRUE);
+						$emails = t3lib_div::array_merge($emails, $this->getEmailsForStageChangeNotification($workspaceRec['reviewers']));
+						$emails = t3lib_div::array_merge($emails, $this->getEmailsForStageChangeNotification($workspaceRec['members']));
+					break;
+				}
+			} else {
+				$emails = array();
+				foreach ($notificationAlternativeRecipients as $emailAddress) {
+					$emails[] = array('email' => $emailAddress);
+				}
+			}
 
 				// prepare and then send the emails
 			if (count($emails)) {
@@ -560,9 +576,11 @@
 	 * @param	integer		Stage ID to set
 	 * @param	string		Comment that goes into log
 	 * @param	boolean		Accumulate state changes in memory for compiled notification email?
+	 * @param	object		TCEmain object
+	 * @param	string		comma separated list of recipients to notificate instead of normal be_users
 	 * @return	void
 	 */
-	protected function version_setStage($table, $id, $stageId, $comment = '', $notificationEmailInfo = FALSE, $tcemainObj) {
+	protected function version_setStage($table, $id, $stageId, $comment = '', $notificationEmailInfo = FALSE, $tcemainObj, $notificationAlternativeRecipients = FALSE) {
 		if ($errorCode = $tcemainObj->BE_USER->workspaceCannotEditOfflineVersion($table, $id)) {
 			$tcemainObj->newlog('Attempt to set stage for record failed: ' . $errorCode, 1);
 		} elseif ($tcemainObj->checkRecordUpdateAccess($table, $id)) {
@@ -585,8 +603,9 @@
 					if ($notificationEmailInfo) {
 						$this->notificationEmailInfo[$stat['uid'] . ':' . $stageId . ':' . $comment]['shared'] = array($stat, $stageId, $comment);
 						$this->notificationEmailInfo[$stat['uid'] . ':' . $stageId . ':' . $comment]['elements'][] = $table . ':' . $id;
+						$this->notificationEmailInfo[$stat['uid'] . ':' . $stageId . ':' . $comment]['alternativeRecipients'] = $notificationAlternativeRecipients;
 					} else {
-						$this->notifyStageChange($stat, $stageId, $table, $id, $comment, $tcemainObj);
+						$this->notifyStageChange($stat, $stageId, $table, $id, $comment, $tcemainObj, $notificationAlternativeRecipients);
 					}
 				}
 			} else $tcemainObj->newlog('The member user tried to set a stage value "' . $stageId . '" that was not allowed', 1);
