diff --git a/src/NadekoBot/Modules/Music/Music.cs b/src/NadekoBot/Modules/Music/Music.cs
index 15f7f6a3..ab131a0f 100644
--- a/src/NadekoBot/Modules/Music/Music.cs
+++ b/src/NadekoBot/Modules/Music/Music.cs
@@ -246,6 +246,9 @@ namespace NadekoBot.Modules.Music
                 var add = "";
                 if (mp.Stopped)
                     add += Format.Bold(GetText("queue_stopped", Format.Code(Prefix + "play"))) + "\n";
+                var mps = mp.MaxPlaytimeSeconds;
+                if (mps > 0)
+                    add += Format.Bold(GetText("song_skips_after", TimeSpan.FromSeconds(mps).ToString("g"))) + "\n";
                 if (mp.RepeatCurrentSong)
                     add += "🔂 " + GetText("repeating_cur_song") + "\n";
                 else if (mp.Shuffle)
@@ -259,7 +262,7 @@ namespace NadekoBot.Modules.Music
                 }
 
                 if (!string.IsNullOrWhiteSpace(add))
-                    desc += add + "\n";
+                    desc = add + "\n" + desc;
                 
                 var embed = new EmbedBuilder()
                     .WithAuthor(eab => eab.WithName(GetText("player_queue", curPage + 1, lastPage + 1))
@@ -795,24 +798,21 @@ namespace NadekoBot.Modules.Music
                 await ReplyConfirmLocalized("max_queue_x", size).ConfigureAwait(false);
         }
 
-        //[NadekoCommand, Usage, Description, Aliases]
-        //[RequireContext(ContextType.Guild)]
-        //public async Task SetMaxPlaytime(uint seconds)
-        //{
-        //    if (seconds < 15 && seconds != 0)
-        //        return;
+        [NadekoCommand, Usage, Description, Aliases]
+        [RequireContext(ContextType.Guild)]
+        public async Task SetMaxPlaytime(uint seconds)
+        {
+            if (seconds < 15 && seconds != 0)
+                return;
+
+            var mp = await _music.GetOrCreatePlayer(Context);
+            mp.MaxPlaytimeSeconds = seconds;
+            if (seconds == 0)
+                await ReplyConfirmLocalized("max_playtime_none").ConfigureAwait(false);
+            else
+                await ReplyConfirmLocalized("max_playtime_set", seconds).ConfigureAwait(false);
+        }
 
-        //    var channel = (ITextChannel)Context.Channel;
-        //    MusicPlayer musicPlayer;
-        //    if ((musicPlayer = _music.GetPlayer(Context.Guild.Id)) == null)
-        //        return;
-        //    musicPlayer.MaxPlaytimeSeconds = seconds;
-        //    if (seconds == 0)
-        //        await ReplyConfirmLocalized("max_playtime_none").ConfigureAwait(false);
-        //    else
-        //        await ReplyConfirmLocalized("max_playtime_set", seconds).ConfigureAwait(false);
-        //}
-        
         [NadekoCommand, Usage, Description, Aliases]
         [RequireContext(ContextType.Guild)]
         public async Task ReptCurSong()
diff --git a/src/NadekoBot/Resources/CommandStrings.resx b/src/NadekoBot/Resources/CommandStrings.resx
index d8977412..78297dd9 100644
--- a/src/NadekoBot/Resources/CommandStrings.resx
+++ b/src/NadekoBot/Resources/CommandStrings.resx
@@ -1198,7 +1198,7 @@
     `{0}drawnew` or `{0}drawnew 5`
   
   
-    playlistshuffle plsh
+    shuffle plsh
   
   
     Shuffles the current playlist.
diff --git a/src/NadekoBot/Services/Music/MusicPlayer.cs b/src/NadekoBot/Services/Music/MusicPlayer.cs
index 38babb9c..10d4d2ac 100644
--- a/src/NadekoBot/Services/Music/MusicPlayer.cs
+++ b/src/NadekoBot/Services/Music/MusicPlayer.cs
@@ -50,6 +50,13 @@ namespace NadekoBot.Services.Music
             get => Queue.MaxQueueSize;
             set => Queue.MaxQueueSize = value;
         }
+        public uint MaxPlaytimeSeconds { get; set; }
+
+
+        const int _frameBytes = 3840;
+        const float _miliseconds = 20.0f;
+        public TimeSpan CurrentTime => TimeSpan.FromSeconds(_bytesSent / (float)_frameBytes / (1000 / _miliseconds));
+        private int _bytesSent = 0;
 
         private IAudioClient _audioClient;
         private readonly object locker = new object();
@@ -78,6 +85,7 @@ namespace NadekoBot.Services.Music
              {
                  while (!Exited)
                  {
+                     _bytesSent = 0;
                      CancellationToken cancelToken;
                      (int Index, SongInfo Song) data;
                      lock (locker)
@@ -122,12 +130,14 @@ namespace NadekoBot.Services.Music
                              int bytesRead = 0;
                              try
                              {
-                                 while ((bytesRead = await b.ReadAsync(buffer, 0, buffer.Length, cancelToken).ConfigureAwait(false)) > 0)
+                                 while ((bytesRead = await b.ReadAsync(buffer, 0, buffer.Length, cancelToken).ConfigureAwait(false)) > 0 
+                                    && (MaxPlaytimeSeconds <= 0 || MaxPlaytimeSeconds >= CurrentTime.TotalSeconds))
                                  {
                                      var vol = Volume;
                                      if (vol != 1)
                                          AdjustVolume(buffer, vol);
                                      await pcm.WriteAsync(buffer, 0, bytesRead, cancelToken).ConfigureAwait(false);
+                                     unchecked { _bytesSent += bytesRead; }
 
                                      await (pauseTaskSource?.Task ?? Task.CompletedTask);
                                  }
diff --git a/src/NadekoBot/Services/Music/SongBuffer.cs b/src/NadekoBot/Services/Music/SongBuffer.cs
index 0e507344..9f26671d 100644
--- a/src/NadekoBot/Services/Music/SongBuffer.cs
+++ b/src/NadekoBot/Services/Music/SongBuffer.cs
@@ -69,6 +69,7 @@ Check the guides for your platform on how to setup ffmpeg correctly:
     Linux Guide:  https://goo.gl/ShjCUo");
                 }
                 catch (OperationCanceledException) { }
+                catch (InvalidOperationException) { } // when ffmpeg is disposed
                 catch (Exception ex)
                 {
                     _log.Info(ex);
diff --git a/src/NadekoBot/_strings/ResponseStrings.en-US.json b/src/NadekoBot/_strings/ResponseStrings.en-US.json
index 705b3c34..2703d2fd 100644
--- a/src/NadekoBot/_strings/ResponseStrings.en-US.json
+++ b/src/NadekoBot/_strings/ResponseStrings.en-US.json
@@ -455,6 +455,7 @@
   "music_songs_shuffle_disable": "Songs will no longer shuffle.",
   "music_song_moved": "Song moved",
   "music_song_not_found": "No song found.",
+  "music_song_skips_after": "Songs will skip after {0}",
   "music_time_format": "{0}h {1}m {2}s",
   "music_to_position": "To position",
   "music_unlimited": "unlimited",