diff --git a/Assets/Scripts/City/City.cs b/Assets/Scripts/City/City.cs
index 36f61e31b2f6688cbcd294309493ed2a87f01a7e..3d541d577393f21d6631bcc32510e289efab8e47 100644
--- a/Assets/Scripts/City/City.cs
+++ b/Assets/Scripts/City/City.cs
@@ -107,7 +107,19 @@ public class City : MonoBehaviour
         this.population += v;
     }
 
+    private void Update()
+    {
+        if (Input.GetKey(KeyCode.S))
+        {
+            GameObject go = new GameObject();
+            Quarry q = go.AddComponent<Quarry>();
+           
+            AddResource(q, 4000);
+            AddResource(go.AddComponent<Forest>(), 4000);
+            AddResource(go.AddComponent<BerryBush>(), 4000);
 
+        }
+    }
     /** 
 *  Lisaa resurssia r, maaran 'amount' verran (amount >= 0).
 *  Voidaan lisata maximissaan resurssin maximikapasiteettiin asti,
@@ -163,10 +175,11 @@ public class City : MonoBehaviour
                 {
                     for(int k = 0; k<resurssit.Count; k++)
                     {
-                        if(resurssit[k].GetType().Equals(lista[i].GetType()))
-                            resurssit.Remove(poolit[j].GetResource());
+                        if (resurssit[k].GetType().Equals(lista[i].GetType()))
+                            resurssit.RemoveAt(k);
                     }
 
+                    Debug.Log(poolit[j].GetAmount());
                     if (poolit[j].GetAmount() < amount)
                     {
                         return false;
@@ -174,7 +187,7 @@ public class City : MonoBehaviour
                 }
             }
         }
-
+        Debug.Log(resurssit.Count);
         return resurssit.Count == 0;
     }
     /**
@@ -204,6 +217,7 @@ public class City : MonoBehaviour
     }
     private void OnMouseEnter()
     {
-        Instantiate<GameObject>(shopPreFab);
+        GameObject go = Instantiate<GameObject>(shopPreFab);
+        go.transform.SetParent(transform);
     }
 }
diff --git a/Assets/Scripts/City/ResourcePool.cs b/Assets/Scripts/City/ResourcePool.cs
index bfb1ad059f74605ab3cfa4625d3d2f0b3eef6ba7..7125c6a429b5a58aca5607f87e7479cd9ca80f9a 100644
--- a/Assets/Scripts/City/ResourcePool.cs
+++ b/Assets/Scripts/City/ResourcePool.cs
@@ -28,6 +28,7 @@ public class ResourcePool : MonoBehaviour
     // Start is called before the first frame update
     void Start()
     {
+
     }
     public void SetResource(Resource r)
     {
diff --git a/Assets/Scripts/Resources/BerryBush.cs b/Assets/Scripts/Resources/BerryBush.cs
index 797fb98aa170407edd0a99fe6665388247d4737b..a59fb0c266193d36c1604fd310c3d9ded8408302 100644
--- a/Assets/Scripts/Resources/BerryBush.cs
+++ b/Assets/Scripts/Resources/BerryBush.cs
@@ -32,6 +32,7 @@ public class BerryBush : Resource
 
     public override void refreshSprite()
     {
+        if (sprites == null) return;
         if (getAmount() < 1)
         {
             gameObject.GetComponent<SpriteRenderer>().sprite = sprites[5];
diff --git a/Assets/Scripts/Resources/Forest.cs b/Assets/Scripts/Resources/Forest.cs
index 89d95640fb37c4d177290d8c524b5982e5dfd04a..479bc3769ced9b80243de47d65fd66937b397fce 100644
--- a/Assets/Scripts/Resources/Forest.cs
+++ b/Assets/Scripts/Resources/Forest.cs
@@ -22,6 +22,7 @@ public class Forest : Resource
 
     public override void refreshSprite()
     {
+        if (sprites == null) return;
         if (getAmount() < 125)
         {
             gameObject.GetComponent<SpriteRenderer>().sprite = sprites[7];
diff --git a/Assets/Scripts/Resources/Quarry.cs b/Assets/Scripts/Resources/Quarry.cs
index 4d2136b445f644cab6d5d7b895c58303f95ae274..d9369494e23d9d56d6e60a2af09f78edce1a7454 100644
--- a/Assets/Scripts/Resources/Quarry.cs
+++ b/Assets/Scripts/Resources/Quarry.cs
@@ -15,6 +15,7 @@ public class Quarry : Resource
 
     public override void refreshSprite()
     {
+        if (sprites == null) return;
         if (getAmount() < 100)
         {
             gameObject.GetComponent<SpriteRenderer>().sprite = sprites[5];
diff --git a/Assets/Scripts/UI/Border.cs b/Assets/Scripts/UI/Border.cs
index 1ab79087a14694a315c71a20335d5195df85c639..db78d55b4e219640c62f7200069781f91783ceef 100644
--- a/Assets/Scripts/UI/Border.cs
+++ b/Assets/Scripts/UI/Border.cs
@@ -18,7 +18,6 @@ public class Border : MonoBehaviour
 
     private void OnMouseEnter()
     {
-        Debug.Log("Kauppa kiinni");
         Destroy(transform.parent.gameObject);
     }
 }
diff --git a/Assets/Scripts/UI/BuyCapacity.cs b/Assets/Scripts/UI/BuyCapacity.cs
index eccf28eae58ff6dcadbd47880cf91e40f7b71933..0ed57f6cfb39d1f6ebafedd5d4934df77ec5017e 100644
--- a/Assets/Scripts/UI/BuyCapacity.cs
+++ b/Assets/Scripts/UI/BuyCapacity.cs
@@ -4,6 +4,7 @@ using UnityEngine;
 
 public class BuyCapacity : MonoBehaviour
 {
+
     // Start is called before the first frame update
     void Start()
     {
@@ -20,7 +21,23 @@ public class BuyCapacity : MonoBehaviour
     {
         if (Input.GetMouseButtonDown(1))
         {
-            Debug.Log("Ostit Tilaa");
+            City c = transform.root.gameObject.GetComponent<City>();
+            if (c.IsSufficientResources(createResourceGO(), 50))
+            {
+                List<int> cost = new List<int>() { 50, 50, 50 };
+                c.UseResources(cost);
+                c.IncreaseCapacity(50);
+
+                EventSystem.EventHappened(EventType.UpgradeBuilt);
+            }
         }
     }
+
+    private List<Resource> createResourceGO() {
+        GameObject go = new GameObject();
+        go.AddComponent<Forest>();
+        go.AddComponent<Quarry>();
+        go.AddComponent<BerryBush>();
+        return new List<Resource>(go.GetComponents<Resource>());
+    }
 }
diff --git a/Assets/Scripts/UI/BuyCity.cs b/Assets/Scripts/UI/BuyCity.cs
index 71795aff48c302bbf8f5cd5641822a4522ef54fa..e9c49804f3c76f2949e9779f440b1f1f3ba0b2ae 100644
--- a/Assets/Scripts/UI/BuyCity.cs
+++ b/Assets/Scripts/UI/BuyCity.cs
@@ -11,20 +11,35 @@ public class BuyCity : MonoBehaviour
     // Start is called before the first frame update
     void Start()
     {
-        
+
     }
 
     // Update is called once per frame
     void Update()
     {
-        
+
     }
 
     private void OnMouseOver()
     {
         if (Input.GetMouseButtonDown(1))
         {
-            Instantiate<GameObject>(endGame);
+            City c = transform.root.gameObject.GetComponent<City>();
+
+            if (c.population > 200 && c.IsSufficientResources(createResourceGO(), 150))
+            {
+                Instantiate<GameObject>(endGame);
+            }
         }
     }
+
+    private List<Resource> createResourceGO()
+    {
+        GameObject go = new GameObject();
+        go.AddComponent<Forest>();
+        go.AddComponent<Quarry>();
+        go.AddComponent<BerryBush>();
+        return new List<Resource>(go.GetComponents<Resource>());
+    }
 }
+    
diff --git a/Assets/Scripts/UI/BuyCollector.cs b/Assets/Scripts/UI/BuyCollector.cs
index 3af7ce3e8a5ff41fb4619d9f3678e49d27136026..d74e9c6a43f70da97be8dbc07fb966a406447a12 100644
--- a/Assets/Scripts/UI/BuyCollector.cs
+++ b/Assets/Scripts/UI/BuyCollector.cs
@@ -20,7 +20,26 @@ public class BuyCollector : MonoBehaviour
     {
         if (Input.GetMouseButtonDown(1))
         {
-            Debug.Log("Ostit Tyovoimaa");
+            City c = transform.root.gameObject.GetComponent<City>();
+
+
+            if (c.IsSufficientResources(createResourceGO(), 50))
+            {
+                List<int> cost = new List<int>() { 50, 50, 50 };
+                c.UseResources(cost);
+                c.AddCollector();
+
+                EventSystem.EventHappened(EventType.UpgradeBuilt);
+            }
         }
     }
+
+    private List<Resource> createResourceGO()
+    {
+        GameObject go = new GameObject();
+        go.AddComponent<Forest>();
+        go.AddComponent<Quarry>();
+        go.AddComponent<BerryBush>();
+        return new List<Resource>(go.GetComponents<Resource>());
+    }
 }
diff --git a/Assets/Scripts/UI/BuyEfficiency.cs b/Assets/Scripts/UI/BuyEfficiency.cs
index e0dc181f72f7870d7ad0a2b52c0c88d16b9eee80..feb55dd3657526db35cd416c2987c6ecd9cce90f 100644
--- a/Assets/Scripts/UI/BuyEfficiency.cs
+++ b/Assets/Scripts/UI/BuyEfficiency.cs
@@ -20,9 +20,15 @@ public class BuyEfficiency : MonoBehaviour
     {
         if (Input.GetMouseButtonDown(1))
         {
-            Debug.Log("Ostit Tehokkuutta");
-            ResourceEfficiencyUpgrade reu = gameObject.GetComponent<ResourceEfficiencyUpgrade>();
-            reu.UpgradeEfficiency();
+            List<Resource> resources = new List<Resource>(3);
+            City c = transform.root.gameObject.GetComponent<City>();
+            if (c.IsSufficientResources(resources, 50))
+            {
+                List<int> cost = new List<int>() { 50, 50, 50 };
+                c.UseResources(cost);
+
+                EventSystem.EventHappened(EventType.UpgradeBuilt);
+            }
         }
     }
 }
diff --git a/Assets/Scripts/UI/BuyPopulation.cs b/Assets/Scripts/UI/BuyPopulation.cs
index d746afbb26df5dab5832f666f2b5beef125533f4..2da19d4b43ddf97cfc04d28ae5bc8e7e1dc2c559 100644
--- a/Assets/Scripts/UI/BuyPopulation.cs
+++ b/Assets/Scripts/UI/BuyPopulation.cs
@@ -20,8 +20,27 @@ public class BuyPopulation : MonoBehaviour
     {
         if (Input.GetMouseButtonDown(1))
         {
-            PopulationUpgrade pop = gameObject.GetComponent<PopulationUpgrade>();
-            pop.UpgradePopulation();
+            City c = transform.root.gameObject.GetComponent<City>();
+            List<int> cost = new List<int>() { 50, 50, 50 };
+            if (c.IsSufficientResources(createResourceGO(), 50))
+            {
+                c.UseResources(cost);
+                c.AddPopulation(50);
+
+                EventSystem.EventHappened(EventType.UpgradeBuilt);
+            } else
+            {
+                Debug.Log("Not enough resources");
+            }
         }
     }
+
+    private List<Resource> createResourceGO()
+    {
+        GameObject go = new GameObject();
+        go.AddComponent<Forest>();
+        go.AddComponent<Quarry>();
+        go.AddComponent<BerryBush>();
+        return new List<Resource>(go.GetComponents<Resource>());
+    }
 }
diff --git a/Assets/Scripts/UI/BuySpeed.cs b/Assets/Scripts/UI/BuySpeed.cs
index 52b0f92d83270581be0f57948b97a4105fc2f952..22e3bfdad0c34f45e4a75afd795620b953bbef3f 100644
--- a/Assets/Scripts/UI/BuySpeed.cs
+++ b/Assets/Scripts/UI/BuySpeed.cs
@@ -20,7 +20,24 @@ public class BuySpeed : MonoBehaviour
     {
         if (Input.GetMouseButtonDown(1))
         {
-            Debug.Log("Ostit Nopeutta");
+            City c = transform.root.gameObject.GetComponent<City>();
+            if (c.IsSufficientResources(createResourceGO(), 50))
+                {
+                c.UpgradeWorkerSpeed();
+                List<int> cost = new List<int>() { 50, 50, 50 };
+                c.UseResources(cost);
+
+                EventSystem.EventHappened(EventType.UpgradeBuilt);
+            }
         }
     }
+
+    private List<Resource> createResourceGO()
+    {
+        GameObject go = new GameObject();
+        go.AddComponent<Forest>();
+        go.AddComponent<Quarry>();
+        go.AddComponent<BerryBush>();
+        return new List<Resource>(go.GetComponents<Resource>());
+    }
 }
diff --git a/Assets/Scripts/UI/UpgradeShop.cs b/Assets/Scripts/UI/UpgradeShop.cs
index e68e8d001d296926d90b87d2771b3c9a341bec22..228458b368a7db4862173bd374d9fddc883d4dcb 100644
--- a/Assets/Scripts/UI/UpgradeShop.cs
+++ b/Assets/Scripts/UI/UpgradeShop.cs
@@ -19,6 +19,6 @@ public class UpgradeShop : MonoBehaviour
 
     private void OnMouseEnter()
     {
-        Debug.Log("Kauppa auki");
+
     }
 }
diff --git a/Assets/Scripts/UI/UsableResources.cs b/Assets/Scripts/UI/UsableResources.cs
new file mode 100644
index 0000000000000000000000000000000000000000..fad98447aaf46d7f7f1e7c339f84f90031aa767a
--- /dev/null
+++ b/Assets/Scripts/UI/UsableResources.cs
@@ -0,0 +1,18 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class UsableResources : MonoBehaviour
+{
+    // Start is called before the first frame update
+    void Start()
+    {
+        
+    }
+
+    // Update is called once per frame
+    void Update()
+    {
+        
+    }
+}
diff --git a/Assets/Scripts/UI/UsableResources.cs.meta b/Assets/Scripts/UI/UsableResources.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..ef47aea0a173a56999fd3216c86536bb75eaaaab
--- /dev/null
+++ b/Assets/Scripts/UI/UsableResources.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 132e9ec36ed413a4b868b617846af5e7
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Upgrades/CollectorUpgrade.cs b/Assets/Scripts/Upgrades/CollectorUpgrade.cs
index 698c69f81df2271713aa2f59445cbd456d772dcb..00d6f3c3f00cd3769e5846220d469299fa6e49f5 100644
--- a/Assets/Scripts/Upgrades/CollectorUpgrade.cs
+++ b/Assets/Scripts/Upgrades/CollectorUpgrade.cs
@@ -23,8 +23,9 @@ public class CollectorUpgrade : Upgrade
         City city = gameObject.GetComponent<City>();
         int currentLevel = city.GetLevel(target);
 
-        if (currentLevel <= city.GetLevel(UpgradeTargets.city) * maxLevelModifier)
+        if (currentLevel <= maxLevelModifier)
         {
+            Debug.Log("Collector Upgraded");
             city.UseResources(GetPrices(currentLevel));
             city.AddCollector();
         }
diff --git a/Assets/Scripts/Upgrades/PopulationUpgrade.cs b/Assets/Scripts/Upgrades/PopulationUpgrade.cs
index e53bb682b2e5661e566d529373ee74dfc4634541..7ab9a5c28cab234c007d8a26d93761ef03a50513 100644
--- a/Assets/Scripts/Upgrades/PopulationUpgrade.cs
+++ b/Assets/Scripts/Upgrades/PopulationUpgrade.cs
@@ -39,9 +39,10 @@ public class PopulationUpgrade : Upgrade
                 break;
         }
         */
-        if (currentLevel <= city.GetLevel(UpgradeTargets.city) * maxLevelModifier)
+        if (currentLevel <= maxLevelModifier)
         {
             city.UseResources(GetPrices(currentLevel + 1));
+            city.populationLevel++;
             city.AddPopulation(currentLevel * 10);
             Debug.Log("population upgraded");
         }
diff --git a/Assets/Scripts/Upgrades/ResourceCapacityUpgrade.cs b/Assets/Scripts/Upgrades/ResourceCapacityUpgrade.cs
index 3f17ea3427668157c75c22cb8f418d61ca06e607..b76775598b3eb8f3d37f535ff103657ef360a629 100644
--- a/Assets/Scripts/Upgrades/ResourceCapacityUpgrade.cs
+++ b/Assets/Scripts/Upgrades/ResourceCapacityUpgrade.cs
@@ -22,10 +22,11 @@ public class ResourceCapacityUpgrade : Upgrade
         City city = gameObject.GetComponent<City>();
         int currentLevel = city.GetLevel(target);
 
-        if (currentLevel <= city.GetLevel(UpgradeTargets.city) * maxLevelModifier)
+        if (currentLevel <= maxLevelModifier)
         {
             city.UseResources((GetPrices(currentLevel)));
-            city.IncreaseCapacity(currentLevel * 100);
+            city.resourcePoolLevel++;
+            city.IncreaseCapacity(currentLevel * 100);            
             Debug.Log("Capacity upgraded");
         }
     }
diff --git a/Assets/Scripts/Upgrades/RoadUpgrade.cs b/Assets/Scripts/Upgrades/RoadUpgrade.cs
index 6ef9e4daafc52f2d623ddcaed3cd1e86dc5d898e..eda086959b26353e13a84509044bb7861235c3b2 100644
--- a/Assets/Scripts/Upgrades/RoadUpgrade.cs
+++ b/Assets/Scripts/Upgrades/RoadUpgrade.cs
@@ -24,7 +24,7 @@ public class RoadUpgrade : Upgrade
         City city = gameObject.GetComponent<City>();
         int currentLevel = (int) road.GetLevel(target);
 
-        if (currentLevel <= city.GetLevel(UpgradeTargets.city) * maxLevelModifier)
+        if (currentLevel <= maxLevelModifier)
         {
             city.UseResources(GetPrices(currentLevel));
             road.IncreaseSpeed(1 / currentLevel);
diff --git a/Assets/Scripts/Upgrades/Upgrade.cs b/Assets/Scripts/Upgrades/Upgrade.cs
index 9bc13dc5d1fafcfc3df4ab2134527ff2e795af59..6a52a277c876b2ac0f06b06392eba23184cb2e4b 100644
--- a/Assets/Scripts/Upgrades/Upgrade.cs
+++ b/Assets/Scripts/Upgrades/Upgrade.cs
@@ -8,13 +8,6 @@ public abstract class Upgrade : MonoBehaviour
 
     private float efficiencyLevel = 1;
 
-    private Dictionary<Resource, int> resources = new Dictionary<Resource, int>()
-    {
-        { null , 1},
-        { null , 1},
-        { null , 0},
-    };
-
     // Start is called before the first frame update
     void Start()
     {
@@ -63,10 +56,9 @@ public abstract class Upgrade : MonoBehaviour
     public List<int> GetPrices(float modifier)
     {
         List<int> prices = new List<int>();
-        foreach(KeyValuePair<Resource, int> key in resources)
-        {
-            prices.Add((int) (key.Value * modifier * 50 * GetEfficiency()));
-        }
+        
+        prices.Add((int) (1 * modifier * 50 * GetEfficiency()));
+        
         return prices;
     }