diff --git a/src/enums.rs b/src/enums.rs
index 2b90e38..4636a53 100644
--- a/src/enums.rs
+++ b/src/enums.rs
@@ -106,6 +106,13 @@ define_enum!(
     Gamma = libvlc_video_adjust_option_t_libvlc_adjust_Gamma,
 );
 
+define_enum!(
+    PlaybackMode, libvlc_playback_mode_t;
+    Default = libvlc_playback_mode_t_libvlc_playback_mode_default,
+    Loop = libvlc_playback_mode_t_libvlc_playback_mode_loop,
+    Repeat = libvlc_playback_mode_t_libvlc_playback_mode_repeat,
+);
+
 // libvlc 3.0
 // define_enum!(
 //     ParseFlag, libvlc_media_parse_flag_t;
diff --git a/src/lib.rs b/src/lib.rs
index 5fdb4f8..5628191 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -9,6 +9,7 @@ mod core;
 mod media;
 mod media_player;
 mod media_list;
+mod media_list_player;
 mod media_library;
 mod enums;
 mod video;
@@ -20,6 +21,7 @@ pub use crate::core::*;
 pub use crate::media::*;
 pub use crate::media_player::*;
 pub use crate::media_list::*;
+pub use crate::media_list_player::*;
 pub use crate::media_library::*;
 pub use crate::video::*;
 pub use crate::audio::*;
diff --git a/src/media_list_player.rs b/src/media_list_player.rs
new file mode 100644
index 0000000..611233c
--- /dev/null
+++ b/src/media_list_player.rs
@@ -0,0 +1,151 @@
+// Copyright (c) 2015 T. Okub
+// This file is part of vlc-rs.
+// Licensed under the MIT license, see the LICENSE file.
+
+use vlc_sys as sys;
+use crate::Instance;
+use crate::Media;
+use crate::MediaList;
+use crate::MediaPlayer;
+use crate::EventManager;
+use crate::PlaybackMode;
+use crate::enums::{State};
+
+// A LibVLC media list player plays multiple media from a medialist
+pub struct MediaListPlayer {
+    pub(crate) ptr: *mut sys::libvlc_media_list_player_t,
+}
+
+unsafe impl Send for MediaListPlayer {}
+
+impl MediaListPlayer {
+    // Create an empty Media List Player object
+    pub fn new(instance: &Instance) -> Option<MediaListPlayer> {
+        unsafe{
+            let p = sys::libvlc_media_list_player_new(instance.ptr);
+
+            if p.is_null() {
+                return None;
+            }
+            Some(MediaListPlayer{ptr: p})
+        }
+    }
+
+    // Get the Event Manager from which the media list player sends events
+    pub fn event_manager<'a>(&'a self) -> EventManager<'a> {
+        unsafe{
+            let p = sys::libvlc_media_list_player_event_manager(self.ptr);
+            assert!(!p.is_null());
+            EventManager{ptr: p, _phantomdata: ::std::marker::PhantomData}
+        }
+    }
+
+    // Set the media player that will be used by the media list player.
+    pub fn set_media_player(&self, mdp: &MediaPlayer) {
+        unsafe{ sys::libvlc_media_list_player_set_media_player(self.ptr, mdp.ptr) };
+    }
+
+    // Get the media player used by the media list player.
+    pub fn get_media_player(&self) -> Option<MediaPlayer> {
+        let p = unsafe{ sys::libvlc_media_list_player_get_media_player(self.ptr) };
+        if p.is_null() {
+            None
+        }else{
+            Some(MediaPlayer{ptr: p})
+        }
+    }
+
+    // Set the media list that will be used by the media list player.
+    pub fn set_media_list(&self, ml: &MediaList) {
+        unsafe{ sys::libvlc_media_list_player_set_media_list(self.ptr, ml.ptr) };
+    }
+
+    // Play media list
+    pub fn play(&self) -> Result<(), ()> {
+        unsafe { 
+            sys::libvlc_media_list_player_play(self.ptr);
+            Ok(())
+        }
+    }
+
+    // Toggle pause (or resume) media list
+    pub fn pause(&self) {
+        unsafe{ sys::libvlc_media_list_player_pause(self.ptr) };
+    }
+
+    // Pause or resume media list
+    pub fn set_pause(&self, do_pause: bool) {
+        unsafe{ sys::libvlc_media_list_player_set_pause(self.ptr, if do_pause {1} else {0}) };
+    }
+
+    // Is media list playing?
+    pub fn is_playing(&self) -> bool {
+        if unsafe{ sys::libvlc_media_list_player_is_playing(self.ptr) } == 0 {
+            false
+        }else{
+            true
+        }
+    }
+
+    // Get current libvlc_state of media list player.
+    pub fn state(&self) -> State {
+        unsafe{ sys::libvlc_media_list_player_get_state(self.ptr) }.into()
+    }
+
+    // Play media list item at position index
+    pub fn play_item_at_index(&self, index: i32) -> Result<(), ()> {
+        if unsafe { sys::libvlc_media_list_player_play_item_at_index(self.ptr, index)}  == 0 {
+            Ok(())
+        }else{
+            Err(())
+        }
+    }
+
+    // Set the media that will be used by the media_player. If any, previous md will be released.
+    pub fn play_item(&self, md: &Media) -> Result<(), ()> {
+        if unsafe{ sys::libvlc_media_list_player_play_item(self.ptr, md.ptr) } == 0 {
+            Ok(())
+        }else{
+            Err(())
+        }
+    }
+
+    // Stop (no effect if there is no media)
+    pub fn stop(&self) {
+        unsafe{ sys::libvlc_media_list_player_stop(self.ptr) };
+    }
+
+    // Play next item from media list
+    pub fn next(&self) -> Result<(), ()> {
+        if unsafe{ sys::libvlc_media_list_player_next(self.ptr) } == 0 {
+            Ok(())
+        }else{
+            Err(())
+        }
+    }
+
+    // Play previous item from media list
+    pub fn previous(&self) -> Result<(), ()> {
+        if unsafe{ sys::libvlc_media_list_player_previous(self.ptr) } == 0 {
+            Ok(())
+        }else{
+            Err(())
+        }
+    }
+
+    // Sets the playback mode for the playlist
+    pub fn set_playback_mode(&self, mode: PlaybackMode) {
+        unsafe{ sys::libvlc_media_list_player_set_playback_mode(self.ptr, mode as u32) };
+    }
+
+    // Returns raw pointer
+    pub fn raw(&self) -> *mut sys::libvlc_media_list_player_t {
+        self.ptr
+    }
+}
+
+impl Drop for MediaListPlayer {
+    fn drop(&mut self) {
+        unsafe{ sys::libvlc_media_list_player_release(self.ptr) };
+    }
+}