public void getNextMovesBack(List<State> nextStates) {

        // for each box. Chech which boxes we can reach
        // box : The current box we are looking at
        for (Position box : boxes) {
            // for each empty position adjucent to this box
            // adjucent : the current adjucent position to the box
            for (Position adjucent : Utils.getAdjucentPositionsBack(box, this)) {
                // find out if we can reach it from our current position w/o
                // moving any boxes
                String path_to_adjucent = Utils.findPath(player, adjucent, this);

                // check if there was such path
                if (path_to_adjucent != null) {

                    // try to move the box
                    Movement moved_path = Utils.tryToMoveBoxBack(box, adjucent, this);
                    // check if we actually managed to move the box

                    if (moved_path != null) {
                        // create a new state
                        State new_state;
                        try {
                            // clone this state
                            new_state = (State) this.clone();

                            // update the BoxState we just moved
                            new_state.boxes.remove(box);
                            new_state.boxes.add(moved_path.getBox());

                            // update the player state
                            new_state.player = moved_path.getPlayer();

                            // update the current path
                            new_state.current_path = new StringBuilder(new_state.current_path).
                                    append(path_to_adjucent).append(moved_path.getPath()).toString();

                            new_state.updateValue();
                            /*Update the reachable positions*/
                            new_state.setReachPositions();

                            // add this state to the list to return
                            nextStates.add(new_state);

                        } catch (CloneNotSupportedException ex) {
                            Logger.getLogger(State.class.getName()).log(Level.SEVERE, null, ex);
                        }
                    } // end checking if moved_path is null
                } // end checking if path to box is null
            } // end for each adjucent position to a box
        } // end for each box
    }