diff --git a/admin/inc/class.admin_cmd_edit_group.inc.php b/admin/inc/class.admin_cmd_edit_group.inc.php
index 90824dcf55..bc83c4ec11 100644
--- a/admin/inc/class.admin_cmd_edit_group.inc.php
+++ b/admin/inc/class.admin_cmd_edit_group.inc.php
@@ -132,6 +132,17 @@ class admin_cmd_edit_group extends admin_cmd
 			admin_cmd::display_account($this->account ? $this->account : $this->set['account_lid']));
 	}
 
+	/**
+	 * Return (human readable) labels for keys of changes
+	 *
+	 * Reading them from admin.account template
+	 *
+	 * @return array
+	 */
+	function get_etemplate_name()
+	{
+		return ($GLOBALS['egw_info']['apps']['stylite'] ? 'stylite' : 'groups').'.group.edit';
+	}
 
 	/**
 	 * Return (human readable) labels for keys of changes
@@ -142,23 +153,90 @@ class admin_cmd_edit_group extends admin_cmd
 	 */
 	function get_change_labels()
 	{
-		$labels = $this->change_labels_from_template('stylite.group.edit');
+		$labels = parent::get_change_labels();
 		unset($labels['${row}[run]']);
-		$labels += array(
-			'account_members' => 'Members',
-		);
+
+		$labels['account_members'] = 'Members';
+
 		return $labels;
 	}
+	/**
+	 * Return widget types (indexed by field key) for changes
+	 *
+	 * Used by historylog widget to show the changes the command recorded.
+	 */
+	function get_change_widgets()
+	{
+		$widgets = parent::get_change_widgets();
+
+		$widgets['account_id'] = 'integer';	// normaly not displayed
+		$widgets['run'] = 'select-app';
+
+		return $widgets;
+	}
 
 	/**
-	 * Return list of widgets to use for displaying changes
+	 * Return the whole object-data as array, it's a cast of the object to an array
+	 *
+	 * Reimplement to supress data not relevant for groups, but historically stored
+	 *
+	 * @todo Fix command to store it's data in a more sane way, like we use it.
+	 * @return array
 	 */
-	function get_change_widgets() {
-		$widgets = parent::get_change_widgets();
+	function as_array()
+	{
+		$data = parent::as_array();
 
-		$widgets += array(
-			'account_members' => 'select-account',
-		);
-		return $widgets;
+		// for some reason old is stored under set
+		if (isset($data['set']['old']))
+		{
+			$data['old'] = $data['set']['old'];
+			unset($data['set']['old']);
+		}
+		if (!empty($data['set']['old_run']))
+		{
+			$data['old']['run'] = $data['set']['old_run'];
+			usort($data['old']['run'], function($a, $b)
+			{
+				return strcasecmp(lang($a), lang($b));
+			});
+			unset($data['set']['old_run']);
+		}
+		if (!empty($data['set']['apps']))
+		{
+			$data['set']['run'] = array_diff(array_map(function($data)
+			{
+				return $data['run'] ? $data['appname'] : null;
+			}, $data['set']['apps']), [null]);
+			usort($data['set']['run'], function($a, $b)
+			{
+				return strcasecmp(lang($a), lang($b));
+			});
+			unset($data['set']['apps']);
+		}
+
+		// remove values not relevant to groups
+		foreach(['old', 'set'] as $name)
+		{
+			$data[$name] = array_diff_key($data[$name], array_flip([
+				'account_pwd', 'account_status', 'account_type',
+				'account_expires', 'account_primary_group',
+				'account_lastlogin', 'account_lastloginfrom',
+				'account_lastpwd_change', 'members-active',
+				'account_firstname', 'account_lastname', 'account_fullname',
+			]));
+		}
+
+		// remove unchanged values (null == '' and arrays might not be sorted)
+		foreach($data['set'] as $name => $value)
+		{
+			if ($data['old'][$name] == $value ||
+				is_array($value) && count($value) == count(array_intersect($value, $data['old'][$name])))
+			{
+				unset($data['old'][$name], $data['set'][$name]);
+			}
+		}
+		return $data;
 	}
+
 }