diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
index 7a392d963f..e3e6b86bec 100644
--- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
+++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer6.java
@@ -44,7 +44,6 @@ import mage.cards.Card;
 import mage.cards.Cards;
 import mage.choices.Choice;
 import mage.filter.FilterAbility;
-import mage.filter.common.FilterCreatureForAttack;
 import mage.game.Game;
 import mage.game.combat.Combat;
 import mage.game.combat.CombatGroup;
@@ -56,7 +55,6 @@ import mage.game.turn.*;
 import mage.players.Player;
 import mage.target.Target;
 import mage.target.TargetCard;
-import mage.util.Logging;
 
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -365,6 +363,7 @@ public class ComputerPlayer6 extends ComputerPlayer<ComputerPlayer6> implements
 
 	protected Integer addActionsTimed(final FilterAbility filter) {
 		FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>() {
+			@Override
 			public Integer call() throws Exception
 			{
 				return addActions(root, filter, maxDepth, Integer.MIN_VALUE, Integer.MAX_VALUE);
@@ -552,7 +551,7 @@ public class ComputerPlayer6 extends ComputerPlayer<ComputerPlayer6> implements
 
 	@Override
 	public boolean choose(Outcome outcome, Choice choice, Game game) {
-		if (choices.size() == 0)
+		if (choices.isEmpty())
 			return super.choose(outcome, choice, game);
 		if (!choice.isChosen()) {
 			for (String achoice: choices) {
@@ -569,7 +568,7 @@ public class ComputerPlayer6 extends ComputerPlayer<ComputerPlayer6> implements
 
 	@Override
 	public boolean chooseTarget(Outcome outcome, Cards cards, TargetCard target, Ability source, Game game)  {
-		if (targets.size() == 0)
+		if (targets.isEmpty())
 			return super.chooseTarget(outcome, cards, target, source, game);
 		if (!target.doneChosing()) {
 			for (UUID targetId: targets) {
@@ -586,7 +585,7 @@ public class ComputerPlayer6 extends ComputerPlayer<ComputerPlayer6> implements
 
 	@Override
 	public boolean choose(Outcome outcome, Cards cards, TargetCard target, Game game)  {
-		if (targets.size() == 0)
+		if (targets.isEmpty())
 			return super.choose(outcome, cards, target, game);
 		if (!target.doneChosing()) {
 			for (UUID targetId: targets) {
diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java
index 9ab0fdc6a3..c6d7182ac7 100644
--- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java
+++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java
@@ -776,15 +776,18 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
 	@Override
 	public boolean chooseTarget(Outcome outcome, Cards cards, TargetCard target, Ability source, Game game)  {
 		log.debug("chooseTarget");
+		if (cards != null && cards.isEmpty()) {
+			if (!target.isRequired())
+				return false;
+			return true;
+		}
+
+		ArrayList<Card> cardChoices = new ArrayList<Card>(cards.getCards(target.getFilter(), game));
 		while (!target.doneChosing()) {
-			if (cards.isEmpty()) {
-				if (!target.isRequired())
-					return false;
-				return true;
-			}
-			Card card = pickTarget(new ArrayList<Card>(cards.getCards(target.getFilter(), game)), outcome, target, source, game);
+			Card card = pickTarget(cardChoices, outcome, target, source, game);
 			if (card != null) {
 				target.addTarget(card.getId(), source, game);
+				cardChoices.remove(card);
 			}
 		}
 		return true;
@@ -794,17 +797,17 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
 	public boolean choose(Outcome outcome, Cards cards, TargetCard target, Game game)  {
 		log.debug("choose");
 		if (cards != null && cards.isEmpty()) {
-			return false;
+			if (!target.isRequired())
+				return false;
+			return true;
 		}
+
+		ArrayList<Card> cardChoices = new ArrayList<Card>(cards.getCards(target.getFilter(), game));
 		while (!target.doneChosing()) {
-			if (cards.isEmpty()) {
-				if (!target.isRequired())
-					return false;
-				return true;
-			}
-			Card card = pickTarget(new ArrayList<Card>(cards.getCards(target.getFilter(), game)), outcome, target, null, game);
+			Card card = pickTarget(cardChoices, outcome, target, null, game);
 			if (card != null) {
 				target.add(card.getId(), game);
+				cardChoices.remove(card);
 			}
 		}
 		return true;
@@ -864,7 +867,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
 	public Mode chooseMode(Modes modes, Ability source, Game game) {
 		log.debug("chooseMode");
 		//TODO: improve this;
-		return modes.get(0);
+		return modes.values().iterator().next();
 	}
 	
 	@Override
@@ -1000,7 +1003,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
 	}
 
 	public Card pickBestCard(List<Card> cards, List<Constants.ColoredManaSymbol> chosenColors) {
-		if (cards.size() == 0) {
+		if (cards.isEmpty()) {
 			return null;
 		}
 		Card bestCard = null;
@@ -1016,7 +1019,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
 	}
 
 	public Card pickWorstCard(List<Card> cards, List<Constants.ColoredManaSymbol> chosenColors) {
-		if (cards.size() == 0) {
+		if (cards.isEmpty()) {
 			return null;
 		}
 		Card worstCard = null;
@@ -1033,7 +1036,7 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
 
 	@Override
 	public void pickCard(List<Card> cards, Deck deck, Draft draft) {
-		if (cards.size() == 0) {
+		if (cards.isEmpty()) {
 			throw new IllegalArgumentException("No cards to pick from.");
 		}
 		try {
@@ -1125,17 +1128,17 @@ public class ComputerPlayer<T extends ComputerPlayer<T>> extends PlayerImpl<T> i
 				}
 				// only two or three color decks are allowed
 				if (chosenSymbols.size() >  1 && chosenSymbols.size() < 4) {
-					List<Constants.ColoredManaSymbol> chosenColors = new ArrayList<Constants.ColoredManaSymbol>();
+					List<Constants.ColoredManaSymbol> colorsChosen = new ArrayList<Constants.ColoredManaSymbol>();
 					for (String symbol : chosenSymbols) {
 						Constants.ColoredManaSymbol manaSymbol = Constants.ColoredManaSymbol.lookup(symbol.charAt(0));
 						if (manaSymbol != null) {
-							chosenColors.add(manaSymbol);
+							colorsChosen.add(manaSymbol);
 						}
 					}
-					if (chosenColors.size() > 1) {
+					if (colorsChosen.size() > 1) {
 						// no need to remember picks anymore
 						pickedCards = null;
-						return chosenColors;
+						return colorsChosen;
 					}
 				}
 			}
diff --git a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java
index f2c0e78765..10e1da4ec1 100644
--- a/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java
+++ b/Mage.Server.Plugins/Mage.Player.AIMinimax/src/mage/player/ai/ComputerPlayer2.java
@@ -318,6 +318,7 @@ public class ComputerPlayer2 extends ComputerPlayer<ComputerPlayer2> implements
 
 	protected void addActionsTimed(final FilterAbility filter) {
 		FutureTask<Integer> task = new FutureTask<Integer>(new Callable<Integer>() {
+			@Override
 			public Integer call() throws Exception
 			{
 				return addActions(root, filter, Integer.MIN_VALUE, Integer.MAX_VALUE);
@@ -329,8 +330,8 @@ public class ComputerPlayer2 extends ComputerPlayer<ComputerPlayer2> implements
 			task.get(maxThink, TimeUnit.SECONDS);
 			long endTime = System.nanoTime();
 			long duration = endTime - startTime;
-			logger.info("Calculated " + root.nodeCount + " nodes in " + duration/1000000000.0 + "s");
-			nodeCount += root.nodeCount;
+			logger.info("Calculated " + SimulationNode.nodeCount + " nodes in " + duration/1000000000.0 + "s");
+			nodeCount += SimulationNode.nodeCount;
 			thinkTime += duration;
 		} catch (TimeoutException e) {
 			logger.debug("simulating - timed out");
@@ -343,8 +344,8 @@ public class ComputerPlayer2 extends ComputerPlayer<ComputerPlayer2> implements
 			}
 			long endTime = System.nanoTime();
 			long duration = endTime - startTime;
-			logger.info("Timeout - Calculated " + root.nodeCount + " nodes in " + duration/1000000000.0 + "s");
-			nodeCount += root.nodeCount;
+			logger.info("Timeout - Calculated " + SimulationNode.nodeCount + " nodes in " + duration/1000000000.0 + "s");
+			nodeCount += SimulationNode.nodeCount;
 			thinkTime += duration;
 		} catch (ExecutionException e) {
 			logger.fatal("Simulation error", e);
@@ -506,7 +507,7 @@ public class ComputerPlayer2 extends ComputerPlayer<ComputerPlayer2> implements
 
 	@Override
 	public boolean choose(Outcome outcome, Choice choice, Game game) {
-		if (choices.size() == 0)
+		if (choices.isEmpty())
 			return super.choose(outcome, choice, game);
 		if (!choice.isChosen()) {
 			for (String achoice: choices) {
@@ -523,7 +524,7 @@ public class ComputerPlayer2 extends ComputerPlayer<ComputerPlayer2> implements
 
 	@Override
 	public boolean chooseTarget(Outcome outcome, Cards cards, TargetCard target, Ability source, Game game)  {
-		if (targets.size() == 0)
+		if (targets.isEmpty())
 			return super.chooseTarget(outcome, cards, target, source, game);
 		if (!target.doneChosing()) {
 			for (UUID targetId: targets) {
@@ -540,7 +541,7 @@ public class ComputerPlayer2 extends ComputerPlayer<ComputerPlayer2> implements
 
 	@Override
 	public boolean choose(Outcome outcome, Cards cards, TargetCard target, Game game)  {
-		if (targets.size() == 0)
+		if (targets.isEmpty())
 			return super.choose(outcome, cards, target, game);
 		if (!target.doneChosing()) {
 			for (UUID targetId: targets) {