diff --git a/api/current.xml b/api/current.xml
index 65ffa82..9c7018a 100644
--- a/api/current.xml
+++ b/api/current.xml
@@ -64504,6 +64504,23 @@
  visibility="public"
 >
 </method>
+<method name="getMinBufferSize"
+ return="int"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="true"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="sampleRateInHz" type="int">
+</parameter>
+<parameter name="channelConfig" type="int">
+</parameter>
+<parameter name="audioFormat" type="int">
+</parameter>
+</method>
 <method name="getNotificationMarkerPosition"
  return="int"
  abstract="false"
@@ -64619,19 +64636,6 @@
  visibility="public"
 >
 </method>
-<method name="setMarkerReachedListener"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="listener" type="android.media.AudioRecord.OnMarkerReachedListener">
-</parameter>
-</method>
 <method name="setNotificationMarkerPosition"
  return="int"
  abstract="false"
@@ -64645,19 +64649,6 @@
 <parameter name="markerInFrames" type="int">
 </parameter>
 </method>
-<method name="setPeriodicNotificationListener"
- return="void"
- abstract="false"
- native="false"
- synchronized="false"
- static="false"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
-<parameter name="listener" type="android.media.AudioRecord.OnPeriodicNotificationListener">
-</parameter>
-</method>
 <method name="setPositionNotificationPeriod"
  return="int"
  abstract="false"
@@ -64671,6 +64662,34 @@
 <parameter name="periodInFrames" type="int">
 </parameter>
 </method>
+<method name="setRecordPositionUpdateListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.media.AudioRecord.OnRecordPositionUpdateListener">
+</parameter>
+</method>
+<method name="setRecordPositionUpdateListener"
+ return="void"
+ abstract="false"
+ native="false"
+ synchronized="false"
+ static="false"
+ final="false"
+ deprecated="not deprecated"
+ visibility="public"
+>
+<parameter name="listener" type="android.media.AudioRecord.OnRecordPositionUpdateListener">
+</parameter>
+<parameter name="handler" type="android.os.Handler">
+</parameter>
+</method>
 <method name="startRecording"
  return="void"
  abstract="false"
@@ -64786,7 +64805,7 @@
 >
 </field>
 </class>
-<interface name="AudioRecord.OnMarkerReachedListener"
+<interface name="AudioRecord.OnRecordPositionUpdateListener"
  abstract="true"
  static="true"
  final="false"
@@ -64806,14 +64825,6 @@
 <parameter name="recorder" type="android.media.AudioRecord">
 </parameter>
 </method>
-</interface>
-<interface name="AudioRecord.OnPeriodicNotificationListener"
- abstract="true"
- static="true"
- final="false"
- deprecated="not deprecated"
- visibility="public"
->
 <method name="onPeriodicNotification"
  return="void"
  abstract="true"
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 0ef7760..a49bd67 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -165,27 +165,24 @@
      */
     private Object mRecordingStateLock = new Object();
     /**
-     * The listener the AudioRecord notifies when a previously set marker is reached.
-     *  @see #setMarkerReachedListener(OnMarkerReachedListener)
+     * The listener the AudioRecord notifies when the record position reaches a marker
+     * or for periodic updates during the progression of the record head.
+     *  @see #setRecordPositionUpdateListener(OnRecordPositionUpdateListener)
+     *  @see #setRecordPositionUpdateListener(OnRecordPositionUpdateListener, Handler)
      */
-    private OnMarkerReachedListener mMarkerListener = null;
+    private OnRecordPositionUpdateListener mPositionListener = null;
     /**
-     * Lock to protect marker listener updates against event notifications
+     * Lock to protect position listener updates against event notifications
      */
-    private final Object mMarkerListenerLock = new Object();
+    private final Object mPositionListenerLock = new Object();
     /**
-     * The listener the AudioRecord notifies periodically during recording.
-     *  @see #setPeriodicNotificationListener(OnPeriodicNotificationListener)
+     * Handler for marker events coming from the native code
      */
-    private OnPeriodicNotificationListener mPeriodicListener = null;
+    private NativeEventHandler mEventHandler = null;
     /**
-     * Lock to protect periodic listener updates against event notifications
+     * Looper associated with the thread that creates the AudioRecord instance
      */
-    private final Object mPeriodicListenerLock = new Object();
-    /**
-     * Handler for events coming from the native code
-     */
-    private NativeEventHandler mNativeEventHandler = null;
+    private Looper mInitializationLooper = null;
     /**
      * Size of the native audio buffer.
      */
@@ -217,6 +214,11 @@
     throws IllegalArgumentException {   
         mState = STATE_UNINITIALIZED;
         mRecordingState = RECORDSTATE_STOPPED;
+        
+        // remember which looper is associated with the AudioRecord instanciation
+        if ((mInitializationLooper = Looper.myLooper()) == null) {
+            mInitializationLooper = Looper.getMainLooper();
+        }
 
         audioParamCheck(audioSource, sampleRateInHz, channelConfig, audioFormat);
 
@@ -319,21 +321,6 @@
     }    
     
     
-    // Convenience method for the creation of the native event handler
-    // It is called only when a non-null event listener is set.
-    // precondition:
-    //    mNativeEventHandler is null
-    private void createNativeEventHandler() {
-        Looper looper;
-        if ((looper = Looper.myLooper()) != null) {
-            mNativeEventHandler = new NativeEventHandler(this, looper);
-        } else if ((looper = Looper.getMainLooper()) != null) {
-            mNativeEventHandler = new NativeEventHandler(this, looper);
-        } else {
-            mNativeEventHandler = null;
-        }
-    }
-    
 
     /**
      * Releases the native AudioRecord resources.
@@ -433,7 +420,6 @@
     }
     
     /**
-     * {@hide}
      * Returns the minimum buffer size required for the successful creation of an AudioRecord
      * object.
      * @param sampleRateInHz the sample rate expressed in Hertz.
@@ -602,36 +588,40 @@
     // Initialization / configuration
     //--------------------  
     /**
-     * Sets the listener the AudioRecord notifies when a previously set marker is reached.
+     * Sets the listener the AudioRecord notifies when a previously set marker is reached or
+     * for each periodic record head position update.
      * @param listener
      */
-    public void setMarkerReachedListener(OnMarkerReachedListener listener) {
-        synchronized (mMarkerListenerLock) {
-            mMarkerListener = listener;
+    public void setRecordPositionUpdateListener(OnRecordPositionUpdateListener listener) {
+        setRecordPositionUpdateListener(listener, null);
+    }
+    
+
+    public void setRecordPositionUpdateListener(OnRecordPositionUpdateListener listener, 
+                                                    Handler handler) {
+        synchronized (mPositionListenerLock) {
+            
+            mPositionListener = listener;
+            
+            if (listener != null) {
+                if (handler != null) {
+                    mEventHandler = new NativeEventHandler(this, handler.getLooper());
+                } else {
+                    // no given handler, use the looper the AudioRecord was created in
+                    mEventHandler = new NativeEventHandler(this, mInitializationLooper);
+                }
+            } else {
+                mEventHandler = null;
+            }
         }
-        if ((listener != null) && (mNativeEventHandler == null)) {
-            createNativeEventHandler();
-        }
+        
     }
     
     
     /**
-     * Sets the listener the AudioRecord notifies periodically during recording.
-     * @param listener
-     */
-    public void setPeriodicNotificationListener(OnPeriodicNotificationListener listener) {
-        synchronized (mPeriodicListenerLock) {
-            mPeriodicListener = listener;
-        }
-        if ((listener != null) && (mNativeEventHandler == null)) {
-            createNativeEventHandler();
-        }
-    }
-    
-    
-    /**
-     * Sets the marker position at which the listener, if set with 
-     * {@link #setMarkerReachedListener(OnMarkerReachedListener)}, is called.
+     * Sets the marker position at which the listener is called, if set with 
+     * {@link #setRecordPositionUpdateListener(OnRecordPositionUpdateListener)} or 
+     * {@link #setRecordPositionUpdateListener(OnRecordPositionUpdateListener, Handler)}.
      * @param markerInFrames marker position expressed in frames
      * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_BAD_VALUE},
      *  {@link #ERROR_INVALID_OPERATION} 
@@ -642,8 +632,9 @@
     
     
     /**
-     * Sets the period at which the listener, if set with
-     * {@link #setPositionNotificationPeriod(int)}, is called.
+     * Sets the period at which the listener is called, if set with
+     * {@link #setRecordPositionUpdateListener(OnRecordPositionUpdateListener)} or 
+     * {@link #setRecordPositionUpdateListener(OnRecordPositionUpdateListener, Handler)}.
      * @param periodInFrames update period expressed in frames
      * @return error code or success, see {@link #SUCCESS}, {@link #ERROR_INVALID_OPERATION}
      */
@@ -659,70 +650,65 @@
      * Interface definition for a callback to be invoked when an AudioRecord has
      * reached a notification marker set by setNotificationMarkerPosition().
      */
-    public interface OnMarkerReachedListener  {
+    public interface OnRecordPositionUpdateListener  {
         /**
          * Called on the listener to notify it that the previously set marker has been reached
          * by the recording head.
          */
         void onMarkerReached(AudioRecord recorder);
-    }
-
-
-    /**
-     * Interface definition for a callback to be invoked for each periodic AudioRecord 
-     * update during recording. The update interval is set by setPositionNotificationPeriod().
-     */
-    public interface OnPeriodicNotificationListener  {
+        
         /**
-         * Called on the listener to periodically notify it that the recording head has reached
+         * Called on the listener to periodically notify it that the record head has reached
          * a multiple of the notification period.
          */
         void onPeriodicNotification(AudioRecord recorder);
     }
+    
+    
 
     
     //---------------------------------------------------------
     // Inner classes
     //--------------------
+      
     /**
-     * Helper class to handle the forwarding of native events to the appropriate listeners
-     */
-    private class NativeEventHandler extends Handler
-    {
-        private AudioRecord mAudioRecord;
-
-        public NativeEventHandler(AudioRecord ar, Looper looper) {
+     * Helper class to handle the forwarding of native events to the appropriate listener
+     * (potentially) handled in a different thread
+     */  
+    private class NativeEventHandler extends Handler {
+        
+        private final AudioRecord mAudioRecord;
+        
+        NativeEventHandler(AudioRecord recorder, Looper looper) {
             super(looper);
-            mAudioRecord = ar;
+            mAudioRecord = recorder;
         }
-
+        
         @Override
         public void handleMessage(Message msg) {
-            if (mAudioRecord == null) {
-                return;
+            OnRecordPositionUpdateListener listener = null;
+            synchronized (mPositionListenerLock) {
+                listener = mAudioRecord.mPositionListener;
             }
+            
             switch(msg.what) {
             case NATIVE_EVENT_MARKER:
-                synchronized (mMarkerListenerLock) {
-                    if (mAudioRecord.mMarkerListener != null) {
-                        mAudioRecord.mMarkerListener.onMarkerReached(mAudioRecord);
-                    }
+                if (listener != null) {
+                    listener.onMarkerReached(mAudioRecord);
                 }
                 break;
             case NATIVE_EVENT_NEW_POS:
-                synchronized (mPeriodicListenerLock) {
-                    if (mAudioRecord.mPeriodicListener != null) {
-                        mAudioRecord.mPeriodicListener.onPeriodicNotification(mAudioRecord);
-                    }
+                if (listener != null) {
+                    listener.onPeriodicNotification(mAudioRecord);
                 }
                 break;
             default:
                 Log.e(TAG, "[ android.media.AudioRecord.NativeEventHandler ] " +
                         "Unknown event type: " + msg.what);
-                break;
+            break;
             }
         }
-    }
+    };
     
     
     //---------------------------------------------------------
@@ -737,9 +723,10 @@
             return;
         }
         
-        if (recorder.mNativeEventHandler != null) {
-            Message m = recorder.mNativeEventHandler.obtainMessage(what, arg1, arg2, obj);
-            recorder.mNativeEventHandler.sendMessage(m);
+        if (recorder.mEventHandler != null) {
+            Message m = 
+                recorder.mEventHandler.obtainMessage(what, arg1, arg2, obj);
+            recorder.mEventHandler.sendMessage(m);
         }
 
     }
