 		NSNotificationCenter.defaultCenter().removeObserver(self)
 	}
 
-	func fetchPromotion() {
-		AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper().load(Promotion.PromotionDB.self, hashKey: unique, rangeKey: nil).continueWithSuccessBlock{ task in
-			if let result = task.result as? Promotion.PromotionDB where result.venue != nil {
-				dispatch_async(dispatch_get_main_queue()) { self.promotion = Promotion(data: result, venue: self) }
-			} else {
-				self.promotion = nil
+	func fetchPromotion(withTimeliness timely: NSTimeInterval = 0) {
+		if abs(lastPromotionFetchStatus.completed.timeIntervalSinceNow) > timely || lastPromotionFetchStatus.error != nil {
+			if !isPromotionFetching {
+				isPromotionFetching = true
+				AWSDynamoDBObjectMapper.defaultDynamoDBObjectMapper().load(Promotion.PromotionDB.self, hashKey: unique, rangeKey: nil).continueWithBlock{ task in
+					if !task.faulted {
+						if let result = task.result as? Promotion.PromotionDB where result.venue != nil {
+							dispatch_async(dispatch_get_main_queue()) { self.promotion = Promotion(data: result, venue: self) }
+						} else {
+							self.promotion = nil
+						}
+					}
+
+					self.isPromotionFetching = false
+					self.lastPromotionFetchStatus = FetchStatus(completed: NSDate(), error: task.error)
+
+					return nil
+				}
 			}
-			
-			return nil
 		}
 	}
 

	private(set) var lastFetchStatus = FetchStatus(completed: NSDate(timeIntervalSince1970: 0), error: nil)
	private(set) var isFetching = false

	var ads: [Advertisement] {
		return Advertisement.apropos(unique, ofFeed: Advertisement.FeedCategory.Venue) ?? []
	}

		self.vicinity = vicinity
		self.location = location

		NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("sieveOffendingSamples"), name: Defensive.OffensiveMuteUpdateNotification, object: nil)
	}

