diff --git a/demo1-getting-started.py b/demo1-getting-started.py
index c07183f54355cafea0a048bd251fc3cd45dd1bb4..a1c59efb1fb7ad53872c660d93454903bc160d38 100644
--- a/demo1-getting-started.py
+++ b/demo1-getting-started.py
@@ -13,7 +13,7 @@ from libcloud.compute.types import Provider
 # Please use 1-29 for X in the following variable to specify your group number. (will be used for the username,
 # project etc., as coordinated in the lab sessions)
 
-group_number = 30
+group_number = X
 
 
 ########################################################################################################################
diff --git a/demo2-instance-with-init-script.py b/demo2-instance-with-init-script.py
index ae27c117a8d95bceb3d28a3d6712d489e71212ea..6497b444d6e4a980e22347ffe13839776699b04a 100644
--- a/demo2-instance-with-init-script.py
+++ b/demo2-instance-with-init-script.py
@@ -7,7 +7,7 @@ from libcloud.compute.types import Provider
 # Please use 1-29 for X in the following variable to specify your group number. (will be used for the username,
 # project etc., as coordinated in the lab sessions)
 
-group_number = 30
+group_number = X
 
 
 # web service endpoint of the private cloud infrastructure
@@ -28,7 +28,8 @@ ubuntu_image_name = "Ubuntu 20.04 - Focal Fossa - 64-bit - Cloud Based Image"
 # id_rsa.pub should look like this (standard sshd pubkey format):
 # ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAw+J...F3w2mleybgT1w== user@HOSTNAME
 
-keypair_name = 'CloudComp30-keypair'
+#keypair_name = 'CloudComp30-keypair'
+keypair_name = "srieger-pub"
 pub_key_file = '~/.ssh/id_rsa.pub'
 
 flavor_name = 'm1.small'
diff --git a/demo3-microservice.py b/demo3-microservice.py
index 9d4a1aa1b181a9a243f5d61a0ae7f2f39195a20c..4f2661a7d8a9112c2d27ea73c2f62a6f75913aeb 100644
--- a/demo3-microservice.py
+++ b/demo3-microservice.py
@@ -11,7 +11,7 @@ from libcloud.compute.types import Provider
 # Please use 1-29 for X in the following variable to specify your group number. (will be used for the username,
 # project etc., as coordinated in the lab sessions)
 
-group_number = 30
+group_number = X
 
 
 # web service endpoint of the private cloud infrastructure
@@ -32,7 +32,8 @@ ubuntu_image_name = "Ubuntu 20.04 - Focal Fossa - 64-bit - Cloud Based Image"
 # id_rsa.pub should look like this (standard sshd pubkey format):
 # ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAw+J...F3w2mleybgT1w== user@HOSTNAME
 
-keypair_name = 'srieger-pub'
+#keypair_name = 'CloudComp30-keypair'
+keypair_name = "srieger-pub"
 pub_key_file = '~/.ssh/id_rsa.pub'
 
 flavor_name = 'm1.small'
diff --git a/demo4-scale-out-add-worker.py b/demo4-scale-out-add-worker.py
index 9add7bdfbc0a061ab58e46ac9b0bf33d02f3f9a6..bc73745b9fb72e49b3a91f97b1e8974ad4ac0295 100644
--- a/demo4-scale-out-add-worker.py
+++ b/demo4-scale-out-add-worker.py
@@ -13,7 +13,7 @@ from libcloud.compute.types import Provider
 # Please use 1-29 for X in the following variable to specify your group number. (will be used for the username,
 # project etc., as coordinated in the lab sessions)
 
-group_number = 30
+group_number = X
 
 
 # web service endpoint of the private cloud infrastructure
@@ -34,7 +34,8 @@ ubuntu_image_name = "Ubuntu 20.04 - Focal Fossa - 64-bit - Cloud Based Image"
 # id_rsa.pub should look like this (standard sshd pubkey format):
 # ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAw+J...F3w2mleybgT1w== user@HOSTNAME
 
-keypair_name = 'srieger-pub'
+#keypair_name = 'CloudComp30-keypair'
+keypair_name = "srieger-pub"
 pub_key_file = '~/.ssh/id_rsa.pub'
 
 flavor_name = 'm1.small'
diff --git a/demo4-scale-out.py b/demo4-scale-out.py
index 56a189da9fb8c3148eab2860045c67922e1e5249..7ee3f079aaf0f94028a77cfda6e871b6c2f49b85 100644
--- a/demo4-scale-out.py
+++ b/demo4-scale-out.py
@@ -13,7 +13,7 @@ from libcloud.compute.types import Provider
 # Please use 1-29 for X in the following variable to specify your group number. (will be used for the username,
 # project etc., as coordinated in the lab sessions)
 
-group_number = 30
+group_number = X
 
 
 # web service endpoint of the private cloud infrastructure
@@ -34,7 +34,8 @@ ubuntu_image_name = "Ubuntu 20.04 - Focal Fossa - 64-bit - Cloud Based Image"
 # id_rsa.pub should look like this (standard sshd pubkey format):
 # ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAw+J...F3w2mleybgT1w== user@HOSTNAME
 
-keypair_name = 'srieger-pub'
+#keypair_name = 'CloudComp30-keypair'
+keypair_name = "srieger-pub"
 pub_key_file = '~/.ssh/id_rsa.pub'
 
 flavor_name = 'm1.small'
diff --git a/destroy-all-demo-instances.py b/destroy-all-demo-instances.py
index 8146c3af5bd9c1eebd6b944fd147374be14f142e..fe4aeb90166c173e2a94f135bc0040d308b00203 100644
--- a/destroy-all-demo-instances.py
+++ b/destroy-all-demo-instances.py
@@ -13,7 +13,7 @@ from libcloud.compute.types import Provider
 # Please use 1-29 for X in the following variable to specify your group number. (will be used for the username,
 # project etc., as coordinated in the lab sessions)
 
-group_number = 30
+group_number = X
 
 
 # web service endpoint of the private cloud infrastructure
diff --git a/faafo/demo2-instance-with-init-script.py b/faafo/demo2-instance-with-init-script.py
deleted file mode 100644
index d7f7cc949716f933881dd4f83b2cab8d8b75fc85..0000000000000000000000000000000000000000
--- a/faafo/demo2-instance-with-init-script.py
+++ /dev/null
@@ -1,230 +0,0 @@
-# import getpass
-# import os
-
-from libcloud.compute.providers import get_driver
-from libcloud.compute.types import Provider
-
-# Please use 1-29 for X in the following variable to specify your group number. (will be used for the username,
-# project etc., as coordinated in the lab sessions)
-
-group_number = 30
-
-
-# web service endpoint of the private cloud infrastructure
-auth_url = 'https://private-cloud.informatik.hs-fulda.de:5000'
-# your username in OpenStack
-auth_username = 'CloudComp' + str(group_number)
-# your project in OpenStack
-project_name = 'CloudComp' + str(group_number)
-# A network in the project the started instance will be attached to
-project_network = 'CloudComp' + str(group_number) + '-net'
-
-# The image to look for and use for the started instance
-ubuntu_image_name = "Ubuntu 18.04 - Bionic Beaver - 64-bit - Cloud Based Image"
-# TODO: Ubuntu >18.04 would require major updates to faafo example again/better option: complete rewrite of example?
-
-# The public key to be used for SSH connection, please make sure, that you have the corresponding private key
-#
-# id_rsa.pub should look like this (standard sshd pubkey format):
-# ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAw+J...F3w2mleybgT1w== user@HOSTNAME
-
-keypair_name = 'CloudComp30-keypair'
-pub_key_file = '~/.ssh/id_rsa.pub'
-
-flavor_name = 'm1.small'
-
-
-# default region
-region_name = 'RegionOne'
-# domain to use, "default" for local accounts, "hsfulda" for RZ LDAP, e.g., using fdaiXXXX as auth_username
-# domain_name = "default"
-
-
-def main():
-    ###########################################################################
-    #
-    # get credentials
-    #
-    ###########################################################################
-
-    # if "OS_PASSWORD" in os.environ:
-    #     auth_password = os.environ["OS_PASSWORD"]
-    # else:
-    #     auth_password = getpass.getpass("Enter your OpenStack password:")
-    auth_password = "demo"
-
-    ###########################################################################
-    #
-    # create connection
-    #
-    ###########################################################################
-
-    provider = get_driver(Provider.OPENSTACK)
-    conn = provider(auth_username,
-                    auth_password,
-                    ex_force_auth_url=auth_url,
-                    ex_force_auth_version='3.x_password',
-                    ex_tenant_name=project_name,
-                    ex_force_service_region=region_name)
-    #               ex_domain_name=domain_name)
-
-    ###########################################################################
-    #
-    # get image, flavor, network for instance creation
-    #
-    ###########################################################################
-    images = conn.list_images()
-    image = ''
-    for img in images:
-        if img.name == ubuntu_image_name:
-            image = img
-
-    flavors = conn.list_sizes()
-    flavor = ''
-    for flav in flavors:
-        if flav.name == flavor_name:
-            flavor = conn.ex_get_size(flav.id)
-
-    networks = conn.ex_list_networks()
-    network = ''
-    for net in networks:
-        if net.name == project_network:
-            network = net
-
-    ###########################################################################
-    #
-    # create keypair dependency
-    #
-    ###########################################################################
-
-    print('Checking for existing SSH key pair...')
-    keypair_exists = False
-    for keypair in conn.list_key_pairs():
-        if keypair.name == keypair_name:
-            keypair_exists = True
-
-    if keypair_exists:
-        print(('Keypair ' + keypair_name + ' already exists. Skipping import.'))
-    else:
-        print('adding keypair...')
-        conn.import_key_pair_from_file(keypair_name, pub_key_file)
-
-    for keypair in conn.list_key_pairs():
-        print(keypair)
-
-    ###########################################################################
-    #
-    # create security group dependency
-    #
-    ###########################################################################
-
-    print('Checking for existing security group...')
-    security_group_name = 'all-in-one'
-    security_group_exists = False
-    all_in_one_security_group = ''
-    for security_group in conn.ex_list_security_groups():
-        if security_group.name == security_group_name:
-            all_in_one_security_group = security_group
-            security_group_exists = True
-
-    if security_group_exists:
-        print(('Security Group ' + all_in_one_security_group.name + ' already exists. Skipping creation.'))
-    else:
-        all_in_one_security_group = conn.ex_create_security_group(security_group_name,
-                                                                  'network access for all-in-one application.')
-        conn.ex_create_security_group_rule(all_in_one_security_group, 'TCP', 80, 80)
-        conn.ex_create_security_group_rule(all_in_one_security_group, 'TCP', 22, 22)
-
-    for security_group in conn.ex_list_security_groups():
-        print(security_group)
-
-    ###########################################################################
-    #
-    # create all-in-one instance
-    #
-    ###########################################################################
-
-    userdata = '''#!/usr/bin/env bash
-    curl -L -s https://gogs.informatik.hs-fulda.de/srieger/cloud-computing-msc-ai-examples/raw/master/faafo/contrib/install.sh | bash -s -- \
-        -i faafo -i messaging -r api -r worker -r demo
-    '''
-
-    print('Checking for existing instance...')
-    instance_name = 'all-in-one'
-    instance_exists = False
-    testing_instance = ''
-    for instance in conn.list_nodes():
-        if instance.name == instance_name:
-            testing_instance = instance
-            instance_exists = True
-
-    if instance_exists:
-        print(('Instance ' + testing_instance.name + ' already exists. Skipping creation.'))
-        exit()
-    else:
-        print('Starting new all-in-one instance and wait until it is running...')
-        testing_instance = conn.create_node(name=instance_name,
-                                            image=image,
-                                            size=flavor,
-                                            networks=[network],
-                                            ex_keyname=keypair_name,
-                                            ex_userdata=userdata,
-                                            ex_security_groups=[all_in_one_security_group])
-        conn.wait_until_running(nodes=[testing_instance], timeout=120, ssh_interface='private_ips')
-
-    ###########################################################################
-    #
-    # assign all-in-one instance floating ip
-    #
-    ###########################################################################
-
-    private_ip = None
-    if len(testing_instance.private_ips):
-        private_ip = testing_instance.private_ips[0]
-        print(('Private IP found: {}'.format(private_ip)))
-
-    public_ip = None
-    if len(testing_instance.public_ips):
-        public_ip = testing_instance.public_ips[0]
-        print(('Public IP found: {}'.format(public_ip)))
-
-    print('Checking for unused Floating IP...')
-    unused_floating_ip = None
-    for floating_ip in conn.ex_list_floating_ips():
-        if not floating_ip.node_id:
-            unused_floating_ip = floating_ip
-            break
-
-    if not unused_floating_ip and len(conn.ex_list_floating_ip_pools()):
-        pool = conn.ex_list_floating_ip_pools()[0]
-        print(('Allocating new Floating IP from pool: {}'.format(pool)))
-        unused_floating_ip = pool.create_floating_ip()
-
-    if public_ip:
-        print(('Instance ' + testing_instance.name + ' already has a public ip. Skipping attachment.'))
-    elif unused_floating_ip:
-        conn.ex_attach_floating_ip_to_node(testing_instance, unused_floating_ip)
-
-    actual_ip_address = None
-    if public_ip:
-        actual_ip_address = public_ip
-    elif unused_floating_ip:
-        actual_ip_address = unused_floating_ip.ip_address
-    elif private_ip:
-        actual_ip_address = private_ip
-
-    print('\n')
-    print(('The Fractals app will be deployed to http://{}\n'.format(actual_ip_address)))
-
-    print('You can use ssh to login to the instance using your private key. Default user name for official Ubuntu\n'
-          'Cloud Images is: ubuntu, so you can use, e.g.: "ssh -i ~/.ssh/id_rsa ubuntu@<floating-ip>" if your private\n'
-          'key is in the default location.\n\n'
-          'After login, you can list or "ssh ubuntu@<floating-ip>" available fractals using "faafo list". To request\n'
-          'the generation of new fractals, you can use "faafo create".\n\n'
-          'You can also see other options to use the faafo example cloud service using "faafo -h".\n\n'
-          'If you cannot start faafo command and/or do not see the webpage, you can check the Instance Console Log of\n'
-          'the instance, e.g., in OpenStack web interface.')
-
-
-if __name__ == '__main__':
-    main()
diff --git a/faafo/faafo/api/service.py b/faafo/faafo/api/service.py
index 0a96f91c5ba9a5ed77e9a0dc39bfaa9c89a2e381..2ce438a182c52429870acf7f4a90c7fee559d652 100644
--- a/faafo/faafo/api/service.py
+++ b/faafo/faafo/api/service.py
@@ -60,7 +60,10 @@ template_path = resource_filename(__name__, "templates")
 app = flask.Flask('faafo.api', template_folder=template_path)
 app.config['DEBUG'] = CONF.debug
 app.config['SQLALCHEMY_DATABASE_URI'] = CONF.database_url
-db = SQLAlchemy(app)
+
+with app.app_context():
+    db = SQLAlchemy(app)
+
 Bootstrap(app)
 
 
@@ -95,7 +98,9 @@ class Fractal(db.Model):
         return '<Fractal %s>' % self.uuid
 
 
-db.create_all()
+with app.app_context():
+    db.create_all()
+
 manager = APIManager(app, flask_sqlalchemy_db=db)
 connection = Connection(CONF.transport_url)
 
@@ -139,8 +144,9 @@ def generate_fractal(**kwargs):
 
 
 def main():
-    manager.create_api(Fractal, methods=['GET', 'POST', 'DELETE', 'PUT'],
-                       postprocessors={'POST': [generate_fractal]},
-                       exclude_columns=['image'],
-                       url_prefix='/v1')
+    with app.app_context():
+        manager.create_api(Fractal, methods=['GET', 'POST', 'DELETE', 'PUT'],
+                           postprocessors={'POST': [generate_fractal]},
+                           exclude_columns=['image'],
+                           url_prefix='/v1')
     app.run(host=CONF.listen_address, port=CONF.bind_port)
diff --git a/faafo/requirements.txt b/faafo/requirements.txt
index d2c9d2ce2f1a0f779b7a4d988624926ae8cb7b54..c996f94786255f12a86a718a641cdeae2fa8ff6e 100644
--- a/faafo/requirements.txt
+++ b/faafo/requirements.txt
@@ -4,8 +4,10 @@ positional
 iso8601
 anyjson>=0.3.3
 eventlet>=0.17.4
-PyMySQL>=0.6.2,<0.7  # 0.7 design change breaks faafo, MIT License
-SQLAlchemy>1.3,<1.4  # 1.4 breaks faafo list
+#PyMySQL>=0.6.2,<0.7  # 0.7 design change breaks faafo, MIT License
+PyMySQL>=0.6.2
+#SQLAlchemy>1.3,<1.4  # 1.4 breaks faafo list
+SQLAlchemy>=2.0.16
 Pillow==2.4.0 # MIT
 requests>=2.5.2
 Flask-Bootstrap
diff --git a/faafo/setup.cfg b/faafo/setup.cfg
index 47e621e4c2e1d53d74846746b32b600da91dc47f..df7cb1b699ce37dd3ae54479a717a58db05e30c6 100644
--- a/faafo/setup.cfg
+++ b/faafo/setup.cfg
@@ -13,8 +13,7 @@ classifier =
     License :: OSI Approved :: Apache Software License
     Operating System :: POSIX :: Linux
     Programming Language :: Python
-    Programming Language :: Python :: 2
-    Programming Language :: Python :: 2.7
+    Programming Language :: Python :: 3
 
 [files]
 packages =