diff --git a/helmfiles/helmfile.d/20-nextcloud.yaml b/helmfiles/helmfile.d/20-nextcloud.yaml
index db0d4cc2e42e3eb29028c6757264e54d0e930859..6167231fe2a8874203c3087e007fe44a6cb37e5a 100644
--- a/helmfiles/helmfile.d/20-nextcloud.yaml
+++ b/helmfiles/helmfile.d/20-nextcloud.yaml
@@ -3,16 +3,11 @@ environments:
     values:
       - "/etc/OpenAppStack/values/local.yaml"
 
-# Note: needs helm-git plugin (https://github.com/aslafy-z/helm-git)
-repositories:
-  - name: onlyoffice-documentserver
-    url: git+https://open.greenhost.net/openappstack/nextcloud@onlyoffice-documentserver?ref=22-increase-onlyoffice-maximum-upload-size
-
 releases:
   - name: "oas-{{ .Environment.Values.releaseName }}-files"
     namespace: "oas-apps"
     # Install from file path, so you don't run into https://github.com/roboll/helmfile/issues/726
-    chart: "../../repos/nextcloud/nextcloud-onlyoffice"
+    chart: "../../repos/nextcloud"
     values:
     - "../values/nextcloud.yaml.gotmpl"
     - "/etc/OpenAppStack/values/apps/nextcloud.yaml.gotmpl"
diff --git a/helmfiles/values/nextcloud.yaml.gotmpl b/helmfiles/values/nextcloud.yaml.gotmpl
index eb0b641c184ad8cad754dc52c95e19262b29203d..1445ed7d8a29cda5e2c078320bc48276749af706 100644
--- a/helmfiles/values/nextcloud.yaml.gotmpl
+++ b/helmfiles/values/nextcloud.yaml.gotmpl
@@ -60,7 +60,8 @@ nextcloud:
     successThreshold: 1
     failureThreshold: 3
 
-onlyoffice-documentserver:
+onlyoffice:
+  server_name: "office.{{ .Environment.Values.domain }}"
   ingress:
     enabled: true
     annotations:
@@ -74,16 +75,7 @@ onlyoffice-documentserver:
       - hosts:
           - "office.{{ .Environment.Values.domain }}"
         secretName: oas-{{ .Environment.Values.releaseName }}-office
-
-  onlyoffice:
-    server_name: "office.{{ .Environment.Values.domain }}"
   jwtSecret: "{{ requiredEnv "ONLYOFFICE_JWT_SECRET" }}"
-  postgresql:
-    postgresqlPassword: "{{ requiredEnv "ONLYOFFICE_POSTGRESQL_PASSWORD" }}"
-  rabbitmq:
-    rabbitmq:
-      password: "{{ requiredEnv "ONLYOFFICE_RABBITMQ_PASSWORD" }}"
-
   livenessProbe:
     initialDelaySeconds: 120
     timeoutSeconds: 20
@@ -96,3 +88,10 @@ onlyoffice-documentserver:
     periodSeconds: 30
     successThreshold: 1
     failureThreshold: 3
+
+postgresql:
+  postgresqlPassword: "{{ requiredEnv "ONLYOFFICE_POSTGRESQL_PASSWORD" }}"
+
+rabbitmq:
+  rabbitmq:
+    password: "{{ requiredEnv "ONLYOFFICE_RABBITMQ_PASSWORD" }}"
diff --git a/openappstack/cosmos.py b/openappstack/cosmos.py
index c23b7506dd155e526dd135d613baa75f6aa4b099..5c5f5ab4dd73533c42f35bb069b4cb712ec391a3 100755
--- a/openappstack/cosmos.py
+++ b/openappstack/cosmos.py
@@ -52,11 +52,9 @@ def request_api(resource: str, request_type: str = 'GET',
         if response.content:
             log.debug('Response: %s\n', response.json())
             return json.loads(response.content.decode('utf-8'))
-        else:
-            return None
-    else:
-        raise requests.HTTPError('WARNING: Got response code ',
-                                 response.status_code, response.text)
+        return None
+    raise requests.HTTPError('WARNING: Got response code ',
+                             response.status_code, response.text)
 
 
 # API calls
@@ -93,7 +91,7 @@ def create_domain_record(domain: str, name: str, data: str,
     return response['domain_record']
 
 
-def create_droplet(name: str, ssh_key_id: int, region: str = 'ams1',
+def create_droplet(name: str, ssh_key_id: int, region: str = 'ams1',  # pylint: disable=too-many-arguments
                    size: int = 2048, disk: int = 20, image: int = 18):
     """Create a droplet.
 
@@ -121,10 +119,10 @@ def create_droplet(name: str, ssh_key_id: int, region: str = 'ams1',
     return response
 
 
-def delete_domain_record(domain: str, id: int):
+def delete_domain_record(domain: str, record_id: int):
     """Delete a domain record."""
-    log.info('Deleting domain record %s', id)
-    response = request_api('domains/{0}/records/{1}'.format(domain, id),
+    log.info('Deleting domain record %s', record_id)
+    response = request_api('domains/{0}/records/{1}'.format(domain, record_id),
                            'DELETE')
     return response
 
@@ -137,21 +135,21 @@ def delete_domain_records_by_name(domain: str, name_regex: str):
       delete_domain_records_by_name('openappstack.net', '^ci-')
 
     """
-    all = get_domain_records_by_name(domain, name_regex)
-    for record in all:
+    all_records = get_domain_records_by_name(domain, name_regex)
+    for record in all_records:
         delete_domain_record(domain, record['id'])
 
 
-def delete_droplet(id: int):
+def delete_droplet(droplet_id: int):
     """Delete a droplet. Droplet needs to be stopped first."""
-    log.info('Deleting %s', id)
-    response = request_api('droplets/{0}'.format(id), 'DELETE')
+    log.info('Deleting %s', droplet_id)
+    response = request_api('droplets/{0}'.format(droplet_id), 'DELETE')
     return response
 
 
-def get_domain_record(domain: str, id: int):
+def get_domain_record(domain: str, droplet_id: int):
     """Get details for given domain record."""
-    response = request_api('domains/{0}/records/{1}'.format(domain, id))
+    response = request_api('domains/{0}/records/{1}'.format(domain, droplet_id))
     return response['domain_record']
 
 
@@ -209,13 +207,13 @@ def get_droplets_by_name(name_regex: str):
     """
     all_droplets = get_droplets()
     matching = [droplet for droplet in all_droplets
-                if re.match('^ci+', droplet['name'])]
+                if re.match(name_regex, droplet['name'])]
     return matching
 
 
-def get_droplet(id: int):
+def get_droplet(droplet_id: int):
     """Get information about specified droplet."""
-    response = request_api('droplets/{0}'.format(id))
+    response = request_api('droplets/{0}'.format(droplet_id))
     return response['droplet']
 
 
@@ -225,9 +223,11 @@ def list_domain_records(domain: str):
 
     log.debug(json.dumps(records, sort_keys=True, indent=2))
 
-    table_records = [[
-        record['id'], record['name'], record['type'], record['data']]
-        for record in records]
+    table_records = [
+        [
+            record['id'], record['name'], record['type'], record['data']
+        ] for record in records
+    ]
     log.info(tabulate(table_records,
                       headers=['ID', 'Name', 'Type', 'Data']))
 
@@ -251,25 +251,25 @@ def list_droplets():
                       headers=['ID', 'Name', 'IPv4', 'Status']))
 
 
-def shutdown_droplet(id: int):
+def shutdown_droplet(droplet_id: int):
     """Shut down specified droplet (through a power_off call)."""
-    log.info('Shutting down %s', id)
+    log.info('Shutting down %s', droplet_id)
     data = {"type": "power_off"}
-    response = request_api('droplets/{0}/actions'.format(id), 'POST', data)
+    response = request_api('droplets/{0}/actions'.format(droplet_id), 'POST', data)
     return response
 
 
-def status_droplet(id: int):
+def status_droplet(droplet_id: int):
     """Get status of specified droplet."""
-    response = get_droplet(id)
+    response = get_droplet(droplet_id)
     return response['status']
 
 
-def terminate_droplet(id: int):
+def terminate_droplet(droplet_id: int):
     """Terminate a droplet by powering it down and deleting it."""
-    shutdown_droplet(id)
-    wait_for_state(id, 'stopped')
-    delete_droplet(id)
+    shutdown_droplet(droplet_id)
+    wait_for_state(droplet_id, 'stopped')
+    delete_droplet(droplet_id)
 
 
 def terminate_droplets_by_name(name_regex: str, ndays: int = 0,
@@ -287,51 +287,51 @@ def terminate_droplets_by_name(name_regex: str, ndays: int = 0,
     threshold_time = (datetime.now(tz=timezone('Europe/Stockholm')) -
                       timedelta(days=ndays)).\
         strftime("%Y-%m-%dT%H:%M:%S+00:00")
-    all = get_droplets()
+    all_droplets = get_droplets()
 
     noterminate_droplets = []
     if 'NO_TERMINATE_DROPLETS' in os.environ:
         noterminate_droplets = os.environ['NO_TERMINATE_DROPLETS'].split(',')
 
-    for droplet in all:
+    for droplet in all_droplets:
         if droplet['name'] not in noterminate_droplets:
             if re.match(name_regex, droplet['name']):
                 if droplet['created_at'] < threshold_time:
                     delete_domain_records_by_name(
-                        domain, '^\*.'+droplet['name'])
+                        domain, r'^\*.'+droplet['name'])
                     delete_domain_records_by_name(domain, '^'+droplet['name'])
                     terminate_droplet(droplet['id'])
 
 
-def wait_for_ssh(ip: str):
+def wait_for_ssh(droplet_ip: str):
     """Wait for ssh to be reachable on port 22."""
-    log.info('Waiting for ssh to become available on ip %s', ip)
+    log.info('Waiting for ssh to become available on ip %s', droplet_ip)
 
     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
-    while sock.connect_ex((ip, 22)) != 0:
+    while sock.connect_ex((droplet_ip, 22)) != 0:
         sleep(1)
 
-    log.info('SSH became available on ip %s', ip)
+    log.info('SSH became available on ip %s', droplet_ip)
 
 
-def wait_for_state(id: int, state):
+def wait_for_state(droplet_id: int, state):
     """Wait for a droplet to reach a certain state."""
-    log.info('Waiting for droplet %s to reach %s state...', id, state)
-    status = status_droplet(id)
+    log.info('Waiting for droplet %s to reach %s state...', droplet_id, state)
+    status = status_droplet(droplet_id)
     log.debug(status)
 
     while status != state:
         sleep(1)
-        status = status_droplet(id)
+        status = status_droplet(droplet_id)
 
 
 # When called from from ipython, setup
 # logging to console
 try:
-    __IPYTHON__
-    log = logging.getLogger()
+    __IPYTHON__  # pylint: disable=pointless-statement
+    log = logging.getLogger()  # pylint: disable=invalid-name
     log.addHandler(logging.StreamHandler())
     log.setLevel(logging.INFO)
 except NameError:
-    log = logging.getLogger(__name__)
+    log = logging.getLogger(__name__)  # pylint: disable=invalid-name