 	
 	private func syncScroll(toSide anchorSide: Side, velocity: CGFloat = 0, acceleration: CGFloat = 0, skipIfAnchorStill: Bool = false)
 	{
+		// Matches either the top or the middle of the two tables
+		// This is decided based on whether the virtual keyboard is displayed or not
+		let anchorPosition = Keyboard.instance.isVisible ? MatchPosition.top : MatchPosition.center
+		
 		let scrolledTable = tableOfSide(anchorSide)
-		guard let newCell = centerCell(ofTable: scrolledTable, withVelocity: velocity, andAcceleration: acceleration) else
+		guard let newCell = anchorCell(atPosition: anchorPosition, inTable: scrolledTable, withVelocity: velocity, andAcceleration: acceleration) else
 		{
 			print("ERROR: No visible cells at \(anchorSide)")
 			return
 		}
 		
-		guard !(skipIfAnchorStill && newCell === lastCenterCell) else
+		guard !(skipIfAnchorStill && newCell === lastAnchorCell) else
 		{
 			return
 		}
-		lastCenterCell = newCell
+		lastAnchorCell = newCell
 		
 		// finds the matching cell in the other table
 		guard let pathId = (newCell as? ParagraphAssociated)?.pathId else

		return cellHeights[currentHeightIds[side]!]![index].or(defaultCellHeight)
	}
	
	private func centerIndex(of indexes: [IndexPath], onSide side: Side) -> IndexPath?
	{
		guard !indexes.isEmpty else
		{

		
		// Calculates the height of the visible area
		let totalHeight = cellHeights.reduce(0, { result, h in return result + h })
		
		// Velocity is also taken into account when determining the anchor cell position (counts 0.5 second reaction time)
		let anchorY = max(0, min(position.targetY(ofHeight: totalHeight) + travelDistance, totalHeight - 1))
		
		// Finds the anchor cell
		var y:CGFloat = 0
		for i in 0 ..< cellHeights.count
		{
			let nextY = y + cellHeights[i]
			
			if nextY > anchorY
			{
				return tableView.cellForRow(at: indexPaths[i])
			}
