public void genTwoStepNF(GameState initial_position, MoveList move_list,
    long p_start_bb, long p_dest_bb) {

    // Case 1:
    // A valid p_start_bb piece is already on p_dest_bb but is frozen
    // Try to slide a player piece to unfreeze it

    initial_position.compute_tertiary_bitboards();
    long temp_bb = p_start_bb & p_dest_bb & initial_position.frozen_pieces_bb;
    while (temp_bb != 0) {
      long lsb2_bb = temp_bb & -temp_bb;
      temp_bb ^= lsb2_bb; // Remove the piece

      long help_dest_bb = touching_bb(lsb2_bb);

      genTwoStep(initial_position, move_list, FULL_BB, help_dest_bb);
    }

    // Case 2:
    // Use one step to move piece, other step for support piece, order does matter
    GameState temp_gs = gs_stack[2];
    move_list_stack[2].clear();
    initial_position.genSlideMovesF(move_list_stack[2], p_start_bb, p_dest_bb, true);
    for (ArimaaMove move : move_list_stack[2]) {
      temp_gs.play(move, initial_position);

      // All squares touching the slide piece destination square
      long slide_dest_bb = move.getSetBits() & initial_position.empty_bb;
      long help_dest_bb = touching_bb(slide_dest_bb);

      move_list_stack[3].clear();
      genOneStep(temp_gs, move_list_stack[3], FULL_BB, help_dest_bb);
      for (ArimaaMove move2 : move_list_stack[3]) {
        // Combine the two moves and record the result
        move_list.getMove().add(move, move2);
      }

      // Special case to consider
      // Sometimes helper piece has to slide first
      // h x -
      //   R C d
      // For the Rabbit to get to x, unfrozen, the C has to move first

      // Candidates must be
      // 1) touching start square
      // 2) Unfrozen before slide
      // 3) Frozen after slide
      temp_gs.compute_tertiary_bitboards();

      long slide_start_bb = move.getSetBits() & ~initial_position.empty_bb;
      long help_start_bb = touching_bb(slide_start_bb) &
        ~initial_position.frozen_pieces_bb &
        temp_gs.frozen_pieces_bb &
        initial_position.colour_bb[initial_position.player];
      // This is really rare, so speed is not so critical
      if (help_start_bb != 0) {

//        print_bitboard(help_start_bb, "help_start_bb");
//        print_bitboard(help_dest_bb, "help_dest_bb");
//        print_bitboard(slide_start_bb, "slide_start_bb");
//       print_bitboard(slide_dest_bb, "slide_dest_bb");

        // 1) Generate the helper slide
        move_list_stack[3].clear();
        initial_position.genSlideMoves(move_list_stack[3], help_start_bb,
          help_dest_bb);
        GameState temp2_gs = gs_stack[3];

        for (ArimaaMove move6 : move_list_stack[3]) {
          temp2_gs.play(move6, initial_position);

          // Generate the initial slide (May NOT be legal anymore!!!)
          move_list_stack[4].clear();
          temp2_gs.genSlideMoves(move_list_stack[4], slide_start_bb,
            slide_dest_bb);
          for (ArimaaMove move7 : move_list_stack[4]) {
            // Combine the two moves and record the result
            move_list.getMove().add(move6, move7);
          }

        }
      }
    }

    // Case 3:
    // Use both steps to move piece
    // For now call basic two step routine until it is fully debugged
    move_list_stack[2].clear();
    genTwoStep(initial_position, move_list_stack[2], p_start_bb, p_dest_bb);
    for (ArimaaMove move : move_list_stack[2]) {
      temp_gs.play(move, initial_position);
      temp_gs.compute_tertiary_bitboards();
      // For now, move is ok, if a non frozen piece is in the dest set
      if ((~temp_gs.frozen_pieces_bb & p_dest_bb & move.getSetBits()) != 0) {
//        System.out.println("Case 3\n" + move);
        move_list.getMove().copy(move);
      }

    }

  }