Repository: bwinkel/pycraf (language: python)

Issue:
pycraf incompatible with astropy v5
```python
File /.../miniconda3/envs/pycraf3.8/lib/python3.8/site-packages/pycraf/utils/decorators.py:8, in <module>
      6 import numpy as np
      7 import inspect
----> 8 from astropy.utils.decorators import wraps
      9 from astropy.units.core import UnitsError, add_enabled_equivalencies
     12 __all__ = ['ranged_quantity_input']

ImportError: cannot import name 'wraps' from 'astropy.utils.decorators' (/.../miniconda3/envs/pycraf3.8/lib/python3.8/site-packages/astropy/utils/decorators.py)
```



Discussion / hints:
Hello, could someone please let us know when this issue will be fixed? Thanks!
Actually, I don't know yet. (I don't even know, if it will require a lot of work.) Would it be possible for you to work with astropy v4 for the time being?
Hi,

In principle, yes we can work with an older version of astropy (though I haven't tried). The problem is that pycraf is a dependency of our package and pinning is not ideal. We also have to make sure the other pieces of code don't break. At the moment it is not urgent, but if you guys could look into this that would be highly appreciated. 
OK, I see. I'm also interested in fixing this as soon as possible, but I will likely not make it in the next week or two. Thanks for your understanding.
That's perfectly fine for us. Thank you!

Fix patch:
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 61e95f7d9..71ab590f0 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -43,25 +43,24 @@ jobs:
     #   srtmdata: ${{ format('{0}\srtm', variables['Agent.BuildDirectory']) }}
     # srtmdata: ${{ format('{0}/srtm', variables['Agent.BuildDirectory']) }}
     sphinx.version: '>=3.0'
-    pyproj.version: '==1.9.5.1'
+    astropy.version: ''
+    pyproj.version: ''
+    pytest.version: ''
+    doctestplus.version: ''
     qt.version: '>=5.9'
     pytestqt.version: '<4'
 
   strategy:
     matrix:
-      # linux35:
-      #   imageName: 'ubuntu-latest'
-      #   python.version: '3.5'
-      #   py_whl: 35
-      #   numpy.version: '1.13.1'
-      #   astropy.version: '2'
-      #   sphinx.version: '<3.0'
       # linux36:
       #   imageName: 'ubuntu-latest'
       #   python.version: '3.6'
       #   py_whl: 36
       #   numpy.version: '1.13.1'
       #   astropy.version: '3'
+      #   pytest.version: '<6'
+      #   doctestplus.version: '<0.6.1'
+      #   pyproj.version: '==1.9.5.1'
       linux37:
         # note: manylinux builds could have different version pins!
         # see pip-requirements-dev
@@ -70,6 +69,10 @@ jobs:
         py_whl: cp37-
         numpy.version: '1.14.5'
         astropy.version: '3'
+        # pyproj.version: '>=2.2,<3'
+        pyproj.version: '==1.9.5.1'
+        pytest.version: '<6'
+        doctestplus.version: '<0.6.1'
         # docs should only be published by one thread, as they are version-
         # independent; and only if on the master branch
       linux38:
@@ -79,7 +82,7 @@ jobs:
         # numpy.version: '1.17.4'
         numpy.version: '1.18.1'
         astropy.version: '4'
-        pyproj.version: '>=2.2'
+        pyproj.version: '>=2.2,<3'
         # qt.version: '>=5.11'
         # pytestqt.version: '>=4'
         publish.docs: ${{ or(eq(variables['is.master'], true), eq(variables['is.tag'], true)) }}
@@ -97,8 +100,13 @@ jobs:
         python.version: '3.9'
         py_whl: cp39-
         numpy.version: '1.20.0'
-        astropy.version: '4'
-        pyproj.version: '>=2.2'
+        qt.version: '>=5.11'
+        pytestqt.version: '>=4'
+      linux310:
+        imageName: 'ubuntu-latest'
+        python.version: '3.10'
+        py_whl: cp310-
+        numpy.version: '1.22.0'
         qt.version: '>=5.11'
         pytestqt.version: '>=4'
       # mac35:
@@ -112,51 +120,58 @@ jobs:
       #   python.version: '3.6'
       #   numpy.version: '1.13.1'
       #   astropy.version: '3'
-      mac37:
-        imageName: 'macos-10.14'
-        python.version: '3.7'
-        numpy.version: '1.14.5'
-        astropy.version: '3'
+      # None of the mac-os builds work!
+      # (can only rely on conda-forge build system but not test anymore...)
+      # mac37:
+      #   imageName: 'macos-10.15'
+      #   python.version: '3.7'
+      #   numpy.version: '1.14.5'
+      #   astropy.version: '3'
       # mac 3.8 leads to anaconda conflicts
       # mac38:
-      #   imageName: 'macos-10.15'
+      #   imageName: 'macos-latest'
       #   python.version: '3.8'
       #   numpy.version: '1.18.1'
       #   astropy.version: '4'
       #   pyproj.version: '>=2.2'
-      #   # qt.version: '>=5.11'
-      #   # pytestqt.version: '>=4'
-      # win35:
-      #   imageName: 'vs2017-win2016'
-      #   python.version: '3.5'
-      #   numpy.version: '1.13.1'
-      #   astropy.version: '2'
-      #   sphinx.version: '<3.0'
+        # qt.version: '>=5.11'
+        # pytestqt.version: '>=4'
       # win36:
       #   imageName: 'vs2017-win2016'
       #   python.version: '3.6'
       #   numpy.version: '1.13.1'
       #   astropy.version: '3'
+      #   pytest.version: '<6'
+      #   doctestplus.version: '<0.6.1'
+      #   pyproj.version: '==1.9.5.1'
       win37:
-        imageName: 'vs2017-win2016'
+        imageName: 'windows-latest'
         python.version: '3.7'
         numpy.version: '1.14.5'
         astropy.version: '3'
+        pyproj.version: '>=2.2,<3'
+        pytest.version: '<6'
+        doctestplus.version: '<0.6.1'
       win38:
-        imageName: 'vs2017-win2016'
+        imageName: 'windows-latest'
         python.version: '3.8'
         # numpy.version: '1.17.4'
         numpy.version: '1.18.1'
         astropy.version: '4'
-        pyproj.version: '>=2.2'
+        pyproj.version: '>=2.2,<3'
         # qt.version: '>=5.11'
         # pytestqt.version: '>=4'
       win39:
-        imageName: 'vs2017-win2016'
+        imageName: 'windows-latest'
         python.version: '3.9'
         numpy.version: '1.20.0'
-        astropy.version: '4'
-        pyproj.version: '>=2.2'
+        qt.version: '>=5.11'
+        pytestqt.version: '>=4'
+      win310:
+        imageName: 'windows-latest'
+        python.version: '3.10'
+        py_whl: cp310-
+        numpy.version: '1.22.0'
         qt.version: '>=5.11'
         pytestqt.version: '>=4'
 
@@ -169,7 +184,7 @@ jobs:
       sudo chown -R $USER $CONDA
     displayName: Fix a conda bug on MacOS
     condition: startsWith(variables['Agent.OS'], 'Darwin')
-
+    
   - bash: |
       echo "##vso[task.prependpath]$CONDA/bin"
       echo "##vso[task.setvariable variable=conda.activate]source activate"
@@ -183,6 +198,11 @@ jobs:
     displayName: Activate display, Linux
     condition: startsWith(variables['Agent.OS'], 'Linux')
 
+  - bash: |
+      echo "##vso[task.prependpath]/usr/bin"
+    displayName: Bugfix MacOS command line interface
+    condition: startsWith(variables['Agent.OS'], 'Darwin')
+
   # echo "##vso[task.setvariable variable=conda.activate]call $env:CONDA\Scripts\activate.bat"
   - powershell: |
       Write-Host "##vso[task.prependpath]$env:CONDA\Scripts"
@@ -234,25 +254,31 @@ jobs:
   # pip installation)
   - script: |
       $(conda.activate) pycraf-env
-      mamba install --yes --quiet -c conda-forge python=$(python.version) astropy=$(astropy.version) cython h5py matplotlib numpy==$(numpy.version) pip "pyproj$(pyproj.version)" "pyqt$(qt.version)" "pytest<6" pytest-astropy "pytest-doctestplus<0.6.1" hypothesis "pytest-qt$(pytestqt.version)" rasterio scipy "sgp4>2" "sphinx$(sphinx.version)" sphinx-astropy twine wheel
+      mamba install --yes --quiet -c conda-forge python=$(python.version) astropy=$(astropy.version) cython h5py matplotlib numpy==$(numpy.version) pip "pyproj$(pyproj.version)" "pyqt$(qt.version)" "pytest$(pytest.version)" pytest-astropy "pytest-doctestplus$(doctestplus.version)" hypothesis "pytest-qt$(pytestqt.version)" rasterio scipy "sgp4>2" "sphinx$(sphinx.version)" sphinx-astropy twine wheel
     displayName: Install Anaconda packages
 
   # need to fix cctools and ld64 to slightly older version, otherwise an
   # error ("ld: library not found for -lSystem") occurs during build
   - script: |
       $(conda.activate) pycraf-env
-      mamba install --yes --quiet --name pycraf-env -c conda-forge clang_osx-64 clangxx_osx-64 llvm-openmp openmp cctools==921 ld64==409.12
+      mamba install --yes --quiet --name pycraf-env -c conda-forge clang_osx-64 clangxx_osx-64 llvm-openmp openmp cctools==921 ld64==409.12 ta-lib
     displayName: Prepare clang, MacOS
     # condition: and(succeeded(), eq(variables['is.macos'], true))
     condition: and(succeeded(), startsWith(variables['Agent.OS'], 'Darwin'), lt(variables['python.version'], 3.8))
 
   - script: |
       $(conda.activate) pycraf-env
-      mamba install --yes --quiet --name pycraf-env -c conda-forge clang_osx-64 clangxx_osx-64 llvm-openmp openmp cctools ld64
+      mamba install --yes --quiet --name pycraf-env -c conda-forge clang_osx-64 clangxx_osx-64 llvm-openmp openmp cctools ld64 ta-lib
     displayName: Prepare clang, MacOS
     # condition: and(succeeded(), eq(variables['is.macos'], true))
     condition: and(succeeded(), startsWith(variables['Agent.OS'], 'Darwin'), ge(variables['python.version'], 3.8))
 
+  - bash: |
+      sudo rm -rf /Library/Developer/CommandLineTools
+      xcode-select --install
+    displayName: Fix problem with MacOS compiler/linker
+    condition: startsWith(variables['Agent.OS'], 'Darwin')
+
   - script: |
       $(conda.activate) pycraf-env
       pip install -e .
@@ -264,7 +290,7 @@ jobs:
   - script: |
       $(conda.activate) pycraf-env
       pip install pytest-azurepipelines
-      python setup.py test --remote-data=any
+      pytest --pyargs pycraf --remote-data=any
     displayName: Testing
 
   # sphinx-build docs docs/_build/html -W -b html
@@ -331,7 +357,7 @@ jobs:
   # will use system python for upload
   - task: UsePythonVersion@0
     inputs:
-      versionSpec: '3.6'
+      versionSpec: '3.8'
 
   - script: |
       pip install twine
diff --git a/pycraf/geospatial/geospatial.py b/pycraf/geospatial/geospatial.py
index 1c793341b..9ad201f1a 100644
--- a/pycraf/geospatial/geospatial.py
+++ b/pycraf/geospatial/geospatial.py
@@ -328,10 +328,16 @@ def _create_transform(sys1, sys2, code_in='epsg', code_out='epsg'):
         needs_3d = proj1.is_geocent() or proj2.is_geocent()
 
     # see https://github.com/pyproj4/pyproj/issues/538
-    kwargs = {'always_xy': True} if pyproj.__version__ >= '2.2.0' else {}
-    return partial(
-        pyproj.transform, proj1, proj2, **kwargs
-        ), in_islatlon, out_islatlon, needs_3d
+    # also: https://pyproj4.github.io/pyproj/stable/gotchas.html#upgrading-to-pyproj-2-from-pyproj-1
+    if pyproj.__version__ >= '2.2.0':
+        return (
+            pyproj.Transformer.from_crs(proj1.crs, proj2.crs, always_xy=True).transform,
+            in_islatlon, out_islatlon, needs_3d
+            )
+    else:
+        return partial(
+            pyproj.transform, proj1, proj2,
+            ), in_islatlon, out_islatlon, needs_3d
 
 
 @utils.ranged_quantity_input(
diff --git a/pycraf/gui/__init__.py b/pycraf/gui/__init__.py
deleted file mode 100644
index f289346f8..000000000
--- a/pycraf/gui/__init__.py
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-'''
-Contains a graphical user interface (GUI) for simple tasks.
-'''
-
-from .gui import *
diff --git a/pycraf/gui/__main__.py b/pycraf/gui/__main__.py
deleted file mode 100644
index 1333ed26e..000000000
--- a/pycraf/gui/__main__.py
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-import sys
-
-
-def main(args=None):
-    '''Launch pycraf GUI.'''
-    if args is None:
-        args = sys.argv[1:]
-
-    from pycraf import gui
-    gui.start_gui()
-
-
-if __name__ == '__main__':
-    main()
diff --git a/pycraf/gui/gui.py b/pycraf/gui/gui.py
deleted file mode 100644
index 860e51448..000000000
--- a/pycraf/gui/gui.py
+++ /dev/null
@@ -1,875 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-import os
-import sys
-from PyQt5 import QtCore, QtGui, QtWidgets
-import numpy as np
-from astropy import units as u
-# from scipy.interpolate import interp1d
-from matplotlib.ticker import ScalarFormatter
-from .resources.main_form import Ui_MainWindow
-from .plot_widget import CustomToolbar, PlotWidget
-from .helpers import setup_earth_axes
-from .workers import (
-    GeometryWorker, StatisticsWorker, PathProfWorker, MapWorker
-    )
-from ..geometry import true_angular_distance
-from ..pathprof import SrtmConf
-
-__all__ = ['PycrafGui', 'start_gui']
-
-CLUTTER_DESCRIPTIONS = [
-    # name in combobox, clutter-enum int
-    ('No clutter', -1),
-    ('Sparse', 0),
-    ('Village', 1),
-    ('Decidious trees', 2),
-    ('Coniferous trees', 3),
-    ('Tropical forest', 4),
-    ('Suburban', 5),
-    ('Dense suburban', 6),
-    ('Urban', 7),
-    ('Dense urban', 8),
-    ('High urban', 9),
-    ('Industrial zone', 10),
-    ]
-
-PATH_DISPLAY_OPTIONS = [
-    # name in combobox, where to find ('hprof_data'/'results'), associated key
-    ('Geometry: Height', 'hprof_data', 'heights', 'm'),
-    ('Geometry: Rx longitude', 'hprof_data', 'lons', 'deg'),
-    ('Geometry: Rx latitude', 'hprof_data', 'lats', 'deg'),
-    ('Geometry: Back-bearing', 'hprof_data', 'backbearings', 'deg'),
-    ('Geometry: Tx path horizon angle', 'results', 'eps_pt', 'deg'),
-    ('Geometry: Rx path horizon angle', 'results', 'eps_pr', 'deg'),
-    ('Geometry: Path type', 'results', 'path_type', '0: LoS, 1: non-LoS'),
-    ('Attenuation: LoS loss', 'results', 'L_b0p', 'dB'),
-    ('Attenuation: Diffraction loss', 'results', 'L_bd', 'dB'),
-    ('Attenuation: Troposcatter loss', 'results', 'L_bs', 'dB'),
-    ('Attenuation: Ducting/Anomalous loss', 'results', 'L_ba', 'dB'),
-    ('Attenuation: Total loss', 'results', 'L_b', 'dB'),
-    ('Attenuation: Total loss with clutter', 'results', 'L_b_corr', 'dB'),
-    ]
-
-MAP_DISPLAY_OPTIONS = [
-    # name in combobox, where to find ('hprof_data'/'results'), associated key
-    ('Geometry: Height', 'hprof_data', 'height_map', 'm'),
-    ('Geometry: Distance', 'hprof_data', 'dist_map', 'km'),
-    ('Geometry: Bearing', 'hprof_data', 'bearing_map', 'deg'),
-    ('Geometry: Back-bearing', 'hprof_data', 'back_bearing_map', 'deg'),
-    ('Geometry: Tx path horizon angle', 'results', 'eps_pt', 'deg'),
-    ('Geometry: Rx path horizon angle', 'results', 'eps_pr', 'deg'),
-    ('Geometry: Path type', 'results', 'path_type', '0: LoS, 1: non-LoS'),
-    ('Attenuation: LoS loss', 'results', 'L_b0p', 'dB'),
-    ('Attenuation: Diffraction loss', 'results', 'L_bd', 'dB'),
-    ('Attenuation: Troposcatter loss', 'results', 'L_bs', 'dB'),
-    ('Attenuation: Ducting/Anomalous loss', 'results', 'L_ba', 'dB'),
-    ('Attenuation: Total loss', 'results', 'L_b', 'dB'),
-    ('Attenuation: Total loss with clutter', 'results', 'L_b_corr', 'dB'),
-    ]
-
-SRTM_DOWNLOAD_MAPPING = ['never', 'missing', 'always']
-SRTM_SERVER_MAPPING = ['nasa_v1.0', 'nasa_v2.1', 'viewpano']
-
-PP_TEXT_TEMPLATE = '''
-<style>
-    table {{
-        color: black;
-        width: 100%;
-        text-align: center;
-        font-family: "Futura-Light", sans-serif;
-        font-weight: 400;
-        font-size: 14px;
-    }}
-    th {{
-        color: blue;
-        font-size: 16px;
-    }}
-    th, td {{ padding: 2px; }}
-    thead.th {{
-        height: 110%;
-        border-bottom: solid 0.25em black;
-    }}
-    .lalign {{ text-align: left; padding-left: 12px;}}
-    .ralign {{ text-align: right; padding-right: 12px; }}
-</style>
-
-<table>
-  <thead>
-    <tr>
-      <th colspan="2">Radio properties</th>
-      <th colspan="2">Path geometry</th>
-      <th colspan="2">Path losses</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td class="lalign">a_e (50%)</td>
-      <td class="ralign">{a_e_50:5.0f}</td>
-      <td class="lalign">alpha_tr</td>
-      <td class="ralign">{alpha_tr:8.3f}</td>
-      <td class="lalign">L_b0p (LoS)</td>
-      <td class="ralign">{L_b0p:5.1f}</td>
-    </tr>
-    <tr>
-      <td class="lalign">a_e (beta0)</td>
-      <td class="ralign">{a_e_b0:5.0f}</td>
-      <td class="lalign">alpha_rt</td>
-      <td class="ralign">{alpha_rt:8.3f}</td>
-      <td class="lalign">L_bd (Diffraction)</td>
-      <td class="ralign">{L_bd:5.1f}</td>
-    </tr>
-    <tr>
-      <td class="lalign">beta0</td>
-      <td class="ralign">{beta0:.2f}</td>
-      <td class="lalign">eps_pt</td>
-      <td class="ralign">{eps_pt:8.3f}</td>
-      <td class="lalign">L_bs (Troposcatter)</td>
-      <td class="ralign">{L_bs:5.1f}</td>
-    </tr>
-    <tr>
-      <td class="lalign">N0</td>
-      <td class="ralign">{N0:.1f}</td>
-      <td class="lalign">eps_pr</td>
-      <td class="ralign">{eps_pr:8.3f}</td>
-      <td class="lalign">L_ba (Anomalous)</td>
-      <td class="ralign">{L_ba:5.1f}</td>
-    </tr>
-    <tr>
-      <td class="lalign">Delta N</td>
-      <td class="ralign">{delta_N:.2f}</td>
-      <td class="lalign">h_eff</td>
-      <td class="ralign">{h_eff_50:8.1f}</td>
-      <td class="lalign">L_b (Total)</td><td class="ralign">{L_b:5.1f}</td>
-    </tr>
-    <tr>
-      <td class="lalign"></td>
-      <td class="ralign"></td>
-      <td class="lalign">Path type</td>
-      <td class="ralign">{path_type_str:s}</td>
-      <td class="lalign" style="color: blue;">L_b_corr (Total + Clutter)</td>
-      <td class="ralign" style="color: blue;">{L_b_corr:5.1f}</td>
-    </tr>
-  </tbody>
-</table>
-'''
-
-
-SrtmConf.set(download='never', server='viewpano')
-
-
-class PycrafGui(QtWidgets.QMainWindow):
-
-    geo_job_triggered = QtCore.pyqtSignal(dict, name='geo_job_triggered')
-    stats_job_triggered = QtCore.pyqtSignal(dict, name='stats_job_triggered')
-    pp_job_triggered = QtCore.pyqtSignal(dict, name='pp_job_triggered')
-    map_job_triggered = QtCore.pyqtSignal(dict, name='map_job_triggered')
-    clear_caches_triggered = QtCore.pyqtSignal(name='clear_caches_triggered')
-
-    def __init__(self, **kwargs):
-
-        self.do_init = True
-        super().__init__()
-
-        self.geometry_hprof_data = None
-        self.geometry_results = None
-        self.statistics_f_p = None
-        self.statistics_results = None
-        self.pathprof_hprof_data = None
-        self.pathprof_results = None
-        self.map_hprof_data = None
-        self.map_results = None
-
-        self.setup_gui()
-
-        # want that at start, user is presented with a plot
-        # we will also use this timer to implement a short delay between
-        # gui parameter changes and calling the plotting routine; this is
-        # because Qt will otherwise go through all intermediate steps
-        # (e.g., if one changes multiple digits in a spinbox), which
-        # is usually undesired
-        self.timer = QtCore.QTimer()
-        self.timer.setSingleShot(True)
-        self.timer.timeout.connect(self.on_any_param_changed)
-        self.timer.start(10)
-
-    @QtCore.pyqtSlot()
-    def setup_gui(self):
-
-        self.ui = Ui_MainWindow()
-        self.ui.setupUi(self)
-
-        # fill clutter combo boxes
-        names = [t[0] for t in CLUTTER_DESCRIPTIONS]
-        self.ui.txClutterComboBox.addItems(names)
-        self.ui.rxClutterComboBox.addItems(names)
-
-        # fill path result combo box
-        names = [t[0] for t in PATH_DISPLAY_OPTIONS]
-        _cb = self.ui.pathprofPlotChooserComboBox
-        _cb.addItems(names)
-        _cb.setCurrentIndex(_cb.findText(
-            'Attenuation: Total loss with clutter'
-            ))
-
-        # fill map result combo box
-        names = [t[0] for t in MAP_DISPLAY_OPTIONS]
-        _cb = self.ui.mapPlotChooserComboBox
-        _cb.addItems(names)
-        _cb.setCurrentIndex(_cb.findText(
-            'Attenuation: Total loss with clutter'
-            ))
-
-        self.ui.srtmPathPushButton.setText(
-            os.path.abspath(SrtmConf.srtm_dir)
-            )
-        self.ui.srtmDownloadComboBox.setCurrentIndex(
-            SRTM_DOWNLOAD_MAPPING.index(SrtmConf.download)
-            )
-        self.ui.srtmServerComboBox.setCurrentIndex(
-            SRTM_SERVER_MAPPING.index(SrtmConf.server)
-            )
-
-        self.create_plotters()
-        self.setup_signals()
-        # self.setup_menu()
-        # self.setup_actions()
-        self.setup_workers()
-
-        # setup busy indicator gif
-        self.busy_movie = QtGui.QMovie(":gifs/busy_indicator.gif")
-        self.ui.pathprofBusyIndicatorLabel.clear()
-        self.ui.mapBusyIndicatorLabel.clear()
-
-    @QtCore.pyqtSlot(object)
-    def setup_signals(self):
-
-        self.ui.srtmPathPushButton.pressed.connect(
-            self.on_options_srtmpath_pressed
-            )
-        self.ui.srtmDownloadComboBox.currentIndexChanged[int].connect(
-            self.on_options_srtmdownload_changed
-            )
-        self.ui.srtmDownloadComboBox.currentIndexChanged[int].connect(
-            self.on_options_srtmserver_changed
-            )
-
-        self.ui.pathprofComputePushButton.pressed.connect(
-            self.on_pathprof_compute_pressed
-            )
-        self.ui.pathprofPlotChooserComboBox.currentIndexChanged[int].connect(
-            self.plot_pathprof
-            )
-
-        self.ui.mapComputePushButton.pressed.connect(
-            self.on_map_compute_pressed
-            )
-        self.ui.mapPlotChooserComboBox.currentIndexChanged[int].connect(
-            self.plot_map
-            )
-
-        for w in [
-                self.ui.freqDoubleSpinBox,
-                self.ui.timepercentDoubleSpinBox,
-                self.ui.stepsizeDoubleSpinBox,
-                self.ui.tempDoubleSpinBox,
-                self.ui.pressDoubleSpinBox,
-                self.ui.txLonDoubleSpinBox,
-                self.ui.txLatDoubleSpinBox,
-                self.ui.txHeightDoubleSpinBox,
-                self.ui.rxLonDoubleSpinBox,
-                self.ui.rxLatDoubleSpinBox,
-                self.ui.rxHeightDoubleSpinBox,
-                ]:
-            w.valueChanged.connect(self.on_any_param_changed_initiated)
-
-        for w in [
-                self.ui.versionComboBox,
-                self.ui.txClutterComboBox,
-                self.ui.rxClutterComboBox,
-                ]:
-            w.currentIndexChanged.connect(self.on_any_param_changed_initiated)
-
-    @QtCore.pyqtSlot(object)
-    def setup_workers(self):
-
-        self.my_geo_worker_thread = QtCore.QThread()
-        self.my_geo_worker = GeometryWorker(self)
-
-        self.my_geo_worker.moveToThread(self.my_geo_worker_thread)
-        self.geo_job_triggered.connect(self.my_geo_worker.on_job_triggered)
-        self.clear_caches_triggered.connect(
-            self.my_geo_worker.on_clear_caches_triggered
-            )
-        self.my_geo_worker.result_ready[object, object].connect(
-            self.on_geometry_result_ready
-            )
-        self.my_geo_worker.job_excepted[str].connect(self.on_job_excepted)
-        self.my_geo_worker_thread.start()
-
-        self.my_stats_worker_thread = QtCore.QThread()
-        self.my_stats_worker = StatisticsWorker(self)
-
-        self.my_stats_worker.moveToThread(self.my_stats_worker_thread)
-        self.stats_job_triggered.connect(
-            self.my_stats_worker.on_job_triggered
-            )
-        self.clear_caches_triggered.connect(
-            self.my_stats_worker.on_clear_caches_triggered
-            )
-        self.my_stats_worker.result_ready[object, object].connect(
-            self.on_statistics_result_ready
-            )
-        self.my_stats_worker.job_excepted[str].connect(self.on_job_excepted)
-        self.my_stats_worker_thread.start()
-
-        self.my_pp_worker_thread = QtCore.QThread()
-        self.my_pp_worker = PathProfWorker(self)
-
-        self.my_pp_worker.moveToThread(self.my_pp_worker_thread)
-        self.my_pp_worker.job_started.connect(self.busy_start_pp)
-        self.my_pp_worker.job_finished.connect(self.busy_stop_pp)
-        self.my_pp_worker.job_excepted.connect(self.busy_stop_pp)
-        self.pp_job_triggered.connect(self.my_pp_worker.on_job_triggered)
-        self.clear_caches_triggered.connect(
-            self.my_pp_worker.on_clear_caches_triggered
-            )
-        self.my_pp_worker.result_ready[object, object].connect(
-            self.on_pathprof_result_ready
-            )
-        self.my_pp_worker.job_excepted[str].connect(self.on_job_excepted)
-        self.my_pp_worker_thread.start()
-
-        self.my_map_worker_thread = QtCore.QThread()
-        self.my_map_worker = MapWorker(self)
-
-        self.my_map_worker.moveToThread(self.my_map_worker_thread)
-        self.my_map_worker.job_started.connect(self.busy_start_map)
-        self.my_map_worker.job_finished.connect(self.busy_stop_map)
-        self.my_map_worker.job_excepted.connect(self.busy_stop_map)
-        self.map_job_triggered.connect(self.my_map_worker.on_job_triggered)
-        self.clear_caches_triggered.connect(
-            self.my_map_worker.on_clear_caches_triggered
-            )
-        self.my_map_worker.result_ready[object, object].connect(
-            self.on_map_result_ready
-            )
-        self.my_map_worker.job_excepted[str].connect(self.on_job_excepted)
-        self.my_map_worker_thread.start()
-
-    @QtCore.pyqtSlot()
-    def create_plotters(self):
-
-        self.geometry_plot_area = PlotWidget(
-            subplotx=1, subploty=1, plottername='Geometry',
-            )
-        self.ui.geometryVerticalLayout.addWidget(self.geometry_plot_area)
-
-        self.statistics_plot_area = PlotWidget(
-            subplotx=1, subploty=1, plottername='Statistics',
-            )
-        self.ui.statisticsVerticalLayout.addWidget(self.statistics_plot_area)
-
-        self.pathprof_plot_area = PlotWidget(
-            subplotx=1, subploty=2,
-            sharex=True,
-            plottername='Path profile',
-            )
-        self.ui.pathprofVerticalLayout.addWidget(self.pathprof_plot_area)
-
-        self.map_plot_area = PlotWidget(
-            subplotx=1, subploty=1, do_cbars=True, plottername='Map',
-            )
-        self.ui.mapVerticalLayout.addWidget(self.map_plot_area)
-
-    @QtCore.pyqtSlot(object)
-    def closeEvent(self, event):
-
-        self.write_settings()
-        super().closeEvent(event)
-
-    @QtCore.pyqtSlot(object)
-    def showEvent(self, se):
-        '''
-        it is necessary to perform "readSettings" after all of the GUI elements
-        were processed and the first showevent occurs
-        otherwise not all settings will be processed correctly
-        '''
-
-        super().showEvent(se)
-        if self.do_init:
-            self.read_settings()
-            self.do_init = False
-
-    @QtCore.pyqtSlot(str)
-    def read_settings(self):
-        '''
-        Read stored settings (including layout and window geometry).
-        '''
-
-        settings = QtCore.QSettings('pycraf', 'gui-layout')
-
-        geometry = settings.value('mainform/geometry')
-        windowstate = settings.value('mainform/windowState')
-
-        if geometry is not None:
-            self.restoreGeometry(geometry)
-        if windowstate is not None:
-            self.restoreState(windowstate)
-
-    @QtCore.pyqtSlot(str)
-    def write_settings(self):
-        '''
-        Store settings (including layout and window geometry).
-        '''
-
-        settings = QtCore.QSettings('pycraf', 'gui-layout')
-
-        settings.setValue('mainform/geometry', self.saveGeometry())
-        settings.setValue('mainform/windowState', self.saveState())
-
-    def _get_parameters(self):
-
-        job_dict = {}
-        job_dict['freq'] = self.ui.freqDoubleSpinBox.value()
-        job_dict['timepercent'] = self.ui.timepercentDoubleSpinBox.value()
-        job_dict['stepsize'] = self.ui.stepsizeDoubleSpinBox.value()
-        job_dict['temp'] = self.ui.tempDoubleSpinBox.value()
-        job_dict['press'] = self.ui.pressDoubleSpinBox.value()
-        job_dict['version'] = int(self.ui.versionComboBox.currentText())
-        job_dict['polarization'] = self.ui.versionComboBox.currentIndex()
-
-        job_dict['tx_lon'] = self.ui.txLonDoubleSpinBox.value()
-        job_dict['tx_lat'] = self.ui.txLatDoubleSpinBox.value()
-        job_dict['tx_height'] = self.ui.txHeightDoubleSpinBox.value()
-        job_dict['tx_clutter'] = self.ui.txClutterComboBox.currentIndex()
-        job_dict['rx_lon'] = self.ui.rxLonDoubleSpinBox.value()
-        job_dict['rx_lat'] = self.ui.rxLatDoubleSpinBox.value()
-        job_dict['rx_height'] = self.ui.rxHeightDoubleSpinBox.value()
-        job_dict['rx_clutter'] = self.ui.rxClutterComboBox.currentIndex()
-
-        return job_dict
-
-    @QtCore.pyqtSlot()
-    def on_options_srtmpath_pressed(self):
-
-        srtm_dir = QtWidgets.QFileDialog.getExistingDirectory(
-            self,
-            'Choose directory with SRTM tile data (.hgt files)',
-            SrtmConf.srtm_dir,
-            QtWidgets.QFileDialog.ShowDirsOnly |
-            QtWidgets.QFileDialog.DontResolveSymlinks,
-            )
-
-        if srtm_dir:
-            SrtmConf.set(srtm_dir=srtm_dir)
-            self.ui.srtmPathPushButton.setText(
-                os.path.abspath(SrtmConf.srtm_dir)
-                )
-            self.clear_caches_triggered.emit()
-
-    @QtCore.pyqtSlot(int)
-    def on_options_srtmdownload_changed(self, idx):
-
-        SrtmConf.set(download=SRTM_DOWNLOAD_MAPPING[idx])
-        self.clear_caches_triggered.emit()
-        print(SrtmConf)
-
-    @QtCore.pyqtSlot(int)
-    def on_options_srtmserver_changed(self, idx):
-
-        SrtmConf.set(server=SRTM_SERVER_MAPPING[idx])
-        self.clear_caches_triggered.emit()
-        print(SrtmConf)
-
-    @QtCore.pyqtSlot(str)
-    def on_job_excepted(self, error_msg):
-        print('Job error: ', error_msg)
-        QtWidgets.QMessageBox.critical(self, 'Job error', error_msg)
-
-    @QtCore.pyqtSlot()
-    def on_any_param_changed_initiated(self):
-        self.timer.start(250)
-
-    @QtCore.pyqtSlot()
-    def on_any_param_changed(self):
-
-        job_dict = self._get_parameters()
-        self.geo_job_triggered.emit(job_dict)
-        self.stats_job_triggered.emit(job_dict)
-
-        if self.ui.pathprofAutoUpdateCheckBox.isChecked():
-            self.on_pathprof_compute_pressed()
-
-    @QtCore.pyqtSlot()
-    def busy_start_pp(self):
-        self.ui.pathprofComputePushButton.setEnabled(False)
-        self.ui.pathprofBusyIndicatorLabel.setMovie(self.busy_movie)
-        print('movie start')
-        self.busy_movie.start()
-
-    @QtCore.pyqtSlot()
-    def busy_stop_pp(self):
-        self.busy_movie.stop()
-        self.ui.pathprofBusyIndicatorLabel.clear()
-        self.ui.pathprofComputePushButton.setEnabled(True)
-
-    @QtCore.pyqtSlot()
-    def busy_start_map(self):
-        self.ui.mapComputePushButton.setEnabled(False)
-        self.ui.mapBusyIndicatorLabel.setMovie(self.busy_movie)
-        self.busy_movie.start()
-
-    @QtCore.pyqtSlot()
-    def busy_stop_map(self):
-        self.busy_movie.stop()
-        self.ui.mapBusyIndicatorLabel.clear()
-        self.ui.mapComputePushButton.setEnabled(True)
-
-    @QtCore.pyqtSlot()
-    def on_pathprof_compute_pressed(self):
-
-        job_dict = self._get_parameters()
-        job_dict['do_generic'] = (
-            not self.ui.pathprofIncludeHeightCheckBox.isChecked()
-            )
-        # self.geo_job_triggered.emit(job_dict)
-        self.pp_job_triggered.emit(job_dict)
-
-    @QtCore.pyqtSlot()
-    def on_map_compute_pressed(self):
-
-        job_dict = self._get_parameters()
-        job_dict['size_lon'] = self.ui.mapSizeLonDoubleSpinBox.value()
-        job_dict['size_lat'] = self.ui.mapSizeLatDoubleSpinBox.value()
-        job_dict['map_reso'] = self.ui.mapResolutionDoubleSpinBox.value()
-
-        self.map_job_triggered.emit(job_dict)
-
-    @QtCore.pyqtSlot(object, object)
-    def on_geometry_result_ready(self, hprof_data, results):
-
-        self.geometry_hprof_data = hprof_data
-        self.geometry_results = results
-
-        self.plot_geometry()
-
-    @QtCore.pyqtSlot(object, object)
-    def on_statistics_result_ready(self, f_p_data, results):
-
-        self.statistics_f_p = f_p_data
-        self.statistics_results = results
-
-        self.plot_statistics()
-
-    @QtCore.pyqtSlot(object, object)
-    def on_pathprof_result_ready(self, hprof_data, results):
-
-        self.pathprof_hprof_data = hprof_data
-        self.pathprof_results = results
-
-        display_index = self.ui.pathprofPlotChooserComboBox.currentIndex()
-        self.plot_pathprof(display_index)
-
-    @QtCore.pyqtSlot(object, object)
-    def on_map_result_ready(self, hprof_data, results):
-
-        self.map_hprof_data = hprof_data
-        self.map_results = results
-
-        display_index = self.ui.mapPlotChooserComboBox.currentIndex()
-        self.plot_map(display_index)
-
-    @QtCore.pyqtSlot()
-    def plot_geometry(self):
-
-        if self.geometry_hprof_data is None or self.geometry_results is None:
-            print('nothing to plot yet')
-            return
-
-        hprof = self.geometry_hprof_data
-        results = self.geometry_results
-
-        lons, lats, distance, distances, heights, *_ = hprof
-
-        lon_rx, lat_rx = results['lon_r'], results['lat_r']
-        delta = true_angular_distance(lon_rx, lat_rx, lons, lats)
-
-        # strip units for calculations below (leading underscore -> no unit)
-        _distances = distances.to(u.km).value
-        _heights = heights.to(u.m).value
-        _delta = delta.to(u.rad).value
-        _dist = results['distance'].to(u.km).value
-        _h_ts = results['h_ts'].to(u.m).value
-        _h_rs = results['h_rs'].to(u.m).value
-        _h_tg = results['h_tg'].to(u.m).value
-        _h_rg = results['h_rg'].to(u.m).value
-        _a_e_m = results['a_e_50'].to(u.m).value
-        _a_e_km = results['a_e_50'].to(u.km).value
-        _S_tim = results['S_tim_50'].to(1).value
-        _S_rim = results['S_rim_50'].to(1).value
-        _S_tr = results['S_tr_50'].to(1).value
-        _d_bp = results['d_bp_50'].to(u.km).value
-        _h_bp = results['h_bp_50'].to(u.m).value
-        _h_eff = results['h_eff_50'].to(u.m).value
-        _h_ke = _h_bp - abs(_h_eff)
-        print('d_bp, h_bp, h_ke', _d_bp, _h_bp, _h_ke)
-
-        theta_scale = (
-            (_delta[-1] - _delta[0]) / (_distances[-1] - _distances[0])
-            )
-        theta_lim = _distances[0], _distances[-1]
-        h_lim = (
-            min([_heights.min(), _h_ke]) - 5,
-            max([_heights.max(), _h_ts, _h_rs, _h_bp]) + 5
-            )
-
-        plot_area = self.geometry_plot_area
-        fig = plot_area.figure
-        axes = plot_area.axes
-        try:
-            for ax in axes:
-                ax.clear()
-            print('len(axes)', len(axes))
-        except TypeError:
-            axes.clear()
-            fig.clear()
-
-        plot_area._axes = ax, aux_ax = setup_earth_axes(
-            fig, 111, theta_lim, h_lim, _a_e_m, theta_scale
-            )
-
-        # plot height profile
-        aux_ax.plot(_distances, _heights, 'k-')
-        # plot bullington point
-        # aux_ax.plot(_d_bp, _h_bp, 'o', color='orange')
-        # foot point of the knife edge
-        # aux_ax.plot(_d_bp, _h_ke, 'o', color='orange')
-        aux_ax.plot([_d_bp, _d_bp], [_h_ke, _h_bp], '-', color='orange', lw=2)
-        # plot Tx/Rx "heights"
-        aux_ax.plot(
-            [0, 0], [_heights[0], _heights[0] + _h_tg],
-            'b-', lw=3
-            )
-        aux_ax.plot(
-            [_dist, _dist], [_heights[-1], _heights[-1] + _h_rg],
-            'r-', lw=3
-            )
-
-        # plot the paths to clarify the Bullington geometry
-        # need to interpolate paths (mpl.plot does straight lines in
-        # viewport not in physical space)
-        # Note: the paths appear curvy in the plot, but his is because
-        # the two axes are scaled so differently; we like to keep it like
-        # this - although the curvature is exaggerated, the heights in the
-        # plots are correct (i.e., the heights of Earth's surface as a
-        # function of the distance from Tx)
-
-        def _calc_path(d0, h0, S, steps, direction=1):
-
-            assert direction in [-1, 1]
-
-            eps0 = d0 / _a_e_km
-            r0 = _a_e_km + h0 / 1000
-            x0 = r0 * np.sin(eps0)
-            y0 = r0 * np.cos(eps0)
-
-            xs = x0 + direction * steps
-            ys = y0 + steps * (S - _dist / 2 / _a_e_km + eps0)
-            ds = np.arctan2(xs, ys) * _a_e_km
-            hs = np.sqrt(xs ** 2 + ys ** 2) - _a_e_km
-
-            return ds, hs
-
-        steps = np.linspace(0, 2 * _dist, 51)
-        if results['path_type'] == 1:
-            _ds, _hs = _calc_path(0, _h_ts, _S_tim, steps)
-            aux_ax.plot(_ds, _hs * 1000, 'b--')
-            _ds, _hs = _calc_path(_dist, _h_rs, _S_rim, steps, direction=-1)
-            aux_ax.plot(_ds, _hs * 1000, 'r--')
-
-        _ds, _hs = _calc_path(0, _h_ts, _S_tr, steps)
-        aux_ax.plot(_ds, _hs * 1000, 'g--')
-
-        ax.grid(color='0.5')
-        ax.set_aspect('auto')
-
-        plot_area.clear_history()
-        plot_area.canvas.draw()
-
-        print(results)
-        results['path_type_str'] = ['LoS', 'Trans-horizon'][
-            int(results['path_type'])
-            ]
-
-        self.ui.ppRichTextLabel.setText(PP_TEXT_TEMPLATE.format(**results))
-
-    @QtCore.pyqtSlot()
-    def plot_statistics(self):
-
-        if self.statistics_f_p is None or self.statistics_results is None:
-            print('nothing to plot yet')
-            return
-
-        freqs, timepercents = self.statistics_f_p
-        L_b_corr = self.statistics_results['L_b_corr']
-
-        plot_area = self.statistics_plot_area
-        ax = plot_area.axes
-
-        ax.clear()
-
-        for sax in [ax.xaxis, ax.yaxis]:
-            sax.set_major_formatter(ScalarFormatter(useOffset=False))
-
-        ax.set_xlabel('Time percent [%]')
-        ax.grid()
-        ax.set_xlim((timepercents[0], timepercents[-1]))
-
-        t = timepercents.squeeze()
-        lidx = np.argmin(np.abs(t - 2e-3))
-        for idx, f in enumerate(freqs.squeeze()):
-            p = ax.semilogx(
-                t, L_b_corr.value[idx], '-', label='{:5.1f}'.format(f)
-                )
-            ax.text(
-                2e-3, L_b_corr.value[idx][lidx], '{:.1f} GHz'.format(f),
-                ha='left', va='top', color=p[0].get_color(),
-                )
-
-        ax.set_ylabel('L_b_corr [dB]')
-        # ax.legend(
-        #     *ax.get_legend_handles_labels(),
-        #     title='Frequency [GHz]', ncol=2,
-        #     )
-
-        plot_area.clear_history()
-        plot_area.canvas.draw()
-
-    @QtCore.pyqtSlot(int)
-    def plot_pathprof(self, display_index):
-
-        if self.pathprof_hprof_data is None or self.pathprof_results is None:
-            print('nothing to plot yet')
-            return
-
-        name, designation, dkey, unit = PATH_DISPLAY_OPTIONS[display_index]
-        print('plotting', name, designation, dkey, unit)
-
-        dists = self.pathprof_hprof_data['distances'][5:]
-        y1 = self.pathprof_hprof_data['heights'][5:]
-        y2 = getattr(self, 'pathprof_{:s}'.format(designation))[dkey][5:]
-
-        plot_area = self.pathprof_plot_area
-        axes = plot_area.axes
-        ax1, ax2 = axes
-
-        for ax in [ax1, ax2]:
-            ax.clear()
-
-            for sax in [ax.xaxis, ax.yaxis]:
-                sax.set_major_formatter(ScalarFormatter(useOffset=False))
-
-            ax.set_xlabel('Distance [km]')
-            ax.grid()
-            ax.set_xlim((dists[0], dists[-1]))
-
-        ax1.plot(dists, y1, 'k-')
-        ax2.plot(dists, y2, 'k-')
-
-        ax1.set_ylabel('Heights [m]')
-        # ax2.set_ylabel('Path attenuation [dB]')
-        ax2.set_ylabel('{:s} [{:s}]'.format(name.split(': ')[1], unit))
-        # ax2.set_ylim((80, 270))
-
-        plot_area.clear_history()
-        plot_area.canvas.draw()
-
-    @QtCore.pyqtSlot(int)
-    def plot_map(self, display_index):
-
-        if self.map_hprof_data is None or self.map_results is None:
-            print('nothing to plot yet')
-            return
-
-        name, designation, dkey, unit = MAP_DISPLAY_OPTIONS[display_index]
-        print('plotting', name, designation, dkey, unit)
-
-        lons = self.map_hprof_data['xcoords']
-        lats = self.map_hprof_data['ycoords']
-        # z = self.map_results['L_b_corr']
-        z = getattr(self, 'map_{:s}'.format(designation))[dkey][5:]
-        try:
-            z = z.value
-        except AttributeError:
-            pass
-
-        plot_area = self.map_plot_area
-        fig = plot_area.figure
-        ax = plot_area.axes
-        cax = plot_area.caxes
-        ax.clear()
-        cax.clear()
-
-        for sax in [ax.xaxis, ax.yaxis]:
-            sax.set_major_formatter(ScalarFormatter(useOffset=False))
-
-        ax.set_xlabel('Longitude [deg]')
-        ax.set_ylabel('Latitude [deg]')
-        ax.set_xlim((lons[0], lons[-1]))
-        ax.set_ylim((lats[0], lats[-1]))
-        ax.xaxis.tick_top()
-        ax.xaxis.set_label_position('top')
-
-        cim = ax.imshow(
-            z,
-            origin='lower', interpolation='nearest', cmap='inferno_r',
-            # vmin=-5, vmax=175,
-            extent=(lons[0], lons[-1], lats[0], lats[-1]),
-            )
-        cbar = fig.colorbar(cim, cax=cax)
-        ax.set_aspect(abs(lons[-1] - lons[0]) / abs(lats[-1] - lats[0]))
-        cbar.set_label(r'{:s} [{:s}]'.format(name.split(': ')[1], unit))
-
-        plot_area.clear_history()
-        plot_area.canvas.draw()
-
-    def close(self):
-        '''
-        This is a must to prevent the error:
-
-        Qt has caught an exception thrown from an event handler. Throwing
-        exceptions from an event handler is not supported in Qt. You must not
-        let any exception whatsoever propagate through Qt code. If that is
-        not possible, in Qt 5 you must at least reimplement
-        QCoreApplication::notify() and catch all exceptions there.
-
-        Furthermore, one has to:
-
-            app.aboutToQuit.connect(my_mw.close)
-
-        (see below)
-        '''
-        self.my_geo_worker_thread.quit()
-        self.my_stats_worker_thread.quit()
-        self.my_pp_worker_thread.quit()
-        self.my_map_worker_thread.quit()
-        self.my_geo_worker_thread.wait()
-        self.my_stats_worker_thread.wait()
-        self.my_pp_worker_thread.wait()
-        self.my_map_worker_thread.wait()
-
-        super().close()
-
-
-def start_gui():
-
-    app = QtWidgets.QApplication(sys.argv)
-    my_mw = PycrafGui()
-    my_mw.show()
-
-    # this is necessary for everything other than file-menu -> quit
-    app.aboutToQuit.connect(my_mw.close)
-
-    sys.exit(app.exec_())
diff --git a/pycraf/gui/helpers.py b/pycraf/gui/helpers.py
deleted file mode 100644
index 6bb5f0110..000000000
--- a/pycraf/gui/helpers.py
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-import numpy as np
-from matplotlib.transforms import Affine2D
-import mpl_toolkits.axisartist.floating_axes as floating_axes
-from matplotlib.projections import PolarAxes
-from mpl_toolkits.axisartist.grid_finder import MaxNLocator
-
-
-def setup_earth_axes(fig, rect, theta_lim, h_lim, a_e, theta_scale):
-    """
-    From https://matplotlib.org/examples/axes_grid/demo_floating_axes.html
-    """
-
-    # rotate a bit for better orientation
-    tr_rotate = Affine2D().translate(
-        np.pi / 2 - np.mean(theta_lim) * theta_scale, 0
-        )
-
-    # scale degree to radians
-    tr_scale = Affine2D().scale(theta_scale, 1)
-
-    # treat heights
-    tr_htrans = Affine2D().translate(0, +a_e)
-
-    tr = tr_htrans + tr_scale + tr_rotate + PolarAxes.PolarTransform()
-
-    grid_locator1 = MaxNLocator(5)
-    grid_locator2 = MaxNLocator(5)
-
-    grid_helper = floating_axes.GridHelperCurveLinear(
-        tr, extremes=(*theta_lim, *h_lim),
-        grid_locator1=grid_locator1,
-        grid_locator2=grid_locator2,
-        tick_formatter1=None,
-        tick_formatter2=None,
-        )
-
-    ax = floating_axes.FloatingSubplot(fig, rect, grid_helper=grid_helper)
-
-    fig.add_subplot(ax)
-
-    # adjust axis
-    ax.axis["left"].set_axis_direction("top")
-    ax.axis["left"].label.set_text("Height [m]")
-    ax.axis["left"].toggle(ticklabels=True, label=True)
-    ax.axis["right"].toggle(ticklabels=False, label=False)
-    ax.axis["right"].set_axis_direction("right")
-    ax.axis["bottom"].toggle(ticklabels=True, label=True)
-    ax.axis["bottom"].set_axis_direction("bottom")
-    ax.axis["bottom"].major_ticklabels.set_axis_direction("bottom")
-    ax.axis["bottom"].label.set_axis_direction("bottom")
-    ax.axis["bottom"].label.set_text("Distance [km]")
-
-    # create a parasite axes whose transData in RA, cz
-    aux_ax = ax.get_aux_axes(tr)
-
-    aux_ax.patch = ax.patch  # for aux_ax to have a clip path as in ax
-    ax.patch.zorder = 0.9  # but this has a side effect that the patch is
-    # drawn twice, and possibly over some other
-    # artists. So, we decrease the zorder a bit to
-    # prevent this.
-
-    return ax, aux_ax
diff --git a/pycraf/gui/plot_widget.py b/pycraf/gui/plot_widget.py
deleted file mode 100644
index f6161e8df..000000000
--- a/pycraf/gui/plot_widget.py
+++ /dev/null
@@ -1,294 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-from PyQt5 import QtCore, QtGui, QtWidgets
-from matplotlib.backends.backend_qt5agg import (
-    FigureCanvasQTAgg as FigureCanvas,
-    NavigationToolbar2QT as NavigationToolbar
-    )
-from matplotlib.figure import Figure
-from matplotlib.colorbar import make_axes
-import sys
-
-
-__all__ = ['CustomToolbar', 'PlotWidget']
-
-
-class CustomToolbar(NavigationToolbar):
-    '''
-    Customize Navigation Toolbar.
-
-    Note:
-    One can use the following code snipped (e.g., in __init__) to find
-    out which Actions are available (and to remove some, if necessary).
-
-    for i, da in enumerate(defaultactions):
-        print i, da.toolTip(), da.statusTip(), str(da.data().toString())
-
-    The following is available by default:
-    allActions = [
-        'Reset', 'Back', 'Forward', 'Pan', 'Zoom',
-        'Configure', 'Save', 'Edit'
-        ]
-    (plus some separators)
-
-    '''
-
-    message = QtCore.pyqtSignal(str, name='message')
-
-    def __init__(self, plotCanvas, parent, coordinates=True):
-        super(CustomToolbar, self).__init__(plotCanvas, parent, coordinates)
-        # defaultactions = self.actions()
-
-        # wanted_actions = ['Reset', 'Pan', 'Zoom', 'Save']
-
-        # Note, the coordinate display field is not an action,
-        # but is invisible if separators were removed
-        # we couldn't find out, how to obtain it by any other
-        # means than to include all elements without a tooltip :-(
-        # wanted_actions = [
-        #     da for da in defaultactions
-        #     if any([
-        #         wa in da.toolTip() or len(da.toolTip()) < 1
-        #         for wa in wanted_actions
-        #         ])
-        #     ]
-
-        # for da in self.actions()[::-1]:
-        #     if da not in wanted_actions:
-        #         self.removeAction(da)
-
-        self._msghandler = None
-
-    def set_msghandler(self, p):
-        '''
-        Install a custom message handler, see 'set_message'.
-        '''
-
-        self._msghandler = p
-
-    def set_message(self, s):
-        '''
-        Write custom messages into the locLabel.
-
-        (The locLabel is where coordinates usually appear).
-
-        Note: for the lazy folks, one can register a msghandler (e.g., once
-        before all subsequent calls to set_message) that then performs
-        some transformations. This is used in online plotter to install
-        a function that converts between frequency and velocity etc.
-        '''
-
-        # TODO, can we replace this with the new API? Or is it touching
-        # some internals of the NavigationToolbar parent?
-        # self.emit(QtCore.SIGNAL("message"), s)
-        self.message.emit(s)
-
-        if self._msghandler is not None:
-            s = self._msghandler(s)
-
-        if self.coordinates:
-            self.locLabel.setText(s.replace(', ', '\n'))
-
-
-class PlotWidget(QtWidgets.QWidget):
-    '''
-    Matplotlib widget that encapsulates FigureCanvasQTAgg for convenience.
-
-    Note: If you use the twin-x/y feature, for some strange reason, if one
-    creates the twins before one actually plots data (which is the case here),
-    the autoscaling doesn't work anymore. So, in that case, you need to do
-    set_x/ylim manually!
-    '''
-    sharex = None
-    sharey = None
-
-    def __init__(
-            self, parent=None,
-            dpi=100, subplotx=1, subploty=1,
-            sharex=False, sharey=False,
-            twinx=False, twiny=False,
-            plottername='A plot',
-            do_cbars=False, **cbar_kwargs
-            ):
-
-        super(PlotWidget, self).__init__(parent)
-
-        self.dpi = dpi
-        self.subplotx = subplotx
-        self.subploty = subploty
-        self.twinx = twinx
-        self.twiny = twiny
-        self._plottername = plottername
-        self.do_cbars = do_cbars
-        self.cbar_kwargs = cbar_kwargs
-        self.create()
-        self.set_shared(sharex, sharey)
-
-    @QtCore.pyqtProperty(str)
-    def plottername(self):
-        return self._plottername
-
-    @plottername.setter
-    def set_plottername(self, value):
-        self._plottername = value
-
-    def create(self):
-
-        self._fig = Figure(dpi=self.dpi)
-        self._canvas = FigureCanvas(self._fig)
-        self._canvas.setParent(self)
-        self._canvas.setFocusPolicy(QtCore.Qt.ClickFocus)
-        self._canvas.setFocus()
-
-        axes_kwargs = {}
-
-        if self.subplotx != 1 or self.subploty != 1:
-
-            self.numplots = self.subplotx * self.subploty
-            self._axes = []
-            self._cbaxes = []
-            self._twinaxes_x = []
-            self._twinaxes_y = []
-
-            for a in range(self.numplots):
-
-                self._axes.append(
-                    self._fig.add_subplot(
-                        self.subploty, self.subplotx, a + 1,
-                        **axes_kwargs
-                        )
-                    )
-                if self.do_cbars:
-                    cax, kw = make_axes(self._axes[-1], **self.cbar_kwargs)
-                    self._cbaxes.append(cax)
-
-                if self.twinx:
-                    self._twinaxes_x.append(self._axes[-1].twiny())  # not a typo!
-
-                if self.twiny:
-                    self._twinaxes_y.append(self._axes[-1].twinx())  # not a typo!
-
-            # put main ax into foreground, otherwise the primary coords are
-            # the second axes' ones
-            for a in range(self.numplots):
-                self._axes[a].set_zorder(100)
-
-        else:
-
-            self.numplots = 1
-            self._axes = self._fig.add_subplot(1, 1, 1, **axes_kwargs)
-            if self.do_cbars:
-                cax, kw = make_axes(self._axes, **self.cbar_kwargs)
-                self._cbaxes = cax
-
-        self.mpl_toolbar = CustomToolbar(self._canvas, self)
-        vbox = QtWidgets.QVBoxLayout()
-        vbox.addWidget(self._canvas)
-        vbox.addWidget(self.mpl_toolbar)
-        self.setLayout(vbox)
-
-    def set_shared(self, sharex, sharey):
-
-        if self.sharex == sharex and self.sharey == sharey:
-
-            return
-
-        self.sharex = sharex
-        self.sharey = sharey
-
-        if self.numplots > 1:
-
-            if self.sharex:
-                self._axes[0].get_shared_x_axes().join(*self._axes)
-                if self.twinx:
-                    self._twinaxes_x[0].get_shared_x_axes().join(
-                        *self._twinaxes_x
-                        )
-
-            if self.sharey:
-                self._axes[0].get_shared_y_axes().join(*self._axes)
-                if self.twiny:
-                    self._twinaxes_y[0].get_shared_y_axes().join(
-                        *self._twinaxes_y
-                        )
-
-    @QtCore.pyqtProperty(object)
-    def axes(self):
-
-        return self._axes
-
-    @QtCore.pyqtProperty(object)
-    def caxes(self):
-
-        return self._cbaxes
-
-    @QtCore.pyqtProperty(object)
-    def twin_axes_x(self):
-
-        return self._twinaxes_x
-
-    @QtCore.pyqtProperty(object)
-    def twin_axes_y(self):
-
-        return self._twinaxes_y
-
-    @QtCore.pyqtProperty(object)
-    def canvas(self):
-
-        return self._canvas
-
-    @QtCore.pyqtProperty(object)
-    def figure(self):
-
-        return self._fig
-
-    @QtCore.pyqtProperty(object)
-    def toolbar(self):
-
-        return self._canvas.toolbar
-
-    def clear_history(self):
-        self.mpl_toolbar.update()
-        self.mpl_toolbar.push_current()
-
-    def store_figure_data(self):
-
-        import numpy as np
-
-        print(self.plottername)
-
-        try:
-            enumiter = enumerate(self._axes)
-        except TypeError:
-            enumiter = enumerate([self._axes])
-
-        datadict = {}
-        for idx, ax in enumiter:
-
-            xlabel = ax.xaxis.get_label().get_text()
-            ylabel = ax.yaxis.get_label().get_text()
-            axname = 'subplot_{}'.format(idx + 1)
-            datadict[axname] = {}
-
-            for line in ax.get_lines():
-
-                llabel = line.get_label()
-                if '_line' in llabel:
-                    # don't use unlabeled lines
-                    continue
-                xdata = line.get_xdata()
-                ydata = line.get_ydata()
-
-                line_dtype = np.dtype([
-                    (xlabel, np.float64), (ylabel, np.float64)
-                    ])
-                xyarray = np.array(list(zip(xdata, ydata)), dtype=line_dtype)
-
-                datadict[axname][llabel] = xyarray
-
-        if sys.version_info >= (3, 0):
-            import pickle
-        else:
-            import cPickle as pickle
-        pickle.dump(datadict, open('/tmp/plot.cpickle', 'wb'), protocol=2)
diff --git a/pycraf/gui/resources/__init__.py b/pycraf/gui/resources/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/pycraf/gui/resources/busy_indicator.gif b/pycraf/gui/resources/busy_indicator.gif
deleted file mode 100644
index d0bce1542..000000000
Binary files a/pycraf/gui/resources/busy_indicator.gif and /dev/null differ
diff --git a/pycraf/gui/resources/compileform.sh b/pycraf/gui/resources/compileform.sh
deleted file mode 100755
index 752e2dc14..000000000
--- a/pycraf/gui/resources/compileform.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-pyuic5 main_form.ui -o main_form.py
-pyrcc5 resources.qrc -o resources_rc.py
-sed -i 's/import resources_rc/from pycraf.gui.resources import resources_rc/g' *form.py
diff --git a/pycraf/gui/resources/main_form.py b/pycraf/gui/resources/main_form.py
deleted file mode 100644
index 66abee7a4..000000000
--- a/pycraf/gui/resources/main_form.py
+++ /dev/null
@@ -1,568 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'main_form.ui'
-#
-# Created by: PyQt5 UI code generator 5.6
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt5 import QtCore, QtGui, QtWidgets
-
-class Ui_MainWindow(object):
-    def setupUi(self, MainWindow):
-        MainWindow.setObjectName("MainWindow")
-        MainWindow.resize(1098, 934)
-        self.centralwidget = QtWidgets.QWidget(MainWindow)
-        self.centralwidget.setObjectName("centralwidget")
-        self.gridLayout_8 = QtWidgets.QGridLayout(self.centralwidget)
-        self.gridLayout_8.setObjectName("gridLayout_8")
-        self.tabWidget = QtWidgets.QTabWidget(self.centralwidget)
-        self.tabWidget.setObjectName("tabWidget")
-        self.geometryTab = QtWidgets.QWidget()
-        self.geometryTab.setObjectName("geometryTab")
-        self.gridLayout_13 = QtWidgets.QGridLayout(self.geometryTab)
-        self.gridLayout_13.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout_13.setObjectName("gridLayout_13")
-        self.geometryVerticalLayout = QtWidgets.QVBoxLayout()
-        self.geometryVerticalLayout.setObjectName("geometryVerticalLayout")
-        self.ppRichTextLabel = QtWidgets.QLabel(self.geometryTab)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Maximum)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.ppRichTextLabel.sizePolicy().hasHeightForWidth())
-        self.ppRichTextLabel.setSizePolicy(sizePolicy)
-        self.ppRichTextLabel.setText("")
-        self.ppRichTextLabel.setTextFormat(QtCore.Qt.RichText)
-        self.ppRichTextLabel.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextSelectableByMouse)
-        self.ppRichTextLabel.setObjectName("ppRichTextLabel")
-        self.geometryVerticalLayout.addWidget(self.ppRichTextLabel)
-        self.verticalLayout_4 = QtWidgets.QVBoxLayout()
-        self.verticalLayout_4.setObjectName("verticalLayout_4")
-        self.geometryVerticalLayout.addLayout(self.verticalLayout_4)
-        self.gridLayout_13.addLayout(self.geometryVerticalLayout, 0, 0, 1, 1)
-        self.tabWidget.addTab(self.geometryTab, "")
-        self.statisticsTab = QtWidgets.QWidget()
-        self.statisticsTab.setObjectName("statisticsTab")
-        self.gridLayout_17 = QtWidgets.QGridLayout(self.statisticsTab)
-        self.gridLayout_17.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout_17.setObjectName("gridLayout_17")
-        self.statisticsVerticalLayout = QtWidgets.QVBoxLayout()
-        self.statisticsVerticalLayout.setObjectName("statisticsVerticalLayout")
-        self.gridLayout_17.addLayout(self.statisticsVerticalLayout, 0, 0, 1, 1)
-        self.tabWidget.addTab(self.statisticsTab, "")
-        self.pathprofileTab = QtWidgets.QWidget()
-        self.pathprofileTab.setObjectName("pathprofileTab")
-        self.gridLayout_9 = QtWidgets.QGridLayout(self.pathprofileTab)
-        self.gridLayout_9.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout_9.setObjectName("gridLayout_9")
-        self.pathprofVerticalLayout = QtWidgets.QVBoxLayout()
-        self.pathprofVerticalLayout.setObjectName("pathprofVerticalLayout")
-        self.gridLayout_9.addLayout(self.pathprofVerticalLayout, 0, 0, 1, 1)
-        self.tabWidget.addTab(self.pathprofileTab, "")
-        self.mapTab = QtWidgets.QWidget()
-        self.mapTab.setObjectName("mapTab")
-        self.gridLayout_10 = QtWidgets.QGridLayout(self.mapTab)
-        self.gridLayout_10.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout_10.setObjectName("gridLayout_10")
-        self.mapVerticalLayout = QtWidgets.QVBoxLayout()
-        self.mapVerticalLayout.setObjectName("mapVerticalLayout")
-        self.gridLayout_10.addLayout(self.mapVerticalLayout, 0, 0, 1, 1)
-        self.tabWidget.addTab(self.mapTab, "")
-        self.gridLayout_8.addWidget(self.tabWidget, 0, 0, 1, 1)
-        MainWindow.setCentralWidget(self.centralwidget)
-        self.menubar = QtWidgets.QMenuBar(MainWindow)
-        self.menubar.setGeometry(QtCore.QRect(0, 0, 1098, 20))
-        self.menubar.setObjectName("menubar")
-        self.menuFile = QtWidgets.QMenu(self.menubar)
-        self.menuFile.setObjectName("menuFile")
-        MainWindow.setMenuBar(self.menubar)
-        self.statusbar = QtWidgets.QStatusBar(MainWindow)
-        self.statusbar.setObjectName("statusbar")
-        MainWindow.setStatusBar(self.statusbar)
-        self.parametersDockWidget = QtWidgets.QDockWidget(MainWindow)
-        self.parametersDockWidget.setObjectName("parametersDockWidget")
-        self.dockWidgetContents = QtWidgets.QWidget()
-        self.dockWidgetContents.setObjectName("dockWidgetContents")
-        self.gridLayout = QtWidgets.QGridLayout(self.dockWidgetContents)
-        self.gridLayout.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout.setObjectName("gridLayout")
-        self.scrollArea = QtWidgets.QScrollArea(self.dockWidgetContents)
-        self.scrollArea.setWidgetResizable(True)
-        self.scrollArea.setObjectName("scrollArea")
-        self.scrollAreaWidgetContents = QtWidgets.QWidget()
-        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, -191, 238, 542))
-        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
-        self.gridLayout_5 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents)
-        self.gridLayout_5.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout_5.setObjectName("gridLayout_5")
-        self.verticalLayout = QtWidgets.QVBoxLayout()
-        self.verticalLayout.setObjectName("verticalLayout")
-        self.groupBox_3 = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
-        self.groupBox_3.setObjectName("groupBox_3")
-        self.gridLayout_4 = QtWidgets.QGridLayout(self.groupBox_3)
-        self.gridLayout_4.setObjectName("gridLayout_4")
-        self.formLayout_4 = QtWidgets.QFormLayout()
-        self.formLayout_4.setObjectName("formLayout_4")
-        self.label_10 = QtWidgets.QLabel(self.groupBox_3)
-        self.label_10.setObjectName("label_10")
-        self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_10)
-        self.freqDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox_3)
-        self.freqDoubleSpinBox.setDecimals(3)
-        self.freqDoubleSpinBox.setMinimum(0.1)
-        self.freqDoubleSpinBox.setMaximum(100.0)
-        self.freqDoubleSpinBox.setSingleStep(0.1)
-        self.freqDoubleSpinBox.setProperty("value", 1.0)
-        self.freqDoubleSpinBox.setObjectName("freqDoubleSpinBox")
-        self.formLayout_4.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.freqDoubleSpinBox)
-        self.label_11 = QtWidgets.QLabel(self.groupBox_3)
-        self.label_11.setObjectName("label_11")
-        self.formLayout_4.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_11)
-        self.timepercentDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox_3)
-        self.timepercentDoubleSpinBox.setDecimals(3)
-        self.timepercentDoubleSpinBox.setMinimum(0.001)
-        self.timepercentDoubleSpinBox.setMaximum(50.0)
-        self.timepercentDoubleSpinBox.setProperty("value", 2.0)
-        self.timepercentDoubleSpinBox.setObjectName("timepercentDoubleSpinBox")
-        self.formLayout_4.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.timepercentDoubleSpinBox)
-        self.label_12 = QtWidgets.QLabel(self.groupBox_3)
-        self.label_12.setObjectName("label_12")
-        self.formLayout_4.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_12)
-        self.stepsizeDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox_3)
-        self.stepsizeDoubleSpinBox.setDecimals(1)
-        self.stepsizeDoubleSpinBox.setMinimum(10.0)
-        self.stepsizeDoubleSpinBox.setMaximum(10000.0)
-        self.stepsizeDoubleSpinBox.setSingleStep(1.0)
-        self.stepsizeDoubleSpinBox.setProperty("value", 10.0)
-        self.stepsizeDoubleSpinBox.setObjectName("stepsizeDoubleSpinBox")
-        self.formLayout_4.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.stepsizeDoubleSpinBox)
-        self.label_4 = QtWidgets.QLabel(self.groupBox_3)
-        self.label_4.setObjectName("label_4")
-        self.formLayout_4.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_4)
-        self.tempDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox_3)
-        self.tempDoubleSpinBox.setMinimum(200.0)
-        self.tempDoubleSpinBox.setMaximum(350.0)
-        self.tempDoubleSpinBox.setProperty("value", 293.15)
-        self.tempDoubleSpinBox.setObjectName("tempDoubleSpinBox")
-        self.formLayout_4.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.tempDoubleSpinBox)
-        self.label_13 = QtWidgets.QLabel(self.groupBox_3)
-        self.label_13.setObjectName("label_13")
-        self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_13)
-        self.pressDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox_3)
-        self.pressDoubleSpinBox.setDecimals(1)
-        self.pressDoubleSpinBox.setMinimum(10.0)
-        self.pressDoubleSpinBox.setMaximum(1500.0)
-        self.pressDoubleSpinBox.setProperty("value", 980.0)
-        self.pressDoubleSpinBox.setObjectName("pressDoubleSpinBox")
-        self.formLayout_4.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.pressDoubleSpinBox)
-        self.label_16 = QtWidgets.QLabel(self.groupBox_3)
-        self.label_16.setObjectName("label_16")
-        self.formLayout_4.setWidget(6, QtWidgets.QFormLayout.LabelRole, self.label_16)
-        self.versionComboBox = QtWidgets.QComboBox(self.groupBox_3)
-        self.versionComboBox.setEnabled(False)
-        self.versionComboBox.setObjectName("versionComboBox")
-        self.versionComboBox.addItem("")
-        self.versionComboBox.addItem("")
-        self.versionComboBox.addItem("")
-        self.formLayout_4.setWidget(6, QtWidgets.QFormLayout.FieldRole, self.versionComboBox)
-        self.label_6 = QtWidgets.QLabel(self.groupBox_3)
-        self.label_6.setObjectName("label_6")
-        self.formLayout_4.setWidget(5, QtWidgets.QFormLayout.LabelRole, self.label_6)
-        self.polarizationComboBox = QtWidgets.QComboBox(self.groupBox_3)
-        self.polarizationComboBox.setObjectName("polarizationComboBox")
-        self.polarizationComboBox.addItem("")
-        self.polarizationComboBox.addItem("")
-        self.formLayout_4.setWidget(5, QtWidgets.QFormLayout.FieldRole, self.polarizationComboBox)
-        self.gridLayout_4.addLayout(self.formLayout_4, 0, 0, 1, 1)
-        self.verticalLayout.addWidget(self.groupBox_3)
-        self.groupBox_2 = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
-        self.groupBox_2.setObjectName("groupBox_2")
-        self.gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_2)
-        self.gridLayout_2.setObjectName("gridLayout_2")
-        self.formLayout_2 = QtWidgets.QFormLayout()
-        self.formLayout_2.setObjectName("formLayout_2")
-        self.label_3 = QtWidgets.QLabel(self.groupBox_2)
-        self.label_3.setObjectName("label_3")
-        self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_3)
-        self.txLonDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox_2)
-        self.txLonDoubleSpinBox.setDecimals(5)
-        self.txLonDoubleSpinBox.setMinimum(-180.0)
-        self.txLonDoubleSpinBox.setMaximum(180.0)
-        self.txLonDoubleSpinBox.setSingleStep(0.05)
-        self.txLonDoubleSpinBox.setProperty("value", 6.2)
-        self.txLonDoubleSpinBox.setObjectName("txLonDoubleSpinBox")
-        self.formLayout_2.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.txLonDoubleSpinBox)
-        self.label_14 = QtWidgets.QLabel(self.groupBox_2)
-        self.label_14.setObjectName("label_14")
-        self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_14)
-        self.txLatDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox_2)
-        self.txLatDoubleSpinBox.setDecimals(5)
-        self.txLatDoubleSpinBox.setMinimum(-90.0)
-        self.txLatDoubleSpinBox.setMaximum(90.0)
-        self.txLatDoubleSpinBox.setSingleStep(0.05)
-        self.txLatDoubleSpinBox.setProperty("value", 50.8)
-        self.txLatDoubleSpinBox.setObjectName("txLatDoubleSpinBox")
-        self.formLayout_2.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.txLatDoubleSpinBox)
-        self.label_5 = QtWidgets.QLabel(self.groupBox_2)
-        self.label_5.setObjectName("label_5")
-        self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_5)
-        self.txHeightDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox_2)
-        self.txHeightDoubleSpinBox.setDecimals(1)
-        self.txHeightDoubleSpinBox.setMinimum(-500.0)
-        self.txHeightDoubleSpinBox.setMaximum(1000000.0)
-        self.txHeightDoubleSpinBox.setSingleStep(5.0)
-        self.txHeightDoubleSpinBox.setProperty("value", 50.0)
-        self.txHeightDoubleSpinBox.setObjectName("txHeightDoubleSpinBox")
-        self.formLayout_2.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.txHeightDoubleSpinBox)
-        self.label = QtWidgets.QLabel(self.groupBox_2)
-        self.label.setObjectName("label")
-        self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label)
-        self.txClutterComboBox = QtWidgets.QComboBox(self.groupBox_2)
-        self.txClutterComboBox.setObjectName("txClutterComboBox")
-        self.formLayout_2.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.txClutterComboBox)
-        self.gridLayout_2.addLayout(self.formLayout_2, 0, 0, 1, 1)
-        self.verticalLayout.addWidget(self.groupBox_2)
-        self.groupBox = QtWidgets.QGroupBox(self.scrollAreaWidgetContents)
-        self.groupBox.setObjectName("groupBox")
-        self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBox)
-        self.gridLayout_3.setObjectName("gridLayout_3")
-        self.formLayout_3 = QtWidgets.QFormLayout()
-        self.formLayout_3.setObjectName("formLayout_3")
-        self.label_7 = QtWidgets.QLabel(self.groupBox)
-        self.label_7.setObjectName("label_7")
-        self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_7)
-        self.rxLonDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox)
-        self.rxLonDoubleSpinBox.setDecimals(5)
-        self.rxLonDoubleSpinBox.setMinimum(-180.0)
-        self.rxLonDoubleSpinBox.setMaximum(180.0)
-        self.rxLonDoubleSpinBox.setSingleStep(0.05)
-        self.rxLonDoubleSpinBox.setProperty("value", 6.88361)
-        self.rxLonDoubleSpinBox.setObjectName("rxLonDoubleSpinBox")
-        self.formLayout_3.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.rxLonDoubleSpinBox)
-        self.label_15 = QtWidgets.QLabel(self.groupBox)
-        self.label_15.setObjectName("label_15")
-        self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_15)
-        self.rxLatDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox)
-        self.rxLatDoubleSpinBox.setDecimals(5)
-        self.rxLatDoubleSpinBox.setMinimum(-90.0)
-        self.rxLatDoubleSpinBox.setMaximum(90.0)
-        self.rxLatDoubleSpinBox.setSingleStep(0.05)
-        self.rxLatDoubleSpinBox.setProperty("value", 50.52483)
-        self.rxLatDoubleSpinBox.setObjectName("rxLatDoubleSpinBox")
-        self.formLayout_3.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.rxLatDoubleSpinBox)
-        self.label_8 = QtWidgets.QLabel(self.groupBox)
-        self.label_8.setObjectName("label_8")
-        self.formLayout_3.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_8)
-        self.rxHeightDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.groupBox)
-        self.rxHeightDoubleSpinBox.setDecimals(1)
-        self.rxHeightDoubleSpinBox.setMinimum(-500.0)
-        self.rxHeightDoubleSpinBox.setMaximum(1000000.0)
-        self.rxHeightDoubleSpinBox.setSingleStep(5.0)
-        self.rxHeightDoubleSpinBox.setProperty("value", 10.0)
-        self.rxHeightDoubleSpinBox.setObjectName("rxHeightDoubleSpinBox")
-        self.formLayout_3.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.rxHeightDoubleSpinBox)
-        self.label_2 = QtWidgets.QLabel(self.groupBox)
-        self.label_2.setObjectName("label_2")
-        self.formLayout_3.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_2)
-        self.rxClutterComboBox = QtWidgets.QComboBox(self.groupBox)
-        self.rxClutterComboBox.setObjectName("rxClutterComboBox")
-        self.formLayout_3.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.rxClutterComboBox)
-        self.gridLayout_3.addLayout(self.formLayout_3, 0, 0, 1, 1)
-        spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
-        self.gridLayout_3.addItem(spacerItem, 1, 0, 1, 1)
-        self.verticalLayout.addWidget(self.groupBox)
-        self.gridLayout_5.addLayout(self.verticalLayout, 0, 0, 1, 1)
-        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
-        self.gridLayout.addWidget(self.scrollArea, 0, 1, 1, 1)
-        self.parametersDockWidget.setWidget(self.dockWidgetContents)
-        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.parametersDockWidget)
-        self.pathpropDockWidget = QtWidgets.QDockWidget(MainWindow)
-        self.pathpropDockWidget.setObjectName("pathpropDockWidget")
-        self.dockWidgetContents_2 = QtWidgets.QWidget()
-        self.dockWidgetContents_2.setObjectName("dockWidgetContents_2")
-        self.gridLayout_6 = QtWidgets.QGridLayout(self.dockWidgetContents_2)
-        self.gridLayout_6.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout_6.setObjectName("gridLayout_6")
-        self.scrollArea_2 = QtWidgets.QScrollArea(self.dockWidgetContents_2)
-        self.scrollArea_2.setWidgetResizable(True)
-        self.scrollArea_2.setObjectName("scrollArea_2")
-        self.scrollAreaWidgetContents_2 = QtWidgets.QWidget()
-        self.scrollAreaWidgetContents_2.setGeometry(QtCore.QRect(0, -22, 222, 132))
-        self.scrollAreaWidgetContents_2.setObjectName("scrollAreaWidgetContents_2")
-        self.gridLayout_7 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_2)
-        self.gridLayout_7.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout_7.setObjectName("gridLayout_7")
-        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
-        self.verticalLayout_2.setObjectName("verticalLayout_2")
-        self.pathprofPlotChooserComboBox = QtWidgets.QComboBox(self.scrollAreaWidgetContents_2)
-        self.pathprofPlotChooserComboBox.setObjectName("pathprofPlotChooserComboBox")
-        self.verticalLayout_2.addWidget(self.pathprofPlotChooserComboBox)
-        self.pathprofIncludeHeightCheckBox = QtWidgets.QCheckBox(self.scrollAreaWidgetContents_2)
-        self.pathprofIncludeHeightCheckBox.setChecked(True)
-        self.pathprofIncludeHeightCheckBox.setObjectName("pathprofIncludeHeightCheckBox")
-        self.verticalLayout_2.addWidget(self.pathprofIncludeHeightCheckBox)
-        self.pathprofAutoUpdateCheckBox = QtWidgets.QCheckBox(self.scrollAreaWidgetContents_2)
-        self.pathprofAutoUpdateCheckBox.setObjectName("pathprofAutoUpdateCheckBox")
-        self.verticalLayout_2.addWidget(self.pathprofAutoUpdateCheckBox)
-        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
-        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
-        self.pathprofComputePushButton = QtWidgets.QPushButton(self.scrollAreaWidgetContents_2)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.pathprofComputePushButton.sizePolicy().hasHeightForWidth())
-        self.pathprofComputePushButton.setSizePolicy(sizePolicy)
-        self.pathprofComputePushButton.setObjectName("pathprofComputePushButton")
-        self.horizontalLayout_3.addWidget(self.pathprofComputePushButton)
-        self.pathprofBusyIndicatorLabel = QtWidgets.QLabel(self.scrollAreaWidgetContents_2)
-        self.pathprofBusyIndicatorLabel.setStyleSheet("QLabel {\n"
-"    color : red;\n"
-"}")
-        self.pathprofBusyIndicatorLabel.setObjectName("pathprofBusyIndicatorLabel")
-        self.horizontalLayout_3.addWidget(self.pathprofBusyIndicatorLabel)
-        self.verticalLayout_2.addLayout(self.horizontalLayout_3)
-        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
-        self.verticalLayout_2.addItem(spacerItem1)
-        self.gridLayout_7.addLayout(self.verticalLayout_2, 0, 0, 1, 1)
-        self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2)
-        self.gridLayout_6.addWidget(self.scrollArea_2, 0, 0, 1, 1)
-        self.pathpropDockWidget.setWidget(self.dockWidgetContents_2)
-        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.pathpropDockWidget)
-        self.mappingDockWidget = QtWidgets.QDockWidget(MainWindow)
-        self.mappingDockWidget.setObjectName("mappingDockWidget")
-        self.dockWidgetContents_3 = QtWidgets.QWidget()
-        self.dockWidgetContents_3.setObjectName("dockWidgetContents_3")
-        self.gridLayout_11 = QtWidgets.QGridLayout(self.dockWidgetContents_3)
-        self.gridLayout_11.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout_11.setObjectName("gridLayout_11")
-        self.scrollArea_3 = QtWidgets.QScrollArea(self.dockWidgetContents_3)
-        self.scrollArea_3.setWidgetResizable(True)
-        self.scrollArea_3.setObjectName("scrollArea_3")
-        self.scrollAreaWidgetContents_3 = QtWidgets.QWidget()
-        self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, -81, 222, 163))
-        self.scrollAreaWidgetContents_3.setObjectName("scrollAreaWidgetContents_3")
-        self.gridLayout_12 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_3)
-        self.gridLayout_12.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout_12.setObjectName("gridLayout_12")
-        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
-        self.verticalLayout_3.setObjectName("verticalLayout_3")
-        self.formLayout = QtWidgets.QFormLayout()
-        self.formLayout.setObjectName("formLayout")
-        self.label_9 = QtWidgets.QLabel(self.scrollAreaWidgetContents_3)
-        self.label_9.setObjectName("label_9")
-        self.formLayout.setWidget(0, QtWidgets.QFormLayout.LabelRole, self.label_9)
-        self.label_17 = QtWidgets.QLabel(self.scrollAreaWidgetContents_3)
-        self.label_17.setObjectName("label_17")
-        self.formLayout.setWidget(1, QtWidgets.QFormLayout.LabelRole, self.label_17)
-        self.mapSizeLonDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.scrollAreaWidgetContents_3)
-        self.mapSizeLonDoubleSpinBox.setDecimals(3)
-        self.mapSizeLonDoubleSpinBox.setMinimum(0.05)
-        self.mapSizeLonDoubleSpinBox.setMaximum(5.0)
-        self.mapSizeLonDoubleSpinBox.setSingleStep(0.05)
-        self.mapSizeLonDoubleSpinBox.setProperty("value", 0.2)
-        self.mapSizeLonDoubleSpinBox.setObjectName("mapSizeLonDoubleSpinBox")
-        self.formLayout.setWidget(0, QtWidgets.QFormLayout.FieldRole, self.mapSizeLonDoubleSpinBox)
-        self.mapSizeLatDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.scrollAreaWidgetContents_3)
-        self.mapSizeLatDoubleSpinBox.setDecimals(3)
-        self.mapSizeLatDoubleSpinBox.setMinimum(0.05)
-        self.mapSizeLatDoubleSpinBox.setMaximum(5.0)
-        self.mapSizeLatDoubleSpinBox.setSingleStep(0.05)
-        self.mapSizeLatDoubleSpinBox.setProperty("value", 0.2)
-        self.mapSizeLatDoubleSpinBox.setObjectName("mapSizeLatDoubleSpinBox")
-        self.formLayout.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.mapSizeLatDoubleSpinBox)
-        self.label_18 = QtWidgets.QLabel(self.scrollAreaWidgetContents_3)
-        self.label_18.setObjectName("label_18")
-        self.formLayout.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_18)
-        self.mapResolutionDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.scrollAreaWidgetContents_3)
-        self.mapResolutionDoubleSpinBox.setDecimals(1)
-        self.mapResolutionDoubleSpinBox.setMinimum(1.0)
-        self.mapResolutionDoubleSpinBox.setMaximum(300.0)
-        self.mapResolutionDoubleSpinBox.setProperty("value", 3.0)
-        self.mapResolutionDoubleSpinBox.setObjectName("mapResolutionDoubleSpinBox")
-        self.formLayout.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.mapResolutionDoubleSpinBox)
-        self.verticalLayout_3.addLayout(self.formLayout)
-        self.mapPlotChooserComboBox = QtWidgets.QComboBox(self.scrollAreaWidgetContents_3)
-        self.mapPlotChooserComboBox.setObjectName("mapPlotChooserComboBox")
-        self.verticalLayout_3.addWidget(self.mapPlotChooserComboBox)
-        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
-        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
-        self.mapComputePushButton = QtWidgets.QPushButton(self.scrollAreaWidgetContents_3)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.mapComputePushButton.sizePolicy().hasHeightForWidth())
-        self.mapComputePushButton.setSizePolicy(sizePolicy)
-        self.mapComputePushButton.setObjectName("mapComputePushButton")
-        self.horizontalLayout_4.addWidget(self.mapComputePushButton)
-        self.mapBusyIndicatorLabel = QtWidgets.QLabel(self.scrollAreaWidgetContents_3)
-        self.mapBusyIndicatorLabel.setStyleSheet("QLabel {\n"
-"    color : red;\n"
-"}")
-        self.mapBusyIndicatorLabel.setObjectName("mapBusyIndicatorLabel")
-        self.horizontalLayout_4.addWidget(self.mapBusyIndicatorLabel)
-        self.verticalLayout_3.addLayout(self.horizontalLayout_4)
-        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
-        self.verticalLayout_3.addItem(spacerItem2)
-        self.gridLayout_12.addLayout(self.verticalLayout_3, 0, 0, 1, 1)
-        self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3)
-        self.gridLayout_11.addWidget(self.scrollArea_3, 0, 0, 1, 1)
-        self.mappingDockWidget.setWidget(self.dockWidgetContents_3)
-        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.mappingDockWidget)
-        self.optionsDockWidget = QtWidgets.QDockWidget(MainWindow)
-        self.optionsDockWidget.setObjectName("optionsDockWidget")
-        self.dockWidgetContents_4 = QtWidgets.QWidget()
-        self.dockWidgetContents_4.setObjectName("dockWidgetContents_4")
-        self.gridLayout_14 = QtWidgets.QGridLayout(self.dockWidgetContents_4)
-        self.gridLayout_14.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout_14.setObjectName("gridLayout_14")
-        self.scrollArea_4 = QtWidgets.QScrollArea(self.dockWidgetContents_4)
-        self.scrollArea_4.setWidgetResizable(True)
-        self.scrollArea_4.setObjectName("scrollArea_4")
-        self.scrollAreaWidgetContents_4 = QtWidgets.QWidget()
-        self.scrollAreaWidgetContents_4.setGeometry(QtCore.QRect(0, 0, 238, 205))
-        self.scrollAreaWidgetContents_4.setObjectName("scrollAreaWidgetContents_4")
-        self.gridLayout_15 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents_4)
-        self.gridLayout_15.setContentsMargins(0, 0, 0, 0)
-        self.gridLayout_15.setObjectName("gridLayout_15")
-        self.groupBox_4 = QtWidgets.QGroupBox(self.scrollAreaWidgetContents_4)
-        self.groupBox_4.setObjectName("groupBox_4")
-        self.gridLayout_16 = QtWidgets.QGridLayout(self.groupBox_4)
-        self.gridLayout_16.setObjectName("gridLayout_16")
-        self.verticalLayout_5 = QtWidgets.QVBoxLayout()
-        self.verticalLayout_5.setObjectName("verticalLayout_5")
-        self.label_19 = QtWidgets.QLabel(self.groupBox_4)
-        self.label_19.setObjectName("label_19")
-        self.verticalLayout_5.addWidget(self.label_19)
-        self.srtmPathPushButton = QtWidgets.QPushButton(self.groupBox_4)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.srtmPathPushButton.sizePolicy().hasHeightForWidth())
-        self.srtmPathPushButton.setSizePolicy(sizePolicy)
-        self.srtmPathPushButton.setObjectName("srtmPathPushButton")
-        self.verticalLayout_5.addWidget(self.srtmPathPushButton)
-        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
-        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
-        self.label_21 = QtWidgets.QLabel(self.groupBox_4)
-        self.label_21.setObjectName("label_21")
-        self.horizontalLayout_2.addWidget(self.label_21)
-        self.srtmDownloadComboBox = QtWidgets.QComboBox(self.groupBox_4)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.srtmDownloadComboBox.sizePolicy().hasHeightForWidth())
-        self.srtmDownloadComboBox.setSizePolicy(sizePolicy)
-        self.srtmDownloadComboBox.setObjectName("srtmDownloadComboBox")
-        self.srtmDownloadComboBox.addItem("")
-        self.srtmDownloadComboBox.addItem("")
-        self.srtmDownloadComboBox.addItem("")
-        self.horizontalLayout_2.addWidget(self.srtmDownloadComboBox)
-        self.verticalLayout_5.addLayout(self.horizontalLayout_2)
-        self.horizontalLayout = QtWidgets.QHBoxLayout()
-        self.horizontalLayout.setObjectName("horizontalLayout")
-        self.label_20 = QtWidgets.QLabel(self.groupBox_4)
-        self.label_20.setObjectName("label_20")
-        self.horizontalLayout.addWidget(self.label_20)
-        self.srtmServerComboBox = QtWidgets.QComboBox(self.groupBox_4)
-        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed)
-        sizePolicy.setHorizontalStretch(0)
-        sizePolicy.setVerticalStretch(0)
-        sizePolicy.setHeightForWidth(self.srtmServerComboBox.sizePolicy().hasHeightForWidth())
-        self.srtmServerComboBox.setSizePolicy(sizePolicy)
-        self.srtmServerComboBox.setObjectName("srtmServerComboBox")
-        self.srtmServerComboBox.addItem("")
-        self.srtmServerComboBox.addItem("")
-        self.srtmServerComboBox.addItem("")
-        self.horizontalLayout.addWidget(self.srtmServerComboBox)
-        self.verticalLayout_5.addLayout(self.horizontalLayout)
-        spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
-        self.verticalLayout_5.addItem(spacerItem3)
-        self.gridLayout_16.addLayout(self.verticalLayout_5, 0, 0, 1, 1)
-        self.gridLayout_15.addWidget(self.groupBox_4, 0, 0, 1, 1)
-        self.scrollArea_4.setWidget(self.scrollAreaWidgetContents_4)
-        self.gridLayout_14.addWidget(self.scrollArea_4, 0, 0, 1, 1)
-        self.optionsDockWidget.setWidget(self.dockWidgetContents_4)
-        MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.optionsDockWidget)
-        self.actionQuit = QtWidgets.QAction(MainWindow)
-        self.actionQuit.setObjectName("actionQuit")
-        self.menuFile.addAction(self.actionQuit)
-        self.menubar.addAction(self.menuFile.menuAction())
-
-        self.retranslateUi(MainWindow)
-        self.tabWidget.setCurrentIndex(0)
-        self.versionComboBox.setCurrentIndex(1)
-        self.srtmServerComboBox.setCurrentIndex(2)
-        self.actionQuit.triggered.connect(MainWindow.close)
-        QtCore.QMetaObject.connectSlotsByName(MainWindow)
-
-    def retranslateUi(self, MainWindow):
-        _translate = QtCore.QCoreApplication.translate
-        MainWindow.setWindowTitle(_translate("MainWindow", "pycraf GUI"))
-        self.tabWidget.setTabText(self.tabWidget.indexOf(self.geometryTab), _translate("MainWindow", "Geometry"))
-        self.tabWidget.setTabText(self.tabWidget.indexOf(self.statisticsTab), _translate("MainWindow", "Statistics"))
-        self.tabWidget.setTabText(self.tabWidget.indexOf(self.pathprofileTab), _translate("MainWindow", "Path profile"))
-        self.tabWidget.setTabText(self.tabWidget.indexOf(self.mapTab), _translate("MainWindow", "Map"))
-        self.menuFile.setTitle(_translate("MainWindow", "File"))
-        self.parametersDockWidget.setWindowTitle(_translate("MainWindow", "General parameters"))
-        self.groupBox_3.setTitle(_translate("MainWindow", "Conditions"))
-        self.label_10.setText(_translate("MainWindow", "Frequency"))
-        self.freqDoubleSpinBox.setSuffix(_translate("MainWindow", " GHz"))
-        self.label_11.setText(_translate("MainWindow", "Time percent"))
-        self.timepercentDoubleSpinBox.setSuffix(_translate("MainWindow", " %"))
-        self.label_12.setText(_translate("MainWindow", "Step size"))
-        self.stepsizeDoubleSpinBox.setSuffix(_translate("MainWindow", " m"))
-        self.label_4.setText(_translate("MainWindow", "Temperature"))
-        self.tempDoubleSpinBox.setSuffix(_translate("MainWindow", " K"))
-        self.label_13.setText(_translate("MainWindow", "Pressure"))
-        self.pressDoubleSpinBox.setSuffix(_translate("MainWindow", " hPa"))
-        self.label_16.setText(_translate("MainWindow", "Version"))
-        self.versionComboBox.setItemText(0, _translate("MainWindow", "14"))
-        self.versionComboBox.setItemText(1, _translate("MainWindow", "16"))
-        self.versionComboBox.setItemText(2, _translate("MainWindow", "17"))
-        self.label_6.setText(_translate("MainWindow", "Polarization"))
-        self.polarizationComboBox.setItemText(0, _translate("MainWindow", "Horizontal"))
-        self.polarizationComboBox.setItemText(1, _translate("MainWindow", "Vertical"))
-        self.groupBox_2.setTitle(_translate("MainWindow", "Transmitter"))
-        self.label_3.setText(_translate("MainWindow", "Longitude"))
-        self.txLonDoubleSpinBox.setSuffix(_translate("MainWindow", " deg"))
-        self.label_14.setText(_translate("MainWindow", "Latitude"))
-        self.txLatDoubleSpinBox.setSuffix(_translate("MainWindow", " deg"))
-        self.label_5.setText(_translate("MainWindow", "Height"))
-        self.txHeightDoubleSpinBox.setSuffix(_translate("MainWindow", " m"))
-        self.label.setText(_translate("MainWindow", "Clutter"))
-        self.groupBox.setTitle(_translate("MainWindow", "Receiver"))
-        self.label_7.setText(_translate("MainWindow", "Longitude"))
-        self.rxLonDoubleSpinBox.setSuffix(_translate("MainWindow", " deg"))
-        self.label_15.setText(_translate("MainWindow", "Latitude"))
-        self.rxLatDoubleSpinBox.setSuffix(_translate("MainWindow", " deg"))
-        self.label_8.setText(_translate("MainWindow", "Height"))
-        self.rxHeightDoubleSpinBox.setSuffix(_translate("MainWindow", " m"))
-        self.label_2.setText(_translate("MainWindow", "Clutter"))
-        self.pathpropDockWidget.setWindowTitle(_translate("MainWindow", "Path profile"))
-        self.pathprofIncludeHeightCheckBox.setText(_translate("MainWindow", "Include height profile"))
-        self.pathprofAutoUpdateCheckBox.setText(_translate("MainWindow", "Auto update"))
-        self.pathprofComputePushButton.setText(_translate("MainWindow", "Compute"))
-        self.pathprofBusyIndicatorLabel.setText(_translate("MainWindow", "Busy"))
-        self.mappingDockWidget.setWindowTitle(_translate("MainWindow", "Mapping"))
-        self.label_9.setText(_translate("MainWindow", "Size longitude"))
-        self.label_17.setText(_translate("MainWindow", "Size latitude"))
-        self.mapSizeLonDoubleSpinBox.setSuffix(_translate("MainWindow", " deg"))
-        self.mapSizeLatDoubleSpinBox.setSuffix(_translate("MainWindow", " deg"))
-        self.label_18.setText(_translate("MainWindow", "Resolution"))
-        self.mapResolutionDoubleSpinBox.setSuffix(_translate("MainWindow", " arcsec"))
-        self.mapComputePushButton.setText(_translate("MainWindow", "Compute"))
-        self.mapBusyIndicatorLabel.setText(_translate("MainWindow", "Busy"))
-        self.optionsDockWidget.setWindowTitle(_translate("MainWindow", "Options"))
-        self.groupBox_4.setTitle(_translate("MainWindow", "SRTM configuration"))
-        self.label_19.setText(_translate("MainWindow", "Tile path:"))
-        self.srtmPathPushButton.setText(_translate("MainWindow", "PushButton"))
-        self.label_21.setText(_translate("MainWindow", "Download"))
-        self.srtmDownloadComboBox.setItemText(0, _translate("MainWindow", "Never"))
-        self.srtmDownloadComboBox.setItemText(1, _translate("MainWindow", "Missing"))
-        self.srtmDownloadComboBox.setItemText(2, _translate("MainWindow", "Always"))
-        self.label_20.setText(_translate("MainWindow", "Server"))
-        self.srtmServerComboBox.setItemText(0, _translate("MainWindow", "NASA v1.0"))
-        self.srtmServerComboBox.setItemText(1, _translate("MainWindow", "NASA v2.1"))
-        self.srtmServerComboBox.setItemText(2, _translate("MainWindow", "Viewfinder panoramas"))
-        self.actionQuit.setText(_translate("MainWindow", "Quit"))
-
-from pycraf.gui.resources import resources_rc
diff --git a/pycraf/gui/resources/main_form.ui b/pycraf/gui/resources/main_form.ui
deleted file mode 100644
index a0cf19683..000000000
--- a/pycraf/gui/resources/main_form.ui
+++ /dev/null
@@ -1,1019 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>MainWindow</class>
- <widget class="QMainWindow" name="MainWindow">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>1098</width>
-    <height>934</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>pycraf GUI</string>
-  </property>
-  <widget class="QWidget" name="centralwidget">
-   <layout class="QGridLayout" name="gridLayout_8">
-    <item row="0" column="0">
-     <widget class="QTabWidget" name="tabWidget">
-      <property name="currentIndex">
-       <number>0</number>
-      </property>
-      <widget class="QWidget" name="geometryTab">
-       <attribute name="title">
-        <string>Geometry</string>
-       </attribute>
-       <layout class="QGridLayout" name="gridLayout_13">
-        <item row="0" column="0">
-         <layout class="QVBoxLayout" name="geometryVerticalLayout">
-          <item>
-           <widget class="QLabel" name="ppRichTextLabel">
-            <property name="sizePolicy">
-             <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
-              <horstretch>0</horstretch>
-              <verstretch>0</verstretch>
-             </sizepolicy>
-            </property>
-            <property name="text">
-             <string/>
-            </property>
-            <property name="textFormat">
-             <enum>Qt::RichText</enum>
-            </property>
-            <property name="textInteractionFlags">
-             <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
-            </property>
-           </widget>
-          </item>
-          <item>
-           <layout class="QVBoxLayout" name="verticalLayout_4"/>
-          </item>
-         </layout>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="statisticsTab">
-       <attribute name="title">
-        <string>Statistics</string>
-       </attribute>
-       <layout class="QGridLayout" name="gridLayout_17">
-        <item row="0" column="0">
-         <layout class="QVBoxLayout" name="statisticsVerticalLayout"/>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="pathprofileTab">
-       <attribute name="title">
-        <string>Path profile</string>
-       </attribute>
-       <layout class="QGridLayout" name="gridLayout_9">
-        <item row="0" column="0">
-         <layout class="QVBoxLayout" name="pathprofVerticalLayout"/>
-        </item>
-       </layout>
-      </widget>
-      <widget class="QWidget" name="mapTab">
-       <attribute name="title">
-        <string>Map</string>
-       </attribute>
-       <layout class="QGridLayout" name="gridLayout_10">
-        <item row="0" column="0">
-         <layout class="QVBoxLayout" name="mapVerticalLayout"/>
-        </item>
-       </layout>
-      </widget>
-     </widget>
-    </item>
-   </layout>
-  </widget>
-  <widget class="QMenuBar" name="menubar">
-   <property name="geometry">
-    <rect>
-     <x>0</x>
-     <y>0</y>
-     <width>1098</width>
-     <height>20</height>
-    </rect>
-   </property>
-   <widget class="QMenu" name="menuFile">
-    <property name="title">
-     <string>File</string>
-    </property>
-    <addaction name="actionQuit"/>
-   </widget>
-   <addaction name="menuFile"/>
-  </widget>
-  <widget class="QStatusBar" name="statusbar"/>
-  <widget class="QDockWidget" name="parametersDockWidget">
-   <property name="windowTitle">
-    <string>General parameters</string>
-   </property>
-   <attribute name="dockWidgetArea">
-    <number>1</number>
-   </attribute>
-   <widget class="QWidget" name="dockWidgetContents">
-    <layout class="QGridLayout" name="gridLayout">
-     <item row="0" column="1">
-      <widget class="QScrollArea" name="scrollArea">
-       <property name="widgetResizable">
-        <bool>true</bool>
-       </property>
-       <widget class="QWidget" name="scrollAreaWidgetContents">
-        <property name="geometry">
-         <rect>
-          <x>0</x>
-          <y>-191</y>
-          <width>238</width>
-          <height>542</height>
-         </rect>
-        </property>
-        <layout class="QGridLayout" name="gridLayout_5">
-         <item row="0" column="0">
-          <layout class="QVBoxLayout" name="verticalLayout">
-           <item>
-            <widget class="QGroupBox" name="groupBox_3">
-             <property name="title">
-              <string>Conditions</string>
-             </property>
-             <layout class="QGridLayout" name="gridLayout_4">
-              <item row="0" column="0">
-               <layout class="QFormLayout" name="formLayout_4">
-                <item row="0" column="0">
-                 <widget class="QLabel" name="label_10">
-                  <property name="text">
-                   <string>Frequency</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="0" column="1">
-                 <widget class="QDoubleSpinBox" name="freqDoubleSpinBox">
-                  <property name="suffix">
-                   <string> GHz</string>
-                  </property>
-                  <property name="decimals">
-                   <number>3</number>
-                  </property>
-                  <property name="minimum">
-                   <double>0.100000000000000</double>
-                  </property>
-                  <property name="maximum">
-                   <double>100.000000000000000</double>
-                  </property>
-                  <property name="singleStep">
-                   <double>0.100000000000000</double>
-                  </property>
-                  <property name="value">
-                   <double>1.000000000000000</double>
-                  </property>
-                 </widget>
-                </item>
-                <item row="3" column="0">
-                 <widget class="QLabel" name="label_11">
-                  <property name="text">
-                   <string>Time percent</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="3" column="1">
-                 <widget class="QDoubleSpinBox" name="timepercentDoubleSpinBox">
-                  <property name="suffix">
-                   <string> %</string>
-                  </property>
-                  <property name="decimals">
-                   <number>3</number>
-                  </property>
-                  <property name="minimum">
-                   <double>0.001000000000000</double>
-                  </property>
-                  <property name="maximum">
-                   <double>50.000000000000000</double>
-                  </property>
-                  <property name="value">
-                   <double>2.000000000000000</double>
-                  </property>
-                 </widget>
-                </item>
-                <item row="4" column="0">
-                 <widget class="QLabel" name="label_12">
-                  <property name="text">
-                   <string>Step size</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="4" column="1">
-                 <widget class="QDoubleSpinBox" name="stepsizeDoubleSpinBox">
-                  <property name="suffix">
-                   <string> m</string>
-                  </property>
-                  <property name="decimals">
-                   <number>1</number>
-                  </property>
-                  <property name="minimum">
-                   <double>10.000000000000000</double>
-                  </property>
-                  <property name="maximum">
-                   <double>10000.000000000000000</double>
-                  </property>
-                  <property name="singleStep">
-                   <double>1.000000000000000</double>
-                  </property>
-                  <property name="value">
-                   <double>10.000000000000000</double>
-                  </property>
-                 </widget>
-                </item>
-                <item row="1" column="0">
-                 <widget class="QLabel" name="label_4">
-                  <property name="text">
-                   <string>Temperature</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="1" column="1">
-                 <widget class="QDoubleSpinBox" name="tempDoubleSpinBox">
-                  <property name="suffix">
-                   <string> K</string>
-                  </property>
-                  <property name="minimum">
-                   <double>200.000000000000000</double>
-                  </property>
-                  <property name="maximum">
-                   <double>350.000000000000000</double>
-                  </property>
-                  <property name="value">
-                   <double>293.149999999999977</double>
-                  </property>
-                 </widget>
-                </item>
-                <item row="2" column="0">
-                 <widget class="QLabel" name="label_13">
-                  <property name="text">
-                   <string>Pressure</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="2" column="1">
-                 <widget class="QDoubleSpinBox" name="pressDoubleSpinBox">
-                  <property name="suffix">
-                   <string> hPa</string>
-                  </property>
-                  <property name="decimals">
-                   <number>1</number>
-                  </property>
-                  <property name="minimum">
-                   <double>10.000000000000000</double>
-                  </property>
-                  <property name="maximum">
-                   <double>1500.000000000000000</double>
-                  </property>
-                  <property name="value">
-                   <double>980.000000000000000</double>
-                  </property>
-                 </widget>
-                </item>
-                <item row="6" column="0">
-                 <widget class="QLabel" name="label_16">
-                  <property name="text">
-                   <string>Version</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="6" column="1">
-                 <widget class="QComboBox" name="versionComboBox">
-                  <property name="enabled">
-                   <bool>false</bool>
-                  </property>
-                  <property name="currentIndex">
-                   <number>1</number>
-                  </property>
-                  <item>
-                   <property name="text">
-                    <string>14</string>
-                   </property>
-                  </item>
-                  <item>
-                   <property name="text">
-                    <string>16</string>
-                   </property>
-                  </item>
-                  <item>
-                   <property name="text">
-                    <string>17</string>
-                   </property>
-                  </item>
-                 </widget>
-                </item>
-                <item row="5" column="0">
-                 <widget class="QLabel" name="label_6">
-                  <property name="text">
-                   <string>Polarization</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="5" column="1">
-                 <widget class="QComboBox" name="polarizationComboBox">
-                  <item>
-                   <property name="text">
-                    <string>Horizontal</string>
-                   </property>
-                  </item>
-                  <item>
-                   <property name="text">
-                    <string>Vertical</string>
-                   </property>
-                  </item>
-                 </widget>
-                </item>
-               </layout>
-              </item>
-             </layout>
-            </widget>
-           </item>
-           <item>
-            <widget class="QGroupBox" name="groupBox_2">
-             <property name="title">
-              <string>Transmitter</string>
-             </property>
-             <layout class="QGridLayout" name="gridLayout_2">
-              <item row="0" column="0">
-               <layout class="QFormLayout" name="formLayout_2">
-                <item row="0" column="0">
-                 <widget class="QLabel" name="label_3">
-                  <property name="text">
-                   <string>Longitude</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="0" column="1">
-                 <widget class="QDoubleSpinBox" name="txLonDoubleSpinBox">
-                  <property name="suffix">
-                   <string> deg</string>
-                  </property>
-                  <property name="decimals">
-                   <number>5</number>
-                  </property>
-                  <property name="minimum">
-                   <double>-180.000000000000000</double>
-                  </property>
-                  <property name="maximum">
-                   <double>180.000000000000000</double>
-                  </property>
-                  <property name="singleStep">
-                   <double>0.050000000000000</double>
-                  </property>
-                  <property name="value">
-                   <double>6.200000000000000</double>
-                  </property>
-                 </widget>
-                </item>
-                <item row="1" column="0">
-                 <widget class="QLabel" name="label_14">
-                  <property name="text">
-                   <string>Latitude</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="1" column="1">
-                 <widget class="QDoubleSpinBox" name="txLatDoubleSpinBox">
-                  <property name="suffix">
-                   <string> deg</string>
-                  </property>
-                  <property name="decimals">
-                   <number>5</number>
-                  </property>
-                  <property name="minimum">
-                   <double>-90.000000000000000</double>
-                  </property>
-                  <property name="maximum">
-                   <double>90.000000000000000</double>
-                  </property>
-                  <property name="singleStep">
-                   <double>0.050000000000000</double>
-                  </property>
-                  <property name="value">
-                   <double>50.799999999999997</double>
-                  </property>
-                 </widget>
-                </item>
-                <item row="2" column="0">
-                 <widget class="QLabel" name="label_5">
-                  <property name="text">
-                   <string>Height</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="2" column="1">
-                 <widget class="QDoubleSpinBox" name="txHeightDoubleSpinBox">
-                  <property name="suffix">
-                   <string> m</string>
-                  </property>
-                  <property name="decimals">
-                   <number>1</number>
-                  </property>
-                  <property name="minimum">
-                   <double>-500.000000000000000</double>
-                  </property>
-                  <property name="maximum">
-                   <double>1000000.000000000000000</double>
-                  </property>
-                  <property name="singleStep">
-                   <double>5.000000000000000</double>
-                  </property>
-                  <property name="value">
-                   <double>50.000000000000000</double>
-                  </property>
-                 </widget>
-                </item>
-                <item row="3" column="0">
-                 <widget class="QLabel" name="label">
-                  <property name="text">
-                   <string>Clutter</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="3" column="1">
-                 <widget class="QComboBox" name="txClutterComboBox"/>
-                </item>
-               </layout>
-              </item>
-             </layout>
-            </widget>
-           </item>
-           <item>
-            <widget class="QGroupBox" name="groupBox">
-             <property name="title">
-              <string>Receiver</string>
-             </property>
-             <layout class="QGridLayout" name="gridLayout_3">
-              <item row="0" column="0">
-               <layout class="QFormLayout" name="formLayout_3">
-                <item row="0" column="0">
-                 <widget class="QLabel" name="label_7">
-                  <property name="text">
-                   <string>Longitude</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="0" column="1">
-                 <widget class="QDoubleSpinBox" name="rxLonDoubleSpinBox">
-                  <property name="suffix">
-                   <string> deg</string>
-                  </property>
-                  <property name="decimals">
-                   <number>5</number>
-                  </property>
-                  <property name="minimum">
-                   <double>-180.000000000000000</double>
-                  </property>
-                  <property name="maximum">
-                   <double>180.000000000000000</double>
-                  </property>
-                  <property name="singleStep">
-                   <double>0.050000000000000</double>
-                  </property>
-                  <property name="value">
-                   <double>6.883610000000000</double>
-                  </property>
-                 </widget>
-                </item>
-                <item row="1" column="0">
-                 <widget class="QLabel" name="label_15">
-                  <property name="text">
-                   <string>Latitude</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="1" column="1">
-                 <widget class="QDoubleSpinBox" name="rxLatDoubleSpinBox">
-                  <property name="suffix">
-                   <string> deg</string>
-                  </property>
-                  <property name="decimals">
-                   <number>5</number>
-                  </property>
-                  <property name="minimum">
-                   <double>-90.000000000000000</double>
-                  </property>
-                  <property name="maximum">
-                   <double>90.000000000000000</double>
-                  </property>
-                  <property name="singleStep">
-                   <double>0.050000000000000</double>
-                  </property>
-                  <property name="value">
-                   <double>50.524830000000001</double>
-                  </property>
-                 </widget>
-                </item>
-                <item row="2" column="0">
-                 <widget class="QLabel" name="label_8">
-                  <property name="text">
-                   <string>Height</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="2" column="1">
-                 <widget class="QDoubleSpinBox" name="rxHeightDoubleSpinBox">
-                  <property name="suffix">
-                   <string> m</string>
-                  </property>
-                  <property name="decimals">
-                   <number>1</number>
-                  </property>
-                  <property name="minimum">
-                   <double>-500.000000000000000</double>
-                  </property>
-                  <property name="maximum">
-                   <double>1000000.000000000000000</double>
-                  </property>
-                  <property name="singleStep">
-                   <double>5.000000000000000</double>
-                  </property>
-                  <property name="value">
-                   <double>10.000000000000000</double>
-                  </property>
-                 </widget>
-                </item>
-                <item row="3" column="0">
-                 <widget class="QLabel" name="label_2">
-                  <property name="text">
-                   <string>Clutter</string>
-                  </property>
-                 </widget>
-                </item>
-                <item row="3" column="1">
-                 <widget class="QComboBox" name="rxClutterComboBox"/>
-                </item>
-               </layout>
-              </item>
-              <item row="1" column="0">
-               <spacer name="verticalSpacer_2">
-                <property name="orientation">
-                 <enum>Qt::Vertical</enum>
-                </property>
-                <property name="sizeHint" stdset="0">
-                 <size>
-                  <width>20</width>
-                  <height>40</height>
-                 </size>
-                </property>
-               </spacer>
-              </item>
-             </layout>
-            </widget>
-           </item>
-          </layout>
-         </item>
-        </layout>
-       </widget>
-      </widget>
-     </item>
-    </layout>
-   </widget>
-  </widget>
-  <widget class="QDockWidget" name="pathpropDockWidget">
-   <property name="windowTitle">
-    <string>Path profile</string>
-   </property>
-   <attribute name="dockWidgetArea">
-    <number>1</number>
-   </attribute>
-   <widget class="QWidget" name="dockWidgetContents_2">
-    <layout class="QGridLayout" name="gridLayout_6">
-     <item row="0" column="0">
-      <widget class="QScrollArea" name="scrollArea_2">
-       <property name="widgetResizable">
-        <bool>true</bool>
-       </property>
-       <widget class="QWidget" name="scrollAreaWidgetContents_2">
-        <property name="geometry">
-         <rect>
-          <x>0</x>
-          <y>-22</y>
-          <width>222</width>
-          <height>132</height>
-         </rect>
-        </property>
-        <layout class="QGridLayout" name="gridLayout_7">
-         <item row="0" column="0">
-          <layout class="QVBoxLayout" name="verticalLayout_2">
-           <item>
-            <widget class="QComboBox" name="pathprofPlotChooserComboBox"/>
-           </item>
-           <item>
-            <widget class="QCheckBox" name="pathprofIncludeHeightCheckBox">
-             <property name="text">
-              <string>Include height profile</string>
-             </property>
-             <property name="checked">
-              <bool>true</bool>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <widget class="QCheckBox" name="pathprofAutoUpdateCheckBox">
-             <property name="text">
-              <string>Auto update</string>
-             </property>
-            </widget>
-           </item>
-           <item>
-            <layout class="QHBoxLayout" name="horizontalLayout_3">
-             <item>
-              <widget class="QPushButton" name="pathprofComputePushButton">
-               <property name="sizePolicy">
-                <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-                 <horstretch>0</horstretch>
-                 <verstretch>0</verstretch>
-                </sizepolicy>
-               </property>
-               <property name="text">
-                <string>Compute</string>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QLabel" name="pathprofBusyIndicatorLabel">
-               <property name="styleSheet">
-                <string notr="true">QLabel {
-	color : red;
-}</string>
-               </property>
-               <property name="text">
-                <string>Busy</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item>
-            <spacer name="verticalSpacer_3">
-             <property name="orientation">
-              <enum>Qt::Vertical</enum>
-             </property>
-             <property name="sizeHint" stdset="0">
-              <size>
-               <width>20</width>
-               <height>40</height>
-              </size>
-             </property>
-            </spacer>
-           </item>
-          </layout>
-         </item>
-        </layout>
-       </widget>
-      </widget>
-     </item>
-    </layout>
-   </widget>
-  </widget>
-  <widget class="QDockWidget" name="mappingDockWidget">
-   <property name="windowTitle">
-    <string>Mapping</string>
-   </property>
-   <attribute name="dockWidgetArea">
-    <number>1</number>
-   </attribute>
-   <widget class="QWidget" name="dockWidgetContents_3">
-    <layout class="QGridLayout" name="gridLayout_11">
-     <item row="0" column="0">
-      <widget class="QScrollArea" name="scrollArea_3">
-       <property name="widgetResizable">
-        <bool>true</bool>
-       </property>
-       <widget class="QWidget" name="scrollAreaWidgetContents_3">
-        <property name="geometry">
-         <rect>
-          <x>0</x>
-          <y>-81</y>
-          <width>222</width>
-          <height>163</height>
-         </rect>
-        </property>
-        <layout class="QGridLayout" name="gridLayout_12">
-         <item row="0" column="0">
-          <layout class="QVBoxLayout" name="verticalLayout_3">
-           <item>
-            <layout class="QFormLayout" name="formLayout">
-             <item row="0" column="0">
-              <widget class="QLabel" name="label_9">
-               <property name="text">
-                <string>Size longitude</string>
-               </property>
-              </widget>
-             </item>
-             <item row="1" column="0">
-              <widget class="QLabel" name="label_17">
-               <property name="text">
-                <string>Size latitude</string>
-               </property>
-              </widget>
-             </item>
-             <item row="0" column="1">
-              <widget class="QDoubleSpinBox" name="mapSizeLonDoubleSpinBox">
-               <property name="suffix">
-                <string> deg</string>
-               </property>
-               <property name="decimals">
-                <number>3</number>
-               </property>
-               <property name="minimum">
-                <double>0.050000000000000</double>
-               </property>
-               <property name="maximum">
-                <double>5.000000000000000</double>
-               </property>
-               <property name="singleStep">
-                <double>0.050000000000000</double>
-               </property>
-               <property name="value">
-                <double>0.200000000000000</double>
-               </property>
-              </widget>
-             </item>
-             <item row="1" column="1">
-              <widget class="QDoubleSpinBox" name="mapSizeLatDoubleSpinBox">
-               <property name="suffix">
-                <string> deg</string>
-               </property>
-               <property name="decimals">
-                <number>3</number>
-               </property>
-               <property name="minimum">
-                <double>0.050000000000000</double>
-               </property>
-               <property name="maximum">
-                <double>5.000000000000000</double>
-               </property>
-               <property name="singleStep">
-                <double>0.050000000000000</double>
-               </property>
-               <property name="value">
-                <double>0.200000000000000</double>
-               </property>
-              </widget>
-             </item>
-             <item row="2" column="0">
-              <widget class="QLabel" name="label_18">
-               <property name="text">
-                <string>Resolution</string>
-               </property>
-              </widget>
-             </item>
-             <item row="2" column="1">
-              <widget class="QDoubleSpinBox" name="mapResolutionDoubleSpinBox">
-               <property name="suffix">
-                <string> arcsec</string>
-               </property>
-               <property name="decimals">
-                <number>1</number>
-               </property>
-               <property name="minimum">
-                <double>1.000000000000000</double>
-               </property>
-               <property name="maximum">
-                <double>300.000000000000000</double>
-               </property>
-               <property name="value">
-                <double>3.000000000000000</double>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item>
-            <widget class="QComboBox" name="mapPlotChooserComboBox"/>
-           </item>
-           <item>
-            <layout class="QHBoxLayout" name="horizontalLayout_4">
-             <item>
-              <widget class="QPushButton" name="mapComputePushButton">
-               <property name="sizePolicy">
-                <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-                 <horstretch>0</horstretch>
-                 <verstretch>0</verstretch>
-                </sizepolicy>
-               </property>
-               <property name="text">
-                <string>Compute</string>
-               </property>
-              </widget>
-             </item>
-             <item>
-              <widget class="QLabel" name="mapBusyIndicatorLabel">
-               <property name="styleSheet">
-                <string notr="true">QLabel {
-	color : red;
-}</string>
-               </property>
-               <property name="text">
-                <string>Busy</string>
-               </property>
-              </widget>
-             </item>
-            </layout>
-           </item>
-           <item>
-            <spacer name="verticalSpacer_4">
-             <property name="orientation">
-              <enum>Qt::Vertical</enum>
-             </property>
-             <property name="sizeHint" stdset="0">
-              <size>
-               <width>20</width>
-               <height>40</height>
-              </size>
-             </property>
-            </spacer>
-           </item>
-          </layout>
-         </item>
-        </layout>
-       </widget>
-      </widget>
-     </item>
-    </layout>
-   </widget>
-  </widget>
-  <widget class="QDockWidget" name="optionsDockWidget">
-   <property name="windowTitle">
-    <string>Options</string>
-   </property>
-   <attribute name="dockWidgetArea">
-    <number>1</number>
-   </attribute>
-   <widget class="QWidget" name="dockWidgetContents_4">
-    <layout class="QGridLayout" name="gridLayout_14">
-     <item row="0" column="0">
-      <widget class="QScrollArea" name="scrollArea_4">
-       <property name="widgetResizable">
-        <bool>true</bool>
-       </property>
-       <widget class="QWidget" name="scrollAreaWidgetContents_4">
-        <property name="geometry">
-         <rect>
-          <x>0</x>
-          <y>0</y>
-          <width>238</width>
-          <height>205</height>
-         </rect>
-        </property>
-        <layout class="QGridLayout" name="gridLayout_15">
-         <item row="0" column="0">
-          <widget class="QGroupBox" name="groupBox_4">
-           <property name="title">
-            <string>SRTM configuration</string>
-           </property>
-           <layout class="QGridLayout" name="gridLayout_16">
-            <item row="0" column="0">
-             <layout class="QVBoxLayout" name="verticalLayout_5">
-              <item>
-               <widget class="QLabel" name="label_19">
-                <property name="text">
-                 <string>Tile path:</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <widget class="QPushButton" name="srtmPathPushButton">
-                <property name="sizePolicy">
-                 <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-                  <horstretch>0</horstretch>
-                  <verstretch>0</verstretch>
-                 </sizepolicy>
-                </property>
-                <property name="text">
-                 <string>PushButton</string>
-                </property>
-               </widget>
-              </item>
-              <item>
-               <layout class="QHBoxLayout" name="horizontalLayout_2">
-                <item>
-                 <widget class="QLabel" name="label_21">
-                  <property name="text">
-                   <string>Download</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QComboBox" name="srtmDownloadComboBox">
-                  <property name="sizePolicy">
-                   <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-                    <horstretch>0</horstretch>
-                    <verstretch>0</verstretch>
-                   </sizepolicy>
-                  </property>
-                  <item>
-                   <property name="text">
-                    <string>Never</string>
-                   </property>
-                  </item>
-                  <item>
-                   <property name="text">
-                    <string>Missing</string>
-                   </property>
-                  </item>
-                  <item>
-                   <property name="text">
-                    <string>Always</string>
-                   </property>
-                  </item>
-                 </widget>
-                </item>
-               </layout>
-              </item>
-              <item>
-               <layout class="QHBoxLayout" name="horizontalLayout">
-                <item>
-                 <widget class="QLabel" name="label_20">
-                  <property name="text">
-                   <string>Server</string>
-                  </property>
-                 </widget>
-                </item>
-                <item>
-                 <widget class="QComboBox" name="srtmServerComboBox">
-                  <property name="sizePolicy">
-                   <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
-                    <horstretch>0</horstretch>
-                    <verstretch>0</verstretch>
-                   </sizepolicy>
-                  </property>
-                  <property name="currentIndex">
-                   <number>2</number>
-                  </property>
-                  <item>
-                   <property name="text">
-                    <string>NASA v1.0</string>
-                   </property>
-                  </item>
-                  <item>
-                   <property name="text">
-                    <string>NASA v2.1</string>
-                   </property>
-                  </item>
-                  <item>
-                   <property name="text">
-                    <string>Viewfinder panoramas</string>
-                   </property>
-                  </item>
-                 </widget>
-                </item>
-               </layout>
-              </item>
-              <item>
-               <spacer name="verticalSpacer">
-                <property name="orientation">
-                 <enum>Qt::Vertical</enum>
-                </property>
-                <property name="sizeHint" stdset="0">
-                 <size>
-                  <width>20</width>
-                  <height>40</height>
-                 </size>
-                </property>
-               </spacer>
-              </item>
-             </layout>
-            </item>
-           </layout>
-          </widget>
-         </item>
-        </layout>
-       </widget>
-      </widget>
-     </item>
-    </layout>
-   </widget>
-  </widget>
-  <action name="actionQuit">
-   <property name="text">
-    <string>Quit</string>
-   </property>
-  </action>
- </widget>
- <resources>
-  <include location="resources.qrc"/>
- </resources>
- <connections>
-  <connection>
-   <sender>actionQuit</sender>
-   <signal>triggered()</signal>
-   <receiver>MainWindow</receiver>
-   <slot>close()</slot>
-   <hints>
-    <hint type="sourcelabel">
-     <x>-1</x>
-     <y>-1</y>
-    </hint>
-    <hint type="destinationlabel">
-     <x>548</x>
-     <y>466</y>
-    </hint>
-   </hints>
-  </connection>
- </connections>
-</ui>
diff --git a/pycraf/gui/resources/resources.qrc b/pycraf/gui/resources/resources.qrc
deleted file mode 100644
index 0d9484213..000000000
--- a/pycraf/gui/resources/resources.qrc
+++ /dev/null
@@ -1,8 +0,0 @@
-<RCC>
-  <qresource prefix="/forms">
-    <file>main_form.ui</file>
-  </qresource>
-  <qresource prefix="gifs">
-    <file>busy_indicator.gif</file>
-  </qresource>
-</RCC>
diff --git a/pycraf/gui/resources/resources_rc.py b/pycraf/gui/resources/resources_rc.py
deleted file mode 100644
index bfc4702df..000000000
--- a/pycraf/gui/resources/resources_rc.py
+++ /dev/null
@@ -1,295 +0,0 @@
-# -*- coding: utf-8 -*-
-
-# Resource object code
-#
-# Created by: The Resource Compiler for PyQt5 (Qt v5.6.2)
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt5 import QtCore
-
-qt_resource_data = b"\
-\x00\x00\x02\xa1\
-\x47\
-\x49\x46\x38\x39\x61\x10\x00\x10\x00\xf2\x00\x00\xff\xff\xff\x00\
-\x00\x00\xc2\xc2\xc2\x42\x42\x42\x00\x00\x00\x62\x62\x62\x82\x82\
-\x82\x92\x92\x92\x21\xff\x0b\x4e\x45\x54\x53\x43\x41\x50\x45\x32\
-\x2e\x30\x03\x01\x00\x00\x00\x21\xfe\x1a\x43\x72\x65\x61\x74\x65\
-\x64\x20\x77\x69\x74\x68\x20\x61\x6a\x61\x78\x6c\x6f\x61\x64\x2e\
-\x69\x6e\x66\x6f\x00\x21\xf9\x04\x09\x0a\x00\x00\x00\x2c\x00\x00\
-\x00\x00\x10\x00\x10\x00\x00\x03\x33\x08\xba\xdc\xfe\x30\xca\x49\
-\x6b\x13\x63\x08\x3a\x08\x19\x9c\x07\x4e\x98\x66\x09\x45\xb1\x31\
-\xc2\xba\x14\x99\xc1\xb6\x2e\x60\xc4\xc2\x71\xd0\x2d\x5b\x18\x39\
-\xdd\xa6\x07\x39\x18\x0c\x07\x4a\x6b\xe7\x48\x00\x00\x21\xf9\x04\
-\x09\x0a\x00\x00\x00\x2c\x00\x00\x00\x00\x10\x00\x10\x00\x00\x03\
-\x34\x08\xba\xdc\xfe\x4e\x8c\x21\x20\x1b\x84\x0c\xbb\xb0\xe6\x8a\
-\x44\x71\x42\x51\x54\x60\x31\x19\x20\x60\x4c\x45\x5b\x1a\xa8\x7c\
-\x1c\xb5\x75\xdf\xed\x61\x18\x07\x80\x20\xd7\x18\xe2\x86\x43\x19\
-\xb2\x25\x24\x2a\x12\x00\x21\xf9\x04\x09\x0a\x00\x00\x00\x2c\x00\
-\x00\x00\x00\x10\x00\x10\x00\x00\x03\x36\x08\xba\x32\x23\x2b\xca\
-\x41\xc8\x90\xcc\x94\x56\x2f\x06\x85\x63\x1c\x0e\xf4\x19\x4e\xf1\
-\x49\x42\x61\x98\xab\x70\x1c\xf0\x0a\xcc\xb3\xbd\x1c\xc6\xa8\x2b\
-\x02\x59\xed\x17\xfc\x01\x83\xc3\x0f\x32\xa9\x64\x1a\x9f\xbf\x04\
-\x00\x21\xf9\x04\x09\x0a\x00\x00\x00\x2c\x00\x00\x00\x00\x10\x00\
-\x10\x00\x00\x03\x33\x08\xba\x62\x25\x2b\xca\x32\x86\x91\xec\x9c\
-\x56\x5f\x85\x8b\xa6\x09\x85\x21\x0c\x04\x31\x44\x87\x61\x1c\x11\
-\xaa\x46\x82\xb0\xd1\x1f\x03\x62\x52\x5d\xf3\x3d\x1f\x30\x38\x2c\
-\x1a\x8f\xc8\xa4\x72\x39\x4c\x00\x00\x21\xf9\x04\x09\x0a\x00\x00\
-\x00\x2c\x00\x00\x00\x00\x10\x00\x10\x00\x00\x03\x32\x08\xba\x72\
-\x27\x2b\x4a\xe7\x64\x14\xf0\x18\xf3\x4c\x81\x0c\x26\x76\xc3\x60\
-\x5c\x62\x54\x94\x85\x84\xb9\x1e\x68\x59\x42\x29\xcf\xca\x40\x10\
-\x03\x1e\xe9\x3c\x1f\xc3\x26\x2c\x1a\x8f\xc8\xa4\x52\x92\x00\x00\
-\x21\xf9\x04\x09\x0a\x00\x00\x00\x2c\x00\x00\x00\x00\x10\x00\x10\
-\x00\x00\x03\x33\x08\xba\x20\xc2\x90\x39\x17\xe3\x74\xe7\xbc\xda\
-\x9e\x30\x19\xc7\x1c\xe0\x21\x2e\x42\xb6\x9d\xca\x57\xac\xa2\x31\
-\x0c\x06\x0b\x14\x73\x61\xbb\xb0\x35\xf7\x95\x01\x81\x30\xb0\x09\
-\x89\xbb\x9f\x6d\x29\x4a\x00\x00\x21\xf9\x04\x09\x0a\x00\x00\x00\
-\x2c\x00\x00\x00\x00\x10\x00\x10\x00\x00\x03\x32\x08\xba\xdc\xfe\
-\xf0\x09\x11\xd9\x9c\x55\x5d\x9a\x01\xee\xda\x71\x70\x95\x60\x88\
-\xdd\x61\x9c\xdd\x34\x96\x85\x41\x46\xc5\x30\x14\x90\x60\x9b\xb6\
-\x01\x0d\x04\xc2\x40\x10\x9b\x31\x80\xc2\xd6\xce\x91\x00\x00\x21\
-\xf9\x04\x09\x0a\x00\x00\x00\x2c\x00\x00\x00\x00\x10\x00\x10\x00\
-\x00\x03\x32\x08\xba\xdc\xfe\x30\xca\x49\xab\x65\x42\xd4\x9c\x29\
-\xd7\x1e\x08\x08\xc3\x20\x8e\xc7\x71\x0e\x04\x31\x30\xa9\xca\xb0\
-\xae\x50\x18\xc2\x61\x18\x07\x56\xda\xa5\x02\x20\x75\x62\x18\x82\
-\x9e\x5b\x11\x90\x00\x00\x3b\x00\x00\x00\x00\x00\x00\x00\x00\x00\
-\
-\x00\x00\x0c\x71\
-\x00\
-\x00\x8d\x62\x78\x9c\xed\x5d\x5b\x73\xdb\xba\x11\x7e\x6e\x7e\x05\
-\x47\x33\x9d\x69\x1f\x62\x8a\xba\xf8\x92\xd2\x3a\xe3\xe4\xd4\x49\
-\xa6\xf1\xa9\x13\x3b\xc9\x63\x86\x26\x61\x09\x13\x8a\xe0\x01\x41\
-\x5b\x4a\xdb\xff\x5e\xf0\x7e\x01\x48\x82\x14\xa8\x8b\x47\x7e\xb1\
-\x88\xeb\x62\x81\xfd\xb0\xbb\x00\x97\xfa\x6f\xab\xa5\xad\x3c\x01\
-\xec\x41\xe4\x5c\x0e\xb4\x93\xe1\x40\x01\x8e\x89\x2c\xe8\xcc\x2f\
-\x07\x5f\xef\xaf\x5f\x9f\x0f\x7e\x9b\xbd\xd2\x7d\x98\x15\x9a\xd0\
-\x42\xb3\x57\x8a\x6e\xda\x86\xe7\xcd\x6e\x0c\xe8\x7c\x87\x8e\x85\
-\x9e\x75\x35\x4a\xa1\x59\xcf\xd0\x9a\x03\xa2\x84\xcf\x97\x83\xcf\
-\x59\x99\x81\xe2\x18\x4b\x70\x39\xc8\xa5\xd0\xf2\x8a\xee\x62\xe4\
-\x02\x4c\xd6\x71\xf6\x1c\xa0\x25\x20\x78\x1d\x66\x2a\x3a\x06\x26\
-\x09\x7f\x29\xfa\x6a\x36\xd4\xd5\x55\xfc\xb0\x0e\x1e\xd6\xf1\x03\
-\xed\x93\x2c\x66\xda\xf0\xe2\x5c\x57\xa3\xdf\x51\xfa\x02\xc0\xf9\
-\x82\xcc\x2e\xc6\x13\x5d\x8d\x7f\x87\x8d\xaa\x49\xab\xba\x9a\xf4\
-\xce\x23\xe5\x39\xa4\xf2\x1e\x12\x1b\xc4\xd4\x78\x04\x53\xee\xcc\
-\xdc\xb5\x89\x8d\x47\xe5\xfd\xd7\x8f\xba\x1a\x27\xb1\x8d\x95\x18\
-\xf1\x3d\x7c\x4c\x98\x60\x02\x87\x60\xc3\x8e\xca\xc4\x8d\xdb\xc6\
-\x1a\xf9\x59\x85\xf7\x18\x5a\x9f\xc2\xa4\xa4\xd2\x3c\x4d\xf9\x71\
-\x3e\x88\x87\x08\x09\x58\x2a\x18\x3d\x5f\x0e\xe8\xf4\x99\xc8\xf6\
-\x97\x4e\xf0\x33\xca\x65\x88\xb8\x37\x1e\x8a\x74\x90\x34\x21\xae\
-\xc1\x30\xc1\xf4\x31\xa6\xc4\x7e\x74\x2c\xb0\x4a\x0b\x29\xba\xe3\
-\x2f\x1f\x00\x0e\x26\x21\xfe\x95\x54\x2f\x30\x81\x47\x43\x91\x80\
-\x64\xba\x29\x65\xb9\xd6\x0d\x42\xb9\xfa\xe0\x13\x90\x90\x99\xcd\
-\x41\x54\x20\xe6\xfa\xfb\xb8\x76\x7e\x1a\x62\x32\xd2\x26\xb2\xb4\
-\x36\x0c\xd6\xc6\xf9\xee\xea\xb9\xcc\x6b\xfc\xdb\x5b\xb4\x2a\x35\
-\x1e\xd3\xfa\x8d\x32\x07\x9a\x86\x1d\xe7\xe6\xda\x88\xfa\xc9\x27\
-\x30\xcc\xfb\x64\x3c\x00\x3b\x69\xd1\x75\xbf\x40\x73\x71\x0f\x56\
-\x24\x4a\x2e\xd4\x64\x26\xd2\x83\xbf\xc0\x2d\xb2\xa1\xb9\x2e\x15\
-\xa4\xdc\xa4\x59\x6e\x98\xa5\x2c\x82\xdf\x64\xed\xd2\x0a\xb7\x18\
-\x3c\x02\x3a\xf9\xd6\x40\x79\xca\x52\x6f\x8c\x15\x5c\xfa\xcb\x72\
-\x1b\x54\xd8\x10\xa6\x93\x00\x88\xb9\x08\x56\x45\xee\xa9\x5c\x30\
-\x40\x93\xac\x60\xee\xa9\x44\x95\x9a\x91\x55\x1a\x19\xb3\xc6\xf8\
-\x23\x26\x94\x33\xec\x58\xc3\x85\xa2\x76\x6f\xf1\x1a\xe1\xa5\xc1\
-\xb6\x0b\xa8\x1c\xcc\x3e\x93\x37\x6f\x92\x39\xd1\xd5\x30\xa9\x73\
-\x3f\x1f\x1d\x02\xb0\x61\x12\x0a\xbc\xd7\xb6\x31\xf7\xd8\x91\x00\
-\x12\x76\xf8\x09\x3a\x3f\xbd\x2b\xd3\x04\x9e\x07\x1f\x6c\xf0\x76\
-\x7d\x83\x7c\x0f\xfc\x37\xc8\x0a\xe8\xb8\x03\x36\x45\x3b\x23\xcb\
-\xa1\x8c\x05\x44\x88\xae\x10\x4d\xe7\xc5\xc2\xba\x5a\x5e\xa4\x9c\
-\x55\xdb\x28\x0c\x4f\x05\x21\xf8\x31\x19\xa8\xb5\x7d\xe8\x6a\xd4\
-\x62\x4e\x24\x8b\x45\xca\x05\xca\x94\xd7\x83\x90\x47\x0c\x02\x3d\
-\x4a\x90\xd7\x0d\x86\xee\xd2\xfa\x3d\x00\xd1\x99\x6c\x20\xca\x46\
-\x5b\x82\x22\xb5\x27\xf6\xba\x06\x59\xd0\xf5\xf5\x08\x6d\xd0\x8d\
-\xbf\xb7\xb4\x01\x25\x6e\x41\x3e\x87\x2f\x64\x33\x38\x19\xef\x96\
-\xd8\xbb\x34\xdc\x6e\x6c\xbd\x31\xdc\x1e\xd6\xeb\x50\x36\x3b\xe9\
-\xf8\x64\x71\xb2\xf8\x98\xab\x9b\xaf\x97\x2f\xc4\xa8\xb3\x14\xd3\
-\xdf\x1a\x38\x25\x8d\x3e\x3e\xd0\xc7\xa8\x8d\x5a\x4d\x36\xaf\xca\
-\x16\x75\xd9\xa2\x32\x5b\xa9\xcd\xa6\xea\xec\x68\x58\xd0\x66\x73\
-\xea\x6c\x19\xc7\x79\xd4\xe7\x49\xbf\x86\xe9\xba\x60\x76\xa0\xfc\
-\x9a\x49\x16\xcc\x35\x23\x7f\xe5\x8d\x43\x37\x2c\x2b\xda\xb3\xe2\
-\x76\xa2\x87\xcf\x3e\x4c\x66\xad\x30\x05\x4c\xf1\x94\x2a\xb5\x69\
-\x26\x02\xcc\xf5\xbd\xdc\x5c\x78\x61\x42\x30\x1b\x2a\xaf\xfc\xef\
-\xc8\xfc\x59\x86\x25\x4c\xff\xd3\x4d\xd6\xcb\xe5\x71\x67\x92\x31\
-\x04\x72\x0a\xa8\x43\x37\x69\x5b\xc9\xda\x2a\xf0\xa7\x3c\x1f\x65\
-\xc9\xb4\xd2\x8e\xaf\x30\x30\x92\xb6\x63\x8d\x5a\x2b\xe8\xd6\x65\
-\xc1\xac\xc7\x84\xac\xe1\x77\x88\xea\x11\x0e\x49\xd4\x87\x36\xb2\
-\x9c\x4e\x3f\x57\x8a\xb5\xcc\x64\x28\x4f\x8d\x89\x91\x6d\x87\x23\
-\x4a\xe6\x26\x4b\xc9\x44\x95\x61\x72\xd0\xc8\x17\x40\xb5\xbe\x40\
-\x59\xc9\xa3\xc8\x03\x42\xf6\x8c\x60\x9f\x2e\xbe\xf0\x67\x26\xed\
-\x8c\xda\xd2\xb0\xd1\xa7\x74\x70\x99\xc3\x23\xab\x24\xc5\x4a\x59\
-\x94\x39\xf2\x9c\x08\xf5\x6b\xed\x42\xcb\xe4\x3a\x2f\xdc\xa3\x71\
-\x49\xb6\x0b\x02\x3e\x9d\x8c\x8a\x12\xae\x94\xc4\xbc\x6a\xf0\xed\
-\x90\x7a\x5a\x18\x52\x33\x52\xb7\x56\xeb\x8a\x1a\x2b\xab\x26\x32\
-\x93\xf5\x1e\x23\xdf\xa5\x8d\x66\xc4\x46\xcf\x3f\xc6\x8c\xf2\x5b\
-\x07\x57\x59\xa9\x58\x14\xe9\x34\x5b\x30\x40\x19\x56\x3f\xab\xe6\
-\x65\x7b\x86\x4e\x58\x02\x04\xb8\xca\xed\x27\x30\x32\x8a\xfd\x3c\
-\xa6\x29\x9c\x7e\x5a\xf4\xd4\x60\x53\xda\xc1\x43\x71\x13\xaf\xe1\
-\x3a\xc7\xc0\x2a\x72\xfe\x1a\x83\x3f\x7d\xe0\x98\xac\x85\x2e\xc2\
-\xfd\x28\x93\xb5\x41\x92\x1c\x76\x45\x55\xb3\x42\x13\x61\xc5\xef\
-\xc8\xa7\xd0\x73\xe7\x42\x27\xb7\x0a\x1f\xe9\x18\x8a\x19\x22\xbc\
-\xf1\xfc\xc7\x47\xc8\x2f\x9a\x72\x47\x79\xff\xe1\x57\x67\xc6\x30\
-\x3d\x5a\xc0\x84\x4b\xc3\x66\x0c\xc5\xb8\x74\xbc\x97\x8c\xcb\x1e\
-\x9b\xee\x1d\x2e\xa1\xc3\x75\x05\x44\x85\xad\x90\x65\xb3\xe1\x89\
-\x36\x2c\xfc\xe9\x6a\x9c\xb3\x79\xff\x15\xae\x88\x42\xff\xb4\xf7\
-\x93\x61\x5f\x14\x78\x74\xe2\xe8\xb2\x20\xc0\xdd\x19\x13\x9e\x0c\
-\xdb\x67\x91\xaf\xc8\x02\x69\x0c\xd8\x48\x18\xc7\x12\x70\x89\x2b\
-\xc5\x1d\x70\xe9\x1e\x2e\x81\x42\xab\x04\x7e\xd8\xdd\x40\xd3\x58\
-\x06\x34\x11\x3a\x8c\x78\x14\x3d\x21\xd4\x5f\x5f\x3e\x3e\x0d\x87\
-\x5a\x3f\xa2\x29\x84\x4f\xd3\x1e\xe1\x49\x00\x1b\x46\xfb\x81\x0d\
-\x13\x09\xd8\x30\x92\x84\x0d\x01\x9c\x2b\x81\xef\x79\x37\xc0\x30\
-\x91\x01\x0c\x1e\x1d\x43\x30\x84\x9e\x50\x61\xb9\x6d\x54\xd0\xb6\
-\x8c\x0a\x5a\x8f\x52\x29\xaa\xb6\xec\x83\xe2\x22\x4f\x75\xe8\xa4\
-\xb8\xc8\xe3\xc0\x46\x22\xa9\x6d\x8e\x4e\x3c\x9b\xad\x93\xe2\x02\
-\x96\xb4\x82\x41\x7c\xbc\x23\x78\xd2\xa4\xe8\x2d\x74\x14\x3d\x41\
-\xd3\xbf\xe4\x41\x93\x10\x52\x8c\xfa\x14\x53\x21\xa8\x18\xef\x5a\
-\x85\xb8\x18\x9f\x68\x93\x8b\xec\xef\xec\x6c\x37\x62\x3a\x92\xa0\
-\x44\x30\x9e\x26\x2e\x57\x9a\xe5\xf4\x16\x03\xcf\xdb\x99\x90\x8e\
-\x64\x08\xa9\x1b\x0c\xa1\x27\x29\x5d\xdc\x1a\x47\x15\x62\x03\x02\
-\x84\x54\x88\x69\x9f\xd0\x24\x00\x0c\x17\xe7\x7b\xb2\x7f\x9f\x4a\
-\x00\x86\x53\x49\xc0\xf0\x2d\xba\x4b\xb7\x1b\x5c\x38\x6d\x89\x0b\
-\xef\xd0\xf2\x01\xe5\x20\x21\xbe\x08\x98\x26\x8b\xb0\x04\x38\xc1\
-\x71\x8e\x55\xc1\x95\xf0\x3c\xe7\x91\x0a\x6f\xf9\x6c\x47\x94\x1f\
-\x82\x17\xd6\x0a\x35\x24\x20\x02\x9f\xd5\x1c\x72\xaa\x57\x44\xba\
-\x24\xb4\x49\xdd\x6a\x68\xa2\xa4\x62\xd6\x65\xd3\x78\x7a\x00\x34\
-\x9e\xf5\x41\xe3\x46\x02\x37\xdd\x1c\x79\x64\x01\xcf\x2d\xb2\x0d\
-\x0c\x7f\x19\x64\x67\xe8\x33\xdd\x10\x7d\xdc\xdc\x08\xea\x21\x48\
-\xe6\xaa\xfa\x80\x68\x9f\xc8\x21\x86\xbd\xff\x12\x90\xdc\x93\xd9\
-\x0b\x39\x60\x2f\xed\xd5\x14\xe7\x17\xe6\xf6\xc9\xa9\xbf\xc9\xd9\
-\x32\xe3\x36\x6c\x77\xb6\x7c\x8f\x0d\xc7\x5b\x42\x42\x00\xee\xf5\
-\x70\x99\xf5\x6e\xf6\x73\xb8\xcc\xf3\xa2\xca\x3d\x5c\x96\x65\x62\
-\x7d\x42\xce\x1c\x12\xdf\xda\x91\x8d\x25\xe5\x6c\x99\xac\xe8\x28\
-\x7a\xb2\xb1\x2c\x30\xdf\xb6\x8d\x35\xdd\xb2\x8d\xf5\x5a\x93\x68\
-\x62\x74\xb4\xb2\xfa\xa4\x40\xfc\x7c\x79\x38\xdd\x9d\x9d\x77\x7a\
-\x32\xda\x07\x2b\x4f\x82\x97\x56\x93\xe5\xa6\xfd\x44\x95\x94\xdd\
-\x41\x93\x1c\x1f\xed\x8a\x0e\xe2\x08\x4d\x9c\x0e\xc5\xa0\xe9\x62\
-\xd7\xc8\xd4\x27\x01\x87\x01\x4c\xd3\xe1\xc9\xd9\x45\xfe\xef\x70\
-\x1d\xd3\x53\x49\xc0\xf4\x21\xbc\x56\x7a\xc0\x5e\x69\xb2\x8a\x86\
-\x70\x3c\xd9\xee\x88\x4b\xbd\x7a\x85\xc5\xcf\xb6\xf7\xe1\x74\x7b\
-\xba\x53\xf7\xb8\xc4\x63\xbb\x1d\xdf\xcb\x93\x84\x4d\xef\x6c\xbf\
-\xc6\x8c\xde\x1e\x17\x3a\x39\xa7\xc8\x2a\x26\x3f\xcd\x50\x85\xe9\
-\x38\x0c\x4f\xc9\x66\x7e\x92\x2f\xc0\x04\xf0\xa9\x67\x27\x09\xeb\
-\x5a\xe8\xc7\x49\xc2\x73\x61\xc8\x75\x92\x9c\xc9\x32\x44\x5e\x80\
-\x93\x04\x1f\x9d\x24\x15\x1d\x1e\x9d\x24\x07\x63\x8b\x9c\x9e\x9c\
-\x9f\x8f\x4f\x35\x09\xbd\xef\xdc\x49\x22\xcb\x16\x79\x01\x4e\x12\
-\x7c\x74\x92\x54\x74\x78\x74\x92\x1c\x08\x30\x51\x33\x64\x3a\x9a\
-\x9c\x8f\xd3\xde\xb5\x83\x75\x92\x9c\x4b\x02\xa6\x83\x77\x92\xe0\
-\xa3\x93\xa4\xaa\xc3\xa3\x93\xe4\xa0\x9c\x24\xfb\xf2\x0a\x80\x84\
-\x97\x17\x65\xbd\x9f\x74\xd0\x6e\x12\xbc\x2d\x37\x89\xb8\xd2\xab\
-\x7b\xae\x61\x02\x5c\x0a\x61\x70\x17\x26\xf2\xaf\x43\x94\xa6\x0c\
-\x61\x08\x1c\x12\x5e\x4b\xe2\xb2\x24\x0d\x0d\x96\x5d\xcf\x61\x43\
-\x83\x45\x03\xa9\x9e\x36\x5e\x38\xb7\x0f\xd0\x21\x03\xc5\x23\x96\
-\x07\x48\xd5\xba\x0c\xca\x71\x97\x48\x1c\x89\x62\xc8\x09\x44\x91\
-\x96\x89\x83\x50\x4c\x86\x9c\x78\x14\x19\xd1\xfc\x2e\x6a\x06\x43\
-\xab\x84\xdc\xed\xdf\xdf\xc5\xa9\x5c\x2e\xc4\x14\x61\xa2\x2f\x95\
-\x63\x08\x65\xf5\x0b\x75\x0b\xd1\x6a\x6a\x22\xd7\xf0\x22\xd1\x84\
-\x01\xa3\xdc\xee\x71\x68\x2a\x23\x64\xed\x51\x04\x9a\x54\x96\x5a\
-\xb9\xf4\xd2\xeb\x8f\x4d\xfe\xb5\x36\x51\x68\xf2\x62\xbd\x4f\x71\
-\x68\x0a\x70\x23\x33\x12\xcd\x68\x54\x11\x88\x26\xc8\xa8\x0c\x44\
-\xa3\x8d\xb7\x12\x88\xa6\xe0\xeb\xec\x23\x10\x4d\x19\xc5\x05\x9c\
-\xe0\xcc\xdd\xd3\x38\xa6\xdb\xad\x8d\xc8\xbb\x05\x42\x5e\xe5\x0e\
-\xd6\xcd\xe9\xfe\x6e\x01\xcc\x9f\x9c\xfe\x3e\x3a\xa6\xed\x5b\x20\
-\x52\xe7\xd3\x42\x65\x88\x14\xd1\x21\x12\xa8\x88\x5b\x54\xa2\x79\
-\xad\x0c\xab\x57\x3d\xb7\xdc\x2e\xcd\x80\x34\xce\x2d\xff\x4a\x99\
-\xa9\x6f\x5f\xe2\x71\x46\x15\x67\xaf\x7c\x82\xbe\xba\x96\x41\x80\
-\x14\xb6\x06\xcd\x29\x7e\xd8\x5e\x4b\x5e\x6e\x32\xd6\x92\x20\x7c\
-\x60\x04\x61\x91\xde\x5e\xae\x3a\xba\xe0\x5e\x40\x2e\x33\xf1\xd6\
-\xf7\x16\x6f\xa9\xde\x46\x35\x9c\x12\x1b\xa9\x14\xb8\x74\x47\xc8\
-\x15\x60\xb7\x7b\x8e\xea\xc2\x8f\x44\xab\x28\x55\xc1\x68\xff\xb9\
-\x72\x0d\x27\x08\x4d\x5d\x08\x46\x7b\x0d\x57\xfc\x37\x4b\x84\xa3\
-\xd1\x06\x65\x05\x03\xd2\x2a\x89\xae\xc3\x8b\x49\xab\xd4\x2b\x3c\
-\x62\x4a\x7e\x16\xaf\x2a\xe4\x69\xa5\x86\x5f\xdd\x53\x85\x6e\xcf\
-\x57\xac\x44\x26\xbe\x18\x70\x38\x9e\xf3\xb7\xbe\xb7\xfe\x48\x67\
-\xc3\x34\x08\xc2\xbc\xd8\xc3\x9c\x21\x7b\x64\x4d\xad\xcd\x05\x00\
-\x35\x03\x57\x1c\x44\x30\xe5\x0e\x0e\xac\xc2\xa8\x6b\xe5\x3f\xaf\
-\xfe\x42\x37\x01\x84\x95\x37\x0a\x06\xd6\x3f\x5e\xfd\xaf\x03\x57\
-\xda\xf2\x3f\x18\x5f\xbf\xcc\xe7\x2a\xb5\x82\x32\x5f\x67\xae\x34\
-\x06\x4a\xab\xb3\x55\x04\x0d\x15\xe1\x3d\x41\xc4\x44\xe1\xdb\x27\
-\x8d\xc6\x49\xb3\x65\xc2\x35\x4b\xaa\x21\x98\x63\x90\x1c\xaa\x35\
-\xb1\x34\x5c\x97\x2e\xdc\xee\xc6\xc4\x4d\xd4\xc0\xde\xda\x11\xe3\
-\x2e\x76\x44\x16\x3a\x4a\xaa\x21\x31\xde\x53\x43\x62\xdc\x93\x21\
-\x71\x5e\x15\xd1\xb2\xde\x90\x38\x1d\x6f\xc3\x90\x28\x86\x00\xea\
-\xc5\x92\x18\x37\x5b\x12\x2d\x2e\x92\x70\x75\x31\x81\x3b\x24\x02\
-\xde\xc6\x8b\xe6\x2d\xb9\x61\x17\xbc\xa3\xf8\xa9\xd8\x8d\xf7\x47\
-\x24\x2a\x23\x02\xde\x3a\x91\xf3\x69\xce\xdd\x99\x4e\x43\x6f\x3a\
-\x9e\x96\x3e\xf2\xda\xdb\x32\x42\x07\x3f\x14\xfb\x03\xda\x9b\xef\
-\xcb\x08\x9f\xfb\x08\x1d\x47\xb7\x50\xbd\x6a\x0e\x7c\x9a\x43\xc0\
-\xb5\xe8\xa7\xfa\x9c\xa7\xfd\xb1\x6b\x9b\x6e\x2b\xcf\x76\xda\x9f\
-\xa7\xb4\xe8\xb6\xf6\x30\xa7\xd7\x01\x57\x9d\xe1\x64\x9d\x8a\xbe\
-\x1c\xd4\x27\x90\x6c\x28\x4e\x8d\x77\x3c\x8e\xe2\x74\x14\xa7\x97\
-\x2e\x4e\xb5\x17\x34\x44\xf6\x65\xce\xf5\x8c\x96\xfb\x32\x55\xa6\
-\x29\x05\xb5\x11\x0c\xfa\x1c\x76\x77\x14\xc9\x08\x97\x0e\x24\x06\
-\x36\x3d\x60\x6e\x09\x4b\xaa\x2f\x62\x48\xc5\x12\xf1\xb0\x83\x52\
-\xb1\x64\xdc\xe2\xbe\x85\x44\x99\x1e\x4b\xe8\x74\x4b\xbe\xa7\x86\
-\x53\x12\xba\xd2\xa5\x1d\x90\xb4\x77\x6d\x33\x2f\xef\x76\x74\x6d\
-\xd3\x51\x1c\xbd\xda\x59\xe6\x4b\xf7\x6a\xd3\xe9\x3e\x3a\xb4\xf7\
-\xd5\xa1\xcd\xca\xf4\xd1\xa1\x2d\x40\xfa\x8b\x72\x68\x23\x37\xfc\
-\x76\x4b\x77\x87\xf6\xbf\x5d\xf6\xe3\x2f\xfb\xe4\xd0\x4e\x16\x79\
-\x3b\x67\x67\x2a\x1a\x52\x1d\xda\x39\x81\xdb\x2b\x87\x76\x1e\x08\
-\x24\x3a\xb4\x87\x5d\x3e\xd0\x34\x1a\x4e\xb7\xe2\xce\x6e\xff\x85\
-\x26\xd1\xa0\x57\x25\x58\x15\x79\x95\x33\xf5\x8d\x7e\xb9\xbf\xa1\
-\xdd\x3b\x8f\x70\xee\xe3\xea\x68\x72\x15\xc8\xd4\x8e\x01\xe5\xd8\
-\x77\x82\xfe\xf1\xd6\x5e\x7d\xf6\x8d\x26\x7e\x58\x36\x11\x2b\x97\
-\xe3\x78\x17\xbe\xe4\x9b\x7d\x9e\xc4\x06\x4a\x70\xda\xfe\xa6\xfa\
-\x96\x6f\xed\xfd\x4a\xfe\x0d\xdf\x9a\x8b\xb2\x8d\x43\x65\xd5\x64\
-\x0f\x93\x65\x70\xef\xb0\x4e\x49\x6e\xa7\x25\x4b\x52\x93\x5b\xe9\
-\xc9\x6d\x14\xe5\x7a\x4d\xb9\x6e\x46\x5a\xaf\x80\x8c\xa9\xbb\x5b\
-\x01\xed\x2d\xb0\xca\xe0\x71\xbc\x91\x0a\xdc\x98\x97\xf5\xb9\x9f\
-\xdf\xd1\xb3\x63\x23\xc3\xda\xf6\x9d\x79\x81\x61\x97\x4d\xe8\x40\
-\xaa\x12\x72\x5b\xc5\xd9\xad\x97\x2c\x69\xb2\xd5\x52\xba\xda\xc9\
-\x57\x93\x84\x35\xcc\x92\xdc\x60\x9a\x7f\x80\xea\x70\x05\x42\xc4\
-\x6c\x27\xe6\xe7\x0d\xf4\xbc\xf2\x6d\x8d\xbd\x24\xf4\xca\x7e\x36\
-\xd6\x55\x5f\x60\xdc\x88\xce\x7e\x43\x93\x4a\x83\x47\xc9\xe0\x28\
-\xeb\x1b\x8d\x77\x00\x37\x2c\xf4\x3d\x82\xc6\x88\xd8\x23\x30\x72\
-\xf2\xdb\xbc\x79\x27\x1e\x24\x7d\xb4\x27\x41\xd2\xff\xb8\xba\xbb\
-\x52\x9e\xb4\x93\xe1\xfe\x03\x5d\x44\xea\xe8\x44\xdb\x7f\x52\xbf\
-\x41\xf0\xfc\x08\xe9\x2a\xc0\xd4\xdc\x70\x10\x36\x96\xc6\x0b\x42\
-\xe8\x1a\xc7\xa2\x80\xa9\x72\x7c\xad\x6f\x17\xaf\xf5\xb1\x1e\x63\
-\x4e\x41\xce\x72\xda\xbe\xdf\xb2\xea\x3b\xf7\x51\xad\x6a\x59\x4c\
-\x64\x2f\x28\x5c\xe3\x92\xd4\xd5\xa8\x4d\xfa\x3b\xd7\xad\x8e\x81\
-\x87\x7c\x6c\x02\x2f\x2c\x03\xe3\x97\x79\x6c\x64\x86\x0b\xf5\x72\
-\x90\xe6\x9f\xfc\x89\xcd\xf0\xe4\x2d\xf0\x4b\x65\x75\x74\x13\x39\
-\x0e\x08\x5b\x8e\x9a\xc8\x9e\x23\x22\x3c\x10\xc0\xc1\x2c\x1b\x10\
-\xa5\x31\x4a\x8a\xb2\xe1\xdc\x31\x02\x5f\x1f\x9c\xcf\x01\x06\xd6\
-\xdf\xfe\x1e\xac\x94\x30\x2d\xcc\xc7\x71\x9c\xaf\xd9\x8d\x01\x9d\
-\xef\xa1\x4b\x36\x74\x8c\x45\x89\x51\x13\x36\x22\x33\xd3\x46\x1e\
-\x08\x2b\x07\x4f\x61\xfa\x82\xae\x7b\x2f\xe6\x51\xf0\x5b\x89\xb6\
-\xdc\x88\xf6\x42\xa0\x39\x7d\x35\x7b\xad\x65\xce\xbc\xf0\x5b\xeb\
-\xa9\x23\x8f\x2e\x6a\x5a\x99\x6d\xc7\x02\x1e\x81\x4e\xc8\xa6\x72\
-\x63\xd3\xc9\x79\xa1\xb5\xc9\xe9\x29\xaf\xb9\xe8\x67\xc4\x36\xb5\
-\xc0\xb7\xfc\x23\xcd\xd7\x55\x1f\xce\x5e\xfd\x1f\x54\xaf\x2f\x20\
-\
-"
-
-qt_resource_name = b"\
-\x00\x05\
-\x00\x6d\x69\x43\
-\x00\x66\
-\x00\x6f\x00\x72\x00\x6d\x00\x73\
-\x00\x04\
-\x00\x06\xdf\xd3\
-\x00\x67\
-\x00\x69\x00\x66\x00\x73\
-\x00\x12\
-\x01\x82\x03\xb6\
-\x00\x62\
-\x00\x75\x00\x73\x00\x79\x00\x5f\x00\x69\x00\x6e\x00\x64\x00\x69\x00\x63\x00\x61\x00\x74\x00\x6f\x00\x72\x00\x2e\x00\x67\x00\x69\
-\x00\x66\
-\x00\x0c\
-\x03\x19\x0d\x19\
-\x00\x6d\
-\x00\x61\x00\x69\x00\x6e\x00\x5f\x00\x66\x00\x6f\x00\x72\x00\x6d\x00\x2e\x00\x75\x00\x69\
-"
-
-qt_resource_struct = b"\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\
-\x00\x00\x00\x10\x00\x02\x00\x00\x00\x01\x00\x00\x00\x04\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x03\
-\x00\x00\x00\x48\x00\x01\x00\x00\x00\x01\x00\x00\x02\xa5\
-\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-"
-
-def qInitResources():
-    QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-def qCleanupResources():
-    QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-qInitResources()
diff --git a/pycraf/gui/workers.py b/pycraf/gui/workers.py
deleted file mode 100644
index cc67c1583..000000000
--- a/pycraf/gui/workers.py
+++ /dev/null
@@ -1,272 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-
-
-from PyQt5 import QtCore
-from functools import lru_cache
-import numpy as np
-from astropy import units as u
-from .. import pathprof
-# from .. import conversions as cnv
-
-
-__all__ = [
-    'GeometryWorker', 'StatisticsWorker', 'PathProfWorker', 'MapWorker'
-    ]
-
-
-# Note: pathprof.height_path_data is super fast usually, so this
-# is probably overkill
-@lru_cache(maxsize=10, typed=False)
-def cached_height_path_data(*args, **kwargs):
-    return pathprof.height_path_data(*args, **kwargs)
-
-
-@lru_cache(maxsize=10, typed=False)
-def cached_height_path_data_generic(*args, **kwargs):
-    # height_path_data_generic has no backbearings, etc.
-    res = pathprof.height_path_data(*args, **kwargs)
-    res['heights'][...] = 0
-    return res
-
-
-@lru_cache(maxsize=10, typed=False)
-def cached_height_map_data(*args, **kwargs):
-    return pathprof.height_map_data(*args, **kwargs)
-
-
-@lru_cache(maxsize=10, typed=False)
-def cached_heightprofile(*args, **kwargs):
-    return pathprof.srtm_height_profile(*args, **kwargs)
-
-
-class BaseWorker(QtCore.QObject):
-
-    result_ready = QtCore.pyqtSignal(object, object, name='result_ready')
-    job_started = QtCore.pyqtSignal(name='job_started')
-    job_finished = QtCore.pyqtSignal(name='job_finished')
-    job_excepted = QtCore.pyqtSignal(str, name='job_excepted')
-
-    def __init__(self, parent):
-
-        super().__init__()
-
-        self.parent = parent
-        self.job_waiting = False
-
-        self.event_loop()
-
-    @QtCore.pyqtSlot(dict)
-    def on_job_triggered(self, job_dict):
-
-        self.job_dict = job_dict.copy()
-        self.job_waiting = True
-
-    @QtCore.pyqtSlot()
-    def on_clear_caches_triggered(self):
-
-        cached_height_path_data.cache_clear()
-        cached_height_path_data_generic.cache_clear()
-        cached_height_map_data.cache_clear()
-        cached_heightprofile.cache_clear()
-
-    @QtCore.pyqtSlot()
-    def event_loop(self):
-
-        if self.job_waiting:
-            self.job_started.emit()
-            try:
-                self.do_job()
-            except Exception as e:
-                self.job_excepted.emit(e.args[0])
-            else:
-                self.job_finished.emit()
-
-        # setup one-time counter
-        self.timer = QtCore.QTimer()
-        self.timer.setSingleShot(True)
-        self.timer.timeout.connect(self.event_loop)
-        self.timer.start(50)
-
-    @QtCore.pyqtSlot()
-    def do_job(self):
-
-        raise NotImplementedError('Cannot use BaseWorker directly!')
-
-
-class GeometryWorker(BaseWorker):
-
-    @QtCore.pyqtSlot()
-    def do_job(self):
-
-        self.job_waiting = False
-        jdict = self.job_dict
-        print('doing job', jdict)
-        print(pathprof.SrtmConf)
-
-        hprof_data = cached_heightprofile(
-            jdict['tx_lon'] * u.deg, jdict['tx_lat'] * u.deg,
-            jdict['rx_lon'] * u.deg, jdict['rx_lat'] * u.deg,
-            jdict['stepsize'] * u.m,
-            )
-        (
-            lons, lats, distance, distances, heights,
-            bearing, back_bearing, back_bearings
-            ) = hprof_data
-
-        pp = pathprof.PathProp(
-            jdict['freq'] * u.GHz,
-            jdict['temp'] * u.K, jdict['press'] * u.hPa,
-            jdict['tx_lon'] * u.deg, jdict['tx_lat'] * u.deg,
-            jdict['rx_lon'] * u.deg, jdict['rx_lat'] * u.deg,
-            jdict['tx_height'] * u.m, jdict['rx_height'] * u.m,
-            jdict['stepsize'] * u.m,
-            jdict['timepercent'] * u.percent,
-            version=jdict['version'],
-            polarization=jdict['polarization'],
-            zone_t=jdict['tx_clutter'], zone_r=jdict['rx_clutter'],
-            hprof_dists=distances,
-            hprof_heights=heights,
-            hprof_bearing=bearing,
-            hprof_backbearing=back_bearing,
-            )
-
-        results = dict(
-            (k, getattr(pp, k))
-            for k in dir(pp)
-            if not k.startswith('_')
-            )
-
-        losses = pathprof.loss_complete(pp)
-        loss_names = [
-            'L_b0p', 'L_bd', 'L_bs', 'L_ba', 'L_b', 'L_b_corr',
-            ]
-        results.update(dict(zip(loss_names, losses)))
-
-        self.result_ready.emit(hprof_data, results)
-
-        print('job finished')
-
-
-class StatisticsWorker(BaseWorker):
-
-    @QtCore.pyqtSlot()
-    def do_job(self):
-
-        self.job_waiting = False
-        jdict = self.job_dict
-        print('doing job', jdict)
-        print(pathprof.SrtmConf)
-
-        hprof_data = cached_heightprofile(
-            jdict['tx_lon'] * u.deg, jdict['tx_lat'] * u.deg,
-            jdict['rx_lon'] * u.deg, jdict['rx_lat'] * u.deg,
-            jdict['stepsize'] * u.m,
-            )
-        (
-            lons, lats, distance, distances, heights,
-            bearing, back_bearing, back_bearings
-            ) = hprof_data
-
-        frequency = np.array([0.1, 0.5, 1, 2, 5, 10, 20, 50, 100])
-        time_percent = np.logspace(-3, np.log10(50), 100)
-
-        results = pathprof.losses_complete(
-            frequency[:, np.newaxis] * u.GHz,
-            jdict['temp'] * u.K, jdict['press'] * u.hPa,
-            jdict['tx_lon'] * u.deg, jdict['tx_lat'] * u.deg,
-            jdict['rx_lon'] * u.deg, jdict['rx_lat'] * u.deg,
-            jdict['tx_height'] * u.m, jdict['rx_height'] * u.m,
-            jdict['stepsize'] * u.m,
-            time_percent[np.newaxis] * u.percent,
-            version=jdict['version'],
-            polarization=jdict['polarization'],
-            zone_t=jdict['tx_clutter'], zone_r=jdict['rx_clutter'],
-            hprof_dists=distances,
-            hprof_heights=heights,
-            hprof_bearing=bearing,
-            hprof_backbearing=back_bearing,
-            )
-
-        self.result_ready.emit((frequency, time_percent), results)
-
-        print('job finished')
-
-
-class PathProfWorker(BaseWorker):
-
-    @QtCore.pyqtSlot()
-    def do_job(self):
-
-        self.job_waiting = False
-        jdict = self.job_dict
-        print('doing job', jdict)
-
-        if jdict['do_generic']:
-
-            hprof_data = cached_height_path_data_generic(
-                jdict['tx_lon'] * u.deg, jdict['tx_lat'] * u.deg,
-                jdict['rx_lon'] * u.deg, jdict['rx_lat'] * u.deg,
-                jdict['stepsize'] * u.m,
-                zone_t=jdict['tx_clutter'], zone_r=jdict['rx_clutter'],
-                )
-
-        else:
-
-            hprof_data = cached_height_path_data(
-                jdict['tx_lon'] * u.deg, jdict['tx_lat'] * u.deg,
-                jdict['rx_lon'] * u.deg, jdict['rx_lat'] * u.deg,
-                jdict['stepsize'] * u.m,
-                zone_t=jdict['tx_clutter'], zone_r=jdict['rx_clutter'],
-                )
-
-        results = pathprof.atten_path_fast(
-            jdict['freq'] * u.GHz,
-            jdict['temp'] * u.K, jdict['press'] * u.hPa,
-            jdict['tx_height'] * u.m, jdict['rx_height'] * u.m,
-            jdict['timepercent'] * u.percent,
-            hprof_data,
-            version=jdict['version'],
-            polarization=jdict['polarization'],
-            )
-
-        self.result_ready.emit(hprof_data, results)
-
-        print('job finished')
-
-
-class MapWorker(BaseWorker):
-
-    @QtCore.pyqtSlot()
-    def do_job(self):
-
-        self.job_waiting = False
-        jdict = self.job_dict
-        print('doing job', jdict)
-
-        hprof_data = cached_height_map_data(
-            jdict['tx_lon'] * u.deg, jdict['tx_lat'] * u.deg,
-            jdict['size_lon'] * u.deg, jdict['size_lat'] * u.deg,
-            jdict['map_reso'] * u.arcsec,
-            zone_t=jdict['tx_clutter'], zone_r=jdict['rx_clutter'],
-            )
-
-        results = pathprof.atten_map_fast(
-            jdict['freq'] * u.GHz,
-            jdict['temp'] * u.K, jdict['press'] * u.hPa,
-            jdict['tx_height'] * u.m, jdict['rx_height'] * u.m,
-            jdict['timepercent'] * u.percent,
-            hprof_data,
-            version=jdict['version'],
-            polarization=jdict['polarization'],
-            )
-
-        # hprof_data contains only a high-res representation of height profs
-        lons, lats = hprof_data['xcoords'], hprof_data['ycoords']
-        hprof_data['height_map'] = pathprof.srtm_height_data(
-            lons[np.newaxis] * u.deg, lats[:, np.newaxis] * u.deg
-            )
-
-        self.result_ready.emit(hprof_data, results)
-
-        print('job finished')
diff --git a/pycraf/pathprof/gis.py b/pycraf/pathprof/gis.py
index 45a02b054..06af92d06 100644
--- a/pycraf/pathprof/gis.py
+++ b/pycraf/pathprof/gis.py
@@ -27,7 +27,7 @@
     )
 CORINE_TO_P452_CLASSES = dict(np.genfromtxt(
     _CORINE_TO_P452_CLASSES_FILE,
-    dtype=np.dtype([('CorineID', np.uint16), ('ClutterName', np.str, 100)]),
+    dtype=np.dtype([('CorineID', np.uint16), ('ClutterName', str, 100)]),
     delimiter=',',
     ))
 
@@ -36,7 +36,7 @@
     )
 IGBP_TO_P452_CLASSES = dict(np.genfromtxt(
     _IGBP_TO_P452_CLASSES_FILE,
-    dtype=np.dtype([('IGBP_ID', np.uint8), ('ClutterName', np.str, 100)]),
+    dtype=np.dtype([('IGBP_ID', np.uint8), ('ClutterName', str, 100)]),
     delimiter=',',
     ))
 
diff --git a/pycraf/utils/decorators.py b/pycraf/utils/decorators.py
index 6eb206a29..67dfbef22 100644
--- a/pycraf/utils/decorators.py
+++ b/pycraf/utils/decorators.py
@@ -5,7 +5,8 @@
 
 import numpy as np
 import inspect
-from astropy.utils.decorators import wraps
+# from astropy.utils.decorators import wraps
+from functools import wraps
 from astropy.units.core import UnitsError, add_enabled_equivalencies
 
 
diff --git a/setup.cfg b/setup.cfg
index aa9f9ae93..b94cad301 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -65,4 +65,4 @@ minimum_python_version = 3.7
 
 [entry_points_gui]
 
-pycraf-gui = pycraf.gui.__main__:main
+# pycraf-gui = pycraf.gui.__main__:main


Test patch:
diff --git a/pycraf/conftest.py b/pycraf/conftest.py
index 3c4fb9edf..f829c1640 100644
--- a/pycraf/conftest.py
+++ b/pycraf/conftest.py
@@ -6,12 +6,13 @@
     # With older versions of Astropy, we actually need to import the pytest
     # plugins themselves in order to make them discoverable by pytest.
     from astropy.tests.pytest_plugins import *
+    del pytest_report_header
 else:
     # As of Astropy 3.0, the pytest plugins provided by Astropy are
     # automatically made available when Astropy is installed. This means it's
     # not necessary to import them here, but we still need to import global
     # variables that are used for configuration.
-    from astropy.tests.plugins.display import PYTEST_HEADER_MODULES, TESTED_VERSIONS
+    from pytest_astropy_header.display import PYTEST_HEADER_MODULES, TESTED_VERSIONS
 
 from astropy.tests.helper import enable_deprecations_as_exceptions
 
@@ -41,6 +42,21 @@
 # Uncomment the following lines to display the version number of the
 # package rather than the version number of Astropy in the top line when
 # running the tests.
+
+# new variant of the above
+# def pytest_configure(config):
+
+#     config.option.astropy_header = True
+
+#     PYTEST_HEADER_MODULES.pop('Pandas', None)
+#     PYTEST_HEADER_MODULES['scikit-image'] = 'skimage'
+
+#     from .version import version, astropy_helpers_version
+#     packagename = os.path.basename(os.path.dirname(__file__))
+#     TESTED_VERSIONS[packagename] = version
+#     TESTED_VERSIONS['astropy_helpers'] = astropy_helpers_version
+
+
 import os
 
 # This is to figure out the package version, rather than
@@ -62,16 +78,15 @@
 import pytest
 from . import pathprof
 
-
-def pytest_addoption(parser):
-    parser.addoption(
-        '--do-gui-tests', action='store_true', help='Do GUI tests.'
-        )
+# def pytest_addoption(parser):
+#     parser.addoption(
+#         '--do-gui-tests', action='store_true', help='Do GUI tests.'
+#         )
 
 
-def pytest_runtest_setup(item):
-    if 'do_gui_tests' in item.keywords and not item.config.getoption('--do-gui-tests'):
-        pytest.skip('GUI tests are only executed if user provides "--do-gui-tests" command line option')
+# def pytest_runtest_setup(item):
+#     if 'do_gui_tests' in item.keywords and not item.config.getoption('--do-gui-tests'):
+#         pytest.skip('GUI tests are only executed if user provides "--do-gui-tests" command line option')
 
 
 @pytest.fixture(scope='session')
@@ -81,8 +96,9 @@ def srtm_temp_dir(tmpdir_factory):
     return str(tdir)
 
 
-@pytest.yield_fixture()
+@pytest.fixture(scope='class')
 def srtm_handler(srtm_temp_dir):
+    print("srtm_handler")
 
     with pathprof.srtm.SrtmConf.set(
             srtm_dir=srtm_temp_dir,
diff --git a/pycraf/geospatial/tests/test_geospatial.py b/pycraf/geospatial/tests/test_geospatial.py
index e10844218..157a5e333 100644
--- a/pycraf/geospatial/tests/test_geospatial.py
+++ b/pycraf/geospatial/tests/test_geospatial.py
@@ -264,6 +264,8 @@ def test_wgs84_to_itrf(self):
         template = 'data/wgs84_itrf{}.npz'
         for year in ITRF_YEARS:
 
+            print(year, year == "2005")
+
             func = getattr(gsp, 'wgs84_to_itrf{}'.format(year))
             dat = np.load(get_pkg_data_filename(template.format(year)))
 
@@ -272,9 +274,15 @@ def test_wgs84_to_itrf(self):
                 dat['height'] * apu.m
                 )
 
-            assert_quantity_allclose(x, dat['x'] * apu.m, atol=1.e-3 * apu.m)
-            assert_quantity_allclose(y, dat['y'] * apu.m, atol=1.e-3 * apu.m)
-            assert_quantity_allclose(z, dat['z'] * apu.m, atol=1.e-3 * apu.m)
+            # fixme; on linux-py3.9 the results differ by about 1 m for 2005
+            if year == "2005":
+                assert_quantity_allclose(x, dat['x'] * apu.m, atol=2 * apu.m, rtol=1e-6)
+                assert_quantity_allclose(y, dat['y'] * apu.m, atol=2 * apu.m, rtol=1e-6)
+                assert_quantity_allclose(z, dat['z'] * apu.m, atol=2 * apu.m, rtol=1e-6)
+            else:
+                assert_quantity_allclose(x, dat['x'] * apu.m, atol=1.e-3 * apu.m)
+                assert_quantity_allclose(y, dat['y'] * apu.m, atol=1.e-3 * apu.m)
+                assert_quantity_allclose(z, dat['z'] * apu.m, atol=1.e-3 * apu.m)
 
     @skip_pyproj
     def test_itrf_to_wgs84(self):
@@ -290,11 +298,19 @@ def test_itrf_to_wgs84(self):
                 dat['x'] * apu.m, dat['y'] * apu.m, dat['z'] * apu.m
                 )
 
-            assert_quantity_allclose(glon, dat['glon'] * apu.deg)
-            assert_quantity_allclose(glat, dat['glat'] * apu.deg)
-            assert_quantity_allclose(
-                height, dat['height'] * apu.m, atol=0.0002 * apu.m
-                )
+            # fixme; on linux-py3.9 the results differ by about 1 m for 2005
+            if year == "2005":
+                assert_quantity_allclose(glon, dat['glon'] * apu.deg, atol=0.001 * apu.deg, rtol=2e-3)
+                assert_quantity_allclose(glat, dat['glat'] * apu.deg, atol=0.001 * apu.deg, rtol=2e-3)
+                assert_quantity_allclose(
+                    height, dat['height'] * apu.m, atol=0.2 * apu.m, rtol=0.002
+                    )
+            else:
+                assert_quantity_allclose(glon, dat['glon'] * apu.deg)
+                assert_quantity_allclose(glat, dat['glat'] * apu.deg)
+                assert_quantity_allclose(
+                    height, dat['height'] * apu.m, atol=0.0002 * apu.m
+                    )
 
     @skip_pyproj
     @pytest.mark.skip(
diff --git a/pycraf/gui/tests/__init__.py b/pycraf/gui/tests/__init__.py
deleted file mode 100644
index e69de29bb..000000000
diff --git a/pycraf/gui/tests/test_gui.py b/pycraf/gui/tests/test_gui.py
deleted file mode 100644
index 1e581d2bb..000000000
--- a/pycraf/gui/tests/test_gui.py
+++ /dev/null
@@ -1,258 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# from __future__ import absolute_import
-# from __future__ import division
-# from __future__ import print_function
-# from __future__ import unicode_literals
-
-import pytest
-import re
-import numpy as np
-from numpy.testing import assert_equal, assert_allclose
-from astropy.tests.helper import assert_quantity_allclose, remote_data
-from astropy import units as apu
-from astropy.units import Quantity
-# from astropy.utils.misc import NumpyRNGContext
-# from astropy.utils.data import get_pkg_data_filename
-from PyQt5 import QtCore, QtWidgets
-from .. import gui
-from ... import conversions as cnv
-
-
-LABEL_TEXT = '''
-<style>
-    table {
-        color: black;
-        width: 100%;
-        text-align: center;
-        font-family: "Futura-Light", sans-serif;
-        font-weight: 400;
-        font-size: 14px;
-    }
-    th {
-        color: blue;
-        font-size: 16px;
-    }
-    th, td { padding: 2px; }
-    thead.th {
-        height: 110%;
-        border-bottom: solid 0.25em black;
-    }
-    .lalign { text-align: left; padding-left: 12px;}
-    .ralign { text-align: right; padding-right: 12px; }
-    </style>
-
-<table>
-  <thead>
-    <tr>
-      <th colspan="2">Radio properties</th>
-      <th colspan="2">Path geometry</th>
-      <th colspan="2">Path losses</th>
-    </tr>
-  </thead>
-  <tbody>
-    <tr>
-      <td class="lalign">a_e (50%)</td>
-      <td class="ralign"> 8455 km</td>
-      <td class="lalign">alpha_tr</td>
-      <td class="ralign"> 122.081 deg</td>
-      <td class="lalign">L_b0p (LoS)</td>
-      <td class="ralign">125.0 dB</td>
-    </tr>
-    <tr>
-      <td class="lalign">a_e (beta0)</td>
-      <td class="ralign">19113 km</td>
-      <td class="lalign">alpha_rt</td>
-      <td class="ralign"> -57.390 deg</td>
-      <td class="lalign">L_bd (Diffraction)</td>
-      <td class="ralign">172.4 dB</td>
-    </tr>
-    <tr>
-      <td class="lalign">beta0</td>
-      <td class="ralign">1.25 %</td>
-      <td class="lalign">eps_pt</td>
-      <td class="ralign">   0.512 deg</td>
-      <td class="lalign">L_bs (Troposcatter)</td>
-      <td class="ralign">207.4 dB</td>
-    </tr>
-    <tr>
-      <td class="lalign">N0</td>
-      <td class="ralign">324.7</td>
-      <td class="lalign">eps_pr</td>
-      <td class="ralign">   3.458 deg</td>
-      <td class="lalign">L_ba (Anomalous)</td>
-      <td class="ralign">219.8 dB</td>
-    </tr>
-    <tr>
-      <td class="lalign">Delta N</td>
-      <td class="ralign">38.69 1 / km</td>
-      <td class="lalign">h_eff</td>
-      <td class="ralign">   510.0 m</td>
-      <td class="lalign">L_b (Total)</td><td class="ralign">172.4 dB</td>
-    </tr>
-    <tr>
-      <td class="lalign"></td>
-      <td class="ralign"></td>
-      <td class="lalign">Path type</td>
-      <td class="ralign">Trans-horizon</td>
-      <td class="lalign" style="color: blue;">L_b_corr (Total + Clutter)</td>
-      <td class="ralign" style="color: blue;">171.8 dB</td>
-    </tr>
-  </tbody>
-</table>
-'''
-
-
-def _set_parameters(ui):
-
-    ui.freqDoubleSpinBox.setValue(1.0)
-    ui.timepercentDoubleSpinBox.setValue(2.0)
-    ui.stepsizeDoubleSpinBox.setValue(10.0)
-    ui.tempDoubleSpinBox.setValue(293.15)
-    ui.pressDoubleSpinBox.setValue(980.0)
-    ui.txLonDoubleSpinBox.setValue(6.2)
-    ui.txLatDoubleSpinBox.setValue(50.8)
-    ui.txHeightDoubleSpinBox.setValue(50.0)
-    ui.rxLonDoubleSpinBox.setValue(6.88361)
-    ui.rxLatDoubleSpinBox.setValue(50.52483)
-    ui.rxHeightDoubleSpinBox.setValue(10.0)
-    ui.mapSizeLonDoubleSpinBox.setValue(0.2)
-    ui.mapSizeLatDoubleSpinBox.setValue(0.2)
-    ui.mapResolutionDoubleSpinBox.setValue(3.0)
-
-
-@remote_data(source='any')
-@pytest.mark.do_gui_tests
-@pytest.mark.usefixtures('srtm_handler')
-def test_gui_startup_shows_pathgeometry(qtbot):
-    # change download option to missing and test, if the results label
-    # in geometry pane has correct values (need to wait for startup-timer
-    # to fire)
-
-    myapp = gui.PycrafGui()
-    qtbot.addWidget(myapp)
-    _set_parameters(myapp.ui)
-    myapp.ui.srtmDownloadComboBox.setCurrentIndex(
-        gui.SRTM_DOWNLOAD_MAPPING.index('missing')
-        )
-    with qtbot.waitSignal(
-            myapp.my_geo_worker.result_ready[object, object],
-            raising=False, timeout=50000,
-            ):
-        myapp.timer.start(10)
-
-    ltxt = myapp.ui.ppRichTextLabel.text()
-    assert re.sub("\s*", " ", ltxt) == re.sub("\s*", " ", LABEL_TEXT)
-
-
-@remote_data(source='any')
-@pytest.mark.do_gui_tests
-@pytest.mark.usefixtures('srtm_handler')
-def test_stats_worker(qtbot):
-    # change download option to missing and test, if the results are correct
-
-    myapp = gui.PycrafGui()
-    qtbot.addWidget(myapp)
-    _set_parameters(myapp.ui)
-    myapp.ui.srtmDownloadComboBox.setCurrentIndex(
-        gui.SRTM_DOWNLOAD_MAPPING.index('missing')
-        )
-    with qtbot.waitSignal(
-            myapp.my_stats_worker.result_ready[object, object],
-            raising=False, timeout=50000,
-            ):
-        myapp.timer.start(10)
-
-    res = myapp.statistics_results
-
-    assert_quantity_allclose(
-        res['L_b'][:, ::20].to(cnv.dB).value, [
-            [138.8771118, 140.8853131, 142.8934803, 144.9016341, 147.7434509],
-            [156.2189124, 158.2270703, 160.2352217, 162.2433706, 164.7989202],
-            [165.3765899, 167.3847525, 169.3929057, 171.4010551, 173.6622298],
-            [174.5007580, 176.5089330, 178.5170906, 180.5252413, 182.7685164],
-            [186.5540705, 188.5623023, 190.5704806, 192.5786379, 194.8213818],
-            [195.9055898, 197.9140057, 199.9222511, 201.9304294, 204.1729092],
-            [210.4921391, 212.5046189, 214.5143471, 216.5229899, 218.7653956],
-            [236.8190545, 238.8738936, 240.8993047, 242.9128866, 245.1563437],
-            [243.0043903, 247.2872525, 251.7308653, 256.0069129, 259.5560927],
-            ])
-    # assert myapp.pathprof_results is None
-
-
-@remote_data(source='any')
-@pytest.mark.do_gui_tests
-@pytest.mark.usefixtures('srtm_handler')
-def test_pp_worker(qtbot):
-    # change download option to missing and test, if the results are correct
-
-    myapp = gui.PycrafGui()
-    qtbot.addWidget(myapp)
-    _set_parameters(myapp.ui)
-    myapp.ui.srtmDownloadComboBox.setCurrentIndex(
-        gui.SRTM_DOWNLOAD_MAPPING.index('missing')
-        )
-    with qtbot.waitSignal(
-            myapp.my_pp_worker.result_ready[object, object],
-            raising=False, timeout=50000,
-            ):
-        myapp.on_pathprof_compute_pressed()
-
-    res = myapp.pathprof_results
-
-    assert_quantity_allclose(
-        res['L_b'][::1000].to(cnv.dB).value,
-        [0., 128.879956, 163.285657, 155.078537, 156.097511, 170.742422]
-        )
-    assert_quantity_allclose(
-        res['eps_pt'][::1000].to(apu.deg).value,
-        [0., 0.45954562, 0.51161058, 0.51158408, 0.51155677, 0.51152865]
-        )
-    assert_equal(res['path_type'][::1000], [0, 1, 1, 1, 1, 1])
-    # assert myapp.pathprof_results is None
-
-
-@remote_data(source='any')
-@pytest.mark.do_gui_tests
-@pytest.mark.usefixtures('srtm_handler')
-def test_map_worker(qtbot):
-    # change download option to missing and test, if the results are correct
-
-    myapp = gui.PycrafGui()
-    qtbot.addWidget(myapp)
-    _set_parameters(myapp.ui)
-    myapp.ui.srtmDownloadComboBox.setCurrentIndex(
-        gui.SRTM_DOWNLOAD_MAPPING.index('missing')
-        )
-    with qtbot.waitSignal(
-            myapp.my_map_worker.result_ready[object, object],
-            raising=False, timeout=50000,
-            ):
-        myapp.on_map_compute_pressed()
-
-    res = myapp.map_results
-
-    print(res['L_b'][::80, ::80].to(cnv.dB).value)
-    print(res['eps_pt'][::80, ::80].to(apu.deg).value)
-    assert_quantity_allclose(
-        res['L_b'][::80, ::80].to(cnv.dB).value, [
-            [147.92110506, 133.64246369, 111.43421362, 134.20808414],
-            [111.45317964, 126.50588342, 127.41079286, 119.47281152],
-            [118.95606625, 105.44468519, 126.89590692, 119.33537173],
-            [113.64151601, 125.3059271, 116.06473428, 136.72188462],
-            ])
-    assert_quantity_allclose(
-        res['eps_pt'][::80, ::80].to(apu.deg).value, [
-            [0.27265693, 0.20522323, 0.6505462, 0.64897268],
-            [-0.06723739, 0.03969113, 0.44085012, 0.30607933],
-            [-0.37428988, -0.58972059, -0.46088839, -0.62473188],
-            [-0.37882374, -0.49772378, -0.62911416, -0.46750982],
-            ])
-    assert_equal(res['path_type'][::80, ::80], [
-        [1, 1, 0, 1],
-        [0, 1, 1, 0],
-        [0, 0, 1, 0],
-        [0, 1, 0, 1],
-        ])
-    # assert myapp.pathprof_results is None
diff --git a/pycraf/pathprof/tests/test_heightprofile.py b/pycraf/pathprof/tests/test_heightprofile.py
index d2a057621..2cac7fdd8 100644
--- a/pycraf/pathprof/tests/test_heightprofile.py
+++ b/pycraf/pathprof/tests/test_heightprofile.py
@@ -10,7 +10,7 @@
 from functools import partial
 import numpy as np
 from numpy.testing import assert_equal, assert_allclose
-from astropy.tests.helper import assert_quantity_allclose, remote_data
+from astropy.tests.helper import assert_quantity_allclose  #, remote_data
 from astropy import units as apu
 from astropy.units import Quantity
 from ... import pathprof
@@ -21,9 +21,10 @@
 TOL_KWARGS = {'atol': 1.e-4, 'rtol': 1.e-4}
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 @pytest.mark.usefixtures('srtm_handler')
-def test_srtm_height_profile(srtm_temp_dir):
+# def test_srtm_height_profile(srtm_temp_dir):
+def test_srtm_height_profile():
 
     lon_t, lat_t = 6.5 * apu.deg, 50.5 * apu.deg
     lon_r, lat_r = 6.52 * apu.deg, 50.52 * apu.deg
@@ -119,7 +120,7 @@ def test_srtm_height_profile_generic():
         )
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 @pytest.mark.usefixtures('srtm_handler')
 def test_srtm_height_map():
 
diff --git a/pycraf/pathprof/tests/test_propagation.py b/pycraf/pathprof/tests/test_propagation.py
index c154d09da..cc443a7b7 100644
--- a/pycraf/pathprof/tests/test_propagation.py
+++ b/pycraf/pathprof/tests/test_propagation.py
@@ -12,7 +12,7 @@
 import numpy as np
 from zipfile import ZipFile
 from numpy.testing import assert_equal, assert_allclose
-from astropy.tests.helper import assert_quantity_allclose, remote_data
+from astropy.tests.helper import assert_quantity_allclose  #, remote_data
 from astropy import units as apu
 from astropy.units import Quantity
 from ... import conversions as cnv
@@ -44,7 +44,7 @@
     ]
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 @pytest.mark.usefixtures('srtm_handler')
 class TestPropagation:
 
@@ -52,6 +52,8 @@ def setup(self):
 
         # TODO: add further test cases
 
+        print(pathprof.srtm.SrtmConf)
+
         self.cases_zip_name = get_pkg_data_filename('cases.zip')
         self.fastmap_zip_name = get_pkg_data_filename('fastmap.zip')
 
@@ -217,6 +219,8 @@ def test_pathprop(self):
 
     def test_freespace_loss(self):
 
+        print(pathprof.srtm.SrtmConf)
+
         for case, pprop in zip(self.cases, self.pprops):
 
             freq, (h_tg, h_rg), time_percent, version, (G_t, G_r) = case
diff --git a/pycraf/pathprof/tests/test_srtm.py b/pycraf/pathprof/tests/test_srtm.py
index 62e2a0fa7..ef9008b44 100644
--- a/pycraf/pathprof/tests/test_srtm.py
+++ b/pycraf/pathprof/tests/test_srtm.py
@@ -5,7 +5,7 @@
 import pytest
 import numpy as np
 from numpy.testing import assert_equal, assert_allclose
-from astropy.tests.helper import assert_quantity_allclose, remote_data
+from astropy.tests.helper import assert_quantity_allclose  # , remote_data
 from astropy import units as apu
 from ...pathprof import srtm
 from ...utils import check_astro_quantities
@@ -245,7 +245,7 @@ def test_check_availability_pano():
 
 
 @pytest.mark.skip(reason="NASA tiles not available without log-in anymore")
-@remote_data(source='any')
+@pytest.mark.remote_data
 def test_download_nasa(srtm_temp_dir):
 
     ilon, ilat = 6, 50
@@ -263,7 +263,7 @@ def test_download_nasa(srtm_temp_dir):
         assert dl_path.endswith(tile_name)
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 def test_download_pano(srtm_temp_dir):
 
     ilon, ilat = 6, 50
@@ -317,7 +317,7 @@ def test_get_hgt_diskpath(srtm_temp_dir):
         os.remove(os.path.join(srtm_temp_dir, 'd2', 'foo.hgt'))
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 def test_get_hgt_file_download_never(srtm_temp_dir):
 
     print(srtm.SrtmConf.srtm_dir)
@@ -345,7 +345,7 @@ def test_get_hgt_file_download_never(srtm_temp_dir):
             srtm.get_hgt_file(ilon, ilat)
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 def test_get_hgt_file_download_missing(srtm_temp_dir):
 
     print(srtm.SrtmConf.srtm_dir)
@@ -358,7 +358,7 @@ def test_get_hgt_file_download_missing(srtm_temp_dir):
         assert tile_path.endswith(tile_name)
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 def test_get_hgt_file_download_always(srtm_temp_dir):
 
     # note, previously, we checked the file's mtime to do this check
@@ -386,7 +386,7 @@ def test_get_hgt_file_download_always(srtm_temp_dir):
     assert dat1 != dat2
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 def test_get_tile_data(srtm_temp_dir):
 
     with srtm.SrtmConf.set(srtm_dir=srtm_temp_dir):
@@ -444,7 +444,7 @@ def test_get_tile_warning(srtm_temp_dir):
         assert_allclose(tile, np.zeros((5, 5), dtype=np.float32))
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 def test_srtm_height_data_linear(srtm_temp_dir):
 
     args_list = [
@@ -475,7 +475,7 @@ def test_srtm_height_data_linear(srtm_temp_dir):
             ]) * apu.m)
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 def test_srtm_height_data_nearest(srtm_temp_dir):
 
     args_list = [
@@ -502,7 +502,7 @@ def test_srtm_height_data_nearest(srtm_temp_dir):
             ]) * apu.m)
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 def test_srtm_height_data_spline(srtm_temp_dir):
 
     args_list = [
@@ -540,7 +540,7 @@ def test_srtm_height_data_zero(srtm_temp_dir):
         assert_allclose(heights, np.zeros(5, dtype=np.float32))
 
 
-@remote_data(source='any')
+@pytest.mark.remote_data
 def test_srtm_height_data_broadcasting(srtm_temp_dir):
 
     args_list = [