diff --git a/modules/services_discovery/mtp.c b/modules/services_discovery/mtp.c
index 0bf15c54f5c350cad5c3b22f609f9461c9918fff..94783846ac6f8b584b858be6c89c398a1b280b84 100644
--- a/modules/services_discovery/mtp.c
+++ b/modules/services_discovery/mtp.c
@@ -28,14 +28,15 @@
 #include <vlc_common.h>
 #include <vlc_plugin.h>
 #include <vlc_services_discovery.h>
+#include <vlc_vector.h>
 
 #include <libmtp.h>
 
+typedef struct VLC_VECTOR(input_item_t *) vec_items_t;
+
 typedef struct
 {
-    int i_tracks_num;
-    input_item_t **pp_items;
-    int i_count;
+    vec_items_t items;
     char *psz_name;
     uint32_t i_bus;
     uint8_t i_dev;
@@ -62,16 +63,6 @@ static char *GetDeviceName( LIBMTP_mtpdevice_t *p_device )
     return strdup( "MTP Device" );
 }
 
-static int CountTracks( uint64_t const sent, uint64_t const total,
-                        void const * const data )
-{
-    VLC_UNUSED( sent );
-    services_discovery_t *p_sd = (services_discovery_t *)data;
-    services_discovery_sys_t *p_sys = p_sd->p_sys;
-    p_sys->i_tracks_num = total;
-    return 0;
-}
-
 static void AddTrack( services_discovery_t *p_sd, LIBMTP_track_t *p_track )
 {
     services_discovery_sys_t *p_sys = p_sd->p_sys;
@@ -111,8 +102,15 @@ static void AddTrack( services_discovery_t *p_sd, LIBMTP_track_t *p_track )
     }
     input_item_SetDate( p_input, p_track->date );
     p_input->i_duration = VLC_TICK_FROM_MS(p_track->duration);
+
+    if ( !vlc_vector_push( &p_sys->items, p_input ) )
+    {
+        msg_Err( p_sd, "Error adding %s, skipping it", p_track->filename );
+        input_item_Release( p_input );
+        return;
+    }
+
     services_discovery_AddItem( p_sd, p_input );
-    p_sys->pp_items[p_sys->i_count++] = p_input;
 }
 
 static int AddDevice( services_discovery_t *p_sd,
@@ -133,26 +131,12 @@ static int AddDevice( services_discovery_t *p_sd,
         p_sys->i_dev = p_raw_device->devnum;
         p_sys->i_product_id = p_raw_device->device_entry.product_id;
         if( ( p_track = LIBMTP_Get_Tracklisting_With_Callback( p_device,
-                            CountTracks, p_sd ) ) == NULL )
+                            NULL, NULL ) ) == NULL )
         {
             msg_Warn( p_sd, "No tracks on the device" );
-            p_sys->pp_items = NULL;
         }
         else
         {
-            if( !( p_sys->pp_items = calloc( p_sys->i_tracks_num,
-                                                   sizeof( input_item_t * ) ) ) )
-            {
-                free( psz_name );
-                while ( p_track ) {
-                    p_tmp = p_track;
-                    p_track = p_track->next;
-                    LIBMTP_destroy_track_t( p_tmp );
-                }
-                LIBMTP_Release_Device( p_device );
-                return VLC_ENOMEM;
-            }
-            p_sys->i_count = 0;
             while( p_track != NULL )
             {
                 msg_Dbg( p_sd, "Track found: %s - %s", p_track->artist,
@@ -177,21 +161,15 @@ static int AddDevice( services_discovery_t *p_sd,
 static void CloseDevice( services_discovery_t *p_sd )
 {
     services_discovery_sys_t *p_sys = p_sd->p_sys;
-    input_item_t **pp_items = p_sys->pp_items;
 
-    if( pp_items != NULL )
+    for ( size_t i = 0; i < p_sys->items.size; ++i )
     {
-        for( int i_i = 0; i_i < p_sys->i_count; i_i++ )
-        {
-            if( pp_items[i_i] != NULL )
-            {
-                services_discovery_RemoveItem( p_sd, pp_items[i_i] );
-                input_item_Release( pp_items[i_i] );
-            }
-        }
-        free( pp_items );
-        p_sys->pp_items = NULL;
+        input_item_t *item = p_sys->items.data[i];
+        services_discovery_RemoveItem( p_sd, item );
+        input_item_Release( item );
     }
+
+    vlc_vector_clear( &p_sys->items );
 }
 
 /*****************************************************************************
@@ -254,6 +232,8 @@ static int Open( vlc_object_t *p_this )
     p_sd->description = _("MTP devices");
     p_sys->psz_name = NULL;
 
+    vlc_vector_init(&p_sys->items);
+
     static vlc_once_t mtp_init_once = VLC_STATIC_ONCE;
 
     vlc_once(&mtp_init_once, vlc_libmtp_init, NULL);
@@ -275,13 +255,9 @@ static void Close( vlc_object_t *p_this )
     vlc_cancel( p_sys->thread );
     vlc_join( p_sys->thread, NULL );
 
-    if ( p_sys->pp_items != NULL )
-    {
-        for( int i_i = 0; i_i < p_sys->i_count; i_i++ )
-            if( p_sys->pp_items[i_i] != NULL )
-                input_item_Release( p_sys->pp_items[i_i] );
-        free( p_sys->pp_items );
-    }
+    for ( size_t i = 0; i < p_sys->items.size; ++i)
+        input_item_Release( p_sys->items.data[i] );
+    vlc_vector_destroy( &p_sys->items );
 
     free( p_sys );
 }