diff --git a/.gitignore b/.gitignore
index d30389c799960b3dba8d8191a9f7e75f7ac58361..0831a3bed5028225205efdd0483f25f5bd0fadff 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,4 +14,3 @@ oss-params.json
 docs/build
 docs/vale/styles/*
 !docs/vale/styles/Vocab/
-docs/source/modules
diff --git a/README.md b/README.md
index af580f008c8ed7fbdb0c1dd4cf7d304c1be37838..146c051f66dec7c818d622946ca9b7e74c55f47f 100644
--- a/README.md
+++ b/README.md
@@ -1,61 +1,5 @@
-## Environment and dependencies
+# GÉANT Service Orchestrator
+The GÉANT interpretation of [`orchestrator-core`](https://github.com/workfloworchestrator/orchestrator-core).
 
-- Install python 3.10 if you don't have it already:
-	- ``add-apt-repository ppa:deadsnakes/ppa``
-	- ``apt install python3.10 python3.10-distutils``
-- Follow Steps 1 and 2 from here to install dependencies and setup DB: https://workfloworchestrator.org/orchestrator-core/workshops/beginner/debian/
-- To install the orchestrator GUI, you can follow the steps 5 and 6 from the above link.
-- Create a virtualenv:
-	- ``source /usr/share/virtualenvwrapper/virtualenvwrapper.sh``
-	- ``mkvirtualenv --python python3.10 gso``
-- To use the virtualenv:
-	- `source /usr/share/virtualenvwrapper/virtualenvwrapper.sh`
-	- `workon gso`
-
-## Install
-
-Do all of this inside the virtualenv.
-- Clone this repo and ``cd`` into it
-- ``pip install -r requirements.txt`` 
-	- If you get an error because you pip version is too old, run this: `curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10`
-- ``pip install -e .``
-- `cd` into `gso` directory and create ``oss-params.json`` based on the ``oss-params-example.json`` file.
-- Export the oss-params file: ``export OSS_PARAMS_FILENAME="/path/to/oss-params.json"``
-- Upgrade DB to latest revision: `PYTHONPATH=. python main.py db upgrade heads`
-
-## Run
-
-- The core of workflow orchestrator can be started with ``uvicorn --host 0.0.0.0 --port 8080 main:app`` from inside the ``gso`` directory of this repo.
-- The GUI can be started with ``yarn start``.
-
-
-## Useful WFO Resources
-
-- WFO API (Swagger): https://workfloworchestrator.org/orchestrator-core/architecture/application/api/
-- WFO API (repo): https://github.com/workfloworchestrator/orchestrator-core/tree/main/orchestrator/api/api_v1/endpoints
-- Carolina notes:
-https://wiki.geant.org/pages/viewpage.action?pageId=562921625
-
-### API examples
-
-*Note: update IP address in the request to your own where you're running WFO.*
-
-**Creating subscriptions** (look at initial_input_form_generator method of the workflow to find what properties need to be passed in the data of the POST request)
-
-Create process that produces a new subscription (CREATE workflow)
-
-``curl -X POST -H "Content-Type: application/json" http://10.98.1.62:8080/api/processes/create_trunk --data '[{"product": "321045fc-21ec-476b-b67b-5f211e47c3d7"},{"trunk_name": "mytrunkfromapi", "geant_s_sid": "a1b2c3"}]'``
-
-Create process that manipulates the state of a subscription (TERMINATE workflow)
-
-``curl -X POST -H "Content-Type: application/json" http://10.98.1.62:8080/api/processes/terminate_trunk --data '[{"subscription_id": "910e7044-c427-46d1-afc3-7817e221d45d"}, {"are_you_sure": "yes"}]'``
-
-**Deleting subscriptions** (not the same as running a TERMINATE workflow for a subscription, but to actually erase it from the WFO database)
-
-Delete a subscription:
-
-``curl -X 'DELETE' 'http://10.98.1.62:8080/api/subscriptions/3f16532b-0a48-4fe3-802a-36b3f54eed0e'``
-
-To do the above, you first have to delete the processes first:
-
-``curl -X 'DELETE' 'http://10.98.1.62:8080/api/processes/7447a3e9-7c58-4ae7-8804-c0a75c39c924'``
+## Documentation
+You can build the documentation locally using [build_docs.sh](docs/build_docs.sh).
diff --git a/docs/.gitlab-ci.yml b/docs/.gitlab-ci.yml
index 5ef0839ad21832db09df64cccea2237c0ff997c9..21c42d75bdb19bb8260534de3b3e34fa5fc8fd45 100644
--- a/docs/.gitlab-ci.yml
+++ b/docs/.gitlab-ci.yml
@@ -7,14 +7,14 @@ build-documentation:
   image: sphinxdoc/sphinx:latest
 
   before_script:
-    - pip install sphinx sphinx_rtd_theme myst-parser
+    - pip install sphinx_rtd_theme sphinx-autodoc2 myst-parser
+    - cd $CI_PROJECT_DIR/docs/source
   script:
-    - sphinx-apidoc gso gso/app.py -o docs/source
-    - sphinx-build -b html docs/source docs/build
+    - make html
 
   artifacts:
     paths:
-      - docs/build/html
+      - $CI_PROJECT_DIR/docs/build/html
 
 ##### Vale    - Documentation linter
 lint-documentation:
diff --git a/docs/build_docs.sh b/docs/build_docs.sh
new file mode 100755
index 0000000000000000000000000000000000000000..11baf7ab5900c01c35ce6435b80929eb00fb3927
--- /dev/null
+++ b/docs/build_docs.sh
@@ -0,0 +1,10 @@
+#!/bin/bash
+
+docker run -it --rm -v $(pwd)/../:/gso sphinxdoc/sphinx:latest /bin/bash -c \
+"pip install sphinx-autodoc2 sphinx_rtd_theme myst-parser;cd /gso/docs/source;make html"
+
+if [ ! -d ./vale/styles/proselint ] || [ ! -d ./vale/styles/Microsoft ]; then
+  docker run -it --rm -v $(pwd):/docs jdkato/vale:latest --config="/docs/vale/.vale.ini" sync
+fi
+
+docker run -it --rm -v $(pwd):/docs jdkato/vale:latest --config="/docs/vale/.vale.ini" /docs/build/html/_sources/
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index d63b6e23aae1e10c22bc33609333eab59107bfe6..0000000000000000000000000000000000000000
--- a/docs/index.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# GÉANT Service Orchestrator ({term}`GSO`)
-
-Welcome to the documentation of the GÉANT Service Orchestrator, or {term}`GSO` for short. \
-
-This documentation has the following sections:
-
-```{toctree}
-:caption: Background
-:maxdepth: 2
-overview/index.md
-architecture/index.md
-```
-
-```{toctree}
-:caption: Modeling
-:maxdepth: 2
-modeling/index.md
-modeling/ports.md
-```
-
-```{toctree}
-:caption: Processes
-:maxdepth: 2
-processes/node_provisioning.md
-processes/deploy_router.md
-```
-
-```{toctree}
-:caption: —
-:maxdepth: 2
-glossary.md
-```
diff --git a/docs/Makefile b/docs/source/Makefile
similarity index 96%
rename from docs/Makefile
rename to docs/source/Makefile
index ed88099027f775942fa65dce2314f1ae9675cb36..43276bb9207b25bf5858450c43f2701d1e3cc14a 100644
--- a/docs/Makefile
+++ b/docs/source/Makefile
@@ -6,7 +6,7 @@
 SPHINXOPTS    ?=
 SPHINXBUILD   ?= sphinx-build
 SOURCEDIR     = .
-BUILDDIR      = build
+BUILDDIR      = ../build
 
 # Put it first so that "make" without argument is like "make help".
 help:
diff --git a/docs/source/apidocs/.gitignore b/docs/source/apidocs/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..72e8ffc0db8aad71a934dd11e5968bd5109e54b4
--- /dev/null
+++ b/docs/source/apidocs/.gitignore
@@ -0,0 +1 @@
+*
diff --git a/docs/conf.py b/docs/source/conf.py
similarity index 69%
rename from docs/conf.py
rename to docs/source/conf.py
index c1ad4dc9ae84a3a3974eff88209f81753e50b089..f82028fa755f2cce92442d7ceacaf0da34bbd22c 100644
--- a/docs/conf.py
+++ b/docs/source/conf.py
@@ -4,7 +4,7 @@ copyright = '2023, GÉANT Vereniging'
 author = 'GÉANT Orchestration and Automation Team'
 
 # -- General configuration ---------------------------------------------------
-extensions = ['sphinx_rtd_theme', 'myst_parser']
+extensions = ['sphinx_rtd_theme', 'myst_parser', 'autodoc2']
 
 templates_path = ['templates']
 exclude_patterns = ['build', 'Thumbs.db', '.DS_Store', 'venv', 'vale']
@@ -16,6 +16,12 @@ source_suffix = {
 myst_enable_extensions = ['attrs_block', 'deflist', 'replacements', 'smartquotes', 'strikethrough']
 suppress_warnings = ['myst.strikethrough']
 
+# -- Options for autodoc -----------------------------------------------------
+autodoc2_packages = [
+    "../../gso"
+]
+autodoc2_render_plugin = "myst"
+
 # -- Options for HTML output -------------------------------------------------
 html_theme = 'sphinx_rtd_theme'
 html_static_path = ['static']
@@ -24,3 +30,12 @@ html_theme_options = {
 }
 html_css_files = ['custom.css']
 html_logo = 'static/geant_logo_white.svg'
+
+# Both the class' and the __init__ method's docstring
+# are concatenated and inserted.
+autoclass_content = 'both'
+autodoc_typehints = 'none'
+
+# Display todos by setting to True
+todo_include_todos = True
+
diff --git a/docs/glossary.md b/docs/source/glossary.md
similarity index 100%
rename from docs/glossary.md
rename to docs/source/glossary.md
diff --git a/docs/source/index.md b/docs/source/index.md
new file mode 100644
index 0000000000000000000000000000000000000000..8ed5ec92290d7b9b5c564cdb20cdd6ebcae9234b
--- /dev/null
+++ b/docs/source/index.md
@@ -0,0 +1,13 @@
+# GÉANT Service Orchestrator ({term}`GSO`)
+
+Welcome to the documentation of the GÉANT Service Orchestrator, or {term}`GSO` for short.
+
+This documentation has the following sections:
+
+```{toctree}
+:caption: Contents
+:maxdepth: 1
+quickstart.md
+apidocs/gso/gso
+glossary.md
+```
diff --git a/docs/source/quickstart.md b/docs/source/quickstart.md
new file mode 100644
index 0000000000000000000000000000000000000000..1ddae9ef71a525418d41b15dd949c9be989f825f
--- /dev/null
+++ b/docs/source/quickstart.md
@@ -0,0 +1,62 @@
+# Quickstart
+
+## Development environment and dependencies
+
+- Install python 3.10 if you don't have it already:
+	- ``add-apt-repository ppa:deadsnakes/ppa``
+	- ``apt install python3.10 python3.10-distutils``
+- Follow Steps 1 and 2 from here to install dependencies and setup DB: https://workfloworchestrator.org/orchestrator-core/workshops/beginner/debian/
+- To install the orchestrator GUI, you can follow the steps 5 and 6 from the above link.
+- Create a virtual environment:
+	- ``source /usr/share/virtualenvwrapper/virtualenvwrapper.sh``
+	- ``mkvirtualenv --python python3.10 gso``
+- To use the virtual environment:
+	- `source /usr/share/virtualenvwrapper/virtualenvwrapper.sh`
+	- `workon gso`
+
+## Installation
+
+Do all of this inside the virtual environment.
+- Clone this repository and ``cd`` into it
+- ``pip install -r requirements.txt`` 
+	- If you get an error because you pip version is too old, run this: `curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10`
+- ``pip install -e .``
+- `cd` into `gso` directory and create ``oss-params.json`` based on the ``oss-params-example.json`` file.
+- Export the oss-params file: ``export OSS_PARAMS_FILENAME="/path/to/oss-params.json"``
+- Upgrade DB to latest revision: `PYTHONPATH=. python main.py db upgrade heads`
+
+## Run
+
+- The core of workflow orchestrator can be started with ``uvicorn --host 0.0.0.0 --port 8080 main:app`` from inside the ``gso`` directory of this repository.
+- The GUI can be started with ``yarn start``.
+
+
+## Useful WFO Resources
+
+- WFO API (Swagger): <https://workfloworchestrator.org/orchestrator-core/architecture/application/api/>
+- WFO API (repository): <https://github.com/workfloworchestrator/orchestrator-core/tree/main/orchestrator/api/api_v1/endpoints>
+- Carolina's notes: <https://wiki.geant.org/pages/viewpage.action?pageId=562921625>
+
+### API examples
+
+*Note: update IP address in the request to your own where you're running WFO.*
+
+**Creating subscriptions** (look at the `initial_input_form_generator` method of the workflow to find what properties need to be passed in the data of the POST request)
+
+Create process that produces a new subscription (CREATE workflow)
+
+``curl -X POST -H "Content-Type: application/json" http://10.98.1.62:8080/api/processes/create_trunk --data '[{"product": "321045fc-21ec-476b-b67b-5f211e47c3d7"},{"trunk_name": "mytrunkfromapi", "geant_s_sid": "a1b2c3"}]'``
+
+Create process that manipulates the state of a subscription (TERMINATE workflow)
+
+``curl -X POST -H "Content-Type: application/json" http://10.98.1.62:8080/api/processes/terminate_trunk --data '[{"subscription_id": "910e7044-c427-46d1-afc3-7817e221d45d"}, {"are_you_sure": "yes"}]'``
+
+**Deleting subscriptions** (not the same as running a TERMINATE workflow for a subscription, but to actually erase it from the WFO database)
+
+Delete a subscription:
+
+``curl -X 'DELETE' 'http://10.98.1.62:8080/api/subscriptions/3f16532b-0a48-4fe3-802a-36b3f54eed0e'``
+
+To do the above, you first have to delete the processes first:
+
+``curl -X 'DELETE' 'http://10.98.1.62:8080/api/processes/7447a3e9-7c58-4ae7-8804-c0a75c39c924'``
diff --git a/docs/static/custom.css b/docs/source/static/custom.css
similarity index 100%
rename from docs/static/custom.css
rename to docs/source/static/custom.css
diff --git a/docs/static/geant_logo_white.svg b/docs/source/static/geant_logo_white.svg
similarity index 100%
rename from docs/static/geant_logo_white.svg
rename to docs/source/static/geant_logo_white.svg
diff --git a/docs/test_documentation.sh b/docs/test_documentation.sh
deleted file mode 100755
index dcb80d7820ec201a87bc2f714b803233925f65d3..0000000000000000000000000000000000000000
--- a/docs/test_documentation.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/bin/bash
-
-docker run -it --rm -v $(pwd):/docs sphinxdoc/sphinx:latest /bin/bash -c \
-"pip install sphinx_rtd_theme myst-parser;cd docs;make html"
-
-if [ ! -d ./vale/styles/proselint ] || [ ! -d ./vale/styles/Microsoft ]; then
-  docker run -it --rm -v $(pwd):/gso jdkato/vale:latest --config="/gso/vale/.vale.ini" sync
-fi
-
-docker run -it --rm -v $(pwd):/gso jdkato/vale:latest --config="/gso/vale/.vale.ini" /gso/build/html/_sources/
diff --git a/docs/vale/styles/Vocab/Sphinx/accept.txt b/docs/vale/styles/Vocab/Sphinx/accept.txt
index 1c26bb264fd26def95b47f76db7bd31eb9fe37a2..2fbf4392d90d70bc90362d865f0888f13085535f 100644
--- a/docs/vale/styles/Vocab/Sphinx/accept.txt
+++ b/docs/vale/styles/Vocab/Sphinx/accept.txt
@@ -1 +1,3 @@
 toctree
+[Ss]ubpackages
+virtualenv