 
 private extension Siren {
 
-    func iTunesURLFromString() -> NSURL {
-
-        var storeURLString = "https://itunes.apple.com/lookup?id=\(appID!)"
+    func iTunesURLFromString() throws -> NSURL {
+
+        let components = NSURLComponents()
+        components.scheme = "https"
+        components.host = "itunes.apple.com"
+        components.path = "/lookup"
+
+        var items: [NSURLQueryItem] = [NSURLQueryItem(name: "id", value: appID)]
 
         if let countryCode = countryCode {
-            storeURLString += "&country=\(countryCode)"
-        }
-
-        printMessage("iTunes Lookup URL: \(storeURLString)")
-
-        return NSURL(string: storeURLString)!
+            let item = NSURLQueryItem(name: "country", value: countryCode)
+            items.append(item)
+        }
+
+        components.queryItems = items
+
+        guard let url = components.URL where !url.absoluteString.isEmpty else {
+            throw SirenErrorType.MalformedURL
+        }
+
+        return url
     }
 
     func daysSinceLastVersionCheckDate(lastVersionCheckPerformedOnDate: NSDate) -> Int {

    private func performVersionCheck() {
        
        // Create Request
        let itunesURL = iTunesURLFromString()
        let request = NSMutableURLRequest(URL: itunesURL)
        request.HTTPMethod = "GET"
        
        // Perform Request
        let session = NSURLSession.sharedSession()
        let task = session.dataTaskWithRequest(request, completionHandler: { [unowned self] (data, response, error) in
            
            if let error = error {
                self.postError(.AppStoreDataRetrievalFailure, underlyingError: error)
            } else {

                guard let data = data else {
                    self.postError(.AppStoreDataRetrievalFailure, underlyingError: nil)
                    return
                }
                
                // Convert JSON data to Swift Dictionary of type [String: AnyObject]
                do {

                    let jsonData = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.AllowFragments)
                    
                    guard let appData = jsonData as? [String: AnyObject] else {
                        self.postError(.AppStoreJSONParsingFailure, underlyingError: nil)
                        return
                    }
                    
                    dispatch_async(dispatch_get_main_queue()) {
                        
                        // Print iTunesLookup results from appData
                        self.printMessage("JSON results: \(appData)")
                        
                        // Process Results (e.g., extract current version that is available on the AppStore)
                        self.processVersionCheckResults(appData)
                        
                    }
                    
                } catch let error as NSError {
                    self.postError(.AppStoreDataRetrievalFailure, underlyingError: error)
                }
            }
            
        })
        
        task.resume()
    }
    
    private func processVersionCheckResults(lookupResults: [String: AnyObject]) {

        let description: String

        switch code {
        case .MalformedURL:
            description = "The iTunes URL is malformed. Please leave an issue on http://github.com/ArtSabintsev/Siren with as many details as possible."
        case .NoUpdateAvailable:
            description = "No new update available."
        case .AppStoreDataRetrievalFailure:
