 
     let filename = keyboard.filename
 
-    if downloadQueue != nil {
-      // Download queue is active.
-      let error = NSError(domain: "Keyman", code: 0,
-                          userInfo: [NSLocalizedDescriptionKey: "Download queue is busy"])
-      downloadFailed(forKeyboards: installableKeyboards, error: error)
-      return
-    }
-
-    if reachability.connection == Reachability.Connection.none {
-      let error = NSError(domain: "Keyman", code: 0, userInfo: [NSLocalizedDescriptionKey: "No internet connection"])
-      downloadFailed(forKeyboards: installableKeyboards, error: error)
-      return
-    }
-
-    do {
-      try FileManager.default.createDirectory(at: Storage.active.keyboardDir(forID: keyboard.id),
-                                              withIntermediateDirectories: true)
-    } catch {
-      log.error("Could not create dir for download: \(error)")
+    // Perform the standard 'ready-to-download' checks.
+    if !checkCanDownload(keyboards: installableKeyboards) {
       return
     }
 

    downloadQueue!.userInfo = commonUserData

    // We're only installing a single keyboard, even if for multiple languages.  We should only do the actual 'download' task once.
    let dlBatch = buildKeyboardDownloadBatch( for: installableKeyboards[0], withOptions: keyboardAPI.options, withFilename: filename,
                                              asActivity: .download, with: commonUserData)

    downloadQueue = HTTPDownloader(self)
    downloadQueue!.userInfo = commonUserData
    
    dlBatch?.tasks.forEach { task in
      downloadQueue!.addRequest(task.request)
    }
    
    downloadQueue!.run()
  }
  
  private func buildKeyboardDownloadBatch(for keyboard: InstallableKeyboard, withOptions options: Options, withFilename filename: String,

      return
    }

    // Perform common 'can download' check.  We need positive reachability and no prior download queue.
    if !checkCanDownload(keyboards: [keyboard]) {
      return
    }

