diff --git a/Resources/Scripts/code.js b/Resources/Scripts/code.js
index 79fa04c6..17597516 100644
--- a/Resources/Scripts/code.js
+++ b/Resources/Scripts/code.js
@@ -204,13 +204,15 @@
   //
   // Block: Enable popup notifications.
   //
-  TD.controller.notifications.hasNotifications = function(){
-    return true;
-  };
+  if (ensurePropertyExists(TD, "controller", "notifications")){
+    TD.controller.notifications.hasNotifications = function(){
+      return true;
+    };
 
-  TD.controller.notifications.isPermissionGranted = function(){
-    return true;
-  };
+    TD.controller.notifications.isPermissionGranted = function(){
+      return true;
+    };
+  }
   
   $.subscribe("/notifications/new", function(obj){
     for(let index = obj.items.length-1; index >= 0; index--){
@@ -554,6 +556,10 @@
       }
     });
     
+    if (!ensurePropertyExists(TD, "vo", "Column", "prototype", "clear")){
+      return;
+    }
+    
     TD.vo.Column.prototype.clear = prependToFunction(TD.vo.Column.prototype.clear, function(){
       window.setTimeout(resetActiveFocus, 0); // unfocuses the Clear button, otherwise it steals keyboard input
       
@@ -576,7 +582,11 @@
     };
     
     $(".js-drawer[data-drawer='compose']").delegate(".js-account-list > .js-account-item", "click", toggleEventShiftKey);
-
+    
+    if (!ensurePropertyExists(TD, "components", "AccountSelector", "prototype", "refreshPostingAccounts")){
+      return;
+    }
+    
     TD.components.AccountSelector.prototype.refreshPostingAccounts = appendToFunction(TD.components.AccountSelector.prototype.refreshPostingAccounts, function(){
       if (!this.$node.attr("td-account-selector-hook")){
         this.$node.attr("td-account-selector-hook", "1");
@@ -631,6 +641,10 @@
   (function(){
     var cancelModal = false;
     
+    if (!ensurePropertyExists(TD, "components", "MediaGallery", "prototype", "_loadTweet") ||
+        !ensurePropertyExists(TD, "components", "BaseModal", "prototype", "setAndShowContainer") ||
+        !ensurePropertyExists(TD, "ui", "Column", "prototype", "playGifIfNotManuallyPaused"))return;
+    
     TD.components.MediaGallery.prototype._loadTweet = appendToFunction(TD.components.MediaGallery.prototype._loadTweet, function(){
       var media = this.chirp.getMedia().find(media => media.mediaId === this.clickedMediaEntityId);
 
@@ -662,38 +676,53 @@
   //
   // Block: Fix youtu.be previews not showing up for https links.
   //
-  TD.services.TwitterMedia.YOUTUBE_TINY_RE = new RegExp(TD.services.TwitterMedia.YOUTUBE_TINY_RE.source.replace("http:", "https?:"));
-  TD.services.TwitterMedia.YOUTUBE_RE = new RegExp(TD.services.TwitterMedia.YOUTUBE_LONG_RE.source+"|"+TD.services.TwitterMedia.YOUTUBE_TINY_RE.source);
-  TD.services.TwitterMedia.SERVICES["youtube"] = TD.services.TwitterMedia.YOUTUBE_RE;
+  if (ensurePropertyExists(TD, "services", "TwitterMedia")){
+    var media = TD.services.TwitterMedia;
+    
+    if (!ensurePropertyExists(media, "YOUTUBE_TINY_RE") ||
+        !ensurePropertyExists(media, "YOUTUBE_LONG_RE") ||
+        !ensurePropertyExists(media, "YOUTUBE_RE") ||
+        !ensurePropertyExists(media, "SERVICES", "youtube"))return;
+    
+    media.YOUTUBE_TINY_RE = new RegExp(media.YOUTUBE_TINY_RE.source.replace("http:", "https?:"));
+    media.YOUTUBE_RE = new RegExp(media.YOUTUBE_LONG_RE.source+"|"+media.YOUTUBE_TINY_RE.source);
+    media.SERVICES["youtube"] = media.YOUTUBE_RE;
+  }
   
   //
   // Block: Fix DM reply input box not getting focused after opening a conversation.
   //
-  TD.components.ConversationDetailView.prototype.showChirp = appendToFunction(TD.components.ConversationDetailView.prototype.showChirp, function(){
-    setTimeout(function(){
-      $(".js-reply-tweetbox").first().focus();
-    }, 100);
-  });
+  if (ensurePropertyExists(TD, "components", "ConversationDetailView", "prototype", "showChirp")){
+    TD.components.ConversationDetailView.prototype.showChirp = appendToFunction(TD.components.ConversationDetailView.prototype.showChirp, function(){
+      setTimeout(function(){
+        $(".js-reply-tweetbox").first().focus();
+      }, 100);
+    });
+  }
   
   //
   // Block: Fix DM notifications not showing if the conversation is open.
   //
-  (function(prevFunc){
+  if (ensurePropertyExists(TD, "services", "TwitterConversation", "prototype", "getUnreadChirps")){
+    var prevFunc = TD.services.TwitterConversation.prototype.getUnreadChirps;
+    
     TD.services.TwitterConversation.prototype.getUnreadChirps = function(e){
       return (e && e.sortIndex && !e.id && !this.notificationsDisabled)
         ? this.messages.filter(t => t.chirpType === TD.services.ChirpBase.MESSAGE && !t.isOwnChirp() && !t.read && !t.belongsBelow(e)) // changed from belongsAbove
         : prevFunc.apply(this, arguments);
     };
-  })(TD.services.TwitterConversation.prototype.getUnreadChirps);
+  }
   
   //
   // Block: Disable TweetDeck metrics.
   //
-  TD.metrics.inflate = function(){};
-  TD.metrics.inflateMetricTriple = function(){};
-  TD.metrics.log = function(){};
-  TD.metrics.makeKey = function(){};
-  TD.metrics.send = function(){};
+  if (ensurePropertyExists(TD, "metrics")){
+    TD.metrics.inflate = function(){};
+    TD.metrics.inflateMetricTriple = function(){};
+    TD.metrics.log = function(){};
+    TD.metrics.makeKey = function(){};
+    TD.metrics.send = function(){};
+  }
   
   onAppReady.push(function(){
     let data = $._data(window);
@@ -718,7 +747,9 @@
   //
   // Block: Skip the initial pre-login page.
   //
-  TD.controller.init.showLogin = function(){
-    location.href = "https://twitter.com/login?hide_message=true&redirect_after_login=https%3A%2F%2Ftweetdeck.twitter.com%2F%3Fvia_twitter_login%3Dtrue";
-  };
+  if (ensurePropertyExists(TD, "controller", "init", "showLogin")){
+    TD.controller.init.showLogin = function(){
+      location.href = "https://twitter.com/login?hide_message=true&redirect_after_login=https%3A%2F%2Ftweetdeck.twitter.com%2F%3Fvia_twitter_login%3Dtrue";
+    };
+  }
 })($, $TD, $TDX, TD);