Index: DB Classes/DBOptions.cs
===================================================================
--- DB Classes/DBOptions.cs	(revision 1974)
+++ DB Classes/DBOptions.cs	(working copy)
@@ -114,6 +114,7 @@
         public const String cGetBlankBanners = "getBlankBanners";
         public const String cGetTextBanners = "getTextBanners";
         public const String cGetEpisodeSnapshots = "getEpisodeSnapshots";
+        public const String cCheckArtwork = "checkArtwork";
 
         public const String cWatchedAfter = "watchedAfter";
 
@@ -207,6 +208,7 @@
         public const String cArtworkLimitSeriesWideBanners = "ArtworkLimitSeriesWideBanners";
         public const String cArtworkLimitSeriesPosters = "ArtworkLimitSeriesPosters";
         public const String cArtworkLimitSeasonPosters = "ArtworkLimitSeasonPosters";
+        public const String cMaxConsecutiveDownloadErrors = "MaxConsecutiveDownloadErrors";
 
         public const String cTraktUsername = "TraktUsername";
         public const String cTraktPassword = "TraktPassword";
@@ -301,6 +303,9 @@
 
                 if (GetOptions(cImport_DontClearMissingLocalFiles) == null)
                     SetOptions(cImport_DontClearMissingLocalFiles, 0);
+
+                if (GetOptions(cCheckArtwork) == null) 
+                    SetOptions(cCheckArtwork, 1);
                 
                 if (GetOptions(cView_PluginName) == null)
                     SetOptions(cView_PluginName, "My TV Series");
@@ -591,6 +596,9 @@
                 if (GetOptions(cArtworkLimitSeasonPosters) == null)
                     SetOptions(cArtworkLimitSeasonPosters, 2); // 20 seasons = 40 posters
 
+                if (GetOptions(cMaxConsecutiveDownloadErrors) == null)
+                    SetOptions(cMaxConsecutiveDownloadErrors, 3);
+
                 if (GetOptions(cFollwitEnabled) == null)
                     SetOptions(cFollwitEnabled, false);
 
Index: imageAllocator.cs
===================================================================
--- imageAllocator.cs	(revision 1974)
+++ imageAllocator.cs	(working copy)
@@ -600,6 +600,7 @@
             catch (System.IO.FileNotFoundException fe)
             {
                 MPTVSeriesLog.Write("Image does not exist: " + filename + " - " + fe.Message);
+                return null;
             }
             catch (Exception e)
             {
Index: Online Parsing Classes/GetBanner.cs
===================================================================
--- Online Parsing Classes/GetBanner.cs	(revision 1974)
+++ Online Parsing Classes/GetBanner.cs	(working copy)
@@ -295,11 +295,25 @@
 
         public void DownloadBanners(string bannerLang)
         {
+            int maxConsecutiveDownloadErrors;
+            var consecutiveDownloadErrors = 0;
+            if (!int.TryParse(DBOption.GetOptions(DBOption.cMaxConsecutiveDownloadErrors).ToString(), out maxConsecutiveDownloadErrors))
+            {
+                maxConsecutiveDownloadErrors = 3;
+            }
+            
             // now that we have all the paths, download all the files
             foreach (SeriesBannersMap map in SeriesBannersMap)
             {
+                var seriesWideBannersToKeep = new List<WideBannerSeries>();
                 foreach (WideBannerSeries bannerSeries in map.SeriesWideBanners)
                 {
+                    if (consecutiveDownloadErrors >= maxConsecutiveDownloadErrors)
+                    {
+                        MPTVSeriesLog.Write("Too many consecutive download errors. Aborting.");
+                        return;
+                    }
+
                     if (bannerLang == bannerSeries.Language || "en" == bannerSeries.Language || "" == bannerSeries.Language) //also always english ones
                     {
                         // mark the filename with the language                        
@@ -307,24 +321,60 @@
                         
                         string file = OnlineAPI.DownloadBanner(bannerSeries.OnlinePath, Settings.Path.banners, bannerSeries.FileName);
                         if (BannerDownloadDone != null)
-                            BannerDownloadDone(file);                      
+                        {
+                            BannerDownloadDone(file);
+                            seriesWideBannersToKeep.Add(bannerSeries);
+                            consecutiveDownloadErrors = 0;
+                        } 
+                        else
+                        {
+                            consecutiveDownloadErrors++;
+                        }
                     }
                 }
-            
+
+                map.SeriesWideBanners = seriesWideBannersToKeep;
+
+                var seriesPostersToKeep = new List<PosterSeries>();
                 foreach (PosterSeries posterSeries in map.SeriesPosters)
                 {
+                    if (consecutiveDownloadErrors >= maxConsecutiveDownloadErrors)
+                    {
+                        MPTVSeriesLog.Write("Too many consecutive download errors. Aborting.");
+                        return;
+                    }
+
                     if (bannerLang == posterSeries.Language || "en" == posterSeries.Language || "" == posterSeries.Language) //also always english ones
                     {
                         // mark the filename with the language                        
                         posterSeries.FileName = Helper.cleanLocalPath(posterSeries.SeriesName) + @"\-lang" + posterSeries.Language + "-" + posterSeries.OnlinePath;                        
                         string file = OnlineAPI.DownloadBanner(posterSeries.OnlinePath, Settings.Path.banners, posterSeries.FileName);
                         if (BannerDownloadDone != null)
+                        {
                             BannerDownloadDone(file);
+                            seriesPostersToKeep.Add(posterSeries);
+                            consecutiveDownloadErrors = 0;
+                        }
+                        else
+                        {
+                            consecutiveDownloadErrors++;
+                        }
                     }
                 }
+
+                map.SeriesPosters = seriesPostersToKeep;
+
                 List<DBSeason> localSeasons = DBSeason.Get(new SQLCondition(new DBSeason(), DBSeason.cSeriesID, map.SeriesID, SQLConditionType.Equal), false);
+
+                var posterSeasonToKeep = new List<PosterSeason>();
                 foreach (PosterSeason bannerSeason in map.SeasonPosters)
                 {
+                    if (consecutiveDownloadErrors >= maxConsecutiveDownloadErrors)
+                    {
+                        MPTVSeriesLog.Write("Too many consecutive download errors. Aborting.");
+                        return;
+                    }
+
                     // only download season banners if we have online season in database
                     if (!localSeasons.Any(s => s[DBSeason.cIndex] == bannerSeason.SeasonIndex)) continue;
 
@@ -334,9 +384,19 @@
                         
                         string file = OnlineAPI.DownloadBanner(bannerSeason.OnlinePath, Settings.Path.banners, bannerSeason.FileName);
                         if (BannerDownloadDone != null)
-                            BannerDownloadDone(file);                        
+                        {
+                            BannerDownloadDone(file);
+                            posterSeasonToKeep.Add(bannerSeason);
+                            consecutiveDownloadErrors = 0;
+                        }
+                        else
+                        {
+                            consecutiveDownloadErrors++;
+                        }             
                     }
                 }
+
+                map.SeasonPosters = posterSeasonToKeep;
             }
         }
     }
Index: Online Parsing Classes/OnlineParse.cs
===================================================================
--- Online Parsing Classes/OnlineParse.cs	(revision 1974)
+++ Online Parsing Classes/OnlineParse.cs	(working copy)
@@ -48,6 +48,7 @@
         MediaInfo,
         IdentifyNewSeries,
         IdentifyNewEpisodes,
+        CheckArtwork,
 
         GetOnlineUpdates,
         UpdateSeries,
@@ -96,7 +97,8 @@
             ParsingAction.MediaInfo,
             ParsingAction.IdentifyNewSeries, 
             ParsingAction.IdentifyNewEpisodes,
-            ParsingAction.UpdateEpisodeCounts
+            ParsingAction.UpdateEpisodeCounts,
+            ParsingAction.CheckArtwork
         };
 
         private static List<ParsingAction> OnlineRefreshActions = new List<ParsingAction> { 
@@ -399,6 +401,11 @@
                         m_worker.ReportProgress(30);
                         break;
                     
+                    case ParsingAction.CheckArtwork:
+                        if (DBOption.GetOptions(DBOption.cCheckArtwork) == 1)
+                        this.CheckBanners();
+                        break;
+
                     case ParsingAction.GetOnlineUpdates:
                         if (DBOption.GetOptions(DBOption.cOnlineParseEnabled) == 1)
                             UpdateOnlineMirror();
@@ -1423,6 +1430,67 @@
         }
 
         /// <summary>
+        /// Check Banners & Posters for existence and corruption. Remove non-existent or corrupt banners from database (to re-download on UpdateBanners)
+        /// </summary>
+        private void CheckBanners()
+        {
+            MPTVSeriesLog.Write(bigLogMessage("Verifying ArtWork"));
+            var condition = new SQLCondition();
+
+            // all series that have an onlineID ( > 0)
+            condition.Add(new DBOnlineSeries(), DBSeries.cID, 0, SQLConditionType.GreaterThan);
+            condition.Add(new DBSeries(), DBSeries.cScanIgnore, 0, SQLConditionType.Equal);
+            condition.Add(new DBSeries(), DBSeries.cDuplicateLocalName, 0, SQLConditionType.Equal);
+            
+            // and that already had data imported from the online DB
+            condition.beginGroup();
+            condition.Add(new DBOnlineSeries(), DBOnlineSeries.cBannerFileNames, string.Empty, SQLConditionType.NotEqual);
+            condition.nextIsOr = true;
+            condition.Add(new DBOnlineSeries(), DBOnlineSeries.cPosterFileNames, string.Empty, SQLConditionType.NotEqual);
+            condition.nextIsOr = false;
+            condition.endGroup();
+
+            var seriesList = DBSeries.Get(condition, false, false);
+            if (seriesList.Count <= 0)
+            {
+                MPTVSeriesLog.Write("No ArtWork found to verify.");
+                return;
+            }
+
+            foreach (var series in seriesList)
+            {
+                series.BannerList = series.BannerList.Where(this.CheckArtwork).ToList();
+                series.PosterList = series.PosterList.Where(this.CheckArtwork).ToList();
+                series.Commit();
+            }
+        }
+
+        /// <summary>
+        /// Check Artwork for existence and corruption
+        /// </summary>
+        /// <param name="path">Path to file</param>
+        /// <returns>OK, not OK</returns>
+        private bool CheckArtwork(string path)
+        {
+            if (File.Exists(path))
+            {
+                var image = ImageAllocator.LoadImageFastFromFile(path);
+                if (image == null)
+                {
+                    MPTVSeriesLog.Write("Corrupt artwork: {0}. Removing.", path);
+                    return false;
+                }
+            }
+            else
+            {
+                MPTVSeriesLog.Write("Artwork not found: {0}. Removing.", path);
+                return false;
+            }
+
+            return true;
+        }
+
+        /// <summary>
         /// Gets Fanart From Online
         /// </summary>
         /// <param name="updatesOnly">set to true when processing online updates</param>
@@ -1462,6 +1530,13 @@
             }
 
             int nIndex = 0;
+            int maxConsecutiveDownloadErrors;
+            var consecutiveDownloadErrors = 0;
+            if (!int.TryParse(DBOption.GetOptions(DBOption.cMaxConsecutiveDownloadErrors).ToString(), out maxConsecutiveDownloadErrors))
+            {
+                maxConsecutiveDownloadErrors = 3;
+            }
+
             foreach (DBSeries series in seriesList)
             {
                 m_worker.ReportProgress(0, new ParsingProgress(ParsingAction.UpdateFanart, series.ToString(), ++nIndex, seriesList.Count, series, null));
@@ -1482,6 +1557,12 @@
                     // download fanart
                     foreach (DBFanart download in fanarts)
                     {
+                        if (consecutiveDownloadErrors >= maxConsecutiveDownloadErrors)
+                        {
+                            MPTVSeriesLog.Write("Too many consecutive download errors. Aborting.");
+                            return;
+                        }
+
                         string onlineFilename = download[DBFanart.cBannerPath];
                         string localFilename = onlineFilename.Replace("/", @"\");
                         
@@ -1494,12 +1575,14 @@
                             download.Commit();
 
                             m_worker.ReportProgress(0, new ParsingProgress(ParsingAction.UpdateFanart, string.Format("{0} - {1}", series.ToString(), Helper.PathCombine(Settings.GetPath(Settings.Path.fanart), localFilename)), nIndex, seriesList.Count, series, result));
+                            consecutiveDownloadErrors = 0;
                         }
                     }
                 }
                 catch (Exception ex)
                 {
                     MPTVSeriesLog.Write("Failed to update Fanart: " + ex.Message);
+                    consecutiveDownloadErrors++;
                 }
             }
             m_worker.ReportProgress(0, new ParsingProgress(ParsingAction.UpdateFanart, seriesList.Count));
