protected void performPlaceCallback(){
		if (parent == null){
			return;
		}
		if (!parent.isVisible()){
			return;
		}
		if (parent.gamestate.gameFinished){
			return; //game is over
		}
		AIBundle bundle = null;
		try {
			bundle = workerThread.get();
		} catch (InterruptedException e){
			
		} catch( ExecutionException e) {
			e.printStackTrace();
		}
		GamePiece placePoint = bundle.getPlace();
		//System.out.println("Placepoint: "+placePoint);
		GamePieceButton piece = parent.pieces[placePoint.getR()][placePoint.getP()];
		boolean mill = false;
		try {
			mill = parent.gamestate.placePiece(placePoint.getR(), placePoint.getP());
			piece.setMode(GamePieceButton.NORMAL_MODE);
			piece.REPRESENTING = (parent.gamestate.CURRENT_TURN == GameBoard.PLAYER1_TURN) ? GameBoard.PLAYER1 : GameBoard.PLAYER2;
			if (mill){
				NineManMill.sfxplayer.playSound(WavePlayer.SOUND_MILL);
				//Make the AI find the piece to remove
				parent.repaint(); //repaint so the user sees what happens
				parent.setDirections("Player "+parent.gamestate.CURRENT_TURN+" is selecting a piece to destroy...");
				workerThread = new AIWorkerThread(playerID, AIWorkerThread.OPERATION_DESTROY, difficulty, gamestate);
				workerThread.execute(); //run the AI destroyer in the background.
				//Don't finish turn. AI is not done yet. Destroy will finish the turn in it's callback
			} else {
				parent.completeTurn();
			}
			
		} catch (PiecePlacementException e) {
			e.printStackTrace();
		}
	}