diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7037578b54d579515342ab6f09cc77ebc3384eeb..175da105d11c8e727789f5957be325b36b58d76b 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -54,6 +54,14 @@ test-py3.7:
         - make test
     <<: *junit_definition
 
+test-py3.8:
+    image: docker.km3net.de/base/python:3.8
+    stage: test
+    script:
+        - *virtualenv_definition
+        - make test
+    <<: *junit_definition
+
 code-style:
     image: docker.km3net.de/base/python:3.7
     stage: test
diff --git a/README.rst b/README.rst
index 01bc7c8e224b9eb2167faf513a85af72e3b78a96..86f7caf62b536d9a6571f680b160f22c58212b34 100644
--- a/README.rst
+++ b/README.rst
@@ -148,6 +148,7 @@ The following example shows how to access summary slices, in particular the DOM
 IDs of the slice with the index ``23``:
 
 .. code-block:: python3
+
   >>> f.summaryslices
   <km3io.daq.SummmarySlices at 0x7effcc0e52b0>
   >>> f.summaryslices.slices[23].dom_id
@@ -168,6 +169,7 @@ The ``.dtype`` attribute (or in general, <TAB> completion) is useful to find out
 more about the field structure:
 
 .. code-block:: python3
+
   >>> f.summaryslices.headers.dtype
   dtype([(' cnt', '<u4'), (' vers', '<u2'), (' cnt2', '<u4'), (' vers2',
   '<u2'), (' cnt3', '<u4'), (' vers3', '<u2'), ('detector_id', '<i4'), ('run',
@@ -190,6 +192,7 @@ already accessible (although in ugly ways ;-)
 To access the timeslice data:
 
 .. code-block:: python3
+
   >>> f.timeslices
   Available timeslice streams: L1, SN
   >>> f.timeslices.stream("L1", 24).frames
@@ -204,6 +207,7 @@ the value a numpy array of hits, with the usual fields to access the PMT
 channel, time and ToT:
 
 .. code-block:: python3
+
    >>> f.timeslices.stream("L1", 24).frames[806451572].dtype
    dtype([('pmt', 'u1'), ('tdc', '<u4'), ('tot', 'u1')])
    >>> f.timeslices.stream("L1", 24).frames[806451572].tot