diff --git a/src/ai/ai.cpp b/src/ai/ai.cpp
index 4eb0d4535..f7a1b860e 100644
--- a/src/ai/ai.cpp
+++ b/src/ai/ai.cpp
@@ -195,7 +195,7 @@ static void AiCheckUnits()
 {
 	//  Count the already made build requests.
 	int counter[UnitTypeMax];
-	AiGetBuildRequestsCount(AiPlayer, counter);
+	AiGetBuildRequestsCount(*AiPlayer, counter);
 
 	//  Remove non active units.
 	const int unitCount = AiPlayer->Player->GetUnitCount();
@@ -397,8 +397,8 @@ static void SaveAiPlayer(CFile &file, int plynr, const PlayerAi &ai)
 	for (size_t i = 0; i != UnitTypeBuiltCount; ++i) {
 		const AiBuildQueue &queue = ai.UnitTypeBuilt[i];
 		/* rb - for backward compatibility of save format we have to put it first */
-		if (queue.X != -1) {
-			file.printf("\"onpos\", %d, %d, ", queue.X, queue.Y);
+		if (queue.Pos.x != -1) {
+			file.printf("\"onpos\", %d, %d, ", queue.Pos.x, queue.Pos.y);
 		}
 		/* */
 
diff --git a/src/ai/ai_local.h b/src/ai/ai_local.h
index 6cd5cf7be..b7b8e88cb 100644
--- a/src/ai/ai_local.h
+++ b/src/ai/ai_local.h
@@ -233,15 +233,17 @@ private:
 class AiBuildQueue
 {
 public:
-	AiBuildQueue() : Want(0), Made(0), Type(NULL), Wait(0), X(-1), Y(-1)  {}
+	AiBuildQueue() : Want(0), Made(0), Type(NULL), Wait(0)
+	{
+		Pos.x = Pos.y = -1;
+	}
 
 public:
 	unsigned int Want;  /// requested number
 	unsigned int Made;  /// built number
 	CUnitType *Type;    /// unit-type
 	unsigned long Wait; /// wait until this cycle
-	short int X;        /// build near x pos on map
-	short int Y;        /// build near y pos on map
+	Vec2i Pos;          /// build near pos on map
 };
 
 /**
@@ -397,7 +399,7 @@ extern void AiResetUnitTypeEquiv();
 extern int AiFindUnitTypeEquiv(const CUnitType &type, int *result);
 /// Finds all available equivalents units to a given one, in the prefered order
 extern int AiFindAvailableUnitTypeEquiv(const CUnitType &type, int *result);
-extern int AiGetBuildRequestsCount(PlayerAi *, int counter[UnitTypeMax]);
+extern int AiGetBuildRequestsCount(const PlayerAi &pai, int (&counter)[UnitTypeMax]);
 
 extern void AiNewDepotRequest(CUnit &worker);
 
diff --git a/src/ai/ai_resource.cpp b/src/ai/ai_resource.cpp
index c99435429..c0bbe4a5f 100644
--- a/src/ai/ai_resource.cpp
+++ b/src/ai/ai_resource.cpp
@@ -62,7 +62,7 @@
 --  Functions
 ----------------------------------------------------------------------------*/
 
-static int AiMakeUnit(CUnitType &type, int near_x, int near_y);
+static int AiMakeUnit(CUnitType &type, const Vec2i &nearPos);
 
 /**
 **  Check if the costs are available for the AI.
@@ -125,25 +125,25 @@ static int AiCheckCosts(const int *costs)
 **  @todo  The number of food currently trained can be stored global
 **         for faster use.
 */
-static int AiCheckSupply(const PlayerAi *pai, const CUnitType &type)
+static int AiCheckSupply(const PlayerAi &pai, const CUnitType &type)
 {
 	// Count food supplies under construction.
 	int remaining = 0;
-	for (unsigned int i = 0; i < pai->UnitTypeBuilt.size(); ++i) {
-		const AiBuildQueue &queue = pai->UnitTypeBuilt[i];
+	for (unsigned int i = 0; i < pai.UnitTypeBuilt.size(); ++i) {
+		const AiBuildQueue &queue = pai.UnitTypeBuilt[i];
 		if (queue.Type->Supply) {
 			remaining += queue.Made * queue.Type->Supply;
 		}
 	}
 
 	// We are already out of food.
-	remaining += pai->Player->Supply - pai->Player->Demand - type.Demand;
+	remaining += pai.Player->Supply - pai.Player->Demand - type.Demand;
 	if (remaining < 0) {
 		return 0;
 	}
 	// Count what we train.
-	for (unsigned int i = 0; i < pai->UnitTypeBuilt.size(); ++i) {
-		const AiBuildQueue &queue = pai->UnitTypeBuilt[i];
+	for (unsigned int i = 0; i < pai.UnitTypeBuilt.size(); ++i) {
+		const AiBuildQueue &queue = pai.UnitTypeBuilt[i];
 		if ((remaining -= queue.Made * queue.Type->Demand) < 0) {
 			return 0;
 		}
@@ -170,8 +170,7 @@ class IsAEnemyUnitOf
 public:
 	explicit IsAEnemyUnitOf(const CPlayer &_player) : player(&_player) {}
 	bool operator()(const CUnit *unit) const {
-		return unit->IsVisibleAsGoal(*player)
-			   && unit->IsEnemy(*player);
+		return unit->IsVisibleAsGoal(*player) && unit->IsEnemy(*player);
 	}
 private:
 	const CPlayer *player;
@@ -264,7 +263,7 @@ static bool IsAlreadyWorking(const CUnit &unit)
 **
 **  @note            We must check if the dependencies are fulfilled.
 */
-static int AiBuildBuilding(const CUnitType &type, CUnitType &building, int near_x, int near_y)
+static int AiBuildBuilding(const CUnitType &type, CUnitType &building, const Vec2i &nearPos)
 {
 	std::vector<CUnit *> table;
 
@@ -289,16 +288,16 @@ static int AiBuildBuilding(const CUnitType &type, CUnitType &building, int near_
 
 	Vec2i pos;
 	// Find a place to build.
-	if (AiFindBuildingPlace(unit, building, near_x, near_y, &pos)) {
+	if (AiFindBuildingPlace(unit, building, nearPos.x, nearPos.y, &pos)) {
 		CommandBuildBuilding(unit, pos, building, FlushCommands);
 		return 1;
 	} else {
 		//when first worker can't build then rest also won't be able (save CPU)
-		if (near_x != -1 && near_y != -1) {
+		if (Map.Info.IsPointOnMap(nearPos)) {
 			//Crush CPU !!!!!
 			for (int i = 0; i < num && table[i] != &unit; ++i) {
 				// Find a place to build.
-				if (AiFindBuildingPlace(*table[i], building, near_x, near_y, &pos)) {
+				if (AiFindBuildingPlace(*table[i], building, nearPos.x, nearPos.y, &pos)) {
 					CommandBuildBuilding(*table[i], pos, building, FlushCommands);
 					return 1;
 				}
@@ -310,10 +309,11 @@ static int AiBuildBuilding(const CUnitType &type, CUnitType &building, int near_
 
 static bool AiRequestedTypeAllowed(const CPlayer &player, const CUnitType &type)
 {
-	const int size = AiHelpers.Build[type.Slot].size();
-	for (int i = 0; i < size; ++i) {
-		CUnitType *builder = AiHelpers.Build[type.Slot][i];
-		if (player.UnitTypesCount[builder->Slot] > 0
+	const size_t size = AiHelpers.Build[type.Slot].size();
+	for (size_t i = 0; i != size; ++i) {
+		CUnitType &builder = *AiHelpers.Build[type.Slot][i];
+
+		if (player.UnitTypesCount[builder.Slot] > 0
 			&& CheckDependByType(player, type)) {
 			return true;
 		}
@@ -332,14 +332,14 @@ static bool cnode_cmp(const cnode &lhs, const cnode &rhs)
 	return lhs.unit_cost < rhs.unit_cost;
 }
 
-int
-AiGetBuildRequestsCount(PlayerAi *pai, int counter[UnitTypeMax])
+int AiGetBuildRequestsCount(const PlayerAi &pai, int (&counter)[UnitTypeMax])
 {
-	const int size = (int)pai->UnitTypeBuilt.size();
+	const int size = (int)pai.UnitTypeBuilt.size();
 	memset(counter, 0, sizeof(int) * UnitTypeMax);
 	for (int i = 0; i < size; ++i) {
-		AiBuildQueue *queue = &pai->UnitTypeBuilt[i];
-		counter[queue->Type->Slot] += queue->Want;
+		const AiBuildQueue &queue = pai.UnitTypeBuilt[i];
+
+		counter[queue.Type->Slot] += queue.Want;
 	}
 	return size;
 }
@@ -373,7 +373,7 @@ void AiNewDepotRequest(CUnit &worker)
 	// Count the already made build requests.
 	int counter[UnitTypeMax];
 
-	AiGetBuildRequestsCount(worker.Player->Ai, counter);
+	AiGetBuildRequestsCount(*worker.Player->Ai, counter);
 
 	const int n = AiHelpers.Depots[worker.CurrentResource - 1].size();
 
@@ -399,7 +399,6 @@ void AiNewDepotRequest(CUnit &worker)
 			best_cost = cost;
 			//best_mask = needmask;
 		}
-
 	}
 
 	if (best_type) {
@@ -409,17 +408,16 @@ void AiNewDepotRequest(CUnit &worker)
 		queue.Type = best_type;
 		queue.Want = 1;
 		queue.Made = 0;
-		queue.X = pos.x;
-		queue.Y = pos.y;
+		queue.Pos = pos;
 
 		worker.Player->Ai->UnitTypeBuilt.push_back(queue);
 
 		DebugPrint("%d: Worker %d report: Requesting new depot near [%d,%d].\n"
 				   _C_ worker.Player->Index _C_ worker.Slot
-				   _C_ queue.X _C_ queue.Y);
+				   _C_ queue.Pos.x _C_ queue.Pos.y);
 		/*
 		} else {
-		AiPlayer->NeededMask |= best_mask;
+			AiPlayer->NeededMask |= best_mask;
 		}
 		*/
 	}
@@ -441,7 +439,7 @@ static bool AiRequestSupply()
 	// Count the already made build requests.
 	int counter[UnitTypeMax];
 
-	AiGetBuildRequestsCount(AiPlayer, counter);
+	AiGetBuildRequestsCount(*AiPlayer, counter);
 	struct cnode cache[16];
 
 	memset(cache, 0, sizeof(cache));
@@ -486,7 +484,8 @@ static bool AiRequestSupply()
 	if (j) {
 		if (!cache[0].needmask) {
 			CUnitType &type = *cache[0].type;
-			if (AiMakeUnit(type, -1, -1)) {
+			Vec2i invalidPos = {-1, -1};
+			if (AiMakeUnit(type, invalidPos)) {
 				AiBuildQueue newqueue;
 				newqueue.Type = &type;
 				newqueue.Want = 1;
@@ -568,7 +567,7 @@ static bool AiTrainUnit(const CUnitType &type, CUnitType &what)
 **
 **  @note        We must check if the dependencies are fulfilled.
 */
-static int AiMakeUnit(CUnitType &typeToMake, int near_x, int near_y)
+static int AiMakeUnit(CUnitType &typeToMake, const Vec2i &nearPos)
 {
 	// Find equivalents unittypes.
 	int usableTypes[UnitTypeMax + 1];
@@ -608,7 +607,7 @@ static int AiMakeUnit(CUnitType &typeToMake, int near_x, int near_y)
 			//
 			if (unit_count[table[i]->Slot]) {
 				if (type.Building) {
-					if (AiBuildBuilding(*table[i], type, near_x, near_y)) {
+					if (AiBuildBuilding(*table[i], type, nearPos)) {
 						return 1;
 					}
 				} else {
@@ -783,7 +782,7 @@ static void AiCheckingWork()
 		// Buildings can be destroyed.
 
 		// Check if we have enough food.
-		if (type.Demand && !AiCheckSupply(AiPlayer, type)) {
+		if (type.Demand && !AiCheckSupply(*AiPlayer, type)) {
 			AiPlayer->NeedSupply = true;
 			AiRequestSupply();
 		}
@@ -799,7 +798,7 @@ static void AiCheckingWork()
 			//  resource or other resource need!
 			continue;
 		} else if (queue.Want > queue.Made && queue.Wait <= GameCycle) {
-			if (AiMakeUnit(type, queue.X, queue.Y)) {
+			if (AiMakeUnit(type, queue.Pos)) {
 				// AiRequestSupply can change UnitTypeBuilt so recalculate queue
 				AiBuildQueue &queue2 = AiPlayer->UnitTypeBuilt[AiPlayer->UnitTypeBuilt.size() - sz + i];
 				++queue2.Made;
diff --git a/src/ai/script_ai.cpp b/src/ai/script_ai.cpp
index b67f37c15..eb72e8299 100644
--- a/src/ai/script_ai.cpp
+++ b/src/ai/script_ai.cpp
@@ -1201,25 +1201,22 @@ static void CclParseBuildQueue(lua_State *l, PlayerAi *ai, int offset)
 		LuaError(l, "incorrect argument");
 	}
 
-	const char *value;
-	int made;
-	int want;
-	int x = -1, y = -1;
+	Vec2i pos = {-1, -1};
 
 	const int args = lua_objlen(l, offset);
 	for (int k = 0; k < args; ++k) {
 		lua_rawgeti(l, offset, k + 1);
-		value = LuaToString(l, -1);
+		const char *value = LuaToString(l, -1);
 		lua_pop(l, 1);
 		++k;
 
 		if (!strcmp(value, "onpos")) {
 			lua_rawgeti(l, offset, k + 1);
-			x = LuaToNumber(l, -1);
+			pos.x = LuaToNumber(l, -1);
 			lua_pop(l, 1);
 			++k;
 			lua_rawgeti(l, offset, k + 1);
-			y = LuaToNumber(l, -1);
+			pos.y = LuaToNumber(l, -1);
 			lua_pop(l, 1);
 		} else {
 
@@ -1228,23 +1225,22 @@ static void CclParseBuildQueue(lua_State *l, PlayerAi *ai, int offset)
 			//lua_pop(l, 1);
 			//++k;
 			lua_rawgeti(l, offset, k + 1);
-			made = LuaToNumber(l, -1);
+			const int made = LuaToNumber(l, -1);
 			lua_pop(l, 1);
 			++k;
 			lua_rawgeti(l, offset, k + 1);
-			want = LuaToNumber(l, -1);
+			const int want = LuaToNumber(l, -1);
 			lua_pop(l, 1);
 
 			AiBuildQueue queue;
 			queue.Type = UnitTypeByIdent(value);
 			queue.Want = want;
 			queue.Made = made;
-			queue.X = x;
-			queue.Y = y;
+			queue.Pos = pos;
 
 			ai->UnitTypeBuilt.push_back(queue);
-			x = -1;
-			y = -1;
+			pos.x = -1;
+			pos.y = -1;
 		}
 	}
 }
diff --git a/src/ui/mainscr.cpp b/src/ui/mainscr.cpp
index a8ea48cc4..1cde7aa2c 100644
--- a/src/ui/mainscr.cpp
+++ b/src/ui/mainscr.cpp
@@ -967,8 +967,8 @@ void MessagesDisplay::DrawMessages()
 						 ThisPlayer->Ai->UnitTypeBuilt[z].Made,
 						 ThisPlayer->Ai->UnitTypeBuilt[z].Want,
 						 ThisPlayer->Ai->UnitTypeBuilt[z].Wait,
-						 ThisPlayer->Ai->UnitTypeBuilt[z].X,
-						 ThisPlayer->Ai->UnitTypeBuilt[z].Y);
+						 ThisPlayer->Ai->UnitTypeBuilt[z].Pos.x,
+						 ThisPlayer->Ai->UnitTypeBuilt[z].Pos.y);
 
 				label.DrawClip(UI.MapArea.X + 8,
 							   UI.MapArea.Y + 8 + z * (UI.MessageFont->Height() + 1),