diff --git a/Core/Handling/ContextMenuBase.cs b/Core/Handling/ContextMenuBase.cs
index 035e8bce..6cfd33b5 100644
--- a/Core/Handling/ContextMenuBase.cs
+++ b/Core/Handling/ContextMenuBase.cs
@@ -54,24 +54,27 @@ public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser bro
             else{
                 LastLink = TweetDeckBridge.ContextInfo.Link;
                 LastChirp = TweetDeckBridge.ContextInfo.Chirp;
-            }
 
+                if (LastLink.Type == ContextInfo.LinkType.Unknown){
+                    LastLink = new ContextInfo.LinkInfo(parameters);
+                }
+            }
+            
             if (parameters.TypeFlags.HasFlag(ContextMenuType.Selection) && !parameters.TypeFlags.HasFlag(ContextMenuType.Editable)){
                 model.AddItem(MenuSearchInBrowser, "Search in browser");
                 model.AddSeparator();
                 model.AddItem(MenuReadApplyROT13, "Apply ROT13");
                 model.AddSeparator();
             }
-
-            bool hasTweetImage = LastLink.IsImage;
-            bool hasTweetVideo = LastLink.IsVideo;
-
+            
             string TextOpen(string name) => "Open "+name+" in browser";
             string TextCopy(string name) => "Copy "+name+" address";
             string TextSave(string name) => "Save "+name+" as...";
+
+            ContextInfo.LinkType type = LastLink.Type;
             
-            if (parameters.TypeFlags.HasFlag(ContextMenuType.Link) && !parameters.UnfilteredLinkUrl.EndsWith("tweetdeck.twitter.com/#", StringComparison.Ordinal) && !hasTweetImage && !hasTweetVideo){
-                if (TwitterUtils.RegexAccount.IsMatch(parameters.UnfilteredLinkUrl)){
+            if (type == ContextInfo.LinkType.Generic && !LastLink.UnsafeUrl.EndsWith("tweetdeck.twitter.com/#", StringComparison.Ordinal)){
+                if (TwitterUtils.RegexAccount.IsMatch(LastLink.UnsafeUrl)){
                     model.AddItem(MenuOpenLinkUrl, TextOpen("account"));
                     model.AddItem(MenuCopyLinkUrl, TextCopy("account"));
                     model.AddItem(MenuCopyUsername, "Copy account username");
@@ -83,14 +86,13 @@ public virtual void OnBeforeContextMenu(IWebBrowser browserControl, IBrowser bro
 
                 model.AddSeparator();
             }
-
-            if (hasTweetVideo){
+            else if (type == ContextInfo.LinkType.Video){
                 model.AddItem(MenuOpenMediaUrl, TextOpen("video"));
                 model.AddItem(MenuCopyMediaUrl, TextCopy("video"));
                 model.AddItem(MenuSaveMedia, TextSave("video"));
                 model.AddSeparator();
             }
-            else if (((parameters.TypeFlags.HasFlag(ContextMenuType.Media) && parameters.HasImageContents) || hasTweetImage) && parameters.SourceUrl != TweetNotification.AppLogo.Url){
+            else if (type == ContextInfo.LinkType.Image && LastLink.Url != TweetNotification.AppLogo.Url){
                 model.AddItem(MenuViewImage, "View image in photo viewer");
                 model.AddItem(MenuOpenMediaUrl, TextOpen("image"));
                 model.AddItem(MenuCopyMediaUrl, TextCopy("image"));
@@ -109,25 +111,28 @@ public virtual bool OnContextMenuCommand(IWebBrowser browserControl, IBrowser br
 
             switch(commandId){
                 case MenuOpenLinkUrl:
-                    OpenBrowser(control, LastLink.GetUrl(parameters, true));
+                    OpenBrowser(control, LastLink.Url);
                     break;
 
                 case MenuCopyLinkUrl:
-                    SetClipboardText(control, LastLink.GetUrl(parameters, false));
+                    SetClipboardText(control, LastLink.UnsafeUrl);
                     break;
 
-                case MenuCopyUsername:
-                    Match match = TwitterUtils.RegexAccount.Match(parameters.UnfilteredLinkUrl);
-                    SetClipboardText(control, match.Success ? match.Groups[1].Value : parameters.UnfilteredLinkUrl);
+                case MenuCopyUsername: {
+                    string url = LastLink.UnsafeUrl;
+                    Match match = TwitterUtils.RegexAccount.Match(url);
+
+                    SetClipboardText(control, match.Success ? match.Groups[1].Value : url);
                     control.InvokeAsyncSafe(analytics.AnalyticsFile.CopiedUsernames.Trigger);
                     break;
+                }
 
                 case MenuOpenMediaUrl:
-                    OpenBrowser(control, TwitterUtils.GetMediaLink(LastLink.GetMediaSource(parameters), ImageQuality));
+                    OpenBrowser(control, TwitterUtils.GetMediaLink(LastLink.Url, ImageQuality));
                     break;
 
                 case MenuCopyMediaUrl:
-                    SetClipboardText(control, TwitterUtils.GetMediaLink(LastLink.GetMediaSource(parameters), ImageQuality));
+                    SetClipboardText(control, TwitterUtils.GetMediaLink(LastLink.Url, ImageQuality));
                     break;
 
                 case MenuViewImage: {
@@ -142,7 +147,7 @@ void ViewImage(string path){
                         }
                     }
 
-                    string url = LastLink.GetMediaSource(parameters);
+                    string url = LastLink.Url;
                     string file = Path.Combine(BrowserCache.CacheFolder, TwitterUtils.GetImageFileName(url) ?? Path.GetRandomFileName());
 
                     control.InvokeAsyncSafe(() => {
@@ -164,8 +169,8 @@ void ViewImage(string path){
                 }
 
                 case MenuSaveMedia: {
-                    bool isVideo = LastLink.IsVideo;
-                    string url = LastLink.GetMediaSource(parameters);
+                    bool isVideo = LastLink.Type == ContextInfo.LinkType.Video;
+                    string url = LastLink.Url;
                     string username = LastChirp.Authors.LastOrDefault();
                     
                     control.InvokeAsyncSafe(() => {
diff --git a/Core/Management/ContextInfo.cs b/Core/Management/ContextInfo.cs
index 5e9bc8a9..4fc93743 100644
--- a/Core/Management/ContextInfo.cs
+++ b/Core/Management/ContextInfo.cs
@@ -25,25 +25,46 @@ public void Reset(){
 
         // Data structures
 
+        public enum LinkType{
+            Unknown, Generic, Image, Video
+        }
+
         public struct LinkInfo{
-            public bool IsLink => type == "link";
-            public bool IsImage => type == "image";
-            public bool IsVideo => type == "video";
+            public LinkType Type { get; }
 
-            public string GetUrl(IContextMenuParams parameters, bool safe){
-                return IsLink ? url : (safe ? parameters.LinkUrl : parameters.UnfilteredLinkUrl);
-            }
-
-            public string GetMediaSource(IContextMenuParams parameters){
-                return IsImage || IsVideo ? url : parameters.SourceUrl;
-            }
-
-            private readonly string type;
-            private readonly string url;
+            public string Url { get; }
+            public string UnsafeUrl { get; }
 
             public LinkInfo(string type, string url){
-                this.type = type;
-                this.url = url;
+                switch(type){
+                    case "link":  Type = LinkType.Generic; break;
+                    case "image": Type = LinkType.Image;   break;
+                    case "video": Type = LinkType.Video;   break;
+                    default:      Type = LinkType.Unknown; break;
+                }
+
+                Url = url;
+                UnsafeUrl = url;
+            }
+
+            public LinkInfo(IContextMenuParams parameters){
+                ContextMenuType type = parameters.TypeFlags;
+
+                if (type.HasFlag(ContextMenuType.Media) && parameters.HasImageContents){
+                    Type = LinkType.Image;
+                    Url = parameters.SourceUrl;
+                    UnsafeUrl = parameters.SourceUrl;
+                }
+                else if (type.HasFlag(ContextMenuType.Link)){
+                    Type = LinkType.Generic;
+                    Url = parameters.LinkUrl;
+                    UnsafeUrl = parameters.UnfilteredLinkUrl;
+                }
+                else{
+                    Type = LinkType.Unknown;
+                    Url = string.Empty;
+                    UnsafeUrl = string.Empty;
+                }
             }
         }
 
diff --git a/Resources/Scripts/code.js b/Resources/Scripts/code.js
index 8c55b1d0..a5283c3e 100644
--- a/Resources/Scripts/code.js
+++ b/Resources/Scripts/code.js
@@ -640,7 +640,7 @@
       else if (me.classList.contains("js-gif-play")){
         $TD.setRightClickedLink("video", $(this).closest(".js-media-gif-container").find("video").attr("src"));
       }
-      else{
+      else if (me.hasAttribute("data-full-url")){
         $TD.setRightClickedLink("link", me.getAttribute("data-full-url"));
       }
     });