diff --git a/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquest.js b/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquest.js
index b168bee..9664d69 100644
--- a/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquest.js
+++ b/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquest.js
@@ -1,18 +1,5 @@
-var vc = {};
-
-vc.name = translate("Conquest");
-vc.description = translate("Defeat all opponents");
-
-/*
-NOT SUPPORTED YET
-vc.requirementsCheck = function(mapSettings)
-{
-	// nothing required
-	return true;
+g_VictoryConditions.conquest = {
+	"name" : translate("Conquest"),
+	"description" : translate("Defeat all opponents"),
+	"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/Conquest.js"]
 };
-*/
-
-vc.scripts = ["scripts/Conquest.js"];
-
-g_VictoryConditions.conquest = vc;
-vc = null;
diff --git a/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestStructures.js b/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestStructures.js
new file mode 100644
index 0000000..6810466
--- /dev/null
+++ b/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestStructures.js
@@ -0,0 +1,5 @@
+g_VictoryConditions.conquestStructure = {
+	"name" : translate("Conquest Structure"),
+	"description" : translate("Destroy all structures of enemies"),
+	"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/ConquestStructures.js"]
+};
diff --git a/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestUnits.js b/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestUnits.js
new file mode 100644
index 0000000..1249732
--- /dev/null
+++ b/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestUnits.js
@@ -0,0 +1,5 @@
+g_VictoryConditions.conquestUnits = {
+	"name" : translate("Conquest Units"),
+	"description" : translate("Destroy all units of enemies"),
+	"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/ConquestUnits.js"]
+};
diff --git a/binaries/data/mods/public/gui/gamesetup/victory_conditions/wonder.js b/binaries/data/mods/public/gui/gamesetup/victory_conditions/wonder.js
index 9e0034b..c38b9b9 100644
--- a/binaries/data/mods/public/gui/gamesetup/victory_conditions/wonder.js
+++ b/binaries/data/mods/public/gui/gamesetup/victory_conditions/wonder.js
@@ -1,18 +1,5 @@
-var vc = {};
-
-vc.name = translate("Wonder");
-vc.description = translate("Build a wonder to win");
-
-/*
-NOT SUPPORTED YET
-vc.requirementsCheck = function(mapSettings)
-{
-	// nothing required
-	return true;
+g_VictoryConditions.wonder = {
+	"name" : translate("Wonder"),
+	"description" : translate("Build a wonder to win"),
+	"scripts" : ["scripts/ConquestCommon.js", "scripts/TriggerHelper.js", "scripts/Conquest.js", "scripts/WonderVictory.js"]
 };
-*/
-
-vc.scripts = ["scripts/Conquest.js", "scripts/WonderVictory.js"];
-
-g_VictoryConditions.wonder = vc;
-vc = null;
diff --git a/binaries/data/mods/public/maps/scripts/Conquest.js b/binaries/data/mods/public/maps/scripts/Conquest.js
index 867fa20..704b4c9 100644
--- a/binaries/data/mods/public/maps/scripts/Conquest.js
+++ b/binaries/data/mods/public/maps/scripts/Conquest.js
@@ -1,70 +1,9 @@
-/*
- * Check players the next turn. Avoids problems in Atlas, with promoting entities etc
- */
-Trigger.prototype.CheckConquestCriticalEntities = function()
-{
-	if (this.checkingConquestCriticalEntities)
-		return;
-	// wait a turn for actually checking the players
-	this.DoAfterDelay(0, "CheckConquestCriticalEntitiesNow", null);
-	this.checkingConquestCriticalEntities = true;
-};
-
-/*
- * Check players immediately. Might cause problems with converting/promoting entities.
- */
-Trigger.prototype.CheckConquestCriticalEntitiesNow = function()
-{
-	this.checkingConquestCriticalEntities = false;
-	// for all other game types, defeat that player
-	var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
-	var cmpEndGameManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_EndGameManager);
-	
-	// Ignore gaia
-	var numPlayers = cmpPlayerManager.GetNumPlayers();
-	var cmpPlayers = [];
-	
-	var allies = [];
-	var onlyAlliesLeft = true;
-	// If the player is currently active but needs to be defeated,
-	// mark that player as defeated
-	// cache the cmpPlayer instances of the other players and search the allies
-	for (var i = 1; i < numPlayers; i++)
-	{
-		// cmpPlayer should always exist for the player ids from 1 to numplayers
-		// so no tests on the existance of cmpPlayer are needed
-		var playerEntityId = cmpPlayerManager.GetPlayerByID(i);
-		cmpPlayers[i] = Engine.QueryInterface(playerEntityId, IID_Player);
-		if (cmpPlayers[i].GetState() != "active") 
-			continue;
-		if (cmpPlayers[i].GetConquestCriticalEntitiesCount() == 0)
-			Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } );
-		else
-		{
-			if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i))
-				allies.push(i);
-			else
-				onlyAlliesLeft = false;
-		}
-	}
-
-	// check if there are winners, or the game needs to continue
-	if (!allies.length || !onlyAlliesLeft || !(cmpEndGameManager.alliedVictory || allies.length == 1))
-		return; 
-
-	for each (var p in allies)
-		cmpPlayers[p].SetState("won");
-
-	// Reveal the map to all players
-	var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
-	cmpRangeManager.SetLosRevealAll(-1, true);
-};
-
 var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
+cmpTrigger.conquestClassFilter = "ConquestCritical";
 
 var data = {"enabled": true};
-cmpTrigger.RegisterTrigger("OnOwnershipChanged", "CheckConquestCriticalEntities", data);
-// also check at the start of the game
-cmpTrigger.DoAfterDelay(0, "CheckConquestCriticalEntitiesNow", null);
-cmpTrigger.checkingConquestCriticalEntities = false;
+cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
+cmpTrigger.RegisterTrigger("OnStructureBuilt", "ConquestAddStructure", data);
+cmpTrigger.RegisterTrigger("OnTrainingFinished", "ConquestTrainingFinished", data);
 
+cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);
diff --git a/binaries/data/mods/public/maps/scripts/ConquestCommon.js b/binaries/data/mods/public/maps/scripts/ConquestCommon.js
new file mode 100644
index 0000000..9c204d8
--- /dev/null
+++ b/binaries/data/mods/public/maps/scripts/ConquestCommon.js
@@ -0,0 +1,102 @@
+Trigger.prototype.ConquestHandlerOwnerShipChanged = function(msg)
+{
+	if (!this.conquestDataInit || !this.conquestClassFilter)
+		return;
+
+	if (!TriggerHelper.EntityHasClass(msg.entity, this.conquestClassFilter))
+		return;
+
+	if (msg.from == -1)
+		return;
+
+	if (msg.to > 0 && this.conquestEntitiesByPlayer[msg.to])
+		this.conquestEntitiesByPlayer[msg.to].entities.push(msg.entity);
+
+	if (!this.conquestEntitiesByPlayer[msg.from])
+	{
+		if (msg.from)
+			warn("ConquestHandlerOwnerShipChanged: Unknow player " + msg.from);
+		return;	
+	}
+
+	let entities = this.conquestEntitiesByPlayer[msg.from].entities;
+	let index = entities.indexOf(msg.entity);
+
+	if (index >= 0)
+	{
+		entities.splice(index, 1);
+		if (!entities.length)
+			Engine.PostMessage(this.conquestEntitiesByPlayer[msg.from].player, MT_PlayerDefeated, { "playerId": msg.from } );
+	}
+}
+
+Trigger.prototype.ConquestAddStructure = function(msg)
+{
+	if (!this.conquestClassFilter || !TriggerHelper.EntityHasClass(msg.building, this.conquestClassFilter))
+		return;
+
+	let cmpOwnership = Engine.QueryInterface(msg.building, IID_Ownership);
+	if (!cmpOwnership)
+	{
+		warn("ConquestAddStructure: Structure without Owner");
+		return;
+	}
+
+	let player = cmpOwnership.GetOwner();
+	if (!this.conquestEntitiesByPlayer[player])
+	{
+		warn("ConquestAddStructure: Unknown player " + player);
+		return;	
+	}
+
+	if (this.conquestEntitiesByPlayer[player].entities.indexOf(msg.building) >= 0)
+		return;
+
+	this.conquestEntitiesByPlayer[player].entities.push(msg.building);
+}
+
+Trigger.prototype.ConquestTrainingFinished = function(msg)
+{
+	if (msg.owner == 0 || !this.conquestClassFilter || !msg.entities.length || !msg.entities.every(elem => TriggerHelper.EntityHasClass(elem, this.conquestClassFilter)))
+		return;
+
+	let player = msg.owner;
+	if (!this.conquestEntitiesByPlayer[player])
+	{
+		warn("ConquestTrainingFinished: Unknown player " + player);
+		return;	
+	}
+	this.conquestEntitiesByPlayer[player].entities.push(...msg.entities);
+}
+
+Trigger.prototype.ConquestStartGameCount = function()
+{
+	if (!this.conquestClassFilter)
+	{
+		warn("ConquestStartGameCount: conquestClassFilter undefined");
+		return;
+	}
+
+	let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
+	let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
+
+	cmpPlayerManager.GetAllPlayerEntities().forEach((elem, i) => {
+		if (i == 0)
+			return;
+
+		this.conquestEntitiesByPlayer[i] = {"entities" : []};
+		this.conquestEntitiesByPlayer[i].player = elem;
+		let entities = cmpRangeManager.GetEntitiesByPlayer(i);
+		let filterEntity = ent => TriggerHelper.EntityHasClass(ent, this.conquestClassFilter) 
+			&& !Engine.QueryInterface(ent, IID_Foundation);
+		this.conquestEntitiesByPlayer[i].entities.push(...entities.filter(filterEntity));
+	});
+
+	this.conquestDataInit = true;
+}
+
+var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
+
+cmpTrigger.conquestEntitiesByPlayer = {};
+cmpTrigger.conquestDataInit = false;
+cmpTrigger.conquestClassFilter = "";
diff --git a/binaries/data/mods/public/maps/scripts/ConquestStructures.js b/binaries/data/mods/public/maps/scripts/ConquestStructures.js
new file mode 100644
index 0000000..90672c4
--- /dev/null
+++ b/binaries/data/mods/public/maps/scripts/ConquestStructures.js
@@ -0,0 +1,8 @@
+var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
+cmpTrigger.conquestClassFilter = "Structure";
+
+var data = {"enabled": true};
+cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
+cmpTrigger.RegisterTrigger("OnStructureBuilt", "ConquestAddStructure", data);
+
+cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);
diff --git a/binaries/data/mods/public/maps/scripts/ConquestUnits.js b/binaries/data/mods/public/maps/scripts/ConquestUnits.js
new file mode 100644
index 0000000..5d3754a
--- /dev/null
+++ b/binaries/data/mods/public/maps/scripts/ConquestUnits.js
@@ -0,0 +1,8 @@
+var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
+cmpTrigger.conquestClassFilter = "Unit";
+
+var data = {"enabled": true};
+cmpTrigger.RegisterTrigger("OnOwnershipChanged", "ConquestHandlerOwnerShipChanged", data);
+cmpTrigger.RegisterTrigger("OnTrainingFinished", "ConquestTrainingFinished", data);
+
+cmpTrigger.DoAfterDelay(0, "ConquestStartGameCount", null);
diff --git a/binaries/data/mods/public/simulation/components/EndGameManager.js b/binaries/data/mods/public/simulation/components/EndGameManager.js
index 1b75b48..59d0060 100644
--- a/binaries/data/mods/public/simulation/components/EndGameManager.js
+++ b/binaries/data/mods/public/simulation/components/EndGameManager.js
@@ -50,7 +50,7 @@ EndGameManager.prototype.MarkPlayerAsWon = function(playerID)
 		if (playerID == cmpPlayer.GetPlayerID() || this.alliedVictory && cmpPlayer.IsMutualAlly(playerID))
 			cmpPlayer.SetState("won")
 		else
-			Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i } );
+			Engine.PostMessage(playerEntityId, MT_PlayerDefeated, { "playerId": i, "skip": true } );
 	}
 
 	// Reveal the map to all players
@@ -63,4 +63,41 @@ EndGameManager.prototype.SetAlliedVictory = function(flag)
 	this.alliedVictory = flag;
 };
 
+EndGameManager.prototype.OnGlobalPlayerDefeated = function(msg)
+{
+	if (msg.skip)
+		return;
+
+	var cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
+	var cmpPlayers = [];
+
+	var allies = [];
+	var onlyAlliesLeft = true;
+
+	cmpPlayerManager.GetAllPlayerEntities().forEach((elem, i) => {
+		if (i == 0)
+			return;
+
+		cmpPlayers[i] = QueryPlayerIDInterface(i);
+		if (cmpPlayers[i].GetState() != "active" || i == msg.playerId) 
+			return;
+
+		if (!allies.length || cmpPlayers[allies[0]].IsMutualAlly(i))
+			allies.push(i);
+		else
+			onlyAlliesLeft = false;
+	});
+
+	// check if there are winners, or the game needs to continue
+	if (!allies.length || !onlyAlliesLeft || !(this.alliedVictory || allies.length == 1))
+		return; 
+
+	for each (var p in allies)
+		cmpPlayers[p].SetState("won");
+
+	// Reveal the map to all players
+	var cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
+	cmpRangeManager.SetLosRevealAll(-1, true);
+}
+
 Engine.RegisterSystemComponentType(IID_EndGameManager, "EndGameManager", EndGameManager);
diff --git a/binaries/data/mods/public/simulation/components/Player.js b/binaries/data/mods/public/simulation/components/Player.js
index 8406191..8bed7c2 100644
--- a/binaries/data/mods/public/simulation/components/Player.js
+++ b/binaries/data/mods/public/simulation/components/Player.js
@@ -27,7 +27,6 @@ Player.prototype.Init = function()
 	this.teamsLocked = false;
 	this.state = "active"; // game state - one of "active", "defeated", "won"
 	this.diplomacy = [];	// array of diplomatic stances for this player with respect to other players (including gaia and self)
-	this.conquestCriticalEntitiesCount = 0; // number of owned units with ConquestCritical class
 	this.formations = [];
 	this.startCam = undefined;
 	this.controlAllUnits = false;
@@ -337,11 +336,6 @@ Player.prototype.SetState = function(newState)
 	this.state = newState;
 };
 
-Player.prototype.GetConquestCriticalEntitiesCount = function()
-{
-	return this.conquestCriticalEntitiesCount;
-};
-
 Player.prototype.GetTeam = function()
 {
 	return this.team;
@@ -609,9 +603,6 @@ Player.prototype.OnGlobalOwnershipChanged = function(msg)
 
 	if (msg.from == this.playerID)
 	{
-		if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("ConquestCritical"))
-			this.conquestCriticalEntitiesCount--;
-
 		if (cmpCost)
 			this.popUsed -= cmpCost.GetPopCost();
 
@@ -625,9 +616,6 @@ Player.prototype.OnGlobalOwnershipChanged = function(msg)
 	}
 	if (msg.to == this.playerID)
 	{
-		if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("ConquestCritical"))
-			this.conquestCriticalEntitiesCount++;
-
 		if (cmpCost)
 			this.popUsed += cmpCost.GetPopCost();
 
diff --git a/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js b/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
index eedb54d..fe3a7b4 100644
--- a/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
+++ b/binaries/data/mods/public/simulation/components/tests/test_GuiInterface.js
@@ -78,7 +78,6 @@ AddMock(100, IID_Player, {
 	GetLockTeams: function() { return false; },
 	GetCheatsEnabled: function() { return false; },
 	GetDiplomacy: function() { return [-1, 1]; },
-	GetConquestCriticalEntitiesCount: function() { return 1; },
 	IsAlly: function() { return false; },
 	IsMutualAlly: function() { return false; },
 	IsNeutral: function() { return false; },
@@ -154,7 +153,6 @@ AddMock(101, IID_Player, {
 	GetLockTeams: function() {return false; },
 	GetCheatsEnabled: function() { return false; },
 	GetDiplomacy: function() { return [-1, 1]; },
-	GetConquestCriticalEntitiesCount: function() { return 1; },
 	IsAlly: function() { return true; },
 	IsMutualAlly: function() {return false; },
 	IsNeutral: function() { return false; },
