diff --git a/res/layout/bluetooth_pb_access.xml b/res/layout/bluetooth_access.xml
similarity index 92%
rename from res/layout/bluetooth_pb_access.xml
rename to res/layout/bluetooth_access.xml
index 01218d6..3bfb689 100644
--- a/res/layout/bluetooth_pb_access.xml
+++ b/res/layout/bluetooth_access.xml
@@ -36,12 +36,12 @@
             android:gravity="center_horizontal"
             android:textAppearance="?android:attr/textAppearanceMedium" />
 
-        <CheckBox android:id="@+id/bluetooth_pb_remember_choice"
+        <CheckBox android:id="@+id/bluetooth_remember_choice"
             style="?android:attr/textAppearanceMedium"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginTop="2dip"
-            android:text="@string/bluetooth_pb_remember_choice" />
+            android:text="@string/bluetooth_remember_choice" />
 
     </LinearLayout>
 
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 01011bb..812b491 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -355,8 +355,19 @@
     <string name="bluetooth_pb_acceptance_dialog_text">%1$s wants to access your contacts and call history. Give access to %2$s?</string>
 
     <!-- Bluetooth phone book permission Alert Activity checkbox text [CHAR LIMIT=none] -->
+    <string name="bluetooth_remember_choice">Don\'t ask again</string>
+    <!--FIXME SHOULD BE REMOVED AND ALL LANG VERSIONS FIXED TO ABOVE NAME -->
     <string name="bluetooth_pb_remember_choice">Don\'t ask again</string>
 
+    <!-- Activity label of BluetoothMessagePermissionActivity, also used as Strings in the permission dialog [CHAR LIMIT=none] -->
+    <string name="bluetooth_map_request">"Message request"</string>
+
+    <!-- Bluetooth message permission Alert Activity text [CHAR LIMIT=none] -->
+    <string name="bluetooth_map_acceptance_dialog_text">%1$s wants to access your messages. Give access to %2$s?</string>
+
+
+
+
     <!-- Date & time settings screen title -->
     <string name="date_and_time">Date &amp; time settings</string>
     <!-- The title of the activity to pick a time zone. -->
diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java b/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java
index 16476fa..aac1d4e 100755
--- a/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java
+++ b/src/com/android/settings/bluetooth/BluetoothPermissionActivity.java
@@ -58,7 +58,7 @@
 
     private CheckBox mRememberChoice;
     private boolean mRememberChoiceValue = false;
-
+    private int mRequestType = 0;
     private BroadcastReceiver mReceiver = new BroadcastReceiver() {
         @Override
         public void onReceive(Context context, Intent intent) {
@@ -91,15 +91,18 @@
         mDevice = i.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
         mReturnPackage = i.getStringExtra(BluetoothDevice.EXTRA_PACKAGE_NAME);
         mReturnClass = i.getStringExtra(BluetoothDevice.EXTRA_CLASS_NAME);
-        int requestType = i.getIntExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE,
+        mRequestType = i.getIntExtra(BluetoothDevice.EXTRA_ACCESS_REQUEST_TYPE,
                                      BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS);
 
-        if (requestType == BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION) {
-            showConnectionDialog();
-        } else if (requestType == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS) {
-            showPhonebookDialog();
-        } else {
-            Log.e(TAG, "Error: bad request type: " + requestType);
+        if (mRequestType == BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION) {
+            showDialog(getString(R.string.bluetooth_connection_permission_request), mRequestType);
+        } else if (mRequestType == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS) {
+            showDialog(getString(R.string.bluetooth_phonebook_request), mRequestType);
+        } else if (mRequestType == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS) {
+            showDialog(getString(R.string.bluetooth_map_request), mRequestType);
+        }
+        else {
+            Log.e(TAG, "Error: bad request type: " + mRequestType);
             finish();
             return;
         }
@@ -108,62 +111,57 @@
         mReceiverRegistered = true;
     }
 
-    private void showConnectionDialog() {
+
+    private void showDialog(String title, int requestType)
+    {
         final AlertController.AlertParams p = mAlertParams;
         p.mIconId = android.R.drawable.ic_dialog_info;
-        p.mTitle = getString(R.string.bluetooth_connection_permission_request);
-        p.mView = createConnectionDialogView();
+        p.mTitle = title;
+        switch(requestType)
+        {
+        case BluetoothDevice.REQUEST_TYPE_PROFILE_CONNECTION:
+            p.mView = createConnectionDialogView();
+            break;
+        case BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS:
+            p.mView = createPhonebookDialogView();
+            break;
+        case BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS:
+            p.mView = createMapDialogView();
+            break;
+        }
         p.mPositiveButtonText = getString(R.string.yes);
         p.mPositiveButtonListener = this;
         p.mNegativeButtonText = getString(R.string.no);
         p.mNegativeButtonListener = this;
         mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
         setupAlert();
+
     }
 
-    private void showPhonebookDialog() {
-        final AlertController.AlertParams p = mAlertParams;
-        p.mIconId = android.R.drawable.ic_dialog_info;
-        p.mTitle = getString(R.string.bluetooth_phonebook_request);
-        p.mView = createPhonebookDialogView();
-        p.mPositiveButtonText = getString(android.R.string.yes);
-        p.mPositiveButtonListener = this;
-        p.mNegativeButtonText = getString(android.R.string.no);
-        p.mNegativeButtonListener = this;
-        mOkButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE);
-        setupAlert();
-    }
-
-    private String createConnectionDisplayText() {
-        String mRemoteName = mDevice != null ? mDevice.getAliasName() : null;
-
-        if (mRemoteName == null) mRemoteName = getString(R.string.unknown);
-        String mMessage1 = getString(R.string.bluetooth_connection_dialog_text,
-                mRemoteName);
+    private String createDisplayText(String message) {
+        String mMessage1 = message;
         return mMessage1;
     }
 
-    private String createPhonebookDisplayText() {
+    private String createRemoteName()
+    {
         String mRemoteName = mDevice != null ? mDevice.getAliasName() : null;
-
         if (mRemoteName == null) mRemoteName = getString(R.string.unknown);
-        String mMessage1 = getString(R.string.bluetooth_pb_acceptance_dialog_text,
-                                     mRemoteName, mRemoteName);
-        return mMessage1;
+        return mRemoteName;
     }
 
     private View createConnectionDialogView() {
+        String mRemoteName = createRemoteName();
         mView = getLayoutInflater().inflate(R.layout.bluetooth_connection_access, null);
         messageView = (TextView)mView.findViewById(R.id.message);
-        messageView.setText(createConnectionDisplayText());
+        messageView.setText(createDisplayText(getString(R.string.bluetooth_connection_dialog_text,
+                mRemoteName)));
         return mView;
     }
 
-    private View createPhonebookDialogView() {
-        mView = getLayoutInflater().inflate(R.layout.bluetooth_pb_access, null);
-        messageView = (TextView)mView.findViewById(R.id.message);
-        messageView.setText(createPhonebookDisplayText());
-        mRememberChoice = (CheckBox)mView.findViewById(R.id.bluetooth_pb_remember_choice);
+    private void createCheckbox(int viewId)
+    {
+        mRememberChoice = (CheckBox)mView.findViewById(viewId);
         mRememberChoice.setChecked(false);
         mRememberChoice.setOnCheckedChangeListener(new OnCheckedChangeListener() {
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
@@ -174,26 +172,42 @@
                 }
             }
             });
+    }
+    private View createPhonebookDialogView() {
+        String mRemoteName = createRemoteName();
+        mView = getLayoutInflater().inflate(R.layout.bluetooth_access, null);
+        messageView = (TextView)mView.findViewById(R.id.message);
+        messageView.setText(createDisplayText(getString(R.string.bluetooth_pb_acceptance_dialog_text,
+                mRemoteName, mRemoteName)));
+        createCheckbox(R.id.bluetooth_remember_choice);
+        return mView;
+    }
+    private View createMapDialogView() {
+        String mRemoteName = createRemoteName();
+        mView = getLayoutInflater().inflate(R.layout.bluetooth_access, null);
+        messageView = (TextView)mView.findViewById(R.id.message);
+        messageView.setText(createDisplayText(getString(R.string.bluetooth_map_acceptance_dialog_text,
+                mRemoteName, mRemoteName)));
+        createCheckbox(R.id.bluetooth_remember_choice);
         return mView;
     }
 
     private void onPositive() {
         if (DEBUG) Log.d(TAG, "onPositive mRememberChoiceValue: " + mRememberChoiceValue);
+        if (mRememberChoiceValue)
+            savePermissionChoice(mRequestType, CachedBluetoothDevice.ACCESS_ALLOWED);
 
-        if (mRememberChoiceValue) {
-            savePhonebookPermissionChoice(CachedBluetoothDevice.PHONEBOOK_ACCESS_ALLOWED);
-        }
         sendIntentToReceiver(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY, true,
-                             BluetoothDevice.EXTRA_ALWAYS_ALLOWED, mRememberChoiceValue);
+                            BluetoothDevice.EXTRA_ALWAYS_ALLOWED, mRememberChoiceValue);
         finish();
     }
 
     private void onNegative() {
         if (DEBUG) Log.d(TAG, "onNegative mRememberChoiceValue: " + mRememberChoiceValue);
 
-        if (mRememberChoiceValue) {
-            savePhonebookPermissionChoice(CachedBluetoothDevice.PHONEBOOK_ACCESS_REJECTED);
-        }
+        if (mRememberChoiceValue)
+            savePermissionChoice(mRequestType, CachedBluetoothDevice.ACCESS_REJECTED);
+
         sendIntentToReceiver(BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY, false,
                              null, false // dummy value, no effect since last param is null
                              );
@@ -246,18 +260,23 @@
         return true;
     }
 
-    private void savePhonebookPermissionChoice(int permissionChoice) {
+    private void savePermissionChoice(int permissionType, int permissionChoice) {
         LocalBluetoothManager bluetoothManager = LocalBluetoothManager.getInstance(this);
         CachedBluetoothDeviceManager cachedDeviceManager =
             bluetoothManager.getCachedDeviceManager();
         CachedBluetoothDevice cachedDevice = cachedDeviceManager.findDevice(mDevice);
-        if (cachedDevice != null ) {
-            cachedDevice.setPhonebookPermissionChoice(permissionChoice);
-        } else {
+        if (DEBUG) Log.d(TAG, "savePermissionChoice permissionType: " + permissionType);
+        if (cachedDevice == null ) {
             cachedDevice = cachedDeviceManager.addDevice(bluetoothManager.getBluetoothAdapter(),
                                                          bluetoothManager.getProfileManager(),
                                                          mDevice);
-            cachedDevice.setPhonebookPermissionChoice(permissionChoice);
         }
+        if (permissionType == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS){
+            cachedDevice.setPhonebookPermissionChoice(permissionChoice);
+        }else if (permissionType == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS){
+            cachedDevice.setMessagePermissionChoice(permissionChoice);
+        }
+
     }
+
 }
diff --git a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
index e2231bb..343018e 100644
--- a/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPermissionRequest.java
@@ -128,8 +128,10 @@
     private boolean checkUserChoice() {
         boolean processed = false;
 
-        // we only remember PHONEBOOK permission
-        if (mRequestType != BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS) {
+        // ignore if it is something else than phonebook/message settings it wants us to remember
+        if (mRequestType != BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS
+                && mRequestType != BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS) {
+            if (DEBUG) Log.d(TAG, "Unknown RequestType: " + mRequestType);
             return processed;
         }
 
@@ -143,23 +145,45 @@
                 bluetoothManager.getProfileManager(), mDevice);
         }
 
-        int phonebookPermission = cachedDevice.getPhonebookPermissionChoice();
+        if(mRequestType == BluetoothDevice.REQUEST_TYPE_PHONEBOOK_ACCESS) {
 
-        if (phonebookPermission == CachedBluetoothDevice.PHONEBOOK_ACCESS_UNKNOWN) {
-            return processed;
-        }
+            int phonebookPermission = cachedDevice.getPhonebookPermissionChoice();
 
-        String intentName = BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY;
-        if (phonebookPermission == CachedBluetoothDevice.PHONEBOOK_ACCESS_ALLOWED) {
-            sendIntentToReceiver(intentName, true, BluetoothDevice.EXTRA_ALWAYS_ALLOWED, true);
-            processed = true;
-        } else if (phonebookPermission == CachedBluetoothDevice.PHONEBOOK_ACCESS_REJECTED) {
-            sendIntentToReceiver(intentName, false,
-                                 null, false // dummy value, no effect since previous param is null
-                                 );
-            processed = true;
-        } else {
-            Log.e(TAG, "Bad phonebookPermission: " + phonebookPermission);
+            if (phonebookPermission == CachedBluetoothDevice.ACCESS_UNKNOWN) {
+                return processed;
+            }
+
+            String intentName = BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY;
+            if (phonebookPermission == CachedBluetoothDevice.ACCESS_ALLOWED) {
+                sendIntentToReceiver(intentName, true, BluetoothDevice.EXTRA_ALWAYS_ALLOWED, true);
+                processed = true;
+            } else if (phonebookPermission == CachedBluetoothDevice.ACCESS_REJECTED) {
+                sendIntentToReceiver(intentName, false,
+                                     null, false ); // dummy value, no effect since previous param is null
+                processed = true;
+            } else {
+                Log.e(TAG, "Bad phonebookPermission: " + phonebookPermission);
+            }
+
+        } else if(mRequestType == BluetoothDevice.REQUEST_TYPE_MESSAGE_ACCESS) {
+
+            int messagePermission = cachedDevice.getMessagePermissionChoice();
+
+            if (messagePermission == CachedBluetoothDevice.ACCESS_UNKNOWN) {
+                return processed;
+            }
+
+            String intentName = BluetoothDevice.ACTION_CONNECTION_ACCESS_REPLY;
+            if (messagePermission == CachedBluetoothDevice.ACCESS_ALLOWED) {
+                sendIntentToReceiver(intentName, true, BluetoothDevice.EXTRA_ALWAYS_ALLOWED, true);
+                processed = true;
+            } else if (messagePermission == CachedBluetoothDevice.ACCESS_REJECTED) {
+                sendIntentToReceiver(intentName, false,
+                                     null, false); // dummy value, no effect since previous param is null
+                processed = true;
+            } else {
+                Log.e(TAG, "Bad messagePermission: " + messagePermission);
+            }
         }
         return processed;
     }
diff --git a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
index 4b19b9c..9742027 100755
--- a/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
+++ b/src/com/android/settings/bluetooth/CachedBluetoothDevice.java
@@ -66,17 +66,22 @@
 
     private int mPhonebookPermissionChoice;
 
+    private int mMessagePermissionChoice;
+
+
     private final Collection<Callback> mCallbacks = new ArrayList<Callback>();
 
-    // Following constants indicate the user's choices of Phone book access settings
+    // Following constants indicate the user's choices of Phone book/message access settings
     // User hasn't made any choice or settings app has wiped out the memory
-    final static int PHONEBOOK_ACCESS_UNKNOWN = 0;
+    final static int ACCESS_UNKNOWN = 0;
     // User has accepted the connection and let Settings app remember the decision
-    final static int PHONEBOOK_ACCESS_ALLOWED = 1;
+    final static int ACCESS_ALLOWED = 1;
     // User has rejected the connection and let Settings app remember the decision
-    final static int PHONEBOOK_ACCESS_REJECTED = 2;
+    final static int ACCESS_REJECTED = 2;
+
 
     private final static String PHONEBOOK_PREFS_NAME = "bluetooth_phonebook_permission";
+    private final static String MESSAGE_PREFS_NAME = "bluetooth_message_permission";
 
     /**
      * When we connect to multiple profiles, we only want to display a single
@@ -349,6 +354,7 @@
         fetchBtClass();
         updateProfiles();
         fetchPhonebookPermissionChoice();
+        fetchMessagePermissionChoice();
 
         mVisible = false;
         dispatchAttributesChanged();
@@ -513,7 +519,8 @@
         if (bondState == BluetoothDevice.BOND_NONE) {
             mProfiles.clear();
             mConnectAfterPairing = false;  // cancel auto-connect
-            setPhonebookPermissionChoice(PHONEBOOK_ACCESS_UNKNOWN);
+            setPhonebookPermissionChoice(ACCESS_UNKNOWN);
+            setMessagePermissionChoice(ACCESS_UNKNOWN);
         }
 
         refresh();
@@ -632,7 +639,7 @@
     void setPhonebookPermissionChoice(int permissionChoice) {
         SharedPreferences.Editor editor =
             mContext.getSharedPreferences(PHONEBOOK_PREFS_NAME, Context.MODE_PRIVATE).edit();
-        if (permissionChoice == PHONEBOOK_ACCESS_UNKNOWN) {
+        if (permissionChoice == ACCESS_UNKNOWN) {
             editor.remove(mDevice.getAddress());
         } else {
             editor.putInt(mDevice.getAddress(), permissionChoice);
@@ -645,7 +652,31 @@
         SharedPreferences preference = mContext.getSharedPreferences(PHONEBOOK_PREFS_NAME,
                                                                      Context.MODE_PRIVATE);
         mPhonebookPermissionChoice = preference.getInt(mDevice.getAddress(),
-                                                       PHONEBOOK_ACCESS_UNKNOWN);
+                                                       ACCESS_UNKNOWN);
+    }
+
+
+    int getMessagePermissionChoice() {
+        return mMessagePermissionChoice;
+    }
+
+    void setMessagePermissionChoice(int permissionChoice) {
+        SharedPreferences.Editor editor =
+            mContext.getSharedPreferences(MESSAGE_PREFS_NAME, Context.MODE_PRIVATE).edit();
+        if (permissionChoice == ACCESS_UNKNOWN) {
+            editor.remove(mDevice.getAddress());
+        } else {
+            editor.putInt(mDevice.getAddress(), permissionChoice);
+        }
+        editor.commit();
+        mMessagePermissionChoice = permissionChoice;
+    }
+
+    private void fetchMessagePermissionChoice() {
+        SharedPreferences preference = mContext.getSharedPreferences(MESSAGE_PREFS_NAME,
+                                                                     Context.MODE_PRIVATE);
+        mMessagePermissionChoice = preference.getInt(mDevice.getAddress(),
+                                                       ACCESS_UNKNOWN);
     }
 
 }
