diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 081150576c883dc02c58791debe86a6cd33721e0..4e69161fa503a01552855408ba55852faff44010 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -6,6 +6,7 @@ stages:
   - create-vps
   - setup-cluster
   - install-apps
+  - wait-for-deployments
   - health-test
   - integration-test
   - cleanup
@@ -114,6 +115,21 @@ install:
       - clusters/$HOSTNAME/**
     key: ${CI_COMMIT_REF_SLUG}
 
+helmreleases:
+  stage: wait-for-deployments
+  script:
+    - cd ansible/
+    - export KUBECONFIG="${PWD}/../clusters/${HOSTNAME}/secrets/kube_config_cluster.yml"
+    - pytest -v -s -m 'helmreleases' --connection=ansible --ansible-inventory=../clusters/${HOSTNAME}/inventory.yml --hosts='ansible://*' --reruns 120 --reruns-delay 10
+  only:
+    changes:
+      - .gitlab-ci.yml
+      - ansible/**/*
+      - helmfiles/**/*
+      - test/**/*
+      - openappstack/**/*
+  extends: .ssh_setup
+
 testinfra:
   stage: health-test
   script:
@@ -242,4 +258,3 @@ gitlab-merge-workaround:
   stage: cleanup
   script:
     - echo "That went well"
-
diff --git a/requirements.txt b/requirements.txt
index 90e189fe79eb878c9fc871a5f6e8306a4c968d2d..0f687aee224465c59e96f3537a93dc975bd4bebd 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -9,6 +9,7 @@ paramiko
 psutil>=5.5.0
 pyopenssl>=19.0.0
 pytest>=4.3.0
+pytest-rerunfailures
 requests>=2.19.1
 tabulate>=0.8.3
 testinfra>=3.0.0
diff --git a/test/pytest.ini b/test/pytest.ini
index 281b543c47df5bbb53f9cb07b703820a3880a5e6..d3dc444a35b02c1c3a48e6f14ea522c6fca17087 100644
--- a/test/pytest.ini
+++ b/test/pytest.ini
@@ -4,3 +4,8 @@ markers =
     certs: Run tests related to TLS certificates
     testinfra: Run testinfra tests (test OS/package versions etc)
     prometheus: Test prometheus
+    helmreleases: Test delpoyed helmreleases installed by weave flux
+
+# https://docs.pytest.org/en/latest/warnings.html
+filterwarnings =
+    ignore::DeprecationWarning
diff --git a/test/pytest/test_helmreleases.py b/test/pytest/test_helmreleases.py
new file mode 100644
index 0000000000000000000000000000000000000000..058e6cab7168bcb602f45f5a394452d555aa0dec
--- /dev/null
+++ b/test/pytest/test_helmreleases.py
@@ -0,0 +1,52 @@
+import pytest
+from kubernetes import client, config
+
+
+def get_release(name, namespace, api):
+    print('Testing %s in namespace %s ...' % (name, namespace), end='')
+    try:
+        release = api.get_namespaced_custom_object(
+            group="helm.fluxcd.io",
+            version="v1",
+            plural="helmreleases",
+            name=name,
+            namespace=namespace
+        )
+        release_name = release['status']['releaseName']
+        release_status = release['status']['releaseStatus']
+        print(release_status)
+    except Exception as e:
+        release_name = 'n/a'
+        release_status = 'n/a'
+        print("**** NOT DEPLOYED, status: %s *****" % release_status)
+        print("Exception: %s" % e)
+
+    return(release_name, release_status)
+
+
+@pytest.mark.helmreleases
+def test_helmreleases():
+    """Checks if all desired HelmReleases installed by weave flux are in
+    DEPLOYED state.
+    """
+    expected_releases = {
+        'oas': ['cert-manager', 'ingress', 'local-storage', 'monitoring'],
+        'oas-apps': ['nextcloud']
+    }
+
+    config.load_kube_config()
+    customObjects = client.CustomObjectsApi()
+
+    failed = 0
+    # test_release('nextcloud', 'oas-apps')
+    print('\n')
+    for namespace in expected_releases:
+        for app in expected_releases[namespace]:
+            app_status = get_release(app, namespace, customObjects)
+            if app_status[1] != 'DEPLOYED':
+                failed += 1
+    assert failed == 0, "Error: %s apps NOT DEPLOYED !" % failed
+
+
+if __name__ == "__main__":
+    test_helmreleases()