diff --git a/Core/Bridge/TweetDeckBridge.cs b/Core/Bridge/TweetDeckBridge.cs
index 6b885b8e..de747ddc 100644
--- a/Core/Bridge/TweetDeckBridge.cs
+++ b/Core/Bridge/TweetDeckBridge.cs
@@ -14,11 +14,12 @@ sealed class TweetDeckBridge{
         public static string LastRightClickedImage = string.Empty;
         public static string LastHighlightedTweet = string.Empty;
         public static string LastHighlightedQuotedTweet = string.Empty;
+        public static string LastHighlightedTweetAuthor = string.Empty;
         public static string[] LastHighlightedTweetImages = StringUtils.EmptyArray;
         public static Dictionary<string, string> SessionData = new Dictionary<string, string>(2);
 
         public static void ResetStaticProperties(){
-            LastRightClickedLink = LastRightClickedImage = LastHighlightedTweet = LastHighlightedQuotedTweet = string.Empty;
+            LastRightClickedLink = LastRightClickedImage = LastHighlightedTweet = LastHighlightedQuotedTweet = LastHighlightedTweetAuthor = string.Empty;
             LastHighlightedTweetImages = StringUtils.EmptyArray;
         }
 
@@ -63,10 +64,11 @@ public void SetLastRightClickedImage(string link){
             form.InvokeAsyncSafe(() => LastRightClickedImage = link);
         }
 
-        public void SetLastHighlightedTweet(string link, string quotedLink, string imageList){
+        public void SetLastHighlightedTweet(string link, string quotedLink, string author, string imageList){
             form.InvokeAsyncSafe(() => {
                 LastHighlightedTweet = link;
                 LastHighlightedQuotedTweet = quotedLink;
+                LastHighlightedTweetAuthor = author;
                 LastHighlightedTweetImages = imageList.Split(';');
             });
         }
diff --git a/Core/Handling/ContextMenuBase.cs b/Core/Handling/ContextMenuBase.cs
index dc587a38..6d78b3bd 100644
--- a/Core/Handling/ContextMenuBase.cs
+++ b/Core/Handling/ContextMenuBase.cs
@@ -32,6 +32,7 @@ private static string GetImage(IContextMenuParams parameters){
 
         private readonly Form form;
         
+        private string lastHighlightedTweetAuthor;
         private string[] lastHighlightedTweetImageList;
 
         protected ContextMenuBase(Form form){
@@ -40,9 +41,11 @@ protected ContextMenuBase(Form form){
 
         public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model){
             bool hasTweetImage = !string.IsNullOrEmpty(TweetDeckBridge.LastRightClickedImage);
+            lastHighlightedTweetAuthor = TweetDeckBridge.LastHighlightedTweetAuthor;
             lastHighlightedTweetImageList = TweetDeckBridge.LastHighlightedTweetImages;
 
             if (!TwitterUtils.IsTweetDeckWebsite(frame) || browser.IsLoading){
+                lastHighlightedTweetAuthor = string.Empty;
                 lastHighlightedTweetImageList = StringUtils.EmptyArray;
             }
 
@@ -88,11 +91,11 @@ public virtual bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser br
                     break;
 
                 case MenuSaveImage:
-                    TwitterUtils.DownloadImage(GetImage(parameters), ImageQuality);
+                    TwitterUtils.DownloadImage(GetImage(parameters), lastHighlightedTweetAuthor, ImageQuality);
                     break;
 
                 case MenuSaveAllImages:
-                    TwitterUtils.DownloadImages(lastHighlightedTweetImageList, ImageQuality);
+                    TwitterUtils.DownloadImages(lastHighlightedTweetImageList, lastHighlightedTweetAuthor, ImageQuality);
                     break;
 
                 case MenuCopyImageUrl:
diff --git a/Core/Utils/TwitterUtils.cs b/Core/Utils/TwitterUtils.cs
index 298fd1b7..02ddbb07 100644
--- a/Core/Utils/TwitterUtils.cs
+++ b/Core/Utils/TwitterUtils.cs
@@ -2,6 +2,7 @@
 using CefSharp;
 using System.Drawing;
 using System.IO;
+using System.Linq;
 using System.Text.RegularExpressions;
 using System.Windows.Forms;
 using TweetDuck.Core.Other;
@@ -52,23 +53,32 @@ public static string GetImageLink(string url, ImageQuality quality){
             }
         }
         
-        public static void DownloadImage(string url, ImageQuality quality){
-            DownloadImages(new string[]{ url }, quality);
+        public static void DownloadImage(string url, string username, ImageQuality quality){
+            DownloadImages(new string[]{ url }, username, quality);
         }
 
-        public static void DownloadImages(string[] urls, ImageQuality quality){
+        public static void DownloadImages(string[] urls, string username, ImageQuality quality){
             if (urls.Length == 0){
                 return;
             }
 
-            string file = BrowserUtils.GetFileNameFromUrl(ExtractImageBaseLink(urls[0]));
+            string firstImageLink = GetImageLink(urls[0], quality);
+            int qualityIndex = firstImageLink.LastIndexOf(':');
+
+            string file = BrowserUtils.GetFileNameFromUrl(ExtractImageBaseLink(firstImageLink));
             string ext = Path.GetExtension(file); // includes dot
+
+            string[] fileNameParts = {
+                username,
+                Path.ChangeExtension(file, null),
+                qualityIndex == -1 ? string.Empty : firstImageLink.Substring(qualityIndex+1)
+            };
             
             using(SaveFileDialog dialog = new SaveFileDialog{
                 AutoUpgradeEnabled = true,
                 OverwritePrompt = urls.Length == 1,
                 Title = "Save image",
-                FileName = file,
+                FileName = $"{string.Join(" ", fileNameParts.Where(part => part.Length > 0))}{ext}",
                 Filter = (urls.Length == 1 ? "Image" : "Images")+(string.IsNullOrEmpty(ext) ? " (unknown)|*.*" : $" (*{ext})|*{ext}")
             }){
                 if (dialog.ShowDialog() == DialogResult.OK){
@@ -77,14 +87,14 @@ void OnFailure(Exception ex){
                     }
 
                     if (urls.Length == 1){
-                        BrowserUtils.DownloadFileAsync(GetImageLink(urls[0], quality), dialog.FileName, null, OnFailure);
+                        BrowserUtils.DownloadFileAsync(firstImageLink, dialog.FileName, null, OnFailure);
                     }
                     else{
                         string pathBase = Path.ChangeExtension(dialog.FileName, null);
                         string pathExt = Path.GetExtension(dialog.FileName);
 
                         for(int index = 0; index < urls.Length; index++){
-                            BrowserUtils.DownloadFileAsync(GetImageLink(urls[index], quality), pathBase+(index+1)+pathExt, null, OnFailure);
+                            BrowserUtils.DownloadFileAsync(GetImageLink(urls[index], quality), $"{pathBase} {index+1}{pathExt}", null, OnFailure);
                         }
                     }
                 }
diff --git a/Resources/Scripts/code.js b/Resources/Scripts/code.js
index 8b2c969e..dfab54a8 100644
--- a/Resources/Scripts/code.js
+++ b/Resources/Scripts/code.js
@@ -391,12 +391,12 @@
       return !!highlightedColumnObj;
     };
     
-    var updateHighlightedTweet = function(ele, obj, link, embeddedLink, imageList){
+    var updateHighlightedTweet = function(ele, obj, link, embeddedLink, author, imageList){
       highlightedTweetEle = ele;
       highlightedTweetObj = obj;
       
       if (lastTweet !== link){
-        $TD.setLastHighlightedTweet(link, embeddedLink, imageList);
+        $TD.setLastHighlightedTweet(link, embeddedLink, author, imageList);
         lastTweet = link;
       }
     };
@@ -426,18 +426,19 @@
           if (tweet.chirpType === TD.services.ChirpBase.TWEET){
             let link = tweet.getChirpURL();
             let embedded = tweet.quotedTweet ? tweet.quotedTweet.getChirpURL() : "";
+            let username = tweet.getMainUser().screenName;
             let images = tweet.hasImage() ? tweet.getMedia().filter(item => !item.isAnimatedGif).map(item => item.entity.media_url_https+":small").join(";") : "";
             // TODO maybe handle embedded images too?
             
-            updateHighlightedTweet(me, tweet, link || "", embedded || "", images);
+            updateHighlightedTweet(me, tweet, link || "", embedded || "", username, images);
           }
           else{
-            updateHighlightedTweet(me, tweet, "", "", "");
+            updateHighlightedTweet(me, tweet, "", "", "", "");
           }
         }
       }
       else if (e.type === "mouseleave"){
-        updateHighlightedTweet(null, null, "", "", "");
+        updateHighlightedTweet(null, null, "", "", "", "");
       }
     });
   })();