diff --git a/.gitignore b/.gitignore
index d9722a33e6ce7c45f6e06ef1b25a51a0684be986..0cfd4cbfb7e7edbf3be8ce369ae32c99093fb5dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,3 @@
+**/env
 **/__pycache__
 
diff --git a/README.md b/README.md
index fa336c344a5eb3393c7f466c7826394cc856f7e2..afb32b2b2ad7924a923fd8cb301722bba3b9553f 100644
--- a/README.md
+++ b/README.md
@@ -4,14 +4,66 @@ Python OPC-UA server to control the I2C devices in the LTS.
 
 + opcuserv.py: OPC-UA server that expose (visible) variables and methods.
 
-# LTS structure:
+# Prerequisites
+
+## Requirements
+
+This Python3 code uses other Python3 modules:
+
+- opcua
+- pyyaml
+- numpy
+
+We recommend to install a virtual environment and then install the dependencies there.  For convenience we have added the relevant modules to the file `requirements.txt` that can be used to install them with pip3: `python3 -m pip install -r requirements.txt`
+
+Below are step-by-step instructions that show how to install the dependencies neatly in a Python3 virtual environment.
+
+```bash
+# Create a Python3 virtual environment with the name "env"
+python3 -m venv env
+# Activate the virtual environment
+. env/bin/activate
+# Update the already installed modules in the virtual environment since they are usually outdated
+python3 -m pip install --upgrade pip wheel
+# Deactivate the virtual environment and start it again
+deactivate
+. env/bin/activate
+# And finally install the module dependencies
+python3 -m pip install -r requirements.txt
+```
+
+# Execute it
+
+The software can be simply executed with Python3:  `python3 opcuaserv.py`
+
+Optional parameters are explained when the `-h` or `--help` parameter is supplied:
+
+```bash
+python3 opcuaserv.py --help
+cryptography is not installed, use of crypto disabled
+cryptography is not installed, use of crypto disabled
+usage: opcuaserv.py [-h] [-s] [--no-lib-hack] [-p PORT]
+
+optional arguments:
+  -h, --help            show this help message and exit
+  -s, --simulator       Do not connect to I2c, but simulate behaviour.
+  --no-lib-hack         Do not require a hacked opcua library. Breaks behaviour.
+  -p PORT, --port PORT  Port number to listen on [4842].
+```
+
+# LTS structure
 
 Raspberry pi (LTS_pypcc.yaml -> I2C controller on raspberry pi)
+
 > Control PCB (LTS_switch.yaml -> I2C switch)
->> RCU2 PCB   (LTS_RCUx.yaml  -> I2C devices)
->>> RCU2 Dither source (LTS_RCU2_dither.yaml -> I2C bitbang)
->>
->>> ADC (LTS_RCU2_ADC.yaml -> SPI bitbang2)
->>
->> Clock PCB (LTS_clk.yaml -> I2C device)
->>> PLL (LTS_clkPLL.yaml -> SPI bitbang1)
+>
+> > RCU2 PCB   (LTS_RCUx.yaml  -> I2C devices)
+> >
+> > > RCU2 Dither source (LTS_RCU2_dither.yaml -> I2C bitbang)
+> >
+> > > ADC (LTS_RCU2_ADC.yaml -> SPI bitbang2)
+> >
+> > Clock PCB (LTS_clk.yaml -> I2C device)
+> >
+> > > PLL (LTS_clkPLL.yaml -> SPI bitbang1)
+
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..a0a74090325423b55cce129fd7d729190c3cedbb
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,3 @@
+opcua
+pyyaml
+numpy