             let nearbyObjects = results as! [BRCDataObject]
             let options = BRCDataSorterOptions()
             BRCDataSorter.sortDataObjects(nearbyObjects, options: options, completionQueue: dispatch_get_main_queue(), callbackBlock: { (events, art, camps) -> (Void) in
-                self.nearbyArt = art
-                self.nearbyEvents = events
-                self.nearbyCamps = camps
+                var sections: [TableViewSection] = []
+                if events.count > 0 {
+                    let eventsSection = TableViewSection(objects: events, sectionTitle: ObjectType.Events)
+                    sections.append(eventsSection)
+                }
+                if art.count > 0 {
+                    let artSection = TableViewSection(objects: art, sectionTitle: ObjectType.Art)
+                    sections.append(artSection)
+                }
+                if camps.count > 0 {
+                    let campsSection = TableViewSection(objects: camps, sectionTitle: ObjectType.Camps)
+                    sections.append(campsSection)
+                }
+                self.sections = sections
                 if BRCDatabaseManager.sharedInstance().rTreeIndex != nil {
                     self.emptyListText = EmptyListLabelText.Nothing
                 }

            return cell
        }
        
        var dataObject: BRCDataObject? = nil
        let tableSection = TableSection(rawValue: indexPath.section)!
        let row = indexPath.row
        switch tableSection {
        case TableSection.Events:
            dataObject = nearbyEvents[row]
        case TableSection.Camps:
            dataObject = nearbyCamps[row]
        case TableSection.Art:
            dataObject = nearbyArt[row]
        }
        
        let dataObjectClass = dataObject!.dynamicType
        let cellClass: (AnyClass!) = BRCDataObjectTableViewCell.cellClassForDataObjectClass(dataObjectClass)
        let reuseIdentifier = cellClass.cellIdentifier()
        let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier, forIndexPath: indexPath) as! BRCDataObjectTableViewCell
        cell.dataObject = dataObject
        cell.updateDistanceLabelFromLocation(getCurrentLocation())
        cell.favoriteButtonAction = { () -> Void in
            let dataCopy = dataObject!.copy() as! BRCDataObject
            dataCopy.isFavorite = cell.favoriteButton.selected
            BRCDatabaseManager.sharedInstance().readWriteConnection!.asyncReadWriteWithBlock({ (transaction: YapDatabaseReadWriteTransaction) -> Void in
                transaction.setObject(dataCopy, forKey: dataCopy.uniqueID, inCollection: dataCopy.dynamicType.collection())

        if !hasNearbyObjects() {
            return 1
        }
        return sections.count
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if !hasNearbyObjects() {
            return 1
        }
        return sections[section].objects.count
    }
    
    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        if !hasNearbyObjects() {
            return nil
        }
        return sections[section].sectionTitle.rawValue
    }
    
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
