diff --git a/gitlab-api-opressor/.gitignore b/gitlab-api-opressor/.gitignore
index 0a764a4de3a890dbe2a3336c648f7f6d1892c132..ef2f78902e2c569452265fa67753372a3a6cdbb4 100644
--- a/gitlab-api-opressor/.gitignore
+++ b/gitlab-api-opressor/.gitignore
@@ -1 +1,5 @@
 env
+venv
+.venv
+.idea
+__pycache__
diff --git a/gitlab-api-opressor/README.md b/gitlab-api-opressor/README.md
index d74f34d2546261c902d85462c5ed05e201826075..007b725bb99a576a24b4b5490def7fbcf6ceb13c 100644
--- a/gitlab-api-opressor/README.md
+++ b/gitlab-api-opressor/README.md
@@ -1,8 +1,10 @@
-# Scripts to regulate git.sch repo's
+# Scripts to regulate repo's
 
 ## Usage
 
 ```sh
+echo -n 'gitlab personal token' > env
+
 # install virtualenv on your machine
 pip3 install --user virtualenv
 export PATH="~/.local/bin:$PATH"
@@ -17,5 +19,5 @@ cp env.example env
 vim env
 
 # rule them all
-./regulator.sh
+./run.sh
 ```
\ No newline at end of file
diff --git a/gitlab-api-opressor/delete_merged_branches.py b/gitlab-api-opressor/delete_merged_branches.py
new file mode 100644
index 0000000000000000000000000000000000000000..1ad194364866719b699dd529342ee89a92c54844
--- /dev/null
+++ b/gitlab-api-opressor/delete_merged_branches.py
@@ -0,0 +1,14 @@
+from functions import *
+
+
+def repo_action(project_meta):
+    path = "/projects/" + str(project_meta['id']) + "/repository/merged_branches"
+    r = requests.delete(url=get_url(path))
+    if r.ok:
+        print("Updated: " + project_meta['name'])
+    else:
+        print("ERROR: " + project_meta['name'])
+
+
+if __name__ == "__main__":
+    iterate_on_groups(repo_action)
diff --git a/gitlab-api-opressor/env.example b/gitlab-api-opressor/env.example
deleted file mode 100644
index d0898fe16755bc47f1e3182005d6a00127f00633..0000000000000000000000000000000000000000
--- a/gitlab-api-opressor/env.example
+++ /dev/null
@@ -1 +0,0 @@
-PERSONAL_API_TOKEN=secret
diff --git a/gitlab-api-opressor/functions.py b/gitlab-api-opressor/functions.py
new file mode 100644
index 0000000000000000000000000000000000000000..8df7133475ebccf55e0af7be82cee52fc11a7fdd
--- /dev/null
+++ b/gitlab-api-opressor/functions.py
@@ -0,0 +1,35 @@
+import requests
+
+personal_token = "please create an env file"
+
+
+def get_url(path, extra="") -> str:
+    url = 'https://git.sch.bme.hu/api/v4/'
+    url += path
+    url += "?"
+    url += "access_token=" + personal_token + extra
+    return url
+
+
+def request(path):
+    r = requests.get(url=get_url(path))
+    return r.json()
+
+
+def iterate_group(group_id: str, repo_action):
+    url = "groups/" + group_id
+    group = request(url)
+    for project_meta in group['projects']:
+        if not project_meta['archived']:
+            repo_action(project_meta)
+    subgroups = request(url + "/subgroups")
+
+    for subgroup in subgroups:
+        iterate_group(str(subgroup['id']), repo_action)
+
+
+def iterate_on_groups(repo_action):
+    global personal_token
+    env_file = open("env", "r")
+    personal_token = env_file.read()
+    iterate_group("1604", repo_action)
diff --git a/gitlab-api-opressor/list_projects.py b/gitlab-api-opressor/list_projects.py
new file mode 100644
index 0000000000000000000000000000000000000000..b8bcdaebbf5c3186db903fd93140e14fbec061a7
--- /dev/null
+++ b/gitlab-api-opressor/list_projects.py
@@ -0,0 +1,9 @@
+from functions import *
+
+
+def repo_action(project_meta):
+    print('git clone ' + project_meta['ssh_url_to_repo'])
+
+
+if __name__ == "__main__":
+    iterate_on_groups(repo_action)
diff --git a/gitlab-api-opressor/regulator.sh b/gitlab-api-opressor/regulator.sh
deleted file mode 100755
index ce7a40e13004773a35649dcea49e3753d6116636..0000000000000000000000000000000000000000
--- a/gitlab-api-opressor/regulator.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-
-# halt on error
-set -e
-
-source ./env
-export PERSONAL_API_TOKEN
-
-log() {
-    echo '######################'
-    echo "# $*"
-    echo '######################'
-}
-
-log 'Setup all the things'
-python3 setup.py
diff --git a/gitlab-api-opressor/requirements.txt b/gitlab-api-opressor/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..f2293605cf1b01dca72aad0a15c45b72ed5429a2
--- /dev/null
+++ b/gitlab-api-opressor/requirements.txt
@@ -0,0 +1 @@
+requests
diff --git a/gitlab-api-opressor/setup.py b/gitlab-api-opressor/setup.py
deleted file mode 100644
index 8fc7b830ad2a2d037d876a9634acf9c99feccb6f..0000000000000000000000000000000000000000
--- a/gitlab-api-opressor/setup.py
+++ /dev/null
@@ -1,126 +0,0 @@
-# importing the requests library
-import requests
-import os
-
-host = "git.sch.bme.hu"
-personal_token = os.environ['PERSONAL_API_TOKEN']
-
-
-def get_url(path) -> str:
-    url = "https://"
-    url += host
-    url += "/api/v4/"
-    url += path
-    url += "?"
-    url += "access_token=" + personal_token
-    return url
-
-
-def request(path):
-    r = requests.get(url=get_url(path))
-    return r.json()
-
-
-def iterate_group(group_id: int):
-    url = "groups/" + str(group_id)
-    group = request(url)
-    for project_meta in group['projects']:
-        repo_action(project_meta)
-    subgroups = request(url + "/subgroups")
-
-    for subgroup in subgroups:
-        iterate_group(str(subgroup['id']))
-
-
-def repo_action(project_meta):
-    # print(project_meta)
-    setup_project(project_meta)
-    add_youtrack(project_meta)
-    add_mattermost(project_meta)
-    check_tags(project_meta)
-
-
-def update_project(project_meta, data, postfix=''):
-    path = 'projects/' + str(project_meta['id']) + postfix
-    r = requests.put(url=get_url(path), data=data)
-    if r.ok:
-        print("Updated: " + project_meta['name'])
-    else:
-        print("ERROR: " + project_meta['name'])
-
-
-def setup_project(project_meta):
-    data = {
-        'merge_method': 'rebase_merge',
-
-        'merge_requests_enabled': True,
-        'lfs_enabled': True,
-        'only_allow_merge_if_pipeline_succeeds': True,
-        'only_allow_merge_if_all_discussions_are_resolved': True,
-        'remove_source_branch_after_merge': True,
-
-        'issues_enabled': False,
-        'snippets_enabled': False,
-        'wiki_enabled': False,
-        'container_registry_enabled': False,
-        'shared_runners_enabled': False,
-        'auto_devops_enabled': False
-    }
-    update_project(project_meta, data)
-
-
-def add_youtrack(project_meta):
-    postfix = '/services/youtrack'
-    yt = 'https://youtrack.kszk.bme.hu/'
-    data = {
-        'issues_url': yt + 'issue/:id',
-        'project_url': yt + '/projects/9b25aaac-1002-4fbc-ab29-c4bc7ff365da',
-        'description': 'KSZK YouTrack'
-    }
-    update_project(project_meta, data, postfix)
-
-
-def add_mattermost(project_meta):
-    postfix = '/services/mattermost'
-    mm = 'https://mattermost.kszk.bme.hu/hooks'
-    data = {
-        'webhook': mm + '/c57a1tbduj8k9rsh71jd1gufey',
-        'notify_only_broken_pipelines': True,
-        'merge_requests_events': True,
-        'tag_push_events': True
-    }
-    update_project(project_meta, data, postfix)
-
-
-def check_tags(project_meta):
-    path = 'projects/'
-    path += str(project_meta['id'])
-    path += '/protected_tags'
-    tags = request(path)
-    # unprotect_tags(path, tags)
-    if len(tags) == 0:
-        protect_tags(path)
-
-
-def protect_tags(path):
-    data = {
-        'name': '1.*',
-        'create_access_level': '40'
-    }
-    r = requests.post(url=get_url(path), data=data)
-    if r.ok:
-        print("Protected")
-    else:
-        print("ERROR protecting tag")
-
-
-def unprotect_tags(path, tags):
-    path += '/' + tags[0]['name']
-    r = requests.delete(url=get_url(path))
-    if r.ok:
-        print("tag deleted")
-    else:
-        print("ERROR deleting tag")
-
-
-iterate_group(1604)
diff --git a/gitlab-api-opressor/setup_projects.py b/gitlab-api-opressor/setup_projects.py
new file mode 100644
index 0000000000000000000000000000000000000000..d3efae6214e5dc1dc1ae837392a7fb95c0e4650c
--- /dev/null
+++ b/gitlab-api-opressor/setup_projects.py
@@ -0,0 +1,39 @@
+from functions import *
+
+
+def repo_action(project_meta):
+    setup_project(project_meta)
+
+
+def update_project(project_meta, data, postfix=''):
+    path = 'projects/' + str(project_meta['id']) + postfix
+    r = requests.put(url=get_url(path), data=data)
+    if r.ok:
+        print("Updated: " + project_meta['name'])
+    else:
+        print("ERROR: " + project_meta['name'])
+        print(r.content)
+
+
+def setup_project(project_meta):
+    data = {
+        'merge_method': 'rebase_merge',
+
+        'merge_requests_enabled': True,
+        'lfs_enabled': True,
+        'only_allow_merge_if_pipeline_succeeds': True,
+        'only_allow_merge_if_all_discussions_are_resolved': True,
+        'remove_source_branch_after_merge': True,
+
+        'issues_enabled': False,
+        'snippets_enabled': False,
+        'wiki_enabled': False,
+        'container_registry_enabled': False,
+        'shared_runners_enabled': False,
+        'auto_devops_enabled': False
+    }
+    update_project(project_meta, data)
+
+
+if __name__ == "__main__":
+    iterate_on_groups(repo_action)