 					DLog("(%@) Preempted fetch to previously broken link %@, won't actually access this URL until %@", apiServerLabel, fullUrlPath, existingBackOff!.nextAttemptAt)
 					dispatch_async(dispatch_get_main_queue()) {
 						let e = NSError(domain: "Preempted fetch because of throttling", code: 400, userInfo: nil)
-						failure(response: nil, data: nil, error: e)
+						completion(response: nil, data: nil, error: e)
 					}
 					#if os(iOS)
 						networkIndicationEnd()
 					#endif
 					return
 				}
+				else {
+					badLinks.removeValueForKey(fullUrlPath)
+				}
 			}
 
 			urlSession.dataTaskWithRequest(r) { [weak self] data, res, e in
 
 				let response = res as? NSHTTPURLResponse
 				var parsedData: AnyObject?
-				if data?.length > 0 {
-					parsedData = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.allZeros, error: nil)
-				}
 				var error = e
-				if error == nil && response?.statusCode > 299 {
+
+				if error == nil && (response == nil || response?.statusCode > 399) {
 					error = NSError(domain: "Error response received", code:response!.statusCode, userInfo:nil)
-					if response?.statusCode >= 400 {
+				}
+
+				if error == nil {
+					DLog("(%@) GET %@ - RESULT: %d", apiServerLabel, fullUrlPath, response?.statusCode)
+					if let d = data {
+						parsedData = NSJSONSerialization.JSONObjectWithData(d, options: NSJSONReadingOptions.allZeros, error: nil)
+					}
+				} else {
+					if self?.currentNetworkStatus != NetworkStatus.NotReachable {
 						if existingBackOff != nil {
 							DLog("(%@) Extending backoff for already throttled URL %@ by %f seconds", apiServerLabel, fullUrlPath, BACKOFF_STEP)
 							if existingBackOff!.duration < 3600.0 {

		let repoFullName = r.repo.fullName ?? "NoRepoFullName"
		let repoNumber = r.number?.stringValue ?? "NoRepoNumber"
		get("/repos/\(repoFullName)/pulls/\(repoNumber)", fromServer: r.apiServer, ignoreLastSync: false, parameters: nil, extraHeaders: nil,
			success: { [weak self] response, data in

				if let mergeInfo = (data as? NSDictionary)?.ofk("merged_by") as? NSDictionary {
					DLog("detected merged PR: %@", r.title)

					let mergeUserId = mergeInfo.ofk("id") as? NSNumber ?? -2
					DLog("merged by user id: %@, our id is: %@", mergeUserId, r.apiServer.userId)

					let mergedByMyself = mergeUserId.isEqualToNumber(r.apiServer.userId ?? -1)

					if !(mergedByMyself && Settings.dontKeepPrsMergedByMe) {
						self!.prWasMerged(r)
					} else {
						DLog("will not announce merged PR: %@", r.title)
					}
				} else {
					self!.prWasClosed(r)
				}
				callback()

			}, failure: { [weak self] response, data, error in
				let resultCode = response?.statusCode ?? 0
				if resultCode == 404 || resultCode==410 { // PR gone for good
					self!.prWasClosed(r)
				} else { // fetch problem
					r.postSyncAction = PostSyncAction.DoNothing.rawValue // don't delete this, we couldn't check, play it safe
					r.apiServer.lastSyncSucceeded = false
				}
				callback()
		})
	}

	private func prWasMerged(r: PullRequest) {

				for d in data ?? [] {
					let eventDate = syncDateFormatter.dateFromString(d.ofk("created_at") as! String)!
					if latestDate.compare(eventDate) == NSComparisonResult.OrderedAscending { // this is where we came in
						if let repoId = d["repo"]?["id"] as? NSNumber {
							DLog("New event at %@ from Repo ID %@", eventDate, repoId)
							repoIdsToMarkDirty.insert(repoId)
						}
						if latestDate.compare(eventDate) == NSComparisonResult.OrderedAscending {
