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..a8f953f 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;
-};
-*/
-
-vc.scripts = ["scripts/Conquest.js"];
-
-g_VictoryConditions.conquest = vc;
-vc = null;
+g_VictoryConditions.conquest = {
+	"name" : translate("Conquest"),
+	"description" : translate("Defeat all opponents"),
+	"scripts" : ["scripts/ConquestBase.js", "scripts/TriggerHelper.js", "scripts/Conquest.js"]
+};
\ No newline at end of file
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..ba8886c
--- /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/ConquestBase.js", "scripts/TriggerHelper.js", "scripts/ConquestStructures.js"]
+};
\ No newline at end of file
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..421f457
--- /dev/null
+++ b/binaries/data/mods/public/gui/gamesetup/victory_conditions/conquestUnits.js
@@ -0,0 +1,5 @@
+g_VictoryConditions.conquestStructure = {
+	"name" : translate("Conquest Units"),
+	"description" : translate("Destroy all units of enemies"),
+	"scripts" : ["scripts/ConquestBase.js", "scripts/TriggerHelper.js", "scripts/ConquestUnits.js"]
+};
\ No newline at end of file
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..65c2532 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;
-};
-*/
-
-vc.scripts = ["scripts/Conquest.js", "scripts/WonderVictory.js"];
-
-g_VictoryConditions.wonder = vc;
-vc = null;
+g_VictoryConditions.wonder = {
+	"name" : translate("Wonder"),
+	"description" : translate("Build a wonder to win"),
+	"scripts" : ["scripts/Conquest.js", "scripts/WonderVictory.js"]
+};
\ No newline at end of file
diff --git a/binaries/data/mods/public/maps/scripts/Conquest.js b/binaries/data/mods/public/maps/scripts/Conquest.js
index 867fa20..eda0de0 100644
--- a/binaries/data/mods/public/maps/scripts/Conquest.js
+++ b/binaries/data/mods/public/maps/scripts/Conquest.js
@@ -1,70 +1,10 @@
-/*
- * 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.classFilter = "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", "HandlerOwnerShipChanged", data);
+cmpTrigger.RegisterTrigger("OnStructureBuilt", "AddStructure", data);
+cmpTrigger.RegisterTrigger("OnTrainingFinished", "TrainingFinished", data);
+TrainingFinished
 
+cmpTrigger.DoAfterDelay(0, "StartGameCount", null);
diff --git a/binaries/data/mods/public/maps/scripts/ConquestBase.js b/binaries/data/mods/public/maps/scripts/ConquestBase.js
new file mode 100644
index 0000000..a6a3abc
--- /dev/null
+++ b/binaries/data/mods/public/maps/scripts/ConquestBase.js
@@ -0,0 +1,101 @@
+Trigger.prototype.HandlerOwnerShipChanged = function(msg)
+{
+	if (!this.dataInit || this.classFilter == "")
+		return;
+
+	if (!TriggerHelper.EntityHasClass(msg.entity, this.classFilter))
+		return;
+
+	if (msg.from == -1)
+		return;
+
+	if (!this.entitiesByPlayer[msg.from])
+	{
+		warn("Unknow player " + msg.from);
+		return;	
+	}
+
+	let entities = this.entitiesByPlayer[msg.from].entities;
+	let index = entities.indexOf(msg.entity);
+	if (index >= 0)
+	{
+		entities.splice(index, 1);
+		if (entities.length == 0)
+			Engine.PostMessage(this.entitiesByPlayer[msg.from].player, MT_PlayerDefeated, { "playerId": msg.from } );
+	}
+
+	if (msg.to <= 0 || !this.entitiesByPlayer[msg.to])
+		return;
+
+	let entitiesTo = this.entitiesByPlayer[msg.to].entities;
+	entitiesTo.push(msg.entity);
+}
+
+Trigger.prototype.AddStructure = function(msg)
+{
+	if (this.classFilter == "" || !TriggerHelper.EntityHasClass(msg.building, this.classFilter))
+		return;
+
+	let cmpOwnership = Engine.QueryInterface(msg.building, IID_Ownership);
+	if (!cmpOwnership)
+	{
+		warn("structure without Owner")
+		return;
+	}
+
+	let player = cmpOwnership.GetOwner();
+	if (!this.entitiesByPlayer[player])
+	{
+		warn("Unknow player " + player);
+		return;	
+	}
+	this.entitiesByPlayer[player].entities.push(msg.building);
+}
+
+Trigger.prototype.TrainingFinished = function(msg)
+{
+	if (this.classFilter == "" || !msg.entities.length || !msg.entities.every(elem => TriggerHelper.EntityHasClass(elem, this.classFilter)))
+		return;
+
+	let player = msg.owner;
+	if (!this.entitiesByPlayer[player])
+	{
+		warn("Unknow player " + player);
+		return;	
+	}
+	Array.prototype.push.apply(this.entitiesByPlayer[player].entities, msg.entities);
+}
+
+Trigger.prototype.StartGameCount = function()
+{
+	if (this.classFilter == "")
+	{
+		warn("classFilter undefined");
+		return;
+	}
+
+	let cmpRangeManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_RangeManager);
+	let cmpPlayerManager = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager);
+	let numPlayers = cmpPlayerManager.GetNumPlayers();
+	for (let i = 1; i < numPlayers; i++)
+	{
+		this.entitiesByPlayer[i] = {"entities" : []};
+		this.entitiesByPlayer[i].player = cmpPlayerManager.GetPlayerByID(i);
+		let entities = cmpRangeManager.GetEntitiesByPlayer(i);
+		for (let entity of entities)
+		{
+			if (!TriggerHelper.EntityHasClass(+entity, this.classFilter))
+				continue;
+			if (Engine.QueryInterface(+entity, IID_Foundation))
+				continue;
+			this.entitiesByPlayer[i].entities.push(+entity);
+		}
+	}
+	this.dataInit = true;
+}
+
+var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
+
+cmpTrigger.entitiesByPlayer = {};
+cmpTrigger.dataInit = false;
+cmpTrigger.classFilter = "";
\ No newline at end of file
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..4135fd4
--- /dev/null
+++ b/binaries/data/mods/public/maps/scripts/ConquestStructures.js
@@ -0,0 +1,8 @@
+var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
+cmpTrigger.classFilter = "Structure";
+
+var data = {"enabled": true};
+cmpTrigger.RegisterTrigger("OnOwnershipChanged", "HandlerOwnerShipChanged", data);
+cmpTrigger.RegisterTrigger("OnStructureBuilt", "AddStructure", data);
+
+cmpTrigger.DoAfterDelay(0, "StartGameCount", null);
\ No newline at end of file
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..fd36133
--- /dev/null
+++ b/binaries/data/mods/public/maps/scripts/ConquestUnits.js
@@ -0,0 +1,9 @@
+var cmpTrigger = Engine.QueryInterface(SYSTEM_ENTITY, IID_Trigger);
+cmpTrigger.classFilter = "Unit";
+
+var data = {"enabled": true};
+cmpTrigger.RegisterTrigger("OnOwnershipChanged", "HandlerOwnerShipChanged", data);
+cmpTrigger.RegisterTrigger("OnTrainingFinished", "TrainingFinished", data);
+
+
+cmpTrigger.DoAfterDelay(0, "StartGameCount", null);
\ No newline at end of file
diff --git a/binaries/data/mods/public/simulation/components/EndGameManager.js b/binaries/data/mods/public/simulation/components/EndGameManager.js
index 1b75b48..062e32d 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,47 @@ 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);
+	
+	// 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 (!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/Trigger.js b/binaries/data/mods/public/simulation/components/Trigger.js
index 99bbddb..343d72c 100644
--- a/binaries/data/mods/public/simulation/components/Trigger.js
+++ b/binaries/data/mods/public/simulation/components/Trigger.js
@@ -18,7 +18,7 @@ Trigger.prototype.eventNames =
 	"PlayerCommand",
 	"Interval",
 	"Range",
-	"TreasureCollected",
+	"TreasureCollected"
 ]; 
 
 Trigger.prototype.Init = function()
