diff -Naur phpgroupware.unpatched/admin/inc/class.uiaclmanager.inc.php phpgroupware/admin/inc/class.uiaclmanager.inc.php
--- phpgroupware.unpatched/admin/inc/class.uiaclmanager.inc.php	2003-11-18 14:22:20.000000000 +0100
+++ phpgroupware/admin/inc/class.uiaclmanager.inc.php	2004-11-12 12:06:41.160525008 +0100
@@ -51,7 +51,7 @@
 		{
 			$this->common_header();
 
-			$GLOBALS['phpgw']->hooks->process('acl_manager',array('preferences'));
+			$GLOBALS['phpgw']->hooks->process('acl_manager',array('admin','preferences'));
 
 			$this->template->set_file(array(
 				'app_list'   => 'acl_applist.tpl'
diff -Naur phpgroupware.unpatched/phpgwapi/inc/class.preferences.inc.php phpgroupware/phpgwapi/inc/class.preferences.inc.php
--- phpgroupware.unpatched/phpgwapi/inc/class.preferences.inc.php	2004-02-10 14:51:18.000000000 +0100
+++ phpgroupware/phpgwapi/inc/class.preferences.inc.php	2004-11-12 12:06:41.164524400 +0100
@@ -201,31 +201,53 @@
 		*/
 		function read_repository()
 		{
-			$this->db->query("SELECT * FROM phpgw_preferences".
-				" WHERE preference_owner IN (-1,-2,".intval($this->account_id).")",__LINE__,__FILE__);
-
-			$this->forced = $this->default = $this->user = array();
-			while($this->db->next_record())
+			if ($GLOBALS['phpgw']->acl->check('session_only_preferences',1,'preferences') && strlen($GLOBALS['phpgw']->session->appsession('session_prefs', 'initiated')))
 			{
-				// The following ereg is required for PostgreSQL to work
-				$app = ereg_replace(' ','',$this->db->f('preference_app'));
-				$value = unserialize($this->db->f('preference_value'));
-				$this->unquote($value);
-				if (!is_array($value))
-				{
-					continue;
+				$this->user = $GLOBALS['phpgw']->session->appsession('session_prefs', 'user');
+				$this->default = $GLOBALS['phpgw']->session->appsession('session_prefs', 'default');
+				$this->forced = $GLOBALS['phpgw']->session->appsession('session_prefs', 'forced');
+				
+				if (!is_array($this->user)) $this->user=array();
+				if (!is_array($this->forced)) $this->forced=array();
+				if (!is_array($this->default)) $this->default=array();
+			}
+			
+			else
+			{
+				$this->db->query("SELECT * FROM phpgw_preferences".
+					" WHERE preference_owner IN (-1,-2,".intval($this->account_id).")",__LINE__,__FILE__);
+	
+				$this->forced = $this->default = $this->user = array();
+				while($this->db->next_record())
+				{
+					// The following ereg is required for PostgreSQL to work
+					$app = ereg_replace(' ','',$this->db->f('preference_app'));
+					$value = unserialize($this->db->f('preference_value'));
+					$this->unquote($value);
+					if (!is_array($value))
+					{
+						continue;
+					}
+					switch($this->db->f('preference_owner'))
+					{
+						case -1:	// forced
+							$this->forced[$app] = $value;
+							break;
+						case -2:	// default
+							$this->default[$app] = $value;
+							break;
+						default:	// user
+							$this->user[$app] = $value;
+							break;
+					}
 				}
-				switch($this->db->f('preference_owner'))
+				
+				if ($GLOBALS['phpgw']->acl->check('session_only_preferences',1,'preferences'))
 				{
-					case -1:	// forced
-						$this->forced[$app] = $value;
-						break;
-					case -2:	// default
-						$this->default[$app] = $value;
-						break;
-					default:	// user
-						$this->user[$app] = $value;
-						break;
+					$GLOBALS['phpgw']->session->appsession('session_prefs', 'initiated', 'yes');
+					$GLOBALS['phpgw']->session->appsession('session_prefs', 'forced', $this->forced);
+					$GLOBALS['phpgw']->session->appsession('session_prefs', 'default', $this->default);
+					$GLOBALS['phpgw']->session->appsession('session_prefs', 'user', $this->user);
 				}
 			}
 			$this->data = $this->user;
@@ -528,6 +550,19 @@
 			}
 			else
 			{
+				switch($type)
+				{
+					case 'forced':
+						$GLOBALS['phpgw']->session->appsession('session_prefs', 'forced', $this->forced);
+						break;
+					case 'default':
+						$GLOBALS['phpgw']->session->appsession('session_prefs', 'default', $this->default);
+						break;
+					default:
+						$GLOBALS['phpgw']->session->appsession('session_prefs', 'user', $this->user);
+						break;
+				}
+				
 				$GLOBALS['phpgw_info']['user']['preferences'] = $this->data;
 				$GLOBALS['phpgw']->session->save_repositories();
 			}
diff -Naur phpgroupware.unpatched/preferences/inc/hook_acl_manager.inc.php phpgroupware/preferences/inc/hook_acl_manager.inc.php
--- phpgroupware.unpatched/preferences/inc/hook_acl_manager.inc.php	1970-01-01 01:00:00.000000000 +0100
+++ phpgroupware/preferences/inc/hook_acl_manager.inc.php	2004-11-09 12:29:17.000000000 +0100
@@ -0,0 +1,20 @@
+<?php
+	/**************************************************************************\
+	* phpGroupWare                                                             *
+	* http://www.phpgroupware.org                                              *
+	* --------------------------------------------                             *
+	*  This program is free software; you can redistribute it and/or modify it *
+	*  under the terms of the GNU General Public License as published by the   *
+	*  Free Software Foundation; either version 2 of the License, or (at your  *
+	*  option) any later version.                                              *
+	\**************************************************************************/
+
+	/* $Id:  $ */
+
+	$GLOBALS['acl_manager']['preferences']['session_only_preferences'] = array(
+		'name' => 'Restrict preferences changes to sessions',
+		'rights' => array(
+			'Restrict preferences changes to sessions' => 1
+ 		)
+ 	);
+
diff -Naur phpgroupware.unpatched/preferences/setup/setup.inc.php phpgroupware/preferences/setup/setup.inc.php
--- phpgroupware.unpatched/preferences/setup/setup.inc.php	2004-03-03 00:17:09.000000000 +0100
+++ phpgroupware/preferences/setup/setup.inc.php	2004-11-12 12:06:41.409487160 +0100
@@ -24,6 +24,7 @@
 	$setup_info['preferences']['hooks'][] = 'manual';
 	$setup_info['preferences']['hooks'][] = 'preferences';
 	$setup_info['preferences']['hooks'][] = 'settings';
+	$setup_info['preferences']['hooks'][] = 'acl_manager';
 
 	/* Dependacies for this app to work */
 	$setup_info['preferences']['depends'][] = array(
