diff --git a/Core/Handling/ContextMenuBase.cs b/Core/Handling/ContextMenuBase.cs
index 93c02541..69dbf3e8 100644
--- a/Core/Handling/ContextMenuBase.cs
+++ b/Core/Handling/ContextMenuBase.cs
@@ -7,7 +7,9 @@
 using TweetDuck.Core.Controls;
 using TweetDuck.Core.Utils;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.Linq;
+using TweetDuck.Core.Other;
 
 namespace TweetDuck.Core.Handling{
     abstract class ContextMenuBase : IContextMenuHandler{
@@ -31,10 +33,11 @@ private static string GetMediaLink(IContextMenuParams parameters){
         private const CefMenuCommand MenuOpenLinkUrl     = (CefMenuCommand)26500;
         private const CefMenuCommand MenuCopyLinkUrl     = (CefMenuCommand)26501;
         private const CefMenuCommand MenuCopyUsername    = (CefMenuCommand)26502;
-        private const CefMenuCommand MenuOpenMediaUrl    = (CefMenuCommand)26503;
-        private const CefMenuCommand MenuCopyMediaUrl    = (CefMenuCommand)26504;
-        private const CefMenuCommand MenuSaveMedia       = (CefMenuCommand)26505;
-        private const CefMenuCommand MenuSaveTweetImages = (CefMenuCommand)26506;
+        private const CefMenuCommand MenuViewImage       = (CefMenuCommand)26503;
+        private const CefMenuCommand MenuOpenMediaUrl    = (CefMenuCommand)26504;
+        private const CefMenuCommand MenuCopyMediaUrl    = (CefMenuCommand)26505;
+        private const CefMenuCommand MenuSaveMedia       = (CefMenuCommand)26506;
+        private const CefMenuCommand MenuSaveTweetImages = (CefMenuCommand)26507;
         private const CefMenuCommand MenuOpenDevTools    = (CefMenuCommand)26599;
         
         private string[] lastHighlightedTweetAuthors;
@@ -79,6 +82,7 @@ public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser bro
                 model.AddSeparator();
             }
             else if ((parameters.TypeFlags.HasFlag(ContextMenuType.Media) && parameters.HasImageContents) || hasTweetImage){
+                model.AddItem(MenuViewImage, "View image in photo viewer");
                 model.AddItem(MenuOpenMediaUrl, TextOpen("image"));
                 model.AddItem(MenuCopyMediaUrl, TextCopy("image"));
                 model.AddItem(MenuSaveMedia, TextSave("image"));
@@ -114,6 +118,32 @@ public virtual bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser br
                     SetClipboardText(browserControl.AsControl(), TwitterUtils.GetMediaLink(GetMediaLink(parameters), ImageQuality));
                     break;
 
+                case MenuViewImage:
+                    string url = GetMediaLink(parameters);
+                    string file = Path.Combine(BrowserCache.CacheFolder, TwitterUtils.GetImageFileName(url));
+
+                    void ViewFile(){
+                        string ext = Path.GetExtension(file);
+
+                        if (TwitterUtils.ValidImageExtensions.Contains(ext)){
+                            using(Process.Start(file)){}
+                        }
+                        else{
+                            FormMessage.Error("Image Download", "Invalid file extension "+ext, FormMessage.OK);
+                        }
+                    }
+
+                    if (File.Exists(file)){
+                        ViewFile();
+                    }
+                    else{
+                        BrowserUtils.DownloadFileAsync(TwitterUtils.GetMediaLink(url, ImageQuality), file, ViewFile, ex => {
+                            FormMessage.Error("Image Download", "An error occurred while downloading the image: "+ex.Message, FormMessage.OK);
+                        });
+                    }
+
+                    break;
+
                 case MenuSaveMedia:
                     if (IsVideo){
                         TwitterUtils.DownloadVideo(GetMediaLink(parameters), lastHighlightedTweetAuthors.LastOrDefault());
diff --git a/Core/Utils/BrowserCache.cs b/Core/Utils/BrowserCache.cs
index 6f860cf6..af6cf2af 100644
--- a/Core/Utils/BrowserCache.cs
+++ b/Core/Utils/BrowserCache.cs
@@ -8,7 +8,7 @@ namespace TweetDuck.Core.Utils{
     static class BrowserCache{
         private static bool ClearOnExit { get; set; }
 
-        private static readonly string CacheFolder = Path.Combine(Program.StoragePath, "Cache");
+        public static readonly string CacheFolder = Path.Combine(Program.StoragePath, "Cache");
 
         private static IEnumerable<string> CacheFiles{
             get{
diff --git a/Core/Utils/TwitterUtils.cs b/Core/Utils/TwitterUtils.cs
index 701682f0..b02e18c0 100644
--- a/Core/Utils/TwitterUtils.cs
+++ b/Core/Utils/TwitterUtils.cs
@@ -21,6 +21,10 @@ static class TwitterUtils{
             "tweetdeck", "TweetDeck", "tweetduck", "TweetDuck", "TD"
         };
 
+        public static readonly string[] ValidImageExtensions = {
+            ".jpg", ".jpeg", ".png", ".gif"
+        };
+
         public enum ImageQuality{
             Default, Orig
         }
@@ -52,6 +56,10 @@ public static string GetMediaLink(string url, ImageQuality quality){
                 return url;
             }
         }
+
+        public static string GetImageFileName(string url){
+            return BrowserUtils.GetFileNameFromUrl(ExtractMediaBaseLink(url));
+        }
         
         public static void DownloadImage(string url, string username, ImageQuality quality){
             DownloadImages(new string[]{ url }, username, quality);
@@ -65,7 +73,7 @@ public static void DownloadImages(string[] urls, string username, ImageQuality q
             string firstImageLink = GetMediaLink(urls[0], quality);
             int qualityIndex = firstImageLink.IndexOf(':', firstImageLink.LastIndexOf('/'));
 
-            string file = BrowserUtils.GetFileNameFromUrl(ExtractMediaBaseLink(firstImageLink));
+            string file = GetImageFileName(firstImageLink);
             string ext = Path.GetExtension(file); // includes dot
 
             string[] fileNameParts = qualityIndex == -1 ? new string[]{