diff --git a/docs/installation_instructions.rst b/docs/installation_instructions.rst
index 026ea4c50bc4abfbc223dfd77e029591ada62b96..e9232fe99e9206731a2de98a50c6a60a11a9506d 100644
--- a/docs/installation_instructions.rst
+++ b/docs/installation_instructions.rst
@@ -92,7 +92,7 @@ commands:
 
 ::
 
-    $ pip3 install -r requirements-stable.txt
+    $ pip3 install -r requirements.txt
 
 Now you can run the OpenAppStack CLI as follows:
 
diff --git a/requirements-dev.txt b/requirements-dev.txt
new file mode 100644
index 0000000000000000000000000000000000000000..0575c31c09525e2224ba89dc7c8a6120ea7adf8e
--- /dev/null
+++ b/requirements-dev.txt
@@ -0,0 +1,3 @@
+# Add development requirements here
+# Please pin releases manually if necessary
+pip-tools
diff --git a/requirements-stable.txt b/requirements-stable.txt
deleted file mode 100644
index c6da4f365675766a2f8d1bfe9e72f2a6a9a786ff..0000000000000000000000000000000000000000
--- a/requirements-stable.txt
+++ /dev/null
@@ -1,52 +0,0 @@
-ansible==2.9.9
-attrs==19.3.0
-bcrypt==3.1.7
-behave==1.2.6
-behave-webdriver==0.3.0
-cachetools==4.1.0
-certifi==2020.4.5.2
-cffi==1.14.0
-chardet==3.0.4
-cryptography==2.9.2
-google-auth==1.16.1
--e git+https://open.greenhost.net/greenhost/cloud-api@c174bc27f7f149786a14b40f782df399cde32f8e#egg=greenhost_cloud
-idna==2.9
-Jinja2==2.11.2
-kubernetes==11.0.0
-MarkupSafe==1.1.1
-more-itertools==8.3.0
--e git+https://open.greenhost.net/openappstack/oas_behave@7f00fe36db19e13ddaf937526bd38a542f2e9eb3#egg=oas_behave
-oauthlib==3.1.0
-openshift==0.11.2
-packaging==20.4
-paramiko==2.7.1
-parse==1.15.0
-parse-type==0.5.2
-passlib==1.7.2
-pluggy==0.13.1
-psutil==5.7.0
-py==1.8.1
-pyasn1==0.4.8
-pyasn1-modules==0.2.8
-pycparser==2.20
-PyNaCl==1.4.0
-pyOpenSSL==19.1.0
-pyparsing==2.4.7
-pytest==5.4.3
-pytest-rerunfailures==9.0
-python-dateutil==2.8.1
-python-string-utils==1.0.0
-pytz==2020.1
-PyYAML==5.3.1
-requests==2.23.0
-requests-oauthlib==1.3.0
-rsa==4.0
-ruamel.yaml==0.16.10
-ruamel.yaml.clib==0.2.0
-selenium==3.141.0
-six==1.15.0
-tabulate==0.8.7
-testinfra==5.1.0
-urllib3==1.25.9
-wcwidth==0.2.4
-websocket-client==0.57.0
diff --git a/requirements.in b/requirements.in
new file mode 100644
index 0000000000000000000000000000000000000000..d31c24c634e2bd0af45aee72666f6e4956694813
--- /dev/null
+++ b/requirements.in
@@ -0,0 +1,22 @@
+# Please add dependencies here and run
+# pip install -r requirements-dev.txt && pip-compile
+# to update requirements.txt
+#
+# Please add developer dependencies which are not needed to install
+# OpenAppStack to requirements-dev.txt!
+#
+# ansible>=2.9.10 is needed for using the `k8s` resource
+ansible>=2.9.10,<2.10
+# Needed for ansible k8s resource
+openshift>=0.12.0
+# Needed for testinfra using the ansible module
+paramiko>=2.7.0
+psutil>=5.5.0
+pyopenssl>=19.0.0
+pytest-rerunfailures>=8.0
+testinfra>=3.0.0
+setuptools>=40.6.2
+wheel>=0.33.1
+-e git+https://open.greenhost.net/greenhost/cloud-api#egg=greenhost_cloud
+-e git+https://open.greenhost.net/openappstack/oas_behave#egg=oas_behave
+passlib>=1.7.2
diff --git a/requirements.txt b/requirements.txt
index 0fd763a9499c7d0869af2063fcc796b548461556..270c09ba2361a93cd2edcfb8a23e948734f06f00 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,22 +1,159 @@
-# ansible>=2.7 is needed for using the `k8s` resource
-ansible>=2.9,<2.10
-behave==1.2.6
-behave-webdriver==0.3.0
-certifi>=2019.3.9
-# Needed for ansible k8s resource
-openshift>=0.8.6
-# Needed for testinfra using the ansible module
-paramiko>=2.7.0
-psutil>=5.5.0
-pyopenssl>=19.0.0
-pytest>=4.3.0
-pytest-rerunfailures>=8.0
-requests>=2.19.1
-tabulate>=0.8.3
-testinfra>=3.0.0
-setuptools>=40.6.2
-wheel>=0.33.1
-pytz>=2019.1
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile
+#
 -e git+https://open.greenhost.net/greenhost/cloud-api#egg=greenhost_cloud
+    # via -r requirements.in
 -e git+https://open.greenhost.net/openappstack/oas_behave#egg=oas_behave
-passlib>=1.7.2
+    # via -r requirements.in
+ansible==2.9.18
+    # via -r requirements.in
+attrs==20.3.0
+    # via pytest
+bcrypt==3.2.0
+    # via paramiko
+behave-webdriver==0.3.0
+    # via oas-behave
+behave==1.2.6
+    # via behave-webdriver
+cachetools==4.2.1
+    # via google-auth
+certifi==2020.12.5
+    # via
+    #   kubernetes
+    #   requests
+cffi==1.14.5
+    # via
+    #   bcrypt
+    #   cryptography
+    #   pynacl
+chardet==4.0.0
+    # via requests
+cryptography==3.4.6
+    # via
+    #   ansible
+    #   paramiko
+    #   pyopenssl
+google-auth==1.27.1
+    # via kubernetes
+idna==2.10
+    # via requests
+importlib-metadata==3.7.3
+    # via
+    #   pluggy
+    #   pytest
+iniconfig==1.1.1
+    # via pytest
+jinja2==2.11.3
+    # via
+    #   ansible
+    #   openshift
+kubernetes==12.0.1
+    # via openshift
+markupsafe==1.1.1
+    # via jinja2
+oauthlib==3.1.0
+    # via requests-oauthlib
+openshift==0.12.0
+    # via -r requirements.in
+packaging==20.9
+    # via pytest
+paramiko==2.7.2
+    # via -r requirements.in
+parse-type==0.5.2
+    # via behave
+parse==1.19.0
+    # via
+    #   behave
+    #   parse-type
+passlib==1.7.4
+    # via -r requirements.in
+pluggy==0.13.1
+    # via pytest
+psutil==5.8.0
+    # via -r requirements.in
+py==1.10.0
+    # via pytest
+pyasn1-modules==0.2.8
+    # via google-auth
+pyasn1==0.4.8
+    # via
+    #   pyasn1-modules
+    #   rsa
+pycparser==2.20
+    # via cffi
+pynacl==1.4.0
+    # via paramiko
+pyopenssl==20.0.1
+    # via -r requirements.in
+pyparsing==2.4.7
+    # via packaging
+pytest-rerunfailures==9.1.1
+    # via -r requirements.in
+pytest-testinfra==6.1.0
+    # via testinfra
+pytest==6.2.2
+    # via
+    #   pytest-rerunfailures
+    #   pytest-testinfra
+python-dateutil==2.8.1
+    # via kubernetes
+python-string-utils==1.0.0
+    # via openshift
+pytz==2021.1
+    # via greenhost-cloud
+pyyaml==5.4.1
+    # via
+    #   ansible
+    #   kubernetes
+requests-oauthlib==1.3.0
+    # via kubernetes
+requests==2.25.1
+    # via
+    #   greenhost-cloud
+    #   kubernetes
+    #   requests-oauthlib
+rsa==4.7.2
+    # via google-auth
+ruamel.yaml.clib==0.2.2
+    # via ruamel.yaml
+ruamel.yaml==0.16.13
+    # via openshift
+selenium==3.141.0
+    # via behave-webdriver
+six==1.15.0
+    # via
+    #   bcrypt
+    #   behave
+    #   google-auth
+    #   kubernetes
+    #   openshift
+    #   parse-type
+    #   pynacl
+    #   pyopenssl
+    #   python-dateutil
+    #   websocket-client
+tabulate==0.8.9
+    # via greenhost-cloud
+testinfra==6.0.0
+    # via -r requirements.in
+toml==0.10.2
+    # via pytest
+typing-extensions==3.7.4.3
+    # via importlib-metadata
+urllib3==1.26.4
+    # via
+    #   kubernetes
+    #   requests
+    #   selenium
+websocket-client==0.58.0
+    # via kubernetes
+wheel==0.36.2
+    # via -r requirements.in
+zipp==3.4.1
+    # via importlib-metadata
+
+# The following packages are considered to be unsafe in a requirements file:
+# setuptools