diff --git a/Assets/Prefabs/Enemy1.prefab b/Assets/Prefabs/Enemy1.prefab
deleted file mode 100644
index ddf75f0456fccff30af55adda27844ec0a60ccf3..0000000000000000000000000000000000000000
Binary files a/Assets/Prefabs/Enemy1.prefab and /dev/null differ
diff --git a/Assets/Prefabs/Enemy1.prefab.meta b/Assets/Prefabs/Enemy1.prefab.meta
deleted file mode 100644
index 374528014cd32713a24e35a9bafb1f098d8b3187..0000000000000000000000000000000000000000
--- a/Assets/Prefabs/Enemy1.prefab.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: b7d040d340613724d8fe77aa97d80cfe
-timeCreated: 1506415337
-licenseType: Free
-NativeFormatImporter:
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Assets/Prefabs/Enemy2.prefab b/Assets/Prefabs/Enemy2.prefab
deleted file mode 100644
index 36b760fc4f413ebb003d36a6064e111604a8a4d3..0000000000000000000000000000000000000000
Binary files a/Assets/Prefabs/Enemy2.prefab and /dev/null differ
diff --git a/Assets/Prefabs/Enemy2.prefab.meta b/Assets/Prefabs/Enemy2.prefab.meta
deleted file mode 100644
index b66638bb4f8d6284119e91b5645fab26b59e65df..0000000000000000000000000000000000000000
--- a/Assets/Prefabs/Enemy2.prefab.meta
+++ /dev/null
@@ -1,8 +0,0 @@
-fileFormatVersion: 2
-guid: a0c7da998a25fa04f8465e15b1559371
-timeCreated: 1506433459
-licenseType: Free
-NativeFormatImporter:
-  userData: 
-  assetBundleName: 
-  assetBundleVariant: 
diff --git a/Assets/Prefabs/EnemyGreen.prefab b/Assets/Prefabs/EnemyGreen.prefab
index 3ee3265f6e40d755d9f48dd9203bca6d6e0a8da9..603ac92f40229d007d73a5d3cb603457148d65ff 100644
Binary files a/Assets/Prefabs/EnemyGreen.prefab and b/Assets/Prefabs/EnemyGreen.prefab differ
diff --git a/Assets/Prefabs/EnemyWhite.prefab b/Assets/Prefabs/EnemyWhite.prefab
index d13aef8c731a99c20213dd5353383c78a2957382..a10e7ead79a3a97ab02d433f8bc8086378b02724 100644
Binary files a/Assets/Prefabs/EnemyWhite.prefab and b/Assets/Prefabs/EnemyWhite.prefab differ
diff --git a/Assets/Scenes/BaseScene.unity b/Assets/Scenes/BaseScene.unity
index d8589492ca8c6b3a4effff6f8d636aec8a7963bb..5d9e48d711e2baa34d441c21a639c07768902cc1 100644
Binary files a/Assets/Scenes/BaseScene.unity and b/Assets/Scenes/BaseScene.unity differ
diff --git a/Assets/Scenes/GameOver.unity b/Assets/Scenes/GameOver.unity
index d422e0fd5307641442f7269f538f23817b34de56..318292af8cf5d019831b2dcf008a3cd3d0d835d7 100644
Binary files a/Assets/Scenes/GameOver.unity and b/Assets/Scenes/GameOver.unity differ
diff --git a/Assets/Scripts/Game/BaseEnemyManager.cs b/Assets/Scripts/Game/BaseEnemyManager.cs
index a278699523da3564fab591a983d60412f5e3ce06..0bdd1bdb28881bd6b2d5cc154329bdb550cef383 100644
--- a/Assets/Scripts/Game/BaseEnemyManager.cs
+++ b/Assets/Scripts/Game/BaseEnemyManager.cs
@@ -25,6 +25,9 @@ public class BaseEnemyManager : MonoBehaviour
     [SerializeField]
     Renderer renderer;
 
+    public EnemyFactory enemyFactory;
+    public EnemyFactory.EnemyType enemyType = EnemyFactory.EnemyType.normalEnemy;
+
     // Use this for initialization
     protected void Start ()
     {
@@ -45,7 +48,8 @@ public class BaseEnemyManager : MonoBehaviour
         shooterManager.Shoot(shootDirection);
         if (transform.position.x < - UtilityMeasures.ScreenWidthInUnits() / 2f - 1f)
         {
-            Destroy(this.gameObject);
+            //Destroy(this.gameObject);
+            enemyFactory.Release(this.gameObject);
         }
     }
 }
diff --git a/Assets/Scripts/Game/BulletManager.cs b/Assets/Scripts/Game/BulletManager.cs
index f42da5a4fbd675175e2730497e7a35fe52dd6363..d70a95135366c5b8f0c031b092a035beea375ad2 100644
--- a/Assets/Scripts/Game/BulletManager.cs
+++ b/Assets/Scripts/Game/BulletManager.cs
@@ -28,7 +28,7 @@ public class BulletManager : MonoBehaviour
     {
         GameObject other = collision.gameObject;
         if ((bulletType.Equals(BulletFactory.BulletType.playerBullet) && other.CompareTag("Enemy")) ||
-            (bulletType.Equals(BulletFactory.BulletType.enemyBullet) && other.CompareTag("Player")))
+            (bulletType.Equals(BulletFactory.BulletType.enemyBullet) && other.CompareTag("Player") && !ImmunityManager.Instance.isImmune))
         {
             bulletFactory.Release(this.gameObject);
             HealthManager otherHealthManager = other.GetComponent<HealthManager>();
@@ -36,6 +36,10 @@ public class BulletManager : MonoBehaviour
             {
                 otherHealthManager.TakeDamage(damage);
             }
+            if(other.CompareTag("Player"))
+            {
+                ImmunityManager.Instance.BecomeImmune();
+            }
         }
     }
 }
diff --git a/Assets/Scripts/Game/DashManager.cs b/Assets/Scripts/Game/DashManager.cs
index e9ac54b74b5cff9462ad213a587b1c67ed31e9a8..6f816d799595b3aaba1815c34624a7457657bc4b 100644
--- a/Assets/Scripts/Game/DashManager.cs
+++ b/Assets/Scripts/Game/DashManager.cs
@@ -30,6 +30,7 @@ public class DashManager : MonoBehaviour
             dashStart = Time.time;
             dashDirection = direction;
             isDashing = true;
+            ImmunityManager.Instance.BecomeImmune();
         }
     }
 	
diff --git a/Assets/Scripts/Game/EnemyGenerator.cs b/Assets/Scripts/Game/EnemyGenerator.cs
index df5eb7d19ce07d440b4541a64aeca391b839485b..43bbb71df5046e270c17a54282e78e58138332e7 100644
--- a/Assets/Scripts/Game/EnemyGenerator.cs
+++ b/Assets/Scripts/Game/EnemyGenerator.cs
@@ -4,8 +4,11 @@ using UnityEngine;
 
 public class EnemyGenerator : MonoBehaviour {
 
+    /*
     [SerializeField]
-    GameObject[] enemyPrefabs;
+    GameObject[] enemyPrefabs;*/
+    [SerializeField]
+    EnemyFactory.EnemyType[] enemyTypes;
     float minY = -8;
     float maxY = 8;
     float X = 10;
@@ -14,6 +17,8 @@ public class EnemyGenerator : MonoBehaviour {
     float lastEnemyTime = float.NegativeInfinity;
     [SerializeField]
     BulletFactory bulletFactory;
+    [SerializeField]
+    EnemyFactory enemyFactory;
 
 	// Use this for initialization
 	void Start ()
@@ -34,11 +39,11 @@ public class EnemyGenerator : MonoBehaviour {
 	void Update ()
     {
         UpdateSizes();
-        if (enemyPrefabs.Length > 0 && Time.time - lastEnemyTime > timeBetweenEnemies)
+        if (enemyTypes.Length > 0 && Time.time - lastEnemyTime > timeBetweenEnemies)
         {
-            int selectedEnemy = Random.Range((int)0, (int)enemyPrefabs.Length);
+            int selectedEnemy = Random.Range((int)0, (int)enemyTypes.Length);
             float Y = Random.Range(minY, maxY);
-            GameObject newEnemy = Instantiate(enemyPrefabs[selectedEnemy]);
+            GameObject newEnemy = enemyFactory.GetEnemy(enemyTypes[selectedEnemy]);
             ShooterManager enemyShooterManager = newEnemy.GetComponent<ShooterManager>();
             if(enemyShooterManager)
             {
diff --git a/Assets/Scripts/Game/HealthManager.cs b/Assets/Scripts/Game/HealthManager.cs
index f849941fee31a9b88201036abaa740ef87806056..127dc93c1a7fe68bba55b84ec741b86d276105fa 100644
--- a/Assets/Scripts/Game/HealthManager.cs
+++ b/Assets/Scripts/Game/HealthManager.cs
@@ -24,7 +24,6 @@ public class HealthManager : MonoBehaviour
             {
                 deathManager.Die();
             }
-            Destroy(this.gameObject);
         }
     }
 
diff --git a/Assets/Scripts/Game/PlayerController.cs b/Assets/Scripts/Game/PlayerController.cs
index 42abae9557151c371b34ec85b6017bed25081dfe..7e3aa1676bba119653030607f167341bfbf2955d 100644
--- a/Assets/Scripts/Game/PlayerController.cs
+++ b/Assets/Scripts/Game/PlayerController.cs
@@ -16,8 +16,7 @@ public class PlayerController : MonoBehaviour {
     float movementWidth = 6;
     float movementLength = 1;
 
-    [SerializeField]
-    Vector3 basePosition = new Vector3(-9, 0, 0);
+    Vector3 basePosition;
 
     [SerializeField]
     float dashKeyDelay = 0.5f;
@@ -27,12 +26,14 @@ public class PlayerController : MonoBehaviour {
 
     private void Start()
     {
+        basePosition = new Vector3(-9f * UtilityMeasures.ScreenWidthInUnits() / 20f, 0, 0);
         transform.position = basePosition;
         UpdateSizes();
     }
 
     void UpdateSizes()
     {
+        basePosition = new Vector3(-9f * UtilityMeasures.ScreenWidthInUnits() / 20f, 0, 0);
         movementWidth = UtilityMeasures.ScreenHeightInUnits() / 2f;
         movementLength = (UtilityMeasures.ScreenWidthInUnits() / 2f) + basePosition.x;
     }
diff --git a/Assets/Scripts/Game/PlayerDeathManager.cs b/Assets/Scripts/Game/PlayerDeathManager.cs
index feb41a93a406d35427773a92eed6581f198dbcbc..f23be8db1263f52438b7deab9de32a4085080c85 100644
--- a/Assets/Scripts/Game/PlayerDeathManager.cs
+++ b/Assets/Scripts/Game/PlayerDeathManager.cs
@@ -7,6 +7,8 @@ public class PlayerDeathManager : DeathManager
     public override void Die()
     {
         base.Die();
+        ScoreMemory.Instance.savedScore = ScoreManager.Instance.GetScore();
         UnityEngine.SceneManagement.SceneManager.LoadScene("GameOver");
+        Destroy(this.gameObject);
     }
 }
diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset
index 76e521f6b89ddb37c491a02e55d2889c9a59e36a..dc9dd9497d9a7bb9836e9a110ea9c57ce649a393 100644
Binary files a/ProjectSettings/EditorBuildSettings.asset and b/ProjectSettings/EditorBuildSettings.asset differ
diff --git a/Shoot'em up.csproj b/Shoot'em up.csproj
index a4996741293e1fb7f4dc86603facf8bfaa9b4460..7889de1de0413246d290a32ceafbe7ab93cef332 100644
--- a/Shoot'em up.csproj	
+++ b/Shoot'em up.csproj	
@@ -82,6 +82,8 @@
     <Compile Include="Assets\Scripts\Game\BulletManager.cs" />
     <Compile Include="Assets\Scripts\Game\DashManager.cs" />
     <Compile Include="Assets\Scripts\Game\DeathManager.cs" />
+    <Compile Include="Assets\Scripts\Game\EnemyDeathManager.cs" />
+    <Compile Include="Assets\Scripts\Game\EnemyFactory.cs" />
     <Compile Include="Assets\Scripts\Game\EnemyGenerator.cs" />
     <Compile Include="Assets\Scripts\Game\EnergyManager.cs" />
     <Compile Include="Assets\Scripts\Game\EnergySliderManager.cs" />
@@ -89,10 +91,14 @@
     <Compile Include="Assets\Scripts\Game\HealthAndEnergyPrinter.cs" />
     <Compile Include="Assets\Scripts\Game\HealthManager.cs" />
     <Compile Include="Assets\Scripts\Game\HealthSliderManager.cs" />
+    <Compile Include="Assets\Scripts\Game\ImmunityManager.cs" />
     <Compile Include="Assets\Scripts\Game\MoveableManager.cs" />
     <Compile Include="Assets\Scripts\Game\PlayerController.cs" />
     <Compile Include="Assets\Scripts\Game\PlayerDeathManager.cs" />
     <Compile Include="Assets\Scripts\Game\PlayerShooterManager.cs" />
+    <Compile Include="Assets\Scripts\Game\ScoreManager.cs" />
+    <Compile Include="Assets\Scripts\Game\ScoreMemory.cs" />
+    <Compile Include="Assets\Scripts\Game\ScorePrinter.cs" />
     <Compile Include="Assets\Scripts\Game\ShooterManager.cs" />
     <Compile Include="Assets\Scripts\Game\UIGunType.cs" />
     <Compile Include="Assets\Scripts\Game\UtilityMeasures.cs" />
@@ -100,6 +106,7 @@
     <Compile Include="Assets\Scripts\Game\ZigzagEnemyManager.cs" />
     <Compile Include="Assets\Scripts\Menus\ContinueButton.cs" />
     <Compile Include="Assets\Scripts\Menus\ExitButton.cs" />
+    <Compile Include="Assets\Scripts\Menus\GameOverScorePrinter.cs" />
     <Compile Include="Assets\Scripts\Menus\PlayButton.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />