diff --git a/OpenSim/Data/IProfilesData.cs b/OpenSim/Data/IProfilesData.cs
index 0de7f68af9..7fb075d3d5 100644
--- a/OpenSim/Data/IProfilesData.cs
+++ b/OpenSim/Data/IProfilesData.cs
@@ -48,6 +48,8 @@ namespace OpenSim.Data
         bool UpdateAvatarProperties(ref UserProfileProperties props, ref string result);
         bool UpdateAvatarInterests(UserProfileProperties up, ref string result);
         bool GetClassifiedInfo(ref UserClassifiedAdd ad, ref string result);
+        bool UpdateUserPreferences(ref UserPreferences pref,  ref string result);
+        bool GetUserPreferences(ref UserPreferences pref, ref string result);
         bool GetUserAppData(ref UserAppData props, ref string result);
         bool SetUserAppData(UserAppData props, ref string result);
         OSDArray GetUserImageAssets(UUID avatarId);
diff --git a/OpenSim/Data/MySQL/MySQLUserProfilesData.cs b/OpenSim/Data/MySQL/MySQLUserProfilesData.cs
index 4c6c8e3aa2..dca80c30aa 100644
--- a/OpenSim/Data/MySQL/MySQLUserProfilesData.cs
+++ b/OpenSim/Data/MySQL/MySQLUserProfilesData.cs
@@ -897,7 +897,7 @@ namespace OpenSim.Data.MySQL
         }
         
         #region User Preferences
-        public OSDArray GetUserPreferences(UUID avatarId)
+        public bool GetUserPreferences(ref UserPreferences pref, ref string result)
         {
             string query = string.Empty;
             
@@ -914,19 +914,16 @@ namespace OpenSim.Data.MySQL
                     dbcon.Open();
                     using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
                     {
-                        cmd.Parameters.AddWithValue("?Id", avatarId.ToString());
+                        cmd.Parameters.AddWithValue("?Id", pref.UserId.ToString());
                         
                         using (MySqlDataReader reader = cmd.ExecuteReader())
                         {
                             if(reader.HasRows)
                             {
                                 reader.Read();
-                                OSDMap record = new OSDMap();
-                                
-                                record.Add("imviaemail",OSD.FromString((string)reader["imviaemail"]));
-                                record.Add("visible",OSD.FromString((string)reader["visible"]));
-                                record.Add("email",OSD.FromString((string)reader["email"]));
-                                data.Add(record);
+                                bool.TryParse((string)reader["imviaemail"], out pref.IMViaEmail);
+                                bool.TryParse((string)reader["visible"], out pref.Visible);
+                                pref.EMail = (string)reader["email"];
                             }
                             else
                             {
@@ -949,17 +946,19 @@ namespace OpenSim.Data.MySQL
             {
                 m_log.DebugFormat("[PROFILES_DATA]" +
                                  ": Get preferences exception {0}", e.Message);
+                result = e.Message;
+                return false;
             }
-            return data;
+            return true;
         }
         
-        public bool UpdateUserPreferences(bool emailIm, bool visible, UUID avatarId )
+        public bool UpdateUserPreferences(ref UserPreferences pref, ref string result)
         {           
             string query = string.Empty;
-            
-            query += "UPDATE userpsettings SET ";
+
+            query += "UPDATE usersettings SET ";
             query += "imviaemail=?ImViaEmail, ";
-            query += "visible=?Visible,";
+            query += "visible=?Visible ";
             query += "WHERE useruuid=?uuid";
             
             try
@@ -969,14 +968,11 @@ namespace OpenSim.Data.MySQL
                     dbcon.Open();
                     using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
                     {
-                        cmd.Parameters.AddWithValue("?ImViaEmail", emailIm.ToString().ToLower ());
-                        cmd.Parameters.AddWithValue("?WantText", visible.ToString().ToLower ());
-                        cmd.Parameters.AddWithValue("?uuid", avatarId.ToString());
-                        
-                        lock(Lock)
-                        {
-                            cmd.ExecuteNonQuery();
-                        }
+                        cmd.Parameters.AddWithValue("?ImViaEmail", pref.IMViaEmail);
+                        cmd.Parameters.AddWithValue("?Visible", pref.Visible);
+                        cmd.Parameters.AddWithValue("?uuid", pref.UserId.ToString());
+
+                        cmd.ExecuteNonQuery();
                     }
                 }
             }
@@ -984,6 +980,7 @@ namespace OpenSim.Data.MySQL
             {
                 m_log.DebugFormat("[PROFILES_DATA]" +
                                  ": AgentInterestsUpdate exception {0}", e.Message);
+                result = e.Message;
                 return false;
             }
             return true;
diff --git a/OpenSim/Data/MySQL/Resources/UserProfiles.migrations b/OpenSim/Data/MySQL/Resources/UserProfiles.migrations
index c29f1abf3e..bd325da1f0 100644
--- a/OpenSim/Data/MySQL/Resources/UserProfiles.migrations
+++ b/OpenSim/Data/MySQL/Resources/UserProfiles.migrations
@@ -81,3 +81,13 @@ CREATE TABLE IF NOT EXISTS `userdata` (
 
 commit;
 
+:VERSION 3         # -------------------------------
+begin;
+CREATE TABLE IF NOT EXISTS `usersettings` (
+  `useruuid` varchar(36) NOT NULL,
+  `imviaemail` enum('true','false') NOT NULL,
+  `visible` enum('true','false') NOT NULL,
+  `email` varchar(254) NOT NULL,
+  PRIMARY KEY (`useruuid`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+commit;
\ No newline at end of file
diff --git a/OpenSim/Data/SQLite/Resources/UserProfiles.migrations b/OpenSim/Data/SQLite/Resources/UserProfiles.migrations
index 16581f6e49..86434e8170 100644
--- a/OpenSim/Data/SQLite/Resources/UserProfiles.migrations
+++ b/OpenSim/Data/SQLite/Resources/UserProfiles.migrations
@@ -88,3 +88,15 @@ CREATE TABLE IF NOT EXISTS userdata (
 
 commit;
 
+
+:VERSION 3         # -------------------------------
+ 
+begin;
+CREATE TABLE IF NOT EXISTS usersettings (
+  useruuid char(36) NOT NULL,
+  imviaemail binary(1) NOT NULL,
+  visible binary(1) NOT NULL,
+  email varchar(254) NOT NULL,
+  PRIMARY KEY (useruuid)
+)
+commit;
\ No newline at end of file
diff --git a/OpenSim/Data/SQLite/SQLiteUserProfilesData.cs b/OpenSim/Data/SQLite/SQLiteUserProfilesData.cs
index cc1dac1c92..70ce07c261 100644
--- a/OpenSim/Data/SQLite/SQLiteUserProfilesData.cs
+++ b/OpenSim/Data/SQLite/SQLiteUserProfilesData.cs
@@ -749,6 +749,89 @@ namespace OpenSim.Data.SQLite
             }
             return true;
         }
+
+        public bool UpdateUserPreferences(ref UserPreferences pref, ref string result)
+        {           
+            string query = string.Empty;
+            
+            query += "UPDATE usersettings SET ";
+            query += "imviaemail=:ImViaEmail, ";
+            query += "visible=:Visible ";
+            query += "WHERE useruuid=:uuid";
+            
+            try
+            {
+                using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
+                {
+                    cmd.CommandText = query;
+                    cmd.Parameters.AddWithValue(":ImViaEmail", pref.IMViaEmail);
+                    cmd.Parameters.AddWithValue(":Visible", pref.Visible);
+                    cmd.Parameters.AddWithValue(":uuid", pref.UserId.ToString());
+                        
+                    cmd.ExecuteNonQuery();
+                }
+            }
+            catch (Exception e)
+            {
+                m_log.DebugFormat("[PROFILES_DATA]" +
+                                  ": AgentInterestsUpdate exception {0}", e.Message);
+                result = e.Message;
+                return false;
+            }
+            return true;
+        }
+
+        public bool GetUserPreferences(ref UserPreferences pref, ref string result)
+        {
+            IDataReader reader = null;
+            string query = string.Empty;
+            
+            query += "SELECT imviaemail,visible,email FROM ";
+            query += "usersettings WHERE ";
+            query += "useruuid = :Id";
+            
+            OSDArray data = new OSDArray();
+            
+            try
+            {
+                using (SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand())
+                {
+                    cmd.CommandText = query;
+                    cmd.Parameters.AddWithValue("?Id", pref.UserId.ToString());
+                        
+                    using (reader = cmd.ExecuteReader(CommandBehavior.SingleRow))
+                    {
+                        if(reader.Read())
+                        {
+                            bool.TryParse((string)reader["imviaemail"], out pref.IMViaEmail);
+                            bool.TryParse((string)reader["visible"], out pref.Visible);
+                            pref.EMail = (string)reader["email"];
+                         }
+                         else
+                         {
+                            query = "INSERT INTO usersettings VALUES ";
+                            query += "(:Id,'false','false', '')";
+                            
+                            using (SqliteCommand put = (SqliteCommand)m_connection.CreateCommand())
+                            {
+                                put.Parameters.AddWithValue(":Id", pref.UserId.ToString());
+                                put.ExecuteNonQuery();
+                                    
+                            }
+                        }
+                    }
+                }
+            }
+            catch (Exception e)
+            {
+                m_log.DebugFormat("[PROFILES_DATA]" +
+                                  ": Get preferences exception {0}", e.Message);
+                result = e.Message;
+                return false;
+            }
+            return true;
+        }
+
         public bool GetUserAppData(ref UserAppData props, ref string result)
         {
             IDataReader reader = null;
diff --git a/OpenSim/Framework/UserProfiles.cs b/OpenSim/Framework/UserProfiles.cs
index 61335917e1..492f6b9bd1 100644
--- a/OpenSim/Framework/UserProfiles.cs
+++ b/OpenSim/Framework/UserProfiles.cs
@@ -90,6 +90,14 @@ namespace OpenSim.Framework
         public UUID TargetId;
         public string Notes;
     }
+
+    public class UserPreferences
+    {
+        public UUID UserId;
+        public bool IMViaEmail = false;
+        public bool Visible = false;
+        public string EMail = string.Empty;
+    }
     
     public class UserAccountProperties
     {
diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs
index 966a05c052..697a73eaa1 100644
--- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs
@@ -270,6 +270,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles
             // Notes
             client.AddGenericPacketHandler("avatarnotesrequest", NotesRequest);
             client.OnAvatarNotesUpdate += NotesUpdate;
+
+            // Preferences
+            client.OnUserInfoRequest += UserPreferencesRequest;
+            client.OnUpdateUserInfo += UpdateUserPreferences;
         }
         #endregion Region Event Handlers
 
@@ -802,6 +806,69 @@ namespace OpenSim.Region.OptionalModules.Avatar.UserProfiles
         }
         #endregion Notes
 
+        #region User Preferences
+        /// 
+        /// Updates the user preferences.
+        /// 
+        /// 
+        /// Im via email.
+        /// 
+        /// 
+        /// Visible.
+        /// 
+        /// 
+        /// Remote client.
+        /// 
+        public void UpdateUserPreferences(bool imViaEmail, bool visible, IClientAPI remoteClient)
+        {
+            UserPreferences pref = new UserPreferences();
+
+            pref.UserId = remoteClient.AgentId;
+            pref.IMViaEmail = imViaEmail;
+            pref.Visible = visible;
+
+            string serverURI = string.Empty;
+            bool foreign = GetUserProfileServerURI(remoteClient.AgentId, out serverURI);
+
+            object Pref = pref;
+            if(!JsonRpcRequest(ref Pref, "user_preferences_update", serverURI, UUID.Random().ToString()))
+            {
+                m_log.InfoFormat("[PROFILES]: UserPreferences update error");
+                remoteClient.SendAgentAlertMessage("Error updating preferences", false);
+                return;   
+            }
+        }
+        
+        /// 
+        /// Users the preferences request.
+        /// 
+        /// 
+        /// Remote client.
+        /// 
+        public void UserPreferencesRequest(IClientAPI remoteClient)
+        {
+            UserPreferences pref = new UserPreferences();
+
+            pref.UserId = remoteClient.AgentId;
+
+            string serverURI = string.Empty;
+            bool foreign = GetUserProfileServerURI(remoteClient.AgentId, out serverURI);
+
+
+            object Pref = (object)pref;
+            if(!JsonRpcRequest(ref Pref, "user_preferences_request", serverURI, UUID.Random().ToString()))
+            {
+                m_log.InfoFormat("[PROFILES]: UserPreferences request error");
+                remoteClient.SendAgentAlertMessage("Error requesting preferences", false);
+                return;
+            }
+            pref = (UserPreferences) Pref;
+
+            remoteClient.SendUserInfoReply(pref.IMViaEmail, pref.Visible, pref.EMail);
+       
+        }
+        #endregion User Preferences
+
         #region Avatar Properties
         /// 
         /// Update the avatars interests .
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/UserProfiles/LocalUserProfilesServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/UserProfiles/LocalUserProfilesServiceConnector.cs
index 323535ab07..4701ee653f 100644
--- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/UserProfiles/LocalUserProfilesServiceConnector.cs
+++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/UserProfiles/LocalUserProfilesServiceConnector.cs
@@ -153,6 +153,8 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Profile
             Server.AddJsonRPCHandler("avatar_properties_request", handler.AvatarPropertiesRequest);
             Server.AddJsonRPCHandler("avatar_properties_update", handler.AvatarPropertiesUpdate);
             Server.AddJsonRPCHandler("avatar_interests_update", handler.AvatarInterestsUpdate);
+            Server.AddJsonRPCHandler("user_preferences_update", handler.UserPreferenecesUpdate);
+            Server.AddJsonRPCHandler("user_preferences_request", handler.UserPreferencesRequest);
             Server.AddJsonRPCHandler("image_assets_request", handler.AvatarImageAssetsRequest);
             Server.AddJsonRPCHandler("user_data_request", handler.RequestUserAppData);
             Server.AddJsonRPCHandler("user_data_update", handler.UpdateUserAppData);
diff --git a/OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs b/OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs
index 28dbbc2e13..640388200d 100644
--- a/OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs
+++ b/OpenSim/Server/Handlers/Profiles/UserProfilesConnector.cs
@@ -104,6 +104,8 @@ namespace OpenSim.Server.Handlers.Profiles
             Server.AddJsonRPCHandler("avatar_properties_request", handler.AvatarPropertiesRequest);
             Server.AddJsonRPCHandler("avatar_properties_update", handler.AvatarPropertiesUpdate);
             Server.AddJsonRPCHandler("avatar_interests_update", handler.AvatarInterestsUpdate);
+            Server.AddJsonRPCHandler("user_preferences_update", handler.UserPreferenecesUpdate);
+            Server.AddJsonRPCHandler("user_preferences_request", handler.UserPreferencesRequest);
             Server.AddJsonRPCHandler("image_assets_request", handler.AvatarImageAssetsRequest);
             Server.AddJsonRPCHandler("user_data_request", handler.RequestUserAppData);
             Server.AddJsonRPCHandler("user_data_update", handler.UpdateUserAppData);
diff --git a/OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs b/OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs
index f5f0794653..d30cc228b0 100644
--- a/OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs
+++ b/OpenSim/Server/Handlers/Profiles/UserProfilesHandlers.cs
@@ -381,6 +381,59 @@ namespace OpenSim.Server.Handlers
         }
         #endregion Interests
 
+        #region User Preferences
+        public bool UserPreferencesRequest(OSDMap json, ref JsonRpcResponse response)
+        {
+            if(!json.ContainsKey("params"))
+            {
+                response.Error.Code = ErrorCode.ParseError;
+                m_log.DebugFormat ("User Preferences Request");
+                return false;
+            }
+
+            string result = string.Empty;
+            UserPreferences prefs = new UserPreferences();
+            object Prefs = (object)prefs;
+            OSD.DeserializeMembers(ref Prefs, (OSDMap)json["params"]);
+            if(Service.UserPreferencesRequest(ref prefs, ref result))
+            {
+                response.Result = OSD.SerializeMembers(prefs);
+                return true;
+            }
+            
+            response.Error.Code = ErrorCode.InternalError;
+            response.Error.Message = string.Format("{0}", result);
+            m_log.InfoFormat("[PROFILES]: User preferences request error - {0}", response.Error.Message);
+            return false;
+        }
+
+        public bool UserPreferenecesUpdate(OSDMap json, ref JsonRpcResponse response)
+        {
+            if(!json.ContainsKey("params"))
+            {
+                response.Error.Code = ErrorCode.ParseError;
+                response.Error.Message = "no parameters supplied";
+                m_log.DebugFormat ("User Preferences Update Request");
+                return false;
+            }
+            
+            string result = string.Empty;
+            UserPreferences prefs = new UserPreferences();
+            object Prefs = (object)prefs;
+            OSD.DeserializeMembers(ref Prefs, (OSDMap)json["params"]);
+            if(Service.UserPreferencesUpdate(ref prefs, ref result))
+            {
+                response.Result = OSD.SerializeMembers(prefs);
+                return true;
+            }
+            
+            response.Error.Code = ErrorCode.InternalError;
+            response.Error.Message = string.Format("{0}", result);
+            m_log.InfoFormat("[PROFILES]: User preferences update error - {0}", response.Error.Message);
+            return false;
+        }
+        #endregion User Preferences
+
         #region Utility
         public bool AvatarImageAssetsRequest(OSDMap json, ref JsonRpcResponse response)
         {
diff --git a/OpenSim/Services/Interfaces/IUserProfilesService.cs b/OpenSim/Services/Interfaces/IUserProfilesService.cs
index 319d3075dd..121baa8b1f 100644
--- a/OpenSim/Services/Interfaces/IUserProfilesService.cs
+++ b/OpenSim/Services/Interfaces/IUserProfilesService.cs
@@ -57,6 +57,11 @@ namespace OpenSim.Services.Interfaces
         bool AvatarPropertiesRequest(ref UserProfileProperties prop, ref string result);
         bool AvatarPropertiesUpdate(ref UserProfileProperties prop, ref string result);
         #endregion Profile Properties
+
+        #region User Preferences
+        bool UserPreferencesRequest(ref UserPreferences pref, ref string result);
+        bool UserPreferencesUpdate(ref UserPreferences pref, ref string result);
+        #endregion User Preferences
         
         #region Interests
         bool AvatarInterestsUpdate(UserProfileProperties prop, ref string result);
diff --git a/OpenSim/Services/UserProfilesService/UserProfilesService.cs b/OpenSim/Services/UserProfilesService/UserProfilesService.cs
index d00f34d650..69c7b91957 100644
--- a/OpenSim/Services/UserProfilesService/UserProfilesService.cs
+++ b/OpenSim/Services/UserProfilesService/UserProfilesService.cs
@@ -163,6 +163,18 @@ namespace OpenSim.Services.ProfilesService
         }
         #endregion Interests
 
+        #region User Preferences
+        public bool UserPreferencesUpdate(ref UserPreferences pref, ref string result)
+        {
+            return ProfilesData.UpdateUserPreferences(ref pref, ref result);
+        }
+
+        public bool UserPreferencesRequest(ref UserPreferences pref, ref string result)
+        {
+            return ProfilesData.GetUserPreferences(ref pref, ref result);
+        }
+        #endregion User Preferences
+
         #region Utility
         public OSD AvatarImageAssetsRequest(UUID avatarId)
         {