void SyncFiles(SeriesFileInfo info) {
			Series series;
			info.State = SeriesFileInfoState.None;

			using(var db = new EpisodeTrackerDBContext()) {
				series = db.Series.SingleOrDefault(s => s.ID == info.SeriesID || s.TVDBID == info.TVDBID);

				if(series == null || series.Updated <= DateTime.Now.AddDays(-7)) {
					info.Status = "Syncing TVDB series...";
					try {
						var syncer = new TVDBSeriesSyncer {
							Name = info.SeriesName,
							TVDBID = info.TVDBID.Value,
							DownloadBanners = true
						};
						syncer.BannerDownloaded += (o, e) => info.Status = String.Format("Banners downloaded: {0}/{1}", e.Complete, e.Total);
						syncer.Sync();
					} catch(Exception e) {
						info.Status = "Error syncing with TVDB: " + e.Message;
						info.State = SeriesFileInfoState.Error;
						Logger.Error("Error syncing with TVDB: " + info.TVDBID + " - " + e);
						return;
					}
					series = db.Series.SingleOrDefault(s => s.TVDBID == info.TVDBID);
					info.Status = "Synced";
				} else if(!series.Name.Equals(info.SeriesName, StringComparison.OrdinalIgnoreCase)) {
					// Save alias
					if(!db.Series.Any(s => s.Name == info.SeriesName) && !db.SeriesAliases.Any(a => a.Name == info.SeriesName)) {
						db.SeriesAliases.Add(new SeriesAlias {
							SeriesID = series.ID,
							Name = info.SeriesName
						});
					}
				}

				info.Status = "Updating episodes with file names...";
				var episodes = series.Episodes.ToList();
				foreach(var f in info.Results) {
					var eps = episodes.Where(ep =>
						f.Match.Season.HasValue
						&& ep.Season == f.Match.Season
						&& (
							ep.Number == f.Match.Episode
							|| f.Match.ToEpisode.HasValue
							&& ep.Number >= f.Match.Episode
							&& ep.Number <= f.Match.ToEpisode
						)
					);

					eps.ToList().ForEach(ep => ep.FileName = f.FileName);
				}

				try {
					db.SaveChanges();
				} catch(Exception e) {
					info.Status = "Could not update episodes: " + e.Message;
					info.State = SeriesFileInfoState.Error;
					Logger.Error("Error update episodes with file names: " + e.Message);
					return;
				}

				info.Status = "Synced";
				info.State = SeriesFileInfoState.Synced;
			}
		}
		void FindSeries(SeriesFileInfo info) {
			Series series;
			info.State = SeriesFileInfoState.None;
			info.TVDBID = null;
			info.SeriesID = null;

			using(var db = new EpisodeTrackerDBContext()) {
				var seriesName = info.SuggestedName ?? info.SeriesName;

				if(db.SeriesIgnore.Any(s => s.Name == seriesName)) {
					info.State = SeriesFileInfoState.Ignored;
					info.Status = "Ignored";
					return;
				}

				series = db.Series.SingleOrDefault(s => s.Name == seriesName || s.Aliases.Any(a => a.Name == seriesName));

				if(series == null || !series.TVDBID.HasValue) {
					info.Status = "Searching for series on TVDB...";
					TVDBSearchResult tvdbResult;
					try {
						tvdbResult = TVDBSeriesSearcher.Search(seriesName);
					} catch(Exception e) {
						info.Status = "Error searching TVDB for series: " + e.Message;
						info.State = SeriesFileInfoState.Error;
						Logger.Error("Error searching for series: " + seriesName + " - " + e);
						return;
					}

					if(tvdbResult == null) {
						info.Status = "Series does not exist on TVDB";
						info.State = SeriesFileInfoState.NotFound;
						return;
					}

					if(series == null) {
						series = db.Series.SingleOrDefault(s => s.Name == tvdbResult.Name || s.Aliases.Any(a => a.Name == tvdbResult.Name));
						if(series != null) info.SeriesID = series.ID;
					}

					info.SuggestedName = tvdbResult.Name;
					info.TVDBID = tvdbResult.ID;
				} else {
					info.SuggestedName = series.Name;
					info.TVDBID = series.TVDBID;
					info.SeriesID = series.ID;

					// Confirmed series, check if there's any new files
					var episodes = series.Episodes.ToList();
					List<EpisodeFileSearchResult> newFiles = new List<EpisodeFileSearchResult>();

					foreach(var f in info.Results) {
						var eps = episodes.WhereTVMatch(f.Match);

						if(eps.Any(ep => ep.FileName != f.FileName)) {
							newFiles.Add(f);
						}
					}

					info.Results = newFiles;

					if(!newFiles.Any()) {
						info.State = SeriesFileInfoState.Ignored;
						return;
					}
				}

				info.Status = "Found series info: " + info.TVDBID;
				info.State = SeriesFileInfoState.Found;
			}
		}