   // MARK: Properties
   private var cardIndex: Int = 0
   private lazy var shareHelper: ShareHelper = ShareHelper(viewController: self)
+  private lazy var alertHelper: AlertHelper = AlertHelper(viewController: self)
 }
 
 // MARK: - Lifecycle

    }
    cardIndex += 1
    view.viewModel = viewModel
    return view
  }


  private func swipeViewDidCancelSwiping(view: LinkCardView) {
    view.animateOverlayPercentage(0)
  }

  private func swipeViewDidClickMore(view: LinkCardView) {
    guard let viewModel = view.viewModel else { return }
    viewModel.save.take(1)
      .subscribeNext { [weak self] save in
        let options = [save, tr(.LinkReport), tr(.LinkOpenInSafari)]
        self?.alertHelper.presentActionSheet(options: options) { index in
          guard let index = index else { return }
          switch index {
          case 0:
            viewModel.toggleSave { error in
            }
          case 1:
            self?.report(viewModel)
          case 2:
            self?.openInSafari(viewModel)
          default: break
          }
        }
      }.addDisposableTo(rx_disposeBag)
  }
}

// MARK: - Helpers
extension LinkSwipeViewController {

  private func openInSafari(viewModel: LinkItemViewModel) {
    UIApplication.sharedApplication().openURL(viewModel.url)
  }

  private func report(viewModel: LinkItemViewModel) {
    let reasons: [String] = [tr(.LinkReportSpam), tr(.LinkReportVoteManipulation),
                             tr(.LinkReportPersonalInfo), tr(.LinkReportSexualizingMinors),
                             tr(.LinkReportBreakingReddit), tr(.LinkReportOther)]
    alertHelper.presentActionSheet(options: reasons) { [weak self] index in
      guard let index = index else { return }
      guard index != 5 else {
        self?.reportOtherReason(viewModel)
        return
      }
      self?.reportWithReason(reasons[index], viewModel: viewModel)
    }
  }

  private func reportOtherReason(viewModel: LinkItemViewModel) {
    let textfield = AlertTextField(text: nil, placeholder: tr(.LinkReportOtherHint))
    presentAlert(tr(.LinkReport), message: tr(.LinkReportOtherReason),
                 textField: textfield, buttonTitle: tr(.LinkReport),
                 cancelButtonTitle: tr(.AlertButtonCancel)) { [weak self] alertClicked in
                  switch alertClicked {
                  case let .ButtonWithText(reason):
                    self?.reportWithReason(reason, viewModel: viewModel)
                  default: return
                  }
    }
  }

  private func reportWithReason(reason: String?, viewModel: LinkItemViewModel) {
    guard let reason = reason else { return }
    viewModel.sendReport(reason) { error in
    }
  }

  private func voteCompletion(error: ErrorType?, view: UIView) {
    guard let _ = error where swipeView.history.last == view else {
