         let request = requestForPath("contests", queryItems: queryItems)
 
         return NSURLSession.sharedSession().rac_dataWithRequest(request)
-            .map { data, response in
-                if let json = try? NSJSONSerialization.JSONObjectWithData(data, options: []),
-                    contests: [Contest] = decode(json) {
-                        return contests
-                } else {
-                    return []
-                }
-            }
+            .attemptMap(decodeModels)
     }
 
     // MARK: - Performances

        let request = requestForPath(path, queryItems: queryItems)

        return NSURLSession.sharedSession().rac_dataWithRequest(request)
            .attemptMap(decodePerformances)
    }

    // MARK: - Private Helpers

        return NSURLRequest(URL: components.URL!)
    }

    private func decodeModels<Model: Decodable where Model == Model.DecodedType>(data data: NSData, response: NSURLResponse) -> Result<[Model], NSError> {
        if let json = try? NSJSONSerialization.JSONObjectWithData(data, options: []),
            models: [Model] = decode(json) {
                return .Success(models)
        } else {
            let error = NSError(domain: errorDomain, code: StoreError.ParsingError.rawValue, userInfo: nil)
            return .Failure(error)
