         let deleteArray=[row.lastIndexPath!]
         self.deleteRows(at: deleteArray as [IndexPath],with:UITableView.RowAnimation.automatic)
     }
-
-    // filter function should return true to show row, false to hide it
+    
+    // MARK: Index
+    private var sectionIndexTitles:[String]?
+    public var sectionForIndex:Int? {
+        didSet {
+            prepareSectionIndex()
+        }
+    }
+    
+    func prepareSectionIndex() {
+        defer {
+            self.reloadSectionIndexTitles()
+        }
+        
+        guard let sectionForIndex = sectionForIndex else {
+            self.sectionIndexTitles = nil
+            return
+        }
+        
+
+        guard let section = try? sectionFor(sectionForIndex) else {
+            print("Error: Trying to index on a section that doesn't exist: \(sectionForIndex)")
+            self.sectionIndexTitles = nil
+            return
+        }
+        
+        
+        let titles = section.rows.compactMap { (info) -> String? in
+            if let substring = info.title?.prefix(1) {
+                return String(substring).uppercased()
+            }
+            return nil
+        }
+        
+        let uniqueTitles:[String] = Array(Set(titles))
+        let sortedTitles = uniqueTitles.sorted(by:{ x,y in
+            return x.localizedStandardCompare(y) == ComparisonResult.orderedAscending
+        })
+        
+        sectionIndexTitles = sortedTitles
+    
+    }
+    
+    // MARK: Manage Visibility
+
+
+    /// Filter visible rows
+    /// - Parameter showRowFunction: return true to show row, false to hide it
     public func filter(showRowFunction : HSCellFilter)
     {
         for section in sections {

        return sections[section].rows.count
    }


    // MARK UITableViewDelegate

    public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath)
    {

    }


    func sectionFor(_ index:Int) throws -> HSTVSection {
        guard (index<sections.count) else {
            throw HSTableViewError.sectionDoesNotExist(index: index)
        }

        return sections[index]
    }
    
    func infoFor(_ indexPath:IndexPath) throws -> HSTVRowInfo {

        let section = try sectionFor(indexPath.section)

        guard (indexPath.row<section.rows.count) else {
            throw HSTableViewError.rowDoesNotExist(indexPath: indexPath)
