diff --git a/src/api/icons.rs b/src/api/icons.rs
index f403c69504be3af099d945f8bca3c12bdc025636..0bac31c025c88d9d8c0cfe631ce8a127b1ad93f3 100644
--- a/src/api/icons.rs
+++ b/src/api/icons.rs
@@ -104,9 +104,6 @@ fn get_icon(domain: &str) -> Vec<u8> {
         return FALLBACK_ICON.to_vec();
     }
 
-    // Create icon_cache_folder before fetching
-    create_dir_all(&CONFIG.icon_cache_folder()).expect("Error creating icon cache");
-
     // Get the icon, or fallback in case of error
     match download_icon(&domain) {
         Ok(icon) => {
@@ -115,7 +112,9 @@ fn get_icon(domain: &str) -> Vec<u8> {
         }
         Err(e) => {
             error!("Error downloading icon: {:?}", e);
-            mark_negcache(&path);
+            let miss_indicator = path.to_owned() + ".miss";
+            let empty_icon = Vec::new();
+            save_icon(&miss_indicator, &empty_icon);
             FALLBACK_ICON.to_vec()
         }
     }
@@ -171,11 +170,6 @@ fn icon_is_negcached(path: &str) -> bool {
     }
 }
 
-fn mark_negcache(path: &str) {
-    let miss_indicator = path.to_owned() + ".miss";
-    File::create(&miss_indicator).expect("Error creating negative cache marker");
-}
-
 fn icon_is_expired(path: &str) -> bool {
     let expired = file_is_expired(path, CONFIG.icon_cache_ttl());
     expired.unwrap_or(true)
@@ -398,9 +392,17 @@ fn download_icon(domain: &str) -> Result<Vec<u8>, Error> {
 }
 
 fn save_icon(path: &str, icon: &[u8]) {
-    if let Ok(mut f) = File::create(path) {
-        f.write_all(icon).expect("Error writing icon file");
-    };
+    match File::create(path) {
+        Ok(mut f) => {
+            f.write_all(icon).expect("Error writing icon file");
+        }
+        Err(ref e) if e.kind() == std::io::ErrorKind::NotFound => {
+            create_dir_all(&CONFIG.icon_cache_folder()).expect("Error creating icon cache");
+        }
+        Err(e) => {
+            info!("Icon save error: {:?}", e);
+        }
+    }
 }
 
 fn _header_map() -> HeaderMap {
diff --git a/src/main.rs b/src/main.rs
index c23eca6fe393a59b059641125359c9f3a43fc113..862b53b1f6819d46527dc4ac84ba4943e616bf55 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -25,6 +25,7 @@ extern crate num_derive;
 use std::{
     path::Path,
     process::{exit, Command},
+    fs::create_dir_all,
 };
 
 #[macro_use]
@@ -52,6 +53,8 @@ fn main() {
     check_web_vault();
     migrations::run_migrations();
 
+    create_icon_cache_folder();
+
     launch_rocket();
 }
 
@@ -129,8 +132,7 @@ fn check_db() {
         let path = Path::new(&url);
 
         if let Some(parent) = path.parent() {
-            use std::fs;
-            if fs::create_dir_all(parent).is_err() {
+            if create_dir_all(parent).is_err() {
                 error!("Error creating database directory");
                 exit(1);
             }
@@ -148,6 +150,11 @@ fn check_db() {
     db::get_connection().expect("Can't connect to DB");
 }
 
+fn create_icon_cache_folder() {
+    // Try to create the icon cache folder, and generate an error if it could not.
+    create_dir_all(&CONFIG.icon_cache_folder()).expect("Error creating icon cache directory");
+}
+
 fn check_rsa_keys() {
     // If the RSA keys don't exist, try to create them
     if !util::file_exists(&CONFIG.private_rsa_key()) || !util::file_exists(&CONFIG.public_rsa_key()) {