diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9873f784b92a06d48beaaca254b04d157fd37686..fc7cc8bb9bc6264092a52a251f2a820fef718b38 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,14 +3,20 @@ image:
   entrypoint:
     - '/usr/bin/env'
     - 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
-
 stages:
   - Test and Lint
-  - Staging Plan
-  - Staging Apply
+  - Apply
   - Integration Test
   - Destroy
 
+.load_tf_workspace: &load_tf_workspace |
+  if [[ $CI_COMMIT_REF_SLUG == "master" ]]; then
+    export TF_WORKSPACE="staging"
+  else
+    export TF_WORKSPACE="dev"
+  fi
+
+
 Validate Terraform:
   stage: Test and Lint
   script:
@@ -19,20 +25,12 @@ Validate Terraform:
     - terraform init -backend=false
     - terraform validate
   rules:
-    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^(master)$/ || $CI_COMMIT_BRANCH =~ /^(master)$/'
+    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_COMMIT_BRANCH == "master"'
 
-Staging Plan:
-  stage: Staging Plan
-  script:
-    - cd deploy/
-    - terraform init
-    - terraform workspace select staging || terraform workspace new staging
-    - terraform plan -var-file=vars/staging.tfvars
-  rules:
-    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME =~ /^(master)$/ || $CI_COMMIT_BRANCH =~ /^(master)$/'
-
-Staging Apply:
-  stage: Staging Apply
+Apply:
+  stage: Apply
+  before_script:
+    - *load_tf_workspace
   script:
     - apk add --update npm
     - cd deploy/
@@ -40,14 +38,14 @@ Staging Apply:
     - npm install
     - cd -
     - terraform init
-    - terraform workspace select staging
-    - terraform apply -var-file=vars/staging.tfvars -auto-approve
+    - terraform plan -var-file=vars/${TF_WORKSPACE}.tfvars -out=tfplan.out
+    - terraform apply tfplan.out
     - echo "API_ENDPOINT=$(terraform output -raw api_endpoint)" >> ../deploy.env
   artifacts:
     reports:
       dotenv: deploy.env
   rules:
-    - if: '$CI_COMMIT_BRANCH =~ /^(master)$/'
+    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_COMMIT_BRANCH == "master"'
 
 Integration Tests:
   stage: Integration Test
@@ -57,7 +55,7 @@ Integration Tests:
   script:
     - newman run Lambda_CRUD.postman_collection.json --env-var "endpoint=$API_ENDPOINT"
   rules:
-    - if: '$CI_COMMIT_BRANCH =~ /^(master)$/'
+    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_COMMIT_BRANCH == "master"'
 
 Load Tests:
   stage: Integration Test
@@ -70,16 +68,19 @@ Load Tests:
     - echo "PATCH $API_ENDPOINT/crud" | vegeta attack -duration=3s -rate=100/s | vegeta report
     - echo "DELETE $API_ENDPOINT/crud" | vegeta attack -duration=3s -rate=100/s | vegeta report
   rules:
-    - if: '$CI_COMMIT_BRANCH =~ /^(master)$/'
+    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_COMMIT_BRANCH == "master"'
+      allow_failure: true
       when: manual
 
-Staging Destroy:
+Destroy:
   stage: Destroy
+  before_script:
+    - *load_tf_workspace
   script:
     - cd deploy/
     - terraform init
-    - terraform workspace select staging
-    - terraform destroy -var-file=vars/staging.tfvars -auto-approve
-  rules: 
-    - if: '$CI_COMMIT_BRANCH =~ /^(master)$/'
+    - terraform destroy -var-file=vars/${TF_WORKSPACE}.tfvars -auto-approve
+  rules:
+    - if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master" || $CI_COMMIT_BRANCH == "master"'
+      allow_failure: true
       when: manual