     }
 }
 
-class WebViewController: UIViewController, WebViewControllerNavigationDelegate {
+class WebViewController: UIViewController, WKNavigationDelegate, WebViewControllerNavigationDelegate {
     static let scriptMessageHandler = ScriptMessageHandler()
     static let sharedWebView = WebViewController.createWebView(scriptMessageHandler)
 
     var URL = NSURL(string: "http://bc3.dev/195539477/")!
     var activeSessionTask: NSURLSessionTask?
     let webView = WebViewController.sharedWebView
+
+    lazy var loadingIndicator: UIActivityIndicatorView = {
+        let indicator = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge)
+        indicator.setTranslatesAutoresizingMaskIntoConstraints(false)
+        indicator.color = UIColor.grayColor()
+        return indicator
+     }()
 
     class func createWebView(scriptMessageHandler: WKScriptMessageHandler) -> WKWebView {
         let configuration = WKWebViewConfiguration()

        webView.evaluateJavaScript("Turbolinks.controller.history.push(\(serializedURL))", completionHandler: nil)
    }
    
    // MARK - WebViewControllerNavigationDelegate

    func visitLocation(location: NSURL) {
        let webViewController = WebViewController()

    private func loadResponse(response: String) {
        let serializedResponse = JSONStringify(response)
        webView.evaluateJavaScript("Turbolinks.controller.loadResponse(\(serializedResponse))", completionHandler: nil)

        // FIXME: Move this to a more appropriate time. Since JavaScript is processed async,
        // this may not be when the response is actually loaded.
        responseDidLoad()
    }
    
    private func navigateToLocation(location: NSURL) {
