diff --git a/.ci/_config_devel.yml b/.ci/_config_devel.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2209ccb97ea25544c0bf5861d4575952a68dcdd3
--- /dev/null
+++ b/.ci/_config_devel.yml
@@ -0,0 +1,2 @@
+url: "https://howto-latest.lcsb.uni.lu"
+baseurl: "/"
diff --git a/.ci/_config_master.yml b/.ci/_config_master.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5366871f6f2740337e2089472682b3c3fe20ebd0
--- /dev/null
+++ b/.ci/_config_master.yml
@@ -0,0 +1,2 @@
+url: "https://howto.lcsb.uni.lu"
+baseurl: "/"
diff --git a/.ci/_config_old.yml b/.ci/_config_old.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9a62b88f0c1034d3827d9a3e19a940b36da4662d
--- /dev/null
+++ b/.ci/_config_old.yml
@@ -0,0 +1 @@
+url: "https://r3.pages.uni.lu"
diff --git a/.ci/build_indices_new.sh b/.ci/build_indices_new.sh
new file mode 100644
index 0000000000000000000000000000000000000000..0c2d4067ee29969871390250be3038ad39c7d5a8
--- /dev/null
+++ b/.ci/build_indices_new.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+
+# Install lunr to build the index
+npm install lunr@$LUNR_VERSION
+
+# Go to the directory containing the built website...
+cd $DIRECTORY
+
+echo "Generating the index..."    
+
+# Pipe documents.js file (which should be generated by Jekyll after building the website) through build script
+cat documents.js | node build_index.js > index.js
+
+# Show the results (should not be empty)
+echo "...should be completed. First 50 characters of the index: "
+cat index.js | head -c50
+echo ""
+
+rm documents.js build_index.js
diff --git a/.ci/deploy.sh b/.ci/deploy.sh
index d6f5cceb7ad6b0dc94884c6f71ceda2aeff5dc9e..39bb8f29398b96a639938ca5507d84f2d363f02f 100644
--- a/.ci/deploy.sh
+++ b/.ci/deploy.sh
@@ -16,9 +16,12 @@ for branch in $(git for-each-ref --format='%(refname:strip=3)' refs/remotes); do
     git reset --hard $branch
     git pull
 
+    # Generate the config dynamically
+    echo 'url: "https://r3.pages.uni.lu"' > _config_url.yml
+
     # build the website
     bundle install
-    bundle exec jekyll build --baseurl="howto-cards/$artefact" -d "build/$artefact"
+    bundle exec jekyll build --config "_config.yml,_config_url.yml" --baseurl="howto-cards/$artefact" -d "build/$artefact"
 
     if [[ $branch == "master" ]]; then
         # set the 404
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 10392b2efd36e3982d372f769b7b646313570ee7..3fa677d9431abeb6189016805f2ae131385e2e81 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,6 +6,16 @@ stages:
   - generate_index
   - deploy
 
+# !!!!!!!      README      !!!!!
+# We are in the transition period - and the website is deployed two times - to gitlab pages and to a separate VM
+# In order to migrate to a new deployment:
+#  1) remove "Old deployment" section - build_pages, generate the search index and pages tasks
+#  2) rename "new pages" to "pages" in the new deployment section, and "new_public" to "public"; you might also rename directories (skip "new" part)
+#  3) remove ".ci/deploy.sh", ".ci/build_indices.sh"
+
+
+# Old deployment =================================================================
+
 build_pages:
   stage: build
   before_script:
@@ -48,3 +58,81 @@ pages:
     expire_in: 1 week
     paths:
       - public
+
+
+# New deployment ==================================================================
+
+build pages for VM deployment:
+  stage: build
+  variables:
+    JEKYLL_ENV: production
+    BUNDLER_VERSION: 2.0.2
+  artifacts:
+    expire_in: 1 day
+    paths:
+      - new_build
+  before_script:
+    - gem install bundler:$BUNDLER_VERSION && bundle install  
+  script:
+    # Generate the configuration for forks (will use Gitlab Pages on personal namespaces)
+    - 'echo "url: https://$CI_PROJECT_NAMESPACE.$CI_PAGES_DOMAIN" >> .ci/_config_gitlab_pages.yml'
+    - 'echo "baseurl: /$CI_PROJECT_NAME" >> .ci/_config_gitlab_pages.yml'
+
+    # If there is no config for the current branch, use the one for Gitlab Pages
+    - 'if [ ! -f ".ci/_config_$CI_COMMIT_REF_NAME.yml" ]; then mv .ci/_config_gitlab_pages.yml .ci/_config_$CI_COMMIT_REF_NAME.yml; fi'
+
+    # Display, which configuration is used
+    - 'echo "Configuration: " && cat ".ci/_config_$CI_COMMIT_REF_NAME.yml"'
+
+    # Run Jekyll with custom configuration
+    - bundle exec jekyll build -d new_build --config "_config.yml,.ci/_config_$CI_COMMIT_REF_NAME.yml"
+
+
+generate the search index for VM deployment:
+  stage: generate_index
+  image: node:13.8.0-slim
+  variables:
+    LUNR_VERSION: 2.3.8
+    DIRECTORY: new_build
+  script:
+    - bash .ci/build_indices_new.sh
+    - mv new_build new_processed_build
+  artifacts:
+    expire_in: 1 day
+    paths:
+      - new_processed_build
+
+# Deploy to Gitlab Pages - to be run only by forks; change to pages once it's ready
+new pages:
+  image: alpine:3.11.3
+  stage: deploy
+  rules:
+    - if: '$CI_PROJECT_NAMESPACE != "R3" && $CI_PROJECT_NAMESPACE != "R3-core"'
+  script:
+    - mv new_processed_build new_public
+  artifacts:
+    expire_in: 1 week
+    paths:
+      - new_public
+
+## Deploys the website to a separate VM
+deploy to production:
+  stage: deploy
+  image: alpine:3.1
+  before_script:
+    - 'which ssh-agent || ( apk add --update openssh )'
+    - eval $(ssh-agent -s)
+    - echo "$B64SSHPRIVKEY" | base64 -d | tr -d '\r' | ssh-add - > /dev/null
+    - mkdir -p ~/.ssh && chmod 700 ~/.ssh
+    - 'echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
+    - echo "$KNOWNHOSTS" > ~/.ssh/known_hosts
+    - chmod 644 ~/.ssh/known_hosts
+  rules:
+    - if: '$CI_COMMIT_BRANCH == "develop" && $CI_PROJECT_PATH == "R3/howto-cards"'
+    - if: '$CI_COMMIT_BRANCH == "master" && $CI_PROJECT_PATH == "R3/howto-cards"'
+    - if: '$CI_COMMIT_BRANCH == "16-deploy-to-staticpages-vm"'
+  script:
+    - ssh -p $SSHPORT $SSHCONNECT "mkdir -p ~/$CI_COMMIT_BRANCH/sources/public/$CI_JOB_ID ~/$CI_COMMIT_BRANCH/public"
+    - scp -P $SSHPORT -r new_processed_build/* $SSHCONNECT:~/$CI_COMMIT_BRANCH/sources/public/$CI_JOB_ID
+    - ssh -p $SSHPORT $SSHCONNECT "cd ~/$CI_COMMIT_BRANCH/public && ln -fs ../sources/public/$CI_JOB_ID/* . && cd ~/$CI_COMMIT_BRANCH/sources/public/ && find . -type d -not -newermt '-1 minutes' -exec rm -rf {} +;"
+
diff --git a/_config.yml b/_config.yml
index e30c3e4981738efa1b0600d17e5e2572c739091d..b46d209e21ed72dd2d851e6015b2fdb854d234c8 100644
--- a/_config.yml
+++ b/_config.yml
@@ -19,8 +19,8 @@ description: >- # this means to ignore newlines until "baseurl:"
   This page is an index for lab cards  that are intended to provide practical guidance  in  implementing Data Management, Data Protection and IT setup.
 
 # URL settings (the most difficult part, please refer to the guide)
-baseurl: "/howto-cards"  # the subpath of your site, e.g. /gitlab-repository-name
-url: "https://r3.pages.uni.lu"  # the base hostname & protocol for your site, e.g. http://gitlab-namespace-name.pages.uni.lu/
+baseurl: "/"  # the subpath of your site, e.g. /gitlab-repository-name
+url: "https://localhost"  # the base hostname & protocol for your site, e.g. http://gitlab-namespace-name.pages.uni.lu/
 
 # Banner settings
 banner: howto-card  # When you have custom images, change this setting's value to the name of the folder containing them
@@ -62,6 +62,8 @@ plugins:
 # The display logic itself is in the template
 share_url: https://howto.lcsb.uni.lu/?
 include_link_index: 4
+
+# These values are injected into cards
 defaults:
   -
     scope: