     
     //MARK: Private methods
     
+    private func setupRefresh() {
+        refreshControl = UIRefreshControl()
+        refreshControl?.tintColor = .katangaYellow
+        
+        refreshControl?.rx.controlEvent(.valueChanged)
+            .bindNext {
+                self.disposeBag = DisposeBag()
+                self.setupRx()
+            }
+            .addDisposableTo(refreshControlBag)
+        
+        tableView.addSubview(refreshControl!)
+        
+        activityIndicator
+            .drive(refreshControl!.rx.refreshing)
+            .addDisposableTo(refreshControlBag)
+    }
+    
     private func setupRx() {
     
-        //TODO Real values
-        KatangaBusApiClient()
-            .nearbyBusStops(latitude: 39.861293, longitude: -4.026146, meters: 1000)
-            .trackActivity(activityIndicator)
-            .scan([], accumulator: { $0 + [$1] })
-            .asDriver(onErrorJustReturn: [])
-            .drive(tableView.rx.items(cellType: NearBusStopCell.self)) { row, nearBusStop, cell in
+            nearBusStops?.drive(tableView.rx.items(cellType: NearBusStopCell.self)) { row, nearBusStop, cell in
                 cell.busStopName = nearBusStop.busStop.address
                 
                 let distanceFormatted = String(format: "%.2f", nearBusStop.distance)

    //MARK: Private variables
    
    private var disposeBag = DisposeBag()
    private let activityIndicator = ActivityIndicator()
    
    
    //MARK: Outlets
    

    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupRefresh()
        
        tableView.customizeTableView(withColor: .black)
        
        nearBusStops = KatangaBusApiClient()
                .nearbyBusStops(latitude: 39.861293, longitude: -4.026146, meters: 1000)
                .trackActivity(activityIndicator)
                .scan([], accumulator: { $0 + [$1] })
                .asDriver(onErrorJustReturn: [])
        
        setupRx()
    }
