diff --git a/include/vlc/libvlc_events.h b/include/vlc/libvlc_events.h
index dd1ac0ec422b1941a5336c7b0dac6199f2aecf16..1ad6329b846ec7b3e309315c43cb2b10fe76fdaf 100644
--- a/include/vlc/libvlc_events.h
+++ b/include/vlc/libvlc_events.h
@@ -142,6 +142,10 @@ typedef struct libvlc_event_t
 
         /* media instance */
         struct
+        {
+            float new_cache;
+        } media_player_buffering;
+        struct
         {
             float new_position;
         } media_player_position_changed;
diff --git a/projects/activex/axvlc.idl b/projects/activex/axvlc.idl
index 76d8e4ee83b94778a8db5fc9250e17879d1947bc..7a2db30cc48d9538a665a332842a7ef9b5409c10 100644
--- a/projects/activex/axvlc.idl
+++ b/projects/activex/axvlc.idl
@@ -211,7 +211,7 @@ library AXVLC
             [id(DISPID_MediaPlayerOpeningEvent), helpstring("Opening media")]
             void MediaPlayerOpening();
             [id(DISPID_MediaPlayerBufferingEvent), helpstring("Buffering media")]
-            void MediaPlayerBuffering();
+            void MediaPlayerBuffering([in] long cache);
             [id(DISPID_MediaPlayerPlayingEvent), helpstring("Media is playing")]
             void MediaPlayerPlaying();
             [id(DISPID_MediaPlayerPausedEvent), helpstring("Media is paused")]
diff --git a/projects/activex/axvlc.tlb b/projects/activex/axvlc.tlb
index 5665e7b461fada4a03b86c889518d113997292f9..78c79ab16e477ded6fc7618c5f982653eb8c3dbd 100644
Binary files a/projects/activex/axvlc.tlb and b/projects/activex/axvlc.tlb differ
diff --git a/projects/activex/plugin.cpp b/projects/activex/plugin.cpp
index 1aab11840e7c7a89f8150e522fa6becf727bcc60..2c2365c496c9642e08d76f3ec15568c91fa4bf2f 100644
--- a/projects/activex/plugin.cpp
+++ b/projects/activex/plugin.cpp
@@ -1021,10 +1021,17 @@ void VLCPlugin::fireOnMediaPlayerOpeningEvent()
     vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerOpeningEvent, &dispparamsNoArgs);
 };
 
-void VLCPlugin::fireOnMediaPlayerBufferingEvent()
+void VLCPlugin::fireOnMediaPlayerBufferingEvent(long cache)
 {
-    DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
-    vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerBufferingEvent, &dispparamsNoArgs);
+    DISPPARAMS params;
+    params.cArgs = 1;
+    params.rgvarg = (VARIANTARG *) CoTaskMemAlloc(sizeof(VARIANTARG) * params.cArgs) ;
+    memset(params.rgvarg, 0, sizeof(VARIANTARG) * params.cArgs);
+    params.rgvarg[0].vt = VT_I4;
+    params.rgvarg[0].lVal = cache;
+    params.rgdispidNamedArgs = NULL;
+    params.cNamedArgs = 0;
+    vlcConnectionPointContainer->fireEvent(DISPID_MediaPlayerBufferingEvent, &params);
 };
 
 void VLCPlugin::fireOnMediaPlayerPlayingEvent()
@@ -1081,7 +1088,7 @@ static void handle_input_state_event(const libvlc_event_t* event, void *param)
             plugin->fireOnMediaPlayerOpeningEvent();
             break;
         case libvlc_MediaPlayerBuffering:
-            plugin->fireOnMediaPlayerBufferingEvent();
+            plugin->fireOnMediaPlayerBufferingEvent(event->u.media_player_buffering.new_cache);
             break;
         case libvlc_MediaPlayerPlaying:
             plugin->fireOnMediaPlayerPlayingEvent();
diff --git a/projects/activex/plugin.h b/projects/activex/plugin.h
index d5db79ffae39e9dd39b7560ba74b73f58661daf2..cc21b2fef344ee122dd1abdac3e35f1f7694a27a 100644
--- a/projects/activex/plugin.h
+++ b/projects/activex/plugin.h
@@ -241,7 +241,7 @@ public:
     // async events;
     void fireOnMediaPlayerNothingSpecialEvent();
     void fireOnMediaPlayerOpeningEvent();
-    void fireOnMediaPlayerBufferingEvent();
+    void fireOnMediaPlayerBufferingEvent(long cache);
     void fireOnMediaPlayerPlayingEvent();
     void fireOnMediaPlayerPausedEvent();
     void fireOnMediaPlayerForwardEvent();
diff --git a/projects/mozilla/vlcplugin.cpp b/projects/mozilla/vlcplugin.cpp
index ee7504d5a08de169d070c0bf86a5bbf93db1006c..0e6ee6c11793dbfe6627a82ee2a0e9a0dd25e5b0 100644
--- a/projects/mozilla/vlcplugin.cpp
+++ b/projects/mozilla/vlcplugin.cpp
@@ -114,7 +114,7 @@ static vlcplugin_event_t vlcevents[] = {
     { "MediaPlayerMediaChanged", libvlc_MediaPlayerMediaChanged, handle_input_event },
     { "MediaPlayerNothingSpecial", libvlc_MediaPlayerNothingSpecial, handle_input_event },
     { "MediaPlayerOpening", libvlc_MediaPlayerOpening, handle_input_event },
-    { "MediaPlayerBuffering", libvlc_MediaPlayerBuffering, handle_input_event },
+    { "MediaPlayerBuffering", libvlc_MediaPlayerBuffering, handle_changed_event },
     { "MediaPlayerPlaying", libvlc_MediaPlayerPlaying, handle_input_event },
     { "MediaPlayerPaused", libvlc_MediaPlayerPaused, handle_input_event },
     { "MediaPlayerStopped", libvlc_MediaPlayerStopped, handle_input_event },
@@ -140,7 +140,6 @@ static void handle_input_event(const libvlc_event_t* event, void *param)
     {
         case libvlc_MediaPlayerNothingSpecial:
         case libvlc_MediaPlayerOpening:
-        case libvlc_MediaPlayerBuffering:
         case libvlc_MediaPlayerPlaying:
         case libvlc_MediaPlayerPaused:
         case libvlc_MediaPlayerStopped:
@@ -163,6 +162,9 @@ static void handle_changed_event(const libvlc_event_t* event, void *param)
     VlcPlugin *plugin = (VlcPlugin*)param;
     switch( event->type )
     {
+        case libvlc_MediaPlayerBuffering:
+            DOUBLE_TO_NPVARIANT(event->u.media_player_buffering.new_cache, npparam[0]);
+            break;
         case libvlc_MediaPlayerTimeChanged:
             DOUBLE_TO_NPVARIANT(event->u.media_player_time_changed.new_time, npparam[0]);
             break;
@@ -239,7 +241,6 @@ void EventObj::deliver(NPP browser)
                 NPVariant result;
                 NPVariant *params = iter->params();
                 uint32_t   count  = iter->count();
-                assert( params );
 
                 NPObject *listener = j->listener();
                 assert( listener );
@@ -257,7 +258,7 @@ void EventObj::deliver(NPP browser)
                         NPN_MemFree( (void*)NPVARIANT_TO_OBJECT(params[n]) );
                     }
                 }
-                NPN_MemFree( params );
+                if (params) NPN_MemFree( params );
             }
         }
     }
diff --git a/src/control/media_list.c b/src/control/media_list.c
index 8dc7e0c6ae6a585cb7d24d265e1d1888f4556d26..08271247a3ceca66c8f9a946777741ae7bcbf5a6 100644
--- a/src/control/media_list.c
+++ b/src/control/media_list.c
@@ -183,6 +183,7 @@ libvlc_media_list_new( libvlc_instance_t * p_inst )
     vlc_mutex_init( &p_mlist->refcount_lock ); // FIXME: spinlock?
 
     vlc_array_init( &p_mlist->items );
+    assert( p_mlist->items.i_count == 0 );
     p_mlist->i_refcount = 1;
     p_mlist->p_md = NULL;
 
diff --git a/src/control/media_player.c b/src/control/media_player.c
index 71bba8d238fd76ba87b08b7858d487121aba19da..b2b18d854dd75968bdca8fb14857513c7045f51a 100644
--- a/src/control/media_player.c
+++ b/src/control/media_player.c
@@ -369,6 +369,13 @@ input_event_changed( vlc_object_t * p_this, char const * psz_cmd,
         p_mi->input.p_vout = get_vout_thread( p_mi );
         unlock_input( p_mi );
     }
+    else if( newval.i_int == INPUT_EVENT_CACHE )
+    {
+        event.type = libvlc_MediaPlayerBuffering;
+        event.u.media_player_buffering.new_cache = (int)(100 *
+            var_GetFloat( p_input, "cache" ));
+        libvlc_event_send( p_mi->p_event_manager, &event );
+    }
 
     return VLC_SUCCESS;
 }