private void restartPlayer2GameTimer() {
    stopPlayer2GameTimer();

    player2GameTimer = new Timer(true);
    player2GameTimer.schedule(
        new TimerTask() {

          @Override
          public void run() {
            synchronized (GameControllerServer.this) {
              if (gamePaused || !gameStarted) {
                return;
              }

              try {
                if (board.getTetrisModel().getFigure2().pushDown()
                    == AbstractFigure.RESULT_FREEZED) {
                  updatePlayer2ScoreViewer(board.getTetrisModel().removeRows());
                  board.getTetrisModel().getFigureManager2().pregenerateFigure();
                  /*
                   * Put preview figure
                   */
                  board.getPlayer2PreviewerModel().clear();
                  board
                      .getTetrisModel()
                      .getFigureManager2()
                      .getNextFigure()
                      .putFigure(board.getPlayer2PreviewerModel(), 4, 0);
                  repaintPlayer2Previewer();
                  /*
                   * Put new figure
                   */
                  final AbstractFigure figure =
                      board.getTetrisModel().getFigureManager2().getCurrentFigure();
                  board.getTetrisModel().setFigure2(figure);
                  if (!figure.putFigure(board.getTetrisModel(), 14, 0)) {
                    gameOver();
                  } else {
                    board.getDownShifter().doShift();
                    networkManager.sendCommand(DoShiftCommand.class);
                  }
                }

                repaintDownShifter();
              } catch (IOException e) {
                interraptGame(e);
              }
            }
          }
        },
        player2ScoreCounter.getSpeed(),
        player2ScoreCounter.getSpeed());
  }