private boolean isNewFeatureRecursive(HashSet<BoardPosition> searched,
			HashSet<BoardPosition> toSearch) {

		// Take a position from the toSearch map.
		Iterator<BoardPosition> toSearchIterator = toSearch.iterator();
		BoardPosition boardPosition;

		if (toSearchIterator.hasNext()) {
			boardPosition = toSearchIterator.next();
		} else {
			return false;
		}

		int xBoard = boardPosition.xBoard;
		int yBoard = boardPosition.yBoard;
		int xTile = boardPosition.xTile;
		int yTile = boardPosition.yTile;

		Tile currentTile = gameBoard[yBoard][xBoard];

		// Can't place a meeple on a tile which doesn't exist!
		if (currentTile == null) {
			return false;
		}

		// Search the position & add it to searched map.
		// If there is a meeple on the feature then it isn't a new feature.
		if (getMeeple(xBoard, yBoard, xTile, yTile) == null) {
			toSearch.remove(boardPosition);
			searched.add(boardPosition);
		} else {
			return false;
		}

		// Add valid neighbors of position to toSearch map.
		// A neighbor is valid if it is in neither map,
		// and is of the same tile type.
		TileType currentTileType = currentTile.getTileType(xTile, yTile);

		// Add to an array. And run through adding each to toSearch.
		BoardPosition[] neighborTiles = getTileNeighbors(xBoard, yBoard, xTile,
				yTile);

        for (BoardPosition neighborTile : neighborTiles) {

            // Check the tile is not null.
            Tile tile = gameBoard[neighborTile.yBoard][neighborTile.xBoard];

            if (tile != null) {

                // Check that the tile has the same tile type.
                TileType tileType = tile.getTileType(neighborTile.xTile,
                        neighborTile.yTile);

                if (tileType == currentTileType) {

                    BoardPosition toAdd = new BoardPosition(
                            neighborTile.xBoard, neighborTile.yBoard,
                            neighborTile.xTile, neighborTile.yTile);

                    // Check the tile is not already in searched or toSearch.
                    if (!toSearch.contains(toAdd) && !searched.contains(toAdd)) {
                        toSearch.add(toAdd);
                    }
                }
            }
        }

		// If toSearch is empty then we are done. We have found that this is
		// indeed a new feature.
		if (toSearch.isEmpty()) {
			return true;
		}

		return isNewFeatureRecursive(searched, toSearch);
	}