     return nil
   }
 
-  public func column(at index: Int) -> GridColumn {
-    return columns[index]
-  }
-
-  // Note: NSGridView returns a non-optional Int
-  public func index(of column: GridColumn) -> Int? {
-    return columns.index { $0 === column }
-  }
-
-  // Note: NSGridView returns a non-optional Int
-  public func index(of row: GridRow) -> Int? {
-    return rows.index { $0 === row }
-  }
-
-  public func insertColumn(at index: Int, with views: [UIView]) -> GridColumn {
-    for _ in 0..<max(0, views.count - numberOfRows) {
-      addRow(with: [])
-    }
-
-    let column = GridColumn(gridView: self)
-    columns.insert(column, at: index)
-
-    for (rowIndex, row) in rows.enumerated() {
-      let cell = GridCell(gridView: self)
-      cell.contentView = views[safe:rowIndex]
-      cell.row = row
-      cell.column = column
-
-      grid[rowIndex].insert(cell, at: index)
-    }
-
-    updateGrid() // TODO: Is this the correct place?
-
-    return column
-  }
-
-  public func insertRow(at index: Int, with views: [UIView]) -> GridRow {
+  // MARK: Add, insert, move and remove
+
+  @discardableResult
+  open func addRow(with views: [UIView]) -> GridRow {
+    return insertRow(at: rows.count, with: views)
+  }
+
+  open func insertRow(at index: Int, with views: [UIView]) -> GridRow {
     for _ in 0..<max(0, views.count - numberOfColumns) {
       addColumn(with: [])
     }


    grid.insert(cells, at: index)

    updateGrid() // TODO: Is this the correct place?

    return row
  }

  public func row(at index: Int) -> GridRow {
    return rows[index]
  }

  public func removeColumn(at index: Int) {
    columns.remove(at: index)
    for (rowIndex, _) in grid.enumerated() {
      grid[rowIndex].remove(at: index)
    }

    // TODO: updateGrid() ?
  }

  public func removeRow(at index: Int) {
    rows.remove(at: index)
    grid.remove(at: index)

    // TODO: updateGrid() ?
  }
}

// MARK: - GridRow

// TODO: fix runtime ambiguous position and size
// TODO: make UIView.animate possible, by not using updateGrid()

open class GridView: UIView {

  var columns: [GridColumn] = []
  var rows: [GridRow] = []
  var grid: [[GridCell]] = []

  // MARK: Initializers

  //public convenience init(numberOfColumns columnCount: Int, rows rowCount: Int) { }

  public convenience init(views rows: [[UIView]]) {
    self.init()

