private void generateMaze()
    {
        System.out.println();
        System.out.println("Generating maze");
        System.out.println("===============");

        Stack<IMazeCell> cellStack = new Stack<IMazeCell>();
        int visitedCells = 0;

        IMazeCell currentCell = chooseOriginCell();
        mazeStructure.setOriginCell(currentCell);

        cellStack.push(currentCell);
        visitedCells++;
        System.out.println("Current cell is: " + currentCell.toString());

        while (visitedCells < this.mazeStructure.getMazeCells().size())
        {
            ArrayList<IMazeCell> intactNeighbours =
                    currentCell.getListOfIntactNeighbours();

            if (!intactNeighbours.isEmpty())
            {
                currentCell = currentCell.chooseRandomCell(intactNeighbours);

                System.out.println("Moved into cell: " + currentCell);

                cellStack.push(currentCell);

                visitedCells++;
            }
            else
            {
                currentCell = cellStack.pop();

                System.out.println("Moved back to cell: " + currentCell);
            }

            System.out.println();

            try
            {
                Thread.sleep(this.pauseBetweenSteps);
            }
            catch (InterruptedException ex)
            {
                Logger.getLogger(DepthFirstMazeGeneratorTask.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        this.mazeStructure.setExitCell(currentCell);
    }