diff --git a/modules/gui/macosx/playlist/VLCPlaylistController.h b/modules/gui/macosx/playlist/VLCPlaylistController.h
index eba43dd1149ec5e41d806bba199c7006099a02a2..4d7e6c270496cbb814683eeb1549c1208ac9abac 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistController.h
+++ b/modules/gui/macosx/playlist/VLCPlaylistController.h
@@ -142,6 +142,30 @@ extern NSString *VLCPlaylistItemsRemoved;
  */
 - (void)clearPlaylist;
 
+/**
+ * Sort the entire playlist listen based on:
+ * @param sortKey the key used for sorting
+ * @param sortOrder sort ascending or descending..
+ * @return Returns VLC_SUCCESS on success.
+ */
+- (int)sortByKey:(enum vlc_playlist_sort_key)sortKey andOrder:(enum vlc_playlist_sort_order)sortOrder;
+
+/**
+ * Initially, the playlist is unsorted until the user decides to do so
+ * Until then, the unsorted state is retained.
+ */
+@property (readonly) BOOL unsorted;
+
+/**
+ * The last key used for sorting
+ */
+@property (readonly) enum vlc_playlist_sort_key lastSortKey;
+
+/**
+ * The last order used for sorting
+ */
+@property (readonly) enum vlc_playlist_sort_order lastSortOrder;
+
 /**
  * Start the playlist
  * @return Returns VLC_SUCCESS on success.
diff --git a/modules/gui/macosx/playlist/VLCPlaylistController.m b/modules/gui/macosx/playlist/VLCPlaylistController.m
index a65c044e83304adb01beccaa87e43811951e9088..f09570df32373131cdefe5dbd37873bdfeb5ddd4 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistController.m
+++ b/modules/gui/macosx/playlist/VLCPlaylistController.m
@@ -210,6 +210,7 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
 
         /* set initial values, further updates through callbacks */
         vlc_playlist_Lock(_p_playlist);
+        _unsorted = YES;
         _playbackOrder = vlc_playlist_GetPlaybackOrder(_p_playlist);
         _playbackRepeat = vlc_playlist_GetPlaybackRepeat(_p_playlist);
         _playlistListenerID = vlc_playlist_AddListener(_p_playlist,
@@ -424,6 +425,21 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
     vlc_playlist_Unlock(_p_playlist);
 }
 
+- (int)sortByKey:(enum vlc_playlist_sort_key)sortKey andOrder:(enum vlc_playlist_sort_order)sortOrder
+{
+    struct vlc_playlist_sort_criterion sortCriterion = { sortKey, sortOrder };
+    int returnValue = VLC_SUCCESS;
+    vlc_playlist_Lock(_p_playlist);
+    returnValue = vlc_playlist_Sort(_p_playlist, &sortCriterion, 1);
+    vlc_playlist_Unlock(_p_playlist);
+    if (returnValue == VLC_SUCCESS) {
+        _lastSortKey = sortKey;
+        _lastSortOrder = sortOrder;
+        _unsorted = NO;
+    }
+    return returnValue;
+}
+
 - (int)startPlaylist
 {
     NSInteger selectedIndex = [_playlistDataSource.tableView selectedRow];