 		callback:(data: AnyObject?, lastPage: Bool, resultCode: Int, etag: String?) -> Void) {
 
 			get(path, fromServer: fromServer, ignoreLastSync: false, parameters: parameters, extraHeaders: extraHeaders,
-				success: { [weak self] response, data in
-
-					let allHeaders = response!.allHeaderFields
-					fromServer.requestsRemaining = NSNumber(longLong: (allHeaders["X-RateLimit-Remaining"] as! NSString).longLongValue)
-					fromServer.requestsLimit = NSNumber(longLong: (allHeaders["X-RateLimit-Limit"] as! NSString).longLongValue)
-					let epochSeconds = (allHeaders["X-RateLimit-Reset"] as! NSString).doubleValue
-					fromServer.resetDate = NSDate(timeIntervalSince1970: epochSeconds)
-					NSNotificationCenter.defaultCenter().postNotificationName(API_USAGE_UPDATE, object: fromServer, userInfo: nil)
-
-					let etag = allHeaders["Etag"] as? String
-					let code = response!.statusCode ?? 0
-					callback(data: data, lastPage: self!.lastPage(response!), resultCode: code, etag: etag)
-
-				}, failure: { response, data, error in
+				completion: { [weak self] response, data, error in
+
 					let code = response?.statusCode ?? 0
-					if code != 304 {
-						DLog("(%@) Failure for %@: %@", fromServer.label, path, error?.localizedDescription)
+
+					if error == nil {
+						let allHeaders = response!.allHeaderFields
+						fromServer.requestsRemaining = NSNumber(longLong: (allHeaders["X-RateLimit-Remaining"] as! NSString).longLongValue)
+						fromServer.requestsLimit = NSNumber(longLong: (allHeaders["X-RateLimit-Limit"] as! NSString).longLongValue)
+						let epochSeconds = (allHeaders["X-RateLimit-Reset"] as! NSString).doubleValue
+						fromServer.resetDate = NSDate(timeIntervalSince1970: epochSeconds)
+						NSNotificationCenter.defaultCenter().postNotificationName(API_USAGE_UPDATE, object: fromServer, userInfo: nil)
+
+						let etag = allHeaders["Etag"] as? String
+						callback(data: data, lastPage: self!.lastPage(response!), resultCode: code, etag: etag)
+					} else {
+						callback(data: nil, lastPage: false, resultCode: code, etag: nil)
 					}
-					callback(data: nil, lastPage: false, resultCode: code, etag: nil)
-			})
+				})
 	}
 
 	private func get(

				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
						DLog("New event at %@", eventDate)
						if let repoId = d["repo"]?["id"] as? NSNumber {
							repoIdsToMarkDirty.insert(repoId)
						}
						if latestDate.compare(eventDate) == NSComparisonResult.OrderedAscending {

					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)
						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?
				var error = e

				if error == nil && (response == nil || response?.statusCode > 399) {
					error = NSError(domain: "Error response received", code:response!.statusCode, userInfo:nil)
				}

				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 {
