New Upstream Release - welle.io

Ready changes

Summary

Merged new upstream version: 2.4 (was: 2.2).

Resulting package

Built on 2022-03-14T18:25 (took 9m8s)

The resulting binary packages can be installed (if you have the apt repository enabled) by running one of:

apt install -t fresh-releases welle.io-dbgsymapt install -t fresh-releases welle.io

Lintian Result

Diff

diff --git a/.appveyor.yml b/.appveyor.yml
index d3bd40f..870467b 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -32,10 +32,10 @@ build_script:
 after_build:
   # Prepare welle binary files
   - md bin
-  - copy src\welle-cli\release\welle-cli.exe bin
+  #- copy src\welle-cli\release\welle-cli.exe bin
   - copy src\welle-gui\release\welle-io.exe bin
-  - copy ..\welle-io\src\welle-cli\index.html bin
-  - copy ..\welle-io\src\welle-cli\index.js bin
+  #- copy ..\welle-io\src\welle-cli\index.html bin
+  #- copy ..\welle-io\src\welle-cli\index.js bin
   
   # Create installer
   - cd ..\welle-io\windows\
@@ -52,17 +52,23 @@ after_build:
   
 deploy:
   # Upload it to BinTray
-  - provider: BinTray
-    username: albrechtl
-    api_key:
-      secure: i7ksq/PodhXDzjw7trN/y00EA6U4tZ9m4EGOFDv736Nrvb6lpvG8jtXwTV4cPOtV
-    subject: albrechtl
-    repo: welle.io
-    package: welle.io_nightly
-    version: '%file_version%'
-    publish: true
-    override: true
-    explode: true
+  #- provider: BinTray
+  #  username: albrechtl
+  #  api_key:
+  #    secure: i7ksq/PodhXDzjw7trN/y00EA6U4tZ9m4EGOFDv736Nrvb6lpvG8jtXwTV4cPOtV
+  #  subject: albrechtl
+  #  repo: welle.io
+  #  package: welle.io_nightly
+  #  version: '%file_version%'
+  #  publish: true
+  #  override: true
+  #  explode: true
+  provider: FTP
+  protocol: ftps
+  host: welle-io-nightlies.albrechtloh.de
+  username: welle-ci
+  password:
+    secure: Hu/HfMhc0Uhq0WOFM49YTUqoBvbXx49fMg93bOPKVhI=
 
 after_deploy:
   # Backup: Upload it to transfer.sh
diff --git a/.bintray_delete_old_version.py b/.bintray_delete_old_version.py
deleted file mode 100644
index 9f8a380..0000000
--- a/.bintray_delete_old_version.py
+++ /dev/null
@@ -1,67 +0,0 @@
-# Copyright (C) 2018
-# Albrecht Lohofener (albrechtloh@gmx.de)
-#
-# This file is part of the welle.io.
-# Many of the ideas as implemented in welle.io are derived from
-# other work, made available through the GNU general Public License.
-# All copyrights of the original authors are recognized.
-#
-# welle.io is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# welle.io is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with welle.io; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-import requests
-import json
-import sys
-
-bintray_api = 'https://api.bintray.com'
-#bintray_user = 'albrechtl'
-#bintray_pass = '<secret>'
-#bintray_package = '/packages/albrechtl/welle.io/welle.io_next_nightly'
-#keep_last_version = 20
-
-if len(sys.argv) != 4 + 1:
-    print('Error: The number of parameters is != 4')
-    exit(-1)
-
-bintray_user = sys.argv[1]
-bintray_pass = sys.argv[2]
-bintray_package = sys.argv[3]
-keep_last_version = int(sys.argv[4])
-
-# Get all versions
-r = requests.get(bintray_api + bintray_package, auth=(bintray_user, bintray_pass))
-
-# Decode data
-data = json.loads(r.text)
-
-# Extract versions
-versions = data['versions']
-
-# Extract versions to delete
-delete_versions = versions[keep_last_version:len(versions)]
-
-# Iterate over all versions to delete
-for version in delete_versions:
-    print('Deleting version ' + version)
-
-    # Delete version
-    r = requests.delete(bintray_api + bintray_package + '/versions/' + version, auth=(bintray_user, bintray_pass))
-
-    # Check status
-    if r.status_code != 200:
-        print('Error while deleting. Status {}'.format(r.status_code))
-    else:
-        delete_status = json.loads(r.text)
-        print('Status: ' + delete_status['message'])
-	
diff --git a/.travis-bintray-deploy.json.template b/.travis-bintray-deploy.json.template
deleted file mode 100644
index 0af824a..0000000
--- a/.travis-bintray-deploy.json.template
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "package": {
-    "name": "welle.io_nightly", // Bintray package name
-    "repo": "welle.io",         // Bintray repository name
-    "subject": "albrechtl"      // Bintray subject (user or organization)
-  },
-  "version": {
-    "name": "${VERSION}"
-  },
-  "files": [
-    {"includePattern": ".(.*welle-io.*.(AppImage|dmg))", "uploadPattern": "$1"},
-    {"includePattern": ".(.*welle-io-cli.*.AppImage)", "uploadPattern": "$1"}
-  ],
-  "publish": true
-}
-
diff --git a/.travis.yml b/.travis.yml
index b21edb9..9e99cc4 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,9 +2,20 @@ dist: bionic
 language: cpp
 compiler: gcc
 
+#env:
+#  # "BINTRAY_KEY=<secure>"
+#  - secure: "AjycfSfIztFeat6AO3SETSFW9Xd0AUt17hg87sEo8pSPO3SILq6bKS5Pfe4Bdo3Za32BvGzeJaOZ9EEVtzweuYJwsBejVfk2lxiBH5RKoBVrHpJLXDNj7MUt2ezb734bjFFt3+lMG84vSCqioNMcYwlHcqCChiTT529NZhaGMsDFzF5NimJZl0LGcEQlaTxTfeCKwSk+apHw5rQes2I2Jf9icweUGe/VOOVmYjDTiPWKcBEwBvfV5vabr5btCgUY8zK5451x/35API2Hbq7o0hNxqvwQUFI54jZwqfR4DOA1V/Nk7rdc34Fe+xgKSoBmHC0RgCIbXw1erEkn31Y0+tLBVxa971FB+y7L+5ZEaqw9UolT0PM5LHZmWUA60A5JlvsFOr0urid8lk0g5mdGF4aHEy2O5rDOMbwE11MpTEkDDbgE6uSD0/aubTJYPu24yMlBrP1lz10Sltg+YLi5hshhzRmd4iWTKuEy4jly1SdOKjjdbLCzlAnsF9Ta0a/lfumOd2lmELhYKhFLuVTCWZFvjpJyziCIFLVs4refDbDrsdfE+CaJedP/uBDGoBp4Hg6aug+66zKPybVzODqR2uIa3I7ACM3l/GdJcGg+1AH1T/ievq4rQ52T3MspevFxQmevuA9vvgOVko79PDrW1xbp+oQPTk0/pODNjVvrZFk="
+
 env:
-  # "BINTRAY_KEY=<secure>"
-  - secure: "AjycfSfIztFeat6AO3SETSFW9Xd0AUt17hg87sEo8pSPO3SILq6bKS5Pfe4Bdo3Za32BvGzeJaOZ9EEVtzweuYJwsBejVfk2lxiBH5RKoBVrHpJLXDNj7MUt2ezb734bjFFt3+lMG84vSCqioNMcYwlHcqCChiTT529NZhaGMsDFzF5NimJZl0LGcEQlaTxTfeCKwSk+apHw5rQes2I2Jf9icweUGe/VOOVmYjDTiPWKcBEwBvfV5vabr5btCgUY8zK5451x/35API2Hbq7o0hNxqvwQUFI54jZwqfR4DOA1V/Nk7rdc34Fe+xgKSoBmHC0RgCIbXw1erEkn31Y0+tLBVxa971FB+y7L+5ZEaqw9UolT0PM5LHZmWUA60A5JlvsFOr0urid8lk0g5mdGF4aHEy2O5rDOMbwE11MpTEkDDbgE6uSD0/aubTJYPu24yMlBrP1lz10Sltg+YLi5hshhzRmd4iWTKuEy4jly1SdOKjjdbLCzlAnsF9Ta0a/lfumOd2lmELhYKhFLuVTCWZFvjpJyziCIFLVs4refDbDrsdfE+CaJedP/uBDGoBp4Hg6aug+66zKPybVzODqR2uIa3I7ACM3l/GdJcGg+1AH1T/ievq4rQ52T3MspevFxQmevuA9vvgOVko79PDrW1xbp+oQPTk0/pODNjVvrZFk="
+  global:
+    - ANDROID_SDK_CMDLINE_TOOLS_ZIP="commandlinetools-linux-7583922_latest.zip"
+    - ANDROID_SDK_CMDLINE_TOOLS_SHA256="124f2d5115eee365df6cf3228ffbca6fc3911d16f8025bebd5b1c6e2fcfa7faf"
+    - ANDROID_BUILD_TOOLS_VER="28.0.3" # Same as buildToolsVersion in src/welle-gui/android/build.gradle
+    - ANDROID_PLATFORM_VER="android-30"
+    - ANDROID_NDK_ZIP="android-ndk-r20b-linux-x86_64.zip"
+    - ANDROID_NDK_SHA1="d903fdf077039ad9331fb6c3bee78aa46d45527b"
+    - ANDROID_NDK_MOUNT_DIR="${HOME}/r20b"
+    - ANDROID_NDK_BASE_DIR="android-ndk-r20b"
 
 script:
   - DATE=`date +%Y%m%d`
@@ -51,23 +62,30 @@ jobs:
 
       before_install:
         # QT
-        - sudo add-apt-repository ppa:beineri/opt-qt-5.14.2-bionic -y
+        - sudo add-apt-repository ppa:beineri/opt-qt-5.15.2-bionic -y
         # SoapySDR
         - sudo add-apt-repository ppa:myriadrf/drivers -y
         - sudo apt-get update -qq
 
       install:
-        - sudo apt-get -y install gcc g++
-        - sudo apt-get -y install libusb-1.0-0-dev pkg-config libmp3lame-dev libmpg123-dev qt514base qt514declarative qt514quickcontrols qt514quickcontrols2 qt514charts-no-lgpl qt514graphicaleffects qt514multimedia libpulse0 libfaad-dev libfftw3-dev libusb-1.0-0-dev mesa-common-dev libglu1-mesa-dev libpulse-dev libsoapysdr-dev
-        - source /opt/qt514/bin/qt514-env.sh
+        - sudo apt-get -y install sshpass
+        
+        # For AppImage
+        - sudo apt-get -y install libusb-1.0-0-dev pkg-config libmp3lame-dev libmpg123-dev qt515base qt515declarative qt515quickcontrols qt515quickcontrols2 qt515charts-no-lgpl qt515graphicaleffects qt515multimedia libpulse0 libfaad-dev libfftw3-dev libusb-1.0-0-dev mesa-common-dev libglu1-mesa-dev libpulse-dev libsoapysdr-dev
+        - source /opt/qt515/bin/qt515-env.sh
+        
+        # For Flatpak
+        - sudo add-apt-repository ppa:alexlarsson/flatpak -y
+        - sudo apt-get update -qq
+        - sudo apt-get -y install flatpak-builder elfutils
+        - sudo flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
+        - sudo flatpak install -y flathub org.kde.Sdk//5.15 org.kde.Platform//5.15
 
       after_success:
         - sudo ldconfig
 
         # Get linuxdeploy
-        # Seems to be that current 22. August 2020 linuxdeploy version is buggy
-        #- sudo wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage -P /usr/local/bin
-        - sudo wget https://artifacts.assassinate-you.net/artifactory/list/linuxdeploy/travis-456/linuxdeploy-x86_64.AppImage  -P /usr/local/bin
+        - sudo wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage -P /usr/local/bin
         - sudo chmod +x /usr/local/bin/linuxdeploy-x86_64.AppImage
         - sudo wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage -P /usr/local/bin
         - sudo chmod +x /usr/local/bin/linuxdeploy-plugin-qt-x86_64.AppImage
@@ -99,17 +117,103 @@ jobs:
         # Create welle-cli AppImage
         - linuxdeploy-x86_64.AppImage --appdir ./appdir-cli --output appimage
         - mv welle.io-cli-"$GIT_HASH"-x86_64.AppImage "$DATE"_"$GIT_HASH"_Linux_welle-io-cli-x86_64.AppImage
+        
+        # Create welle-gui Flatpak
+        - sudo flatpak-builder --repo=wellerepo --force-clean fp_build io.welle.welle-gui.json
+        - sudo flatpak --user remote-add --no-gpg-verify welle-repo wellerepo
+        - sudo flatpak --user install welle-repo io.welle.welle-gui --assumeyes
+        - flatpak build-bundle wellerepo welle-io.flatpak io.welle.welle-gui
+        - mv welle-io.flatpak "$DATE"_"$GIT_HASH"_Linux_welle-io-x86_64.flatpak
+
+        # Upload
+        - sshpass -p ${SFTP_PASSWORD} scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$DATE"_"$GIT_HASH"_Linux_welle-io-x86_64.AppImage ${SFTP_USER}@welle-io-nightlies.albrechtloh.de:/welle-io-nightlies.albrechtloh.de/
+        - sshpass -p ${SFTP_PASSWORD} scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$DATE"_"$GIT_HASH"_Linux_welle-io-cli-x86_64.AppImage ${SFTP_USER}@welle-io-nightlies.albrechtloh.de:/welle-io-nightlies.albrechtloh.de/
+        - sshpass -p ${SFTP_PASSWORD} scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$DATE"_"$GIT_HASH"_Linux_welle-io-x86_64.flatpak ${SFTP_USER}@welle-io-nightlies.albrechtloh.de:/welle-io-nightlies.albrechtloh.de/
+
+    - os: linux
+
+      before_install:
+        - export JOB_ID=2020761
+        - sudo apt-get -y install wget
+        - wget https://salsa.debian.org/bastif/qt-android/-/jobs/$JOB_ID/artifacts/raw/aptly/public-key.asc
+        - sudo cp public-key.asc /etc/apt/trusted.gpg.d/
+        - sudo add-apt-repository "deb https://salsa.debian.org/bastif/qt-android/-/jobs/$JOB_ID/artifacts/raw/aptly stretch main" -y
+        - sudo apt-get update -qq
+
+      install:
+        - sudo apt-get -y install apt-transport-https ca-certificates default-jdk default-jre-headless eatmydata fuse-zip sshpass
+
+        # qt-android 5.15
+        
+        - sudo apt-get -y -t stretch install qt-android-5.15
+
+        # Android SDK Command Line Tools
+        - wget https://dl.google.com/android/repository/$ANDROID_SDK_CMDLINE_TOOLS_ZIP
+        - echo "$ANDROID_SDK_CMDLINE_TOOLS_SHA256 $ANDROID_SDK_CMDLINE_TOOLS_ZIP" | sha256sum -c
+        # need to symlink /etc/mtab to work around a fusermount(1) deficiency (copied from /usr/lib/python3/dist-packages/reprotest/presets.py)
+        - test -c /dev/fuse || mknod -m 666 /dev/fuse c 10 229
+        - test -f /etc/mtab || ln -s ../proc/self/mounts /etc/mtab
+        - mkdir -p ${HOME}/cmdline-tools
+        - fuse-zip -r $ANDROID_SDK_CMDLINE_TOOLS_ZIP ${HOME}/cmdline-tools
+
+        # Android SDK Platform 30
+        - mkdir -p ${HOME}/android-sdk
+        - test -e ${HOME}/android-sdk/platforms/$ANDROID_PLATFORM_VER/source.properties || echo "y" | ${HOME}/cmdline-tools/cmdline-tools/bin/sdkmanager "platforms;$ANDROID_PLATFORM_VER" --channel=0 --sdk_root=${HOME}/android-sdk
+        - test -e ${HOME}/android-sdk/build-tools/$ANDROID_BUILD_TOOLS_VER/source.properties || echo "y" | ${HOME}/cmdline-tools/cmdline-tools/bin/sdkmanager "build-tools;$ANDROID_BUILD_TOOLS_VER" --channel=0 --sdk_root=${HOME}/android-sdk
+        - test -e ${HOME}/android-sdk/platform-tools/source.properties || echo "y" | ${HOME}/cmdline-tools/cmdline-tools/bin/sdkmanager "platform-tools" --channel=0 --sdk_root=${HOME}/android-sdk
+
+        # Unmound Command Line Tools
+        - fusermount -u ${HOME}/cmdline-tools
+
+        # Android NDK
+        - wget https://dl.google.com/android/repository/$ANDROID_NDK_ZIP
+        - echo "$ANDROID_NDK_SHA1 $ANDROID_NDK_ZIP" | sha1sum -c
+
+        # Android SDK & NDK
+        # need to symlink /etc/mtab to work around a fusermount(1) deficiency (copied from /usr/lib/python3/dist-packages/reprotest/presets.py)
+        - test -c /dev/fuse || mknod -m 666 /dev/fuse c 10 229
+        - test -f /etc/mtab || ln -s ../proc/self/mounts /etc/mtab
+        - mkdir -p $ANDROID_NDK_MOUNT_DIR
+        - fuse-zip -r $ANDROID_NDK_ZIP $ANDROID_NDK_MOUNT_DIR
+
+      script:
+        - DATE=`date +%Y%m%d`
+        - GIT_HASH=`git rev-parse --short HEAD`
+
+        # Create welle-io apk
+        - export ANDROID_SDK_ROOT=${HOME}/android-sdk
+        - export ANDROID_NDK_ROOT=$ANDROID_NDK_MOUNT_DIR/$ANDROID_NDK_BASE_DIR
+        - export QT_ROOT=/usr/lib/qt-android-5.15
+        - mkdir -p android-build
+        - cd android-build
+        - $QT_ROOT/bin/qmake ../welle.io.pro
+        - make -j$(nproc)
+        - make -j$(nproc) apk_install_target
+        - $QT_ROOT/bin/androiddeployqt --input src/welle-gui/android-welle-io-deployment-settings.json
+          --output src/welle-gui/android-build --android-platform android-30
+          --jdk /usr/lib/jvm/default-java --gradle
+        - cd ..
+
+      after_success:
+        # welle-io APK
+        - mv android-build/src/welle-gui/android-build/build/outputs/apk/debug/android-build-debug.apk "$DATE"_"$GIT_HASH"_Android_welle-io.apk
+
+        # Upload
+        - sshpass -p ${SFTP_PASSWORD} scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$DATE"_"$GIT_HASH"_Android_welle-io.apk ${SFTP_USER}@welle-io-nightlies.albrechtloh.de:/welle-io-nightlies.albrechtloh.de/
 
     - os: osx
-      osx_image: xcode11.3
+      osx_image: xcode13.2
 
       before_install:
         - brew tap pothosware/homebrew-pothos
         - brew update
+        - brew pin ansible
 
       install:
-        - brew install fftw faad2 lame mpg123 soapysdr soapyuhd
-        - ln -s /usr/local/opt/qt/bin/qmake /usr/local/bin/qmake
+        - brew install fftw faad2 lame mpg123 soapysdr esolitos/ipa/sshpass qt@5
+        - brew install --HEAD soapyuhd
+        - echo 'export PATH="/usr/local/opt/qt@5/bin:$PATH"' >> ~/.zshrc
+        - source ~/.zshrc
         - export LIBRARY_PATH=/usr/local/lib
 
       after_success:
@@ -120,7 +224,7 @@ jobs:
         - find build
         - mkdir appdir
         - cp -R build/src/welle-gui/welle-io.app appdir/welle.io.app
-        - /usr/local/opt/qt/bin/macdeployqt appdir/welle.io.app -qmldir=$TRAVIS_BUILD_DIR/src/welle-gui/QML
+        - macdeployqt appdir/welle.io.app -qmldir=$TRAVIS_BUILD_DIR/src/welle-gui/QML
         - cp /usr/local/lib/librtlsdr.0.dylib appdir/welle.io.app/Contents/Frameworks/librtlsdr.0.dylib
         - install_name_tool -change @rpath/librtlsdr.0.dylib @executable_path/../Frameworks/librtlsdr.0.dylib appdir/welle.io.app/Contents/MacOS/welle-io
         - python macdeployqtfix.py appdir/welle.io.app/Contents/MacOS/welle.io /usr/local/opt/qt
@@ -133,19 +237,22 @@ jobs:
         - hdiutil convert welle-io.dmg -format UDZO -o "$DATE"_"$GIT_HASH"_MacOS_welle-io.dmg
         - rm welle-io.dmg
 
-before_deploy:
-  # Prepare bintray deploy
-  - sed -e "s/\${VERSION}/"$DATE"_"$GIT_HASH"/" .travis-bintray-deploy.json.template >travis-bintray-deploy.json
+        # Upload
+        - sshpass -p ${SFTP_PASSWORD} scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null "$DATE"_"$GIT_HASH"_MacOS_welle-io.dmg ${SFTP_USER}@welle-io-nightlies.albrechtloh.de:/welle-io-nightlies.albrechtloh.de/
+
+#before_deploy:
+#  # Prepare bintray deploy
+#  - sed -e "s/\${VERSION}/"$DATE"_"$GIT_HASH"/" .travis-bintray-deploy.json.template >travis-bintray-deploy.json
 
-deploy:
-  on:
-    branch: next
-  provider: bintray
-  file: "travis-bintray-deploy.json"
-  user: "albrechtl"
-  skip_cleanup: true
-  key: $BINTRAY_KEY
+#deploy:
+#  on:
+#    branch: next
+#  provider: bintray
+#  file: "travis-bintray-deploy.json"
+#  user: "albrechtl"
+#  skip_cleanup: true
+#  key: $BINTRAY_KEY
 
-after_deploy:
+#after_deploy:
   # Delete old builds on bintray. Keep only the last 20 builds
-  - python .bintray_delete_old_version.py albrechtl $BINTRAY_KEY /packages/albrechtl/welle.io/welle.io_nightly 20
+  #- python .bintray_delete_old_version.py albrechtl $BINTRAY_KEY /packages/albrechtl/welle.io/welle.io_nightly 20
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2800d22..d7679b9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -52,7 +52,7 @@ if(BUILD_WELLE_IO)
     set(CMAKE_AUTOMOC ON)
     set(CMAKE_AUTORCC ON)
 
-    find_package(Qt5 COMPONENTS Widgets Quick QuickControls2 Multimedia Charts Qml REQUIRED)
+    find_package(Qt5 COMPONENTS Widgets Quick QuickControls2 Multimedia Charts Qml DBus REQUIRED)
 endif()
 
 if(PROFILING)
@@ -152,6 +152,9 @@ set(welle_io_sources
     src/welle-gui/mot_image_provider.cpp
     src/welle-gui/gui_helper.cpp
     src/welle-gui/radio_controller.cpp
+    src/welle-gui/mpris/mpris.cpp
+    src/welle-gui/mpris/mpris_mp2.cpp
+    src/welle-gui/mpris/mpris_mp2_player.cpp
     src/welle-gui/debug_output.cpp
     src/welle-gui/waterfallitem.cpp
 )
@@ -213,6 +216,9 @@ if(GIT_DESCRIBE)
   add_definitions("-DGITDESCRIBE=\"${GIT_DESCRIBE}\"")
 endif()
 
+STRING(TIMESTAMP BUILD_DATE "%s" UTC)
+add_definitions("-DBUILD_DATE=\"${BUILD_DATE}\"")
+
 if(BUILD_WELLE_IO)
     set(executableName welle-io)
     add_executable (${executableName} ${welle_io_sources} ${backend_sources} ${input_sources} ${fft_sources} ${EXTRA_MOCS} src/welle-gui/resources.qrc)
@@ -225,7 +231,7 @@ if(BUILD_WELLE_IO)
       ${SoapySDR_LIBRARIES}
       ${MPG123_LIBRARIES}
       Threads::Threads
-      Qt5::Core Qt5::Widgets Qt5::Multimedia Qt5::Charts Qt5::Qml Qt5::Quick Qt5::QuickControls2
+      Qt5::Core Qt5::Widgets Qt5::Multimedia Qt5::Charts Qt5::Qml Qt5::Quick Qt5::QuickControls2 Qt5::DBus
     )
 
     if(APPLE AND WITH_APP_BUNDLE)
@@ -246,6 +252,7 @@ if(BUILD_WELLE_IO)
         INSTALL (TARGETS ${executableName} BUNDLE DESTINATION ${GUI_INSTALL_DIR})
     else()
         INSTALL (TARGETS ${executableName} RUNTIME DESTINATION ${GUI_INSTALL_DIR})
+        INSTALL (FILES src/welle-gui/doc/man/welle-io.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)
 
         if(UNIX AND NOT APPLE)
             INSTALL (FILES ${PROJECT_SOURCE_DIR}/welle-io.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications)
@@ -302,6 +309,7 @@ if(BUILD_WELLE_CLI)
         )
     elseif(UNIX)
         INSTALL (TARGETS ${cliExecutableName} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
+        INSTALL (FILES src/welle-cli/doc/man/welle-cli.1 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1/)
         INSTALL (
             FILES
                 ${PROJECT_SOURCE_DIR}/src/welle-cli/index.html
diff --git a/HomebrewFormula/welle.io.rb b/HomebrewFormula/welle.io.rb
index 7444364..60f160e 100644
--- a/HomebrewFormula/welle.io.rb
+++ b/HomebrewFormula/welle.io.rb
@@ -1,22 +1,32 @@
 class WelleIo < Formula
   desc "DAB/DAB+ Software Radio"
   homepage "https://www.welle.io"
-  url  "https://github.com/AlbrechtL/welle.io/archive/v2.0.tar.gz"
-  sha256 "abfe999b6788ae57dfaaebea5e1db912565d60cc287c9eec4636b0e10eab4f9d"
+  url "https://github.com/AlbrechtL/welle.io/archive/v2.2.tar.gz"
+  sha256 "4b72c2984a884cc2f02d1e501ead2a8b0323900f37cebf4aed016e84474e0259"
+  license "GPL-2.0-or-later"
   head "https://github.com/AlbrechtL/welle.io.git"
 
+  livecheck do
+    url :stable
+    strategy :github_latest
+  end
+
   depends_on "cmake" => :build
-  depends_on "qt"
-  depends_on "fftw"
   depends_on "faad2"
-  depends_on "mpg123"
+  depends_on "fftw"
   depends_on "librtlsdr"
+  depends_on "libusb"
+  depends_on "mpg123"
   depends_on "pothosware/homebrew-pothos/soapysdr"
   depends_on "pothosware/homebrew-pothos/soapyuhd"
-  depends_on "libusb"
+  depends_on "qt@5"
 
   def install
-    system "cmake", ".", "-DRTLSDR=TRUE", "-DSOAPYSDR=TRUE", "-DBUILD_WELLE_CLI=OFF", *std_cmake_args
+    system "cmake", ".", *std_cmake_args,
+           "-DRTLSDR=1",
+           "-DSOAPYSDR=0",
+           "-DWITH_APP_BUNDLE=0", # Homebrew prefers a UNIX-like directory structure
+           "-DBUILD_WELLE_CLI=1"
     system "make", "install"
   end
 
diff --git a/RASPBERRY-PI.md b/RASPBERRY-PI.md
deleted file mode 100644
index 095358c..0000000
--- a/RASPBERRY-PI.md
+++ /dev/null
@@ -1,381 +0,0 @@
-welle.io on Raspberry Pi 2/3  
-============================
-This guide borrows parts from [Qt wiki](https://wiki.qt.io/RaspberryPi2EGLFS).  
-This guide is a work in progress.  
-If you have issues or something is completely wrong, please let us know at the [forums.](https://forum.welle.io/)  
----------------------------------------------------------------------------------
-Table of contents  
-=================
-
-  * [Description](#description)
-  * [Hardware requirements](#hardware-requirements)
-  * [Setup](#setup)
-  * [Building](#building)
-  * [Power supply](#power-supply)
-  * [Troubleshooting](#troubleshooting)
-  * [Known issues](#known-issues)
-
-Description
-===========
-This guide will help you compile and run welle.io on your Raspberry Pi 2/3 using the [Qt environment](https://www.qt.io) with Qt Creator.  
-Qt will be set up for cross compiling from a desktop Linux computer since Qt most likely will not be able to be natively compiled on a Raspberry Pi due to memory constraints.  
-
-Tested configurations are:
-* Raspberry Pi 3 Model B
-* Qt 5.9.3
-* Qt 5.10.0
-* Ubuntu 17.10 x64
-* Raspbian Stretch
-
-Hardware requirements
----------------------
-
-**Raspberry Pi:**
-* Raspberry Pi 2 or 3. The original Pi may, or may not work
-* [Adequate power supply](#power-supply)
-* 4GB or larger MicroSD card
-* A RTL2832U DVB-T stick to receive radio signals  
-(If you are using an Airspy device, compile and install the airspy library.)  
-(For details please see [here](https://github.com/airspy/host/#how-to-build-the-host-software-on-linux))  
-  
-**Host computer:**
-* Desktop/laptop computer running Ubuntu or an equivalent Debian Linux system  
-(Other distributions will work, but is not tested)  
-* A way to read/write MicroSD cards on a computer
-* Wireless or wired connection between desktop computer and Raspberry Pi
-
-
-Setup
------
-
-First we need to get Raspbian up and running on the Raspberry Pi.  
-Only [Raspbian Stretch](https://www.raspberrypi.org/downloads/raspbian/) or newer will work, since Raspbian Jessie or older have a too old GCC/GLIBC version.  
-The easiest way is to download [NOOBS.](https://www.raspberrypi.org/downloads/noobs/)  
-
-1. Download [NOOBS.](https://downloads.raspberrypi.org/NOOBS_latest)  
-   Make sure it's version 2.4.5 or later.  
-2. Follow the [official quick start guide](https://www.raspberrypi.org/learning/software-guide/quickstart/) for installing Raspian.  
-   ([Additional information](https://www.raspberrypi.org/documentation/installation/installing-images/README.md))  
-   ([Additional information](https://www.raspberrypi.org/documentation/installation/noobs.md))  
-
-**ON RASPBERRY PI:**
-
-3. Update Raspbian and update to the latest packages.  
-   ```
-   sudo rpi-update
-   sudo apt update
-   sudo apt dist-upgrade
-   ```
-   Reboot your Pi
-   ```
-   sudo reboot
-   ```
-   (Optional but highly recommended: Use raspi-config and set up SSH to your Pi so you can remote control it from another computer)  
-   (Optional: Use raspi-config and set GPU memory to 256)  
-   (More info about raspi-config [here](https://www.raspberrypi.org/documentation/configuration/raspi-config.md))  
-   ```
-   sudo raspi-config
-   ```
-4. Install the required packages for welle.io and RTL-SDR.  
-   ```
-   sudo apt install libfaad-dev libfftw3-dev librtlsdr-dev libusb-1.0-0-dev mesa-common-dev libglu1-mesa-dev libpulse-dev rtl-sdr
-   ```   
-5. Install a bunch of development files.  
-   (For simplicity we use build-dep, not everything is really needed, but it is easier this way.)  
-   Edit sources list in /etc/apt/sources.list and uncomment (remove #) the **deb-src** line:  
-   ```
-   sudo nano /etc/apt/sources.list
-   ```
-   Run update again to include deb-src in the repository list:  
-   ```
-   sudo apt update
-   ```
-   Install required libraries:
-   ```
-   sudo apt-get build-dep qt4-x11
-   sudo apt-get build-dep qtbase-opensource-src
-   ```
-   ```
-   sudo apt install libudev-dev libinput-dev libts-dev libxcb-xinerama0-dev libxcb-xinerama0
-   ```
-6. Prepare our target directory  
-   ```
-   sudo mkdir /usr/local/qt5pi
-   sudo chown pi:pi /usr/local/qt5pi
-   ```
-
-Now we need to set up the toolchain, environments and directories on our host computer.  
-
-**ON HOST COMPUTER:**
-
-7. Make a raspi folder.  
-   ```
-   mkdir ~/raspi
-   cd ~/raspi
-   ```
-8. Create a sysroot.  
-   Using rsync we can properly keep things synchronized in the future as well.  
-   Replace "raspberrypi.local" with the address of the Pi.  
-   Depending on your connection speed, this might take a while, since you are basically copying the entire contents of your Pi, to your host PC.  
-   It is important that you have already downloaded the required packages for welle.io on your Pi before you start rsync,
-   because the cross compiling environment will use this sysroot folder as its source instead of the packages you might have installed on your host PC.  
-   ```
-   mkdir sysroot sysroot/usr sysroot/opt
-   rsync -avz pi@raspberrypi.local:/lib sysroot
-   rsync -avz pi@raspberrypi.local:/usr/include sysroot/usr
-   rsync -avz pi@raspberrypi.local:/usr/lib sysroot/usr
-   rsync -avz pi@raspberrypi.local:/opt/vc sysroot/opt
-   ```
-9. Adjust symlinks to be relative. Use provided script.  
-   ```
-   wget https://raw.githubusercontent.com/riscv/riscv-poky/master/scripts/sysroot-relativelinks.py
-   chmod +x sysroot-relativelinks.py
-   ./sysroot-relativelinks.py sysroot
-   ```
-10. Get a GCC toolchain for ARM systems.  
-   ```
-   wget https://releases.linaro.org/components/toolchain/binaries/latest-5/arm-linux-gnueabihf/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf.tar.xz
-   tar -xvf gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf.tar.xz
-   ```
-   Or check the [website](https://releases.linaro.org/components/toolchain/binaries/latest-5/arm-linux-gnueabihf/) for the latest toolchain.  
-   If you are using a 32-bit system, download the 32-bit version. (i686)  
- 
-Building
---------
-
-11. Get Qt source.  
-    We will use the entire Qt system instead of only qtbase, which is probably overkill, but makes it way easier to manage.  
-	(Additional information about building Qt from source [here.](https://wiki.qt.io/Building_Qt_5_from_Git))  
-    The target directory is /usr/local/qt5pi on the Pi, the host tools like qmake will go to ~/raspi/qt5, while make install will target ~/raspi/qt5pi (this is what we will sync to the device).
-	Don't forget to adjust paths if you changed that. For some reason the ~/ in the paths may not work, if this the case just use full paths.
-	```
-	git clone git://code.qt.io/qt/qt5.git
-	cd qt5
-	git checkout 5.10
-	```
-	Currently, Qt version 5.10 is working.  
-	If the branch version does not exist, try another/newer branch number.  
-	Branch information for Qt is located [here.](http://code.qt.io/cgit/qt/qt5.git/)  
-	Now we need to initialize the repository, which will download all the submodules we need for Qt.  
-	We will not download qtwebkit or qtwebengine since these modules tend to create problems later, and are not needed for welle.io anyway.  
-	```
-	./init-repository --module-subset=default,-qtwebkit,-qtwebkit-examples,-qtwebengine
-	```
-	If the init failed due to network errors or similar, run the command again, but append **-f** at the end.  
-12. Configure Qt.  
-	You need to change **rpi-version** with a proper Raspberry Pi version.  
-	Use: **linux-rasp-pi-g++** for RPi, **linux-rasp-pi2-g++** for RPi2 and **linux-rasp-pi3-g++** for RPi3.  
-	If your system is 32-bit you may also edit device option to:  
-	```
-	-device-option CROSS_COMPILE=~/raspi/gcc-linaro-5.5.0-2017.10-i686_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
-	```
-	Now it's time to set up and configure Qt for cross compiling to the ARM platform.  
-	Don't forget to change **rpi-version**.  
-	```
-    ./configure -release -opengl es2 -device <rpi-version> -device-option CROSS_COMPILE=~/raspi/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -sysroot ~/raspi/sysroot -opensource -confirm-license -no-use-gold-linker -make libs -prefix /usr/local/qt5pi -extprefix ~/raspi/qt5pi -hostprefix ~/raspi/qt5 -v
-	```
-13. Compile Qt.  
-    (Optional: use switch **-j** to tell make how many cores your cpu has.)  
-	(Example, ***make -j4*** tells make to use four cpu cores, which greatly speeds up compile time.)  
-    ```
-	make
-	make install
-	```
-	If anything failed, you can clean everything with:  
-	```
-	git clean -dfx
-	```
-14. Deploy Qt to the device.  
-    We simply rsync everything from ~/raspi/qt5pi to the prefix we configured above.  
-    ```
-	cd ..
-    rsync -avz qt5pi pi@raspberrypi.local:/usr/local
-	```
-	Now we will build an example to test if everything went well.  
-	After the building is complete, we will copy the executable example to the device.  
-	```
-    cd qt5/qtbase/examples/opengl/qopenglwidget
-    ~/raspi/qt5/bin/qmake
-    make
-    scp qopenglwidget pi@raspberrypi.local:/home/pi
-    ```
-	
-Now we need to fix various links and issues on the Raspberry Pi.  
-
-**ON RASPBERRY PI:**
-
-15. Update the device to let the linker find the Qt libs:  
-	```
-    echo /usr/local/qt5pi/lib | sudo tee /etc/ld.so.conf.d/qt5pi.conf
-    sudo ldconfig
-	```
-    If you're facing issues with running the example, try to use 00-qt5pi.conf instead of qt5pi.conf, to introduce proper order.  
-16. Fix the EGL/GLES libraries.  
-	The device may have the Mesa version of libEGL and libGLESv2 in /usr/lib/arm-linux-gnueabihf, resulting Qt apps picking these instead of the real thing from /opt/vc/lib.  
-	This may be fine for X11 desktop apps not caring about OpenGL performance but is totally useless for windowing system-less, fullscreen embedded apps.  
-	You may want to save the originals somewhere, just in case.  
-	```
-	sudo mv /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0 /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0_backup
-	sudo mv /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0 /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0_backup
-	sudo ln -s /opt/vc/lib/libEGL.so /usr/lib/arm-linux-gnueabihf/libEGL.so.1.0.0
-	sudo ln -s /opt/vc/lib/libGLESv2.so /usr/lib/arm-linux-gnueabihf/libGLESv2.so.2.0.0
-	```
-	Please make sure to also add missing symbolic links:  
-	```
-	sudo ln -s /opt/vc/lib/libEGL.so /opt/vc/lib/libEGL.so.1
-    sudo ln -s /opt/vc/lib/libGLESv2.so /opt/vc/lib/libGLESv2.so.2
-	```
-17. Run qopenglwidget example, that we've built before.  
-    At this point it should just work at fullscreen with 60 FPS and mouse, keyboard, and possibly touch support.  
-    ```
-	sudo chmod +x /home/pi/qopenglwidget
-	./qopenglwidget
-	```
-
-If the example is running smoothly, (or rather, running at all), congratulations, you now have Qt 5 on your Raspberry Pi.  
-This is only half the battle though. Now we continue on to set up our host computer for welle.io cross compiling.  
-
-**ON HOST COMPUTER:**
-
-18. We now need the Qt environment for our host computer, including Qt Creator.  
-	The easiest way to obtain this, is to download a precompiled Qt binary for our operating system. In this case, Ubuntu.  
-	Go to [Qt website](https://www1.qt.io/download-open-source/#section-2) and download the appropriate package for your system.  
-	For Ubuntu, Use [Online Installer Linux 64-bit.](http://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run)  
-	Or the [32bit version](http://download.qt.io/official_releases/online_installers/qt-unified-linux-x86-online.run) if you have such a system.  
-	Before we begin, start another instance of terminal for a fresh start, or **cd ..** your way back to your home folder.  
-	```
-	wget http://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run
-	sudo chmod +x qt-unified-linux-x64-online.run
-	./qt-unified-linux-x64-online.run
-	```
-	Follow the instructions and install Qt, including submodules and Qt Creator.  
-	Select version 5.9.3 or higher, and a QT Creator version.  
-19. Clone welle.io.  
-    ```
-	git clone https://github.com/AlbrechtL/welle.io.git
-	```
-20. Start Qt Creator.  
-21. Open project and select the welle.io folder that you just cloned and click on welle.io.pro.  
-22. When the **configure project** screen comes up, click on **manage kits**  
-    Then go to the **Qt Versions** tab and click **Add...**  
-	Move to the **~/raspi/qt5/bin/qmake** folder and select the qmake there.  
-	**Details** on the bottom should say something along the lines of "Qt version 5.9.3 for Embedded linux"  
-	
-	Now, go over to the **Compilers** tab and add **GCC C**  
-	Name it "GCC ARM" or similar so we can easily identify it later.  
-	In **Compiler path** browse to ~/raspi/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabihf/bin and select **arm-linux-gnueabihf-gcc**  
-	ABI should read "arm-linux-generic-elf-32bit"  
-	
-	Once again, click on **Add** and add a **GCC C++** compiler.  
-	Name it "G++ ARM" or similar.  
-	Compiler path should be the same as the previous one, but select **arm-linux-gnueabihf-g++** instead of "arm-linux-gnueabihf-gcc"  
-	ABI should read "arm-linux-generic-elf-32bit", same as the previous one.  
-	
-	The last thing we could set up is in the **Debuggers** tab. This one isn't really needed, but lets do it anyway.  
-	Press **Add** and name it "ARM GDB" or similar and the path should be the same as previous, but select **arm-linux-gnueabihf-gdb**.  
-	With all this done, we can make a new kit.  
-	
-	Click on the **Kits** tab and **add**.  
-	Name it "Raspberry Pi" or similar.  
-	Device type: **Generic Linux Device**  
-	Sysroot: **~/raspi/sysroot**  
-	Compiler: C: **GCC ARM** (Or what you named your GCC compiler.)  
-	Compiler: C++: **G++ ARM** (Or what you named your G++ compiler.)  
-	Debugger: **ARM GDB** (Or what you named your GDB debugger.)  
-	Qt version: **Qt 5.9.3 (qt5)** (The one you made, not the default one which most likely already was present in the "Qt Versions" tab.)  
-
-    With all this done, click apply and ok.  
-	Now your newly created "Raspberry Pi" kit should appear in the **Configure project** section. Select it and press **configure project.**  
-	Stuff should happen and you should be greeted with a projects tree view and some other stuff, probably a Project "MESSAGE" message of some sort too.  
-23. In order to compile welle.io for Raspberry Pi successfully, we need to do one adjustment to the source code.  
-    Double click on **welle.io.pro** in the tree view,  
-	scroll down to where it says **unix:!macx:!android:** find the line which says **CONFIG += airspy**  
-	and comment it out by putting a **#** in front of it.  
-	(Unless you need Airspy support.)  
-	```
-	#CONFIG += airspy
-	```
-	Save file (ctrl+s)  
-24.	Now click on the monitor icon at the left hand side, most likely saying "welle.io debug" or similar, change the build to **release**.  
-	Wait a couple of seconds until the green arrows lights up again.  
-25. Click on the hammer icon, which means **build project**.  
-    Qt Creator will build welle.io and output the finished program into a "release" folder most likely named "build-welle-io-Raspberry_Pi-Release".  
-26. Open a new terminal and navigate to the release folder.  
-    Transfer the program over to the Raspberry Pi.
-    ```
-	cd ~/build-welle-io-Raspberry_Pi-Release
-	scp welle-io pi@raspberrypi.local:/home/pi
-	```
-	
-**ON RASPBERRY PI:**
-
-27. Find the file **welle-io** and run it to enjoy welle.io on your Raspberry Pi.  
-    Open a new terminal and type:  
-    ```
-	./welle-io --disable-splash
-	```
-    The **--disable-splash** argument is used because otherwise welle.io will crash on Raspberry Pi.  
-    See the troubleshooting section at the bottom for details.  
-    	
-Power supply
-============
-
-Raspberry Pi 3 requires significantly more power than the original Pi, which could easily be run off a generic USB phone charger.  
-The problem with such chargers is the fact that the USB cable is almost always too thin to reliably supply the required 5 volts the Pi 3 needs to run.  
-Also, a phone charger is not necessarily a good power supply in general.  
-Even powerful Apple 12W iPad chargers which outputs amps and amps of current, fails to deliver more than 4.6-4.8 volts to the Pi, which forces the Pi to go into "undervoltage" mode.  
-In undervoltage mode, the Pi reduces the speed of the CPU and GPU, which affects the entire operation of the system.  
-Hiccups in other parts of the system might occur, such as in RAM and I/O chips.  
-Too low voltage is noticeable by a lightning bolt icon in the top right corner of the screen.  
-More info about the power requirements [here](https://www.raspberrypi.org/help/faqs/#powerReqs).  
-The official [Raspberry Pi universal power supply](https://www.raspberrypi.org/products/raspberry-pi-universal-power-supply/) is a more beefy (and proper) power supply that provides 5.1 volts over a thicker cable, which mitigates the power loss experienced in thinner generic USB cables.  
-However, when running with lots of peripherals, like a touch screen, mouse, keyboard, gamepad, bluetooth dongle, Wi-Fi dongle, RTL-SDR dongle and whatnot, even an official power supply struggles.  
-The solution is to somehow add another official power supply, or an even beefier power supply that can output 5.1 volt, 4+ amps.  
-
-When the Pi goes into undervoltage mode, it may or may not affect the SDR dongle, and its operation with welle.io, causing random malfunctions in radio reception.  
-The SD card might be corrupt if it is written to while the Pi experiences undervoltage.  
-Using the Pi in undervoltage mode is not the end of the world, but expect the unexpected.
-
-Troubleshooting
-===============
-
-* If you have no audio out when using an external sound card like a HiFiBerry DAC+, IQAudIO PiDAC+, PiMoroni pHAT DAC, JustBoom or any USB DAC, try installing Pulseaudio.  
-  ```
-  sudo apt install pulseaudio
-  ```
-* If you for some reason don't have any text in either the qopenglwidget example or in welle.io and get a message like this in the terminal:  
-  ```
-  QFontDatabase: Cannot find font directory /usr/local/qt5pi/lib/fonts.
-  Note that Qt no longer ships fonts. Deploy some (from http://dejavu-fonts.org for example) or switch to fontconfig.
-  ```
-  It means the fonts folder for the Qt environment does not exist.
-  To fix this, we simply make the folder and populate it with some fonts.
-  ```
-  mkdir /usr/local/qt5pi/lib/fonts
-  ```
-  Then we steal a font from the system font folder.  
-  ```
-  cp /usr/share/fonts/truetype/freefont/FreeSans.ttf /usr/local/qt5pi/lib/fonts/FreeSans.ttf
-  ```
-  You can basically put any font you want in the fonts folder.  
-* If your screen goes blank after a set time, have a look at the [official documentation](https://www.raspberrypi.org/documentation/configuration/screensaver.md) for screensavers.  
-* Error: **EGLFS: OpenGL windows cannot be mixed with others.** appears, this means the splash screen is not working correctly on Raspberry Pi.  
-To work around this issue, start welle.io with the argument **--disable-splash**.  
-```
-./welle-io --disable-splash
-```
-* When using VNC or another form of remote desktop software,  
-OpenGLES will not output any Qt windows to the remote desktop,  
-only a fullscreen window on an attached screen, such as HDMI or DSI port.  
-To work around this issue, use argument **-platform xcb** when starting welle.io.  
-You might have to install the proper xcb libraries if these are not present on your Raspberry Pi.
-```
-./welle-io -platform xcb
-```
-
-Known issues
------------
-* When using a touch screen, the user interface will be "transparent" to your screen touches.  
-This means that you can accidentally click on icons on the desktop itself, behind the user interface of the program, while operating the program as normal.  
-It is not known if this is a Qt issue, welle.io issue or a Raspbian driver issue.  
-For now, take care when operating the user interface with a touch screen.
diff --git a/README.md b/README.md
index e60eab8..6f801cd 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 [welle.io](https://www.welle.io)
 =====================
-- Linux, macOS (Travis): [![Travis Build Status](https://travis-ci.org/AlbrechtL/welle.io.svg?branch=master)](https://travis-ci.org/AlbrechtL/welle.io)
+- Linux, macOS (Travis): [![Travis Build Status](https://app.travis-ci.com/AlbrechtL/welle.io.svg?branch=next)](https://app.travis-ci.com/AlbrechtL/welle.io)
 - Windows (AppVeyor): [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/yipsu95pb4ecdofe?svg=true)](https://ci.appveyor.com/project/AlbrechtL/welle-io)
 
 This repository contains the implementation of an SDR DAB/DAB+ receiver.  
@@ -16,12 +16,11 @@ Table of contents
   * [Supported Hardware](#supported-hardware)
   * [Building](#building)
     * [General Information](#general-information)
-    * [Ubuntu Linux 18.04 LTS](#ubuntu-linux-1804-lts)
-    * [Windows 10](#windows-10)
+    * [Debian / Ubuntu Linux](#debian--ubuntu-linux)
+    * [Windows 10 / 11](#windows-10--11)
     * [macOS](#macos)
     * [CMake instead of Qt Creator (Windows, Linux, macOS)](#cmake-instead-of-qt-creator-windows-linux-macos)
     * [Android](#android)
-    * [Raspberry Pi 2 and 3](#raspberry-pi-2-and-3)
   * [welle-cli](#welle-cli)
     * [Usage](#usage-of-welle-cli)
     * [Backend options](#backend-options)
@@ -31,28 +30,34 @@ Table of contents
 
 Download
 ========
-##### Stable binaries
-* [welle.io for **Windows**, **Linux** and **Android (APK)**](http://github.com/AlbrechtL/welle.io/releases) 
-* [welle.io for **Android at Google Play**](https://play.google.com/store/apps/details?id=io.welle.welle)
-* welle.io for **Debian** or **Ubuntu** 19.04+
+### Stable binaries
+* [**Windows**, **Linux**, **macOS** and **Android**](http://github.com/AlbrechtL/welle.io/releases) 
+* **Debian** or **Ubuntu** 19.04+
   * `apt install welle.io`, see the /usr/share/doc/welle.io/README.Debian for maintainer notes
-* welle.io for **macOS**
-  * [through **MacPorts port**](https://ports.macports.org/port/welle.io/summary) (requires [MacPorts](https://www.macports.org/)) 
-    * `sudo port install welle.io`
-    * `sudo port install welle.io +cli` (if you wish to install also welle-cli)
+* **macOS** (requires [MacPorts](https://www.macports.org/)) 
+   * `sudo port install welle.io`
+   * `sudo port install welle.io +cli` (if you wish to install also welle-cli)
+* **FreeBSD**
+  * Building from sources (requires ports tree to be checked out at `/usr/ports/`)
+    ```
+    cd /usr/ports/audio/welle.io/
+    make install clean
+    ```
+  * Installing the binary package
+    ```
+    pkg install welle.io`
+    ```
+* [**Android at Google Play**](https://play.google.com/store/apps/details?id=io.welle.welle) (outdated)
 
 If you discovered an issue please open a new [issue](https://github.com/AlbrechtL/welle.io/issues).
 
-##### Developer version
-welle.io is under heavy development. You can also try the latest developer builds. But PLEASE BE WARNED the builds are automatically created and untested.
- * [welle.io nightly builds for *Windows* & *Linux AppImage*](https://bintray.com/albrechtl/welle.io/welle.io_nightly#files)
- * welle.io devel builds on *macOS MacPorts* are updated perdiodically manually and can be installed through [port welle.io-devel](https://ports.macports.org/port/welle.io-devel/summary). The port has no maintainer so please feel free to update it yourself in case you need to use a more recent devel version.
-   * `sudo port install welle.io-devel`
+### Unstable developer version
+welle.io is under development. You can also try the latest developer builds. But PLEASE BE WARNED the builds are automatically created and untested.
 
-##### Compilation from source
-To use it on a **Raspberry Pi** you have to compile welle.io directly from the sources. See [instructions to compile for Raspberry Pi](#raspberry-pi-2-and-3).  
-Note that welle.io source also ships with a [**Homebrew**](https://brew.sh/) formula for macOS. See [instructions to install with Homebrew](#homebrew).  
-You can find [more instructions to compile welle.io on various systems](#building) below.
+* [welle.io nightly builds](https://welle-io-nightlies.albrechtloh.de/) (Windows, Linux, macOS, Android)
+
+* macOS: welle.io devel builds on *macOS MacPorts* are updated periodically manually and can be installed through [port welle.io-devel](https://ports.macports.org/port/welle.io-devel/summary). The port has no maintainer so please feel free to update it yourself in case you need to use a more recent devel version
+  * `sudo port install welle.io-devel`
 
 Usage
 =====
@@ -65,6 +70,18 @@ Parameter | Description
 --dump-file | Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert (https://www.basicmaster.de/xpadxpert).
 --log-file | Log file name. Redirects all log output texts to a file.
 
+Keyboard shortcuts & hotkeys
+
+Keystroke | Action
+------ | ----------
+F1-F12, 1-9, 0, Ctrl+1-9, Ctrl+0 | Play the station no. 'x' in the stations list: <br />`1` for station no. `1`, <br />`0` for station no. `10`, <br />`Ctrl+1` for station no. `11`...
+S, Media Play, Media Stop, Media Pause, Media Play/Pause | Start playback/Stop
+N, Media next | play next station in list
+P, Media Previous | play previous station
+M, Volume Mute | mute/unmute
+Ctrl+Up, Volume Up | Volume Up
+Ctrl+Down, Volume Down | Volume Down
+
 Supported Hardware
 ====================
 The following SDR devices are supported
@@ -77,14 +94,14 @@ The following SDR devices are supported
     * Devices supported by uhd are supported via [SoapyUHD](https://github.com/pothosware/SoapyUHD/wiki)
     * One limitation is of course that the SDR devices must be tunable to the DAB+ frequencies.
 
-SoapySDR Notes
----
+### SoapySDR Notes
+
 
-### LimeSDR
+#### LimeSDR
 
 Connect the antenna to the RX1_W port and configured SoapySDR antenna option to `LNAW`. `SoapySDRUtil --probe=driver=lime` may show other possible options.
 
-### USRP
+#### USRP
 
 Configured SoapySDR driver arguments option to `driver=uhd`. Configure also antenna and clock source option. To list possible values for antenna and clock source use the command `SoapySDRUtil --probe=driver=uhd`.
 
@@ -100,35 +117,45 @@ The following libraries and their development files are needed:
 * librtlsdr
 * libusb
 
-Ubuntu Linux 18.04 LTS
+Debian / Ubuntu Linux
 ---
-This section shows how to compile welle.io on Ubuntu 16.04 LTS and Ubuntu 18.04 LTS. 
+This section shows how to compile welle.io on Debian or Ubuntu (tested with Ubuntu 20.04).
 
-1. Install Qt 5.10 including the Qt Charts module by using the the "Qt Online Installer for Linux" https://www.qt.io/download-open-source/
+1. Install the base requirements
 
-2. Install the following packages
+```
+sudo apt install git build-essential
+```
 
-  ```
-# sudo apt install libfaad-dev libmpg123-dev libmpg123-dev libfftw3-dev librtlsdr-dev libusb-1.0-0-dev mesa-common-dev libglu1-mesa-dev libpulse-dev libsoapysdr-dev libairspy-dev libmp3lame-dev
-  ```
+2. Install the following non-Qt packages
 
-3. Clone welle.io
+```
+sudo apt install libfaad-dev libmpg123-dev libfftw3-dev librtlsdr-dev libusb-1.0-0-dev mesa-common-dev libglu1-mesa-dev libpulse-dev libsoapysdr-dev libairspy-dev libmp3lame-dev
+```
 
-  ```
-# git clone https://github.com/AlbrechtL/welle.io.git
-  ```
+3. Install the following Qt packages
 
-4. Start Qt Creator and open the project file `welle.io.pro` inside the folder "welle.io".
-5. Build welle.io
-6. Run welle.io and enjoy it
+```
+sudo apt install libqt5charts5-dev qtbase5-dev qttools5-dev-tools qtquickcontrols2-5-dev libqt5quick5 qtdeclarative5-dev qtmultimedia5-dev libqt5quick5 libqt5multimedia5-plugins qml-module-qt-labs-settings qml-module-qtquick-window2 qml-module-qtquick2 qml-module-qtquick-layouts qml-module-qtquick-dialogs qml-module-qtquick-controls2 qml-module-qtquick-controls qml-module-qtquick-templates2 qml-module-qtquick-privatewidgets qml-module-qtquick-localstorage qml-module-qtcharts qml-module-qtgraphicaleffects qml-module-qt-labs-folderlistmodel qtcreator
+```
+
+4. Clone welle.io
 
-Windows 10
+```
+git clone https://github.com/AlbrechtL/welle.io.git
+```
+
+5. Start Qt Creator and open the project file `welle.io.pro` inside the folder "welle.io".
+6. Build welle.io
+7. Run welle.io and enjoy it
+
+Windows 10 / 11
 ---
 A compiled version can be found at the [release page](https://github.com/AlbrechtL/welle.io/releases)
 
 This sections shows how to compile welle.io on Windows 10. Windows 7 should also be possible but is not tested. 
 
-1. Install Qt 5.10 including the Qt Charts and mingw modules by using the the "Qt Online Installer for Windows" https://www.qt.io/download-open-source/
+1. Install Qt 5.10 including the Qt Charts and mingw modules by using the "Qt Online Installer for Windows" https://www.qt.io/download-open-source/
 2. Clone welle.io https://github.com/AlbrechtL/welle.io.git e.g. by using [TortoiseGit](https://tortoisegit.org).
 3. Clone the welle.io Windows libraries https://github.com/AlbrechtL/welle.io-win-libs.git.
 4. Start Qt Creator and open the project file `welle.io.pro` inside the folder "welle.io".
@@ -147,13 +174,13 @@ Assuming that you have [Homebrew](https://brew.sh/) installed, execute the follo
 1. Use the welle.io repository as a "tap" (alternative package repository):
 
 ```
-# brew tap AlbrechtL/welle_io https://github.com/AlbrechtL/welle.io
+brew tap AlbrechtL/welle_io https://github.com/AlbrechtL/welle.io
 ```
 
 2. Install welle.io (and dependencies):
 
 ```
-# brew install AlbrechtL/welle_io/welle.io
+brew install AlbrechtL/welle_io/welle.io
 ```
 
 ### MacPorts
@@ -165,7 +192,7 @@ You can either use the welle.io port available in macports, or compile with QT C
 This is the easiest way and will manage the dependencies for you.
 Variants enabled by default are : "airspy" "rtlsdr" "soapysdr". Each enables compilation with that specific input device library.
 ```
-# sudo port install welle.io
+sudo port install welle.io
 ```
 Additional variants are : "cli" (to install also welle-cli) "profiling" & "kiss_fft".
 
@@ -173,7 +200,7 @@ With MacPorts, welle.io is installed as a bundle app in `/Applications/MacPorts`
 
 You can also use welle.io-devel port if you prefer:
 ```
-# sudo port install welle.io-devel
+sudo port install welle.io-devel
 ```
 
 #### compile with QT Creator
@@ -181,57 +208,76 @@ You can also use welle.io-devel port if you prefer:
 You need to install the dependencies with MacPorts first, assuming you have [MacPorts](https://www.macports.org/) installed:
 
 ```
-# sudo port install fftw-3-single faad2 rtl-sdr libusb mpg123 lame
+sudo port install fftw-3-single faad2 rtl-sdr libusb mpg123 lame
 ```
 
 1. Install Qt 5.10 with Qt Creator directly from Qt website, not through MacPorts.
 2. Clone welle.io
 
-  ```
-# git clone https://github.com/AlbrechtL/welle.io.git
-  ```
+```
+git clone https://github.com/AlbrechtL/welle.io.git
+```
 
 3. Open welle.io.pro with Qt Creator.
 4. Make sure in Qt Creator, "Projects, Build&Run, Run" that the checkbox "Add build library path to DYLD..." is off.
 5. Build and run.
 
-CMake instead of Qt Creator (Windows, Linux, macOS)
+FreeBSD
+---
+This section describes how to build welle.io from sources on FreeBSD 12.2 and 13.0.
+
+1. You will need the following dependencies, either built from the
+   ports or installed as a binary package. You may also build them
+   yourself.
+
+```
+pkg install alsa-lib faad lame mpg123 pkgconf cmake qt5-charts \
+    qt5-core qt5-declarative qt5-gui qt5-multimedia qt5-network \
+    qt5-quickcontrols2 qt5-widgets qt5-buildtools qt5-qmake \
+    rtl-sdr fftw3-float fftw3
+```
+   For SoapySDR support, you will also need `soapysdr`. For AirSpy support, you will need `airspy`.
+
+2. Now follow the build instructions for CMake as indicated below.
+
+
+CMake instead of Qt Creator (Windows, Linux, macOS, FreeBSD)
 ---
 
 As an alternative to Qt Creator, CMake can be used for building welle.io after installing dependencies and cloning the repository. On Linux, you can also use CMake to build [**welle-cli**](#welle-cli), the command-line backend testing tool that does not require Qt.
 
 1. Create a build directory inside the repository and change into it
 
-  ```
-# mkdir build
-# cd build
-  ```
+```
+mkdir build
+cd build
+```
 
 2. Run CMake. To enable support for RTL-SDR add the flag `-DRTLSDR=1` (requires librtlsdr) and for SoapySDR add `-DSOAPYSDR=1` (requires SoapySDR compiled with support for each desired hardware, e.g. UHD for Ettus USRP, LimeSDR, Airspy or HackRF). By default, CMake will build both welle-io and welle-cli. Use `-DBUILD_WELLE_IO=OFF` or `-DBUILD_WELLE_CLI=OFF` to compile only the one you need.
 
-  ```
-# cmake ..
-  ```
+```
+cmake ..
+```
 
   or to enable support for both RTL-SDR and Soapy-SDR:
 
-  ```
-# cmake .. -DRTLSDR=1 -DSOAPYSDR=1
-  ```
+```
+cmake .. -DRTLSDR=1 -DSOAPYSDR=1
+```
 
   If you wish to use KISS FFT instead of FFTW (e.g. to compare performance), use `-DKISS_FFT=ON`.
 
 3. Run make (or use the created project file depending on the selected generator)
 
-  ```
-# make
-  ```
+```
+make
+```
 
 4. Install it (as super-user)
 
-  ```
-# make install
-  ```
+```
+make install
+```
 
 5. Run welle.io and enjoy it
 
@@ -243,22 +289,18 @@ welle.io uses the "RTL2832U driver" from Martin Marinov, to be found at the [Goo
 
 This sections shows how to compile welle.io for Android.
 
-1. Install Qt 5.12 for Android including the Qt Charts and Qt Remote Objects modules by using the the "Qt Online Installer for Windows" https://www.qt.io/download-open-source/
-2. Follow the side https://doc.qt.io/qt-5/androidgs.html to install the Android build enviroment
+1. Install Qt 5.12 for Android including the Qt Charts and Qt Remote Objects modules by using the "Qt Online Installer for Windows" https://www.qt.io/download-open-source/
+2. Follow the side https://doc.qt.io/qt-5/androidgs.html to install the Android build environment
 3. Clone welle.io https://github.com/AlbrechtL/welle.io.git
 
-  ```
-# git clone https://github.com/AlbrechtL/welle.io.git
-  ```
+```
+git clone https://github.com/AlbrechtL/welle.io.git
+```
   
 4. Start Qt Creator and open the project file `welle.io.pro` inside the folder "welle.io".
 5. Build welle.io
 6. Run welle.io and enjoy it
 
-Raspberry Pi 2 and 3
----
-To build and run welle.io on a Raspberry Pi 2 and 3 with GPU acceleration, please read [this guide](https://github.com/AlbrechtL/welle.io/blob/master/RASPBERRY-PI.md).
-
 welle-cli
 ==
 
@@ -327,7 +369,7 @@ Examples:
 
 Limitations
 ===
-* Windows 8 and older are not offically supported
+* Windows 8 and older are not officially supported
 
 Development
 ===
diff --git a/THANKS b/THANKS
index f3f2f78..0beac41 100644
--- a/THANKS
+++ b/THANKS
@@ -23,8 +23,8 @@ welle.io uses parts from the following programs
 Icons:
 - Navigation icons made by Gregor Cresnar from www.flaticon.com (License CC 3.0 BY)
   (http://www.flaticon.com/authors/gregor-cresnar)
-- Speaker icons made by smashicons from www.flaticon.com (License CC 3.0 BY)
-  (https://smashicons.com)
+- Speaker, play, stop icons made by https://www.freepik.com from https://www.flaticon.com/
+  (https://www.flaticon.com/de/packs/media-and-technology)
 - Antenna icon made by photo3idea_studio from www.flaticon.com (License CC 3.0 BY)
   (https://www.flaticon.com/authors/photo3idea-studio)
 - Application icon made by Freepik from www.flaticon.com (License CC 3.0 BY)
diff --git a/debian/changelog b/debian/changelog
index b3d1e0d..91db801 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,4 +1,4 @@
-welle.io (2.2-2) UNRELEASED; urgency=low
+welle.io (2.4-1) UNRELEASED; urgency=low
 
   * Move source package lintian overrides to debian/source.
   * Bump debhelper from old 11 to 12.
@@ -9,8 +9,9 @@ welle.io (2.2-2) UNRELEASED; urgency=low
   * Bump debhelper from old 12 to 13.
   * Update standards version to 4.5.1, no changes needed.
   * Avoid explicitly specifying -Wl,--as-needed linker flag.
+  * New upstream release.
 
- -- Debian Janitor <janitor@jelmer.uk>  Wed, 26 Aug 2020 13:55:36 -0000
+ -- Debian Janitor <janitor@jelmer.uk>  Mon, 14 Mar 2022 18:20:32 -0000
 
 welle.io (2.2-1) unstable; urgency=medium
 
diff --git a/debian/patches/cli-path-patch b/debian/patches/cli-path-patch
index 092fd4e..ee975d1 100644
--- a/debian/patches/cli-path-patch
+++ b/debian/patches/cli-path-patch
@@ -23,9 +23,11 @@ Forwarded: <no|not-needed|url proving that it has been forwarded>
 Reviewed-By: <name and email of someone who approved the patch>
 Last-Update: 2019-10-23
 
---- welle.io-2.0.orig/src/welle-cli/webradiointerface.cpp
-+++ welle.io-2.0/src/welle-cli/webradiointerface.cpp
-@@ -439,10 +439,10 @@ bool WebRadioInterface::dispatch_client(
+Index: welle.io/src/welle-cli/webradiointerface.cpp
+===================================================================
+--- welle.io.orig/src/welle-cli/webradiointerface.cpp
++++ welle.io/src/welle-cli/webradiointerface.cpp
+@@ -462,10 +462,10 @@ bool WebRadioInterface::dispatch_client(
      else {
          if (req.is_get) {
              if (req.url == "/") {
diff --git a/io.welle.welle-gui.json b/io.welle.welle-gui.json
new file mode 100644
index 0000000..243cf51
--- /dev/null
+++ b/io.welle.welle-gui.json
@@ -0,0 +1,57 @@
+{
+    "app-id": "io.welle.welle-gui",
+    "runtime": "org.kde.Platform",
+    "runtime-version": "5.15",
+    "sdk": "org.kde.Sdk",
+    "command": "welle-io",
+    "finish-args": [
+        "--share=network",
+        "--filesystem=host",
+        "--socket=pulseaudio",
+        "--socket=wayland",
+        "--socket=x11",
+        "--device=dri"
+    ],
+    "modules": [
+        {
+		"name": "fftw",
+		"buildsystem": "autotools",
+		"config-opts": ["--enable-float","--enable-sse"],
+		"sources": [ {"type": "archive", "url": "http://fftw.org/fftw-3.3.9.tar.gz", "md5":"50145bb68a8510b5d77605f11cadf8dc" } ]
+        },
+        {
+		"name": "libfaad",
+		"buildsystem": "autotools",
+		"sources": [ {"type": "git", "url": "https://salsa.debian.org/multimedia-team/faad2.git" } ]
+        },
+	{
+		"name": "libusb",
+		"buildsystem": "autotools",
+		"sources": [ {"type": "git", "url": "https://github.com/libusb/libusb.git" } ]
+	},
+	{
+		"name": "librtlsdr",
+		"buildsystem": "cmake",
+		"sources": [ {"type": "git", "url": "git://git.osmocom.org/rtl-sdr.git" } ]
+	},
+	{
+		"name": "libairspy",
+		"buildsystem": "cmake",
+		"sources": [ {"type": "git", "url": "https://github.com/airspy/airspyone_host.git" } ]
+	},
+	{
+		"name": "SoapySDR",
+		"buildsystem": "cmake",
+		"config-opts": ["-DCMAKE_BUILD_TYPE=Release"],
+		"sources": [ {"type": "git", "url": "https://github.com/pothosware/SoapySDR.git" } ]
+        },
+        {
+		"name": "welle.io",
+		"buildsystem": "qmake",
+		"build-commands" : ["cp src/welle-gui/welle-io /app/bin"],
+		"config-opts": [ "LIBS+=-L/app/lib"],
+		"sources": [ {"type": "dir", "path": "."} ]
+        }
+    ]
+}
+
diff --git a/src/backend.pri b/src/backend.pri
index 8952b40..077def7 100644
--- a/src/backend.pri
+++ b/src/backend.pri
@@ -56,7 +56,7 @@ macx {
     LIBS    += -lmp3lame
     CONFIG  += airspy
     CONFIG  += rtl_sdr
-    #CONFIG  += soapysdr
+    CONFIG  += soapysdr
 }
 
 android {
diff --git a/src/backend/dab-constants.cpp b/src/backend/dab-constants.cpp
index f59cde2..7a50a63 100644
--- a/src/backend/dab-constants.cpp
+++ b/src/backend/dab-constants.cpp
@@ -31,7 +31,7 @@
 #include <exception>
 #include <sstream>
 
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
 #ifdef QT_CORE_LIB
     #include <QtGlobal>
 #else
@@ -274,7 +274,7 @@ const char* DABConstants::getLanguageName(int language)
         case 70: languageName = QT_TR_NOOP("Vietnamese"); break;
         case 71: languageName = QT_TR_NOOP("Uzbek"); break;
         case 72: languageName = QT_TR_NOOP("Urdu"); break;
-        case 73: languageName = QT_TR_NOOP("Ukranian"); break;
+        case 73: languageName = QT_TR_NOOP("Ukrainian"); break;
         case 74: languageName = QT_TR_NOOP("Thai"); break;
         case 75: languageName = QT_TR_NOOP("Telugu"); break;
         case 76: languageName = QT_TR_NOOP("Tatar"); break;
diff --git a/src/backend/dab_decoder.cpp b/src/backend/dab_decoder.cpp
index 1fc7223..2fae606 100644
--- a/src/backend/dab_decoder.cpp
+++ b/src/backend/dab_decoder.cpp
@@ -54,6 +54,8 @@ MP2Decoder::MP2Decoder(SubchannelSinkObserver* observer, bool float32) : Subchan
 	scf_crc_len = -1;
 	lsf = false;
 
+    // Reset DAB+ ACC error
+    observer->ACCFrameError(0);
 
 	int mpg_result;
 
diff --git a/src/backend/dabplus_decoder.cpp b/src/backend/dabplus_decoder.cpp
index 50dceac..838a91d 100644
--- a/src/backend/dabplus_decoder.cpp
+++ b/src/backend/dabplus_decoder.cpp
@@ -93,7 +93,7 @@ void SuperframeFilter::Feed(const uint8_t *data, size_t len) {
 	rs_dec.DecodeSuperframe(sf, sf_len, total_corr_count, uncorr_errors);
 
 	// forward statistics if errors present
-	if(total_corr_count || uncorr_errors)
+    //if(total_corr_count || uncorr_errors)
 		observer->FECInfo(total_corr_count, uncorr_errors);
 
 
@@ -451,8 +451,7 @@ AACDecoderFAAD2::~AACDecoderFAAD2() {
 void AACDecoderFAAD2::DecodeFrame(uint8_t *data, size_t len) {
 	// decode audio
 	uint8_t* output_frame = (uint8_t*) NeAACDecDecode(handle, &dec_frameinfo, data, len);
-	if(dec_frameinfo.error)
-		observer->AudioWarning("AAC");
+    observer->ACCFrameError(dec_frameinfo.error);
 
 	// abort, if no output at all
 	if(dec_frameinfo.bytesconsumed == 0 && dec_frameinfo.samples == 0)
diff --git a/src/backend/decoder_adapter.cpp b/src/backend/decoder_adapter.cpp
index f7920bf..a06046d 100644
--- a/src/backend/decoder_adapter.cpp
+++ b/src/backend/decoder_adapter.cpp
@@ -37,7 +37,7 @@ DecoderAdapter::DecoderAdapter(ProgrammeHandlerInterface &mr, int16_t bitRate, A
     else if (dabModus == AudioServiceComponentType::DABPlus)
         decoder = std::make_unique<SuperframeFilter>(this, true, false);
     else
-        throw std::runtime_error("DecoderAdapter: Unkonwn service component");
+        throw std::runtime_error("DecoderAdapter: Unknown service component");
 
     // Open a dump file (XPADxpert) if the user defined it
     if (!dumpFileName.empty()) {
@@ -94,8 +94,8 @@ void DecoderAdapter::PutAudio(const uint8_t *data, size_t len)
 {
     // Then len is given in bytes. For stereo it is the double times of mono.
     // But we need two channels even if we have mono.
-    // Mono: len = len / 2 * 2 We have len to devide by 2 and for two channels we have multiply by two
-    // Stereo: len = len / 2 We just need to devide by 2 because it is stereo
+    // Mono: len = len / 2 * 2 We have len to divide by 2 and for two channels we have multiply by two
+    // Stereo: len = len / 2 We just need to divide by 2 because it is stereo
     size_t bufferSize = audioChannels == 2 ? len/2 : len;
     std::vector<int16_t> audio(bufferSize);
 
@@ -130,10 +130,9 @@ void DecoderAdapter::AudioError(const std::string &hint)
     frameErrorCounter++;
 }
 
-void DecoderAdapter::AudioWarning(const std::string &hint)
+void DecoderAdapter::ACCFrameError(const unsigned char error)
 {
-    (void)hint;
-    myInterface.onAacErrors(1);
+    myInterface.onAacErrors(error);
 }
 
 void DecoderAdapter::FECInfo(int total_corr_count, bool uncorr_errors)
diff --git a/src/backend/decoder_adapter.h b/src/backend/decoder_adapter.h
index 6d2cf28..00c8118 100644
--- a/src/backend/decoder_adapter.h
+++ b/src/backend/decoder_adapter.h
@@ -54,7 +54,7 @@ class DecoderAdapter: public DabProcessor, public SubchannelSinkObserver, public
         virtual void PutAudio(const uint8_t* /*data*/, size_t /*len*/);
         virtual void ProcessPAD(const uint8_t* /*xpad_data*/, size_t /*xpad_len*/, bool /*exact_xpad_len*/, const uint8_t* /*fpad_data*/);
         virtual void AudioError(const std::string& /*hint*/);
-        virtual void AudioWarning(const std::string& /*hint*/);
+        virtual void ACCFrameError(const unsigned char /* error*/);
         virtual void FECInfo(int /*total_corr_count*/, bool /*uncorr_errors*/);
 
         // PADDecoderObserver impl
diff --git a/src/backend/eep-protection.cpp b/src/backend/eep-protection.cpp
index d32eaa4..a8d68d3 100644
--- a/src/backend/eep-protection.cpp
+++ b/src/backend/eep-protection.cpp
@@ -140,7 +140,7 @@ bool EEPProtection::deconvolve(const softbit_t *v, int32_t size, uint8_t *outBuf
         }
     }
     //  we had a final block of 24 bits  with puncturing according to PI_X
-    //  This block constitues the 6 * 4 bits of the register itself.
+    //  This block constitutes the 6 * 4 bits of the register itself.
     for (i = 0; i < 24; i ++) {
         if (PI_X [i] != 0)
             viterbiBlock[viterbiCounter] = v [inputCounter ++];
diff --git a/src/backend/fib-processor.cpp b/src/backend/fib-processor.cpp
index 9cd170c..24942ed 100644
--- a/src/backend/fib-processor.cpp
+++ b/src/backend/fib-processor.cpp
@@ -1,5 +1,5 @@
 /*
- *    Copyright (C) 2018
+ *    Copyright (C) 2020
  *    Matthias P. Braendli (matthias.braendli@mpb.li)
  *
  *    Copyright (C) 2014
@@ -108,7 +108,7 @@ void FIBProcessor::process_FIG0 (uint8_t *d)
 }
 
 
-//  FOG0/0 indicated a change in channel organization
+//  FIG0/0 indicated a change in channel organization
 //  we are not equipped for that, so we just return
 //  control to the init
 void FIBProcessor::FIG0Extension0 (uint8_t *d)
@@ -127,8 +127,6 @@ void FIBProcessor::FIG0Extension0 (uint8_t *d)
     }
 
     changeflag  = getBits_2 (d, 16 + 16);
-    if (changeflag == 0)
-        return;
 
     highpart        = getBits_5 (d, 16 + 19) % 20;
     (void)highpart;
@@ -137,7 +135,15 @@ void FIBProcessor::FIG0Extension0 (uint8_t *d)
     occurrenceChange    = getBits_8 (d, 16 + 32);
     (void)occurrenceChange;
 
-    //  if (changeflag == 1) {
+    // In transmission mode I, because four ETI frames make one transmission frame, we will
+    // see lowpart == 0 only every twelve seconds, and not 6 as expected by the 250 overflow value.
+    if (lowpart == 0) {
+        timeLastFCT0Frame = std::chrono::system_clock::now();
+    }
+
+    if (changeflag == 0)
+        return;
+    // else if (changeflag == 1) {
     //     std::clog << "fib-processor:" << "Changes in sub channel organization\n") << std::endl;
     //     std::clog << "fib-processor:" << "cifcount = %d\n", highpart * 250 + lowpart) << std::endl;
     //     std::clog << "fib-processor:" << "Change happening in %d CIFs\n", occurrenceChange) << std::endl;
@@ -360,8 +366,9 @@ void FIBProcessor::FIG0Extension3 (uint8_t *d)
     int16_t used    = 2;
     int16_t Length  = getBits_5 (d, 3);
 
-    while (used < Length)
+    while (used < Length) {
         used = HandleFIG0Extension3 (d, used);
+    }
 }
 
 //      DSCTy   DataService Component Type
@@ -378,12 +385,12 @@ int16_t FIBProcessor::HandleFIG0Extension3(uint8_t *d, int16_t used)
     ServiceComponent *packetComp = findPacketComponent(SCId);
 
     used += 56 / 8;
-    if (packetComp == NULL)     // no ServiceComponent yet
-        return used;
-    packetComp->subchannelId = SubChId;
-    packetComp->DSCTy = DSCTy;
-    packetComp->DGflag = DGflag;
-    packetComp->packetAddress = packetAddress;
+    if (packetComp) {
+        packetComp->subchannelId = SubChId;
+        packetComp->DSCTy = DSCTy;
+        packetComp->DGflag = DGflag;
+        packetComp->packetAddress = packetAddress;
+    }
     return used;
 }
 
@@ -439,38 +446,32 @@ int16_t FIBProcessor::HandleFIG0Extension8(
 {
     int16_t  lOffset = used * 8;
     uint32_t SId = getBits(d, lOffset, pdBit == 1 ? 32 : 16);
-    uint8_t  lsFlag;
-    uint16_t SCIds;
-    int16_t  SCid;
-    int16_t  MSCflag;
-    int16_t  SubChId;
+    lOffset += (pdBit == 1 ? 32 : 16);
+
     uint8_t  extensionFlag;
 
-    lOffset += pdBit == 1 ? 32 : 16;
-    extensionFlag   = getBits_1 (d, lOffset);
-    SCIds   = getBits_4 (d, lOffset + 4);
-    lOffset += 8;
+    extensionFlag   = getBits_1(d, lOffset);
+    uint16_t SCIds   = getBits_4(d, lOffset + 4);
+    lOffset += 4;
 
-    lsFlag  = getBits_1 (d, lOffset + 8);
+    uint8_t lsFlag  = getBits_1(d, lOffset);
     if (lsFlag == 1) {
-        SCid = getBits (d, lOffset + 4, 12);
+        int16_t SCid = getBits(d, lOffset + 4, 12);
         lOffset += 16;
         //           if (findPacketComponent ((SCIds << 4) | SCid) != NULL) {
         //              std::clog << "fib-processor:" << "packet component bestaat !!\n") << std::endl;
         //           }
     }
     else {
-        MSCflag = getBits_1 (d, lOffset + 1);
-        SubChId = getBits_6 (d, lOffset + 2);
+        int16_t SubChId = getBits_6(d, lOffset + 4);
         lOffset += 8;
     }
-    if (extensionFlag)
+
+    if (extensionFlag) {
         lOffset += 8;   // skip Rfa
+    }
     (void)SId;
     (void)SCIds;
-    (void)SCid;
-    (void)SubChId;
-    (void)MSCflag;
     return lOffset / 8;
 }
 
@@ -1267,6 +1268,7 @@ void FIBProcessor::clearEnsemble()
     services.clear();
     serviceRepeatCount.clear();
     timeLastServiceDecrement = std::chrono::steady_clock::now();
+    timeLastFCT0Frame = std::chrono::system_clock::now();
 }
 
 std::vector<Service> FIBProcessor::getServiceList() const
@@ -1328,3 +1330,9 @@ DabLabel FIBProcessor::getEnsembleLabel() const
     std::lock_guard<std::mutex> lock(mutex);
     return ensembleLabel;
 }
+
+std::chrono::system_clock::time_point FIBProcessor::getTimeLastFCT0Frame() const
+{
+    std::lock_guard<std::mutex> lock(mutex);
+    return timeLastFCT0Frame;
+}
diff --git a/src/backend/fib-processor.h b/src/backend/fib-processor.h
index 48b24c6..921b01c 100644
--- a/src/backend/fib-processor.h
+++ b/src/backend/fib-processor.h
@@ -1,5 +1,5 @@
 /*
- *    Copyright (C) 2018
+ *    Copyright (C) 2020
  *    Matthias P. Braendli (matthias.braendli@mpb.li)
  *
  *    Copyright (C) 2013
@@ -52,6 +52,7 @@ class FIBProcessor {
         Service getService(uint32_t sId) const;
         std::list<ServiceComponent> getComponents(const Service& s) const;
         Subchannel getSubchannel(const ServiceComponent& sc) const;
+        std::chrono::system_clock::time_point getTimeLastFCT0Frame() const;
 
     private:
         RadioControllerInterface& myRadioInterface;
@@ -130,6 +131,7 @@ class FIBProcessor {
         std::vector<Service> services;
         std::unordered_map<uint32_t, uint8_t> serviceRepeatCount;
         std::chrono::steady_clock::time_point timeLastServiceDecrement;
+        std::chrono::system_clock::time_point timeLastFCT0Frame;
 };
 
 #endif
diff --git a/src/backend/fic-handler.cpp b/src/backend/fic-handler.cpp
index 8fd6546..bca4cb5 100644
--- a/src/backend/fic-handler.cpp
+++ b/src/backend/fic-handler.cpp
@@ -181,7 +181,7 @@ void FicHandler::processFicInput(const softbit_t *ficblock, int16_t ficno)
 
     /**
      * we have a final block of 24 bits  with puncturing according to PI_X
-     * This block constitues the 6 * 4 bits of the register itself.
+     * This block constitutes the 6 * 4 bits of the register itself.
      */
     for (k = 0; k < 24; k ++) {
         if (PI_X [k] != 0) {
diff --git a/src/backend/ofdm-decoder.cpp b/src/backend/ofdm-decoder.cpp
index 1313b21..ff8793f 100644
--- a/src/backend/ofdm-decoder.cpp
+++ b/src/backend/ofdm-decoder.cpp
@@ -153,7 +153,7 @@ void OfdmDecoder::processPRS()
      * within the signal region and bits outside.
      * It is just an indication
      */
-    snr = 0.7 * snr + 0.3 * get_snr(fft_buffer);
+    snr = 0.7 * snr + 0.3 * get_snr(fft_buffer, 1);
     if (++snrCount > 10) {
         radioInterface.onSNR(snr);
         snrCount = 0;
@@ -234,26 +234,53 @@ void OfdmDecoder::decodeDataSymbol(int32_t sym_ix)
  * K carriers.
  * Just get the strength from the selected carriers compared
  * to the strength of the carriers outside that region
+ * method:  0 Jans method. This method are originally developed by Jan and is not working if neighbor channels are used because it uses occupied bins for the noise calculation
+ *          1 New method. This method is working also if neighbor channels are used
  */
-int16_t OfdmDecoder::get_snr(DSPCOMPLEX *v)
+int16_t OfdmDecoder::get_snr(DSPCOMPLEX *v, uint8_t method)
 {
     int16_t i;
     DSPFLOAT    noise   = 0;
     DSPFLOAT    signal  = 0;
     const auto T_u = params.T_u;
-    int16_t low = T_u / 2 -  params.K / 2;
-    int16_t high    = low + params.K;
+    const auto K = params.K;
+    int16_t low = T_u / 2 -  K / 2;
+    int16_t high    = low + K;
 
-    for (i = 10; i < low - 20; i ++)
-        noise += abs (v[(T_u / 2 + i) % T_u]);
+    if(method)
+    {
+        for (i = 70; i < low - 20; i ++) // low - 90 samples
+            noise += abs (v[(T_u / 2 + i) % T_u]);
 
-    for (i = high + 20; i < T_u - 10; i ++)
-        noise += abs (v[(T_u / 2 + i) % T_u]);
+        for (i = high + 20; i < high + 120; i ++) // 100 samples
+            noise += abs (v[(T_u / 2 + i) % T_u]);
 
-    noise   /= (low - 30 + T_u - high - 30);
-    for (i = T_u / 2 - params.K / 4;  i < T_u / 2 + params.K / 4; i ++)
-        signal += abs (v[(T_u / 2 + i) % T_u]);
+        noise   /= (low - 90 + 100);
+        for (i = T_u / 2 - K / 4;  i < T_u / 2 + K / 4; i ++)
+            signal += abs (v[(T_u / 2 + i) % T_u]);
 
-    return get_db_over_256(signal / (params.K / 2)) - get_db_over_256(noise);
-}
+        const auto dB_signal_new = get_db_over_256(signal / (K / 2));
+        const auto dB_noise_new = get_db_over_256(noise);
+        const auto snr_new = dB_signal_new - dB_noise_new;
+        return  snr_new;
+    }
+    else
+    {
+        noise   = 0;
+        signal  = 0;
+        for (i = 10; i < low - 20; i ++)
+            noise += abs (v[(T_u / 2 + i) % T_u]);
+
+        for (i = high + 20; i < T_u - 10; i ++)
+            noise += abs (v[(T_u / 2 + i) % T_u]);
 
+        noise   /= (low - 30 + T_u - high - 30);
+        for (i = T_u / 2 - K / 4;  i < T_u / 2 + K / 4; i ++)
+            signal += abs (v[(T_u / 2 + i) % T_u]);
+
+        const auto dB_signal_old = get_db_over_256(signal / (K / 2));
+        const auto dB_noise_old = get_db_over_256(noise);
+        const auto snr_old = dB_signal_old - dB_noise_old;
+        return  snr_old;
+    }
+}
diff --git a/src/backend/ofdm-decoder.h b/src/backend/ofdm-decoder.h
index ac3a9a7..5be96b4 100644
--- a/src/backend/ofdm-decoder.h
+++ b/src/backend/ofdm-decoder.h
@@ -50,7 +50,7 @@ class OfdmDecoder
         void    pushAllSymbols(std::vector<std::vector<DSPCOMPLEX> >&& sym);
         void    reset();
     private:
-        int16_t get_snr(DSPCOMPLEX *);
+        int16_t get_snr(DSPCOMPLEX *, uint8_t method);
 
         const DABParams& params;
         RadioControllerInterface& radioInterface;
@@ -76,7 +76,7 @@ class OfdmDecoder
 
         std::vector<softbit_t> ibits;
         int16_t snrCount = 0;
-        int16_t snr = 0;
+        float snr = 0;
 
         const double mer_alpha = 1e-7;
         std::atomic<double> mer = ATOMIC_VAR_INIT(0.0);
diff --git a/src/backend/ofdm-processor.cpp b/src/backend/ofdm-processor.cpp
index 6afdc08..62f1e93 100644
--- a/src/backend/ofdm-processor.cpp
+++ b/src/backend/ofdm-processor.cpp
@@ -230,7 +230,7 @@ void OFDMProcessor::getSamples(DSPCOMPLEX *v, int16_t n, int32_t phase)
  *    time synchronization and frequency synchronization
  *    Identifying symbols in the DAB frame
  *    and sending them to the ofdmDecoder who will transfer the results
- *    Finally, estimating the small freqency error
+ *    Finally, estimating the small frequency error
  */
 void OFDMProcessor::run()
 {
diff --git a/src/backend/radio-controller.h b/src/backend/radio-controller.h
index 8f68734..7d4358f 100644
--- a/src/backend/radio-controller.h
+++ b/src/backend/radio-controller.h
@@ -83,7 +83,7 @@ enum class message_level_t { Information, Error };
 class RadioControllerInterface {
     public:
         /* Signal-to-Noise Ratio was calculated. snr is a value in dB. */
-        virtual void onSNR(int snr) = 0;
+        virtual void onSNR(float snr) = 0;
 
         /* The frequency corrector estimated a new correction. The frequency
          * correction consists of a coarse and a fine value, both having the
@@ -132,7 +132,7 @@ class RadioControllerInterface {
         virtual void onInputFailure(void) { };
 };
 
-/* A Programme Hander is associated to each tuned programme in the ensemble.
+/* A Programme Handler is associated to each tuned programme in the ensemble.
  */
 class ProgrammeHandlerInterface {
     public:
diff --git a/src/backend/radio-receiver.cpp b/src/backend/radio-receiver.cpp
index 2685a1e..4bd9a35 100644
--- a/src/backend/radio-receiver.cpp
+++ b/src/backend/radio-receiver.cpp
@@ -221,3 +221,10 @@ DABParams& RadioReceiver::getParams()
 {
     return params;
 }
+
+RadioReceiverStats RadioReceiver::getReceiverStats() const
+{
+    RadioReceiverStats s;
+    s.timeLastFCT0Frame = ficHandler.fibProcessor.getTimeLastFCT0Frame();
+    return s;
+}
diff --git a/src/backend/radio-receiver.h b/src/backend/radio-receiver.h
index 5aa7034..2e0c6e9 100644
--- a/src/backend/radio-receiver.h
+++ b/src/backend/radio-receiver.h
@@ -1,5 +1,5 @@
 /*
- *    Copyright (C) 2018
+ *    Copyright (C) 2020
  *    Matthias P. Braendli (matthias.braendli@mpb.li)
  *
  *    Copyright (C) 2017
@@ -33,6 +33,7 @@
 #ifndef RADIO_RECEIVER_H
 #define RADIO_RECEIVER_H
 
+#include <chrono>
 #include <memory>
 #include <string>
 #include "radio-controller.h"
@@ -44,6 +45,10 @@
 const char* fftPlacementMethodToString(FFTPlacementMethod fft_placement);
 const char* freqSyncMethodToString(FreqsyncMethod method);
 
+struct RadioReceiverStats {
+    std::chrono::system_clock::time_point timeLastFCT0Frame;
+};
+
 class RadioReceiver {
     public:
         RadioReceiver(
@@ -93,7 +98,9 @@ class RadioReceiver {
          */
         Subchannel getSubchannel(const ServiceComponent& sc) const;
 
-        DABParams& getParams(void);
+        DABParams& getParams();
+
+        RadioReceiverStats getReceiverStats() const;
 
     private:
         bool playProgramme(ProgrammeHandlerInterface& handler,
diff --git a/src/backend/subchannel_sink.h b/src/backend/subchannel_sink.h
index ea4827e..826c9d2 100644
--- a/src/backend/subchannel_sink.h
+++ b/src/backend/subchannel_sink.h
@@ -36,7 +36,7 @@ struct AUDIO_SERVICE_FORMAT {
 
 	AUDIO_SERVICE_FORMAT() : samplerate_khz(0), bitrate_kbps(0) {}
 	std::string GetSummary() const {
-		return codec + ", " + std::to_string(samplerate_khz) + " kHz " + mode + " @ " + std::to_string(bitrate_kbps) + " kBit/s";
+		return codec + ", " + std::to_string(samplerate_khz) + " kHz " + mode + " @ " + std::to_string(bitrate_kbps) + " kbit/s";
 	}
 };
 
@@ -52,7 +52,7 @@ public:
 	virtual void ProcessPAD(const uint8_t* /*xpad_data*/, size_t /*xpad_len*/, bool /*exact_xpad_len*/, const uint8_t* /*fpad_data*/) {}
 
 	virtual void AudioError(const std::string& /*hint*/) {}
-	virtual void AudioWarning(const std::string& /*hint*/) {}
+    virtual void ACCFrameError(const unsigned char /* error*/) {}
 	virtual void FECInfo(int /*total_corr_count*/, bool /*uncorr_errors*/) {}
 };
 
diff --git a/src/backend/uep-protection.cpp b/src/backend/uep-protection.cpp
index 095f780..1fd845f 100644
--- a/src/backend/uep-protection.cpp
+++ b/src/backend/uep-protection.cpp
@@ -223,7 +223,7 @@ bool UEPProtection::deconvolve(const softbit_t *v, int32_t size, uint8_t *outBuf
 
     /**
      * we have a final block of 24 bits  with puncturing according to PI_X
-     * This block constitues the 6 * 4 bits of the register itself.
+     * This block constitutes the 6 * 4 bits of the register itself.
      */
     for (i = 0; i < 24; i ++) {
         if (PI_X[i] != 0) {
diff --git a/src/input/airspy_sdr.cpp b/src/input/airspy_sdr.cpp
index 0cb6fca..b87189e 100644
--- a/src/input/airspy_sdr.cpp
+++ b/src/input/airspy_sdr.cpp
@@ -35,7 +35,7 @@
 #include <iostream>
 #include "airspy_sdr.h"
 
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
 #ifdef QT_CORE_LIB
     #include <QtGlobal>
 #else
diff --git a/src/input/input_factory.cpp b/src/input/input_factory.cpp
index 1a64c7c..e28f4f8 100644
--- a/src/input/input_factory.cpp
+++ b/src/input/input_factory.cpp
@@ -28,7 +28,7 @@
 
 #include <iostream>
 
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
 #ifdef QT_CORE_LIB
     #include <QtGlobal>
 #else
@@ -71,7 +71,7 @@ CVirtualInput *CInputFactory::GetDevice(RadioControllerInterface& radioControlle
     else
         InputDevice = GetManualDevice(radioController, device);
 
-    // Fallback if no device is found or an error occured
+    // Fallback if no device is found or an error occurred
     if (InputDevice == nullptr) {
         std::string text;
 
@@ -119,7 +119,7 @@ CVirtualInput *CInputFactory::GetDevice(RadioControllerInterface &radioControlle
             "Error while opening device \"" << static_cast<int>(deviceId) << "\"." << std::endl;
     }
 
-    // Fallback if no device is found or an error occured
+    // Fallback if no device is found or an error occurred
     if (InputDevice == nullptr) {
         std::string text = QT_TRANSLATE_NOOP("CRadioController", "Error while opening device");
         radioController.onMessage(message_level_t::Error, text);
@@ -153,7 +153,7 @@ CVirtualInput* CInputFactory::GetAutoDevice(RadioControllerInterface& radioContr
             }
         }
         catch (...) {
-            // An error occured. Maybe the device isn't present.
+            // An error occurred. Maybe the device isn't present.
             // Just try the next input device
         }
 
diff --git a/src/input/limesdr.cpp b/src/input/limesdr.cpp
index 51c7cc2..0dfd9bd 100644
--- a/src/input/limesdr.cpp
+++ b/src/input/limesdr.cpp
@@ -31,7 +31,7 @@
 #include <iostream>
 #include "limesdr.h"
 
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
 #ifdef QT_CORE_LIB
 #include <QtGlobal>
 #else
diff --git a/src/input/raw_file.cpp b/src/input/raw_file.cpp
index d585d2a..284a0ac 100644
--- a/src/input/raw_file.cpp
+++ b/src/input/raw_file.cpp
@@ -41,7 +41,7 @@
 
 #include "raw_file.h"
 
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
 #ifdef QT_CORE_LIB
     #include <QtGlobal>
 #else
diff --git a/src/input/rtl_sdr.cpp b/src/input/rtl_sdr.cpp
index 58739fa..633c163 100644
--- a/src/input/rtl_sdr.cpp
+++ b/src/input/rtl_sdr.cpp
@@ -35,7 +35,7 @@
 
 #include "rtl_sdr.h"
 
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
 #ifdef QT_CORE_LIB
     #include <QtGlobal>
 #else
@@ -71,7 +71,7 @@ void CRTL_SDR::open_device()
         std::clog << "RTL_SDR: " << "Found " << deviceCount << " devices. Uses the first working one" << std::endl;
     }
 
-    //	Iterate over all found rtl-sdr devices and try to open it. Stops if one device is successfull opened.
+    //	Iterate over all found rtl-sdr devices and try to open it. Stops if one device is successful opened.
     for(uint32_t i=0; i<deviceCount; i++) {
         ret = rtlsdr_open(&device, i);
         if (ret >= 0) {
@@ -138,7 +138,7 @@ bool CRTL_SDR::restart(void)
         try {
             open_device();
         } catch (...) {
-            // An error occured. Maybe the device isn't present.
+            // An error occurred. Maybe the device isn't present.
             radioController.onMessage(message_level_t::Error, QT_TRANSLATE_NOOP("CRadioController", "Error opening RTL-SDR. See log for details."));
             return false;
         }
diff --git a/src/input/rtl_tcp.cpp b/src/input/rtl_tcp.cpp
index 60e23c1..2fbc3a1 100644
--- a/src/input/rtl_tcp.cpp
+++ b/src/input/rtl_tcp.cpp
@@ -31,9 +31,11 @@
  */
 
 #include <iostream>
+#include <sys/time.h>
+
 #include "rtl_tcp.h"
 
-// For Qt translation if Qt is exisiting
+// For Qt translation if Qt is existing
 #ifdef QT_CORE_LIB
     #include <QtGlobal>
 #else
@@ -60,9 +62,18 @@ enum rtlsdr_tuner {
 
 #define ONE_BYTE 8
 
+static inline int64_t getMyTime(void)
+{
+    struct timeval tv;
+
+    gettimeofday(&tv, NULL);
+    return ((int64_t)tv.tv_sec * 1000000 + (int64_t)tv.tv_usec);
+}
+
 CRTL_TCP_Client::CRTL_TCP_Client(RadioControllerInterface& radioController) :
     radioController(radioController),
     sampleBuffer(32 * 32768),
+    sampleNetworkBuffer(256 * 32768),
     spectrumSampleBuffer(8192)
 {
     memset(&dongleInfo, 0, sizeof(dongle_info_t));
@@ -71,6 +82,7 @@ CRTL_TCP_Client::CRTL_TCP_Client(RadioControllerInterface& radioController) :
 
 CRTL_TCP_Client::~CRTL_TCP_Client(void)
 {
+    std::clog << "RTL_TCP_CLIENT: deleting ..." << std::endl;
     stop();
 }
 
@@ -93,6 +105,9 @@ bool CRTL_TCP_Client::restart(void)
 
     rtlsdrRunning = true;
 
+    networkBufferThread = std::thread(&CRTL_TCP_Client::networkBufferCopy, this);
+    networkBufferThread.detach();
+
     receiveThread = std::thread(&CRTL_TCP_Client::receiveAndReconnect, this);
     receiveThread.detach();
 
@@ -117,12 +132,12 @@ void CRTL_TCP_Client::stop(void)
 
     std::unique_lock<std::mutex> lock(mutex);
 
-    agcRunning = false;
-    rtlsdrRunning = false;
-
     // Close connection
     sock.close();
 
+    agcRunning = false;
+    rtlsdrRunning = false;
+
     lock.unlock();
 
     if (agcThread.joinable()) {
@@ -132,6 +147,12 @@ void CRTL_TCP_Client::stop(void)
     if (receiveThread.joinable()) {
         receiveThread.join();
     }
+
+    if (networkBufferThread.joinable()) {
+        networkBufferThread.join();
+    }
+
+    connected = false;
 }
 
 static int32_t read_convert_from_buffer(
@@ -166,12 +187,15 @@ std::vector<DSPCOMPLEX> CRTL_TCP_Client::getSpectrumSamples(int size)
 
 int32_t CRTL_TCP_Client::getSamplesToRead(void)
 {
-    return sampleBuffer.GetRingBufferReadAvailable () / 2;
+    return sampleBuffer.GetRingBufferReadAvailable() / 2;
 }
 
 void CRTL_TCP_Client::reset(void)
 {
     sampleBuffer.FlushRingBuffer();
+    sampleNetworkBuffer.FlushRingBuffer();
+    spectrumSampleBuffer.FlushRingBuffer();
+    firstFilledNetworkBuffer = false;
 }
 
 void CRTL_TCP_Client::receiveData(void)
@@ -249,8 +273,22 @@ void CRTL_TCP_Client::receiveData(void)
         }
     }
 
-    sampleBuffer.putDataIntoBuffer(buffer.data(), buffer.size());
-    spectrumSampleBuffer.putDataIntoBuffer(buffer.data(), buffer.size());
+    sampleNetworkBuffer.putDataIntoBuffer(buffer.data(), buffer.size());
+
+    // First fill the complete buffer to avoid sound outtages if the stream data rate is not stable e.g. over WIFI
+    if(!firstFilledNetworkBuffer) {
+        float bufferFill = (float) sampleNetworkBuffer.GetRingBufferReadAvailable() / sampleNetworkBuffer.GetBufferSize() * 100;
+
+        // Wait for 50% filled buffer
+        if(bufferFill >= 50)
+            firstFilledNetworkBuffer = true;
+
+        if((getMyTime() - oldTime_us > 100e3) || firstFilledNetworkBuffer) {
+            //std::clog << "RTL_TCP_CLIENT: Fill network buffer " << bufferFill << "%" << std::endl;
+            oldTime_us = getMyTime();
+        }
+    }
+
 
     // Check if device is overloaded
     minAmplitude = 255;
@@ -400,6 +438,8 @@ void CRTL_TCP_Client::receiveAndReconnect()
                     agcRunning = true;
                     agcThread = std::thread(&CRTL_TCP_Client::agcTimer, this);
                 }
+                firstData = true;
+                reset(); // Clear buffers
             }
             else {
                 std::clog << "RTL_TCP_CLIENT: Could not connect to server" <<
@@ -425,6 +465,56 @@ void CRTL_TCP_Client::receiveAndReconnect()
     }
 }
 
+#define NETWORK_BUFFER_READ_SAMPLES 32768
+void CRTL_TCP_Client::networkBufferCopy()
+{
+    std::vector<uint8_t> tempBuffer(NETWORK_BUFFER_READ_SAMPLES * 2);
+
+    while (rtlsdrRunning) {
+        if(!firstFilledNetworkBuffer) {
+            std::this_thread::sleep_for(std::chrono::milliseconds(100));
+            nextStop_us = getMyTime();
+            continue;
+        }
+
+        int32_t samples = NETWORK_BUFFER_READ_SAMPLES;
+
+        // Figure out the max samples to read from network buffer
+        int32_t samplesInBuffer = sampleNetworkBuffer.GetRingBufferReadAvailable() / 2;
+        if(samplesInBuffer < samples)
+            samples = samplesInBuffer;
+
+        if(samples == 0) {
+            std::this_thread::sleep_for(std::chrono::milliseconds(100));
+            nextStop_us = getMyTime();
+            continue;
+        }
+
+        // Read data
+        int32_t amount = sampleNetworkBuffer.getDataFromBuffer(tempBuffer.data(), 2 * samples);
+
+        // Write data to standard buffers
+        sampleBuffer.putDataIntoBuffer(tempBuffer.data(), amount);
+        spectrumSampleBuffer.putDataIntoBuffer(tempBuffer.data(), amount);
+
+        if(getMyTime() - oldTime_us > 500e3) { // 500 ms
+
+            float bufferFill = (float) sampleNetworkBuffer.GetRingBufferReadAvailable() / sampleNetworkBuffer.GetBufferSize() * 100;
+            //std::clog << "RTL_TCP_CLIENT: Network buffer fill level " << bufferFill << "%" << std::endl;
+
+            oldTime_us = getMyTime();
+        }
+
+
+        uint32_t period_us = samples / ((float) INPUT_RATE / 1e6);
+        nextStop_us += period_us;
+        int64_t timeToWait_us = nextStop_us - getMyTime();
+
+        // Send thread to sleep
+        std::this_thread::sleep_for(std::chrono::microseconds(timeToWait_us));
+    }
+}
+
 void CRTL_TCP_Client::agcTimer(void)
 {
     while (agcRunning) {
diff --git a/src/input/rtl_tcp.h b/src/input/rtl_tcp.h
index 5228a37..bcf62c1 100644
--- a/src/input/rtl_tcp.h
+++ b/src/input/rtl_tcp.h
@@ -82,6 +82,7 @@ private:
     void agcTimer(void);
     void receiveData(void);
     void receiveAndReconnect(void);
+    void networkBufferCopy(void);
     void handleDisconnect(void);
 
     std::mutex mutex;
@@ -89,6 +90,7 @@ private:
     std::thread receiveThread;
     bool agcRunning = false;
     std::thread agcThread;
+    std::thread networkBufferThread;
 
     float currentGain = 0;
     uint16_t currentGainCount = 0;
@@ -98,6 +100,7 @@ private:
     bool isHwAGC = false;
     int frequency = kHz(220000);
     RingBuffer<uint8_t> sampleBuffer;
+    RingBuffer<uint8_t> sampleNetworkBuffer;
     RingBuffer<uint8_t> spectrumSampleBuffer;
     bool connected = false;
     bool rtlsdrRunning = false;
@@ -105,6 +108,9 @@ private:
     uint16_t serverPort = 1234;
 
     bool firstData = true;
+    bool firstFilledNetworkBuffer = false;
+    int64_t oldTime_us = 0;
+    int64_t nextStop_us = 0;
     dongle_info_t dongleInfo;
 
     // Gain values for the different tuners
diff --git a/src/input/soapy_sdr.cpp b/src/input/soapy_sdr.cpp
index e3d039f..cef8c78 100644
--- a/src/input/soapy_sdr.cpp
+++ b/src/input/soapy_sdr.cpp
@@ -47,6 +47,24 @@ CSoapySdr::CSoapySdr(RadioControllerInterface& radioController) :
     m_sampleBuffer(1024 * 1024),
     m_spectrumSampleBuffer(8192)
 {
+    //enumerate devices
+    const std::string args ="";
+    const auto foundDevices = SoapySDR::Device::enumerate("");
+
+    int nonAudioDeviceCount = 0;
+    for(auto found: foundDevices)
+    {
+        std::clog << "SoapySDR: Found device \"" << found.at("driver") << " \'" << found.at("label") << "\' \"" << std::endl;
+
+        if(found.at("driver").compare("audio") != 0)
+            nonAudioDeviceCount++;
+    }
+
+    if(nonAudioDeviceCount == 0)
+    {
+        std::clog << "SoapySDR: " << "No usable SDR device found" << std::endl;
+        throw 0;
+    }
 }
 
 CSoapySdr::~CSoapySdr()
@@ -60,7 +78,7 @@ void CSoapySdr::setFrequency(int Frequency)
     if (m_device != nullptr) {
         m_device->setFrequency(SOAPY_SDR_RX, 0, Frequency);
         m_freq = m_device->getFrequency(SOAPY_SDR_RX, 0);
-        std::clog << "OutputSoapySDR:Actual frequency: " <<
+        std::clog << "SoapySDR:Actual frequency: " <<
             m_freq / 1000.0 <<
             " kHz." << std::endl;
     }
@@ -106,7 +124,7 @@ bool CSoapySdr::restart()
         m_device->getMasterClockRate()/1000.0 << " kHz" << std::endl;
 
     m_device->setSampleRate(SOAPY_SDR_RX, 0, INPUT_RATE);
-    std::clog << "OutputSoapySDR:Actual RX rate: " <<
+    std::clog << "SoapySDR:Actual RX rate: " <<
         m_device->getSampleRate(SOAPY_SDR_RX, 0) / 1000.0 <<
         " ksps." << std::endl;
 
@@ -344,7 +362,8 @@ void CSoapySdr::workerthread()
     std::vector<size_t> channels;
     channels.push_back(0);
     std::clog << " *************** Setup soapy stream" << std::endl;
-    auto stream = m_device->setupStream(SOAPY_SDR_RX, "CF32", channels);
+    auto args = SoapySDR::KwargsFromString(m_driver_args);
+    auto stream = m_device->setupStream(SOAPY_SDR_RX, "CF32", channels, args);
 
     m_device->activateStream(stream);
     try {
diff --git a/src/tests/backend_tests.cpp b/src/tests/backend_tests.cpp
index 7ec540c..8cb1982 100644
--- a/src/tests/backend_tests.cpp
+++ b/src/tests/backend_tests.cpp
@@ -39,7 +39,7 @@
 
 class TestRadioInterface : public RadioControllerInterface {
     public:
-        virtual void onSNR(int snr) override { (void)snr; }
+        virtual void onSNR(float snr) override { (void)snr; }
         virtual void onFrequencyCorrectorChange(int fine, int coarse) override { (void)fine; (void)coarse; }
         virtual void onSyncChange(char isSync) override { (void)isSync; }
         virtual void onSignalPresence(bool isSignal) override { (void)isSignal; }
@@ -132,7 +132,7 @@ void BackendTests::runRadio(const std::string &rawFileName,
                 }
                 else
                 {
-                    std::cout << "Tune to " << service.serviceLabel.utf8_label() << " succesfully" << std::endl;
+                    std::cout << "Tune to " << service.serviceLabel.utf8_label() << " successfully" << std::endl;
                     service_selected = true;
                 }
                 break;
diff --git a/src/various/channels.cpp b/src/various/channels.cpp
index 4cfcfcf..c49d8d6 100644
--- a/src/various/channels.cpp
+++ b/src/various/channels.cpp
@@ -118,7 +118,7 @@ int Channels::getFrequency(const string& channelName)
     currentFrequency = frequency;
     currentChannel = channelName;
 
-    // Get index of current fequency
+    // Get index of current frequency
     for (int i=0; i<NUMBEROFCHANNELS; i++) {
         if (getChannelNameAtIndex(i) == channelName) {
             currentFrequencyIndex = i;
diff --git a/src/various/ringbuffer.h b/src/various/ringbuffer.h
index 5198ccf..54a9d7d 100644
--- a/src/various/ringbuffer.h
+++ b/src/various/ringbuffer.h
@@ -163,6 +163,10 @@ class RingBuffer
          *  functions for checking available data for reading and space
          *  for writing
          */
+        int32_t GetBufferSize(void) {
+            return bufferSize;
+        }
+
         int32_t GetRingBufferReadAvailable (void) {
             return (writeIndex - readIndex) & bigMask;
         }
diff --git a/src/welle-cli/alsa-output.cpp b/src/welle-cli/alsa-output.cpp
index b35abbb..6c570f1 100644
--- a/src/welle-cli/alsa-output.cpp
+++ b/src/welle-cli/alsa-output.cpp
@@ -58,7 +58,7 @@ AlsaOutput::AlsaOutput(int chans, unsigned int rate) :
         fprintf(stderr, "ERROR: Can't set rate. %s\n", snd_strerror(err));
 
     if ((err = snd_pcm_hw_params(pcm_handle, params)) < 0)
-        fprintf(stderr, "ERROR: Can't set harware parameters. %s\n",
+        fprintf(stderr, "ERROR: Can't set hardware parameters. %s\n",
                 snd_strerror(err));
 
     fprintf(stderr, "PCM name: '%s'\n", snd_pcm_name(pcm_handle));
diff --git a/src/welle-cli/doc/man/update_manpage.sh b/src/welle-cli/doc/man/update_manpage.sh
new file mode 100755
index 0000000..1fd3cc1
--- /dev/null
+++ b/src/welle-cli/doc/man/update_manpage.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+help2man \
+  --name "welle.io command line interface" \
+  --no-info \
+  --no-discard-stderr \
+  --help-option='-h' \
+  --version-option="-v" \
+  --output welle-cli.1 \
+  welle-cli
diff --git a/src/welle-cli/doc/man/welle-cli.1 b/src/welle-cli/doc/man/welle-cli.1
new file mode 100644
index 0000000..7dc4371
--- /dev/null
+++ b/src/welle-cli/doc/man/welle-cli.1
@@ -0,0 +1,133 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.48.1.
+.TH WELLE-CLI "1" "November 2021" "welle-cli 2.4" "User Commands"
+.SH NAME
+welle-cli \- welle.io command line interface
+.SH SYNOPSIS
+.B welle-cli
+[\fI\,OPTION\/\fR]
+.br
+.B welle-cli
+\fI\,-w <port> \/\fR[\fI\,OPTION\/\fR]
+.SH DESCRIPTION
+welle\-cli is welle.io's command line interface.
+.SH OPTIONS
+.SS "Tuning:"
+.TP
+\fB\-c\fR channel
+Tune to <channel> (eg. 10B, 5A, LD...).
+.TP
+\fB\-p\fR programme
+Play <programme> with ALSA (text name of the radio: eg. GRIFF).
+.SS "Dumping:"
+.TP
+\fB\-D\fR
+Dump FIC and all programmes to files (cannot be used with \fB\-C\fR).
+This generates: dump.fic; <programme_name.msc> files;
+<programme_name.wav> files.
+.TP
+\fB\-d\fR
+Dump programme to <programme_name.msc> file.
+.SS "Web server mode:"
+.TP
+\fB\-w\fR port
+Enable web server on port <port>.
+.TP
+\fB\-C\fR number
+Number of programmes to decode in a carousel
+(to be used with \fB\-w\fR, cannot be used with \fB\-D\fR).
+This is useful if your machine cannot decode all programmes
+simultaneously, but you still want to get an overview of
+the ensemble.
+.TP
+\fB\-P\fR
+Without the \fB\-P\fR option, welle\-cli will switch every 10 seconds.
+With the \fB\-P\fR option, welle\-cli will switch once DLS and a
+slide were decoded, staying at most 80 seconds on a given
+programme.
+.SS "Backend and input options:"
+.TP
+\fB\-f\fR file
+Read an IQ file <file> and play with ALSA
+IQ file format is u8, unless the file ends with FORMAT.iq
+.TP
+\fB\-u\fR
+Disable coarse corrector, for receivers who have a low
+frequency offset.
+.TP
+\fB\-g\fR gain
+Set input gain to <gain> or \fB\-1\fR for auto gain.
+.TP
+\fB\-F\fR driver
+Set input driver and arguments. Default: "auto".
+Valid drivers depending on compilation options at build time
+are:
+airspy, rtl_sdr, android_rtl_sdr, rtl_tcp, soapysdr.
+With "rtl_tcp", host IP and port can be specified as
+"rtl_tcp,<HOST_IP>:<PORT>".
+.TP
+\fB\-s\fR args
+SoapySDR Driver arguments.
+.TP
+\fB\-A\fR antenna
+Set input antenna to ANT (for SoapySDR input only).
+.TP
+\fB\-T\fR
+Disable TII decoding to reduce CPU usage.
+.SS "Other options:"
+.TP
+\fB\-t\fR test_id
+Run test <test_id>.
+To understand what the tests do, please see source code.
+.TP
+\fB\-h\fR
+Display this help and exit.
+.TP
+\fB\-v\fR
+Output version information and exit.
+.SH EXAMPLES
+welle\-cli \-c 10B \-p GRRIF
+.IP
+Receive 'GRRIF' on channel '10B' using 'auto' driver, and play with ALSA.
+.PP
+welle\-cli \-f ./ofdm.iq \-p GRRIF
+.IP
+Read IQ file './ofdm.iq' (in u8 format) and play programme 'GRIFF' with ALSA.
+.PP
+welle\-cli \-f ./ofdm.iq \-t 1
+.IP
+Read IQ file './ofdm.iq' (in u8 format), and run test 1.
+.PP
+welle\-cli \-c 10B \-D
+.IP
+Dump FIC and all programmes of channel 10B to files.
+.PP
+welle\-cli \-c 10B \-w 8000
+.IP
+Enable web server on port 8000, decode programmes on channel 10B on demand
+(http://localhost:8000).
+.PP
+welle\-cli \-c 10B \-Dw 8000
+.IP
+Enable web server on port 8000, decode all programmes on channel 10B.
+.PP
+welle\-cli \-c 10B \-C 1 \-w 8000
+.IP
+Enable web server on port 8000, decode programmes one by one in a carousel
+on channel 10B; welle\-cli will switch every 10 seconds.
+.PP
+welle\-cli \-c 10B \-PC 1 \-w 8000
+.IP
+Enable web server on port 8000, decode programmes one by one in a carousel
+on channel 10B; welle\-cli will switch once DLS and a slide were decoded,
+staying at most 80 seconds on a given programme.
+.SH AUTHOR
+Written by: Albrecht Lohofener & Matthias P. Braendli.
+Other contributors: <https://github.com/AlbrechtL/welle.io/blob/master/AUTHORS>
+.SH "REPORTING BUGS"
+Report bugs to: <https://github.com/AlbrechtL/welle.io/issues>
+.SH COPYRIGHT
+Copyright \(co 2018 Matthias P. Braendli.
+.br
+Copyright \(co 2017 Albrecht Lohofener.
+License GPL\-2.0\-or\-later: GNU General Public License v2.0 or later
+<https://www.gnu.org/licenses/old\-licenses/gpl\-2.0\-standalone.html>
diff --git a/src/welle-cli/index.html b/src/welle-cli/index.html
index 353aaca..e1ab496 100644
--- a/src/welle-cli/index.html
+++ b/src/welle-cli/index.html
@@ -105,6 +105,7 @@ canvas {
                 Channel: <select id="channelselector" name="channel"></select>
                 FFT Placement: <select id="fftwindowselector" name="fftwindow"></select>
                 Coarse freq corrector: <input type="checkbox" id="coarsecheckbox">
+                <p><a href="/mux.m3u">Get m3u playlist</a>. <a href="/mux.json">Get mux json</a>. <a href="/fic">Get FIC stream</a>.</p>
             </div>
             <div id="ensembleinfo"></div>
 
diff --git a/src/welle-cli/index.js b/src/welle-cli/index.js
index 0b22814..5ea45f9 100644
--- a/src/welle-cli/index.js
+++ b/src/welle-cli/index.js
@@ -159,6 +159,7 @@ function ensembleInfoTemplate() {
     html += ' <th><abbr title="Local Time Offset">LTO</abbr></th></th>';
     html += ' <th>FIC CRC Errors</th>';
     html += ' <th>Tuned at</th>';
+    html += ' <th>FCT0 frame received at</th>';
     html += ' </tr>';
     html += ' <tr><td>${EId}</td>';
     html += ' <td>${ecc}</td>';
@@ -168,7 +169,8 @@ function ensembleInfoTemplate() {
     html += ' <td>${year}-${month}-${day} ${hour}:${minutes} UTC</td>';
     html += ' <td>${lto}</td>';
     html += ' <td>${ficcrcerrors}</td>';
-    html += ' <td>${lastchannelchange}</td></tr>';
+    html += ' <td>${lastchannelchange}</td>';
+    html += ' <td>${lastfct0frame}</td></tr>';
     html += ' </table><br>    <button type=button onclick="stopPlayer()">Stop</button><br><br>';
     html += '';
     html += '<table id="servicetable">';
@@ -419,8 +421,10 @@ function populateEnsembleinfo() {
         ens["FrequencyCorrection"] = data.demodulator.frequencycorrection;
         ens["services"] = servicehtml;
         ens["ficcrcerrors"] = data.demodulator.fic.numcrcerrors;
-        var lcc = new Date(data.receiver.software.lastchannelchange * 1000);
+        var lcc = new Date(data.receiver.software.lastchannelchange);
         ens["lastchannelchange"] = lcc.toISOString();
+        var lfct0 = new Date(data.demodulator.time_last_fct0_frame);
+        ens["lastfct0frame"] = lfct0.toISOString();
 
         var ei = document.getElementById('ensembleinfo');
         ei.innerHTML = parseTemplate(ensembleInfoTemplate(), ens);
diff --git a/src/welle-cli/jsonconvert.cpp b/src/welle-cli/jsonconvert.cpp
index d57450f..95a2afb 100644
--- a/src/welle-cli/jsonconvert.cpp
+++ b/src/welle-cli/jsonconvert.cpp
@@ -46,13 +46,17 @@ static void to_json(nlohmann::json& j, const DabLabel& l)
 
 
 static void to_json(nlohmann::json& j, const SoftwareJson& s) {
+    uint64_t lastchannelchange_ms =
+        std::chrono::duration_cast<std::chrono::milliseconds>(
+                s.lastchannelchange.time_since_epoch()).count();
+
     j = nlohmann::json{
         {"name", s.name},
         {"version", s.version},
         {"fftwindowplacement", s.fftwindowplacement},
         {"coarsecorrectorenabled", s.coarsecorrectorenabled},
         {"freqsyncmethod", s.freqsyncmethod},
-        {"lastchannelchange", s.lastchannelchange}
+        {"lastchannelchange", lastchannelchange_ms}
     };
 }
 
@@ -217,6 +221,10 @@ static void to_json(nlohmann::json& j, const MuxJson& mux) {
     };
 
     j["demodulator"]["fic"]["numcrcerrors"] = mux.demodulator_fic_numcrcerrors;
+    uint64_t timelastfct0_ms =
+        std::chrono::duration_cast<std::chrono::milliseconds>(
+                mux.demodulator_timelastfct0frame.time_since_epoch()).count();
+    j["demodulator"]["time_last_fct0_frame"] = timelastfct0_ms;
     j["demodulator"]["snr"] = mux.demodulator_snr;
     j["demodulator"]["frequencycorrection"] = mux.demodulator_frequencycorrection;
 }
diff --git a/src/welle-cli/jsonconvert.h b/src/welle-cli/jsonconvert.h
index db6607f..8f7ff48 100644
--- a/src/welle-cli/jsonconvert.h
+++ b/src/welle-cli/jsonconvert.h
@@ -25,6 +25,7 @@
 #pragma once
 
 #include <string>
+#include <chrono>
 #include <list>
 #include <vector>
 #include <memory>
@@ -38,7 +39,7 @@ struct SoftwareJson {
     std::string fftwindowplacement;
     bool coarsecorrectorenabled = false;
     std::string freqsyncmethod;
-    std::time_t lastchannelchange = 0;
+    std::chrono::system_clock::time_point lastchannelchange;
 };
 
 struct HardwareJson {
@@ -137,6 +138,7 @@ struct MuxJson {
 
     double demodulator_snr = 0.0;
     double demodulator_frequencycorrection = 0.0;
+    std::chrono::system_clock::time_point demodulator_timelastfct0frame;
 
     std::list<tii_measurement_t> tii;
     std::vector<PeakJson> cir_peaks;
diff --git a/src/welle-cli/tests.cpp b/src/welle-cli/tests.cpp
index dbcd21c..bdb2b25 100644
--- a/src/welle-cli/tests.cpp
+++ b/src/welle-cli/tests.cpp
@@ -132,7 +132,7 @@ class TestRadioInterface : public RadioControllerInterface {
             }
         }
 
-        virtual void onSNR(int snr) override { (void)snr; }
+        virtual void onSNR(float snr) override { (void)snr; }
         virtual void onFrequencyCorrectorChange(int fine, int coarse) override { (void)fine; (void)coarse; }
         virtual void onSyncChange(char isSync) override
         {
diff --git a/src/welle-cli/webradiointerface.cpp b/src/welle-cli/webradiointerface.cpp
index 2e07766..3277bb0 100644
--- a/src/welle-cli/webradiointerface.cpp
+++ b/src/welle-cli/webradiointerface.cpp
@@ -89,6 +89,7 @@ static const char* http_405 = "HTTP/1.0 405 Method Not Allowed\r\n";
 static const char* http_500 = "HTTP/1.0 500 Internal Server Error\r\n";
 static const char* http_503 = "HTTP/1.0 503 Service Unavailable\r\n";
 static const char* http_contenttype_mp3 = "Content-Type: audio/mpeg\r\n";
+static const char* http_contenttype_m3u = "Content-Type: application/mpegurl\r\n";
 static const char* http_contenttype_text = "Content-Type: text/plain\r\n";
 static const char* http_contenttype_data =
         "Content-Type: application/octet-stream\r\n";
@@ -469,6 +470,9 @@ bool WebRadioInterface::dispatch_client(Socket&& client)
             else if (req.url == "/mux.json") {
                 success = send_mux_json(s);
             }
+            else if (req.url == "/mux.m3u") {
+                success = send_mux_playlist(s);
+            }
             else if (req.url == "/fic") {
                 success = send_fic(s);
             }
@@ -613,7 +617,7 @@ bool WebRadioInterface::send_mux_json(Socket& s)
     mux_json.receiver.software.fftwindowplacement = fftPlacementMethodToString(rro.fftPlacementMethod);
     mux_json.receiver.software.coarsecorrectorenabled = not rro.disableCoarseCorrector;
     mux_json.receiver.software.freqsyncmethod = freqSyncMethodToString(rro.freqsyncMethod);
-    mux_json.receiver.software.lastchannelchange = chrono::system_clock::to_time_t(time_rx_created);
+    mux_json.receiver.software.lastchannelchange = time_rx_created;
     mux_json.receiver.hardware.name = input.getDescription();
     mux_json.receiver.hardware.gain = input.getGain();
 
@@ -770,6 +774,7 @@ bool WebRadioInterface::send_mux_json(Socket& s)
 
         mux_json.demodulator_snr = last_snr;
         mux_json.demodulator_frequencycorrection = last_fine_correction + last_coarse_correction;
+        mux_json.demodulator_timelastfct0frame = rx->getReceiverStats().timeLastFCT0Frame;
 
         mux_json.tii = getTiiStats();
     }
@@ -793,6 +798,53 @@ bool WebRadioInterface::send_mux_json(Socket& s)
     return true;
 }
 
+bool WebRadioInterface::send_mux_playlist(Socket& s)
+{
+    stringstream m3u;
+    m3u << "#EXTM3U\n";
+
+    {
+        lock_guard<mutex> lock(rx_mut);
+        ASSERT_RX;
+
+        for (const auto& s : rx->getServiceList()) {
+            auto hex_sid = to_hex(s.serviceId, 4);
+            auto label = s.serviceLabel.utf8_label();
+            string url_mp3 = "";
+
+            for (const auto& sc : rx->getComponents(s)) {
+                switch (sc.transportMode()) {
+                    case TransportMode::Audio:
+                        if (sc.audioType() == AudioServiceComponentType::DAB or
+                            sc.audioType() == AudioServiceComponentType::DABPlus) {
+                            url_mp3 = "/mp3/" + hex_sid;
+                        }
+                        break;
+                    default:
+                        break;
+                }
+            }
+
+            if (not url_mp3.empty()) {
+                m3u << "#EXTINF:-1 sid=\"" << hex_sid << "\"," << label << "\n";
+                m3u << url_mp3 << "\n";
+            }
+        }
+    }
+
+    if (not send_http_response(s, http_ok, "", http_contenttype_m3u)) {
+        return false;
+    }
+
+    const auto m3u_str = m3u.str();
+    ssize_t ret = s.send(m3u_str.c_str(), m3u_str.size(), MSG_NOSIGNAL);
+    if (ret == -1) {
+        cerr << "Failed to send mux.m3u data" << endl;
+        return false;
+    }
+    return true;
+}
+
 bool WebRadioInterface::send_mp3(Socket& s, const std::string& stream)
 {
     unique_lock<mutex> lock(rx_mut);
@@ -1389,7 +1441,7 @@ void WebRadioInterface::serve()
     carousel_services_active.clear();
 }
 
-void WebRadioInterface::onSNR(int snr)
+void WebRadioInterface::onSNR(float snr)
 {
     lock_guard<mutex> lock(data_mut);
     last_snr = snr;
diff --git a/src/welle-cli/webradiointerface.h b/src/welle-cli/webradiointerface.h
index ea3aa18..5aab0b9 100644
--- a/src/welle-cli/webradiointerface.h
+++ b/src/welle-cli/webradiointerface.h
@@ -82,7 +82,7 @@ class WebRadioInterface : public RadioControllerInterface {
 
         void serve();
 
-        virtual void onSNR(int snr) override;
+        virtual void onSNR(float snr) override;
         virtual void onFrequencyCorrectorChange(int fine, int coarse) override;
         virtual void onSyncChange(char isSync) override;
         virtual void onSignalPresence(bool isSignal) override;
@@ -111,6 +111,9 @@ class WebRadioInterface : public RadioControllerInterface {
         // Generate and send the mux.json
         bool send_mux_json(Socket& s);
 
+        // Generate and send a m3u playlist with all services
+        bool send_mux_playlist(Socket& s);
+
         // Send an mp3 stream containing the selected programme.
         // stream is a service id, either in hex with 0x prefix or
         // in decimal
diff --git a/src/welle-cli/welle-cli.cpp b/src/welle-cli/welle-cli.cpp
index 1a7ed9d..dcd1019 100644
--- a/src/welle-cli/welle-cli.cpp
+++ b/src/welle-cli/welle-cli.cpp
@@ -175,7 +175,7 @@ class WavProgrammeHandler: public ProgrammeHandlerInterface {
 
 class RadioInterface : public RadioControllerInterface {
     public:
-        virtual void onSNR(int /*snr*/) override { }
+        virtual void onSNR(float /*snr*/) override { }
         virtual void onFrequencyCorrectorChange(int /*fine*/, int /*coarse*/) override { }
         virtual void onSyncChange(char isSync) override { synced = isSync; }
         virtual void onSignalPresence(bool /*isSignal*/) override { }
@@ -293,64 +293,111 @@ struct options_t {
 
 static void usage()
 {
-    cerr << "Usage: " << endl <<
-#if defined(HAVE_ALSA)
-        "Receive using RTLSDR, and play with ALSA:" << endl <<
-        " welle-cli -c channel -p programme" << endl <<
-        endl <<
-        "Read an IQ file and play with ALSA:" << endl <<
-        "IQ file format is u8, unless the file ends with FORMAT.iq" << endl <<
-        " welle-cli -f file -p programme" << endl <<
-        endl <<
-#endif // defined(HAVE_ALSA)
-        "Use -D to dump FIC and all programmes to files." << endl <<
-        " welle-cli -c channel -D " << endl <<
-        endl <<
-        "Use -w to enable webserver, decode a programmes on demand." << endl <<
-        " welle-cli -c channel -w port" << endl <<
-        endl <<
-        "Use -Dw to enable webserver, decode all programmes." << endl <<
-        " welle-cli -c channel -Dw port" << endl <<
-        endl <<
-        "Use -C 1 -w to enable webserver, decode programmes one by one in a carousel." << endl <<
-        "Use -C N -w to enable webserver, decode programmes N by N in a carousel." << endl <<
-        "This is useful if your machine cannot decode all programmes simultaneously, but" << endl <<
-        "you still want to get an overview of the ensemble." << endl <<
-        "Without the -P option, welle-cli will switch every 10 seconds." << endl <<
-        "With the -P option, welle-cli will switch once DLS and a slide were decoded, staying at most" << endl <<
-        "80 seconds on a given programme." << endl <<
-        " welle-cli -c channel -C 1 -w port" << endl <<
-        " welle-cli -c channel -PC 1 -w port" << endl <<
-        endl <<
-        "Backend and input options" << endl <<
-        " -u      disable coarse corrector, for receivers who have a low frequency offset." << endl <<
-        " -g GAIN set input gain to GAIN or -1 for auto gain." << endl <<
-        " -F DRV  set input driver and arguments. Default: \"auto\"." << endl <<
-        "         valid drivers: " <<
-#ifdef HAVE_AIRSPY
-        "\"airspy\", " <<
-#endif
-#ifdef HAVE_RTLSDR
-        "\"rtl_sdr\", " <<
-#endif
-#ifdef HAVE_SOAPYSDR
-        "\"soapysdr\", " <<
-#endif
-#ifdef __ANDROID__
-        "\"android_rtl_sdr\", " <<
-#endif
-        "\"rtl_tcp\"." << endl <<
-        "         rtl_tcp host IP and port can be specified as \"rtl_tcp,<HOST_IP>:<PORT>\"." << endl <<
-        " -s ARGS SoapySDR Driver arguments." << endl <<
-        " -A ANT  set input antenna to ANT (for SoapySDR input only)." << endl <<
-        " -T      disable TII decoding to reduce CPU usage." << endl <<
-        endl <<
-        "Use -t test_number to run a test." << endl <<
-        "To understand what the tests do, please see source code." << endl <<
-        endl <<
-        " examples: welle-cli -c 10B -p GRRIF" << endl <<
-        "           welle-cli -f ./ofdm.iq -p GRRIF" << endl <<
-        "           welle-cli -f ./ofdm.iq -t 1" << endl;
+    cerr <<
+    "Usage: welle-cli [OPTION]" << endl <<
+    "   or: welle-cli -w <port> [OPTION]" << endl <<
+    endl <<
+    "welle-cli is welle.io's command line interface." << endl <<
+    endl <<
+    "Options:" << endl <<
+    endl <<
+    "Tuning:" << endl <<
+    "    -c channel    Tune to <channel> (eg. 10B, 5A, LD...)." << endl <<
+    "    -p programme  Play <programme> with ALSA (text name of the radio: eg. GRIFF)." << endl <<
+    endl <<
+    "Dumping:" << endl <<
+    "    -D            Dump FIC and all programmes to files (cannot be used with -C)." << endl <<
+    "                  This generates: dump.fic; <programme_name.msc> files;" << endl <<
+    "                  <programme_name.wav> files." << endl <<
+    "    -d            Dump programme to <programme_name.msc> file." << endl <<
+    endl <<
+    "Web server mode:" << endl <<
+    "    -w port       Enable web server on port <port>." << endl <<
+    "    -C number     Number of programmes to decode in a carousel" << endl <<
+    "                  (to be used with -w, cannot be used with -D)." << endl <<
+    "                  This is useful if your machine cannot decode all programmes" << endl <<
+    "                  simultaneously, but you still want to get an overview of" << endl <<
+    "                  the ensemble." << endl <<
+    "    -P            Without the -P option, welle-cli will switch every 10 seconds." << endl <<
+    "                  With the -P option, welle-cli will switch once DLS and a" << endl <<
+    "                  slide were decoded, staying at most 80 seconds on a given" << endl <<
+    "                  programme." << endl <<
+    endl <<
+    "Backend and input options:" << endl <<
+    "    -f file       Read an IQ file <file> and play with ALSA." << endl <<
+    "                  IQ file format is u8, unless the file ends with 'FORMAT.iq'." << endl <<
+    "    -u            Disable coarse corrector, for receivers who have a low " << endl <<
+    "                  frequency offset." << endl <<
+    "    -g gain       Set input gain to <gain> or -1 for auto gain." << endl <<
+    "    -F driver     Set input driver and arguments." << endl <<
+    "                  Please note that some input drivers are available only if" << endl <<
+    "                  they were enabled at build time." << endl <<
+    "                  Possible values are: auto (default), airspy, rtl_sdr," << endl <<
+    "                  android_rtl_sdr, rtl_tcp, soapysdr." << endl <<
+    "                  With \"rtl_tcp\", host IP and port can be specified as " << endl <<
+    "                  \"rtl_tcp,<HOST_IP>:<PORT>\"." << endl <<
+    "    -s args       SoapySDR Driver arguments." << endl <<
+    "    -A antenna    Set input antenna to ANT (for SoapySDR input only)." << endl <<
+    "    -T            Disable TII decoding to reduce CPU usage." << endl <<
+    endl <<
+    "Other options:" << endl <<
+    "    -t test_id    Run test <test_id>." << endl <<
+    "                  To understand what the tests do, please see source code." << endl <<
+    "    -h            Display this help and exit." << endl <<
+    "    -v            Output version information and exit." << endl <<
+    endl <<
+    "Examples:" << endl <<
+    endl <<
+    "welle-cli -c 10B -p GRRIF" << endl <<
+    "    Receive 'GRRIF' on channel '10B' using 'auto' driver, and play with ALSA." << endl <<
+    endl <<
+    "welle-cli -f ./ofdm.iq -p GRRIF" << endl <<
+    "    Read IQ file './ofdm.iq' (in u8 format) and play programme 'GRIFF' with ALSA." << endl <<
+    endl <<
+    "welle-cli -f ./ofdm.iq -t 1" << endl <<
+    "    Read IQ file './ofdm.iq' (in u8 format), and run test 1." << endl <<
+    endl <<
+    "welle-cli -c 10B -p GRRIF -F rtl_tcp,localhost:1234" << endl <<
+    "    Receive 'GRRIF' on channel '10B' using 'rtl_tcp' driver on localhost:1234," << endl <<
+    "    and play with ALSA." << endl <<
+    endl <<
+    "welle-cli -c 10B -D " << endl <<
+    "    Dump FIC and all programmes of channel 10B to files." << endl <<
+    endl <<
+    "welle-cli -c 10B -w 8000" << endl <<
+    "    Enable web server on port 8000, decode programmes on channel 10B on demand" << endl <<
+    "    (http://localhost:8000)." << endl <<
+    endl <<
+    "welle-cli -c 10B -Dw 8000" << endl <<
+    "    Enable web server on port 8000, decode all programmes on channel 10B." << endl <<
+    endl <<
+    "welle-cli -c 10B -C 1 -w 8000" << endl <<
+    "    Enable web server on port 8000, decode programmes one by one in a carousel" << endl <<
+    "    on channel 10B; welle-cli will switch every 10 seconds." << endl <<
+    endl <<
+    "welle-cli -c 10B -PC 1 -w 8000" << endl <<
+    "    Enable web server on port 8000, decode programmes one by one in a carousel" << endl <<
+    "    on channel 10B; welle-cli will switch once DLS and a slide were decoded," << endl <<
+    "    staying at most 80 seconds on a given programme." << endl <<
+    endl <<
+    "Report bugs to: <https://github.com/AlbrechtL/welle.io/issues>" << endl;
+}
+
+static void copyright()
+{
+    cerr <<
+    "Copyright (C) 2018 Matthias P. Braendli." << endl <<
+    "Copyright (C) 2017 Albrecht Lohofener." << endl <<
+    "License GPL-2.0-or-later: GNU General Public License v2.0 or later" << endl <<
+    "<https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html>" << endl <<
+    endl <<
+    "Written by: Albrecht Lohofener & Matthias P. Braendli." << endl <<
+    "Other contributors: <https://github.com/AlbrechtL/welle.io/blob/master/AUTHORS>" << endl;
+}
+
+static void version()
+{
+    cerr << "welle-cli " << VERSION << endl;
 }
 
 options_t parse_cmdline(int argc, char **argv)
@@ -360,7 +407,7 @@ options_t parse_cmdline(int argc, char **argv)
     options.rro.decodeTII = true;
 
     int opt;
-    while ((opt = getopt(argc, argv, "A:c:C:dDf:F:g:hp:PTs:t:w:u")) != -1) {
+    while ((opt = getopt(argc, argv, "A:c:C:dDf:F:g:hp:Ps:Tt:uvw:")) != -1) {
         switch (opt) {
             case 'A':
                 options.antenna = optarg;
@@ -404,6 +451,11 @@ options_t parse_cmdline(int argc, char **argv)
             case 'T':
                 options.rro.decodeTII = false;
                 break;
+            case 'v':
+                version();
+                cerr << endl;
+                copyright();
+                exit(0);
             case 'w':
                 options.web_port = std::atoi(optarg);
                 break;
@@ -435,8 +487,8 @@ options_t parse_cmdline(int argc, char **argv)
 
 int main(int argc, char **argv)
 {
-    cerr << "Hello this is welle-cli " << VERSION << endl;
     auto options = parse_cmdline(argc, argv);
+    version();
 
     RadioInterface ri;
 
diff --git a/src/welle-gui/QML/ExpertView.qml b/src/welle-gui/QML/ExpertView.qml
index 7d81dab..1819a1b 100644
--- a/src/welle-gui/QML/ExpertView.qml
+++ b/src/welle-gui/QML/ExpertView.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
 import QtQuick 2.2
 import QtQuick.Controls 2.4
 import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/GeneralView.qml b/src/welle-gui/QML/GeneralView.qml
index ae1aac3..ff1caa1 100644
--- a/src/welle-gui/QML/GeneralView.qml
+++ b/src/welle-gui/QML/GeneralView.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Layouts 1.3
 import Qt.labs.settings 1.0
@@ -58,6 +83,12 @@ GridLayout {
         // Create new view
         console.debug("Creating component: " + path)
         var component = Qt.createComponent(path);
+        if( component.status !== Component.Ready )
+        {
+            if( component.status === Component.Error )
+                console.debug("Error:"+ component.errorString() );
+            return;
+        }
         var object = component.createObject(gridLayout);
         object.sourcePath = path; // Save path inside component to make a saving possible
         object.isExpert = Qt.binding(function() { return isExpert })
diff --git a/src/welle-gui/QML/InfoPage.qml b/src/welle-gui/QML/InfoPage.qml
index 1754f14..371e6bb 100644
--- a/src/welle-gui/QML/InfoPage.qml
+++ b/src/welle-gui/QML/InfoPage.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Layouts 1.3
 import QtQuick.Controls 2.0
diff --git a/src/welle-gui/QML/MainView.qml b/src/welle-gui/QML/MainView.qml
index a44a7f7..468730c 100644
--- a/src/welle-gui/QML/MainView.qml
+++ b/src/welle-gui/QML/MainView.qml
@@ -1,42 +1,27 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of The Qt Company Ltd nor the names of its
-**     contributors may be used to endorse or promote products derived
-**     from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
 
 import QtQuick 2.9
 import QtQuick.Layouts 1.3
@@ -44,6 +29,7 @@ import QtQuick.Controls 2.3
 import QtQuick.Controls.Material 2.1
 import QtQuick.Controls.Universal 2.1
 import QtQuick.Window 2.2
+import QtGraphicalEffects 1.0
 import Qt.labs.settings 1.0
 
 import "texts"
@@ -58,8 +44,8 @@ ApplicationWindow {
     property bool isLoaded: false
     property bool isStationNameInWindowTitle: false
 
-    StationListModel { id: stationList }
-    StationListModel { id: favoritsList }
+    StationListModel { id: stationList ; type: "all"}
+    StationListModel { id: favoritsList ; type: "favorites"}
 
     readonly property bool inPortrait: mainWindow.width < mainWindow.height
 
@@ -102,12 +88,16 @@ ApplicationWindow {
             mainWindow.height = getHeight()
         }
 
-        // Show error message if one occured during startup
+        // Show error message if one occurred during startup
         if(errorMessagePopup.text != "")
             errorMessagePopup.open();
 
         updateTheme()
 
+        guiHelper.updateMprisStationList(stationChannelView.model.serialized,
+                                         stationChannelView.model.type,
+                                         stationListBox.currentIndex)
+
         isLoaded = true
     }
 
@@ -117,13 +107,14 @@ ApplicationWindow {
         property alias stationListSerialize: stationList.serialized
         property alias favoritsListSerialize: favoritsList.serialized
         property alias stationListBoxIndex: stationListBox.currentIndex
+        property alias volume: volumeSlider.value
     }
 
     header: ToolBar {
         id: overlayHeader
 
         RowLayout {
-            spacing: 20
+            spacing: 5
             anchors.fill: parent
 
             ToolButton {
@@ -140,8 +131,8 @@ ApplicationWindow {
                     else
                     {
                         // Workaround for touch displays. (Discovered with Windows 10)
-                        // For some reason the dawer will be closed before it is openend
-                        // Disbale closing
+                        // For some reason the dawer will be closed before it is opened
+                        // Disable closing
                         stationDrawer.closePolicy = Popup.NoAutoClose
 
                         // Open drawer
@@ -160,6 +151,308 @@ ApplicationWindow {
                 Layout.fillWidth: true
             }
 
+            ToolButton {
+                anchors.top: parent.top
+                anchors.bottom: parent.bottom
+                highlighted: startStopIconMouseArea.pressed
+
+                MouseArea {
+                    id: startStopIconMouseArea
+                    anchors.fill: parent
+                    hoverEnabled: true
+                    onClicked: {
+                        if (radioController.isPlaying || radioController.isChannelScan) {
+                            startStopIcon.stop()
+                        } else {
+                            startStopIcon.play()
+                        }
+                    }
+                }
+
+                Image {
+                    id: startStopIcon
+                    anchors.horizontalCenter: parent.horizontalCenter
+                    anchors.verticalCenter: parent.verticalCenter
+
+                    height: parent.availableHeight - parent.padding
+                    fillMode: Image.PreserveAspectFit
+
+                    Accessible.role: Accessible.Button
+                    Accessible.name: (radioController.isPlaying || radioController.isChannelScan) ? qsTr("Stop") : qsTr("Play")
+                    Accessible.description: radioController.isPlaying ? qsTr("Stop playback") : radioController.isChannelScan ? qsTr("Stop scan") : qsTr("Start playback")
+                    Accessible.onPressAction: startStopIconMouseArea.clicked(mouse)
+
+                    WToolTip {
+                        text: (radioController.isPlaying || radioController.isChannelScan) ? qsTr("Stop") : qsTr("Play")
+                        visible: startStopIconMouseArea.containsMouse
+                    }
+
+                    Component.onCompleted: { startStopIcon.setStartPlayIcon() }
+
+                    Shortcut {
+                        context: Qt.ApplicationShortcut
+                        autoRepeat: false
+                        sequences: ["Media Pause", "Toggle Media Play/Pause", "S"]
+                        onActivated: startStopIconMouseArea.clicked(0)
+                    }
+                    Shortcut {
+                        context: Qt.ApplicationShortcut
+                        autoRepeat: false
+                        sequences: ["Media Stop"]
+                        onActivated: if (radioController.isPlaying || radioController.isChannelScan) startStopIcon.stop()
+                    }
+                    Shortcut {
+                        context: Qt.ApplicationShortcut
+                        autoRepeat: false
+                        sequences: ["Media Play"]
+                        onActivated: if (!radioController.isPlaying) startStopIcon.play()
+                    }
+
+                    Connections {
+                        target: radioController
+                        onIsPlayingChanged: {
+                            startStopIcon.setStartPlayIcon()
+                        }
+                        onIsChannelScanChanged: {
+                            startStopIcon.setStartPlayIcon()
+                        }
+                    }
+
+                    function setStartPlayIcon() {
+                        if (radioController.isPlaying || radioController.isChannelScan) {
+                            startStopIcon.source = "qrc:/icons/welle_io_icons/20x20/stop.png"
+                        } else {
+                            startStopIcon.source = "qrc:/icons/welle_io_icons/20x20/play.png"
+                        }
+                    }
+
+                    function play() {
+                        var channel = radioController.lastChannel[1]
+                        var sidHex = radioController.lastChannel[0]
+                        stationList.play(channel, sidHex)
+                    }
+
+                    function stop() {
+                        if (radioController.isPlaying)
+                            radioController.stop();
+                        else if (radioController.isChannelScan)
+                            radioController.stopScan()
+                    }
+                }
+
+                ColorOverlay {
+                    id: startStopIconOverlay
+                    anchors.fill: startStopIcon
+                    source: startStopIcon
+                    color: (mainWindow.Material.theme === Material.Dark ) ? "lightgrey" : (mainWindow.Universal.theme === Universal.Dark ) ? "lightgrey" : TextStyle.textColor
+                }
+            }
+
+            ToolButton {
+                id: speakerIconContainer
+                anchors.top: parent.top
+                anchors.bottom: parent.bottom
+                highlighted: speakerIconMouseArea.pressed
+
+                MouseArea {
+                    id: speakerIconMouseArea
+                    anchors.fill: parent
+                    hoverEnabled: true
+                    acceptedButtons: Qt.LeftButton | Qt.RightButton
+                    onPressAndHold: volumePopup.open()
+                    onClicked: {
+                        if(mouse.button == Qt.RightButton)
+                            volumePopup.open()
+                        else
+                            if(radioController.volume !== 0)
+                                volumeSlider.value = 0
+                            else
+                                volumeSlider.value = 1
+                    }
+                    onWheel: (wheel.angleDelta.y > 0) ? volumeSlider.value = volumeSlider.value + 0.1 :  volumeSlider.value = volumeSlider.value - 0.1
+                }
+
+                contentItem: Item {
+                    // Use 2 Images to switch between speaker & speaker_mute icon (instead of toggle button).
+                    // Permits use of color with org.kde.desktop style
+                    Image {
+                        id: speakerIcon
+                        anchors.horizontalCenter: parent.horizontalCenter
+                        anchors.verticalCenter: parent.verticalCenter
+
+                        height: speakerIconContainer.availableHeight - speakerIconContainer.padding
+                        fillMode: Image.PreserveAspectFit
+
+                        visible: false
+
+                        source: "qrc:/icons/welle_io_icons/20x20@2/speaker.png"
+
+                        WToolTip {
+                            text: qsTr("Volume (%1)").arg(volumeLabel.text)
+                            visible: speakerIconMouseArea.containsMouse
+                        }
+
+                        Accessible.role: Accessible.Button
+                        Accessible.name: qsTr("Volume")
+                        Accessible.description: qsTr("Toggle volume slider")
+                        Accessible.onPressAction: speakerIconMouseArea.clicked(mouse)
+                    }
+                    Image {
+                        id: speakerIconMuted
+                        anchors.top: speakerIcon.top
+                        anchors.left: speakerIcon.left
+                        width: speakerIcon.width
+                        height: speakerIcon.height
+                        visible: false
+
+                        source: "qrc:/icons/welle_io_icons/20x20@2/speaker_mute.png"
+                    }
+                    ColorOverlay {
+                        id: speakerIconMutedRed
+                        visible: false
+                        anchors.fill: speakerIconMuted
+                        source: speakerIconMuted
+                        color: "red"
+                    }
+
+                    // We don't display the "speakerIcon" item, but the "speakerIconMaskApplied"
+                    // item the right part of which is +/- opacified depending on the volume
+                    Item {
+                        id: hidingRect
+                        anchors.fill: speakerIcon
+                        visible: false
+                        Rectangle {
+                            anchors.right: parent.right
+                            color: "green" //Could be any
+                            width: speakerIcon.width *0.30
+                            height: speakerIcon.height
+                            opacity: 1 - volumeSlider.value
+                        }
+                    }
+                    OpacityMask {
+                        id: speakerIconMaskApplied
+                        anchors.fill: speakerIcon
+                        source: speakerIcon
+                        maskSource: hidingRect
+                        invert: true
+                        visible: false
+                    }
+                    ColorOverlay {
+                        id: speakerIconMaskAppliedOverlay
+                        anchors.fill: speakerIconMaskApplied
+                        source: speakerIconMaskApplied
+                        color: (mainWindow.Material.theme === Material.Dark ) ? "lightgrey" : (mainWindow.Universal.theme === Universal.Dark ) ? "lightgrey" : TextStyle.textColor
+                    }
+
+                    Popup {
+                        id: volumePopup
+                        y: speakerIconContainer.y + speakerIconContainer.height
+                        x: Math.round(speakerIconContainer.x + (speakerIconContainer.width / 2) - volumePopup.width/2 )
+
+                        parent: Overlay.overlay
+
+                        //modal: true  //if 'true', double click on the speaker icon will not be caught
+                        focus: true
+                        closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
+
+                        onOpened: volumeSliderTrigger.restart()
+                        onClosed: volumeSliderTrigger.stop()
+
+                        ColumnLayout{
+                            Slider {
+                                id: volumeSlider
+
+                                Layout.alignment: Qt.AlignCenter
+
+                                height: 100
+                                orientation: Qt.Vertical
+                                snapMode: Slider.SnapAlways
+                                wheelEnabled: true
+
+                                from: 0
+                                to: 1
+                                stepSize: 0.01
+                                value: radioController.volume
+
+                                onValueChanged: {
+                                    setVolume(value)
+                                    if (visible)
+                                        volumeSliderTrigger.restart()
+                                }
+
+                                Connections {
+                                    target: radioController
+                                    onVolumeChanged: {
+                                        volumeSlider.value = volume
+                                    }
+                                }
+
+                                Timer {
+                                    id: volumeSliderTrigger
+                                    interval: 3000
+                                    running: false
+                                    repeat: false
+                                    onTriggered: { volumePopup.close() }
+                                }
+
+                                function setVolume(value) {
+                                    if (volumeSlider.value != radioController.volume) {
+                                        if (value === 0) {
+                                            radioController.setVolume(value)
+                                            speakerIconMutedRed.visible = true
+                                            speakerIconMaskAppliedOverlay.visible = false
+                                        } else {
+                                            radioController.setVolume(value)
+                                            speakerIconMutedRed.visible = false
+                                            speakerIconMaskAppliedOverlay.visible = true
+                                        }
+                                    }
+                                }
+                            }
+
+                            TextStandart {
+                                id: volumeLabel
+                                Layout.alignment: Qt.AlignCenter
+
+                                font.pixelSize: Units.em(0.8)
+                                text: Math.round(volumeSlider.value*100) + "%"
+
+                                Accessible.description: qsTr("Volume set to %1").arg(text)
+                            }
+
+                            Shortcut {
+                                context: Qt.ApplicationShortcut
+                                autoRepeat: true
+                                sequences: ["Ctrl+Up", "Volume Up"]
+                                onActivated: {
+                                    volumeSlider.visible = true
+                                    volumeSlider.value = volumeSlider.value + volumeSlider.stepSize
+                                }
+                            }
+
+                            Shortcut {
+                                context: Qt.ApplicationShortcut
+                                autoRepeat: true
+                                sequences: ["Ctrl+Down", "Volume Down"]
+                                onActivated: {
+                                    volumeSlider.visible = true
+                                    volumeSlider.value = volumeSlider.value - volumeSlider.stepSize
+                                }
+                            }
+
+                            Shortcut {
+                                context: Qt.ApplicationShortcut
+                                autoRepeat: false
+                                sequences: ["m", "Volume Mute"]
+                                onActivated: {
+                                    volumeSlider.visible = true
+                                    volumeSlider.value = !(volumeSlider.value)
+                                }
+                            }
+                        }
+                    }
+                }
+            }
             ToolButton {
                 icon.name: "menu"
                 icon.width: Units.dp(20)
@@ -223,7 +516,7 @@ ApplicationWindow {
         visible: !inPortrait
 
         // Workaround for touch displays. (Discovered with Windows 10)
-        // For some reason the dawer will be closed before it is openend
+        // For some reason the dawer will be closed before it is opened
         // Enable closing again
         onOpened: closePolicy = Popup.CloseOnEscape | Popup.CloseOnPressOutside
 
@@ -250,6 +543,9 @@ ApplicationWindow {
                         case 0: stationChannelView.model = stationList; break;
                         case 1: stationChannelView.model = favoritsList; break;
                         }
+                        guiHelper.updateMprisStationList(stationChannelView.model.serialized,
+                                                         stationChannelView.model.type,
+                                                         stationListBox.currentIndex)
                     }
                 }
 
@@ -332,7 +628,7 @@ ApplicationWindow {
                 Layout.fillHeight: true
                 clip: true
                 delegate: StationDelegate {
-                    stationNameText: stationName
+                    stationNameText: stationName.trim()
                     stationSIdValue: stationSId
                     channelNameText: channelName == "File" ? qsTr("File") : channelName
                     isFavorit: favorit
@@ -350,6 +646,109 @@ ApplicationWindow {
                 }
 
                 ScrollIndicator.vertical: ScrollIndicator { }
+
+                Shortcut {
+                    context: Qt.ApplicationShortcut
+                    autoRepeat: false
+                    sequences: ["n", "Media Next"]
+                    onActivated: {
+                        var channel = radioController.lastChannel[1]
+                        var sidHex = radioController.lastChannel[0]
+                        var index = stationChannelView.model.getIndexNext(parseInt(sidHex,16), channel)
+                        stationChannelView.model.playAtIndex(index)
+                    }
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut
+                    autoRepeat: false
+                    sequences: ["p", "Media Previous"]
+                    onActivated: {
+                        var channel = radioController.lastChannel[1]
+                        var sidHex = radioController.lastChannel[0]
+                        var index = stationChannelView.model.getIndexPrevious(parseInt(sidHex,16), channel)
+                        stationChannelView.model.playAtIndex(index)
+                    }
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F1", "1"]
+                    onActivated: stationChannelView.model.playAtIndex(0)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F2", "2"]
+                    onActivated: stationChannelView.model.playAtIndex(1)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F3", "3"]
+                    onActivated: stationChannelView.model.playAtIndex(2)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F4", "4"]
+                    onActivated: stationChannelView.model.playAtIndex(3)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F5", "5"]
+                    onActivated: stationChannelView.model.playAtIndex(4)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F6", "6"]
+                    onActivated: stationChannelView.model.playAtIndex(5)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F7", "7"]
+                    onActivated: stationChannelView.model.playAtIndex(6)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F8", "8"]
+                    onActivated: stationChannelView.model.playAtIndex(7)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F9", "9"]
+                    onActivated: stationChannelView.model.playAtIndex(8)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F10", "0"]
+                    onActivated: stationChannelView.model.playAtIndex(9)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F11", "Ctrl+1"]
+                    onActivated: stationChannelView.model.playAtIndex(10)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["F12", "Ctrl+2"]
+                    onActivated: stationChannelView.model.playAtIndex(11)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+3"]
+                    onActivated: stationChannelView.model.playAtIndex(12)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+4"]
+                    onActivated: stationChannelView.model.playAtIndex(13)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+5"]
+                    onActivated: stationChannelView.model.playAtIndex(14)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+6"]
+                    onActivated: stationChannelView.model.playAtIndex(15)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+7"]
+                    onActivated: stationChannelView.model.playAtIndex(16)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+8"]
+                    onActivated: stationChannelView.model.playAtIndex(17)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+9"]
+                    onActivated: stationChannelView.model.playAtIndex(18)
+                }
+                Shortcut {
+                    context: Qt.ApplicationShortcut; autoRepeat: false; sequences: ["Ctrl+0"]
+                    onActivated: stationChannelView.model.playAtIndex(19)
+                }
             }
 
             RowLayout {
@@ -600,7 +999,7 @@ ApplicationWindow {
         onMaximizeWindow: showMaximized()
         onRestoreWindow: {
             // On Linux (KDE?): Hide before we restore 
-            // otherwise the window will occasionaly not be brought to the front
+            // otherwise the window will occasionally not be brought to the front
             if (Qt.platform.os === "linux" && !active) // Linux Workaround to display the window
                 hide()
             showNormal()
@@ -615,6 +1014,13 @@ ApplicationWindow {
             guiHelper.tryHideWindow()
     }
 
+    Shortcut {
+        context: Qt.ApplicationShortcut
+        autoRepeat: false
+        sequences: [StandardKey.Quit]
+        onActivated: guiHelper.close()
+    }
+
     function updateTheme() {
         if (guiHelper.getQQStyle === "Universal") {
             switch(globalSettingsLoader.item.qQStyleTheme) {
diff --git a/src/welle-gui/QML/MotView.qml b/src/welle-gui/QML/MotView.qml
index 232c549..107ce73 100644
--- a/src/welle-gui/QML/MotView.qml
+++ b/src/welle-gui/QML/MotView.qml
@@ -1,6 +1,32 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
 import QtQuick 2.0
 import QtQuick.Layouts 1.3
 import QtQuick.Controls 2.3
+import QtQuick.Dialogs 1.0
 
 import "texts"
 import "components"
@@ -9,172 +35,263 @@ import "components"
 ViewBaseFrame {
     labelText: qsTr("MOT Slide Show")
 
-    // The component is like a factory for MyTabButtons now.
-    Component {
-        id: myTabButton
-
-        TabButton {
-            property string categoryTitle
-            property int categoryId: 0
-            property var pictureList: []
-            property var slideIdList: []
-            property int currentPictureIndex: 0
-            text: categoryTitle
+    property var slideList: []
+    property var currentCategoryId: 0
+    property var currentCategoryListPos: 0
+    property var latestPictureName: ""
+
+    FileDialog {
+        id: fileDialog
+        title: "Please choose a folder"
+        folder: shortcuts.home
+        selectFolder: true
+        onAccepted: {
+            guiHelper.saveMotImages(fileDialog.folder)
         }
     }
 
     Component.onCompleted: {
         addEntry( qsTr("Save all images"),
                   function() {
-                    guiHelper.saveMotImages()
+                    fileDialog.open()
                 })
+
+        _initCategories()
+    }
+
+    ListModel {
+        id: categoryListModel
     }
 
     content: Item {
         anchors.fill: parent
 
-        ColumnLayout {
+        RowLayout {
             anchors.fill: parent
 
-            TabBar {
-                Layout.fillWidth: true
-                id: bar
-                visible: count > 1
+            ColumnLayout {
+                Layout.fillHeight: true
+                Layout.preferredWidth: Units.dp(180)
+                visible: slideList.length > 0
 
-                TabButton {
-                    id: latestPicture
-                    property string pictureName
-                    text: qsTr("Latest")
-                }
+                ListView {
+                    Layout.fillWidth: true
+                    Layout.fillHeight: true
+                    Layout.alignment: Qt.AlignLeft
 
-                onCurrentIndexChanged: {
-                    if(currentIndex > 0)
-                        motImage.source = "image://SLS/" + currentItem.pictureList[0]
-                    else
-                        motImage.source = "image://SLS/" + currentItem.pictureName
-                }
-            }
+                    model: categoryListModel
+
+                    delegate: Item {
+                        width: parent.width
+                        height: Units.dp(20)
 
-            RowLayout {
-                WButton {
-                    icon.name: "back"
-                    visible: bar.currentIndex > 0 && bar.currentItem.pictureList.length > 1 // visible only if we have more then one picture
+                        Rectangle {
+                            anchors.fill: parent
+                            color: mouse.pressed ? "lightgrey" : "ghostwhite"
+                            visible: mouse.pressed || categoryId === currentCategoryId
+                        }
 
-                    onPressed: {
-                        if(bar.currentIndex > 0) {
-                            bar.currentItem.currentPictureIndex--
+                        MouseArea {
+                            id: mouse
+                            onClicked: _categroryClicked(categoryId)
+                            anchors.fill: parent
 
-                            if(bar.currentItem.currentPictureIndex < 0)
-                                bar.currentItem.currentPictureIndex = bar.currentItem.pictureList.length - 1
+                            TextStandart {
+                                anchors.left: parent.left
+                                anchors.verticalCenter: parent.verticalCenter
+                                anchors.leftMargin: Units.dp(10)
 
-                            motImage.source = "image://SLS/" + bar.currentItem.pictureList[bar.currentItem.currentPictureIndex]
+                                text: categoryTitle
+                            }
                         }
                     }
                 }
 
-                Image {
-                    id: motImage
+                RowLayout {
+                    Layout.preferredWidth: Units.dp(180)
 
-                    fillMode: Image.PreserveAspectFit
-                    Layout.fillWidth: true
-                    Layout.fillHeight: true
+                    WButton {
+                        icon.name: "back"
+                        Layout.preferredHeight: Units.dp(20)
+                        Layout.fillWidth: true
+                        visible: slideList.length > 1 && slideList[currentCategoryListPos][2].length > 1 // visible only if we have more then one picture
 
-                    Connections{
-                        target: guiHelper
-                        onMotChanged:{
-                            latestPicture.pictureName = pictureName
-
-                            // Display slide show only of latest tab is select
-                            if(bar.currentIndex === 0)
-                                motImage.source = "image://SLS/" + pictureName
-
-                            if(categoryTitle !== "" && categoryId !== 0) {
-                                // Check if category exists, if not create it
-                                var foundCategory = false
-                                for (var i = 1; i < bar.contentChildren.length; ++i) {
-                                    if(bar.contentChildren[i].categoryId === categoryId)
-                                        foundCategory = true
-                                }
-                                // Create new tab
-                                if(!foundCategory) {
-                                    bar.addItem(myTabButton.createObject(bar , {"categoryTitle": categoryTitle, "categoryId": categoryId}))
-                                }
+                        onPressed: {
+                            if(currentCategoryListPos > 0) {
+                                categoryListModel.get(currentCategoryListPos).currentPictureIndex--
 
-                                // Put picture name into category
-                                for (i = 1; i < bar.contentChildren.length; ++i) {
-                                    // Find the correct category
-                                    if(bar.contentChildren[i].categoryId === categoryId) {
-                                        // Check if picture is already in list
-                                        var foundPicture = false
-                                        for( var j=0; j< bar.contentChildren[i].pictureList.length; j++) {
-                                            if(bar.contentChildren[i].slideIdList[j] === slideId) { // Found picture
-                                                bar.contentChildren[i].pictureList[j] = pictureName
-                                                foundPicture = true
-                                            }
-                                        }
-                                        if(!foundPicture) {
-                                            bar.contentChildren[i].slideIdList.push(slideId)
-                                            bar.contentChildren[i].pictureList.push(pictureName)
-                                            bar.contentChildren[i].pictureListChanged()
-                                        }
-                                    }
-                                }
+                                if(categoryListModel.get(currentCategoryListPos).currentPictureIndex < 0)
+                                    categoryListModel.get(currentCategoryListPos).currentPictureIndex = slideList[currentCategoryListPos][2].length - 1
+
+                                motImage.source = "image://SLS/" + slideList[currentCategoryListPos][2][categoryListModel.get(currentCategoryListPos).currentPictureIndex][1]
                             }
                         }
+                    }
 
-                        onMotReseted:{
-                            // Delete tabs
-                            for (var i = 1; i < bar.contentChildren.length; ++i) {
-                                bar.contentChildren[i].destroy()
-                            }
+                    WButton {
+                        icon.name: "next"
+                        Layout.preferredHeight: Units.dp(20)
+                        Layout.fillWidth: true
+                        visible: slideList.length > 1 && slideList[currentCategoryListPos][2].length > 1 // visible only if we have more then one picture
+
+                        onPressed: {
+                            if(currentCategoryListPos > 0) {
+                                categoryListModel.get(currentCategoryListPos).currentPictureIndex++
+
+                                categoryListModel.get(currentCategoryListPos).currentPictureIndex =
+                                        categoryListModel.get(currentCategoryListPos).currentPictureIndex % slideList[currentCategoryListPos][2].length
 
-                            motImage.source = "image://SLS/empty"
+                                motImage.source = "image://SLS/" + slideList[currentCategoryListPos][2][categoryListModel.get(currentCategoryListPos).currentPictureIndex][1]
+                            }
                         }
                     }
+                }
+
+                Label {
+                    visible: mainWindow.isExpertView
+                    text: currentCategoryListPos !== 0 && slideList[currentCategoryListPos][2].length > 1 ?
+                               "Total numbers of sildes: " + slideList[currentCategoryListPos][2].length
+                               : ""
+                    background: Rectangle { opacity: 0.6; color: "white" }
+                }
+            }
 
-                    ColumnLayout {
-                        anchors.fill: parent
+            ColumnLayout {
+                Layout.alignment: Qt.AlignRight
 
-                        Item {
+                RowLayout {
+                        Image {
+                            id: motImage
+
+                            fillMode: Image.PreserveAspectFit
+                            Layout.fillWidth: true
                             Layout.fillHeight: true
-                        }
+                            Layout.alignment: Qt.AlignTop
 
-                        Label {
-                            visible: mainWindow.isExpertView
-                            text: bar.currentIndex != 0 ?
-                                       "Picture: " + (bar.currentItem.currentPictureIndex+1) + " / " + bar.currentItem.pictureList.length
-                                       : " "
-                            background: Rectangle { opacity: 0.6; color: "white" }
-                        }
+                            Connections{
+                                target: guiHelper
+                                onMotChanged:{
+                                    latestPictureName = pictureName
 
-                        Label {
-                            visible: mainWindow.isExpertView && motImage.source != ""
-                            text: "image://sls/CategoryID/CategoryTitle/SlideID/ContentName"
-                            background: Rectangle { opacity: 0.6; color: "white" }
-                        }
+                                    // Display slide show only of latest tab is select
+                                    if(currentCategoryId === 0) {
+                                        motImage.source = "image://SLS/" + pictureName
+                                    }
 
-                        Label {
-                            visible: mainWindow.isExpertView
-                            text: motImage.source
-                            background: Rectangle { opacity: 0.6; color: "white" }
-                        }
-                    }
-                }
+                                    // Handle categories if exist
+                                    if(categoryTitle !== "" && categoryId !== 0) {
+
+                                        // Check if category exists, if not create it
+                                        var foundCategory = false
+                                        for (var i = 0; i < slideList.length; ++i) {
+                                            if(slideList[i][1] === categoryId)
+                                                foundCategory = true
+                                        }
+
+                                        // Create new tab
+                                        if(!foundCategory) {
+                                            //bar.addItem(myTabButton.createObject(bar , {"categoryTitle": categoryTitle, "categoryId": categoryId}))
+                                            categoryListModel.append({"categoryTitle": categoryTitle, "categoryId": categoryId, "currentPictureIndex": 0})
+                                            slideList.push([categoryTitle, categoryId, []])
+                                        }
+
+                                        // Put picture name into category
+                                        for (i=0; i < slideList.length; ++i) {
+                                            // Find the correct category
+                                            if(slideList[i][1] === categoryId) {
+                                                // Check if picture is already in list
+                                                var foundPicture = false
+                                                for( var j=0; j< slideList[i][2].length; j++) {
+                                                    if(slideList[i][2][j][0] === slideId) { // Found picture
+                                                        // Replace picture name
+                                                        slideList[i][2][j][1] = pictureName
+                                                        foundPicture = true
+                                                        slideListChanged()
+                                                    }
+                                                }
+
+                                                // Add new picture
+                                                if(!foundPicture) {
+                                                    slideList[i][2].push([slideId, pictureName])
+                                                    slideListChanged()
+                                                }
+                                            }
+                                        }
+                                    }
+                                }
+
+                                onMotReseted:{
+                                    slideList = [];
+                                    categoryListModel.clear()
+                                    _initCategories()
+
+                                    motImage.source = "image://SLS/empty"
+                                }
+                            }
 
-                WButton {
-                    icon.name: "next"
-                    visible: bar.currentIndex > 0 && bar.currentItem.pictureList.length > 1 // visible only if we have more then one picture
+//                            ColumnLayout {
+//                                anchors.fill: parent
 
-                    onPressed: {
-                        if(bar.currentIndex > 0) {
-                            bar.currentItem.currentPictureIndex++
-                            bar.currentItem.currentPictureIndex = bar.currentItem.currentPictureIndex % bar.currentItem.pictureList.length
+//                                Item {
+//                                    Layout.fillHeight: true
+//                                }
 
-                            motImage.source = "image://SLS/" + bar.currentItem.pictureList[bar.currentItem.currentPictureIndex]
+//                                Label {
+//                                    visible: mainWindow.isExpertView && motImage.source != ""
+//                                    text: "image://sls/CategoryID/CategoryTitle/SlideID/ContentName"
+//                                    background: Rectangle { opacity: 0.6; color: "white" }
+//                                }
+
+//                                Label {
+//                                    visible: mainWindow.isExpertView
+//                                    text: motImage.source
+//                                    background: Rectangle { opacity: 0.6; color: "white" }
+//                                }
+//                            }
                         }
                     }
-                }
             }
         }
     }
+
+    onSlideListChanged: {
+        _updateSlide()
+    }
+
+    function _categroryClicked(categoryId) {
+        console.debug("Select category: " + categoryId)
+        currentCategoryId = categoryId
+        _updateSlide()
+    }
+
+    function _updateSlide() {
+        // Handle of latest slide is selected or no category slide show exists
+        if(currentCategoryId === 0 && latestPictureName !== "") {
+            motImage.source = "image://SLS/" + latestPictureName
+            return
+        }
+
+        if(slideList.length < 1)
+            return;
+
+        // Find the correct category position
+        for (var i=0; i < slideList.length; ++i) {
+            if(slideList[i][1] === currentCategoryId) {
+                currentCategoryListPos = i
+                break
+            }
+        }
+
+        // Get last picture from current selected categroy
+        var pictureName = slideList[currentCategoryListPos][2][slideList[currentCategoryListPos][2].length -1][1]
+
+        // Show slide
+        motImage.source = "image://SLS/" + pictureName
+    }
+
+    function _initCategories() {
+        categoryListModel.append({"categoryTitle": "Latest", "categoryId": 0, "currentPictureIndex": 0})
+        slideList.push(["Latest", 0, []])
+    }
+
 }
diff --git a/src/welle-gui/QML/RadioView.qml b/src/welle-gui/QML/RadioView.qml
index 681404f..f69e4c8 100644
--- a/src/welle-gui/QML/RadioView.qml
+++ b/src/welle-gui/QML/RadioView.qml
@@ -1,4 +1,29 @@
-import QtQuick 2.2
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+import QtQuick 2.9
 import QtQuick.Layouts 1.1
 import QtQuick.Controls 2.3
 import QtGraphicalEffects 1.0
@@ -19,46 +44,6 @@ ViewBaseFrame {
         text: radioController.ensemble.trim()
     }
 
-    // Use 2 Images to switch between speaker & speaker_mute icon (instead of toggle button). 
-    // Permits use of color with org.kde.desktop style
-    Image {
-        id: speakerIcon
-        anchors.verticalCenter: signalStrength.verticalCenter
-        anchors.right: parent.right
-        width: Units.dp(30)
-        height: Units.dp(30)
-        visible: true
-        source: "qrc:/icons/welle_io_icons/20x20@2/speaker.png"
-
-        MouseArea {
-            anchors.fill: parent
-            onClicked: {radioController.setVolume(0); speakerIconMutedRed.visible = true; speakerIcon.visible = false}
-        }
-    }
-
-    Image {
-        id: speakerIconMuted
-        anchors.verticalCenter: signalStrength.verticalCenter
-        anchors.right: parent.right
-        width: Units.dp(30)
-        height: Units.dp(30)
-        visible: false
-
-        source: "qrc:/icons/welle_io_icons/20x20@2/speaker_mute.png"
-    }
-
-    ColorOverlay {
-        id: speakerIconMutedRed
-        visible: false
-        anchors.fill: speakerIconMuted
-        source: speakerIconMuted
-        color: "red"
-        MouseArea {
-            anchors.fill: parent
-            onClicked: {radioController.setVolume(100); speakerIconMutedRed.visible = false; speakerIcon.visible = true}
-        }
-    }
-
     RowLayout{
         id: signalStrength
         anchors.top: parent.top
@@ -132,7 +117,7 @@ ViewBaseFrame {
                     }
                     
                     visible: opacity == 0 ? false : true
-                    opacity: 100
+                    opacity: 0
                     
                     Connections {
                         target: frame
@@ -193,15 +178,7 @@ ViewBaseFrame {
                     
                     Connections {
                         target: antennaSymbol
-                        onIsSignalChanged: { 
-                            if (antennaSymbol.isSignal) {
-                                antennaIconNoSignalRed.visible = false; 
-                                antennaIcon.visible = true;
-                            } else {
-                                antennaIconNoSignalRed.visible = true; 
-                                antennaIcon.visible = false;
-                            }
-                        }
+                        onIsSignalChanged: setAntennaVisibility()
                     }
                     
                     NumberAnimation on opacity {
@@ -226,6 +203,8 @@ ViewBaseFrame {
                             else
                                 __setIsSignal(false)
                         }
+                        onIsPlayingChanged: setAntennaVisibility()
+                        onIsChannelScanChanged: setAntennaVisibility()
                     }
                 }
             }
@@ -284,7 +263,7 @@ ViewBaseFrame {
         }
         else {
             antennaSymbol.isSignal = false
-            antennaSymbol.opacity = 100
+            antennaSymbol.opacity = 1.0
             effect.stop()
         }
     }
@@ -295,4 +274,21 @@ ViewBaseFrame {
         else
             antennaSymbol.state = "alignBottom"
     }
+
+    function setAntennaVisibility() {
+        if (!radioController.isPlaying && !radioController.isChannelScan) {
+            antennaIconNoSignalRed.visible = false;
+            antennaIcon.visible = false;
+            return
+        }
+        if (antennaSymbol.isSignal) {
+            antennaIconNoSignalRed.visible = false;
+            antennaIcon.visible = true;
+        } else {
+            antennaIconNoSignalRed.visible = true;
+            antennaIcon.visible = false;
+            antennaSymbol.opacity = 1.0
+            effect.stop()
+        }
+    }
 }
diff --git a/src/welle-gui/QML/components/MessagePopup.qml b/src/welle-gui/QML/components/MessagePopup.qml
index c5b47ff..b385936 100644
--- a/src/welle-gui/QML/components/MessagePopup.qml
+++ b/src/welle-gui/QML/components/MessagePopup.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.5
 import QtQuick.Controls 2.3
 import QtGraphicalEffects 1.0
diff --git a/src/welle-gui/QML/components/SettingSection.qml b/src/welle-gui/QML/components/SettingSection.qml
index e92d685..22b37b9 100644
--- a/src/welle-gui/QML/components/SettingSection.qml
+++ b/src/welle-gui/QML/components/SettingSection.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.6
 import QtQuick.Layouts 1.1
 
diff --git a/src/welle-gui/QML/components/StationDelegate.qml b/src/welle-gui/QML/components/StationDelegate.qml
index dadf874..37d467c 100644
--- a/src/welle-gui/QML/components/StationDelegate.qml
+++ b/src/welle-gui/QML/components/StationDelegate.qml
@@ -1,48 +1,34 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the examples of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:BSD$
-** You may use this file under the terms of the BSD license as follows:
-**
-** "Redistribution and use in source and binary forms, with or without
-** modification, are permitted provided that the following conditions are
-** met:
-**   * Redistributions of source code must retain the above copyright
-**     notice, this list of conditions and the following disclaimer.
-**   * Redistributions in binary form must reproduce the above copyright
-**     notice, this list of conditions and the following disclaimer in
-**     the documentation and/or other materials provided with the
-**     distribution.
-**   * Neither the name of The Qt Company Ltd nor the names of its
-**     contributors may be used to endorse or promote products derived
-**     from this software without specific prior written permission.
-**
-**
-** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.2
 import QtQuick.Layouts 1.1
 import QtQuick.Controls 2.3
 import QtQuick.Controls.Material 2.1
 import QtQuick.Controls.Universal 2.1
+import QtGraphicalEffects 1.0
 
 // Import custom styles
 import "../texts"
@@ -68,6 +54,13 @@ Item {
         visible: mouse.pressed
     }
 
+    Rectangle {
+        id: selectRecangle
+        anchors.fill: parent
+        color: (mainWindow.Material.theme === Material.Dark ) ? "dimgrey" : (mainWindow.Universal.theme === Universal.Dark ) ? "dimgrey" : "whitesmoke"
+        visible: false
+    }
+
     MouseArea {
         id: mouse
         onClicked: root.clicked()
@@ -78,8 +71,53 @@ Item {
             anchors.left: parent.left
             anchors.leftMargin: Units.dp(10)
 
-            TextStandart {
-                id: stationItem
+            RowLayout {
+                TextStandart {
+                    id: stationItem
+                }
+
+//                Item {
+//                    Layout.preferredHeight: playbackStatusImage.height
+//                    Layout.preferredWidth: playbackStatusImage.width
+//                    Image {
+//                        id: playbackStatusImage
+//                        width: Units.dp(10)
+//                        height: Units.dp(10)
+//                        fillMode: Image.PreserveAspectFit
+//                        visible:false
+//                        source: "qrc:/icons/welle_io_icons/20x20/play.png"
+
+//                        layer {
+//                            enabled: true
+//                            effect: ColorOverlay {
+//                                color: (mainWindow.Material.theme === Material.Dark ) ? "lightgrey" : (mainWindow.Universal.theme === Universal.Dark ) ? "lightgrey" : TextStyle.textColor
+//                            }
+//                        }
+//                    }
+//                    Item {
+//                        id: playbackStatusImageStrikethrough
+//                        anchors.fill: playbackStatusImage
+
+//                        Canvas {
+//                            id: playbackStatusImageStrikethroughCanvas
+//                            anchors.fill: parent
+//                            onPaint: {
+//                                var ctx = getContext("2d");
+//                                ctx.strokeStyle = (mainWindow.Material.theme === Material.Dark ) ? "lightgrey" : (mainWindow.Universal.theme === Universal.Dark ) ? "lightgrey" : TextStyle.textColor
+//                                ctx.lineWidth = 2
+//                                ctx.lineCap = "round"
+//                                ctx.beginPath()
+//                                ctx.moveTo(0, parent.height)
+//                                ctx.lineTo(parent.width, 0)
+//                                ctx.stroke()
+//                            }
+//                        }
+//                    }
+//                }
+
+                TextStation {
+                    id: channelPlayStatus
+                }
             }
 
             RowLayout {
@@ -109,4 +147,59 @@ Item {
         Accessible.name: isFavorit ? qsTr("Remove station from favorites") : qsTr("Add station to favorites")
         Accessible.onPressAction: click(mouse)
     }
+
+    Component.onCompleted: { setPlaybackStatus() }
+
+//    SequentialAnimation {
+//        id: playbackStatusImageEffect
+//        running: false
+//        loops: Animation.Infinite
+//        NumberAnimation {
+//            target: playbackStatusImage
+//            property: "opacity"
+//            from: 1
+//            to: 0.2
+//            duration: 1000;
+//        }
+//        NumberAnimation  {
+//            target:playbackStatusImage
+//            property: "opacity"
+//            from: 0.2
+//            to: 1
+//            duration: 1000;
+//        }
+//    }
+
+    Connections {
+        target: radioController
+        onIsPlayingChanged: setPlaybackStatus()
+    }
+
+    function setPlaybackStatus() {
+//        if (stationSIdValue == radioController.autoService) {
+//            playbackStatusImage.visible = true
+//            if (radioController.isPlaying) {
+//                //channelPlayStatus.text = ""
+//                //playbackStatusImageEffect.start() //Don't use the animation because it consumes CPU
+//                playbackStatusImage.opacity = 1
+//                playbackStatusImageStrikethrough.visible = false
+//            } else {
+//                //channelPlayStatus.text = qsTr("stopped")
+//                //playbackStatusImageEffect.stop() //Don't use the animation because it consumes CPU
+//                playbackStatusImage.opacity = 0.6
+//                playbackStatusImageStrikethrough.visible = true
+//                playbackStatusImageStrikethroughCanvas.requestPaint()
+//            }
+//        }
+//        else {
+//            //channelPlayStatus.text = ""
+//            playbackStatusImage.visible = false
+//            playbackStatusImageStrikethrough.visible = false
+//        }
+
+        if (stationSIdValue === radioController.autoService)
+            selectRecangle.visible = true
+        else
+            selectRecangle.visible = false
+    }
 }
diff --git a/src/welle-gui/QML/components/StationListModel.qml b/src/welle-gui/QML/components/StationListModel.qml
index 770f68a..ef6a6b6 100644
--- a/src/welle-gui/QML/components/StationListModel.qml
+++ b/src/welle-gui/QML/components/StationListModel.qml
@@ -1,13 +1,38 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 
 ListModel {
     property string serialized: ""
+    property string type: ""
 
     function addStation(station, sId, channel, favorit) {
         // Check if station already exists
         for (var i=0; i<count; i++) {
-            if (get(i).stationSId === sId && get(i).channelName === channel) {
-                get(i).stationName = station;
+            if (get(i).stationSId === sId) {
                 return;
             }
         }
@@ -51,12 +76,68 @@ ListModel {
         }
     }
 
+    function getStationName(sIdDec, channel) {
+        for(var i=0; i<count; i++) {
+            if(get(i).stationSId == sIdDec && get(i).channelName === channel) {
+                return get(i).stationName
+            }
+        }
+    }
+
+    function getIndex(sIdDec, channel) {
+        for(var i=0; i<count; i++) {
+            if(get(i).stationSId == sIdDec && get(i).channelName === channel) {
+                return i
+            }
+        }
+    }
+
+    function getIndexPrevious(sIdDec, channel) {
+        for(var i=0; i<count; i++) {
+            if(get(i).stationSId == sIdDec && get(i).channelName === channel) {
+                return Math.max(0, i-1)
+            }
+        }
+        console.debug("Station '" + sIdDec + "' not found in this list. Returning index 0")
+        return 0
+    }
+
+    function getIndexNext(sIdDec, channel) {
+        for(var i=0; i<count; i++) {
+            if(get(i).stationSId == sIdDec && get(i).channelName === channel) {
+                return Math.min(count-1, i+1)
+            }
+        }
+        console.debug("Station '" + sIdDec + "' not found in this list. Returning index 0")
+        return 0
+    }
+
+    function play(channel, sidHex) {
+        var sidDec = parseInt(sidHex,16);
+        var stationName = getStationName(sidDec, channel)
+        //console.debug("stationName: " + stationName + " channel: " + channel + " sidHex: "+ sidHex)
+        if (!channel || !sidHex || !stationName) {
+            infoMessagePopup.text = qsTr("Last played station not found.\nSelect a station to start playback.");
+            infoMessagePopup.open();
+        } else {
+            radioController.play(channel, stationName, sidDec)
+        }
+    }
+
+    function playAtIndex(index) {
+        if (index < count) {
+            //console.debug("stationName: " + get(index).stationName + " channel: " + get(index).channelName + " sidDec: " + get(index).stationSId)
+            radioController.play(get(index).channelName, get(index).stationName, get(index).stationSId)
+        }
+    }
+
     // Necessary workaround because the settings component doesn't saves models
     function serialize() {
         var tmp = []
         for (var i = 0; i < count; ++i)
             tmp.push(get(i))
         serialized = JSON.stringify(tmp)
+        guiHelper.updateMprisStationList(serialized, type, stationListBox.currentIndex)
     }
 
     function deSerialize() {
diff --git a/src/welle-gui/QML/components/Units.qml b/src/welle-gui/QML/components/Units.qml
index 5303a74..8a939ba 100644
--- a/src/welle-gui/QML/components/Units.qml
+++ b/src/welle-gui/QML/components/Units.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 pragma Singleton
 
 import QtQuick 2.2
diff --git a/src/welle-gui/QML/components/ViewBaseFrame.qml b/src/welle-gui/QML/components/ViewBaseFrame.qml
index 5971218..bda6c2b 100644
--- a/src/welle-gui/QML/components/ViewBaseFrame.qml
+++ b/src/welle-gui/QML/components/ViewBaseFrame.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Layouts 1.1
 import QtQuick.Controls 2.0
@@ -11,7 +36,8 @@ import "../components"
 Rectangle {
     id: root
     color: (Material.theme === Material.Dark || Universal.theme === Universal.Dark) ? "grey" : "white"
-    border.color: isExpert ? "lightgrey": "white"
+    //border.color: isExpert ? "lightgrey": "white"
+    border.color: "lightgrey"
 
     Layout.fillHeight: true
     Layout.fillWidth: true
@@ -34,7 +60,7 @@ Rectangle {
         }
     }
 
-    // Posibility to add options entries dynamically
+    // Possibility to add options entries dynamically
     function addEntry(title, onTriggered) {
         var obj = menuItem.createObject(menu, {text: title})
         obj.triggered.connect(onTriggered)
diff --git a/src/welle-gui/QML/components/WButton.qml b/src/welle-gui/QML/components/WButton.qml
index f66abb5..5ac0cdb 100644
--- a/src/welle-gui/QML/components/WButton.qml
+++ b/src/welle-gui/QML/components/WButton.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Controls 2.3
 import QtQuick.Layouts 1.3
diff --git a/src/welle-gui/QML/components/WComboBox.qml b/src/welle-gui/QML/components/WComboBox.qml
index c33ffa8..e5b3f59 100644
--- a/src/welle-gui/QML/components/WComboBox.qml
+++ b/src/welle-gui/QML/components/WComboBox.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.7
 import QtQuick.Controls 2.3
 import QtQuick.Layouts 1.3
@@ -25,6 +50,11 @@ ComboBox {
         highlighted: comboBox.highlightedIndex === index
     }
 
+    Keys.onShortcutOverride: {
+        if (event.key == Qt.Key_M || event.key == Qt.Key_S || event.key == Qt.Key_P || event.key == Qt.Key_N)
+            event.accepted = true
+    }
+
     TextMetrics {
         id: textMetrics
     }
diff --git a/src/welle-gui/QML/components/WComboBoxList.qml b/src/welle-gui/QML/components/WComboBoxList.qml
index 364e404..cdddf50 100644
--- a/src/welle-gui/QML/components/WComboBoxList.qml
+++ b/src/welle-gui/QML/components/WComboBoxList.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.7
 import QtQuick.Controls 2.3
 import QtQuick.Layouts 1.3
@@ -25,6 +50,11 @@ ComboBox {
         highlighted: comboBox.highlightedIndex === index
     }
 
+    Keys.onShortcutOverride: {
+        if (event.key == Qt.Key_M || event.key == Qt.Key_S || event.key == Qt.Key_P || event.key == Qt.Key_N)
+            event.accepted = true
+    }
+
     TextMetrics {
         id: textMetrics
     }
diff --git a/src/welle-gui/QML/components/WDialog.qml b/src/welle-gui/QML/components/WDialog.qml
index 3d8abf4..30c85ef 100644
--- a/src/welle-gui/QML/components/WDialog.qml
+++ b/src/welle-gui/QML/components/WDialog.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Controls 2.3
 import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/components/WMenu.qml b/src/welle-gui/QML/components/WMenu.qml
index e329dc1..6c83373 100644
--- a/src/welle-gui/QML/components/WMenu.qml
+++ b/src/welle-gui/QML/components/WMenu.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Controls 2.3
 
diff --git a/src/welle-gui/QML/components/WSpectrum.qml b/src/welle-gui/QML/components/WSpectrum.qml
index 634c247..9d94f5e 100644
--- a/src/welle-gui/QML/components/WSpectrum.qml
+++ b/src/welle-gui/QML/components/WSpectrum.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtCharts 2.1
 import QtQuick.Layouts 1.1
@@ -54,7 +79,6 @@ ColumnLayout {
 
         Waterfall {
             id: waterfallPlot
-            sensitivity: sensitivitySlider.value
             minValue: yMin
             Layout.fillHeight: true
             Layout.fillWidth: true
@@ -93,26 +117,6 @@ ColumnLayout {
                     }
                 }
         }
-
-        Column {
-            spacing: 10
-
-            Text {
-                text: qsTr("Sensitivity")
-                anchors.horizontalCenter: parent.horizontalCenter
-            }
-            Slider {
-                id: sensitivitySlider
-                anchors.horizontalCenter: parent.horizontalCenter
-                height: 180
-                orientation: Qt.Vertical
-
-                from: 0.005
-                to: 0.1
-                stepSize: 0.0001
-                value: 0.02
-            }
-        }
     }
 
     ChartView {
diff --git a/src/welle-gui/QML/components/WSwitch.qml b/src/welle-gui/QML/components/WSwitch.qml
index d7ee2df..0007e75 100644
--- a/src/welle-gui/QML/components/WSwitch.qml
+++ b/src/welle-gui/QML/components/WSwitch.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.6
 import QtQuick.Controls 2.0
 import QtQuick.Controls.Material 2.1
diff --git a/src/welle-gui/QML/components/WToolTip.qml b/src/welle-gui/QML/components/WToolTip.qml
new file mode 100644
index 0000000..7a0bc60
--- /dev/null
+++ b/src/welle-gui/QML/components/WToolTip.qml
@@ -0,0 +1,34 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
+import QtQuick 2.0
+import QtQuick.Controls 2.0
+
+ToolTip {
+    id: toolTip
+
+    delay: 500
+    timeout: 5000
+}
diff --git a/src/welle-gui/QML/components/WTumbler.qml b/src/welle-gui/QML/components/WTumbler.qml
index c428fcf..dbc8e25 100644
--- a/src/welle-gui/QML/components/WTumbler.qml
+++ b/src/welle-gui/QML/components/WTumbler.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Controls 2.2
 import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/expertviews/ConstellationGraph.qml b/src/welle-gui/QML/expertviews/ConstellationGraph.qml
index e490473..7bc2aab 100644
--- a/src/welle-gui/QML/expertviews/ConstellationGraph.qml
+++ b/src/welle-gui/QML/expertviews/ConstellationGraph.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtCharts 2.1
 import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/expertviews/ImpulseResponseGraph.qml b/src/welle-gui/QML/expertviews/ImpulseResponseGraph.qml
index 03d5bff..5247327 100644
--- a/src/welle-gui/QML/expertviews/ImpulseResponseGraph.qml
+++ b/src/welle-gui/QML/expertviews/ImpulseResponseGraph.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtCharts 2.1
 import QtQuick.Layouts 1.1
@@ -80,9 +105,9 @@ ViewBaseFrame {
             spectrum.freqMax = Xmax
         }
 
-        onNewDebugOutput: {
-            spectrum.waterfallObject.plotMessage(text)
-        }
+//        onNewDebugOutput: {
+//            spectrum.waterfallObject.plotMessage(text)
+//        }
     }
 
     Connections {
diff --git a/src/welle-gui/QML/expertviews/NullSymbolGraph.qml b/src/welle-gui/QML/expertviews/NullSymbolGraph.qml
index 53e94f8..0fc3ba4 100644
--- a/src/welle-gui/QML/expertviews/NullSymbolGraph.qml
+++ b/src/welle-gui/QML/expertviews/NullSymbolGraph.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Layouts 1.1
 import Qt.labs.settings 1.0
diff --git a/src/welle-gui/QML/expertviews/RawRecorder.qml b/src/welle-gui/QML/expertviews/RawRecorder.qml
index a2e2871..2dfa4f5 100644
--- a/src/welle-gui/QML/expertviews/RawRecorder.qml
+++ b/src/welle-gui/QML/expertviews/RawRecorder.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Controls 2.3
 import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/expertviews/ServiceDetails.qml b/src/welle-gui/QML/expertviews/ServiceDetails.qml
index 516de0e..9f3f7b9 100644
--- a/src/welle-gui/QML/expertviews/ServiceDetails.qml
+++ b/src/welle-gui/QML/expertviews/ServiceDetails.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.2
 import QtQuick.Layouts 1.1
 
@@ -23,8 +48,17 @@ ViewBaseFrame {
             text: radioController.channel + " (" + (radioController.frequency > 0 ? radioController.frequency/1e6 :  "N/A") + " MHz)"
         }
 
+        TextExpert {
+            name: qsTr("Frequency correction") + ":"
+            text: radioController.frequencyCorrection + " Hz (" + (radioController.frequency > 0 ? radioController.frequencyCorrectionPpm.toFixed(2) : "N/A") + " ppm)"
+        }
+
+        TextExpert {
+            name: qsTr("SNR") + ":"
+            text: radioController.snr.toFixed(2) + " dB"
+        }
+
         RowLayout {
-            property bool isServiceDetailsRawLayout: true
             Rectangle{
                 height: Units.dp(16)
                 width: Units.dp(16)
@@ -39,7 +73,6 @@ ViewBaseFrame {
         }
 
         RowLayout {
-            property bool isServiceDetailsRawLayout: true
             Rectangle{
                 height: Units.dp(16)
                 width: Units.dp(16)
@@ -53,7 +86,6 @@ ViewBaseFrame {
         }
 
         RowLayout {
-            property bool isServiceDetailsRawLayout: true
             Rectangle{
                 height: Units.dp(16)
                 width: Units.dp(16)
@@ -68,24 +100,36 @@ ViewBaseFrame {
             }
         }
 
-        TextExpert {
-            name: qsTr("Frequency correction") + ":"
-            text: radioController.frequencyCorrection + " Hz (" + (radioController.frequency > 0 ? radioController.frequencyCorrectionPpm.toFixed(2) : "N/A") + " ppm)"
-        }
+        RowLayout {
+            Rectangle{
+                height: Units.dp(16)
+                width: Units.dp(16)
+                color: (radioController.rsCorrectedErrors === 0
+                        && radioController.rsUncorrectedErrors === 0)
+                        ? "green" : (radioController.rsCorrectedErrors >= 0
+                                     && radioController.rsUncorrectedErrors === 0) ? "yellow" : "red"
+            }
 
-        TextExpert {
-            name: qsTr("SNR") + ":"
-            text: radioController.snr + " dB"
+            TextExpert {
+                name: qsTr("RS errors")  + ":"
+                text: (radioController.rsCorrectedErrors === 0
+                       && radioController.rsUncorrectedErrors === 0)
+                       ? qsTr("OK") : (radioController.rsCorrectedErrors >= 0
+                                    && radioController.rsUncorrectedErrors === 0) ? qsTr("Corrected Error") : qsTr("Uncorrected Error")
+            }
         }
 
-        TextExpert {
-            name: qsTr("RS errors") + ":"
-            text: radioController.rsErrors
-        }
+        RowLayout {
+            Rectangle{
+                height: Units.dp(16)
+                width: Units.dp(16)
+                color: radioController.aacErrors === 0 ? "green" : "red"
+            }
 
-        TextExpert {
-            name: qsTr("AAC errors") + ":"
-            text: radioController.aacErrors
+            TextExpert {
+                name: qsTr("AAC errors")  + ":"
+                text: radioController.aacErrors
+            }
         }
 
         TextExpert {
diff --git a/src/welle-gui/QML/expertviews/SpectrumGraph.qml b/src/welle-gui/QML/expertviews/SpectrumGraph.qml
index 36a46a9..a9fe5e0 100644
--- a/src/welle-gui/QML/expertviews/SpectrumGraph.qml
+++ b/src/welle-gui/QML/expertviews/SpectrumGraph.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Layouts 1.1
 import QtQuick.Controls 2.1
@@ -30,9 +55,9 @@ ViewBaseFrame {
             spectrum.freqMax = Xmax
         }
 
-        onNewDebugOutput: {
-            spectrum.waterfallObject.plotMessage(text)
-        }
+//        onNewDebugOutput: {
+//            spectrum.waterfallObject.plotMessage(text)
+//        }
     }
 
     Connections {
diff --git a/src/welle-gui/QML/expertviews/TextOutputView.qml b/src/welle-gui/QML/expertviews/TextOutputView.qml
index 9b1ce39..50dd548 100644
--- a/src/welle-gui/QML/expertviews/TextOutputView.qml
+++ b/src/welle-gui/QML/expertviews/TextOutputView.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Controls 2.3
 import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/settingpages/AirspySettings.qml b/src/welle-gui/QML/settingpages/AirspySettings.qml
index 422357e..1e8827f 100644
--- a/src/welle-gui/QML/settingpages/AirspySettings.qml
+++ b/src/welle-gui/QML/settingpages/AirspySettings.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.6
 import QtQuick.Controls 2.0
 import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/settingpages/ChannelSettings.qml b/src/welle-gui/QML/settingpages/ChannelSettings.qml
index 75ea55f..680885c 100644
--- a/src/welle-gui/QML/settingpages/ChannelSettings.qml
+++ b/src/welle-gui/QML/settingpages/ChannelSettings.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.6
 import QtQuick.Controls 2.0
 import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/settingpages/ExpertSettings.qml b/src/welle-gui/QML/settingpages/ExpertSettings.qml
index d59b95f..4c0be3d 100644
--- a/src/welle-gui/QML/settingpages/ExpertSettings.qml
+++ b/src/welle-gui/QML/settingpages/ExpertSettings.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.6
 import QtQuick.Controls 2.0
 import QtQuick.Layouts 1.1
diff --git a/src/welle-gui/QML/settingpages/GlobalSettings.qml b/src/welle-gui/QML/settingpages/GlobalSettings.qml
index afe4e8a..ccff724 100644
--- a/src/welle-gui/QML/settingpages/GlobalSettings.qml
+++ b/src/welle-gui/QML/settingpages/GlobalSettings.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.6
 import QtQuick.Controls 2.0
 import QtQuick.Layouts 1.1
@@ -55,6 +80,9 @@ Item {
             default: deviceBox.currentIndex = 0;
             }
         }
+        onSetFullScreen: {
+            enableFullScreen.checked = isFullScreen
+        }
     }
 
     ColumnLayout{
@@ -72,6 +100,8 @@ Item {
                 text: qsTr("Full screen mode")
                 Layout.fillWidth: true
                 checked: false
+                onCheckedChanged: guiHelper.setMprisFullScreenState(checked)
+                Component.onCompleted: guiHelper.setMprisFullScreenState(checked)
             }
 
             RowLayout {
@@ -234,7 +264,7 @@ Item {
                     model: guiHelper.qQStyleComboModel
                     onActivated: {
                         guiHelper.saveQQStyle(currentIndex)
-                        infoMessagePopup.text = qsTr("Style changed. Please restart welle.io");
+                        infoMessagePopup.text = qsTr("Style changed. Please restart welle.io.");
                         infoMessagePopup.open();
                     }
                 }
diff --git a/src/welle-gui/QML/settingpages/NullSettings.qml b/src/welle-gui/QML/settingpages/NullSettings.qml
index f7de1be..6bcf92a 100644
--- a/src/welle-gui/QML/settingpages/NullSettings.qml
+++ b/src/welle-gui/QML/settingpages/NullSettings.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Layouts 1.1
 
diff --git a/src/welle-gui/QML/settingpages/RTLSDRSettings.qml b/src/welle-gui/QML/settingpages/RTLSDRSettings.qml
index b4cdfca..0eb9170 100644
--- a/src/welle-gui/QML/settingpages/RTLSDRSettings.qml
+++ b/src/welle-gui/QML/settingpages/RTLSDRSettings.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.6
 import QtQuick.Controls 2.0
 import QtQuick.Layouts 1.1
@@ -18,7 +43,7 @@ SettingSection {
     WSwitch {
         id: enableBiasTee
         Layout.fillWidth: true
-        text: qsTr("Enable bias tee (not from all dongles supported)")
+        text: qsTr("Enable bias tee (not supported by all dongles)")
         onClicked: {
             guiHelper.setBiasTeeRtlSdr(checked)
         }
diff --git a/src/welle-gui/QML/settingpages/RTLTCPSettings.qml b/src/welle-gui/QML/settingpages/RTLTCPSettings.qml
index 8c1dc9a..4a1ee03 100644
--- a/src/welle-gui/QML/settingpages/RTLTCPSettings.qml
+++ b/src/welle-gui/QML/settingpages/RTLTCPSettings.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Layouts 1.1
 import QtQuick.Controls 2.2
diff --git a/src/welle-gui/QML/settingpages/RawFileSettings.qml b/src/welle-gui/QML/settingpages/RawFileSettings.qml
index 56040f3..15b334a 100644
--- a/src/welle-gui/QML/settingpages/RawFileSettings.qml
+++ b/src/welle-gui/QML/settingpages/RawFileSettings.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Layouts 1.1
 import QtQuick.Controls 2.2
diff --git a/src/welle-gui/QML/settingpages/SoapySDRSettings.qml b/src/welle-gui/QML/settingpages/SoapySDRSettings.qml
index 70e46f2..8f2e930 100644
--- a/src/welle-gui/QML/settingpages/SoapySDRSettings.qml
+++ b/src/welle-gui/QML/settingpages/SoapySDRSettings.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Layouts 1.1
 import QtQuick.Controls 2.2
diff --git a/src/welle-gui/QML/texts/TextExpert.qml b/src/welle-gui/QML/texts/TextExpert.qml
index 77df024..3a2627e 100644
--- a/src/welle-gui/QML/texts/TextExpert.qml
+++ b/src/welle-gui/QML/texts/TextExpert.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Layouts 1.1
 
diff --git a/src/welle-gui/QML/texts/TextRadioInfo.qml b/src/welle-gui/QML/texts/TextRadioInfo.qml
index 2aa39d4..76ddb18 100644
--- a/src/welle-gui/QML/texts/TextRadioInfo.qml
+++ b/src/welle-gui/QML/texts/TextRadioInfo.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 
 // Import custom styles
diff --git a/src/welle-gui/QML/texts/TextRadioStation.qml b/src/welle-gui/QML/texts/TextRadioStation.qml
index d9ab546..74e17bf 100644
--- a/src/welle-gui/QML/texts/TextRadioStation.qml
+++ b/src/welle-gui/QML/texts/TextRadioStation.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 
 // Import custom styles
diff --git a/src/welle-gui/QML/texts/TextStandart.qml b/src/welle-gui/QML/texts/TextStandart.qml
index fd6eca7..569217b 100644
--- a/src/welle-gui/QML/texts/TextStandart.qml
+++ b/src/welle-gui/QML/texts/TextStandart.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Controls.Material 2.1
 import QtQuick.Controls.Universal 2.1
diff --git a/src/welle-gui/QML/texts/TextStation.qml b/src/welle-gui/QML/texts/TextStation.qml
index 5dcb3d1..53ced92 100644
--- a/src/welle-gui/QML/texts/TextStation.qml
+++ b/src/welle-gui/QML/texts/TextStation.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 import QtQuick.Controls.Material 2.1
 import QtQuick.Controls.Universal 2.1
diff --git a/src/welle-gui/QML/texts/TextStyle.qml b/src/welle-gui/QML/texts/TextStyle.qml
index 79c3553..eef8aa0 100644
--- a/src/welle-gui/QML/texts/TextStyle.qml
+++ b/src/welle-gui/QML/texts/TextStyle.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 pragma Singleton
 
 import QtQuick 2.0
diff --git a/src/welle-gui/QML/texts/TextTitle.qml b/src/welle-gui/QML/texts/TextTitle.qml
index 0384998..a82d2c6 100644
--- a/src/welle-gui/QML/texts/TextTitle.qml
+++ b/src/welle-gui/QML/texts/TextTitle.qml
@@ -1,3 +1,28 @@
+/*
+ *    Copyright (C) 2017 - 2021
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+ 
 import QtQuick 2.0
 
 // Import custom styles
diff --git a/src/welle-gui/android/AndroidManifest.xml b/src/welle-gui/android/AndroidManifest.xml
index de84c00..43358f8 100644
--- a/src/welle-gui/android/AndroidManifest.xml
+++ b/src/welle-gui/android/AndroidManifest.xml
@@ -1,7 +1,16 @@
 <?xml version="1.0"?>
-<manifest package="io.welle.welle" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="2.1" android:versionCode="21" android:installLocation="auto">
-    <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="@string/app_name" android:icon="@drawable/icon">
-        <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="@string/app_name" android:screenOrientation="unspecified" android:theme="@style/AppTheme" android:launchMode="singleTop">
+<manifest package="io.welle.welle" xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="2.3" android:versionCode="23" android:installLocation="auto">
+    <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
+         Remove the comment if you do not require these default permissions. -->
+    <!-- %%INSERT_PERMISSIONS -->
+
+    <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
+         Remove the comment if you do not require these default features. -->
+    <!-- %%INSERT_FEATURES -->
+
+    <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
+    <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="welle.io" android:extractNativeLibs="true" android:icon="@drawable/icon">
+        <activity android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation|mcc|mnc|density" android:name="org.qtproject.qt5.android.bindings.QtActivity" android:label="welle.io" android:screenOrientation="unspecified" android:launchMode="singleTop">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
                 <category android:name="android.intent.category.LAUNCHER"/>
@@ -18,24 +27,31 @@
             <meta-data android:name="android.app.bundled_libs_resource_id" android:resource="@array/bundled_libs"/>
             <!-- Deploy Qt libs as part of package -->
             <meta-data android:name="android.app.bundle_local_qt_libs" android:value="-- %%BUNDLE_LOCAL_QT_LIBS%% --"/>
-            <meta-data android:name="android.app.bundled_in_lib_resource_id" android:resource="@array/bundled_in_lib"/>
-            <meta-data android:name="android.app.bundled_in_assets_resource_id" android:resource="@array/bundled_in_assets"/>
+
             <!-- Run with local libs -->
             <meta-data android:name="android.app.use_local_qt_libs" android:value="-- %%USE_LOCAL_QT_LIBS%% --"/>
             <meta-data android:name="android.app.libs_prefix" android:value="/data/local/tmp/qt/"/>
-            <meta-data android:name="android.app.load_local_libs" android:value="-- %%INSERT_LOCAL_LIBS%% --"/>
+            <meta-data android:name="android.app.load_local_libs_resource_id" android:resource="@array/load_local_libs"/>
             <meta-data android:name="android.app.load_local_jars" android:value="-- %%INSERT_LOCAL_JARS%% --"/>
             <meta-data android:name="android.app.static_init_classes" android:value="-- %%INSERT_INIT_CLASSES%% --"/>
+            <!-- Used to specify custom system library path to run with local system libs -->
+            <!-- <meta-data android:name="android.app.system_libs_prefix" android:value="/system/lib/"/> -->
             <!--  Messages maps -->
             <meta-data android:value="@string/ministro_not_found_msg" android:name="android.app.ministro_not_found_msg"/>
             <meta-data android:value="@string/ministro_needed_msg" android:name="android.app.ministro_needed_msg"/>
             <meta-data android:value="@string/fatal_error_msg" android:name="android.app.fatal_error_msg"/>
+            <meta-data android:value="@string/unsupported_android_version" android:name="android.app.unsupported_android_version"/>
             <!--  Messages maps -->
 
             <!-- Splash screen -->
-            <!-- meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/logo"/ -->
-            <!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
+            <!-- Orientation-specific (portrait/landscape) data is checked first. If not available for current orientation,
+                 then android.app.splash_screen_drawable. For best results, use together with splash_screen_sticky and
+                 use hideSplashScreen() with a fade-out animation from Qt Android Extras to hide the splash screen when you
+                 are done populating your window with content. -->
+            <!-- meta-data android:name="android.app.splash_screen_drawable_portrait" android:resource="@drawable/logo_portrait" / -->
+            <!-- meta-data android:name="android.app.splash_screen_drawable_landscape" android:resource="@drawable/logo_landscape" / -->
             <meta-data android:name="android.app.splash_screen_drawable" android:resource="@drawable/splash"/>
+            <!-- meta-data android:name="android.app.splash_screen_sticky" android:value="true"/ -->
             <!-- Splash screen -->
 
             <!-- Background running -->
@@ -52,29 +68,17 @@
 
             <!-- extract android style -->
             <!-- available android:values :
+                * default - In most cases this will be the same as "full", but it can also be something else if needed, e.g., for compatibility reasons
                 * full - useful QWidget & Quick Controls 1 apps
                 * minimal - useful for Quick Controls 2 apps, it is much faster than "full"
                 * none - useful for apps that don't use any of the above Qt modules
                 -->
-            <meta-data android:name="android.app.extract_android_style" android:value="full"/>
+            <meta-data android:name="android.app.extract_android_style" android:value="default"/>
             <!-- extract android style -->
-        </activity>
-
-    </application>
-
-    <uses-sdk android:minSdkVersion="28" android:targetSdkVersion="28"/>
-    <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
-
-    <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.
-         Remove the comment if you do not require these default permissions. -->
+    </activity>
 
+    <!-- For adding service(s) please check: https://wiki.qt.io/AndroidServices -->
 
-    <!-- The following comment will be replaced upon deployment with default features based on the dependencies of the application.
-         Remove the comment if you do not require these default features. -->
-    <!-- %%INSERT_FEATURES -->
-
-
-<uses-permission android:name="android.permission.INTERNET"/>
+    </application>
 
-<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 </manifest>
diff --git a/src/welle-gui/android/build.gradle b/src/welle-gui/android/build.gradle
index 6f27670..443a800 100644
--- a/src/welle-gui/android/build.gradle
+++ b/src/welle-gui/android/build.gradle
@@ -1,26 +1,23 @@
 buildscript {
     repositories {
+        google()
         jcenter()
     }
 
     dependencies {
-        classpath 'com.android.tools.build:gradle:2.2.3'
+        classpath 'com.android.tools.build:gradle:3.6.0'
     }
 }
 
-allprojects {
-    repositories {
-        jcenter()
-    }
+repositories {
+    google()
+    jcenter()
 }
 
 apply plugin: 'com.android.application'
 
 dependencies {
-    compile fileTree(include: ['*.jar'], dir: 'libs')
-    compile 'com.android.support:appcompat-v7:25.3.1'
-    compile 'com.android.support:support-compat:25.3.1'
-    compile 'com.android.support:support-media-compat:25.3.1'
+    implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
 }
 
 android {
@@ -39,7 +36,7 @@ android {
 
     compileSdkVersion androidCompileSdkVersion.toInteger()
 
-    buildToolsVersion androidBuildToolsVersion
+    buildToolsVersion '28.0.3'
 
     sourceSets {
         main {
@@ -47,15 +44,34 @@ android {
             java.srcDirs = [qt5AndroidDir + '/src', 'src', 'java']
             aidl.srcDirs = [qt5AndroidDir + '/src', 'src', 'aidl']
             res.srcDirs = [qt5AndroidDir + '/res', 'res']
-            resources.srcDirs = ['src']
+            resources.srcDirs = ['resources']
             renderscript.srcDirs = ['src']
             assets.srcDirs = ['assets']
             jniLibs.srcDirs = ['libs']
        }
     }
 
+    tasks.withType(JavaCompile) {
+        options.incremental = true
+    }
+
+    compileOptions {
+        sourceCompatibility JavaVersion.VERSION_1_8
+        targetCompatibility JavaVersion.VERSION_1_8
+    }
+
     lintOptions {
         abortOnError false
-        disable 'MissingTranslation'
+    }
+
+    // Do not compress Qt binary resources file
+    aaptOptions {
+        noCompress 'rcc'
+    }
+
+    defaultConfig {
+        resConfig "en"
+        minSdkVersion = qtMinSdkVersion
+        targetSdkVersion = qtTargetSdkVersion
     }
 }
diff --git a/src/welle-gui/android/gradle.properties b/src/welle-gui/android/gradle.properties
index 2650d04..fded106 100644
--- a/src/welle-gui/android/gradle.properties
+++ b/src/welle-gui/android/gradle.properties
@@ -1,9 +1,11 @@
-## This file is automatically generated by QtCreator.
-#
-# This file must *NOT* be checked into Version Control Systems,
-# as it contains information specific to your local configuration.
+# Project-wide Gradle settings.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx2048m
 
-androidBuildToolsVersion=25.0.2
-androidCompileSdkVersion=26
-buildDir=.build
-qt5AndroidDir=/home/albrecht/Qt/5.9.3/android_armv7/src/android/java
+# Gradle caching allows reusing the build artifacts from a previous
+# build with the same inputs. However, over time, the cache size will
+# grow. Uncomment the following line to enable it.
+#org.gradle.caching=true
diff --git a/src/welle-gui/android/gradle/wrapper/gradle-wrapper.jar b/src/welle-gui/android/gradle/wrapper/gradle-wrapper.jar
index 13372ae..f6b961f 100644
Binary files a/src/welle-gui/android/gradle/wrapper/gradle-wrapper.jar and b/src/welle-gui/android/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/src/welle-gui/android/gradle/wrapper/gradle-wrapper.properties b/src/welle-gui/android/gradle/wrapper/gradle-wrapper.properties
index 04e285f..5028f28 100644
--- a/src/welle-gui/android/gradle/wrapper/gradle-wrapper.properties
+++ b/src/welle-gui/android/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,5 @@
-#Mon Dec 28 10:00:20 PST 2015
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip
diff --git a/src/welle-gui/android/gradlew b/src/welle-gui/android/gradlew
old mode 100644
new mode 100755
index 9d82f78..cccdd3d
--- a/src/welle-gui/android/gradlew
+++ b/src/welle-gui/android/gradlew
@@ -1,4 +1,4 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
 
 ##############################################################################
 ##
@@ -6,20 +6,38 @@
 ##
 ##############################################################################
 
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
 
 APP_NAME="Gradle"
 APP_BASE_NAME=`basename "$0"`
 
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 MAX_FD="maximum"
 
-warn ( ) {
+warn () {
     echo "$*"
 }
 
-die ( ) {
+die () {
     echo
     echo "$*"
     echo
@@ -30,6 +48,7 @@ die ( ) {
 cygwin=false
 msys=false
 darwin=false
+nonstop=false
 case "`uname`" in
   CYGWIN* )
     cygwin=true
@@ -40,26 +59,11 @@ case "`uname`" in
   MINGW* )
     msys=true
     ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
 esac
 
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
 CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 
 # Determine the Java command to use to start the JVM.
@@ -85,7 +89,7 @@ location of your Java installation."
 fi
 
 # Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
     MAX_FD_LIMIT=`ulimit -H -n`
     if [ $? -eq 0 ] ; then
         if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -150,11 +154,19 @@ if $cygwin ; then
     esac
 fi
 
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
-    JVM_OPTS=("$@")
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
 }
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
 
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+exec "$JAVACMD" "$@"
diff --git a/src/welle-gui/android/gradlew.bat b/src/welle-gui/android/gradlew.bat
index aec9973..f955316 100644
--- a/src/welle-gui/android/gradlew.bat
+++ b/src/welle-gui/android/gradlew.bat
@@ -1,90 +1,84 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem  Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windowz variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/src/welle-gui/android/local.properties b/src/welle-gui/android/local.properties
deleted file mode 100644
index f10bc87..0000000
--- a/src/welle-gui/android/local.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-## This file is automatically generated by QtCreator.
-#
-# This file must *NOT* be checked into Version Control Systems,
-# as it contains information specific to your local configuration.
-
-sdk.dir=/home/albrecht/Android/Sdk
diff --git a/src/welle-gui/android/res/drawable/ic_antenna.xml b/src/welle-gui/android/res/drawable/ic_antenna.xml
deleted file mode 100644
index 43e0d47..0000000
--- a/src/welle-gui/android/res/drawable/ic_antenna.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<vector android:height="24dp" android:viewportHeight="477.0"
-    android:viewportWidth="477.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="#9e9e9e" android:pathData="M190,192.8c3.6,2 8.2,0.6 10.2,-3c2,-3.6 0.6,-8.2 -3,-10.2C168.7,164.2 151,134.7 151,102.5c0,-48.2 39.3,-87.5 87.5,-87.5S326,54.3 326,102.5c0,32.2 -17.7,61.7 -46.1,77.1c-3.6,2 -5,6.5 -3,10.2c1.4,2.5 3.9,3.9 6.6,3.9c1.2,0 2.4,-0.3 3.6,-0.9C320.3,174.8 341,140.2 341,102.5C341,46 295,0 238.5,0S136,46 136,102.5C136,140.2 156.7,174.8 190,192.8z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M265.9,141.3c-3.4,2.4 -4.2,7.1 -1.8,10.5c1.5,2.1 3.8,3.2 6.1,3.2c1.5,0 3,-0.4 4.3,-1.4C291.1,141.8 301,122.7 301,102.5c0,-34.5 -28,-62.5 -62.5,-62.5S176,68 176,102.5c0,20.2 9.9,39.3 26.5,51c3.4,2.4 8.1,1.6 10.5,-1.8c2.4,-3.4 1.6,-8.1 -1.8,-10.5C198.5,132.4 191,117.9 191,102.5c0,-26.2 21.3,-47.5 47.5,-47.5S286,76.3 286,102.5C286,117.9 278.5,132.4 265.9,141.3z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M326.1,380c-0,-0 -0,-0 -0,-0.1L246,146.3v-22.5c8.7,-3.1 15,-11.4 15,-21.2c0,-12.4 -10.1,-22.5 -22.5,-22.5S216,90.1 216,102.5c0,9.8 6.3,18.1 15,21.2v22.5l-28.9,84.4c-0,0.1 -0,0.1 -0.1,0.2l-24.9,72.7c-0,0.1 -0.1,0.2 -0.1,0.3l-39.2,114.4c-1.3,3.9 0.7,8.2 4.7,9.5c0.8,0.3 1.6,0.4 2.4,0.4c3.1,0 6,-2 7.1,-5.1l10.2,-29.7l68.8,39.9V469.5c0,4.1 3.4,7.5 7.5,7.5s7.5,-3.4 7.5,-7.5v-36.2l68.8,-39.9l10.2,29.7c1.3,3.9 5.6,6 9.5,4.7c3.9,-1.3 6,-5.6 4.7,-9.5L326.1,380zM212.7,245.9L231,261.5v67.8l-37.9,-26.1L212.7,245.9zM246,261.5l18.3,-15.5l19.6,57.2L246,329.2V261.5zM259.1,230.7L246,241.8v-49.2L259.1,230.7zM238.5,95c4.1,0 7.5,3.4 7.5,7.5s-3.4,7.5 -7.5,7.5s-7.5,-3.4 -7.5,-7.5S234.4,95 238.5,95zM231,241.8l-13.1,-11.1L231,192.5V241.8zM167.2,379l20.9,-61.1L231,347.4v68.5L167.2,379zM246,416v-68.5l42.9,-29.6l20.9,61.1L246,416z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_cancel.xml b/src/welle-gui/android/res/drawable/ic_cancel.xml
deleted file mode 100644
index 6125aed..0000000
--- a/src/welle-gui/android/res/drawable/ic_cancel.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M12,2C6.47,2 2,6.47 2,12s4.47,10 10,10 10,-4.47 10,-10S17.53,2 12,2zM17,15.59L15.59,17 12,13.41 8.41,17 7,15.59 10.59,12 7,8.41 8.41,7 12,10.59 15.59,7 17,8.41 13.41,12 17,15.59z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_close.xml b/src/welle-gui/android/res/drawable/ic_close.xml
deleted file mode 100644
index d11cc5c..0000000
--- a/src/welle-gui/android/res/drawable/ic_close.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M19,6.41L17.59,5 12,10.59 6.41,5 5,6.41 10.59,12 5,17.59 6.41,19 12,13.41 17.59,19 19,17.59 13.41,12z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_favorite.xml b/src/welle-gui/android/res/drawable/ic_favorite.xml
deleted file mode 100644
index 46cfb27..0000000
--- a/src/welle-gui/android/res/drawable/ic_favorite.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_favorite_border.xml b/src/welle-gui/android/res/drawable/ic_favorite_border.xml
deleted file mode 100644
index d8e3541..0000000
--- a/src/welle-gui/android/res/drawable/ic_favorite_border.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M16.5,3c-1.74,0 -3.41,0.81 -4.5,2.09C10.91,3.81 9.24,3 7.5,3 4.42,3 2,5.42 2,8.5c0,3.78 3.4,6.86 8.55,11.54L12,21.35l1.45,-1.32C18.6,15.36 22,12.28 22,8.5 22,5.42 19.58,3 16.5,3zM12.1,18.55l-0.1,0.1 -0.1,-0.1C7.14,14.24 4,11.39 4,8.5 4,6.5 5.5,5 7.5,5c1.54,0 3.04,0.99 3.57,2.36h1.87C13.46,5.99 14.96,5 16.5,5c2,0 3.5,1.5 3.5,3.5 0,2.89 -3.14,5.74 -7.9,10.05z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_favorites.xml b/src/welle-gui/android/res/drawable/ic_favorites.xml
deleted file mode 100644
index 68f466f..0000000
--- a/src/welle-gui/android/res/drawable/ic_favorites.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF9E9E9E"
-        android:pathData="M12,21.35l-1.45,-1.32C5.4,15.36 2,12.28 2,8.5 2,5.42 4.42,3 7.5,3c1.74,0 3.41,0.81 4.5,2.09C13.09,3.81 14.76,3 16.5,3 19.58,3 22,5.42 22,8.5c0,3.78 -3.4,6.86 -8.55,11.54L12,21.35z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_icon.xml b/src/welle-gui/android/res/drawable/ic_icon.xml
deleted file mode 100644
index 6ce7e2c..0000000
--- a/src/welle-gui/android/res/drawable/ic_icon.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<vector android:height="24dp" android:viewportHeight="465.0"
-    android:viewportWidth="465.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="#9e9e9e" android:pathData="M396.5,156.8L115.8,156.8l0,-2.2c0,-5.6 -2.1,-10.7 -5.5,-14.7L379.5,67.8c3.2,-0.9 5.1,-4.1 4.2,-7.3 -0.9,-3.2 -4.1,-5.1 -7.3,-4.2L92.5,132.3c-11.9,0.5 -21.5,10.3 -21.5,22.3l0,2.2L68.5,156.8c-12.1,0 -22,9.9 -22,22l0,208.2c0,12.1 9.9,22 22,22l328,0c12.1,0 22,-9.9 22,-22l0,-208.2c0,-12.1 -9.9,-22 -22,-22zM83,154.6c0,-5.7 4.6,-10.4 10.3,-10.4 0,0 0,0 0,0 0,0 0,-0 0,-0 5.7,0 10.4,4.7 10.4,10.4l0,2.2L83,156.8ZM406.5,387c0,5.5 -4.5,10 -10,10l-328,0c-5.5,0 -10,-4.5 -10,-10l0,-208.2c0,-5.5 4.5,-10 10,-10l328,0c5.5,0 10,4.5 10,10z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="m158.9,203.3c-43.9,0 -79.6,35.7 -79.6,79.6 0,43.9 35.7,79.6 79.6,79.6 43.9,0 79.6,-35.7 79.6,-79.6 0,-43.9 -35.7,-79.6 -79.6,-79.6zM158.9,350.5c-37.3,0 -67.6,-30.3 -67.6,-67.6 0,-37.3 30.3,-67.6 67.6,-67.6 37.3,0 67.6,30.3 67.6,67.6 0,37.3 -30.3,67.6 -67.6,67.6z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="m158.9,227.8c-30.4,0 -55.1,24.7 -55.1,55.1 0,30.4 24.7,55.1 55.1,55.1 30.4,0 55.1,-24.7 55.1,-55.1 -0,-30.4 -24.7,-55.1 -55.1,-55.1zM158.9,326c-23.8,0 -43.1,-19.3 -43.1,-43.1 0,-23.8 19.3,-43.1 43.1,-43.1 23.8,0 43.1,19.3 43.1,43.1 -0,23.8 -19.3,43.1 -43.1,43.1z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="m283.6,318.7c13.5,0 24.4,-11 24.4,-24.4 0,-13.5 -11,-24.4 -24.4,-24.4 -13.5,0 -24.4,11 -24.4,24.4 0,13.5 11,24.4 24.4,24.4zM283.6,281.9c6.8,0 12.4,5.6 12.4,12.4 0,6.8 -5.6,12.4 -12.4,12.4 -6.8,0 -12.4,-5.6 -12.4,-12.4 0,-6.8 5.6,-12.4 12.4,-12.4z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="m361.4,269.9c-13.5,0 -24.4,11 -24.4,24.4 0,13.5 11,24.4 24.4,24.4 13.5,0 24.4,-11 24.4,-24.4 0,-13.5 -11,-24.4 -24.4,-24.4zM361.4,306.7c-6.8,0 -12.4,-5.6 -12.4,-12.4 0,-6.8 5.6,-12.4 12.4,-12.4 6.8,0 12.4,5.6 12.4,12.4 0,6.8 -5.6,12.4 -12.4,12.4z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M379.8,188.1L265.2,188.1c-3.3,0 -6,2.7 -6,6l0,57.3c0,3.3 2.7,6 6,6l114.5,0c3.3,0 6,-2.7 6,-6l0,-57.3c0,-3.3 -2.7,-6 -6,-6zM373.8,245.4l-69.8,0l0,-25.3c0,-3.3 -2.7,-6 -6,-6 -3.3,0 -6,2.7 -6,6l0,25.3L271.2,245.4l0,-45.3l102.5,0l0,45.3z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M379.8,331.3L265.2,331.3c-3.3,0 -6,2.7 -6,6l0,33c0,3.3 2.7,6 6,6l114.5,0c3.3,0 6,-2.7 6,-6l0,-33c0,-3.3 -2.7,-6 -6,-6zM335.6,343.3l0,21l-26.2,0l0,-21zM271.2,343.3l26.2,0l0,21l-26.2,0zM373.8,364.2l-26.2,0l0,-21l26.2,0z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="m158.9,252.3c-3.3,0 -6,2.7 -6,6l0,49.1c0,3.3 2.7,6 6,6 3.3,0 6,-2.7 6,-6l0,-49.1c0,-3.3 -2.7,-6 -6,-6z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="m134.3,258.9c-3.3,0 -6,2.7 -6,6l0,35.9c0,3.3 2.7,6 6,6 3.3,0 6,-2.7 6,-6l0,-35.9c0,-3.3 -2.7,-6 -6,-6z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="m183.4,258.9c-3.3,0 -6,2.7 -6,6l0,35.9c0,3.3 2.7,6 6,6 3.3,0 6,-2.7 6,-6l0,-35.9c0,-3.3 -2.7,-6 -6,-6z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_pause.xml b/src/welle-gui/android/res/drawable/ic_pause.xml
deleted file mode 100644
index 8356ff5..0000000
--- a/src/welle-gui/android/res/drawable/ic_pause.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_play.xml b/src/welle-gui/android/res/drawable/ic_play.xml
deleted file mode 100644
index 81a8f74..0000000
--- a/src/welle-gui/android/res/drawable/ic_play.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M8,5v14l11,-7z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_radio.xml b/src/welle-gui/android/res/drawable/ic_radio.xml
deleted file mode 100644
index 469c43b..0000000
--- a/src/welle-gui/android/res/drawable/ic_radio.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<vector android:height="24dp" android:viewportHeight="465.0"
-    android:viewportWidth="465.0" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
-    <path android:fillColor="#9e9e9e" android:pathData="M437.5,137.9H86.6v-2.7c0,-7 -2.6,-13.4 -6.9,-18.3l336.5,-90.2c4,-1.1 6.4,-5.2 5.3,-9.2c-1.1,-4 -5.2,-6.4 -9.2,-5.3L57.5,107.2c-14.9,0.6 -26.9,12.9 -26.9,27.9v2.7H27.5c-15.2,0 -27.5,12.3 -27.5,27.5v260.2c0,15.2 12.3,27.5 27.5,27.5h410c15.2,0 27.5,-12.3 27.5,-27.5v-260.2C465,150.2 452.7,137.9 437.5,137.9zM45.7,135.2c0,-7.1 5.8,-12.9 12.9,-13c0,0 0,0 0,0c0,0 0,-0 0,-0c7.1,0 12.9,5.8 12.9,13v2.7H45.7V135.2zM450,425.6c0,6.9 -5.6,12.5 -12.5,12.5h-410c-6.9,0 -12.5,-5.6 -12.5,-12.5v-260.2c0,-6.9 5.6,-12.5 12.5,-12.5h410c6.9,0 12.5,5.6 12.5,12.5V425.6z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M140.5,195.9c-54.9,0 -99.5,44.7 -99.5,99.5s44.7,99.5 99.5,99.5S240,350.4 240,295.5S195.3,195.9 140.5,195.9zM140.5,380c-46.6,0 -84.5,-37.9 -84.5,-84.5s37.9,-84.5 84.5,-84.5S225,248.9 225,295.5S187.1,380 140.5,380z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M140.5,226.6c-38,0 -68.9,30.9 -68.9,68.9c0,38 30.9,68.9 68.9,68.9s68.9,-30.9 68.9,-68.9C209.3,257.5 178.4,226.6 140.5,226.6zM140.5,349.4c-29.7,0 -53.9,-24.2 -53.9,-53.9c0,-29.7 24.2,-53.9 53.9,-53.9s53.9,24.2 53.9,53.9C194.3,325.2 170.2,349.4 140.5,349.4z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M296.4,340.3c16.8,0 30.5,-13.7 30.5,-30.5c0,-16.8 -13.7,-30.5 -30.5,-30.5s-30.5,13.7 -30.5,30.5C265.9,326.6 279.6,340.3 296.4,340.3zM296.4,294.3c8.6,0 15.5,7 15.5,15.5c0,8.6 -7,15.5 -15.5,15.5s-15.5,-7 -15.5,-15.5C280.9,301.2 287.9,294.3 296.4,294.3z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M393.6,279.3c-16.8,0 -30.5,13.7 -30.5,30.5c0,16.8 13.7,30.5 30.5,30.5s30.5,-13.7 30.5,-30.5C424.1,293 410.4,279.3 393.6,279.3zM393.6,325.3c-8.6,0 -15.5,-7 -15.5,-15.5c0,-8.6 7,-15.5 15.5,-15.5s15.5,7 15.5,15.5C409.1,318.3 402.1,325.3 393.6,325.3z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M416.6,177H273.4c-4.1,0 -7.5,3.4 -7.5,7.5v71.6c0,4.1 3.4,7.5 7.5,7.5h143.2c4.1,0 7.5,-3.4 7.5,-7.5v-71.6C424.1,180.4 420.7,177 416.6,177zM409.1,248.6h-87.3v-31.6c0,-4.1 -3.4,-7.5 -7.5,-7.5s-7.5,3.4 -7.5,7.5v31.6h-25.9v-56.6h128.2V248.6z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M416.6,356H273.4c-4.1,0 -7.5,3.4 -7.5,7.5v41.2c0,4.1 3.4,7.5 7.5,7.5h143.2c4.1,0 7.5,-3.4 7.5,-7.5v-41.2C424.1,359.3 420.7,356 416.6,356zM361.4,371v26.2h-32.7v-26.2H361.4zM280.9,371h32.7v26.2h-32.7V371zM409.1,397.2h-32.7v-26.2h32.7V397.2z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M140.5,257.3c-4.1,0 -7.5,3.4 -7.5,7.5v61.4c0,4.1 3.4,7.5 7.5,7.5c4.1,0 7.5,-3.4 7.5,-7.5v-61.4C148,260.7 144.6,257.3 140.5,257.3z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M109.8,265.5c-4.1,0 -7.5,3.4 -7.5,7.5v44.9c0,4.1 3.4,7.5 7.5,7.5s7.5,-3.4 7.5,-7.5v-44.9C117.3,268.9 113.9,265.5 109.8,265.5z"/>
-    <path android:fillColor="#9e9e9e" android:pathData="M171.1,265.5c-4.1,0 -7.5,3.4 -7.5,7.5v44.9c0,4.1 3.4,7.5 7.5,7.5s7.5,-3.4 7.5,-7.5v-44.9C178.6,268.9 175.3,265.5 171.1,265.5z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_radio_button_checked.xml b/src/welle-gui/android/res/drawable/ic_radio_button_checked.xml
deleted file mode 100644
index f6e8a94..0000000
--- a/src/welle-gui/android/res/drawable/ic_radio_button_checked.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M12,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5 5,-2.24 5,-5 -2.24,-5 -5,-5zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_radio_button_unchecked.xml b/src/welle-gui/android/res/drawable/ic_radio_button_unchecked.xml
deleted file mode 100644
index 42988f2..0000000
--- a/src/welle-gui/android/res/drawable/ic_radio_button_unchecked.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.42,0 -8,-3.58 -8,-8s3.58,-8 8,-8 8,3.58 8,8 -3.58,8 -8,8z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_search.xml b/src/welle-gui/android/res/drawable/ic_search.xml
deleted file mode 100644
index 47432c1..0000000
--- a/src/welle-gui/android/res/drawable/ic_search.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_skip_next.xml b/src/welle-gui/android/res/drawable/ic_skip_next.xml
deleted file mode 100644
index 5d1017b..0000000
--- a/src/welle-gui/android/res/drawable/ic_skip_next.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_skip_previous.xml b/src/welle-gui/android/res/drawable/ic_skip_previous.xml
deleted file mode 100644
index 7528785..0000000
--- a/src/welle-gui/android/res/drawable/ic_skip_previous.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z"/>
-</vector>
diff --git a/src/welle-gui/android/res/drawable/ic_skip_up.xml b/src/welle-gui/android/res/drawable/ic_skip_up.xml
deleted file mode 100644
index eae5c78..0000000
--- a/src/welle-gui/android/res/drawable/ic_skip_up.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FFFFFFFF"
-        android:pathData="M5,17.5H19L12,6.5Z"/>
-</vector>
diff --git a/src/welle-gui/android/res/values-de/strings.xml b/src/welle-gui/android/res/values-de/strings.xml
deleted file mode 100644
index a4b51d2..0000000
--- a/src/welle-gui/android/res/values-de/strings.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">welle.io</string>
-    <string name="menu_stations">Sender</string>
-    <string name="menu_channels">Kanäle</string>
-    <string name="menu_channel_scan">Sendersuchlauf</string>
-    <string name="menu_favorites">Favoriten</string>
-    <string name="action_close">Beenden</string>
-    <string name="action_cancel">Abbrechen</string>
-    <string name="action_scan">Suchen</string>
-    <string name="action_favorite">Favorit</string>
-    <string name="action_record">Aufnehmen</string>
-    <string name="action_play">Abspielen</string>
-    <string name="action_pause">Pausieren</string>
-    <string name="action_skip_next">Nächste</string>
-    <string name="action_skip_prev">Vorherige</string>
-    <string name="action_next_channel">Nächster Kanal</string>
-    <string name="label_scanning">Scanne</string>
-    <string name="error_unknown">Unbekannter Fehler.</string>
-    <string name="error_not_initialised">Radioempfänger meldet einen Fehler oder existiert nicht.</string>
-    <string name="error_driver_not_installed">Android RTL-SDR Treiber ist nicht installiert.</string>
-    <string name="dialog_driver_title">Android RTL-SDR Treiber ist nicht installiert</string>
-    <string name="dialog_driver_msg">Soll er installiert werden? welle.io muss nach der Treiberinstallation neu gestartet werden.</string>
-    <string name="dialog_driver_btn_ok">Installieren</string>
-    <string name="dialog_driver_btn_cancel">Abbrechen</string>
-</resources>
diff --git a/src/welle-gui/android/res/values/libs.xml b/src/welle-gui/android/res/values/libs.xml
index 4009a77..6b1a4a2 100644
--- a/src/welle-gui/android/res/values/libs.xml
+++ b/src/welle-gui/android/res/values/libs.xml
@@ -1,7 +1,7 @@
 <?xml version='1.0' encoding='utf-8'?>
 <resources>
     <array name="qt_sources">
-        <item>https://download.qt.io/ministro/android/qt5/qt-5.9</item>
+        <item>https://download.qt.io/ministro/android/qt5/qt-5.14</item>
     </array>
 
     <!-- The following is handled automatically by the deployment tool. It should
@@ -11,15 +11,12 @@
         <!-- %%INSERT_EXTRA_LIBS%% -->
     </array>
 
-     <array name="qt_libs">
-         <!-- %%INSERT_QT_LIBS%% -->
-     </array>
-
-    <array name="bundled_in_lib">
-        <!-- %%INSERT_BUNDLED_IN_LIB%% -->
+    <array name="qt_libs">
+        <!-- %%INSERT_QT_LIBS%% -->
     </array>
-    <array name="bundled_in_assets">
-        <!-- %%INSERT_BUNDLED_IN_ASSETS%% -->
+
+    <array name="load_local_libs">
+        <!-- %%INSERT_LOCAL_LIBS%% -->
     </array>
 
 </resources>
diff --git a/src/welle-gui/android/res/values/strings.xml b/src/welle-gui/android/res/values/strings.xml
deleted file mode 100644
index cf5c400..0000000
--- a/src/welle-gui/android/res/values/strings.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <string name="app_name">welle.io</string>
-    <string name="menu_stations">Stations</string>
-    <string name="menu_channels">Channels</string>
-    <string name="menu_channel_scan">Find Stations</string>
-    <string name="menu_favorites">Favorites</string>
-    <string name="action_close">Close</string>
-    <string name="action_cancel">Cancel</string>
-    <string name="action_scan">Scan</string>
-    <string name="action_favorite">Favorite</string>
-    <string name="action_record">Record</string>
-    <string name="action_play">Play</string>
-    <string name="action_pause">Pause</string>
-    <string name="action_skip_next">Next</string>
-    <string name="action_skip_prev">Previous</string>
-    <string name="action_next_channel">Next Channel</string>
-    <string name="label_scanning">Scanning</string>
-    <string name="error_unknown">Unknown error.</string>
-    <string name="error_not_initialised">Radio device is not ready or does not exist.</string>
-    <string name="error_driver_not_installed">Android RTL-SDR driver is not installed.</string>
-    <string name="dialog_driver_title">Android RTL-SDR driver is not installed</string>
-    <string name="dialog_driver_msg">Would you like to install it? Start welle.io again after install.</string>
-    <string name="dialog_driver_btn_ok">Install</string>
-    <string name="dialog_driver_btn_cancel">Cancel</string>
-</resources>
diff --git a/src/welle-gui/android/res/values/styles.xml b/src/welle-gui/android/res/values/styles.xml
deleted file mode 100644
index ab09d90..0000000
--- a/src/welle-gui/android/res/values/styles.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <color name="colorPrimary">#ffff3d00</color>
-    <color name="colorAccent">#ffff3d00</color>
-    <color name="colorPrimaryDark">#ff212126</color>
-    <color name="background">#ff212126</color>
-
-    <style name="AppTheme" parent="Theme.AppCompat">
-        <item name="colorPrimary">@color/colorPrimary</item>
-        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
-        <item name="colorAccent">@color/colorAccent</item>
-        <!--<item name="android:background">@color/background</item>-->
-        <item name="android:windowBackground">@color/background</item>
-        <item name="android:colorBackground">@color/background</item>
-    </style>
-
-    <style name="CarTheme" parent="AppTheme">
-        <!-- colorPrimaryDark is currently used in Android Auto for:
-             - App background
-             - Drawer right side ("more" custom actions) background
-             - Notification icon badge tinting
-             - Overview “now playing” icon tinting
-         -->
-        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
-
-        <!-- colorAccent is used in Android Auto for:
-             - Spinner
-             - progress bar
-             - floating action button background (Play/Pause in media apps)
-         -->
-        <item name="colorAccent">@color/colorAccent</item>
-    </style>
-
-    <style name="WearTheme" parent="AppTheme">
-        <!-- colorPrimaryDark is currently used on Android Wear for:
-             - Card background on media browse
-             - Card background on 4-way media controls
-         -->
-        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
-    </style>
-
-</resources>
diff --git a/src/welle-gui/android/res/xml/automotive_app_desc.xml b/src/welle-gui/android/res/xml/automotive_app_desc.xml
deleted file mode 100644
index 8e77bb0..0000000
--- a/src/welle-gui/android/res/xml/automotive_app_desc.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<automotiveApp>
-   <uses name="media" />
-</automotiveApp>
diff --git a/src/welle-gui/android/res/xml/device_filter.xml b/src/welle-gui/android/res/xml/device_filter.xml
deleted file mode 100644
index ca85543..0000000
--- a/src/welle-gui/android/res/xml/device_filter.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<resources>
-
-    <usb-device vendor-id="0x0bda" product-id="0x2832"/> <!-- Generic RTL2832U-->
-    <usb-device vendor-id="0x0bda" product-id="0x2838"/> <!-- Generic RTL2832U OEM-->
-    <usb-device vendor-id="0x0413" product-id="0x6680"/> <!-- DigitalNow Quad DVB-T PCI-E card-->
-    <usb-device vendor-id="0x0413" product-id="0x6f0f"/> <!-- Leadtek WinFast DTV Dongle mini D-->
-    <usb-device vendor-id="0x0458" product-id="0x707f"/> <!-- Genius TVGo DVB-T03 USB dongle (Ver. B)-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00a9"/> <!-- Terratec Cinergy T Stick Black (rev 1)-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00b3"/> <!-- Terratec NOXON DAB/DAB+ USB dongle (rev 1)-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00b4"/> <!-- Terratec Deutschlandradio DAB Stick-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00b5"/> <!-- Terratec NOXON DAB Stick - Radio Energy-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00b7"/> <!-- Terratec Media Broadcast DAB Stick-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00b8"/> <!-- Terratec BR DAB Stick-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00b9"/> <!-- Terratec WDR DAB Stick-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00c0"/> <!-- Terratec MuellerVerlag DAB Stick-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00c6"/> <!-- Terratec Fraunhofer DAB Stick-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00d3"/> <!-- Terratec Cinergy T Stick RC (Rev.3)-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00d7"/> <!-- Terratec T Stick PLUS-->
-    <usb-device vendor-id="0x0ccd" product-id="0x00e0"/> <!-- Terratec NOXON DAB/DAB+ USB dongle (rev 2)-->
-    <usb-device vendor-id="0x1554" product-id="0x5020"/> <!-- PixelView PV-DT235U(RN)-->
-    <usb-device vendor-id="0x15f4" product-id="0x0131"/> <!-- Astrometa DVB-T/DVB-T2-->
-    <usb-device vendor-id="0x15f4" product-id="0x0133"/> <!-- HanfTek DAB+FM+DVB-T-->
-    <usb-device vendor-id="0x185b" product-id="0x0620"/> <!-- Compro Videomate U620F-->
-    <usb-device vendor-id="0x185b" product-id="0x0650"/> <!-- Compro Videomate U650F-->
-    <usb-device vendor-id="0x185b" product-id="0x0680"/> <!-- Compro Videomate U680F-->
-    <usb-device vendor-id="0x1b80" product-id="0xd393"/> <!-- GIGABYTE GT-U7300-->
-    <usb-device vendor-id="0x1b80" product-id="0xd394"/> <!-- DIKOM USB-DVBT HD-->
-    <usb-device vendor-id="0x1b80" product-id="0xd395"/> <!-- Peak 102569AGPK-->
-    <usb-device vendor-id="0x1b80" product-id="0xd397"/> <!-- KWorld KW-UB450-T USB DVB-T Pico TV-->
-    <usb-device vendor-id="0x1b80" product-id="0xd398"/> <!-- Zaapa ZT-MINDVBZP-->
-    <usb-device vendor-id="0x1b80" product-id="0xd39d"/> <!-- SVEON STV20 DVB-T USB & FM-->
-    <usb-device vendor-id="0x1b80" product-id="0xd3a4"/> <!-- Twintech UT-40-->
-    <usb-device vendor-id="0x1b80" product-id="0xd3a8"/> <!-- ASUS U3100MINI_PLUS_V2-->
-    <usb-device vendor-id="0x1b80" product-id="0xd3af"/> <!-- SVEON STV27 DVB-T USB & FM-->
-    <usb-device vendor-id="0x1b80" product-id="0xd3b0"/> <!-- SVEON STV21 DVB-T USB & FM-->
-    <usb-device vendor-id="0x1d19" product-id="0x1101"/> <!-- Dexatek DK DVB-T Dongle (Logilink VG0002A)-->
-    <usb-device vendor-id="0x1d19" product-id="0x1102"/> <!-- Dexatek DK DVB-T Dongle (MSI DigiVox mini II V3.0)-->
-    <usb-device vendor-id="0x1d19" product-id="0x1103"/> <!-- Dexatek Technology Ltd. DK 5217 DVB-T Dongle-->
-    <usb-device vendor-id="0x1d19" product-id="0x1104"/> <!-- MSI DigiVox Micro HD-->
-    <usb-device vendor-id="0x1f4d" product-id="0xa803"/> <!-- Sweex DVB-T USB-->
-    <usb-device vendor-id="0x1f4d" product-id="0xb803"/> <!-- GTek T803-->
-    <usb-device vendor-id="0x1f4d" product-id="0xc803"/> <!-- Lifeview LV5TDeluxe-->
-    <usb-device vendor-id="0x1f4d" product-id="0xd286"/> <!-- MyGica TD312-->
-    <usb-device vendor-id="0x1f4d" product-id="0xd803"/> <!-- PROlectrix DV107669-->
-
-</resources>
\ No newline at end of file
diff --git a/src/welle-gui/android_rtl_sdr.cpp b/src/welle-gui/android_rtl_sdr.cpp
index 915f2c2..9770b88 100644
--- a/src/welle-gui/android_rtl_sdr.cpp
+++ b/src/welle-gui/android_rtl_sdr.cpp
@@ -136,7 +136,7 @@ void CAndroid_RTL_SDR::setOpenInstallDialog()
     // Init pop up
     QAndroidJniObject okButtonText = QAndroidJniObject::fromString(QT_TR_NOOP("OK"));
     QAndroidJniObject cancelButtonText = QAndroidJniObject::fromString(QT_TR_NOOP("Cancel"));
-    QAndroidJniObject message = QAndroidJniObject::fromString(QT_TR_NOOP("Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again."));
+    QAndroidJniObject message = QAndroidJniObject::fromString(QT_TR_NOOP("Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again."));
     dialog.callMethod<void>("setMessageText",
                             "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V",
                             okButtonText.object<jstring>(), cancelButtonText.object<jstring>(), message.object<jstring>());
diff --git a/src/welle-gui/audio_output.cpp b/src/welle-gui/audio_output.cpp
index a3e7d7d..d85b653 100644
--- a/src/welle-gui/audio_output.cpp
+++ b/src/welle-gui/audio_output.cpp
@@ -85,6 +85,7 @@ void CAudioThread::init(int sampleRate)
     if (audioOutput != nullptr) {
         delete audioOutput;
         audioOutput = nullptr;
+        currentState = QAudio::StoppedState;
     }
 
     audioFormat.setSampleRate(sampleRate);
@@ -109,7 +110,7 @@ void CAudioThread::init(int sampleRate)
     audioOutput->setBufferSize(audioOutput->bufferSize()*2);
     connect(audioOutput, &QAudioOutput::stateChanged, this, &CAudioThread::handleStateChanged);
 
-    audioIODevice.start();
+    //audioIODevice.start();
 
     // Disable audio at startup. It will be started through "checkAudioBufferTimeout" method when needed
     //audioOutput->start(&audioIODevice);
diff --git a/src/welle-gui/doc/man/update_manpage.sh b/src/welle-gui/doc/man/update_manpage.sh
new file mode 100755
index 0000000..cb1f4cb
--- /dev/null
+++ b/src/welle-gui/doc/man/update_manpage.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+help2man \
+  --name "DAB/DAB+ Software Radio" \
+  --no-info \
+  --output welle-io.1 \
+  welle-io
diff --git a/src/welle-gui/doc/man/welle-io.1 b/src/welle-gui/doc/man/welle-io.1
new file mode 100644
index 0000000..51ec5b1
--- /dev/null
+++ b/src/welle-gui/doc/man/welle-io.1
@@ -0,0 +1,30 @@
+.\" DO NOT MODIFY THIS FILE!  It was generated by help2man 1.48.1.
+.TH WELLE.IO "1" "November 2021" "welle.io 2.4 dev Git: unknown" "User Commands"
+.SH NAME
+welle.io \- DAB/DAB+ Software Radio
+.SH SYNOPSIS
+.B welle-io
+[\fI\,options\/\fR]
+.SH DESCRIPTION
+welle.io is an open source DAB and DAB+ software defined radio (SDR) with support for rtl\-sdr (RTL2832U) and airspy. It supports high DPI and touch displays and it runs even on cheap computers like Raspberry Pi 2/3 and 100??? China Windows 10 tablets.
+.SH OPTIONS
+.TP
+\fB\-h\fR, \fB\-\-help\fR
+Displays help on commandline options.
+.TP
+\fB\-\-help\-all\fR
+Displays help including Qt specific options.
+.TP
+\fB\-v\fR, \fB\-\-version\fR
+Displays version information.
+.TP
+\fB\-\-dump\-file\fR <File name>
+Records DAB frames (*.mp2) or DAB+ superframes with
+RS coding (*.dab). This file can be used to analyse
+X\-PAD data with XPADxpert
+.TP
+\fB\-\-log\-file\fR <File name>
+Redirects all log output texts to a file.
+.TP
+\fB\-\-qqc\-style\fR <Style name>
+Qt Quick Controls Style for the 1st launch
diff --git a/src/welle-gui/gui_helper.cpp b/src/welle-gui/gui_helper.cpp
index 947c713..4641731 100644
--- a/src/welle-gui/gui_helper.cpp
+++ b/src/welle-gui/gui_helper.cpp
@@ -94,6 +94,9 @@ CGUIHelper::CGUIHelper(CRadioController *RadioController, QObject *parent)
 
 #endif
 
+#ifndef __ANDROID__
+    mpris = new Mpris(radioController, this);
+#endif
     CDebugOutput::setCGUI(this);
 }
 
@@ -178,8 +181,13 @@ const QByteArray CGUIHelper::getInfoPage(QString pageName)
         // Set application version
         InfoContent.append(tr("welle.io version") + ": " + QString(CURRENT_VERSION) + "\n");
         InfoContent.append(tr("Git revision") + ": " + QString(GITHASH) + "\n");
-        QString ts = QString(__TIMESTAMP__).replace("  "," ");
-        QDateTime tsDT = QLocale(QLocale::C).toDateTime(ts, "ddd MMM d hh:mm:ss yyyy");
+        QDateTime tsDT;
+        QString source_date_epoch = BUILD_DATE;
+        if (!source_date_epoch.isEmpty()) {
+            tsDT = QDateTime::fromSecsSinceEpoch(source_date_epoch.toLongLong());
+        } else {
+            tsDT = QDateTime::currentDateTime();
+        }
         InfoContent.append(tr("Built on") + ": " + tsDT.toString(Qt::ISODate) + "\n");
         InfoContent.append(tr("QT version") + ": " + qVersion() + "\n");
         InfoContent.append("\n");
@@ -525,9 +533,9 @@ void CGUIHelper::updateConstellation()
     */
 }
 
-void CGUIHelper::saveMotImages()
+void CGUIHelper::saveMotImages(QString folder)
 {
-    motImageProvider->saveAll();
+    motImageProvider->saveAll(folder);
 }
 
 void CGUIHelper::openAutoDevice()
@@ -895,3 +903,15 @@ QVariant StyleModel::data(const QModelIndex & index, int role) const
         return style.style();
     return QVariant();
 }
+
+#ifndef __ANDROID__
+void CGUIHelper::updateMprisStationList(QString serializedJson, QString listType, int index)
+{
+    mpris->setStationArray(serializedJson, listType, index);
+}
+
+void CGUIHelper::setMprisFullScreenState(bool isFullscreen)
+{
+    mpris->setFullscreenState(isFullscreen);
+}
+#endif
diff --git a/src/welle-gui/gui_helper.h b/src/welle-gui/gui_helper.h
index 038f63e..935fbad 100644
--- a/src/welle-gui/gui_helper.h
+++ b/src/welle-gui/gui_helper.h
@@ -52,6 +52,10 @@
 #include "dab-constants.h"
 #include "radio_controller.h"
 
+#ifndef __ANDROID__
+    #include "mpris/mpris.h"
+#endif
+
 #ifdef __ANDROID__
     class FileActivityResultReceiver;
 #endif
@@ -144,7 +148,7 @@ public:
     Q_INVOKABLE void updateImpulseResponse();
     Q_INVOKABLE void updateNullSymbol();
     Q_INVOKABLE void updateConstellation();
-    Q_INVOKABLE void saveMotImages();
+    Q_INVOKABLE void saveMotImages(QString folder);
 
     Q_INVOKABLE void openAutoDevice();
     Q_INVOKABLE void openNull();
@@ -172,6 +176,11 @@ public:
     Q_INVOKABLE bool isThemableStyle(QString);
     Q_INVOKABLE void saveQQStyle(int);
 
+#ifndef __ANDROID__
+    Q_INVOKABLE void updateMprisStationList(QString, QString, int);
+    Q_INVOKABLE void setMprisFullScreenState(bool isFullscreen);
+#endif
+
     CMOTImageProvider* motImageProvider; // ToDo: Must be a getter
 
 private:
@@ -200,6 +209,10 @@ private:
     StyleModel *m_styleModel = nullptr;
     bool settingsStyleInAvailableStyles = false;
 
+#ifndef __ANDROID__
+    Mpris *mpris;
+#endif
+
 #ifndef QT_NO_SYSTEMTRAYICON
     QAction *minimizeAction;
     QAction *maximizeAction;
@@ -236,11 +249,16 @@ signals:
     void newDeviceId(int deviceId);
     void styleChanged(void);
     void translationFinished(void);
+    void setFullScreen(bool isFullScreen);
 
 #ifndef QT_NO_SYSTEMTRAYICON
     void minimizeWindow(void);
     void maximizeWindow(void);
     void restoreWindow(void);
+#else
+    #ifndef QT_NO_DBUS
+    void restoreWindow(void);
+    #endif
 #endif
 };
 
diff --git a/src/welle-gui/i18n/de_DE.qm b/src/welle-gui/i18n/de_DE.qm
index 29f3911..5976380 100644
Binary files a/src/welle-gui/i18n/de_DE.qm and b/src/welle-gui/i18n/de_DE.qm differ
diff --git a/src/welle-gui/i18n/de_DE.ts b/src/welle-gui/i18n/de_DE.ts
index dc4db0f..e269efc 100644
--- a/src/welle-gui/i18n/de_DE.ts
+++ b/src/welle-gui/i18n/de_DE.ts
@@ -24,14 +24,6 @@
 </context>
 <context>
     <name>CAndroid_RTL_SDR</name>
-    <message>
-        <source>Android RTL-SDR driver is not installed</source>
-        <translation type="vanished">Android RTL-SDR Treiber ist nicht installiert</translation>
-    </message>
-    <message>
-        <source>Would you like to install it? Start welle.io again after install.</source>
-        <translation type="vanished">Soll er installiert werden? welle.io muss nach der Treiberinstallation neu gestartet werden.</translation>
-    </message>
     <message>
         <location filename="../android_rtl_sdr.cpp" line="137"/>
         <source>OK</source>
@@ -44,367 +36,79 @@
     </message>
     <message>
         <location filename="../android_rtl_sdr.cpp" line="139"/>
-        <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
-        <translation>Der Android RTL-SDR-Treiber ist nicht installiert. Möchten Sie ihn installieren? Danach bitte welle.io neu starten.</translation>
-    </message>
-</context>
-<context>
-    <name>CDABConstants</name>
-    <message>
-        <source>none</source>
-        <translation type="vanished">nicht gesetzt</translation>
-    </message>
-    <message>
-        <source>News</source>
-        <translation type="vanished">Nachrichten</translation>
-    </message>
-    <message>
-        <source>Current Affairs</source>
-        <translation type="vanished">Aktuelle Nachrichten</translation>
-    </message>
-    <message>
-        <source>Information</source>
-        <translation type="vanished">Informationen</translation>
-    </message>
-    <message>
-        <source>Sport</source>
-        <translation type="vanished">Sport</translation>
-    </message>
-    <message>
-        <source>Education</source>
-        <translation type="vanished">Bildung</translation>
-    </message>
-    <message>
-        <source>Drama</source>
-        <translation type="vanished">Drama</translation>
-    </message>
-    <message>
-        <source>Arts</source>
-        <translation type="vanished">Kunst</translation>
-    </message>
-    <message>
-        <source>Science</source>
-        <translation type="vanished">Forschung</translation>
-    </message>
-    <message>
-        <source>Talk</source>
-        <translation type="vanished">Talk</translation>
-    </message>
-    <message>
-        <source>Pop Music</source>
-        <translation type="vanished">Pop</translation>
-    </message>
-    <message>
-        <source>Rock Music</source>
-        <translation type="vanished">Rock</translation>
-    </message>
-    <message>
-        <source>Light classical</source>
-        <translation type="vanished">Klassik</translation>
-    </message>
-    <message>
-        <source>Classical Music</source>
-        <translation type="vanished">Klassik</translation>
-    </message>
-    <message>
-        <source>Weather</source>
-        <translation type="vanished">Wetter</translation>
-    </message>
-    <message>
-        <source>Finance</source>
-        <translation type="vanished">Finanzen</translation>
-    </message>
-    <message>
-        <source>Children&apos;s</source>
-        <translation type="vanished">Kinder</translation>
-    </message>
-    <message>
-        <source>Religion</source>
-        <translation type="vanished">Religion</translation>
-    </message>
-    <message>
-        <source>Travel</source>
-        <translation type="vanished">Reise</translation>
-    </message>
-    <message>
-        <source>Leisure</source>
-        <translation type="vanished">Freizeit</translation>
-    </message>
-    <message>
-        <source>Jazz and Blues</source>
-        <translation type="vanished">Jazz und Blues</translation>
-    </message>
-    <message>
-        <source>Country Music</source>
-        <translation type="vanished">Country</translation>
-    </message>
-    <message>
-        <source>Oldies Music</source>
-        <translation type="vanished">Oldies</translation>
-    </message>
-    <message>
-        <source>Unknown</source>
-        <translation type="vanished">Unbekannt</translation>
-    </message>
-    <message>
-        <source>Albanian</source>
-        <translation type="vanished">Albanisch</translation>
-    </message>
-    <message>
-        <source>Breton</source>
-        <translation type="vanished">Bretonisch</translation>
-    </message>
-    <message>
-        <source>Catalan</source>
-        <translation type="vanished">Katalanisch</translation>
-    </message>
-    <message>
-        <source>Croatian</source>
-        <translation type="vanished">Kroatisch</translation>
-    </message>
-    <message>
-        <source>Welsh</source>
-        <translation type="vanished">Wallisisch</translation>
-    </message>
-    <message>
-        <source>Czech</source>
-        <translation type="vanished">Tschechisch</translation>
-    </message>
-    <message>
-        <source>Danish</source>
-        <translation type="vanished">Dänisch</translation>
-    </message>
-    <message>
-        <source>German</source>
-        <translation type="vanished">Deutsch</translation>
-    </message>
-    <message>
-        <source>English</source>
-        <translation type="vanished">Englisch</translation>
-    </message>
-    <message>
-        <source>Spanish</source>
-        <translation type="vanished">Spanisch</translation>
-    </message>
-    <message>
-        <source>Esperanto</source>
-        <translation type="vanished">Esperanto</translation>
-    </message>
-    <message>
-        <source>Estonian</source>
-        <translation type="vanished">Estnisch</translation>
-    </message>
-    <message>
-        <source>Basque</source>
-        <translation type="vanished">Baskisch</translation>
-    </message>
-    <message>
-        <source>Faroese</source>
-        <translation type="vanished">Färöisch</translation>
-    </message>
-    <message>
-        <source>French</source>
-        <translation type="vanished">Französisch</translation>
-    </message>
-    <message>
-        <source>Frisian</source>
-        <translation type="vanished">Friesisch</translation>
-    </message>
-    <message>
-        <source>Irish</source>
-        <translation type="vanished">Irisch</translation>
-    </message>
-    <message>
-        <source>Gaelic</source>
-        <translation type="vanished">Gälisch</translation>
-    </message>
-    <message>
-        <source>Galician</source>
-        <translation type="vanished">Galicisch</translation>
-    </message>
-    <message>
-        <source>Icelandic</source>
-        <translation type="vanished">Isländisch</translation>
-    </message>
-    <message>
-        <source>Italian</source>
-        <translation type="vanished">Italienisch</translation>
-    </message>
-    <message>
-        <source>Lappish</source>
-        <translation type="vanished">Lappisch</translation>
-    </message>
-    <message>
-        <source>Latin</source>
-        <translation type="vanished">Latein</translation>
-    </message>
-    <message>
-        <source>Latvian</source>
-        <translation type="vanished">Lettisch</translation>
-    </message>
-    <message>
-        <source>Luxembourgian</source>
-        <translation type="vanished">Luxemburgisch</translation>
-    </message>
-    <message>
-        <source>Lithuanian</source>
-        <translation type="vanished">Litauisch</translation>
-    </message>
-    <message>
-        <source>Hungarian</source>
-        <translation type="vanished">Ungarisch</translation>
-    </message>
-    <message>
-        <source>Maltese</source>
-        <translation type="vanished">Maltesisch</translation>
-    </message>
-    <message>
-        <source>Dutch</source>
-        <translation type="vanished">Niederländisch</translation>
-    </message>
-    <message>
-        <source>Norwegian</source>
-        <translation type="vanished">Norwegisch</translation>
-    </message>
-    <message>
-        <source>Occitan</source>
-        <translation type="vanished">Okzitanisch</translation>
-    </message>
-    <message>
-        <source>Polish</source>
-        <translation type="vanished">Polnisch</translation>
-    </message>
-    <message>
-        <source>Portuguese</source>
-        <translation type="vanished">Portugiesisch</translation>
-    </message>
-    <message>
-        <source>Romanian</source>
-        <translation type="vanished">Rumänisch</translation>
-    </message>
-    <message>
-        <source>Romansh</source>
-        <translation type="vanished">Rätoromanisch</translation>
-    </message>
-    <message>
-        <source>Serbian</source>
-        <translation type="vanished">Serbisch</translation>
-    </message>
-    <message>
-        <source>Slovak</source>
-        <translation type="vanished">Slowakisch</translation>
-    </message>
-    <message>
-        <source>Slovene</source>
-        <translation type="vanished">Slowenisch</translation>
-    </message>
-    <message>
-        <source>Finnish</source>
-        <translation type="vanished">Finnisch</translation>
-    </message>
-    <message>
-        <source>Swedish</source>
-        <translation type="vanished">Schwedisch</translation>
-    </message>
-    <message>
-        <source>Turkish</source>
-        <translation type="vanished">Türkisch</translation>
-    </message>
-    <message>
-        <source>Flemish</source>
-        <translation type="vanished">Flämisch</translation>
-    </message>
-    <message>
-        <source>Walloon</source>
-        <translation type="vanished">Wallonisch</translation>
-    </message>
-</context>
-<context>
-    <name>CGUI</name>
-    <message>
-        <source>Station list is empty</source>
-        <translation type="vanished">Keine Sender vorhanden</translation>
-    </message>
-    <message>
-        <source>version</source>
-        <translation type="vanished">Version</translation>
-    </message>
-    <message>
-        <source>Git revision</source>
-        <translation type="vanished">Git Revision</translation>
-    </message>
-    <message>
-        <source>Build on</source>
-        <translation type="vanished">Übersetzt am</translation>
-    </message>
-    <message>
-        <source>QT version</source>
-        <translation type="vanished">QT Version</translation>
+        <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
+        <translation type="unfinished">Der Android RTL-SDR-Treiber ist nicht installiert. Möchten Sie ihn installieren? Danach bitte welle.io neu starten.</translation>
     </message>
 </context>
 <context>
     <name>CGUIHelper</name>
     <message>
-        <location filename="../gui_helper.cpp" line="65"/>
-        <location filename="../gui_helper.cpp" line="654"/>
+        <location filename="../gui_helper.cpp" line="66"/>
+        <location filename="../gui_helper.cpp" line="699"/>
         <source>Mi&amp;nimize</source>
         <translation>Mi&amp;nimieren</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="68"/>
-        <location filename="../gui_helper.cpp" line="655"/>
+        <location filename="../gui_helper.cpp" line="69"/>
+        <location filename="../gui_helper.cpp" line="700"/>
         <source>Ma&amp;ximize</source>
         <translation>Ma&amp;ximieren</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="71"/>
-        <location filename="../gui_helper.cpp" line="656"/>
+        <location filename="../gui_helper.cpp" line="72"/>
+        <location filename="../gui_helper.cpp" line="701"/>
         <source>&amp;Restore</source>
         <translation>Wiede&amp;rherstellen</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="74"/>
-        <location filename="../gui_helper.cpp" line="657"/>
+        <location filename="../gui_helper.cpp" line="75"/>
+        <location filename="../gui_helper.cpp" line="702"/>
         <source>&amp;Quit</source>
         <translation>Beenden (&amp;Quit)</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="127"/>
-        <source>version</source>
-        <translation>Version</translation>
+        <location filename="../gui_helper.cpp" line="180"/>
+        <source>welle.io version</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="128"/>
-        <source>Git revision</source>
-        <translation>Git-Revision</translation>
+        <location filename="../gui_helper.cpp" line="184"/>
+        <source>Built on</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="129"/>
-        <source>Build on</source>
-        <translation>Übersetzt am</translation>
+        <location filename="../gui_helper.cpp" line="302"/>
+        <source>The program will keep running in the system tray. To terminate the program, choose &quot;%1&quot; in the context menu of the system tray entry.</source>
+        <translation type="unfinished">Das Programm bleibt im Hintergrund aktiv. Um es gänzlich zu schließen, wählen Sie &quot;%1&quot; aus dem Kontextmenü des Icons in der Taskleiste.</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="130"/>
-        <source>QT version</source>
-        <translation>Qt-Version</translation>
+        <location filename="../gui_helper.cpp" line="307"/>
+        <source>Quit</source>
+        <extracomment>&quot;Quit&quot; translation should be the same as the one of system tray</extracomment>
+        <translation type="unfinished">Beenden</translation>
+    </message>
+    <message>
+        <location filename="../gui_helper.cpp" line="181"/>
+        <source>Git revision</source>
+        <translation>Git-Revision</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="283"/>
-        <source>The program will keep running in the system tray. To terminate the program, choose &lt;b&gt;Quit&lt;/b&gt; in the context menu of the system tray entry.</source>
-        <translation>Das Programm bleibt im Hintergrund aktiv. Um es gänzlich zu schließen, wählen Sie &lt;b&gt;Beenden&lt;/b&gt; aus dem Kontextmenü des Icons in der Taskleiste.</translation>
+        <location filename="../gui_helper.cpp" line="185"/>
+        <source>QT version</source>
+        <translation>Qt-Version</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="776"/>
+        <location filename="../gui_helper.cpp" line="823"/>
         <source> (unavailable, fallback to Default)</source>
         <translation> (nicht verfügbar, Rücksetzen auf Standardeinstellung)</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="780"/>
+        <location filename="../gui_helper.cpp" line="827"/>
         <source>Style of system</source>
         <translation>Systemstil</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="782"/>
+        <location filename="../gui_helper.cpp" line="829"/>
         <source> (Recommended)</source>
         <translation> (empfohlen)</translation>
     </message>
@@ -412,13 +116,13 @@
 <context>
     <name>CRadioController</name>
     <message>
-        <location filename="../radio_controller.cpp" line="608"/>
+        <location filename="../radio_controller.cpp" line="646"/>
         <source>Unknown</source>
         <translation>Unbekannt</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="406"/>
-        <location filename="../radio_controller.cpp" line="627"/>
+        <location filename="../radio_controller.cpp" line="443"/>
+        <location filename="../radio_controller.cpp" line="665"/>
         <source>No Station</source>
         <translation>Kein Sender gewählt</translation>
     </message>
@@ -428,40 +132,42 @@
         <translation>Fehler beim Öffnen der Datei </translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="369"/>
+        <location filename="../radio_controller.cpp" line="255"/>
+        <source>Playback failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="276"/>
+        <source>Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="405"/>
         <source>RAW File</source>
         <translation>RAW Datei</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="382"/>
-        <location filename="../radio_controller.cpp" line="848"/>
+        <location filename="../radio_controller.cpp" line="419"/>
+        <location filename="../radio_controller.cpp" line="904"/>
         <source>Scanning</source>
         <translation>Scanne</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="386"/>
-        <location filename="../radio_controller.cpp" line="873"/>
+        <location filename="../radio_controller.cpp" line="423"/>
+        <location filename="../radio_controller.cpp" line="929"/>
         <source>Found channels</source>
         <translation>Gefundene Sender</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="602"/>
+        <location filename="../radio_controller.cpp" line="640"/>
         <source>Playing last station</source>
         <translation>Gebe zuletzt gehörten Sender wieder</translation>
     </message>
     <message>
-        <source>Lost signal or bad signal quality, trying to find it again.</source>
-        <translation type="vanished">Kein oder schlechter Empfang. Suche Sender neu.</translation>
-    </message>
-    <message>
-        <location filename="../radio_controller.cpp" line="660"/>
+        <location filename="../radio_controller.cpp" line="715"/>
         <source>Radio device is not ready or does not exist.</source>
         <translation>Gerät meldet einen Fehler oder existiert nicht.</translation>
     </message>
-    <message>
-        <source>Tuning</source>
-        <translation type="vanished">Suche</translation>
-    </message>
     <message>
         <location filename="../../input/airspy_sdr.cpp" line="152"/>
         <source>airspy is unplugged.</source>
@@ -500,28 +206,33 @@
         <translation>Unbekanntes RAW-Dateiformat</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="294"/>
-        <location filename="../../input/rtl_tcp.cpp" line="462"/>
+        <location filename="../../input/rtl_sdr.cpp" line="142"/>
+        <source>Error opening RTL-SDR. See log for details.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../input/rtl_sdr.cpp" line="306"/>
+        <location filename="../../input/rtl_tcp.cpp" line="549"/>
         <source>ADC overload. Maybe you are using a too high gain.</source>
         <translation type="unfinished">ADC überlastet. Evtl. Verstärkung zu stark.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="390"/>
+        <location filename="../../input/rtl_sdr.cpp" line="402"/>
         <source>RTL-SDR is unplugged.</source>
         <translation>RTL-SDR wurde entfernt.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="272"/>
+        <location filename="../../input/rtl_tcp.cpp" line="309"/>
         <source>RTL-TCP connection closed.</source>
         <translation>RTL-TCP-Verbindung wurde geschlossen.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="413"/>
+        <location filename="../../input/rtl_tcp.cpp" line="450"/>
         <source>Connection failed to server </source>
         <translation>Verbindungsfehler zu Server </translation>
     </message>
     <message>
-        <location filename="../../input/soapy_sdr.cpp" line="91"/>
+        <location filename="../../input/soapy_sdr.cpp" line="109"/>
         <source>Could not load SoapySDR with provided device arguments.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -533,42 +244,6 @@
         <source></source>
         <translation></translation>
     </message>
-    <message>
-        <source>Found channels</source>
-        <translation type="obsolete">Gefundene Sender</translation>
-    </message>
-    <message>
-        <source>Automatic RF gain</source>
-        <translation type="obsolete">Auto HF-Verstärkung</translation>
-    </message>
-    <message>
-        <source>Manual gain</source>
-        <translation type="obsolete">Manuelle Verstärkung</translation>
-    </message>
-    <message>
-        <source>Value: </source>
-        <translation type="obsolete">Aktuell: </translation>
-    </message>
-    <message>
-        <source>Select channel manually</source>
-        <translation type="obsolete">Manuelle Kanalwahl</translation>
-    </message>
-    <message>
-        <source>Clear station list</source>
-        <translation type="obsolete">Lösche Senderliste</translation>
-    </message>
-    <message>
-        <source>Full screen mode</source>
-        <translation type="obsolete">Vollbildmodus</translation>
-    </message>
-    <message>
-        <source>Expert mode</source>
-        <translation type="obsolete">Expertenmodus</translation>
-    </message>
-    <message>
-        <source>Exit welle.io</source>
-        <translation type="obsolete">welle.io beenden</translation>
-    </message>
 </context>
 <context>
     <name>ChannelSettings</name>
@@ -578,7 +253,7 @@
         <translation type="unfinished">Zuletzt gehörten Sender wiedergeben</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+        <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
         <source>Display station name in the window title</source>
         <translation type="unfinished">Zeige Stationsnamen im Titelfenster</translation>
     </message>
@@ -1303,206 +978,157 @@
         <translation type="unfinished">Grobe Korrektur aktivieren (für Geräte mit &gt;1kHz Fehler)</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/ExpertSettings.qml" line="65"/>
-        <source>GetMiddle</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QML/settingpages/ExpertSettings.qml" line="65"/>
-        <source>CorrelatePRS</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QML/settingpages/ExpertSettings.qml" line="65"/>
-        <source>PatternOfZeros</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <location filename="../QML/settingpages/ExpertSettings.qml" line="75"/>
-        <source>Coarse corrector algorithm</source>
-        <translation type="unfinished">Algorithmus für Grobe Korrektur</translation>
-    </message>
-    <message>
-        <location filename="../QML/settingpages/ExpertSettings.qml" line="83"/>
-        <source>Enable TII decoding to console log (increases CPU usage)</source>
-        <translation type="unfinished">TII-Dekoder-Log auf der Konsole aktivieren (erhöht die CPU-Last)</translation>
-    </message>
-    <message>
-        <location filename="../QML/settingpages/ExpertSettings.qml" line="97"/>
-        <source>Strongest Peak</source>
-        <translation type="unfinished">Größter Spitzenwert</translation>
-    </message>
-    <message>
-        <location filename="../QML/settingpages/ExpertSettings.qml" line="97"/>
-        <source>Earliest Peak With Binning</source>
-        <translation type="unfinished">Frühester Spitzenwert mit Binning</translation>
-    </message>
-    <message>
-        <location filename="../QML/settingpages/ExpertSettings.qml" line="97"/>
-        <source>Threshold Before Peak</source>
-        <translation type="unfinished">Schwelle vor dem Spitzenwert</translation>
-    </message>
-    <message>
-        <location filename="../QML/settingpages/ExpertSettings.qml" line="107"/>
-        <source>FFT Window placement algorithm</source>
-        <translation type="unfinished">Algorithmus für FFT Fensterposition</translation>
-    </message>
-</context>
-<context>
-    <name>ExpertView</name>
-    <message>
-        <source>Device</source>
-        <translation type="vanished">Radioempfänger</translation>
-    </message>
-    <message>
-        <source>Current channel</source>
-        <translation type="vanished">Aktueller Kanal</translation>
-    </message>
-    <message>
-        <source>Frequency correction</source>
-        <translation type="vanished">Frequenzkorrektur</translation>
-    </message>
-    <message>
-        <source>SNR</source>
-        <translation type="vanished">SNR</translation>
+        <location filename="../QML/settingpages/ExpertSettings.qml" line="67"/>
+        <source>GetMiddle</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Frame errors</source>
-        <translation type="vanished">Framefehler</translation>
+        <location filename="../QML/settingpages/ExpertSettings.qml" line="68"/>
+        <source>CorrelatePRS</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>RS errors</source>
-        <translation type="vanished">RS Fehler</translation>
+        <location filename="../QML/settingpages/ExpertSettings.qml" line="69"/>
+        <source>PatternOfZeros</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>AAC errors</source>
-        <translation type="vanished">AAC Framefehler</translation>
+        <location filename="../QML/settingpages/ExpertSettings.qml" line="81"/>
+        <source>Coarse corrector algorithm</source>
+        <translation type="unfinished">Algorithmus für Grobe Korrektur</translation>
     </message>
     <message>
-        <source>Frame synchronization</source>
-        <translation type="vanished">Synchronisation</translation>
+        <location filename="../QML/settingpages/ExpertSettings.qml" line="89"/>
+        <source>Enable TII decoding to console log (increases CPU usage)</source>
+        <translation type="unfinished">TII-Dekoder-Log auf der Konsole aktivieren (erhöht die CPU-Last)</translation>
     </message>
     <message>
-        <source>FIC CRC</source>
-        <translation type="vanished">FIC CRC</translation>
+        <location filename="../QML/settingpages/ExpertSettings.qml" line="105"/>
+        <source>Strongest Peak</source>
+        <translation type="unfinished">Größter Spitzenwert</translation>
     </message>
     <message>
-        <source>OK</source>
-        <translation type="vanished">OK</translation>
+        <location filename="../QML/settingpages/ExpertSettings.qml" line="106"/>
+        <source>Earliest Peak With Binning</source>
+        <translation type="unfinished">Frühester Spitzenwert mit Binning</translation>
     </message>
     <message>
-        <source>Not synced</source>
-        <translation type="vanished">Nicht synchron</translation>
+        <location filename="../QML/settingpages/ExpertSettings.qml" line="107"/>
+        <source>Threshold Before Peak</source>
+        <translation type="unfinished">Schwelle vor dem Spitzenwert</translation>
     </message>
     <message>
-        <source>Error</source>
-        <translation type="vanished">Fehler</translation>
+        <location filename="../QML/settingpages/ExpertSettings.qml" line="119"/>
+        <source>FFT Window placement algorithm</source>
+        <translation type="unfinished">Algorithmus für FFT Fensterposition</translation>
     </message>
 </context>
 <context>
     <name>GlobalSettings</name>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
         <source>Global settings</source>
         <translation type="unfinished">Allgemeine Einstellungen</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
         <source>Full screen mode</source>
         <translation>Vollbildmodus</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
         <source>Language</source>
         <translation>Sprache</translation>
     </message>
     <message>
-        <source>Qt Quick Style. Restart to apply.</source>
-        <translation type="obsolete">Stil von Qt Quick. Neustarten zum Übernehmen.</translation>
-    </message>
-    <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
         <source>Global receiver settings</source>
         <translation>Allgemeine Geräteeinstellungen</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
         <source>Automatic RF gain</source>
         <translation>Automatische HF-Verstärkung</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
         <source>Manual gain</source>
         <translation>Manuelle Verstärkung</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
         <source>Value: </source>
         <translation type="unfinished">Wert: </translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
         <source>Auto detect</source>
         <translation type="unfinished">Automatische Erkennung</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="211"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
         <source>Style settings</source>
         <translation type="unfinished">Stileinstellungen</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="223"/>
-        <source>Style changed. Please restart welle.io</source>
-        <translation type="unfinished">Stil geändert. Bitte welle.io neu starten</translation>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+        <source>Style changed. Please restart welle.io.</source>
+        <translation type="unfinished">Stil geändert. Bitte welle.io neu starten.</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="228"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
         <source>Style. Restart to apply.</source>
         <translation type="unfinished">Stil. Neustarten zum Übernehmen.</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="241"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
         <source>Light</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
         <source>Dark</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="243"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
         <source>System</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
         <source>Theme</source>
         <translation type="unfinished">Thema</translation>
     </message>
     <message>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
         <source>None</source>
-        <translation type="obsolete">Kein</translation>
+        <translation type="unfinished">Kein</translation>
     </message>
     <message>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
         <source>Airspy</source>
-        <translation type="obsolete">Airspy</translation>
+        <translation type="unfinished">Airspy</translation>
     </message>
     <message>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
         <source>rtl-sdr</source>
-        <translation type="obsolete">rtl-sdr</translation>
+        <translation type="unfinished">rtl-sdr</translation>
     </message>
     <message>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
         <source>SoapySDR</source>
-        <translation type="obsolete">SoapySDR</translation>
+        <translation type="unfinished">SoapySDR</translation>
     </message>
     <message>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
         <source>rtl-tcp</source>
-        <translation type="obsolete">rtl-tcp</translation>
+        <translation type="unfinished">rtl-tcp</translation>
     </message>
     <message>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
         <source>RAW file</source>
-        <translation type="obsolete">RAW Datei</translation>
+        <translation type="unfinished">RAW Datei</translation>
     </message>
 </context>
 <context>
@@ -1514,119 +1140,229 @@
     </message>
     <message>
         <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
-        <source>Amplitude</source>
-        <translation type="unfinished">Amplitude</translation>
-    </message>
-    <message>
-        <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
         <source>Samples</source>
         <translation type="unfinished">Abtastwerte</translation>
     </message>
 </context>
+<context>
+    <name>InfoPage</name>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="21"/>
+        <source>Versions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="26"/>
+        <source>Authors</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="31"/>
+        <source>Thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="36"/>
+        <source>Licenses</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>MainView</name>
     <message>
-        <location filename="../QML/MainView.qml" line="172"/>
+        <location filename="../QML/MainView.qml" line="138"/>
+        <source>Stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="139"/>
+        <source>Display or hide stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Stop</source>
+        <translation type="unfinished">Stopp</translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop scan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Start playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="284"/>
+        <source>Volume (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="289"/>
+        <source>Volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="290"/>
+        <source>Toggle volume slider</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="421"/>
+        <source>Volume set to %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="462"/>
+        <source>Main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="463"/>
+        <source>Show the main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="474"/>
         <source>Settings</source>
         <translation>Einstellungen</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="180"/>
+        <location filename="../QML/MainView.qml" line="482"/>
         <source>Expert Settings</source>
         <translation>Experteneinstellungen</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="188"/>
+        <location filename="../QML/MainView.qml" line="490"/>
         <source>About</source>
         <translation>Über</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="196"/>
+        <location filename="../QML/MainView.qml" line="498"/>
         <source>Exit</source>
         <translation>Beenden</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="234"/>
+        <location filename="../QML/MainView.qml" line="534"/>
         <source>All stations</source>
         <translation type="unfinished">Alle Sender</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="234"/>
+        <location filename="../QML/MainView.qml" line="535"/>
         <source>Favorites</source>
         <translation>Favoriten</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="263"/>
+        <location filename="../QML/MainView.qml" line="566"/>
+        <source>Stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="567"/>
+        <source>Show stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="575"/>
         <source>Start station scan</source>
         <translation>Suchlauf starten</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="275"/>
+        <location filename="../QML/MainView.qml" line="587"/>
         <source>Stop station scan</source>
         <translation>Suchlauf stoppen</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="287"/>
+        <location filename="../QML/MainView.qml" line="599"/>
         <source>Clear station list</source>
         <translation type="unfinished">Lösche Senderliste</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="295"/>
+        <location filename="../QML/MainView.qml" line="607"/>
         <source>Station settings</source>
         <translation type="unfinished">Sendereinstellungen</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="308"/>
+        <location filename="../QML/MainView.qml" line="620"/>
         <source>No stations in list</source>
         <translation type="unfinished">Kein Sender in der Liste</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="345"/>
+        <location filename="../QML/MainView.qml" line="634"/>
+        <source>File</source>
+        <translation type="unfinished">Datei</translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="764"/>
         <source>Manual channel</source>
         <translation type="unfinished">Manueller Kanal</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="400"/>
+        <location filename="../QML/MainView.qml" line="816"/>
+        <source>Add</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="817"/>
+        <source>Add a view</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="825"/>
         <source>Service Overview</source>
         <translation type="unfinished">Senderübersicht</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="406"/>
+        <location filename="../QML/MainView.qml" line="831"/>
         <source>Service Details</source>
         <translation type="unfinished">Senderdetails</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="412"/>
+        <location filename="../QML/MainView.qml" line="837"/>
         <source>MOT Slide Show</source>
         <translation type="unfinished">MOT Slideshow</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="418"/>
+        <location filename="../QML/MainView.qml" line="843"/>
         <source>Spectrum</source>
         <translation>Spektrum</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="424"/>
+        <location filename="../QML/MainView.qml" line="849"/>
         <source>Impulse Response</source>
         <translation type="unfinished">Impulsantwort</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="430"/>
+        <location filename="../QML/MainView.qml" line="855"/>
         <source>Constellation Diagram</source>
         <translation>Konstellationsdiagramm</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="436"/>
+        <location filename="../QML/MainView.qml" line="861"/>
         <source>Null Symbol</source>
         <translation>Nullsymbol</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="442"/>
+        <location filename="../QML/MainView.qml" line="867"/>
         <source>Console Output</source>
         <translation>Konsolenausgabe</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="448"/>
+        <location filename="../QML/MainView.qml" line="873"/>
         <source>RAW Recorder</source>
         <translation type="unfinished">RAW-Aufzeichnung</translation>
     </message>
@@ -1634,20 +1370,15 @@
 <context>
     <name>MotView</name>
     <message>
-        <location filename="../QML/MotView.qml" line="10"/>
+        <location filename="../QML/MotView.qml" line="11"/>
         <source>MOT Slide Show</source>
         <translation type="unfinished">MOT Slideshow</translation>
     </message>
     <message>
-        <location filename="../QML/MotView.qml" line="27"/>
+        <location filename="../QML/MotView.qml" line="29"/>
         <source>Save all images</source>
         <translation type="unfinished">Alle Bilder speichern</translation>
     </message>
-    <message>
-        <location filename="../QML/MotView.qml" line="47"/>
-        <source>Latest</source>
-        <translation type="unfinished">Letztes</translation>
-    </message>
 </context>
 <context>
     <name>NullSymbolGraph</name>
@@ -1656,54 +1387,6 @@
         <source>Null Symbol</source>
         <translation type="unfinished">Nullsymbol</translation>
     </message>
-    <message>
-        <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
-        <source>Amplitude</source>
-        <translation>Amplitude</translation>
-    </message>
-    <message>
-        <source>Frequency</source>
-        <translation type="obsolete">Frequenz</translation>
-    </message>
-</context>
-<context>
-    <name>QObject</name>
-    <message>
-        <source>No valid device found, using Null device instead.</source>
-        <translation type="vanished">Kein Radioempfänger gefunden.</translation>
-    </message>
-    <message>
-        <source>Error while opening device</source>
-        <translation type="vanished">Fehler beim Zugriff auf Empfänger</translation>
-    </message>
-    <message>
-        <source>Unknown RAW file format</source>
-        <translation type="vanished">Unbekanntes RAW-Dateiformat</translation>
-    </message>
-    <message>
-        <source>Cannot open file</source>
-        <translation type="vanished">Fehler beim Öffnen der Datei</translation>
-    </message>
-    <message>
-        <source>End of file, restarting</source>
-        <translation type="vanished">RAW-Datei zu Ende, beginne von vorn</translation>
-    </message>
-    <message>
-        <source>AGC overload. Maybe you are using a to high gain.</source>
-        <translation type="obsolete">HF-Eingangsverstärkung ist zu groß (AGC ist übersteuert).</translation>
-    </message>
-    <message>
-        <source>RTL-SDR is unplugged.</source>
-        <translation type="vanished">RTL-SDR wurde entfernt.</translation>
-    </message>
-    <message>
-        <source>RTL-TCP connection closed.</source>
-        <translation type="vanished">RTL-TCP-Versbindung geschlossen.</translation>
-    </message>
-    <message>
-        <source>Connection failed to server </source>
-        <translation type="vanished">Verbindungsfehler zu Server </translation>
-    </message>
 </context>
 <context>
     <name>RTLSDRSettings</name>
@@ -1714,7 +1397,7 @@
     </message>
     <message>
         <location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
-        <source>Enable bias tee (not from all dongles supported)</source>
+        <source>Enable bias tee (not supported by all dongles)</source>
         <translation type="unfinished">Fernspeisung aktivieren (nicht von allen Geräten unterstützt)</translation>
     </message>
 </context>
@@ -1750,10 +1433,6 @@
         <source>Host name</source>
         <translation type="unfinished">Hostname</translation>
     </message>
-    <message>
-        <source>Apply</source>
-        <translation type="obsolete">Übernehmen</translation>
-    </message>
 </context>
 <context>
     <name>RadioView</name>
@@ -1771,24 +1450,20 @@
         <translation type="unfinished">Einstellungen für Rohdaten</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
         <source>Open RAW file</source>
         <translation>Öffne Rohdatendatei</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
         <source>Currently shown under Android</source>
         <translation type="unfinished">Derzeit unter Android angezeigt</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
         <source>Selected file:</source>
         <translation>Ausgewählte Datei:</translation>
     </message>
-    <message>
-        <source>Apply</source>
-        <translation type="vanished">Übernehmen</translation>
-    </message>
 </context>
 <context>
     <name>RawRecorder</name>
@@ -1836,115 +1511,71 @@
         <translation type="unfinished">Aktueller Kanal</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
         <source>Frame sync</source>
         <translation type="unfinished">Framesynchron</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
         <source>FIC CRC</source>
         <translation type="unfinished">FIC CRC</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
         <source>Frame errors</source>
         <translation type="unfinished">Framefehler</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
         <source>OK</source>
         <translation type="unfinished">OK</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
         <source>Not synced</source>
         <translation type="unfinished">Nicht synchron</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
         <source>Error</source>
         <translation type="unfinished">Fehler</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
         <source>Frequency correction</source>
         <translation type="unfinished">Frequenzkorrektur</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
         <source>SNR</source>
         <translation type="unfinished">SNR</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
         <source>RS errors</source>
         <translation type="unfinished">RS Fehler</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
-        <source>AAC errors</source>
-        <translation type="unfinished">AAC Fehler</translation>
-    </message>
-    <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
-        <source>DAB date and time</source>
-        <translation type="unfinished">DAB Datum/Uhrzeit</translation>
-    </message>
-</context>
-<context>
-    <name>SettingsPage</name>
-    <message>
-        <source>Channel scan</source>
-        <translation type="vanished">Sendersuchlauf</translation>
-    </message>
-    <message>
-        <source>Start</source>
-        <translation type="vanished">Start</translation>
-    </message>
-    <message>
-        <source>Stop</source>
-        <translation type="vanished">Stopp</translation>
-    </message>
-    <message>
-        <source>Found channels</source>
-        <translation type="vanished">Gefundene Sender</translation>
-    </message>
-    <message>
-        <source>Found stations</source>
-        <translation type="vanished">Gefundene Programme</translation>
-    </message>
-    <message>
-        <source>Automatic RF gain</source>
-        <translation type="vanished">Auto HF-Verstärkung</translation>
-    </message>
-    <message>
-        <source>Manual gain</source>
-        <translation type="vanished">Manuelle Verstärkung</translation>
-    </message>
-    <message>
-        <source>Value: </source>
-        <translation type="vanished">Aktuell: </translation>
-    </message>
-    <message>
-        <source>Full screen mode</source>
-        <translation type="vanished">Vollbildmodus</translation>
-    </message>
-    <message>
-        <source>Expert mode</source>
-        <translation type="vanished">Expertenmodus</translation>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Corrected Error</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Select channel manually</source>
-        <translation type="vanished">Manuelle Kanalwahl</translation>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Uncorrected Error</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Clear station list</source>
-        <translation type="vanished">Lösche Senderliste</translation>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
+        <source>AAC errors</source>
+        <translation type="unfinished">AAC Fehler</translation>
     </message>
     <message>
-        <source>Exit welle.io</source>
-        <translation type="vanished">welle.io beenden</translation>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
+        <source>DAB date and time</source>
+        <translation type="unfinished">DAB Datum/Uhrzeit</translation>
     </message>
 </context>
 <context>
@@ -1997,29 +1628,27 @@
         <source>Spectrum</source>
         <translation>Spektrum</translation>
     </message>
-    <message>
-        <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
-        <source>Amplitude</source>
-        <translation>Amplitude</translation>
-    </message>
-    <message>
-        <source>Frequency</source>
-        <translation type="obsolete">Frequenz</translation>
-    </message>
 </context>
 <context>
-    <name>SpectrumView</name>
+    <name>StationDelegate</name>
     <message>
-        <source>Spectrum</source>
-        <translation type="vanished">Spektrum</translation>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Remove station from favorites</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Amplitude</source>
-        <translation type="vanished">Amplitude</translation>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Add station to favorites</source>
+        <translation type="unfinished"></translation>
     </message>
+</context>
+<context>
+    <name>StationListModel</name>
     <message>
-        <source>Frequency</source>
-        <translation type="vanished">Frequenz</translation>
+        <location filename="../QML/components/StationListModel.qml" line="96"/>
+        <source>Last played station not found.
+Select a station to start playback.</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -2036,30 +1665,39 @@
     </message>
 </context>
 <context>
-    <name>TouchSwitch</name>
+    <name>ViewBaseFrame</name>
     <message>
-        <source>ON</source>
-        <translation type="vanished">AN</translation>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+        <source>%1 title bar</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>OFF</source>
-        <translation type="vanished">AUS</translation>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+        <source>%1 title bar to drag the element</source>
+        <translation type="unfinished"></translation>
     </message>
-</context>
-<context>
-    <name>ViewBaseFrame</name>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+        <source>%1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+        <source>Show %1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Minimize</source>
         <translation type="unfinished">Minimieren</translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Maximize</source>
         <translation type="unfinished">Maximieren</translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
         <source>Remove</source>
         <translation>Entfernen</translation>
     </message>
@@ -2094,111 +1732,34 @@
         <source>experimental</source>
         <translation>experimentell</translation>
     </message>
-    <message>
-        <location filename="../QML/components/WSpectrum.qml" line="101"/>
-        <source>Sensitivity</source>
-        <translation>Empfindlichkeit</translation>
-    </message>
 </context>
 <context>
     <name>main</name>
     <message>
-        <source>Set the GUI language (e.g. de-DE)</source>
-        <translation type="vanished">GUI Sprache festlegen</translation>
-    </message>
-    <message>
-        <location filename="../main.cpp" line="100"/>
+        <location filename="../main.cpp" line="111"/>
         <source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
         <translation type="unfinished">Speichert DAB Frames (*.mp2) oder DAB+ Superframes mit RS Kodierung (*.dab). Diese Datei kann zur Analyse der X-PAD-Daten in XPADxpert verwendet werden</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="101"/>
-        <location filename="../main.cpp" line="106"/>
+        <location filename="../main.cpp" line="112"/>
+        <location filename="../main.cpp" line="117"/>
         <source>File name</source>
         <translation>Dateiname</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="105"/>
+        <location filename="../main.cpp" line="116"/>
         <source>Redirects all log output texts to a file.</source>
         <translation type="unfinished">Leitet alle Log-Meldungen in eine Datei um.</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="110"/>
+        <location filename="../main.cpp" line="121"/>
         <source>Qt Quick Controls Style for the 1st launch</source>
         <translation type="unfinished">Qt Quick Controls Vorlage für den ersten Start</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="111"/>
-        <source>style_name</source>
+        <location filename="../main.cpp" line="122"/>
+        <source>Style name</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <source>Sets the GUI language according to the ISO country codes (e.g. de_DE)</source>
-        <translation type="vanished">GUI-Sprache gemäß ISO Ländercode setzen (zB de_DE)</translation>
-    </message>
-    <message>
-        <source>Language</source>
-        <translation type="vanished">Sprache</translation>
-    </message>
-    <message>
-        <source>Input device</source>
-        <translation type="vanished">Radioempfänger</translation>
-    </message>
-    <message>
-        <source>Input device. Possible is: auto (default), airspy, rtl_tcp, rtl_sdr, rawfile, soapysdr</source>
-        <translation type="vanished">Radioempfänger. Möglich ist auto (Standard), airspy, rtl_tcp, rtl_sdr, rawfile, soapysdr</translation>
-    </message>
-    <message>
-        <source>Name</source>
-        <translation type="vanished">Name</translation>
-    </message>
-    <message>
-        <source>DAB mode. Possible is: 1, 2 or 4, default: 1</source>
-        <translation type="vanished">DAB Mode. Möglich ist 1, 2 oder 4, Standard: 1</translation>
-    </message>
-    <message>
-        <source>Mode</source>
-        <translation type="vanished">Modus</translation>
-    </message>
-    <message>
-        <source>rtl_tcp server IP address. Only valid for input rtl_tcp.</source>
-        <translation type="vanished">rtl_tcp server IP Adresse. Nur gültig für Empfänger rtl_tcp.</translation>
-    </message>
-    <message>
-        <source>IP address</source>
-        <translation type="vanished">IP-Adresse</translation>
-    </message>
-    <message>
-        <source>rtl_tcp server IP port. Only valid for input rtl_tcp.</source>
-        <translation type="vanished">IP Port. Nur gültig für Empfänger rtl_tcp.</translation>
-    </message>
-    <message>
-        <source>Port</source>
-        <translation type="vanished">Port</translation>
-    </message>
-    <message>
-        <source>I/Q RAW file. Only valid for input rawfile.</source>
-        <translation type="vanished">I/Q RAW Datei als Radioempfänger. Nur gültig für Empfänger rawfile.</translation>
-    </message>
-    <message>
-        <source>I/Q RAW file</source>
-        <translation type="vanished">I/Q RAW Rohdatei</translation>
-    </message>
-    <message>
-        <source>I/Q RAW file format. Possible is: u8 (standard), s8, s16le, s16be. Only valid for input rawfile.</source>
-        <translation type="vanished">I/Q RAW Rohdateiformat. Möglich ist u8 (Standard), s8, s16le, s16be. Nur gültig für Radioempfänger rawfile.</translation>
-    </message>
-    <message>
-        <source>I/Q RAW file format</source>
-        <translation type="vanished">I/Q RAW Rohdatenformat</translation>
-    </message>
-    <message>
-        <source>Expert mode is enabled</source>
-        <translation type="vanished">Expertenmodus eingeschaltet</translation>
-    </message>
-    <message>
-        <source>Expert mode is disabled</source>
-        <translation type="vanished">Expertenmodus ausgeschaltet</translation>
-    </message>
 </context>
 </TS>
diff --git a/src/welle-gui/i18n/fr_FR.qm b/src/welle-gui/i18n/fr_FR.qm
index 09bfb21..c16ef1b 100755
Binary files a/src/welle-gui/i18n/fr_FR.qm and b/src/welle-gui/i18n/fr_FR.qm differ
diff --git a/src/welle-gui/i18n/fr_FR.ts b/src/welle-gui/i18n/fr_FR.ts
index e1ea01b..2104f2e 100644
--- a/src/welle-gui/i18n/fr_FR.ts
+++ b/src/welle-gui/i18n/fr_FR.ts
@@ -36,7 +36,7 @@
     </message>
     <message>
         <location line="+1"/>
-        <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+        <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
         <translation>Le pilote RTL-SDR Android n&apos;est pas installé. Voulez-vous l&apos;installer ? Redémarrez welle.io après l&apos;installation.</translation>
     </message>
 </context>
@@ -44,67 +44,61 @@
     <name>CGUIHelper</name>
     <message>
         <location filename="../gui_helper.cpp" line="+66"/>
-        <location line="+614"/>
+        <location line="+633"/>
         <source>Mi&amp;nimize</source>
         <translation>Mi&amp;nimiser</translation>
     </message>
     <message>
-        <location line="-611"/>
-        <location line="+612"/>
+        <location line="-630"/>
+        <location line="+631"/>
         <source>Ma&amp;ximize</source>
         <translation>Ma&amp;ximiser</translation>
     </message>
     <message>
-        <location line="-609"/>
-        <location line="+610"/>
+        <location line="-628"/>
+        <location line="+629"/>
         <source>&amp;Restore</source>
         <translation>&amp;Restaurer</translation>
     </message>
     <message>
-        <location line="-607"/>
-        <location line="+608"/>
+        <location line="-626"/>
+        <location line="+627"/>
         <source>&amp;Quit</source>
         <translation>&amp;Quitter</translation>
     </message>
     <message>
-        <location line="-504"/>
+        <location line="-522"/>
         <source>welle.io version</source>
         <translation>Version de welle.io</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location line="+4"/>
         <source>Built on</source>
         <translation>Compilé le</translation>
     </message>
     <message>
-        <source>version</source>
-        <translation type="vanished">version</translation>
+        <location line="+118"/>
+        <source>The program will keep running in the system tray. To terminate the program, choose &quot;%1&quot; in the context menu of the system tray entry.</source>
+        <translation>Le programme continue de tourner dans la boite à miniatures. Pour le terminer, choisir &quot;%1&quot; dans le menu contextuel de la boîte à miniatures.</translation>
     </message>
     <message>
-        <location line="-1"/>
-        <source>Git revision</source>
-        <translation>Révision Git</translation>
+        <location line="+5"/>
+        <source>Quit</source>
+        <extracomment>&quot;Quit&quot; translation should be the same as the one of system tray</extracomment>
+        <translation>Quitter</translation>
     </message>
     <message>
-        <source>Build on</source>
-        <translation type="vanished">Compilé le</translation>
+        <location line="-126"/>
+        <source>Git revision</source>
+        <translation>Révision Git</translation>
     </message>
     <message>
-        <location line="+2"/>
+        <location line="+4"/>
         <source>QT version</source>
         <translation>Version QT</translation>
     </message>
     <message>
-        <source>The program will keep running in the system tray. To terminate the program, choose &quot;Quit&quot; in the context menu of the system tray entry.</source>
-        <translation type="obsolete">Le programme continue de tourner dans la boite à miniatures. Pour le terminer, choisir &quot;Quitter&quot; dans le menu contextuel de la boîte à miniatures.</translation>
-    </message>
-    <message>
-        <location line="+116"/>
-        <source>The program will keep running in the system tray. To terminate the program, choose &lt;b&gt;Quit&lt;/b&gt; in the context menu of the system tray entry.</source>
-        <translation>Le programme continue de tourner dans la boite à miniatures. Pour le terminer, choisir &quot;Quitter&quot; dans le menu contextuel de la boîte à miniatures.</translation>
-    </message>
-    <message>
-        <location line="+506"/>
+        <location line="+638"/>
         <source> (unavailable, fallback to Default)</source>
         <translation> (non disponible, utilise &quot;Default&quot; à la place)</translation>
     </message>
@@ -122,46 +116,56 @@
 <context>
     <name>CRadioController</name>
     <message>
-        <location filename="../radio_controller.cpp" line="+619"/>
+        <location filename="../radio_controller.cpp" line="+646"/>
         <source>Unknown</source>
         <translation>Inconnu</translation>
     </message>
     <message>
-        <location line="-202"/>
-        <location line="+221"/>
+        <location line="-203"/>
+        <location line="+222"/>
         <source>No Station</source>
         <translation>Pas de station</translation>
     </message>
     <message>
-        <location line="-486"/>
+        <location line="-513"/>
         <source>Error while opening file </source>
         <translation>Erreur à l&apos;ouverture du fichier </translation>
     </message>
     <message>
-        <location line="+228"/>
+        <location line="+103"/>
+        <source>Playback failed</source>
+        <translation>Lecture en échec</translation>
+    </message>
+    <message>
+        <location line="+21"/>
+        <source>Stopped</source>
+        <translation>Arrêté</translation>
+    </message>
+    <message>
+        <location line="+129"/>
         <source>RAW File</source>
         <translation>Fichier RAW</translation>
     </message>
     <message>
-        <location line="+13"/>
-        <location line="+466"/>
+        <location line="+14"/>
+        <location line="+485"/>
         <source>Scanning</source>
         <translation>Recherche</translation>
     </message>
     <message>
-        <location line="-462"/>
-        <location line="+487"/>
+        <location line="-481"/>
+        <location line="+506"/>
         <source>Found channels</source>
         <translatorcomment>Contexte: nombre stations trouvées durant la recherche de stations en scannant tous les canaux. Donc c&apos;est bien &quot;station&quot; qu&apos;il faut mettre, et pas &quot;canal&quot;</translatorcomment>
         <translation>Stations trouvées</translation>
     </message>
     <message>
-        <location line="-271"/>
+        <location line="-289"/>
         <source>Playing last station</source>
         <translation>Lecture de la dernière station</translation>
     </message>
     <message>
-        <location line="+58"/>
+        <location line="+75"/>
         <source>Radio device is not ready or does not exist.</source>
         <translation>Le récepteur radio n&apos;est pas prêt ou n&apos;existe pas.</translation>
     </message>
@@ -191,7 +195,7 @@
     <message>
         <location line="+113"/>
         <source>End of file, restarting</source>
-        <translatorcomment>doute sur la traduction de &quot;lecture en boucle&quot;</translatorcomment>
+        <translatorcomment>doute sur la traduction précédente de &quot;lecture en boucle&quot;</translatorcomment>
         <translation type="unfinished">Fin du fichier, recommence depuis le début</translation>
     </message>
     <message>
@@ -205,10 +209,15 @@
         <translation>Format de fichier RAW inconnu</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="+294"/>
-        <location filename="../../input/rtl_tcp.cpp" line="+462"/>
+        <location filename="../../input/rtl_sdr.cpp" line="+142"/>
+        <source>Error opening RTL-SDR. See log for details.</source>
+        <translation type="unfinished">Erreur à l&apos;ouverture de RTL-SDR. Voir le journal pour les détails.</translation>
+    </message>
+    <message>
+        <location line="+164"/>
+        <location filename="../../input/rtl_tcp.cpp" line="+549"/>
         <source>ADC overload. Maybe you are using a too high gain.</source>
-        <translatorcomment>ADC ou AGC ? Saturation ou Surcharge ? Saturation semble préférable.</translatorcomment>
+        <translatorcomment>Saturation ou Surcharge ? Saturation semble préférable.</translatorcomment>
         <translation type="unfinished">Saturation ADC. Peut-être le gain est trop élevé.</translation>
     </message>
     <message>
@@ -217,7 +226,7 @@
         <translation>RTL-SDR est débranché.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="-190"/>
+        <location filename="../../input/rtl_tcp.cpp" line="-240"/>
         <source>RTL-TCP connection closed.</source>
         <translation>Connexion RTL-TCP fermée.</translation>
     </message>
@@ -227,7 +236,7 @@
         <translation>Echec de connexion au serveur </translation>
     </message>
     <message>
-        <location filename="../../input/soapy_sdr.cpp" line="+91"/>
+        <location filename="../../input/soapy_sdr.cpp" line="+109"/>
         <source>Could not load SoapySDR with provided device arguments.</source>
         <translation>Chargement de SoapySDR impossible avec les paramètres de périphérique renseignés.</translation>
     </message>
@@ -1053,7 +1062,7 @@
 <context>
     <name>GlobalSettings</name>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="+68"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="+71"/>
         <source>Global settings</source>
         <translation>Paramètres globaux</translation>
     </message>
@@ -1063,12 +1072,17 @@
         <translation>Mode plein écran</translation>
     </message>
     <message>
-        <location line="+31"/>
+        <location line="+33"/>
         <source>Language</source>
         <translation>Langue</translation>
     </message>
     <message>
-        <location line="+148"/>
+        <location line="+134"/>
+        <source>Style changed. Please restart welle.io.</source>
+        <translation>Style changé. Veuillez redémarrer welle.io.</translation>
+    </message>
+    <message>
+        <location line="+18"/>
         <source>Light</source>
         <translation>Clair</translation>
     </message>
@@ -1088,7 +1102,7 @@
         <translation>Thème</translation>
     </message>
     <message>
-        <location line="-147"/>
+        <location line="-151"/>
         <source>Global receiver settings</source>
         <translation>Paramètres globaux du récepteur</translation>
     </message>
@@ -1113,7 +1127,7 @@
         <translation>Détection automatique</translation>
     </message>
     <message>
-        <location line="+14"/>
+        <location line="+18"/>
         <source>Airspy</source>
         <translation></translation>
     </message>
@@ -1128,15 +1142,22 @@
         <translation>Paramètres de style</translation>
     </message>
     <message>
-        <location line="+12"/>
-        <source>Style changed. Please restart welle.io</source>
-        <translation>Style changé. Veuillez redémarrer welle.io</translation>
-    </message>
-    <message>
-        <location line="+5"/>
+        <location line="+17"/>
         <source>Style. Restart to apply.</source>
         <translation>Style. Redémarrez pour appliquer.</translation>
     </message>
+    <message>
+        <source>Font settings</source>
+        <translation type="obsolete">Paramètres de police</translation>
+    </message>
+    <message>
+        <source>General font: use system font</source>
+        <translation type="obsolete">Police générale : utiliser la police du système</translation>
+    </message>
+    <message>
+        <source>Fixed space font: use system font</source>
+        <translation type="obsolete">Police à chasse fixe : utiliser la police du système</translation>
+    </message>
     <message>
         <location line="-60"/>
         <source>None</source>
@@ -1169,11 +1190,6 @@
     </message>
     <message>
         <location line="+11"/>
-        <source>Amplitude</source>
-        <translation>Amplitude</translation>
-    </message>
-    <message>
-        <location line="+1"/>
         <source>Samples</source>
         <translation>Echantillon</translation>
     </message>
@@ -1204,7 +1220,74 @@
 <context>
     <name>MainView</name>
     <message>
-        <location filename="../QML/MainView.qml" line="+172"/>
+        <location filename="../QML/MainView.qml" line="+138"/>
+        <source>Stations list</source>
+        <translation>Liste des stations</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Display or hide stations list</source>
+        <translation>Afficher ou cacher la liste des stations</translation>
+    </message>
+    <message>
+        <location line="+42"/>
+        <location line="+5"/>
+        <source>Stop</source>
+        <translation>Stop</translation>
+    </message>
+    <message>
+        <location line="-5"/>
+        <location line="+5"/>
+        <source>Play</source>
+        <translation>Lecture</translation>
+    </message>
+    <message>
+        <location line="-4"/>
+        <source>Stop playback</source>
+        <translation>Arrêter la lecture</translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Stop scan</source>
+        <translation>Arrêter la recherche</translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Start playback</source>
+        <translation>Démarrer la lecture</translation>
+    </message>
+    <message>
+        <location line="+102"/>
+        <source>Volume (%1)</source>
+        <translation>Volume (%1)</translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Volume</source>
+        <translation>Volume</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Toggle volume slider</source>
+        <translation>Afficher/cacher le curseur du volume</translation>
+    </message>
+    <message>
+        <location line="+131"/>
+        <source>Volume set to %1</source>
+        <translation>Volume fixé à %1</translation>
+    </message>
+    <message>
+        <location line="+41"/>
+        <source>Main menu</source>
+        <translation>Menu principal</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Show the main menu</source>
+        <translation>Afficher le menu principal</translation>
+    </message>
+    <message>
+        <location line="+11"/>
         <source>Settings</source>
         <translation>Paramètres</translation>
     </message>
@@ -1234,7 +1317,17 @@
         <translation>Favoris</translation>
     </message>
     <message>
-        <location line="+34"/>
+        <location line="+31"/>
+        <source>Stations menu</source>
+        <translation>Menu des stations</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Show stations menu</source>
+        <translation>Afficher le menu des stations</translation>
+    </message>
+    <message>
+        <location line="+8"/>
         <source>Start station scan</source>
         <translation>Rechercher les stations</translation>
     </message>
@@ -1259,12 +1352,27 @@
         <translation>Pas de stations dans la liste</translation>
     </message>
     <message>
-        <location line="+108"/>
+        <location line="+14"/>
+        <source>File</source>
+        <translation>Fichier</translation>
+    </message>
+    <message>
+        <location line="+130"/>
         <source>Manual channel</source>
         <translation>Canal manuel</translation>
     </message>
     <message>
-        <location line="+55"/>
+        <location line="+52"/>
+        <source>Add</source>
+        <translation>Ajouter</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Add a view</source>
+        <translation>Ajouter une vue</translation>
+    </message>
+    <message>
+        <location line="+8"/>
         <source>Service Overview</source>
         <translation>Aperçu du service</translation>
     </message>
@@ -1313,20 +1421,15 @@
 <context>
     <name>MotView</name>
     <message>
-        <location filename="../QML/MotView.qml" line="+10"/>
+        <location filename="../QML/MotView.qml" line="+11"/>
         <source>MOT Slide Show</source>
         <translation>Diaporama MOT</translation>
     </message>
     <message>
-        <location line="+17"/>
+        <location line="+18"/>
         <source>Save all images</source>
         <translation>Sauvegarder toutes les images</translation>
     </message>
-    <message>
-        <location line="+20"/>
-        <source>Latest</source>
-        <translation>Le plus récent</translation>
-    </message>
 </context>
 <context>
     <name>NullSymbolGraph</name>
@@ -1336,11 +1439,6 @@
         <translatorcomment>Traduction de NULL selon : TERMIUM Plus®. Mais peut etre laisser tel quel car Null Symbol a un sens précis dans le signal DAB+</translatorcomment>
         <translation type="unfinished">Null Symbol</translation>
     </message>
-    <message>
-        <location line="+8"/>
-        <source>Amplitude</source>
-        <translation>Amplitude</translation>
-    </message>
 </context>
 <context>
     <name>RTLSDRSettings</name>
@@ -1351,7 +1449,7 @@
     </message>
     <message>
         <location line="+9"/>
-        <source>Enable bias tee (not from all dongles supported)</source>
+        <source>Enable bias tee (not supported by all dongles)</source>
         <translation>Activer le té de polarisation (non pris en charge par tous les récepteurs)</translation>
     </message>
 </context>
@@ -1393,59 +1491,10 @@
 <context>
     <name>RadioView</name>
     <message>
-        <location filename="../QML/RadioView.qml" line="+13"/>
+        <location filename="../QML/RadioView.qml" line="+12"/>
         <source>Service Overview</source>
         <translation>Aperçu du service</translation>
     </message>
-    <message>
-        <location line="+27"/>
-        <location line="+5"/>
-        <source>Volume</source>
-        <translation>Volume</translation>
-    </message>
-    <message>
-        <location line="+1"/>
-        <source>Toggle volume slider</source>
-        <translation type="unfinished">Afficher/cacher le curseur du volume</translation>
-    </message>
-    <message>
-        <location line="+59"/>
-        <source>Volume set to %1</source>
-        <translation>Volume fixé à %1</translation>
-    </message>
-    <message>
-        <location line="+128"/>
-        <location line="+5"/>
-        <source>Stop</source>
-        <translation>Stop</translation>
-    </message>
-    <message>
-        <location line="-5"/>
-        <location line="+5"/>
-        <source>Play</source>
-        <translation>Lecture</translation>
-    </message>
-    <message>
-        <location line="-4"/>
-        <source>Stop playback</source>
-        <translation>Arrêter la lecture</translation>
-    </message>
-    <message>
-        <location line="+0"/>
-        <source>Start playback</source>
-        <translation>Démarrer la lecture</translation>
-    </message>
-    <message>
-        <location line="+17"/>
-        <source>Playback stopped</source>
-        <translation>Lecture arrêtée</translation>
-    </message>
-    <message>
-        <source>Last played station not found.
-Select a station to start playback.</source>
-        <translation type="obsolete">Dernière station lue non trouvée.
-Sélectionnez une station pour démarrer la lecture.</translation>
-    </message>
 </context>
 <context>
     <name>RawFileSettings</name>
@@ -1519,24 +1568,25 @@ Sélectionnez une station pour démarrer la lecture.</translation>
         <translation>Canal actuel</translation>
     </message>
     <message>
-        <location line="+13"/>
+        <location line="+22"/>
         <source>Frame sync</source>
         <translatorcomment>pluriel ?</translatorcomment>
         <translation>Synchronisation de trame</translation>
     </message>
     <message>
         <location line="+1"/>
-        <location line="+15"/>
+        <location line="+14"/>
+        <location line="+33"/>
         <source>OK</source>
         <translation>OK</translation>
     </message>
     <message>
-        <location line="-15"/>
+        <location line="-47"/>
         <source>Not synced</source>
         <translation>Pas de sync.</translation>
     </message>
     <message>
-        <location line="+14"/>
+        <location line="+13"/>
         <source>FIC CRC</source>
         <translation>FIC CRC</translation>
     </message>
@@ -1546,13 +1596,13 @@ Sélectionnez une station pour démarrer la lecture.</translation>
         <translation>Erreur</translation>
     </message>
     <message>
-        <location line="+15"/>
+        <location line="+14"/>
         <source>Frame errors</source>
         <translatorcomment>pluriel ?</translatorcomment>
         <translation>Erreurs de trame</translation>
     </message>
     <message>
-        <location line="+6"/>
+        <location line="-46"/>
         <source>Frequency correction</source>
         <translation>Correction de fréquence</translation>
     </message>
@@ -1562,17 +1612,27 @@ Sélectionnez une station pour démarrer la lecture.</translation>
         <translation>SNR (rapport signal/bruit)</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location line="+57"/>
         <source>RS errors</source>
         <translation>Erreurs RS</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location line="+4"/>
+        <source>Corrected Error</source>
+        <translation type="unfinished">Erreur corrigée</translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Uncorrected Error</source>
+        <translation type="unfinished">Erreur non corrigée</translation>
+    </message>
+    <message>
+        <location line="+12"/>
         <source>AAC errors</source>
         <translation>Erreurs AAC</translation>
     </message>
     <message>
-        <location line="+5"/>
+        <location line="+6"/>
         <source>DAB date and time</source>
         <translation>Date et heure DAB</translation>
     </message>
@@ -1627,16 +1687,24 @@ Sélectionnez une station pour démarrer la lecture.</translation>
         <source>Spectrum</source>
         <translation>Spectre</translation>
     </message>
+</context>
+<context>
+    <name>StationDelegate</name>
     <message>
-        <location line="+9"/>
-        <source>Amplitude</source>
-        <translation>Amplitude</translation>
+        <location filename="../QML/components/StationDelegate.qml" line="+155"/>
+        <source>Remove station from favorites</source>
+        <translation>Retirer la station des favoris</translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Add station to favorites</source>
+        <translation>Ajouter la station aux favoris</translation>
     </message>
 </context>
 <context>
     <name>StationListModel</name>
     <message>
-        <location filename="../QML/components/StationListModel.qml" line="+91"/>
+        <location filename="../QML/components/StationListModel.qml" line="+96"/>
         <source>Last played station not found.
 Select a station to start playback.</source>
         <translation>Dernière station lue non trouvée.
@@ -1659,7 +1727,27 @@ Sélectionnez une station pour démarrer la lecture.</translation>
 <context>
     <name>ViewBaseFrame</name>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="+122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="+69"/>
+        <source>%1 title bar</source>
+        <translation>Barre de titre %1</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>%1 title bar to drag the element</source>
+        <translation>Barre de titre %1 pour déplacer l&apos;élément</translation>
+    </message>
+    <message>
+        <location line="+48"/>
+        <source>%1 menu</source>
+        <translation>Menu de %1</translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Show %1 menu</source>
+        <translation>Afficher le menu %1</translation>
+    </message>
+    <message>
+        <location line="+11"/>
         <source>Minimize</source>
         <translation>Minimiser</translation>
     </message>
@@ -1705,16 +1793,11 @@ Sélectionnez une station pour démarrer la lecture.</translation>
         <source>experimental</source>
         <translation>expérimental</translation>
     </message>
-    <message>
-        <location line="+62"/>
-        <source>Sensitivity</source>
-        <translation>Sensibilité</translation>
-    </message>
 </context>
 <context>
     <name>main</name>
     <message>
-        <location filename="../main.cpp" line="+100"/>
+        <location filename="../main.cpp" line="+111"/>
         <source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
         <translation>Enregistre les trames DAB (*.mp2) ou les supertrames DAB+ avec codage RS (*.dab). Ce fichier peut être utilisé pour analyser des données X-PAD avec XPADxpert</translation>
     </message>
@@ -1737,8 +1820,8 @@ Sélectionnez une station pour démarrer la lecture.</translation>
     </message>
     <message>
         <location line="+1"/>
-        <source>style_name</source>
-        <translation>nom_du_style</translation>
+        <source>Style name</source>
+        <translation>Nom du style</translation>
     </message>
 </context>
 </TS>
diff --git a/src/welle-gui/i18n/hu_HU.qm b/src/welle-gui/i18n/hu_HU.qm
index 6c5b844..1205ef4 100644
Binary files a/src/welle-gui/i18n/hu_HU.qm and b/src/welle-gui/i18n/hu_HU.qm differ
diff --git a/src/welle-gui/i18n/hu_HU.ts b/src/welle-gui/i18n/hu_HU.ts
index 322c80f..1cbc2a1 100644
--- a/src/welle-gui/i18n/hu_HU.ts
+++ b/src/welle-gui/i18n/hu_HU.ts
@@ -36,73 +36,79 @@
     </message>
     <message>
         <location filename="../android_rtl_sdr.cpp" line="139"/>
-        <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+        <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>CGUIHelper</name>
     <message>
-        <location filename="../gui_helper.cpp" line="65"/>
-        <location filename="../gui_helper.cpp" line="654"/>
+        <location filename="../gui_helper.cpp" line="66"/>
+        <location filename="../gui_helper.cpp" line="699"/>
         <source>Mi&amp;nimize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="68"/>
-        <location filename="../gui_helper.cpp" line="655"/>
+        <location filename="../gui_helper.cpp" line="69"/>
+        <location filename="../gui_helper.cpp" line="700"/>
         <source>Ma&amp;ximize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="71"/>
-        <location filename="../gui_helper.cpp" line="656"/>
+        <location filename="../gui_helper.cpp" line="72"/>
+        <location filename="../gui_helper.cpp" line="701"/>
         <source>&amp;Restore</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="74"/>
-        <location filename="../gui_helper.cpp" line="657"/>
+        <location filename="../gui_helper.cpp" line="75"/>
+        <location filename="../gui_helper.cpp" line="702"/>
         <source>&amp;Quit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="127"/>
-        <source>version</source>
-        <translation type="unfinished">verzió</translation>
+        <location filename="../gui_helper.cpp" line="180"/>
+        <source>welle.io version</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="128"/>
-        <source>Git revision</source>
-        <translation type="unfinished">Git revízió</translation>
+        <location filename="../gui_helper.cpp" line="184"/>
+        <source>Built on</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="129"/>
-        <source>Build on</source>
-        <translation type="unfinished">Készült</translation>
+        <location filename="../gui_helper.cpp" line="302"/>
+        <source>The program will keep running in the system tray. To terminate the program, choose &quot;%1&quot; in the context menu of the system tray entry.</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="130"/>
-        <source>QT version</source>
-        <translation type="unfinished">QT verzió</translation>
+        <location filename="../gui_helper.cpp" line="307"/>
+        <source>Quit</source>
+        <extracomment>&quot;Quit&quot; translation should be the same as the one of system tray</extracomment>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="283"/>
-        <source>The program will keep running in the system tray. To terminate the program, choose &lt;b&gt;Quit&lt;/b&gt; in the context menu of the system tray entry.</source>
-        <translation type="unfinished"></translation>
+        <location filename="../gui_helper.cpp" line="181"/>
+        <source>Git revision</source>
+        <translation type="unfinished">Git revízió</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="778"/>
+        <location filename="../gui_helper.cpp" line="185"/>
+        <source>QT version</source>
+        <translation type="unfinished">QT verzió</translation>
+    </message>
+    <message>
+        <location filename="../gui_helper.cpp" line="823"/>
         <source> (unavailable, fallback to Default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="782"/>
+        <location filename="../gui_helper.cpp" line="827"/>
         <source>Style of system</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="784"/>
+        <location filename="../gui_helper.cpp" line="829"/>
         <source> (Recommended)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -110,13 +116,13 @@
 <context>
     <name>CRadioController</name>
     <message>
-        <location filename="../radio_controller.cpp" line="608"/>
+        <location filename="../radio_controller.cpp" line="646"/>
         <source>Unknown</source>
         <translation type="unfinished">Ismeretlen</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="406"/>
-        <location filename="../radio_controller.cpp" line="627"/>
+        <location filename="../radio_controller.cpp" line="443"/>
+        <location filename="../radio_controller.cpp" line="665"/>
         <source>No Station</source>
         <translation type="unfinished">Nincs állomás</translation>
     </message>
@@ -126,29 +132,39 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="369"/>
+        <location filename="../radio_controller.cpp" line="255"/>
+        <source>Playback failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="276"/>
+        <source>Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="405"/>
         <source>RAW File</source>
         <translation type="unfinished">RAW Fájl</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="382"/>
-        <location filename="../radio_controller.cpp" line="848"/>
+        <location filename="../radio_controller.cpp" line="419"/>
+        <location filename="../radio_controller.cpp" line="904"/>
         <source>Scanning</source>
         <translation type="unfinished">Keresés</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="386"/>
-        <location filename="../radio_controller.cpp" line="873"/>
+        <location filename="../radio_controller.cpp" line="423"/>
+        <location filename="../radio_controller.cpp" line="929"/>
         <source>Found channels</source>
         <translation type="unfinished">Megtalált állomások</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="602"/>
+        <location filename="../radio_controller.cpp" line="640"/>
         <source>Playing last station</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="660"/>
+        <location filename="../radio_controller.cpp" line="715"/>
         <source>Radio device is not ready or does not exist.</source>
         <translation type="unfinished">A rádióvevő nem áll készen vagy nincs.</translation>
     </message>
@@ -190,28 +206,33 @@
         <translation type="unfinished">Ismeretlen RAW fájl formátum</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="294"/>
-        <location filename="../../input/rtl_tcp.cpp" line="462"/>
+        <location filename="../../input/rtl_sdr.cpp" line="142"/>
+        <source>Error opening RTL-SDR. See log for details.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../input/rtl_sdr.cpp" line="306"/>
+        <location filename="../../input/rtl_tcp.cpp" line="549"/>
         <source>ADC overload. Maybe you are using a too high gain.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="390"/>
+        <location filename="../../input/rtl_sdr.cpp" line="402"/>
         <source>RTL-SDR is unplugged.</source>
-        <translation type="unfinished">RTL-SDR nincs csatlakoztatva</translation>
+        <translation type="unfinished">RTL-SDR nincs csatlakoztatva.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="272"/>
+        <location filename="../../input/rtl_tcp.cpp" line="309"/>
         <source>RTL-TCP connection closed.</source>
-        <translation type="unfinished">RTL-TCP kapcsolat zárva</translation>
+        <translation type="unfinished">RTL-TCP kapcsolat zárva.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="413"/>
+        <location filename="../../input/rtl_tcp.cpp" line="450"/>
         <source>Connection failed to server </source>
-        <translation type="unfinished">Szerverkapcsolat hiba</translation>
+        <translation type="unfinished">Szerverkapcsolat hiba </translation>
     </message>
     <message>
-        <location filename="../../input/soapy_sdr.cpp" line="91"/>
+        <location filename="../../input/soapy_sdr.cpp" line="109"/>
         <source>Could not load SoapySDR with provided device arguments.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -232,7 +253,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+        <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
         <source>Display station name in the window title</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1005,107 +1026,107 @@
 <context>
     <name>GlobalSettings</name>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
         <source>Global settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
         <source>Full screen mode</source>
         <translation type="unfinished">Teljesképernyő mód</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
         <source>Language</source>
         <translation type="unfinished">Nyelv</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
         <source>Global receiver settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
         <source>Automatic RF gain</source>
         <translation type="unfinished">Automatikus RF erősítés</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
         <source>Manual gain</source>
         <translation type="unfinished">Kézi RF erősítés</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
         <source>Value: </source>
         <translation type="unfinished">Érték:</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
         <source>Auto detect</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="178"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
         <source>None</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="179"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
         <source>Airspy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="180"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
         <source>rtl-sdr</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="181"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
         <source>SoapySDR</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="182"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
         <source>rtl-tcp</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="183"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
         <source>RAW file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="221"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
         <source>Style settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="233"/>
-        <source>Style changed. Please restart welle.io</source>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+        <source>Style changed. Please restart welle.io.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="238"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
         <source>Style. Restart to apply.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="251"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
         <source>Light</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="252"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
         <source>Dark</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="253"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
         <source>System</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="257"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
         <source>Theme</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1119,119 +1140,229 @@
     </message>
     <message>
         <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
-        <source>Amplitude</source>
-        <translation type="unfinished">Amplitúdó</translation>
+        <source>Samples</source>
+        <translation type="unfinished"></translation>
     </message>
+</context>
+<context>
+    <name>InfoPage</name>
     <message>
-        <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
-        <source>Samples</source>
+        <location filename="../QML/InfoPage.qml" line="21"/>
+        <source>Versions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="26"/>
+        <source>Authors</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="31"/>
+        <source>Thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="36"/>
+        <source>Licenses</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>MainView</name>
     <message>
-        <location filename="../QML/MainView.qml" line="172"/>
+        <location filename="../QML/MainView.qml" line="138"/>
+        <source>Stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="139"/>
+        <source>Display or hide stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Stop</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop scan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Start playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="284"/>
+        <source>Volume (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="289"/>
+        <source>Volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="290"/>
+        <source>Toggle volume slider</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="421"/>
+        <source>Volume set to %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="462"/>
+        <source>Main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="463"/>
+        <source>Show the main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="474"/>
         <source>Settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="180"/>
+        <location filename="../QML/MainView.qml" line="482"/>
         <source>Expert Settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="188"/>
+        <location filename="../QML/MainView.qml" line="490"/>
         <source>About</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="196"/>
+        <location filename="../QML/MainView.qml" line="498"/>
         <source>Exit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="232"/>
+        <location filename="../QML/MainView.qml" line="534"/>
         <source>All stations</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="233"/>
+        <location filename="../QML/MainView.qml" line="535"/>
         <source>Favorites</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="267"/>
+        <location filename="../QML/MainView.qml" line="566"/>
+        <source>Stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="567"/>
+        <source>Show stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="575"/>
         <source>Start station scan</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="279"/>
+        <location filename="../QML/MainView.qml" line="587"/>
         <source>Stop station scan</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="291"/>
+        <location filename="../QML/MainView.qml" line="599"/>
         <source>Clear station list</source>
         <translation type="unfinished">Állomáslista törlése</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="299"/>
+        <location filename="../QML/MainView.qml" line="607"/>
         <source>Station settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="312"/>
+        <location filename="../QML/MainView.qml" line="620"/>
         <source>No stations in list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="349"/>
+        <location filename="../QML/MainView.qml" line="634"/>
+        <source>File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="764"/>
         <source>Manual channel</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="404"/>
+        <location filename="../QML/MainView.qml" line="816"/>
+        <source>Add</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="817"/>
+        <source>Add a view</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="825"/>
         <source>Service Overview</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="410"/>
+        <location filename="../QML/MainView.qml" line="831"/>
         <source>Service Details</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="416"/>
+        <location filename="../QML/MainView.qml" line="837"/>
         <source>MOT Slide Show</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="422"/>
+        <location filename="../QML/MainView.qml" line="843"/>
         <source>Spectrum</source>
         <translation type="unfinished">Spektrum</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="428"/>
+        <location filename="../QML/MainView.qml" line="849"/>
         <source>Impulse Response</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="434"/>
+        <location filename="../QML/MainView.qml" line="855"/>
         <source>Constellation Diagram</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="440"/>
+        <location filename="../QML/MainView.qml" line="861"/>
         <source>Null Symbol</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="446"/>
+        <location filename="../QML/MainView.qml" line="867"/>
         <source>Console Output</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="452"/>
+        <location filename="../QML/MainView.qml" line="873"/>
         <source>RAW Recorder</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1239,20 +1370,15 @@
 <context>
     <name>MotView</name>
     <message>
-        <location filename="../QML/MotView.qml" line="10"/>
+        <location filename="../QML/MotView.qml" line="11"/>
         <source>MOT Slide Show</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MotView.qml" line="27"/>
+        <location filename="../QML/MotView.qml" line="29"/>
         <source>Save all images</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <location filename="../QML/MotView.qml" line="47"/>
-        <source>Latest</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>NullSymbolGraph</name>
@@ -1261,11 +1387,6 @@
         <source>Null Symbol</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
-        <source>Amplitude</source>
-        <translation type="unfinished">Amplitúdó</translation>
-    </message>
 </context>
 <context>
     <name>RTLSDRSettings</name>
@@ -1276,7 +1397,7 @@
     </message>
     <message>
         <location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
-        <source>Enable bias tee (not from all dongles supported)</source>
+        <source>Enable bias tee (not supported by all dongles)</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1329,17 +1450,17 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
         <source>Open RAW file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
         <source>Currently shown under Android</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
         <source>Selected file:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1390,58 +1511,69 @@
         <translation type="unfinished">Aktuális csatorna</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
         <source>Frame sync</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
         <source>OK</source>
         <translation type="unfinished">Rendben</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
         <source>Not synced</source>
         <translation type="unfinished">Nem szinkronizált</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
         <source>FIC CRC</source>
         <translation type="unfinished">FIC CRC</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
         <source>Error</source>
         <translation type="unfinished">Hiba</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
         <source>Frame errors</source>
         <translation type="unfinished">Frame hibák</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
         <source>Frequency correction</source>
         <translation type="unfinished">Frekvencia korrekció</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
         <source>SNR</source>
         <translation type="unfinished">Jel-zaj viszony</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
         <source>RS errors</source>
         <translation type="unfinished">RS hibák</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Corrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Uncorrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
         <source>AAC errors</source>
         <translation type="unfinished">AAC hibák</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
         <source>DAB date and time</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1496,10 +1628,27 @@
         <source>Spectrum</source>
         <translation type="unfinished">Spektrum</translation>
     </message>
+</context>
+<context>
+    <name>StationDelegate</name>
     <message>
-        <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
-        <source>Amplitude</source>
-        <translation type="unfinished">Amplitúdó</translation>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Remove station from favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Add station to favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>StationListModel</name>
+    <message>
+        <location filename="../QML/components/StationListModel.qml" line="96"/>
+        <source>Last played station not found.
+Select a station to start playback.</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -1518,17 +1667,37 @@
 <context>
     <name>ViewBaseFrame</name>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+        <source>%1 title bar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+        <source>%1 title bar to drag the element</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+        <source>%1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+        <source>Show %1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Minimize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Maximize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
         <source>Remove</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1563,38 +1732,33 @@
         <source>experimental</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <location filename="../QML/components/WSpectrum.qml" line="101"/>
-        <source>Sensitivity</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>main</name>
     <message>
-        <location filename="../main.cpp" line="100"/>
+        <location filename="../main.cpp" line="111"/>
         <source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="101"/>
-        <location filename="../main.cpp" line="106"/>
+        <location filename="../main.cpp" line="112"/>
+        <location filename="../main.cpp" line="117"/>
         <source>File name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="105"/>
+        <location filename="../main.cpp" line="116"/>
         <source>Redirects all log output texts to a file.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="110"/>
+        <location filename="../main.cpp" line="121"/>
         <source>Qt Quick Controls Style for the 1st launch</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="111"/>
-        <source>style_name</source>
+        <location filename="../main.cpp" line="122"/>
+        <source>Style name</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/welle-gui/i18n/it_IT.qm b/src/welle-gui/i18n/it_IT.qm
index 7d03956..2acb347 100644
Binary files a/src/welle-gui/i18n/it_IT.qm and b/src/welle-gui/i18n/it_IT.qm differ
diff --git a/src/welle-gui/i18n/it_IT.ts b/src/welle-gui/i18n/it_IT.ts
index 389da97..5620cee 100644
--- a/src/welle-gui/i18n/it_IT.ts
+++ b/src/welle-gui/i18n/it_IT.ts
@@ -36,73 +36,79 @@
     </message>
     <message>
         <location filename="../android_rtl_sdr.cpp" line="139"/>
-        <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+        <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>CGUIHelper</name>
     <message>
-        <location filename="../gui_helper.cpp" line="65"/>
-        <location filename="../gui_helper.cpp" line="654"/>
+        <location filename="../gui_helper.cpp" line="66"/>
+        <location filename="../gui_helper.cpp" line="699"/>
         <source>Mi&amp;nimize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="68"/>
-        <location filename="../gui_helper.cpp" line="655"/>
+        <location filename="../gui_helper.cpp" line="69"/>
+        <location filename="../gui_helper.cpp" line="700"/>
         <source>Ma&amp;ximize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="71"/>
-        <location filename="../gui_helper.cpp" line="656"/>
+        <location filename="../gui_helper.cpp" line="72"/>
+        <location filename="../gui_helper.cpp" line="701"/>
         <source>&amp;Restore</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="74"/>
-        <location filename="../gui_helper.cpp" line="657"/>
+        <location filename="../gui_helper.cpp" line="75"/>
+        <location filename="../gui_helper.cpp" line="702"/>
         <source>&amp;Quit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="127"/>
-        <source>version</source>
-        <translation>versione</translation>
+        <location filename="../gui_helper.cpp" line="180"/>
+        <source>welle.io version</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="128"/>
-        <source>Git revision</source>
-        <translation>Versione di Git</translation>
+        <location filename="../gui_helper.cpp" line="184"/>
+        <source>Built on</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="129"/>
-        <source>Build on</source>
-        <translation>Compilata il</translation>
+        <location filename="../gui_helper.cpp" line="302"/>
+        <source>The program will keep running in the system tray. To terminate the program, choose &quot;%1&quot; in the context menu of the system tray entry.</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="130"/>
-        <source>QT version</source>
-        <translation>Versione di Qt</translation>
+        <location filename="../gui_helper.cpp" line="307"/>
+        <source>Quit</source>
+        <extracomment>&quot;Quit&quot; translation should be the same as the one of system tray</extracomment>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="283"/>
-        <source>The program will keep running in the system tray. To terminate the program, choose &lt;b&gt;Quit&lt;/b&gt; in the context menu of the system tray entry.</source>
-        <translation type="unfinished"></translation>
+        <location filename="../gui_helper.cpp" line="181"/>
+        <source>Git revision</source>
+        <translation>Versione di Git</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="778"/>
+        <location filename="../gui_helper.cpp" line="185"/>
+        <source>QT version</source>
+        <translation>Versione di Qt</translation>
+    </message>
+    <message>
+        <location filename="../gui_helper.cpp" line="823"/>
         <source> (unavailable, fallback to Default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="782"/>
+        <location filename="../gui_helper.cpp" line="827"/>
         <source>Style of system</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="784"/>
+        <location filename="../gui_helper.cpp" line="829"/>
         <source> (Recommended)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -110,13 +116,13 @@
 <context>
     <name>CRadioController</name>
     <message>
-        <location filename="../radio_controller.cpp" line="608"/>
+        <location filename="../radio_controller.cpp" line="646"/>
         <source>Unknown</source>
         <translation>Sconosciuto</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="406"/>
-        <location filename="../radio_controller.cpp" line="627"/>
+        <location filename="../radio_controller.cpp" line="443"/>
+        <location filename="../radio_controller.cpp" line="665"/>
         <source>No Station</source>
         <translation>Nessuna Stazione</translation>
     </message>
@@ -126,29 +132,39 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="369"/>
+        <location filename="../radio_controller.cpp" line="255"/>
+        <source>Playback failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="276"/>
+        <source>Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="405"/>
         <source>RAW File</source>
         <translation>File RAW</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="382"/>
-        <location filename="../radio_controller.cpp" line="848"/>
+        <location filename="../radio_controller.cpp" line="419"/>
+        <location filename="../radio_controller.cpp" line="904"/>
         <source>Scanning</source>
         <translation>Cerco</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="386"/>
-        <location filename="../radio_controller.cpp" line="873"/>
+        <location filename="../radio_controller.cpp" line="423"/>
+        <location filename="../radio_controller.cpp" line="929"/>
         <source>Found channels</source>
         <translation>Canali trovati</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="602"/>
+        <location filename="../radio_controller.cpp" line="640"/>
         <source>Playing last station</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="660"/>
+        <location filename="../radio_controller.cpp" line="715"/>
         <source>Radio device is not ready or does not exist.</source>
         <translation>Il dispositivo radio non è pronto o non è connesso.</translation>
     </message>
@@ -190,28 +206,33 @@
         <translation>Formato del file RAW sconosciuto</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="294"/>
-        <location filename="../../input/rtl_tcp.cpp" line="462"/>
+        <location filename="../../input/rtl_sdr.cpp" line="142"/>
+        <source>Error opening RTL-SDR. See log for details.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../input/rtl_sdr.cpp" line="306"/>
+        <location filename="../../input/rtl_tcp.cpp" line="549"/>
         <source>ADC overload. Maybe you are using a too high gain.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="390"/>
+        <location filename="../../input/rtl_sdr.cpp" line="402"/>
         <source>RTL-SDR is unplugged.</source>
         <translation type="unfinished">Il dispositivo RTL-SDR è scollegato.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="272"/>
+        <location filename="../../input/rtl_tcp.cpp" line="309"/>
         <source>RTL-TCP connection closed.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="413"/>
+        <location filename="../../input/rtl_tcp.cpp" line="450"/>
         <source>Connection failed to server </source>
         <translation type="unfinished">Connessione al server fallita </translation>
     </message>
     <message>
-        <location filename="../../input/soapy_sdr.cpp" line="91"/>
+        <location filename="../../input/soapy_sdr.cpp" line="109"/>
         <source>Could not load SoapySDR with provided device arguments.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -224,7 +245,7 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+        <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
         <source>Display station name in the window title</source>
         <translation type="unfinished"></translation>
     </message>
@@ -997,107 +1018,107 @@
 <context>
     <name>GlobalSettings</name>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
         <source>Global settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
         <source>Full screen mode</source>
         <translation>Modalità tutto schermo</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
         <source>Language</source>
         <translation>Lingua</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
         <source>Global receiver settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
         <source>Automatic RF gain</source>
         <translation>Guadagno RF automatico</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
         <source>Manual gain</source>
         <translation>Guadagno manuale</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
         <source>Value: </source>
         <translation>Valore: </translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
         <source>Auto detect</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="178"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
         <source>None</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="179"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
         <source>Airspy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="180"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
         <source>rtl-sdr</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="181"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
         <source>SoapySDR</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="182"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
         <source>rtl-tcp</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="183"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
         <source>RAW file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="221"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
         <source>Style settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="233"/>
-        <source>Style changed. Please restart welle.io</source>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+        <source>Style changed. Please restart welle.io.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="238"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
         <source>Style. Restart to apply.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="251"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
         <source>Light</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="252"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
         <source>Dark</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="253"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
         <source>System</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="257"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
         <source>Theme</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1111,119 +1132,229 @@
     </message>
     <message>
         <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
-        <source>Amplitude</source>
-        <translation>Ampiezza</translation>
+        <source>Samples</source>
+        <translation type="unfinished"></translation>
     </message>
+</context>
+<context>
+    <name>InfoPage</name>
     <message>
-        <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
-        <source>Samples</source>
+        <location filename="../QML/InfoPage.qml" line="21"/>
+        <source>Versions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="26"/>
+        <source>Authors</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="31"/>
+        <source>Thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="36"/>
+        <source>Licenses</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>MainView</name>
     <message>
-        <location filename="../QML/MainView.qml" line="172"/>
+        <location filename="../QML/MainView.qml" line="138"/>
+        <source>Stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="139"/>
+        <source>Display or hide stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Stop</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop scan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Start playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="284"/>
+        <source>Volume (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="289"/>
+        <source>Volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="290"/>
+        <source>Toggle volume slider</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="421"/>
+        <source>Volume set to %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="462"/>
+        <source>Main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="463"/>
+        <source>Show the main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="474"/>
         <source>Settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="180"/>
+        <location filename="../QML/MainView.qml" line="482"/>
         <source>Expert Settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="188"/>
+        <location filename="../QML/MainView.qml" line="490"/>
         <source>About</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="196"/>
+        <location filename="../QML/MainView.qml" line="498"/>
         <source>Exit</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="232"/>
+        <location filename="../QML/MainView.qml" line="534"/>
         <source>All stations</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="233"/>
+        <location filename="../QML/MainView.qml" line="535"/>
         <source>Favorites</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="267"/>
+        <location filename="../QML/MainView.qml" line="566"/>
+        <source>Stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="567"/>
+        <source>Show stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="575"/>
         <source>Start station scan</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="279"/>
+        <location filename="../QML/MainView.qml" line="587"/>
         <source>Stop station scan</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="291"/>
+        <location filename="../QML/MainView.qml" line="599"/>
         <source>Clear station list</source>
         <translation>Elimina la lista delle stazioni</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="299"/>
+        <location filename="../QML/MainView.qml" line="607"/>
         <source>Station settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="312"/>
+        <location filename="../QML/MainView.qml" line="620"/>
         <source>No stations in list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="349"/>
+        <location filename="../QML/MainView.qml" line="634"/>
+        <source>File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="764"/>
         <source>Manual channel</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="404"/>
+        <location filename="../QML/MainView.qml" line="816"/>
+        <source>Add</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="817"/>
+        <source>Add a view</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="825"/>
         <source>Service Overview</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="410"/>
+        <location filename="../QML/MainView.qml" line="831"/>
         <source>Service Details</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="416"/>
+        <location filename="../QML/MainView.qml" line="837"/>
         <source>MOT Slide Show</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="422"/>
+        <location filename="../QML/MainView.qml" line="843"/>
         <source>Spectrum</source>
         <translation type="unfinished">Spettro</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="428"/>
+        <location filename="../QML/MainView.qml" line="849"/>
         <source>Impulse Response</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="434"/>
+        <location filename="../QML/MainView.qml" line="855"/>
         <source>Constellation Diagram</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="440"/>
+        <location filename="../QML/MainView.qml" line="861"/>
         <source>Null Symbol</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="446"/>
+        <location filename="../QML/MainView.qml" line="867"/>
         <source>Console Output</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="452"/>
+        <location filename="../QML/MainView.qml" line="873"/>
         <source>RAW Recorder</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1231,20 +1362,15 @@
 <context>
     <name>MotView</name>
     <message>
-        <location filename="../QML/MotView.qml" line="10"/>
+        <location filename="../QML/MotView.qml" line="11"/>
         <source>MOT Slide Show</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/MotView.qml" line="27"/>
+        <location filename="../QML/MotView.qml" line="29"/>
         <source>Save all images</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <location filename="../QML/MotView.qml" line="47"/>
-        <source>Latest</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>NullSymbolGraph</name>
@@ -1253,11 +1379,6 @@
         <source>Null Symbol</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
-        <source>Amplitude</source>
-        <translation type="unfinished">Ampiezza</translation>
-    </message>
 </context>
 <context>
     <name>RTLSDRSettings</name>
@@ -1268,7 +1389,7 @@
     </message>
     <message>
         <location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
-        <source>Enable bias tee (not from all dongles supported)</source>
+        <source>Enable bias tee (not supported by all dongles)</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
@@ -1321,17 +1442,17 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
         <source>Open RAW file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
         <source>Currently shown under Android</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
         <source>Selected file:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1382,58 +1503,69 @@
         <translation>Canale attuale</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
         <source>Frame sync</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
         <source>OK</source>
         <translation>OK</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
         <source>Not synced</source>
         <translation>Non sincronizzato</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
         <source>FIC CRC</source>
         <translation>FIC CRC</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
         <source>Error</source>
         <translation>Errore</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
         <source>Frame errors</source>
         <translation>Errori di frame</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
         <source>Frequency correction</source>
         <translation>Correzione di frequenza</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
         <source>SNR</source>
         <translation>SNR</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
         <source>RS errors</source>
         <translation>Errori RS</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Corrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Uncorrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
         <source>AAC errors</source>
         <translation>Errori AAC</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
         <source>DAB date and time</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1488,10 +1620,27 @@
         <source>Spectrum</source>
         <translation>Spettro</translation>
     </message>
+</context>
+<context>
+    <name>StationDelegate</name>
     <message>
-        <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
-        <source>Amplitude</source>
-        <translation>Ampiezza</translation>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Remove station from favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Add station to favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>StationListModel</name>
+    <message>
+        <location filename="../QML/components/StationListModel.qml" line="96"/>
+        <source>Last played station not found.
+Select a station to start playback.</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -1510,17 +1659,37 @@
 <context>
     <name>ViewBaseFrame</name>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+        <source>%1 title bar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+        <source>%1 title bar to drag the element</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+        <source>%1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+        <source>Show %1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Minimize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Maximize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
         <source>Remove</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1555,38 +1724,33 @@
         <source>experimental</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <location filename="../QML/components/WSpectrum.qml" line="101"/>
-        <source>Sensitivity</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>main</name>
     <message>
-        <location filename="../main.cpp" line="100"/>
+        <location filename="../main.cpp" line="111"/>
         <source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="101"/>
-        <location filename="../main.cpp" line="106"/>
+        <location filename="../main.cpp" line="112"/>
+        <location filename="../main.cpp" line="117"/>
         <source>File name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="105"/>
+        <location filename="../main.cpp" line="116"/>
         <source>Redirects all log output texts to a file.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="110"/>
+        <location filename="../main.cpp" line="121"/>
         <source>Qt Quick Controls Style for the 1st launch</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="111"/>
-        <source>style_name</source>
+        <location filename="../main.cpp" line="122"/>
+        <source>Style name</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/welle-gui/i18n/nb_NO.qm b/src/welle-gui/i18n/nb_NO.qm
index 491ad98..21d353e 100644
Binary files a/src/welle-gui/i18n/nb_NO.qm and b/src/welle-gui/i18n/nb_NO.qm differ
diff --git a/src/welle-gui/i18n/nb_NO.ts b/src/welle-gui/i18n/nb_NO.ts
index bf4514c..b60aa70 100644
--- a/src/welle-gui/i18n/nb_NO.ts
+++ b/src/welle-gui/i18n/nb_NO.ts
@@ -36,76 +36,82 @@
     </message>
     <message>
         <location filename="../android_rtl_sdr.cpp" line="139"/>
-        <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
-        <translation>Android RTL-SDR-driver er ikke installert. Vil du installere? Etter installasjon, start welle.io om igjen.</translation>
+        <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
+        <translation type="unfinished">Android RTL-SDR-driver er ikke installert. Vil du installere? Etter installasjon, start welle.io om igjen.</translation>
     </message>
 </context>
 <context>
     <name>CGUIHelper</name>
     <message>
-        <location filename="../gui_helper.cpp" line="65"/>
-        <location filename="../gui_helper.cpp" line="654"/>
+        <location filename="../gui_helper.cpp" line="66"/>
+        <location filename="../gui_helper.cpp" line="699"/>
         <source>Mi&amp;nimize</source>
         <translation>Mi&amp;nimer</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="68"/>
-        <location filename="../gui_helper.cpp" line="655"/>
+        <location filename="../gui_helper.cpp" line="69"/>
+        <location filename="../gui_helper.cpp" line="700"/>
         <source>Ma&amp;ximize</source>
         <translation>Ma&amp;ksimer</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="71"/>
-        <location filename="../gui_helper.cpp" line="656"/>
+        <location filename="../gui_helper.cpp" line="72"/>
+        <location filename="../gui_helper.cpp" line="701"/>
         <source>&amp;Restore</source>
         <translation>&amp;Gjenoprett</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="74"/>
-        <location filename="../gui_helper.cpp" line="657"/>
+        <location filename="../gui_helper.cpp" line="75"/>
+        <location filename="../gui_helper.cpp" line="702"/>
         <source>&amp;Quit</source>
         <translation>&amp;Avslutt</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="127"/>
-        <source>version</source>
-        <translation>versjon</translation>
+        <location filename="../gui_helper.cpp" line="180"/>
+        <source>welle.io version</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="128"/>
-        <source>Git revision</source>
-        <translation>Git-versjon</translation>
+        <location filename="../gui_helper.cpp" line="184"/>
+        <source>Built on</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="129"/>
-        <source>Build on</source>
-        <translation>Kompilert</translation>
+        <location filename="../gui_helper.cpp" line="302"/>
+        <source>The program will keep running in the system tray. To terminate the program, choose &quot;%1&quot; in the context menu of the system tray entry.</source>
+        <translatorcomment>Rough translation, should be refined.</translatorcomment>
+        <translation type="unfinished">Programmet vil kjøre i bakgrunnen som et ikon på oppgavelinjen. For å avslutte programmet, velg &quot;%1&quot; i filmenyen for ikonet på oppgavelinjen.</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="130"/>
-        <source>QT version</source>
-        <translation>QT-versjon</translation>
+        <location filename="../gui_helper.cpp" line="307"/>
+        <source>Quit</source>
+        <extracomment>&quot;Quit&quot; translation should be the same as the one of system tray</extracomment>
+        <translation type="unfinished">Avslutt</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="283"/>
-        <source>The program will keep running in the system tray. To terminate the program, choose &lt;b&gt;Quit&lt;/b&gt; in the context menu of the system tray entry.</source>
-        <translatorcomment>Rough translation, should be refined.</translatorcomment>
-        <translation>Programmet vil kjøre i bakgrunnen som et ikon på oppgavelinjen. For å avslutte programmet, velg &lt;b&gt;Avslutt&lt;/b&gt; i filmenyen for ikonet på oppgavelinjen.</translation>
+        <location filename="../gui_helper.cpp" line="181"/>
+        <source>Git revision</source>
+        <translation>Git-versjon</translation>
+    </message>
+    <message>
+        <location filename="../gui_helper.cpp" line="185"/>
+        <source>QT version</source>
+        <translation>QT-versjon</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="778"/>
+        <location filename="../gui_helper.cpp" line="823"/>
         <source> (unavailable, fallback to Default)</source>
         <translatorcomment>inaccurate translation</translatorcomment>
         <translation> (utilgjengelig, bruker standardinnstillinger)</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="782"/>
+        <location filename="../gui_helper.cpp" line="827"/>
         <source>Style of system</source>
         <translatorcomment>Inaccurate translation</translatorcomment>
         <translation>Systemutseende</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="784"/>
+        <location filename="../gui_helper.cpp" line="829"/>
         <source> (Recommended)</source>
         <translation> (Anbefalt)</translation>
     </message>
@@ -113,13 +119,13 @@
 <context>
     <name>CRadioController</name>
     <message>
-        <location filename="../radio_controller.cpp" line="608"/>
+        <location filename="../radio_controller.cpp" line="646"/>
         <source>Unknown</source>
         <translation>Ukjent</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="406"/>
-        <location filename="../radio_controller.cpp" line="627"/>
+        <location filename="../radio_controller.cpp" line="443"/>
+        <location filename="../radio_controller.cpp" line="665"/>
         <source>No Station</source>
         <translation>Ingen radiokanal valgt</translation>
     </message>
@@ -129,29 +135,39 @@
         <translation>Feil ved åpning av fil </translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="369"/>
+        <location filename="../radio_controller.cpp" line="255"/>
+        <source>Playback failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="276"/>
+        <source>Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="405"/>
         <source>RAW File</source>
         <translation>RAW-fil</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="382"/>
-        <location filename="../radio_controller.cpp" line="848"/>
+        <location filename="../radio_controller.cpp" line="419"/>
+        <location filename="../radio_controller.cpp" line="904"/>
         <source>Scanning</source>
         <translation>Søker</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="386"/>
-        <location filename="../radio_controller.cpp" line="873"/>
+        <location filename="../radio_controller.cpp" line="423"/>
+        <location filename="../radio_controller.cpp" line="929"/>
         <source>Found channels</source>
         <translation>Radiokanaler funnet</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="602"/>
+        <location filename="../radio_controller.cpp" line="640"/>
         <source>Playing last station</source>
         <translation>Spiller sist valgte radiokanal</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="660"/>
+        <location filename="../radio_controller.cpp" line="715"/>
         <source>Radio device is not ready or does not exist.</source>
         <translation>Radiomottaker er ikke klar eller er ikke tilkoblet.</translation>
     </message>
@@ -194,29 +210,34 @@
         <translation>Ukjent RAW filformat</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="294"/>
-        <location filename="../../input/rtl_tcp.cpp" line="462"/>
+        <location filename="../../input/rtl_sdr.cpp" line="142"/>
+        <source>Error opening RTL-SDR. See log for details.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../input/rtl_sdr.cpp" line="306"/>
+        <location filename="../../input/rtl_tcp.cpp" line="549"/>
         <source>ADC overload. Maybe you are using a too high gain.</source>
         <translatorcomment>Refine translation.</translatorcomment>
         <translation>ADC overbelastning. Gain muligens satt for høyt.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="390"/>
+        <location filename="../../input/rtl_sdr.cpp" line="402"/>
         <source>RTL-SDR is unplugged.</source>
         <translation>RTL-SDR er frakoblet.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="272"/>
+        <location filename="../../input/rtl_tcp.cpp" line="309"/>
         <source>RTL-TCP connection closed.</source>
         <translation>RTL-TCP tilkobling avsluttet.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="413"/>
+        <location filename="../../input/rtl_tcp.cpp" line="450"/>
         <source>Connection failed to server </source>
         <translation>Tilkobling til server mislyktes </translation>
     </message>
     <message>
-        <location filename="../../input/soapy_sdr.cpp" line="91"/>
+        <location filename="../../input/soapy_sdr.cpp" line="109"/>
         <source>Could not load SoapySDR with provided device arguments.</source>
         <translatorcomment>refine translation</translatorcomment>
         <translation>Kunne ikke aktivere SoapySDR med gitte enhetsargumeter.</translation>
@@ -238,7 +259,7 @@
         <translation>Automatisk start å spille av sist valgte radiokanal</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+        <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
         <source>Display station name in the window title</source>
         <translatorcomment>Unsure about translation.</translatorcomment>
         <translation>Vis kanalnavn i tittelvinduet</translation>
@@ -1019,107 +1040,107 @@
 <context>
     <name>GlobalSettings</name>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
         <source>Global settings</source>
         <translation>Globale innstillinger</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
         <source>Full screen mode</source>
         <translation>Fullskjermsmodus</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
         <source>Language</source>
         <translation>Språk</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
         <source>Global receiver settings</source>
         <translation>Globale mottakerinnstillinger</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
         <source>Automatic RF gain</source>
         <translation>Automatisk RF forsterkning</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
         <source>Manual gain</source>
         <translation>Manuell forsterkning</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
         <source>Value: </source>
         <translation>Verdi: </translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
         <source>Auto detect</source>
         <translation>Automatisk gjenkjenning</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="178"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
         <source>None</source>
         <translation>Ingen</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="179"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
         <source>Airspy</source>
         <translation>Airspy</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="180"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
         <source>rtl-sdr</source>
         <translation>rtl-sdr</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="181"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
         <source>SoapySDR</source>
         <translation>SoapySDR</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="182"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
         <source>rtl-tcp</source>
         <translation>rtl-tcp</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="183"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
         <source>RAW file</source>
         <translation>RAW fil</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="221"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
         <source>Style settings</source>
         <translation>Temainnstillinger</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="233"/>
-        <source>Style changed. Please restart welle.io</source>
-        <translation>Tema forandret. Start welle.io på nytt for å bruke</translation>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+        <source>Style changed. Please restart welle.io.</source>
+        <translation type="unfinished">Tema forandret. Start welle.io på nytt for å bruke.</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="238"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
         <source>Style. Restart to apply.</source>
         <translation>Tema. Start på nytt for å bruke.</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="251"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
         <source>Light</source>
         <translation>Lys</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="252"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
         <source>Dark</source>
         <translation>Mørk</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="253"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
         <source>System</source>
         <translation>System</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="257"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
         <source>Theme</source>
         <translation>Tema</translation>
     </message>
@@ -1133,122 +1154,232 @@
     </message>
     <message>
         <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
-        <source>Amplitude</source>
-        <translation>Amplitude</translation>
-    </message>
-    <message>
-        <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
         <source>Samples</source>
         <translatorcomment>Needs a better translation</translatorcomment>
         <translation>Prøver</translation>
     </message>
 </context>
+<context>
+    <name>InfoPage</name>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="21"/>
+        <source>Versions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="26"/>
+        <source>Authors</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="31"/>
+        <source>Thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="36"/>
+        <source>Licenses</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>MainView</name>
     <message>
-        <location filename="../QML/MainView.qml" line="172"/>
+        <location filename="../QML/MainView.qml" line="138"/>
+        <source>Stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="139"/>
+        <source>Display or hide stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Stop</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop scan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Start playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="284"/>
+        <source>Volume (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="289"/>
+        <source>Volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="290"/>
+        <source>Toggle volume slider</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="421"/>
+        <source>Volume set to %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="462"/>
+        <source>Main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="463"/>
+        <source>Show the main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="474"/>
         <source>Settings</source>
         <translation>Innstillinger</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="180"/>
+        <location filename="../QML/MainView.qml" line="482"/>
         <source>Expert Settings</source>
         <translation>Ekspertinnstillinger</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="188"/>
+        <location filename="../QML/MainView.qml" line="490"/>
         <source>About</source>
         <translation>Om</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="196"/>
+        <location filename="../QML/MainView.qml" line="498"/>
         <source>Exit</source>
         <translation>Avslutt</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="232"/>
+        <location filename="../QML/MainView.qml" line="534"/>
         <source>All stations</source>
         <translation>Alle radiokanaler</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="233"/>
+        <location filename="../QML/MainView.qml" line="535"/>
         <source>Favorites</source>
         <translation>Favoritter</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="267"/>
+        <location filename="../QML/MainView.qml" line="566"/>
+        <source>Stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="567"/>
+        <source>Show stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="575"/>
         <source>Start station scan</source>
         <translation>Start kanalsøk</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="279"/>
+        <location filename="../QML/MainView.qml" line="587"/>
         <source>Stop station scan</source>
         <translation>Stopp kanalsøk</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="291"/>
+        <location filename="../QML/MainView.qml" line="599"/>
         <source>Clear station list</source>
         <translation>Tøm kanalliste</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="299"/>
+        <location filename="../QML/MainView.qml" line="607"/>
         <source>Station settings</source>
         <translation>Kanalinnstillinger</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="312"/>
+        <location filename="../QML/MainView.qml" line="620"/>
         <source>No stations in list</source>
         <translation>Ingen radiokanaler i listen</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="349"/>
+        <location filename="../QML/MainView.qml" line="634"/>
+        <source>File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="764"/>
         <source>Manual channel</source>
         <translation>Manuell kanal</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="404"/>
+        <location filename="../QML/MainView.qml" line="816"/>
+        <source>Add</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="817"/>
+        <source>Add a view</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="825"/>
         <source>Service Overview</source>
         <translatorcomment>Needs a better translation</translatorcomment>
         <translation>Oversikt</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="410"/>
+        <location filename="../QML/MainView.qml" line="831"/>
         <source>Service Details</source>
         <translatorcomment>Needs a better translation</translatorcomment>
         <translation>Detaljer</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="416"/>
+        <location filename="../QML/MainView.qml" line="837"/>
         <source>MOT Slide Show</source>
         <translation>MOT bildevisning</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="422"/>
+        <location filename="../QML/MainView.qml" line="843"/>
         <source>Spectrum</source>
         <translation>Spektrum</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="428"/>
+        <location filename="../QML/MainView.qml" line="849"/>
         <source>Impulse Response</source>
         <translation>Impulsrespons</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="434"/>
+        <location filename="../QML/MainView.qml" line="855"/>
         <source>Constellation Diagram</source>
         <translation>Konstellasjonsdiagram</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="440"/>
+        <location filename="../QML/MainView.qml" line="861"/>
         <source>Null Symbol</source>
         <translation>Null-symbol</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="446"/>
+        <location filename="../QML/MainView.qml" line="867"/>
         <source>Console Output</source>
         <translation>Konsoll</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="452"/>
+        <location filename="../QML/MainView.qml" line="873"/>
         <source>RAW Recorder</source>
         <translation>RAW-opptaker</translation>
     </message>
@@ -1256,20 +1387,15 @@
 <context>
     <name>MotView</name>
     <message>
-        <location filename="../QML/MotView.qml" line="10"/>
+        <location filename="../QML/MotView.qml" line="11"/>
         <source>MOT Slide Show</source>
         <translation>MOT bildevisning</translation>
     </message>
     <message>
-        <location filename="../QML/MotView.qml" line="27"/>
+        <location filename="../QML/MotView.qml" line="29"/>
         <source>Save all images</source>
         <translation>Lagre alle bilder</translation>
     </message>
-    <message>
-        <location filename="../QML/MotView.qml" line="47"/>
-        <source>Latest</source>
-        <translation>Nyeste bilde</translation>
-    </message>
 </context>
 <context>
     <name>NullSymbolGraph</name>
@@ -1278,11 +1404,6 @@
         <source>Null Symbol</source>
         <translation>Null-symbol</translation>
     </message>
-    <message>
-        <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
-        <source>Amplitude</source>
-        <translation>Amplitude</translation>
-    </message>
 </context>
 <context>
     <name>RTLSDRSettings</name>
@@ -1293,8 +1414,8 @@
     </message>
     <message>
         <location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
-        <source>Enable bias tee (not from all dongles supported)</source>
-        <translation>Aktiver bias-tee (Ikke alle enheter støttes)</translation>
+        <source>Enable bias tee (not supported by all dongles)</source>
+        <translation type="unfinished">Aktiver bias-tee (Ikke alle enheter støttes)</translation>
     </message>
 </context>
 <context>
@@ -1346,18 +1467,18 @@
         <translation>RAW-fil innstillinger</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
         <source>Open RAW file</source>
         <translation>Åpne RAW-fil</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
         <source>Currently shown under Android</source>
         <translatorcomment>inaccurate translation</translatorcomment>
         <translation>Nå vist under Android</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
         <source>Selected file:</source>
         <translation>Valgt fil:</translation>
     </message>
@@ -1409,58 +1530,69 @@
         <translation>Kanalblokk</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
         <source>Frame sync</source>
         <translation>Pakke-synkronisering</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
         <source>OK</source>
         <translation>OK</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
         <source>Not synced</source>
         <translation>Ikke synkronisert</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
         <source>FIC CRC</source>
         <translation>FIC CRC</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
         <source>Error</source>
         <translation>Feil</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
         <source>Frame errors</source>
         <translation>Pakkefeil</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
         <source>Frequency correction</source>
         <translation>Frekvenskorreksjon</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
         <source>SNR</source>
         <translation>SNR</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
         <source>RS errors</source>
         <translation>RS-feil</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Corrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Uncorrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
         <source>AAC errors</source>
         <translation>AAC-feil</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
         <source>DAB date and time</source>
         <translation>DAB tid og dato</translation>
     </message>
@@ -1515,10 +1647,27 @@
         <source>Spectrum</source>
         <translation>Spektrum</translation>
     </message>
+</context>
+<context>
+    <name>StationDelegate</name>
     <message>
-        <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
-        <source>Amplitude</source>
-        <translation>Amplitude</translation>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Remove station from favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Add station to favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>StationListModel</name>
+    <message>
+        <location filename="../QML/components/StationListModel.qml" line="96"/>
+        <source>Last played station not found.
+Select a station to start playback.</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -1538,17 +1687,37 @@
 <context>
     <name>ViewBaseFrame</name>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+        <source>%1 title bar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+        <source>%1 title bar to drag the element</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+        <source>%1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+        <source>Show %1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Minimize</source>
         <translation>Minimer</translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Maximize</source>
         <translation>Maksimer</translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
         <source>Remove</source>
         <translation>Fjern</translation>
     </message>
@@ -1583,40 +1752,34 @@
         <source>experimental</source>
         <translation>eksperimentell</translation>
     </message>
-    <message>
-        <location filename="../QML/components/WSpectrum.qml" line="101"/>
-        <source>Sensitivity</source>
-        <translation>Sensitivitet</translation>
-    </message>
 </context>
 <context>
     <name>main</name>
     <message>
-        <location filename="../main.cpp" line="100"/>
+        <location filename="../main.cpp" line="111"/>
         <source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
         <translation>Lagrer DAB-pakker (*.mp2) eller Dab+ superpakker med RS-koding (*.dab) Denne filen kan brukes til å analysere X-PAD-data med XPADxpert</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="101"/>
-        <location filename="../main.cpp" line="106"/>
+        <location filename="../main.cpp" line="112"/>
+        <location filename="../main.cpp" line="117"/>
         <source>File name</source>
         <translation>Filnavn</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="105"/>
+        <location filename="../main.cpp" line="116"/>
         <source>Redirects all log output texts to a file.</source>
         <translation>Lagrer all konsolltekst til en fil.</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="110"/>
+        <location filename="../main.cpp" line="121"/>
         <source>Qt Quick Controls Style for the 1st launch</source>
         <translation>Qt Quick Controls Style for førstegangs kjøring</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="111"/>
-        <source>style_name</source>
-        <translatorcomment>Unsure if this is supposed to be translated</translatorcomment>
-        <translation>style_name</translation>
+        <location filename="../main.cpp" line="122"/>
+        <source>Style name</source>
+        <translation type="unfinished">Temanavn</translation>
     </message>
 </context>
 </TS>
diff --git a/src/welle-gui/i18n/nl_NL.qm b/src/welle-gui/i18n/nl_NL.qm
index 370df5f..a5f3a3d 100644
Binary files a/src/welle-gui/i18n/nl_NL.qm and b/src/welle-gui/i18n/nl_NL.qm differ
diff --git a/src/welle-gui/i18n/nl_NL.ts b/src/welle-gui/i18n/nl_NL.ts
index 70d7df6..7f377a4 100644
--- a/src/welle-gui/i18n/nl_NL.ts
+++ b/src/welle-gui/i18n/nl_NL.ts
@@ -36,73 +36,79 @@
     </message>
     <message>
         <location filename="../android_rtl_sdr.cpp" line="139"/>
-        <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+        <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>CGUIHelper</name>
     <message>
-        <location filename="../gui_helper.cpp" line="65"/>
-        <location filename="../gui_helper.cpp" line="654"/>
+        <location filename="../gui_helper.cpp" line="66"/>
+        <location filename="../gui_helper.cpp" line="699"/>
         <source>Mi&amp;nimize</source>
         <translation>Mi&amp;nimaliseren</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="68"/>
-        <location filename="../gui_helper.cpp" line="655"/>
+        <location filename="../gui_helper.cpp" line="69"/>
+        <location filename="../gui_helper.cpp" line="700"/>
         <source>Ma&amp;ximize</source>
         <translation>Ma&amp;ximaliseren</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="71"/>
-        <location filename="../gui_helper.cpp" line="656"/>
+        <location filename="../gui_helper.cpp" line="72"/>
+        <location filename="../gui_helper.cpp" line="701"/>
         <source>&amp;Restore</source>
         <translation>He&amp;rstellen</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="74"/>
-        <location filename="../gui_helper.cpp" line="657"/>
+        <location filename="../gui_helper.cpp" line="75"/>
+        <location filename="../gui_helper.cpp" line="702"/>
         <source>&amp;Quit</source>
         <translation>Af&amp;sluiten</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="127"/>
-        <source>version</source>
-        <translation>versie</translation>
+        <location filename="../gui_helper.cpp" line="180"/>
+        <source>welle.io version</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="128"/>
-        <source>Git revision</source>
-        <translation>Git revisie</translation>
+        <location filename="../gui_helper.cpp" line="184"/>
+        <source>Built on</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="129"/>
-        <source>Build on</source>
-        <translation>Gemaakt op</translation>
+        <location filename="../gui_helper.cpp" line="302"/>
+        <source>The program will keep running in the system tray. To terminate the program, choose &quot;%1&quot; in the context menu of the system tray entry.</source>
+        <translation type="unfinished">Dit programma blijft actief in de systeembalk. Om het programma af te sluiten kies &quot;%1&quot; in het context menu van de systeembalk ingang.</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="130"/>
-        <source>QT version</source>
-        <translation>QT versie</translation>
+        <location filename="../gui_helper.cpp" line="307"/>
+        <source>Quit</source>
+        <extracomment>&quot;Quit&quot; translation should be the same as the one of system tray</extracomment>
+        <translation type="unfinished">Afsluiten</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="283"/>
-        <source>The program will keep running in the system tray. To terminate the program, choose &lt;b&gt;Quit&lt;/b&gt; in the context menu of the system tray entry.</source>
-        <translation>Dit programma blijft actief in de systeembalk. Om het programma af te sluiten kies &lt;b&gt;Afsluiten&lt;/b&gt; in het context menu van de systeembalk ingang.</translation>
+        <location filename="../gui_helper.cpp" line="181"/>
+        <source>Git revision</source>
+        <translation>Git revisie</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="778"/>
+        <location filename="../gui_helper.cpp" line="185"/>
+        <source>QT version</source>
+        <translation>QT versie</translation>
+    </message>
+    <message>
+        <location filename="../gui_helper.cpp" line="823"/>
         <source> (unavailable, fallback to Default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="782"/>
+        <location filename="../gui_helper.cpp" line="827"/>
         <source>Style of system</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="784"/>
+        <location filename="../gui_helper.cpp" line="829"/>
         <source> (Recommended)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -115,40 +121,50 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="369"/>
+        <location filename="../radio_controller.cpp" line="255"/>
+        <source>Playback failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="276"/>
+        <source>Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="405"/>
         <source>RAW File</source>
         <translation>RAW bestand</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="382"/>
-        <location filename="../radio_controller.cpp" line="848"/>
+        <location filename="../radio_controller.cpp" line="419"/>
+        <location filename="../radio_controller.cpp" line="904"/>
         <source>Scanning</source>
         <translation>Scannen</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="386"/>
-        <location filename="../radio_controller.cpp" line="873"/>
+        <location filename="../radio_controller.cpp" line="423"/>
+        <location filename="../radio_controller.cpp" line="929"/>
         <source>Found channels</source>
         <translation>Gevonden kanalen</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="406"/>
-        <location filename="../radio_controller.cpp" line="627"/>
+        <location filename="../radio_controller.cpp" line="443"/>
+        <location filename="../radio_controller.cpp" line="665"/>
         <source>No Station</source>
         <translation>Geen station</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="602"/>
+        <location filename="../radio_controller.cpp" line="640"/>
         <source>Playing last station</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="608"/>
+        <location filename="../radio_controller.cpp" line="646"/>
         <source>Unknown</source>
         <translation>Onbekend</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="660"/>
+        <location filename="../radio_controller.cpp" line="715"/>
         <source>Radio device is not ready or does not exist.</source>
         <translation>Radio apparaat is niet klaar of bestaat niet</translation>
     </message>
@@ -190,28 +206,33 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="294"/>
-        <location filename="../../input/rtl_tcp.cpp" line="462"/>
+        <location filename="../../input/rtl_sdr.cpp" line="142"/>
+        <source>Error opening RTL-SDR. See log for details.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../input/rtl_sdr.cpp" line="306"/>
+        <location filename="../../input/rtl_tcp.cpp" line="549"/>
         <source>ADC overload. Maybe you are using a too high gain.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="390"/>
+        <location filename="../../input/rtl_sdr.cpp" line="402"/>
         <source>RTL-SDR is unplugged.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="272"/>
+        <location filename="../../input/rtl_tcp.cpp" line="309"/>
         <source>RTL-TCP connection closed.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="413"/>
+        <location filename="../../input/rtl_tcp.cpp" line="450"/>
         <source>Connection failed to server </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../input/soapy_sdr.cpp" line="91"/>
+        <location filename="../../input/soapy_sdr.cpp" line="109"/>
         <source>Could not load SoapySDR with provided device arguments.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -224,7 +245,7 @@
         <translation>Start automatisch met afspelen van laatst afgespeelde station</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+        <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
         <source>Display station name in the window title</source>
         <translation type="unfinished"></translation>
     </message>
@@ -997,107 +1018,107 @@
 <context>
     <name>GlobalSettings</name>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
         <source>Global settings</source>
         <translation>Globale instellingen</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
         <source>Full screen mode</source>
         <translation>Volledigschermmodus</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
         <source>Language</source>
         <translation type="unfinished">Taal</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
         <source>Global receiver settings</source>
         <translation>Globale instellingen voor ontvanger</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
         <source>Automatic RF gain</source>
         <translation>Automatische RF versterking</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
         <source>Manual gain</source>
         <translation>Handmatige versterking</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
         <source>Value: </source>
         <translation>Waarde: </translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
         <source>Auto detect</source>
         <translation>Automatische detectie</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="178"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
         <source>None</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="179"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
         <source>Airspy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="180"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
         <source>rtl-sdr</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="181"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
         <source>SoapySDR</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="182"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
         <source>rtl-tcp</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="183"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
         <source>RAW file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="221"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
         <source>Style settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="233"/>
-        <source>Style changed. Please restart welle.io</source>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+        <source>Style changed. Please restart welle.io.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="238"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
         <source>Style. Restart to apply.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="251"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
         <source>Light</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="252"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
         <source>Dark</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="253"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
         <source>System</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="257"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
         <source>Theme</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1111,119 +1132,229 @@
     </message>
     <message>
         <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
-        <source>Amplitude</source>
-        <translation>Amplitude</translation>
-    </message>
-    <message>
-        <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
         <source>Samples</source>
         <translation>Bemonsteringen</translation>
     </message>
 </context>
+<context>
+    <name>InfoPage</name>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="21"/>
+        <source>Versions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="26"/>
+        <source>Authors</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="31"/>
+        <source>Thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="36"/>
+        <source>Licenses</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>MainView</name>
     <message>
-        <location filename="../QML/MainView.qml" line="172"/>
+        <location filename="../QML/MainView.qml" line="138"/>
+        <source>Stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="139"/>
+        <source>Display or hide stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Stop</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop scan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Start playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="284"/>
+        <source>Volume (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="289"/>
+        <source>Volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="290"/>
+        <source>Toggle volume slider</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="421"/>
+        <source>Volume set to %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="462"/>
+        <source>Main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="463"/>
+        <source>Show the main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="474"/>
         <source>Settings</source>
         <translation>Instellingen</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="180"/>
+        <location filename="../QML/MainView.qml" line="482"/>
         <source>Expert Settings</source>
         <translation>Expert instellingen</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="188"/>
+        <location filename="../QML/MainView.qml" line="490"/>
         <source>About</source>
         <translation>Over</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="196"/>
+        <location filename="../QML/MainView.qml" line="498"/>
         <source>Exit</source>
         <translation>Afsluiten</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="232"/>
+        <location filename="../QML/MainView.qml" line="534"/>
         <source>All stations</source>
         <translation>Alle stations</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="233"/>
+        <location filename="../QML/MainView.qml" line="535"/>
         <source>Favorites</source>
         <translation>Favorieten</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="267"/>
+        <location filename="../QML/MainView.qml" line="566"/>
+        <source>Stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="567"/>
+        <source>Show stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="575"/>
         <source>Start station scan</source>
         <translation>Start scan voor stations</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="279"/>
+        <location filename="../QML/MainView.qml" line="587"/>
         <source>Stop station scan</source>
         <translation>Stop scan voor stations</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="291"/>
+        <location filename="../QML/MainView.qml" line="599"/>
         <source>Clear station list</source>
         <translation>Stationslijst legen</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="299"/>
+        <location filename="../QML/MainView.qml" line="607"/>
         <source>Station settings</source>
         <translation>Station instellingen</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="312"/>
+        <location filename="../QML/MainView.qml" line="620"/>
         <source>No stations in list</source>
         <translation>Geen stations in lijst</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="349"/>
+        <location filename="../QML/MainView.qml" line="634"/>
+        <source>File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="764"/>
         <source>Manual channel</source>
         <translation>Handmatig kanaal</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="404"/>
+        <location filename="../QML/MainView.qml" line="816"/>
+        <source>Add</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="817"/>
+        <source>Add a view</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="825"/>
         <source>Service Overview</source>
         <translation>Service overzicht</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="410"/>
+        <location filename="../QML/MainView.qml" line="831"/>
         <source>Service Details</source>
         <translation>Service details</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="416"/>
+        <location filename="../QML/MainView.qml" line="837"/>
         <source>MOT Slide Show</source>
         <translation>MOT diashow</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="422"/>
+        <location filename="../QML/MainView.qml" line="843"/>
         <source>Spectrum</source>
         <translation>Spectrum</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="428"/>
+        <location filename="../QML/MainView.qml" line="849"/>
         <source>Impulse Response</source>
         <translation>Impulsantwoord</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="434"/>
+        <location filename="../QML/MainView.qml" line="855"/>
         <source>Constellation Diagram</source>
         <translation>Constellatiediagram</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="440"/>
+        <location filename="../QML/MainView.qml" line="861"/>
         <source>Null Symbol</source>
         <translation>Nul symbool</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="446"/>
+        <location filename="../QML/MainView.qml" line="867"/>
         <source>Console Output</source>
         <translation>Console uitvoer</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="452"/>
+        <location filename="../QML/MainView.qml" line="873"/>
         <source>RAW Recorder</source>
         <translation>RAW opname</translation>
     </message>
@@ -1231,20 +1362,15 @@
 <context>
     <name>MotView</name>
     <message>
-        <location filename="../QML/MotView.qml" line="10"/>
+        <location filename="../QML/MotView.qml" line="11"/>
         <source>MOT Slide Show</source>
         <translation>MOT diashow</translation>
     </message>
     <message>
-        <location filename="../QML/MotView.qml" line="27"/>
+        <location filename="../QML/MotView.qml" line="29"/>
         <source>Save all images</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <location filename="../QML/MotView.qml" line="47"/>
-        <source>Latest</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>NullSymbolGraph</name>
@@ -1253,11 +1379,6 @@
         <source>Null Symbol</source>
         <translation>Nul symbool</translation>
     </message>
-    <message>
-        <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
-        <source>Amplitude</source>
-        <translation>Amplitude</translation>
-    </message>
 </context>
 <context>
     <name>RTLSDRSettings</name>
@@ -1268,8 +1389,8 @@
     </message>
     <message>
         <location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
-        <source>Enable bias tee (not from all dongles supported)</source>
-        <translation>Bias tee inschakelen (niet alle dongles zijn ondersteund)</translation>
+        <source>Enable bias tee (not supported by all dongles)</source>
+        <translation type="unfinished">Bias tee inschakelen (niet alle dongles zijn ondersteund)</translation>
     </message>
 </context>
 <context>
@@ -1321,17 +1442,17 @@
         <translation>RAW bestand instellingen</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
         <source>Open RAW file</source>
         <translation>Open RAW bestand</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
         <source>Currently shown under Android</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
         <source>Selected file:</source>
         <translation>Geselecteerd bestand:</translation>
     </message>
@@ -1382,58 +1503,69 @@
         <translation>Huidig kanaal</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
         <source>Frame sync</source>
         <translation>Frame sync</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
         <source>FIC CRC</source>
         <translation>FIC CRC</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
         <source>Frame errors</source>
         <translation>Frame fouten</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
         <source>OK</source>
         <translation>OK</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
         <source>Not synced</source>
         <translation>Niet in sync</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
         <source>Error</source>
         <translation>Fout</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
         <source>Frequency correction</source>
         <translation>Frequentie correctie</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
         <source>SNR</source>
         <translation>SNR</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
         <source>RS errors</source>
         <translation>RS fouten</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Corrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Uncorrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
         <source>AAC errors</source>
         <translation>AAC fouten</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
         <source>DAB date and time</source>
         <translation>DAB datum en tijd</translation>
     </message>
@@ -1488,10 +1620,27 @@
         <source>Spectrum</source>
         <translation>Spectrum</translation>
     </message>
+</context>
+<context>
+    <name>StationDelegate</name>
     <message>
-        <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
-        <source>Amplitude</source>
-        <translation>Amplitude</translation>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Remove station from favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Add station to favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>StationListModel</name>
+    <message>
+        <location filename="../QML/components/StationListModel.qml" line="96"/>
+        <source>Last played station not found.
+Select a station to start playback.</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -1510,17 +1659,37 @@
 <context>
     <name>ViewBaseFrame</name>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+        <source>%1 title bar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+        <source>%1 title bar to drag the element</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+        <source>%1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+        <source>Show %1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Minimize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Maximize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
         <source>Remove</source>
         <translation>Verwijderen</translation>
     </message>
@@ -1555,38 +1724,33 @@
         <source>experimental</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <location filename="../QML/components/WSpectrum.qml" line="101"/>
-        <source>Sensitivity</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>main</name>
     <message>
-        <location filename="../main.cpp" line="100"/>
+        <location filename="../main.cpp" line="111"/>
         <source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
         <translation>Opname DAB pakket (*.mp2) of DAB+ superpakket met RS codering (*.dab). Dit bestand kan gebruikt worden om X-PAD data te analyseren met XPADxpert</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="101"/>
-        <location filename="../main.cpp" line="106"/>
+        <location filename="../main.cpp" line="112"/>
+        <location filename="../main.cpp" line="117"/>
         <source>File name</source>
         <translation>Bestandsnaam</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="105"/>
+        <location filename="../main.cpp" line="116"/>
         <source>Redirects all log output texts to a file.</source>
         <translation>Stuur alle log uitvoer tekst naar een bestand</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="110"/>
+        <location filename="../main.cpp" line="121"/>
         <source>Qt Quick Controls Style for the 1st launch</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="111"/>
-        <source>style_name</source>
+        <location filename="../main.cpp" line="122"/>
+        <source>Style name</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/welle-gui/i18n/pl_PL.qm b/src/welle-gui/i18n/pl_PL.qm
index 67e256c..4352344 100644
Binary files a/src/welle-gui/i18n/pl_PL.qm and b/src/welle-gui/i18n/pl_PL.qm differ
diff --git a/src/welle-gui/i18n/pl_PL.ts b/src/welle-gui/i18n/pl_PL.ts
index 38976d7..65156bf 100644
--- a/src/welle-gui/i18n/pl_PL.ts
+++ b/src/welle-gui/i18n/pl_PL.ts
@@ -36,73 +36,79 @@
     </message>
     <message>
         <location filename="../android_rtl_sdr.cpp" line="139"/>
-        <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+        <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>CGUIHelper</name>
     <message>
-        <location filename="../gui_helper.cpp" line="65"/>
-        <location filename="../gui_helper.cpp" line="654"/>
+        <location filename="../gui_helper.cpp" line="66"/>
+        <location filename="../gui_helper.cpp" line="699"/>
         <source>Mi&amp;nimize</source>
         <translation>Minimalizuj</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="68"/>
-        <location filename="../gui_helper.cpp" line="655"/>
+        <location filename="../gui_helper.cpp" line="69"/>
+        <location filename="../gui_helper.cpp" line="700"/>
         <source>Ma&amp;ximize</source>
         <translation>Maksymalizuj</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="71"/>
-        <location filename="../gui_helper.cpp" line="656"/>
+        <location filename="../gui_helper.cpp" line="72"/>
+        <location filename="../gui_helper.cpp" line="701"/>
         <source>&amp;Restore</source>
         <translation>Przwróć</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="74"/>
-        <location filename="../gui_helper.cpp" line="657"/>
+        <location filename="../gui_helper.cpp" line="75"/>
+        <location filename="../gui_helper.cpp" line="702"/>
         <source>&amp;Quit</source>
         <translation>&amp;Wyjście</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="127"/>
-        <source>version</source>
-        <translation>wersja</translation>
+        <location filename="../gui_helper.cpp" line="180"/>
+        <source>welle.io version</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="128"/>
-        <source>Git revision</source>
-        <translation>Rewizja Git&apos;a</translation>
+        <location filename="../gui_helper.cpp" line="184"/>
+        <source>Built on</source>
+        <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="129"/>
-        <source>Build on</source>
-        <translation>Zbudowany</translation>
+        <location filename="../gui_helper.cpp" line="302"/>
+        <source>The program will keep running in the system tray. To terminate the program, choose &quot;%1&quot; in the context menu of the system tray entry.</source>
+        <translation type="unfinished">Program będzie kontynuował pracę w zasobniku systemowym. Aby przerwać jego działanie wybierz &quot;%1&quot; w menu ikony w zasobniku systemowym.</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="130"/>
-        <source>QT version</source>
-        <translation>Wersja QT</translation>
+        <location filename="../gui_helper.cpp" line="307"/>
+        <source>Quit</source>
+        <extracomment>&quot;Quit&quot; translation should be the same as the one of system tray</extracomment>
+        <translation type="unfinished">Wyjście</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="283"/>
-        <source>The program will keep running in the system tray. To terminate the program, choose &lt;b&gt;Quit&lt;/b&gt; in the context menu of the system tray entry.</source>
-        <translation>Program będzie kontynuował pracę w zasobniku systemowym. Aby przerwać jego działanie wybierz &lt;b&gt;Wyjście&lt;/b&gt; w menu ikony w zasobniku systemowym.</translation>
+        <location filename="../gui_helper.cpp" line="181"/>
+        <source>Git revision</source>
+        <translation>Rewizja Git&apos;a</translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="778"/>
+        <location filename="../gui_helper.cpp" line="185"/>
+        <source>QT version</source>
+        <translation>Wersja QT</translation>
+    </message>
+    <message>
+        <location filename="../gui_helper.cpp" line="823"/>
         <source> (unavailable, fallback to Default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="782"/>
+        <location filename="../gui_helper.cpp" line="827"/>
         <source>Style of system</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../gui_helper.cpp" line="784"/>
+        <location filename="../gui_helper.cpp" line="829"/>
         <source> (Recommended)</source>
         <translation type="unfinished"></translation>
     </message>
@@ -110,13 +116,13 @@
 <context>
     <name>CRadioController</name>
     <message>
-        <location filename="../radio_controller.cpp" line="608"/>
+        <location filename="../radio_controller.cpp" line="646"/>
         <source>Unknown</source>
         <translation>Nieznany</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="406"/>
-        <location filename="../radio_controller.cpp" line="627"/>
+        <location filename="../radio_controller.cpp" line="443"/>
+        <location filename="../radio_controller.cpp" line="665"/>
         <source>No Station</source>
         <translation>Brak stacji</translation>
     </message>
@@ -126,29 +132,39 @@
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="369"/>
+        <location filename="../radio_controller.cpp" line="255"/>
+        <source>Playback failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="276"/>
+        <source>Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="405"/>
         <source>RAW File</source>
         <translation>Plik RAW</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="382"/>
-        <location filename="../radio_controller.cpp" line="848"/>
+        <location filename="../radio_controller.cpp" line="419"/>
+        <location filename="../radio_controller.cpp" line="904"/>
         <source>Scanning</source>
         <translation>Skanowanie</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="386"/>
-        <location filename="../radio_controller.cpp" line="873"/>
+        <location filename="../radio_controller.cpp" line="423"/>
+        <location filename="../radio_controller.cpp" line="929"/>
         <source>Found channels</source>
         <translation>Znaleziono kanałów</translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="602"/>
+        <location filename="../radio_controller.cpp" line="640"/>
         <source>Playing last station</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../radio_controller.cpp" line="660"/>
+        <location filename="../radio_controller.cpp" line="715"/>
         <source>Radio device is not ready or does not exist.</source>
         <translation>Urządzenie radiowe nie jest gotowe albo nie istnieje.</translation>
     </message>
@@ -190,28 +206,33 @@
         <translation type="unfinished">Nieznany format pliku RAW</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="294"/>
-        <location filename="../../input/rtl_tcp.cpp" line="462"/>
+        <location filename="../../input/rtl_sdr.cpp" line="142"/>
+        <source>Error opening RTL-SDR. See log for details.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../../input/rtl_sdr.cpp" line="306"/>
+        <location filename="../../input/rtl_tcp.cpp" line="549"/>
         <source>ADC overload. Maybe you are using a too high gain.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../../input/rtl_sdr.cpp" line="390"/>
+        <location filename="../../input/rtl_sdr.cpp" line="402"/>
         <source>RTL-SDR is unplugged.</source>
         <translation type="unfinished">RTL-SDR jest odłączone.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="272"/>
+        <location filename="../../input/rtl_tcp.cpp" line="309"/>
         <source>RTL-TCP connection closed.</source>
         <translation type="unfinished">Połączenie RTL-TCP zostało zamknięte.</translation>
     </message>
     <message>
-        <location filename="../../input/rtl_tcp.cpp" line="413"/>
+        <location filename="../../input/rtl_tcp.cpp" line="450"/>
         <source>Connection failed to server </source>
         <translation type="unfinished">Połączenie z serwerem nie powiodło się </translation>
     </message>
     <message>
-        <location filename="../../input/soapy_sdr.cpp" line="91"/>
+        <location filename="../../input/soapy_sdr.cpp" line="109"/>
         <source>Could not load SoapySDR with provided device arguments.</source>
         <translation type="unfinished"></translation>
     </message>
@@ -232,7 +253,7 @@
         <translation>Automatycznie rozpocznij od ostatniej stacji</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/ChannelSettings.qml" line="36"/>
+        <location filename="../QML/settingpages/ChannelSettings.qml" line="37"/>
         <source>Display station name in the window title</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1005,107 +1026,107 @@
 <context>
     <name>GlobalSettings</name>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="68"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="71"/>
         <source>Global settings</source>
         <translation>Ustawienia ogólne</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="72"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="75"/>
         <source>Full screen mode</source>
         <translation>Tryb pełnego ekranu</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="103"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="108"/>
         <source>Language</source>
         <translation type="unfinished">Język</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="110"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="115"/>
         <source>Global receiver settings</source>
         <translation>Ogólne ustawienia odbiornika</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="114"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="119"/>
         <source>Automatic RF gain</source>
         <translation>Automatyczne wzmocnienie</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="134"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="139"/>
         <source>Manual gain</source>
         <translation>Wzmocnienie ręczne</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="140"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="145"/>
         <source>Value: </source>
         <translation>Wartość: </translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="165"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="170"/>
         <source>Auto detect</source>
         <translation>Detekcja automatyczna</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="178"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="187"/>
         <source>None</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="179"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="188"/>
         <source>Airspy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="180"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="189"/>
         <source>rtl-sdr</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="181"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="190"/>
         <source>SoapySDR</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="182"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="191"/>
         <source>rtl-tcp</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="183"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="192"/>
         <source>RAW file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="221"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="230"/>
         <source>Style settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="233"/>
-        <source>Style changed. Please restart welle.io</source>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="242"/>
+        <source>Style changed. Please restart welle.io.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="238"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="247"/>
         <source>Style. Restart to apply.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="251"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="260"/>
         <source>Light</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="252"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="261"/>
         <source>Dark</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="253"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="262"/>
         <source>System</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/GlobalSettings.qml" line="257"/>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="266"/>
         <source>Theme</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1119,119 +1140,229 @@
     </message>
     <message>
         <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="23"/>
-        <source>Amplitude</source>
-        <translation>Amplituda</translation>
-    </message>
-    <message>
-        <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="24"/>
         <source>Samples</source>
         <translation>Próbki</translation>
     </message>
 </context>
+<context>
+    <name>InfoPage</name>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="21"/>
+        <source>Versions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="26"/>
+        <source>Authors</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="31"/>
+        <source>Thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="36"/>
+        <source>Licenses</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>MainView</name>
     <message>
-        <location filename="../QML/MainView.qml" line="172"/>
+        <location filename="../QML/MainView.qml" line="138"/>
+        <source>Stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="139"/>
+        <source>Display or hide stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Stop</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="181"/>
+        <location filename="../QML/MainView.qml" line="186"/>
+        <source>Play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Stop scan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="182"/>
+        <source>Start playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="284"/>
+        <source>Volume (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="289"/>
+        <source>Volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="290"/>
+        <source>Toggle volume slider</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="421"/>
+        <source>Volume set to %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="462"/>
+        <source>Main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="463"/>
+        <source>Show the main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="474"/>
         <source>Settings</source>
         <translation>Ustawienia</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="180"/>
+        <location filename="../QML/MainView.qml" line="482"/>
         <source>Expert Settings</source>
         <translation>Ustawienia zaawansowane</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="188"/>
+        <location filename="../QML/MainView.qml" line="490"/>
         <source>About</source>
         <translation>O programie</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="196"/>
+        <location filename="../QML/MainView.qml" line="498"/>
         <source>Exit</source>
         <translation>Wyjście</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="232"/>
+        <location filename="../QML/MainView.qml" line="534"/>
         <source>All stations</source>
         <translation>Wszystkie stacje</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="233"/>
+        <location filename="../QML/MainView.qml" line="535"/>
         <source>Favorites</source>
         <translation>Ulubione</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="267"/>
+        <location filename="../QML/MainView.qml" line="566"/>
+        <source>Stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="567"/>
+        <source>Show stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="575"/>
         <source>Start station scan</source>
         <translation>Rozpocznij wyszukiwanie stacji</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="279"/>
+        <location filename="../QML/MainView.qml" line="587"/>
         <source>Stop station scan</source>
         <translation>Zakończ wyszukiwanie stacji</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="291"/>
+        <location filename="../QML/MainView.qml" line="599"/>
         <source>Clear station list</source>
         <translation>Wyczyść listę stacji</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="299"/>
+        <location filename="../QML/MainView.qml" line="607"/>
         <source>Station settings</source>
         <translation>Ustawienia stacji</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="312"/>
+        <location filename="../QML/MainView.qml" line="620"/>
         <source>No stations in list</source>
         <translation>Brak stacji na liście</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="349"/>
+        <location filename="../QML/MainView.qml" line="634"/>
+        <source>File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="764"/>
         <source>Manual channel</source>
         <translation>Ustawienia ręczne</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="404"/>
+        <location filename="../QML/MainView.qml" line="816"/>
+        <source>Add</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="817"/>
+        <source>Add a view</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/MainView.qml" line="825"/>
         <source>Service Overview</source>
         <translation type="unfinished">Opis audycji</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="410"/>
+        <location filename="../QML/MainView.qml" line="831"/>
         <source>Service Details</source>
         <translation>Szczegóły transmisji</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="416"/>
+        <location filename="../QML/MainView.qml" line="837"/>
         <source>MOT Slide Show</source>
         <translation>Pokaz slajdów</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="422"/>
+        <location filename="../QML/MainView.qml" line="843"/>
         <source>Spectrum</source>
         <translation>Widmo</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="428"/>
+        <location filename="../QML/MainView.qml" line="849"/>
         <source>Impulse Response</source>
         <translation>Impuls zwrotny</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="434"/>
+        <location filename="../QML/MainView.qml" line="855"/>
         <source>Constellation Diagram</source>
         <translation>Diagram konstelacji</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="440"/>
+        <location filename="../QML/MainView.qml" line="861"/>
         <source>Null Symbol</source>
         <translation>Symbol zerowy</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="446"/>
+        <location filename="../QML/MainView.qml" line="867"/>
         <source>Console Output</source>
         <translation>Wyjście konsoli</translation>
     </message>
     <message>
-        <location filename="../QML/MainView.qml" line="452"/>
+        <location filename="../QML/MainView.qml" line="873"/>
         <source>RAW Recorder</source>
         <translation>Nagrywanie RAW</translation>
     </message>
@@ -1239,20 +1370,15 @@
 <context>
     <name>MotView</name>
     <message>
-        <location filename="../QML/MotView.qml" line="10"/>
+        <location filename="../QML/MotView.qml" line="11"/>
         <source>MOT Slide Show</source>
         <translation>Pokaz slajdów</translation>
     </message>
     <message>
-        <location filename="../QML/MotView.qml" line="27"/>
+        <location filename="../QML/MotView.qml" line="29"/>
         <source>Save all images</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <location filename="../QML/MotView.qml" line="47"/>
-        <source>Latest</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>NullSymbolGraph</name>
@@ -1261,11 +1387,6 @@
         <source>Null Symbol</source>
         <translation>Symbol zerowy</translation>
     </message>
-    <message>
-        <location filename="../QML/expertviews/NullSymbolGraph.qml" line="18"/>
-        <source>Amplitude</source>
-        <translation>Amplituda</translation>
-    </message>
 </context>
 <context>
     <name>RTLSDRSettings</name>
@@ -1276,8 +1397,8 @@
     </message>
     <message>
         <location filename="../QML/settingpages/RTLSDRSettings.qml" line="21"/>
-        <source>Enable bias tee (not from all dongles supported)</source>
-        <translation>Włącz zasilanie anteny (nie wszystkie urządzenia to obsługują)</translation>
+        <source>Enable bias tee (not supported by all dongles)</source>
+        <translation type="unfinished">Włącz zasilanie anteny (nie wszystkie urządzenia to obsługują)</translation>
     </message>
 </context>
 <context>
@@ -1329,17 +1450,17 @@
         <translation>Ustawienia pliku RAW</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="39"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="42"/>
         <source>Open RAW file</source>
         <translation>Otwórz plik RAW</translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="43"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="46"/>
         <source>Currently shown under Android</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/settingpages/RawFileSettings.qml" line="62"/>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="69"/>
         <source>Selected file:</source>
         <translation>Wybrany plik:</translation>
     </message>
@@ -1390,58 +1511,69 @@
         <translation>Aktualny kanał</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="35"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="44"/>
         <source>Frame sync</source>
         <translation>Synchronizacja ramki</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="50"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="58"/>
         <source>FIC CRC</source>
         <translation>FIC CRC</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="66"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="73"/>
         <source>Frame errors</source>
         <translation>Błędy ramki</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
         <source>OK</source>
         <translation>OK</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="36"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="45"/>
         <source>Not synced</source>
         <translation>Brak synchronizacji</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="51"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="59"/>
         <source>Error</source>
         <translation>Błąd</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="72"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="27"/>
         <source>Frequency correction</source>
         <translation>Korekcja częstotliwości</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="77"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="32"/>
         <source>SNR</source>
         <translation></translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="82"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="89"/>
         <source>RS errors</source>
         <translation>Błędy RS</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="87"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Corrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="93"/>
+        <source>Uncorrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="105"/>
         <source>AAC errors</source>
         <translation>Błędy AAC</translation>
     </message>
     <message>
-        <location filename="../QML/expertviews/ServiceDetails.qml" line="92"/>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="111"/>
         <source>DAB date and time</source>
         <translation>Data i czas DAB</translation>
     </message>
@@ -1496,10 +1628,27 @@
         <source>Spectrum</source>
         <translation>Widmo</translation>
     </message>
+</context>
+<context>
+    <name>StationDelegate</name>
     <message>
-        <location filename="../QML/expertviews/SpectrumGraph.qml" line="21"/>
-        <source>Amplitude</source>
-        <translation>Amplituda</translation>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Remove station from favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/StationDelegate.qml" line="155"/>
+        <source>Add station to favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>StationListModel</name>
+    <message>
+        <location filename="../QML/components/StationListModel.qml" line="96"/>
+        <source>Last played station not found.
+Select a station to start playback.</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
@@ -1518,17 +1667,37 @@
 <context>
     <name>ViewBaseFrame</name>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="69"/>
+        <source>%1 title bar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="70"/>
+        <source>%1 title bar to drag the element</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="118"/>
+        <source>%1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="119"/>
+        <source>Show %1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Minimize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="122"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="130"/>
         <source>Maximize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../QML/components/ViewBaseFrame.qml" line="131"/>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="139"/>
         <source>Remove</source>
         <translation>Usuń</translation>
     </message>
@@ -1563,38 +1732,33 @@
         <source>experimental</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <location filename="../QML/components/WSpectrum.qml" line="101"/>
-        <source>Sensitivity</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>main</name>
     <message>
-        <location filename="../main.cpp" line="101"/>
-        <location filename="../main.cpp" line="106"/>
+        <location filename="../main.cpp" line="112"/>
+        <location filename="../main.cpp" line="117"/>
         <source>File name</source>
         <translation>Nazwa pliku</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="100"/>
+        <location filename="../main.cpp" line="111"/>
         <source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
         <translation>Zapisuje ramki DAB (*.mp3) lub superramki DAB+z kodowaniem RS (*.dab). Ten plik może być użyty do analizy danych X-PAD przy pomocy XPADxpert</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="105"/>
+        <location filename="../main.cpp" line="116"/>
         <source>Redirects all log output texts to a file.</source>
         <translation>Przekierowuje teksty logów do pliku.</translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="110"/>
+        <location filename="../main.cpp" line="121"/>
         <source>Qt Quick Controls Style for the 1st launch</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <location filename="../main.cpp" line="111"/>
-        <source>style_name</source>
+        <location filename="../main.cpp" line="122"/>
+        <source>Style name</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/welle-gui/i18n/ru_RU.qm b/src/welle-gui/i18n/ru_RU.qm
index 46073f1..9e7d98a 100644
Binary files a/src/welle-gui/i18n/ru_RU.qm and b/src/welle-gui/i18n/ru_RU.qm differ
diff --git a/src/welle-gui/i18n/ru_RU.ts b/src/welle-gui/i18n/ru_RU.ts
index a3c1bf1..d610f62 100644
--- a/src/welle-gui/i18n/ru_RU.ts
+++ b/src/welle-gui/i18n/ru_RU.ts
@@ -4,6 +4,7 @@
 <context>
     <name>ActivityResultReceiver</name>
     <message>
+        <location filename="../android_rtl_sdr.cpp" line="+178"/>
         <source>Android RTL-SDR driver is not installed</source>
         <translation type="unfinished"></translation>
     </message>
@@ -11,10 +12,12 @@
 <context>
     <name>AirspySettings</name>
     <message>
+        <location filename="../QML/settingpages/AirspySettings.qml" line="+12"/>
         <source>Airspy settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+15"/>
         <source>Enable bias tee</source>
         <translation type="unfinished"></translation>
     </message>
@@ -22,159 +25,227 @@
 <context>
     <name>CAndroid_RTL_SDR</name>
     <message>
+        <location filename="../android_rtl_sdr.cpp" line="-41"/>
         <source>OK</source>
         <translation type="unfinished">Ок</translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Cancel</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Android RTL-SDR driver is not installed. Do you would like to install it? After install start welle.io again.</source>
+        <location line="+1"/>
+        <source>Android RTL-SDR driver is not installed. Would you like to install it? After installation start welle.io again.</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>CGUIHelper</name>
     <message>
+        <location filename="../gui_helper.cpp" line="+66"/>
+        <location line="+633"/>
         <source>Mi&amp;nimize</source>
         <translation type="unfinished">Св&amp;ернуть</translation>
     </message>
     <message>
+        <location line="-630"/>
+        <location line="+631"/>
         <source>Ma&amp;ximize</source>
         <translation type="unfinished">Ра&amp;звернуть</translation>
     </message>
     <message>
+        <location line="-628"/>
+        <location line="+629"/>
         <source>&amp;Restore</source>
         <translation type="unfinished">&amp;Восстановить</translation>
     </message>
     <message>
+        <location line="-626"/>
+        <location line="+627"/>
         <source>&amp;Quit</source>
         <translation type="unfinished">&amp;Выход</translation>
     </message>
     <message>
-        <source>version</source>
-        <translation type="unfinished">версия</translation>
-    </message>
-    <message>
+        <location line="-521"/>
         <source>Git revision</source>
         <translation type="unfinished">Git ревизия</translation>
     </message>
     <message>
-        <source>Build on</source>
-        <translation type="unfinished">Выпуск</translation>
-    </message>
-    <message>
+        <location line="+4"/>
         <source>QT version</source>
         <translation type="unfinished">Версия QT</translation>
     </message>
     <message>
-        <source>The program will keep running in the system tray. To terminate the program, choose &lt;b&gt;Quit&lt;/b&gt; in the context menu of the system tray entry.</source>
-        <translation type="unfinished">Программа будет продолжать работать в системном трее. Чтобы завершить программу, выберите &lt;b&gt;Выход&lt;/b&gt; в контекстном меню программы в системном трее.</translation>
-    </message>
-    <message>
+        <location line="+638"/>
         <source> (unavailable, fallback to Default)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+4"/>
         <source>Style of system</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+2"/>
         <source> (Recommended)</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-649"/>
+        <source>welle.io version</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+4"/>
+        <source>Built on</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+118"/>
+        <source>The program will keep running in the system tray. To terminate the program, choose &quot;%1&quot; in the context menu of the system tray entry.</source>
+        <translation type="unfinished">Программа будет продолжать работать в системном трее. Чтобы завершить программу, выберите &quot;%1&quot; в контекстном меню программы в системном трее.</translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Quit</source>
+        <extracomment>&quot;Quit&quot; translation should be the same as the one of system tray</extracomment>
+        <translation type="unfinished">Выход</translation>
+    </message>
 </context>
 <context>
     <name>CRadioController</name>
     <message>
+        <location filename="../radio_controller.cpp" line="+646"/>
         <source>Unknown</source>
         <translation>Неизвестный</translation>
     </message>
     <message>
+        <location line="-203"/>
+        <location line="+222"/>
         <source>No Station</source>
         <translation>Нет каналов</translation>
     </message>
     <message>
+        <location line="-260"/>
         <source>RAW File</source>
         <translation>RAW файл</translation>
     </message>
     <message>
+        <location line="+14"/>
+        <location line="+485"/>
         <source>Scanning</source>
         <translation>Сканирование</translation>
     </message>
     <message>
+        <location line="-481"/>
+        <location line="+506"/>
         <source>Found channels</source>
         <translation>Найдено каналов</translation>
     </message>
     <message>
+        <location line="-214"/>
         <source>Radio device is not ready or does not exist.</source>
         <translation>Устройство не работает или отключено.</translation>
     </message>
     <message>
+        <location filename="../../input/airspy_sdr.cpp" line="+152"/>
         <source>airspy is unplugged.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../input/input_factory.cpp" line="+79"/>
         <source>No valid device found use Null device instead.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+2"/>
+        <location line="+43"/>
         <source>Error while opening device</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../input/raw_file.cpp" line="+177"/>
+        <location line="+20"/>
         <source>Cannot open file </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+113"/>
         <source>End of file, restarting</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+3"/>
         <source>End of file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+88"/>
         <source>Unknown RAW file format</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../input/rtl_sdr.cpp" line="+306"/>
+        <location filename="../../input/rtl_tcp.cpp" line="+549"/>
         <source>ADC overload. Maybe you are using a too high gain.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+96"/>
         <source>RTL-SDR is unplugged.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../input/rtl_tcp.cpp" line="-240"/>
         <source>RTL-TCP connection closed.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+141"/>
         <source>Connection failed to server </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../../input/soapy_sdr.cpp" line="+109"/>
         <source>Could not load SoapySDR with provided device arguments.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location filename="../radio_controller.cpp" line="-563"/>
         <source>Error while opening file </source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+488"/>
         <source>Playing last station</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location filename="../../input/rtl_sdr.cpp" line="-260"/>
+        <source>Error opening RTL-SDR. See log for details.</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location filename="../radio_controller.cpp" line="-385"/>
+        <source>Playback failed</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+21"/>
+        <source>Stopped</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>ChannelSettings</name>
     <message>
+        <location filename="../QML/settingpages/ChannelSettings.qml" line="+29"/>
         <source>Automatic start playing last station</source>
         <translation>Автоматически начинать воспроизведение последнего канала</translation>
     </message>
     <message>
+        <location line="+8"/>
         <source>Display station name in the window title</source>
         <translation type="unfinished"></translation>
     </message>
@@ -182,14 +253,17 @@
 <context>
     <name>ConstellationGraph</name>
     <message>
+        <location filename="../QML/expertviews/ConstellationGraph.qml" line="+10"/>
         <source>Constellation Diagram</source>
         <translation type="unfinished">Диаграмма созвездий</translation>
     </message>
     <message>
+        <location line="+30"/>
         <source>DQPSK Angle [Degree]</source>
         <translation type="unfinished">ДКФМ угол (градусы)</translation>
     </message>
     <message>
+        <location line="+7"/>
         <source>Subcarrier</source>
         <translation type="unfinished">Поднесущая</translation>
     </message>
@@ -197,542 +271,678 @@
 <context>
     <name>DABConstants</name>
     <message>
+        <location filename="../../backend/dab-constants.cpp" line="+184"/>
         <source>News</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Current Affairs</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Information</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Sport</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Education</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Drama</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Arts</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Science</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Talk</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Pop Music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Rock Music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Easy Listening</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Light classical</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Classical Music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Other Music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Weather</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Finance</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Children&apos;s</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Factual</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Religion</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Phone In</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Travel</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Leisure</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Jazz and Blues</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Country Music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>National Music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Oldies Music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Folk Music</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Documentary</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>entry 30 not used</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>entry 31 not used</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
+        <location line="+117"/>
         <source>UNKNOWN</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="-103"/>
         <source>Albanian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Breton</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Catalan</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Croatian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Welsh</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Czech</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Danish</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>German</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>English</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Spanish</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Esperanto</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Estonian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Basque</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Faroese</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>French</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Frisian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Irish</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Gaelic</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Galician</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Icelandic</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Italian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Lappish</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Latin</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Latvian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Luxembourgian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Lithuanian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Hungarian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Maltese</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Dutch</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Norwegian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Occitan</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Polish</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Portuguese</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Romanian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Romansh</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Serbian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Slovak</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Slovene</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Finnish</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Swedish</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Turkish</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Flemish</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Walloon</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Background sound/clean feed</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Zulu</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Vietnamese</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Uzbek</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Urdu</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Ukranian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Thai</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Telugu</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Tatar</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Tamil</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Tadzhik</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Swahili</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Sranan Tongo</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Somali</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Sinhalese</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Shona</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Serbo-Croat</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Rusyn</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Russian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Quechua</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Pushtu</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Punjabi</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Persian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Papiamento</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Oriya</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Nepali</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Ndebele</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Marathi</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Moldavian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Malaysian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Malagasay</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Macedonian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Laotian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Korean</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Khmer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Kazakh</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Kannada</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Japanese</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Indonesian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Hindi</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Hebrew</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Hausa</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Gurani</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Gujurati</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Greek</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Georgian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Fulani</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Dari</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Chuvash</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Chinese</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Burmese</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Bulgarian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Bengali</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Belorussian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Bambora</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Azerbaijani</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Assamese</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Armenian</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Arabic</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Amharic</source>
         <translation type="unfinished"></translation>
     </message>
@@ -740,54 +950,67 @@
 <context>
     <name>ExpertSettings</name>
     <message>
+        <location filename="../QML/settingpages/ExpertSettings.qml" line="+33"/>
         <source>Global</source>
         <translation type="unfinished">Основные параметры</translation>
     </message>
     <message>
+        <location line="+4"/>
         <source>Expert mode</source>
         <translation type="unfinished">Расширенный режим</translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Backend</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+7"/>
         <source>Enable coarse corrector (for receivers with &gt;1kHz error)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+17"/>
         <source>GetMiddle</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>CorrelatePRS</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>PatternOfZeros</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+12"/>
         <source>Coarse corrector algorithm</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+8"/>
         <source>Enable TII decoding to console log (increases CPU usage)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+16"/>
         <source>Strongest Peak</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Earliest Peak With Binning</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Threshold Before Peak</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+12"/>
         <source>FFT Window placement algorithm</source>
         <translation type="unfinished"></translation>
     </message>
@@ -795,252 +1018,410 @@
 <context>
     <name>GlobalSettings</name>
     <message>
+        <location filename="../QML/settingpages/GlobalSettings.qml" line="+75"/>
         <source>Full screen mode</source>
         <translation>Полноэкранный режим</translation>
     </message>
     <message>
+        <location line="+44"/>
         <source>Automatic RF gain</source>
         <translation>Автоматический уровень</translation>
     </message>
     <message>
+        <location line="+20"/>
         <source>Manual gain</source>
         <translation>Ручной уровень</translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Value: </source>
         <translation>Значение: </translation>
     </message>
     <message>
+        <location line="-74"/>
         <source>Global settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+37"/>
         <source>Language</source>
         <translation type="unfinished">Язык</translation>
     </message>
     <message>
+        <location line="+7"/>
         <source>Global receiver settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+55"/>
         <source>Auto detect</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+17"/>
         <source>None</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Airspy</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>rtl-sdr</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>SoapySDR</source>
         <translation type="unfinished">Параметры SoapySDR</translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>rtl-tcp</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>RAW file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+38"/>
         <source>Style settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Style changed. Please restart welle.io</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
+        <location line="+17"/>
         <source>Style. Restart to apply.</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+13"/>
         <source>Light</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Dark</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>System</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+4"/>
         <source>Theme</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-24"/>
+        <source>Style changed. Please restart welle.io.</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>ImpulseResponseGraph</name>
     <message>
+        <location filename="../QML/expertviews/ImpulseResponseGraph.qml" line="+12"/>
         <source>Impulse Response</source>
         <translation type="unfinished">Импульсная характеристика</translation>
     </message>
     <message>
-        <source>Amplitude</source>
-        <translation type="unfinished">Амплитуда</translation>
-    </message>
-    <message>
+        <location line="+11"/>
         <source>Samples</source>
         <translation type="unfinished">Отсчеты</translation>
     </message>
 </context>
+<context>
+    <name>InfoPage</name>
+    <message>
+        <location filename="../QML/InfoPage.qml" line="+21"/>
+        <source>Versions</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Authors</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Thanks</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Licenses</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
 <context>
     <name>MainView</name>
     <message>
+        <location filename="../QML/MainView.qml" line="+474"/>
         <source>Settings</source>
         <translation>Настройки</translation>
     </message>
     <message>
+        <location line="+8"/>
         <source>Expert Settings</source>
         <translation>Расширенные настройки</translation>
     </message>
     <message>
+        <location line="+8"/>
         <source>About</source>
         <translation>О программе</translation>
     </message>
     <message>
+        <location line="+8"/>
         <source>Exit</source>
         <translation>Выход</translation>
     </message>
     <message>
+        <location line="+36"/>
         <source>All stations</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Favorites</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+40"/>
         <source>Start station scan</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+12"/>
         <source>Stop station scan</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+12"/>
         <source>Clear station list</source>
         <translation type="unfinished">Очистка списка каналов</translation>
     </message>
     <message>
+        <location line="+8"/>
         <source>Station settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+13"/>
         <source>No stations in list</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+144"/>
         <source>Manual channel</source>
         <translation type="unfinished">Ручной поиск</translation>
     </message>
     <message>
+        <location line="+61"/>
         <source>Service Overview</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Service Details</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>MOT Slide Show</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Spectrum</source>
         <translation type="unfinished">Спектральная диаграмма</translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Impulse Response</source>
         <translation type="unfinished">Импульсная характеристика</translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Constellation Diagram</source>
         <translation type="unfinished">Диаграмма созвездий</translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Null Symbol</source>
         <translation type="unfinished">Пустой символ</translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Console Output</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>RAW Recorder</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-735"/>
+        <source>Stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Display or hide stations list</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+42"/>
+        <location line="+5"/>
+        <source>Stop</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-5"/>
+        <location line="+5"/>
+        <source>Play</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="-4"/>
+        <source>Stop playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Stop scan</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Start playback</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+102"/>
+        <source>Volume (%1)</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+5"/>
+        <source>Volume</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Toggle volume slider</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+131"/>
+        <source>Volume set to %1</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+41"/>
+        <source>Main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Show the main menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+103"/>
+        <source>Stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Show stations menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+67"/>
+        <source>File</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+182"/>
+        <source>Add</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Add a view</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>MotView</name>
     <message>
+        <location filename="../QML/MotView.qml" line="+11"/>
         <source>MOT Slide Show</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+18"/>
         <source>Save all images</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <source>Latest</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>NullSymbolGraph</name>
     <message>
+        <location filename="../QML/expertviews/NullSymbolGraph.qml" line="+10"/>
         <source>Null Symbol</source>
         <translation type="unfinished">Пустой символ</translation>
     </message>
-    <message>
-        <source>Amplitude</source>
-        <translation type="unfinished">Амплитуда</translation>
-    </message>
 </context>
 <context>
     <name>RTLSDRSettings</name>
     <message>
+        <location filename="../QML/settingpages/RTLSDRSettings.qml" line="+12"/>
         <source>rtl-sdr settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>Enable bias tee (not from all dongles supported)</source>
+        <location line="+9"/>
+        <source>Enable bias tee (not supported by all dongles)</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>RTLTCPSettings</name>
     <message>
+        <location filename="../QML/settingpages/RTLTCPSettings.qml" line="+11"/>
         <source>rtl-tcp settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+16"/>
         <source>Use host name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+10"/>
         <source>IP address</source>
         <translation type="unfinished">IP адрес</translation>
     </message>
     <message>
+        <location line="+31"/>
         <source>IP port</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+16"/>
         <source>Enter host name</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+4"/>
         <source>Host name</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1048,6 +1429,7 @@
 <context>
     <name>RadioView</name>
     <message>
+        <location filename="../QML/RadioView.qml" line="+12"/>
         <source>Service Overview</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1055,18 +1437,22 @@
 <context>
     <name>RawFileSettings</name>
     <message>
+        <location filename="../QML/settingpages/RawFileSettings.qml" line="+12"/>
         <source>RAW file settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+30"/>
         <source>Open RAW file</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+4"/>
         <source>Currently shown under Android</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+23"/>
         <source>Selected file:</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1074,22 +1460,27 @@
 <context>
     <name>RawRecorder</name>
     <message>
+        <location filename="../QML/expertviews/RawRecorder.qml" line="+11"/>
         <source>I/Q RAW Recorder (experimental)</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+8"/>
         <source>Ring buffer length [s]</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+14"/>
         <source>Save ring buffer</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+0"/>
         <source>Init</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+14"/>
         <source>Ring buffer size (roughly): </source>
         <translation type="unfinished"></translation>
     </message>
@@ -1097,93 +1488,127 @@
 <context>
     <name>ServiceDetails</name>
     <message>
+        <location filename="../QML/expertviews/ServiceDetails.qml" line="+10"/>
         <source>Service Details</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+7"/>
         <source>Device</source>
         <translation type="unfinished">Устройство</translation>
     </message>
     <message>
+        <location line="+5"/>
         <source>Current channel</source>
         <translation type="unfinished">Текущий канал</translation>
     </message>
     <message>
+        <location line="+22"/>
         <source>Frame sync</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+1"/>
+        <location line="+14"/>
+        <location line="+33"/>
         <source>OK</source>
         <translation type="unfinished">Ок</translation>
     </message>
     <message>
+        <location line="-47"/>
         <source>Not synced</source>
         <translation type="unfinished">Не синхронизировано</translation>
     </message>
     <message>
+        <location line="+13"/>
         <source>FIC CRC</source>
         <translation type="unfinished">FIC CRC</translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Error</source>
         <translation type="unfinished">Ошибка</translation>
     </message>
     <message>
+        <location line="+14"/>
         <source>Frame errors</source>
         <translation type="unfinished">Ошибки кадра</translation>
     </message>
     <message>
+        <location line="-46"/>
         <source>Frequency correction</source>
         <translation type="unfinished">Коррекция частоты</translation>
     </message>
     <message>
+        <location line="+5"/>
         <source>SNR</source>
         <translation type="unfinished">Шум</translation>
     </message>
     <message>
+        <location line="+57"/>
         <source>RS errors</source>
         <translation type="unfinished">Ошибки RS</translation>
     </message>
     <message>
+        <location line="+16"/>
         <source>AAC errors</source>
         <translation type="unfinished">Ошибки AAC</translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>DAB date and time</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-18"/>
+        <source>Corrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+0"/>
+        <source>Uncorrected Error</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>SoapySDRSettings</name>
     <message>
+        <location filename="../QML/settingpages/SoapySDRSettings.qml" line="+11"/>
         <source>SoapySDR settings</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+13"/>
         <source>Antenna</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Enter antenna</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Clock source</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Enter clock source</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Driver arguments</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Enter driver arguments</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+6"/>
         <source>Apply</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1191,21 +1616,42 @@
 <context>
     <name>SpectrumGraph</name>
     <message>
+        <location filename="../QML/expertviews/SpectrumGraph.qml" line="+12"/>
         <source>Spectrum</source>
         <translation type="unfinished">Спектральная диаграмма</translation>
     </message>
+</context>
+<context>
+    <name>StationDelegate</name>
+    <message>
+        <location filename="../QML/components/StationDelegate.qml" line="+155"/>
+        <source>Remove station from favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
     <message>
-        <source>Amplitude</source>
-        <translation type="unfinished">Амплитуда</translation>
+        <location line="+0"/>
+        <source>Add station to favorites</source>
+        <translation type="unfinished"></translation>
+    </message>
+</context>
+<context>
+    <name>StationListModel</name>
+    <message>
+        <location filename="../QML/components/StationListModel.qml" line="+96"/>
+        <source>Last played station not found.
+Select a station to start playback.</source>
+        <translation type="unfinished"></translation>
     </message>
 </context>
 <context>
     <name>TextOutputView</name>
     <message>
+        <location filename="../QML/expertviews/TextOutputView.qml" line="+11"/>
         <source>Console Output</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+58"/>
         <source>Warning: The console view can slow down the complete app!</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1213,21 +1659,45 @@
 <context>
     <name>ViewBaseFrame</name>
     <message>
+        <location filename="../QML/components/ViewBaseFrame.qml" line="+130"/>
         <source>Minimize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+0"/>
         <source>Maximize</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+9"/>
         <source>Remove</source>
         <translation type="unfinished"></translation>
     </message>
+    <message>
+        <location line="-70"/>
+        <source>%1 title bar</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>%1 title bar to drag the element</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+48"/>
+        <source>%1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
+    <message>
+        <location line="+1"/>
+        <source>Show %1 menu</source>
+        <translation type="unfinished"></translation>
+    </message>
 </context>
 <context>
     <name>WDialog</name>
     <message>
+        <location filename="../QML/components/WDialog.qml" line="+32"/>
         <source>‹</source>
         <translation type="unfinished"></translation>
     </message>
@@ -1235,46 +1705,52 @@
 <context>
     <name>WSpectrum</name>
     <message>
+        <location filename="../QML/components/WSpectrum.qml" line="+15"/>
         <source>Amplitude</source>
         <translation type="unfinished">Амплитуда</translation>
     </message>
     <message>
+        <location line="+1"/>
         <source>Frequency</source>
         <translation type="unfinished">Частота</translation>
     </message>
     <message>
+        <location line="+23"/>
         <source>Waterfall</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+0"/>
         <source>experimental</source>
         <translation type="unfinished"></translation>
     </message>
-    <message>
-        <source>Sensitivity</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>main</name>
     <message>
+        <location filename="../main.cpp" line="+112"/>
+        <location line="+5"/>
         <source>File name</source>
         <translation>Имя файла</translation>
     </message>
     <message>
+        <location line="-1"/>
         <source>Redirects all log output texts to a file.</source>
         <translation>Сохранить все логи в файл.</translation>
     </message>
     <message>
+        <location line="-5"/>
         <source>Records DAB frames (*.mp2) or DAB+ superframes with RS coding (*.dab). This file can be used to analyse X-PAD data with XPADxpert</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
+        <location line="+10"/>
         <source>Qt Quick Controls Style for the 1st launch</source>
         <translation type="unfinished"></translation>
     </message>
     <message>
-        <source>style_name</source>
+        <location line="+1"/>
+        <source>Style name</source>
         <translation type="unfinished"></translation>
     </message>
 </context>
diff --git a/src/welle-gui/icons/111476-media-and-technology.zip b/src/welle-gui/icons/111476-media-and-technology.zip
new file mode 100644
index 0000000..bb39371
Binary files /dev/null and b/src/welle-gui/icons/111476-media-and-technology.zip differ
diff --git a/src/welle-gui/icons/111476-media-and-technology_README.txt b/src/welle-gui/icons/111476-media-and-technology_README.txt
new file mode 100644
index 0000000..186f997
--- /dev/null
+++ b/src/welle-gui/icons/111476-media-and-technology_README.txt
@@ -0,0 +1,3 @@
+Source: 111476-media-and-technology.zip
+
+<div>Icons made by <a href="https://www.freepik.com" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a></div>
diff --git a/src/welle-gui/icons/welle_io_icons/074-music.svg b/src/welle-gui/icons/welle_io_icons/074-music.svg
new file mode 100644
index 0000000..6ffa1d4
--- /dev/null
+++ b/src/welle-gui/icons/welle_io_icons/074-music.svg
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 284.707 284.707" style="enable-background:new 0 0 284.707 284.707;" xml:space="preserve">
+<g>
+	<path style="fill:#000002;" d="M40.013,71.088H17.5c-9.649,0-17.5,7.851-17.5,17.5v95.171c0,9.649,7.851,17.5,17.5,17.5h22.513
+		c9.649,0,17.5-7.851,17.5-17.5V88.588C57.513,78.938,49.662,71.088,40.013,71.088z M42.513,183.759c0,1.355-1.145,2.5-2.5,2.5H17.5
+		c-1.355,0-2.5-1.145-2.5-2.5V88.588c0-1.355,1.145-2.5,2.5-2.5h22.513c1.355,0,2.5,1.145,2.5,2.5V183.759z"/>
+	<path style="fill:#000002;" d="M213.249,139.6c-8.322,0-16.309,1.444-23.743,4.071V15.628c0-5.457-2.327-9.851-6.385-12.054
+		c-4.058-2.204-9.01-1.762-13.586,1.211L80.002,62.939C73.273,67.309,68.2,76.654,68.2,84.676v102.995
+		c0,8.021,5.073,17.367,11.801,21.737l89.777,58.312c12.053,9.27,27.125,14.799,43.47,14.799c39.402,0,71.458-32.056,71.458-71.459
+		C284.707,171.656,252.651,139.6,213.249,139.6z M269.707,211.059c0,12.696-4.215,24.426-11.315,33.867l-79.01-79.01
+		c9.441-7.101,21.171-11.316,33.868-11.316C244.38,154.6,269.707,179.927,269.707,211.059z M83.2,187.671V84.676
+		c0-2.936,2.509-7.558,4.972-9.158l86.334-56.075v131.619c-19.667,12.744-32.716,34.868-32.716,59.997
+		c0,8.082,1.368,15.847,3.852,23.097l-57.47-37.328C85.71,195.229,83.2,190.607,83.2,187.671z M186.696,260.867
+		c-0.192-0.154-0.394-0.301-0.605-0.438l-7.669-4.981c-13.157-10.346-21.632-26.391-21.632-44.388
+		c0-13.038,4.454-25.048,11.905-34.616l79.171,79.17c-9.568,7.451-21.578,11.905-34.616,11.905
+		C203.655,267.518,194.616,265.106,186.696,260.867z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/src/welle-gui/icons/welle_io_icons/090-sound.svg b/src/welle-gui/icons/welle_io_icons/090-sound.svg
new file mode 100644
index 0000000..41b71e4
--- /dev/null
+++ b/src/welle-gui/icons/welle_io_icons/090-sound.svg
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 284.318 284.318" style="enable-background:new 0 0 284.318 284.318;" xml:space="preserve">
+<g>
+	<path style="fill:#000002;" d="M260.494,68.611c-2.574-3.244-7.292-3.788-10.537-1.213c-3.245,2.575-3.788,7.292-1.213,10.537
+		c12.499,15.75,20.574,40.858,20.574,63.964c0,23.321-8.224,48.618-20.952,64.447c-2.596,3.227-2.083,7.948,1.145,10.544
+		c1.385,1.114,3.045,1.656,4.695,1.656c2.194,0,4.368-0.958,5.85-2.801c14.739-18.329,24.263-47.315,24.263-73.846
+		C284.318,115.617,274.967,86.849,260.494,68.611z"/>
+	<path style="fill:#000002;" d="M211.401,92.064c-3.245,2.575-3.788,7.292-1.214,10.537c6.959,8.771,12.01,25.34,12.01,39.397
+		c0,14.181-5.145,30.869-12.233,39.68c-2.596,3.228-2.085,7.948,1.143,10.545c1.386,1.115,3.046,1.657,4.696,1.657
+		c2.193,0,4.367-0.958,5.849-2.799c10.739-13.349,15.546-34.27,15.546-49.082c0-14.677-4.718-35.434-15.259-48.72
+		C219.362,90.033,214.646,89.49,211.401,92.064z"/>
+	<path style="fill:#000002;" d="M177.606,8.181c-2.711,0-5.427,0.871-8.073,2.59L80,68.925c-6.728,4.37-11.801,13.715-11.801,21.737
+		v102.995c0,8.023,5.073,17.367,11.801,21.737l89.533,58.153c2.645,1.719,5.361,2.59,8.073,2.59c5.913,0,11.899-4.614,11.899-13.433
+		V21.614C189.505,12.795,183.519,8.181,177.606,8.181z M174.505,258.889l-86.334-56.075c-2.462-1.6-4.972-6.221-4.972-9.158V90.661
+		c0-2.936,2.509-7.558,4.972-9.158l86.334-56.075V258.889z"/>
+	<path style="fill:#000002;" d="M40.012,77.074H17.5c-9.649,0-17.5,7.851-17.5,17.5v95.171c0,9.649,7.851,17.5,17.5,17.5h22.512
+		c9.649,0,17.5-7.851,17.5-17.5V94.574C57.512,84.924,49.661,77.074,40.012,77.074z M42.512,189.744c0,1.355-1.145,2.5-2.5,2.5H17.5
+		c-1.355,0-2.5-1.145-2.5-2.5V94.574c0-1.355,1.145-2.5,2.5-2.5h22.512c1.355,0,2.5,1.145,2.5,2.5V189.744z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/src/welle-gui/icons/welle_io_icons/136-stop button.svg b/src/welle-gui/icons/welle_io_icons/136-stop button.svg
new file mode 100644
index 0000000..c69e634
--- /dev/null
+++ b/src/welle-gui/icons/welle_io_icons/136-stop button.svg	
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 265.405 265.405" style="enable-background:new 0 0 265.405 265.405;" xml:space="preserve">
+<g>
+	<path style="fill:#000002;" d="M132.703,0C59.53,0,0,59.53,0,132.702s59.53,132.702,132.703,132.702
+		c73.172,0,132.702-59.53,132.702-132.702S205.875,0,132.703,0z M132.703,250.405C67.801,250.405,15,197.604,15,132.702
+		S67.801,15,132.703,15c64.901,0,117.702,52.801,117.702,117.702S197.604,250.405,132.703,250.405z"/>
+	<path style="fill:#000002;" d="M174.816,73.089H90.589c-9.649,0-17.5,7.851-17.5,17.5v84.227c0,9.649,7.851,17.5,17.5,17.5h84.227
+		c9.649,0,17.5-7.851,17.5-17.5V90.589C192.316,80.94,184.465,73.089,174.816,73.089z M177.316,174.816c0,1.355-1.145,2.5-2.5,2.5
+		H90.589c-1.355,0-2.5-1.145-2.5-2.5V90.589c0-1.355,1.145-2.5,2.5-2.5h84.227c1.355,0,2.5,1.145,2.5,2.5V174.816z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/src/welle-gui/icons/welle_io_icons/147-play arrow.svg b/src/welle-gui/icons/welle_io_icons/147-play arrow.svg
new file mode 100644
index 0000000..35068cc
--- /dev/null
+++ b/src/welle-gui/icons/welle_io_icons/147-play arrow.svg	
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- Generator: Adobe Illustrator 17.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 265.404 265.404" style="enable-background:new 0 0 265.404 265.404;" xml:space="preserve">
+<g>
+	<path style="fill:#000002;" d="M194.172,123.684l-78.081-51.122c-1.921-1.257-4.032-1.922-6.106-1.922
+		c-5.521,0-9.686,4.496-9.686,10.458v103.207c0,5.962,4.164,10.458,9.685,10.458c2.075,0,4.187-0.665,6.106-1.923l78.082-51.129
+		c3.251-2.129,5.117-5.415,5.116-9.014C199.289,129.098,197.424,125.814,194.172,123.684z M115.3,175.429V89.973l65.256,42.725
+		L115.3,175.429z"/>
+	<path style="fill:#000002;" d="M132.702,0.001C59.53,0.001,0,59.53,0,132.702c0,73.172,59.53,132.702,132.702,132.702
+		s132.702-59.53,132.702-132.702C265.404,59.53,205.875,0.001,132.702,0.001z M132.702,250.404
+		C67.801,250.404,15,197.603,15,132.702C15,67.801,67.801,15.001,132.702,15.001s117.702,52.8,117.702,117.701
+		C250.404,197.603,197.604,250.404,132.702,250.404z"/>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+<g>
+</g>
+</svg>
diff --git a/src/welle-gui/icons/welle_io_icons/20x20/play.png b/src/welle-gui/icons/welle_io_icons/20x20/play.png
new file mode 100644
index 0000000..49b44ad
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20/play.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20/speaker.png b/src/welle-gui/icons/welle_io_icons/20x20/speaker.png
index 804be4a..8a979fa 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20/speaker.png and b/src/welle-gui/icons/welle_io_icons/20x20/speaker.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20/speaker_mute.png b/src/welle-gui/icons/welle_io_icons/20x20/speaker_mute.png
index f7a7184..08c5d25 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20/speaker_mute.png and b/src/welle-gui/icons/welle_io_icons/20x20/speaker_mute.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20/stop.png b/src/welle-gui/icons/welle_io_icons/20x20/stop.png
new file mode 100644
index 0000000..1943f36
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20/stop.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@2/play.png b/src/welle-gui/icons/welle_io_icons/20x20@2/play.png
new file mode 100644
index 0000000..1d91f0e
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@2/play.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@2/speaker.png b/src/welle-gui/icons/welle_io_icons/20x20@2/speaker.png
index b5b4e10..3c1cd29 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@2/speaker.png and b/src/welle-gui/icons/welle_io_icons/20x20@2/speaker.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@2/speaker_mute.png b/src/welle-gui/icons/welle_io_icons/20x20@2/speaker_mute.png
index 8ebd1f7..eba6a96 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@2/speaker_mute.png and b/src/welle-gui/icons/welle_io_icons/20x20@2/speaker_mute.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@2/stop.png b/src/welle-gui/icons/welle_io_icons/20x20@2/stop.png
new file mode 100644
index 0000000..2e01bb4
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@2/stop.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@3/play.png b/src/welle-gui/icons/welle_io_icons/20x20@3/play.png
new file mode 100644
index 0000000..2ee1622
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@3/play.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@3/speaker.png b/src/welle-gui/icons/welle_io_icons/20x20@3/speaker.png
index ec0ca18..712e35b 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@3/speaker.png and b/src/welle-gui/icons/welle_io_icons/20x20@3/speaker.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@3/speaker_mute.png b/src/welle-gui/icons/welle_io_icons/20x20@3/speaker_mute.png
index b3c8457..0dd5cae 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@3/speaker_mute.png and b/src/welle-gui/icons/welle_io_icons/20x20@3/speaker_mute.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@3/stop.png b/src/welle-gui/icons/welle_io_icons/20x20@3/stop.png
new file mode 100644
index 0000000..f6b80fd
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@3/stop.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@4/play.png b/src/welle-gui/icons/welle_io_icons/20x20@4/play.png
new file mode 100644
index 0000000..cc5e58d
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@4/play.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@4/speaker.png b/src/welle-gui/icons/welle_io_icons/20x20@4/speaker.png
index 7dabce0..eb93744 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@4/speaker.png and b/src/welle-gui/icons/welle_io_icons/20x20@4/speaker.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@4/speaker_mute.png b/src/welle-gui/icons/welle_io_icons/20x20@4/speaker_mute.png
index aa78bcf..49c92d1 100644
Binary files a/src/welle-gui/icons/welle_io_icons/20x20@4/speaker_mute.png and b/src/welle-gui/icons/welle_io_icons/20x20@4/speaker_mute.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/20x20@4/stop.png b/src/welle-gui/icons/welle_io_icons/20x20@4/stop.png
new file mode 100644
index 0000000..2d32223
Binary files /dev/null and b/src/welle-gui/icons/welle_io_icons/20x20@4/stop.png differ
diff --git a/src/welle-gui/icons/welle_io_icons/speaker.svg b/src/welle-gui/icons/welle_io_icons/speaker.svg
deleted file mode 100644
index 996421e..0000000
--- a/src/welle-gui/icons/welle_io_icons/speaker.svg
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
-	 viewBox="0 0 52.026 52.026" style="enable-background:new 0 0 52.026 52.026;" xml:space="preserve">
-<g>
-	<path d="M28.404,3.413c-0.976-0.552-2.131-0.534-3.09,0.044c-0.046,0.027-0.09,0.059-0.13,0.093L11.634,15.013H1
-		c-0.553,0-1,0.447-1,1v19c0,0.266,0.105,0.52,0.293,0.707S0.734,36.013,1,36.013l10.61-0.005l13.543,12.44
-		c0.05,0.046,0.104,0.086,0.161,0.12c0.492,0.297,1.037,0.446,1.582,0.446c0.517-0.001,1.033-0.134,1.508-0.402
-		C29.403,48.048,30,47.018,30,45.857V6.169C30,5.008,29.403,3.978,28.404,3.413z M28,45.857c0,0.431-0.217,0.81-0.579,1.015
-		c-0.155,0.087-0.548,0.255-1,0.026L13,34.569v-4.556c0-0.553-0.447-1-1-1s-1,0.447-1,1v3.996l-9,0.004v-17h9v4c0,0.553,0.447,1,1,1
-		s1-0.447,1-1v-4.536l13.405-11.34c0.461-0.242,0.86-0.07,1.016,0.018C27.783,5.36,28,5.739,28,6.169V45.857z"/>
-	<path d="M38.797,7.066c-0.523-0.177-1.091,0.103-1.269,0.626c-0.177,0.522,0.103,1.091,0.626,1.269
-		c7.101,2.411,11.872,9.063,11.872,16.553c0,7.483-4.762,14.136-11.849,16.554c-0.522,0.178-0.802,0.746-0.623,1.27
-		c0.142,0.415,0.53,0.677,0.946,0.677c0.107,0,0.216-0.017,0.323-0.054c7.896-2.693,13.202-10.106,13.202-18.446
-		C52.026,17.166,46.71,9.753,38.797,7.066z"/>
-	<path d="M43.026,25.513c0-5.972-4.009-11.302-9.749-12.962c-0.533-0.151-1.084,0.152-1.238,0.684
-		c-0.153,0.53,0.152,1.085,0.684,1.238c4.889,1.413,8.304,5.953,8.304,11.04s-3.415,9.627-8.304,11.04
-		c-0.531,0.153-0.837,0.708-0.684,1.238c0.127,0.438,0.526,0.723,0.961,0.723c0.092,0,0.185-0.013,0.277-0.039
-		C39.018,36.815,43.026,31.485,43.026,25.513z"/>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-<g>
-</g>
-</svg>
diff --git a/src/welle-gui/icons/welle_io_icons/speaker_mute.svg b/src/welle-gui/icons/welle_io_icons/speaker_mute.svg
deleted file mode 100644
index 666c7a3..0000000
--- a/src/welle-gui/icons/welle_io_icons/speaker_mute.svg
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   version="1.1"
-   id="Capa_1"
-   x="0px"
-   y="0px"
-   viewBox="0 0 54 54"
-   style="enable-background:new 0 0 54 54;"
-   xml:space="preserve"
-   sodipodi:docname="speaker_mute.svg"
-   inkscape:export-filename="/home/albrecht/src/welle.io_next/src/gui/icon/welle_io_icons/20x20@4/speaker_mute.png"
-   inkscape:export-xdpi="142.22223"
-   inkscape:export-ydpi="142.22223"
-   inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
-   id="metadata88"><rdf:RDF><cc:Work
-       rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
-         rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
-   id="defs86" /><sodipodi:namedview
-   pagecolor="#ffffff"
-   bordercolor="#666666"
-   borderopacity="1"
-   objecttolerance="10"
-   gridtolerance="10"
-   guidetolerance="10"
-   inkscape:pageopacity="0"
-   inkscape:pageshadow="2"
-   inkscape:window-width="1853"
-   inkscape:window-height="1025"
-   id="namedview84"
-   showgrid="false"
-   inkscape:zoom="4.3703704"
-   inkscape:cx="27"
-   inkscape:cy="27"
-   inkscape:window-x="67"
-   inkscape:window-y="27"
-   inkscape:window-maximized="1"
-   inkscape:current-layer="Capa_1" />
-<g
-   id="g51">
-	<path
-   d="M46.414,26l7.293-7.293c0.391-0.391,0.391-1.023,0-1.414s-1.023-0.391-1.414,0L45,24.586l-7.293-7.293   c-0.391-0.391-1.023-0.391-1.414,0s-0.391,1.023,0,1.414L43.586,26l-7.293,7.293c-0.391,0.391-0.391,1.023,0,1.414   C36.488,34.902,36.744,35,37,35s0.512-0.098,0.707-0.293L45,27.414l7.293,7.293C52.488,34.902,52.744,35,53,35   s0.512-0.098,0.707-0.293c0.391-0.391,0.391-1.023,0-1.414L46.414,26z"
-   id="path47" />
-	<path
-   d="M28.404,4.4c-0.975-0.552-2.131-0.534-3.09,0.044c-0.046,0.027-0.09,0.059-0.13,0.093L11.634,16H1c-0.553,0-1,0.447-1,1v19   c0,0.266,0.105,0.52,0.293,0.707S0.734,37,1,37l10.61-0.005l13.543,12.44c0.05,0.046,0.104,0.086,0.161,0.12   c0.492,0.297,1.037,0.446,1.582,0.446c0.517-0.001,1.033-0.134,1.508-0.402C29.403,49.035,30,48.005,30,46.844V7.156   C30,5.995,29.403,4.965,28.404,4.4z M28,46.844c0,0.431-0.217,0.81-0.579,1.015c-0.155,0.087-0.548,0.255-1,0.026L13,35.556V31   c0-0.553-0.447-1-1-1s-1,0.447-1,1v3.996L2,35V18h9v4c0,0.553,0.447,1,1,1s1-0.447,1-1v-4.536l13.405-11.34   c0.46-0.242,0.86-0.07,1.016,0.018C27.783,6.347,28,6.725,28,7.156V46.844z"
-   id="path49" />
-</g>
-<g
-   id="g53">
-</g>
-<g
-   id="g55">
-</g>
-<g
-   id="g57">
-</g>
-<g
-   id="g59">
-</g>
-<g
-   id="g61">
-</g>
-<g
-   id="g63">
-</g>
-<g
-   id="g65">
-</g>
-<g
-   id="g67">
-</g>
-<g
-   id="g69">
-</g>
-<g
-   id="g71">
-</g>
-<g
-   id="g73">
-</g>
-<g
-   id="g75">
-</g>
-<g
-   id="g77">
-</g>
-<g
-   id="g79">
-</g>
-<g
-   id="g81">
-</g>
-</svg>
\ No newline at end of file
diff --git a/src/welle-gui/main.cpp b/src/welle-gui/main.cpp
index 539ec9d..5bfe87f 100644
--- a/src/welle-gui/main.cpp
+++ b/src/welle-gui/main.cpp
@@ -63,6 +63,16 @@ int main(int argc, char** argv)
     QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
 //    QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
 
+    // Disable a lot of new Qml warnings since Qt 5.15:
+    //
+    // Warning: qrc:/QML/settingpages/GlobalSettings.qml:37:5:
+    //   QML Connections: Implicitly defined onFoo properties in Connections are deprecated.
+    //   Use this syntax instead: function onFoo(<arguments>) { ... }
+    //
+    // Ref: https://zren.github.io/2020/06/19/qml-connections-onfoo-warnings-will-get-logging-category-in-qt-5151
+    //
+    qputenv("QT_LOGGING_RULES", "qt.qml.connections=false");
+    
     // Handle debug output
     CDebugOutput::init();
 
@@ -78,13 +88,13 @@ int main(int argc, char** argv)
     CGUIHelper::loadTranslationFile(translator, lang);
     QCoreApplication::installTranslator(translator);
 
-    // Register custiom types
+    // Register custom types
     qmlRegisterType<WaterfallItem>("io.welle", 1, 0, "Waterfall");
     qRegisterMetaType<mot_file_t>("mot_file_t");
 
     // Set icon path
     QStringList themePaths;
-    themePaths << ":/icons";
+    themePaths << ":/icons/welle_io_icons";
     QIcon::setThemeSearchPaths(themePaths);
     QIcon::setThemeName("welle_io_icons");
 
@@ -93,7 +103,7 @@ int main(int argc, char** argv)
 
     // Handle the command line
     QCommandLineParser optionParser;
-    optionParser.setApplicationDescription("welle.io Help");
+    optionParser.setApplicationDescription("welle.io is an open source DAB and DAB+ software defined radio (SDR) with support for rtl-sdr (RTL2832U) and airspy. It supports high DPI and touch displays and it runs even on cheap computers like Raspberry Pi 2/3 and 100€ China Windows 10 tablets.");
     optionParser.addHelpOption();
     optionParser.addVersionOption();
 
@@ -109,7 +119,7 @@ int main(int argc, char** argv)
 
     QCommandLineOption styleName("qqc-style",
         QCoreApplication::translate("main", "Qt Quick Controls Style for the 1st launch"),
-        QCoreApplication::translate("main", "style_name"));
+        QCoreApplication::translate("main", "Style name"));
     optionParser.addOption(styleName);
 
     //	Process the actual command line arguments given by the user
@@ -153,7 +163,7 @@ int main(int argc, char** argv)
     CGUIHelper guiHelper(&radioController);
     guiHelper.setTranslator(translator);
 
-    // Create new QML application, set some requried options and load the QML file
+    // Create new QML application, set some required options and load the QML file
     QQmlApplicationEngine engine;
     QQmlContext* rootContext = engine.rootContext();
 
diff --git a/src/welle-gui/mot_image_provider.cpp b/src/welle-gui/mot_image_provider.cpp
index 2916dff..3b65044 100644
--- a/src/welle-gui/mot_image_provider.cpp
+++ b/src/welle-gui/mot_image_provider.cpp
@@ -30,6 +30,7 @@
 #include <iostream>
 #include <stdio.h>
 #include <QStandardPaths>
+#include <QUrl>
 
 CMOTImageProvider::CMOTImageProvider(): QQuickImageProvider(QQuickImageProvider::Pixmap)
 {
@@ -76,10 +77,10 @@ void CMOTImageProvider::clear()
     pictureList.clear();
 }
 
-void CMOTImageProvider::saveAll()
+void CMOTImageProvider::saveAll(QString folder)
 {
     for (auto const& picture : pictureList)
-        picture->save();
+        picture->save(folder);
 }
 
 motPicture::motPicture(QPixmap data, QString name)
@@ -93,16 +94,16 @@ void motPicture::setData(QPixmap data)
     this->data = data;
 }
 
-void motPicture::save()
+void motPicture::save(QString url)
 {
-    QString homePath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
+    QString folder = QUrl(url).toEncoded(QUrl::RemoveScheme);
 
     // Replace all "/" by "_"
     QString filename = name;
     filename.replace("/", "_");
 
     // Add home directory and "MOT" preffix
-    filename = homePath + "/MOT" + filename;
+    filename = folder + "/MOT" + filename;
 
     std::clog  << "SLS: Saving picture \"" << filename.toStdString() << "\"" << std::endl;
     data.save(filename);
diff --git a/src/welle-gui/mot_image_provider.h b/src/welle-gui/mot_image_provider.h
index 0830c35..2e091e5 100644
--- a/src/welle-gui/mot_image_provider.h
+++ b/src/welle-gui/mot_image_provider.h
@@ -43,7 +43,7 @@ public:
 
     void setPixmap(QPixmap Pixmap, QString pictureName);
     void clear();
-    void saveAll();
+    void saveAll(QString folder);
 
 private:
     std::list<std::shared_ptr<motPicture>> pictureList;
@@ -55,7 +55,7 @@ class motPicture
 public:
     motPicture(QPixmap data, QString name);
     void setData(QPixmap data);
-    void save();
+    void save(QString url);
 
     QPixmap data;
     QString name;
diff --git a/src/welle-gui/mpris/mpris.cpp b/src/welle-gui/mpris/mpris.cpp
new file mode 100644
index 0000000..9805fec
--- /dev/null
+++ b/src/welle-gui/mpris/mpris.cpp
@@ -0,0 +1,332 @@
+/*
+ *    Copyright (C) 2020
+ *    tenzap (@github)
+ *
+ *    Copyright (C) 2019
+ *    Matthias P. Braendli (matthias.braendli@mpb.li)
+ *
+ *    Copyright (C) 2017
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * This file was partly generated by qdbusxml2cpp version 0.8
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ */
+
+#include <QtCore/QMetaObject>
+#include <QtCore/QByteArray>
+#include <QtCore/QList>
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QVariant>
+
+#if defined __unix__ || defined __APPLE__
+    #include <unistd.h>
+    #define GETPID getpid
+#endif
+#ifdef _WIN32
+    #include <process.h>
+    #define GETPID _getpid
+#endif
+
+#include "mpris.h"
+#include "mpris_mp2.h"
+#include "mpris_mp2_player.h"
+#include "../gui_helper.h"
+
+Mpris::Mpris(CRadioController *RadioController, QObject *parent)
+    : QObject(parent)
+    , radioController(RadioController)
+{
+    new MediaPlayer2Adaptor(this);
+    new PlayerAdaptor(this);
+
+    guiHelper = qobject_cast< CGUIHelper * >(parent);
+
+    // Connect to Dbus for MPRIS2
+    QDBusConnection connection = QDBusConnection::sessionBus();
+
+    QString serviceName = "org.mpris.MediaPlayer2.welleio";
+    bool registered = connection.registerService(serviceName);
+    if (!registered)
+        registered = connection.registerService(serviceName + ".instance" + QString::number(GETPID()));
+
+    registered = connection.registerObject("/org/mpris/MediaPlayer2", this, QDBusConnection::ExportAdaptors);
+    if (!registered)
+        qDebug() << "MPRIS: DBus Object not registered.";
+
+    connect(radioController, &CRadioController::autoServiceChanged, this, &Mpris::autoServiceChanged);
+    connect(radioController, &CRadioController::autoChannelChanged, this, &Mpris::autoChannelChanged);
+    connect(radioController, &CRadioController::titleChanged, this, &Mpris::metadataChanged);
+    connect(radioController, &CRadioController::textChanged, this, &Mpris::metadataChanged);
+    connect(radioController, &CRadioController::isPlayingChanged, this, &Mpris::isPlayingChanged);
+    connect(radioController, &CRadioController::volumeChanged, this, &Mpris::volumeChanged);
+    connect(radioController, &CRadioController::motReseted, this, &Mpris::motReseted);
+    connect(guiHelper, &CGUIHelper::motChanged, this, &Mpris::motChanged);
+}
+
+Mpris::~Mpris()
+{
+    // Remove picture file
+    deletePicFile();
+}
+
+void Mpris::setStationArray(QString serializedJson, QString listType, int index)
+{
+    if ((listType == "all" && index == 0) || (listType == "favorites" && index == 1)) {
+        stationArray = QJsonDocument::fromJson(serializedJson.toUtf8()).array();
+        //qDebug() << "MPRIS: Updating stations list using:" << listType;
+    }
+}
+
+int Mpris::getCurrentStationIndex()
+{
+    quint32 sid = 0;
+
+    // In case the station is not found, use the 1st in the list
+    // Typically, it can happen when the user is playing a station
+    // from the "All stations" (that is not in the Favorites) while displaying the favorites in the GUI
+    int currentStationIndex = 0;
+
+    for (int i=0; i<stationArray.size(); i++) {
+        sid = stationArray.at(i).toObject().value("stationSId").toInt();
+        if (sid == autoService) {
+            currentStationIndex = i;
+            break;
+        }
+    }
+    qDebug() << "MPRIS: currentStationIndex" << currentStationIndex;
+
+    return currentStationIndex;
+}
+
+bool Mpris::canQuit() const { return true; }
+
+bool Mpris::canRaise() const { return true; }
+
+bool Mpris::canSetFullscreen() const { return true; }
+
+QString Mpris::desktopEntry() const { return "welle-io"; }
+
+bool Mpris::fullscreen() const { return fullscreenState; }
+
+void Mpris::setFullscreen(bool value)
+{
+    fullscreenState = value;
+    EmitNotification("Fullscreen", fullscreenState);
+    emit guiHelper->setFullScreen(fullscreenState);
+}
+
+void Mpris::setFullscreenState(bool value)
+{
+    fullscreenState = value;
+    EmitNotification("Fullscreen", fullscreenState);
+}
+
+bool Mpris::hasTrackList() const { return false; }
+
+QString Mpris::identity() const { return QCoreApplication::applicationName(); }
+
+QStringList Mpris::supportedMimeTypes() const { return QStringList(); }
+
+QStringList Mpris::supportedUriSchemes() const { return QStringList(); }
+
+void Mpris::Quit() { QCoreApplication::quit(); }
+
+void Mpris::Raise() { emit guiHelper->restoreWindow(); }
+
+bool Mpris::canControl() const { return true; }
+
+bool Mpris::canGoNext() const { return true; }
+
+bool Mpris::canGoPrevious() const { return true; }
+
+bool Mpris::canPause() const { return true; }
+
+bool Mpris::canPlay() const { return true; }
+
+bool Mpris::canSeek() const { return false; }
+
+QString Mpris::loopStatus() const { return "None"; }
+
+void Mpris::setLoopStatus(const QString &value) {}
+
+double Mpris::maximumRate() const { return 1.0; }
+
+void Mpris::autoChannelChanged(QString autoChannel) { this->autoChannel = autoChannel; }
+
+void Mpris::autoServiceChanged(quint32 autoService)
+{
+    this->autoService = autoService;
+    EmitNotification("Metadata", metadata());
+}
+
+void Mpris::isPlayingChanged(bool isPlaying)
+{
+    m_isPlaying = isPlaying;
+    if (m_isPlaying)
+        m_playbackStatus = "Playing";
+    else
+        m_playbackStatus = "Stopped";
+
+    EmitNotification("PlaybackStatus", playbackStatus());
+}
+
+void Mpris::volumeChanged(qreal volume)
+{
+    EmitNotification("Volume", volume);
+}
+
+void Mpris::motChanged(QString pictureName, QString categoryTitle, int categoryId, int slideId)
+{
+    //qDebug() << "MPRIS: pictureName: " << pictureName;
+
+    deletePicFile();
+
+    QString file = pictureName.split("/").last();
+    picPath = QStandardPaths::writableLocation(QStandardPaths::TempLocation) +
+    QStringLiteral("/") +
+    QString("welle-io.pic.%1.%2").arg(autoService).arg(file);
+
+    QSize * size = new QSize(10,10);
+
+    QPixmap pixmap = guiHelper->motImageProvider->requestPixmap(pictureName, size, QSize(100,100));
+    pixmap.save(picPath);
+
+    EmitNotification("Metadata", metadata());
+}
+
+void Mpris::motReseted()
+{
+    deletePicFile();
+    picPath = "";
+    EmitNotification("Metadata", metadata());
+}
+
+void Mpris::deletePicFile() { if (! picPath.isEmpty()) QFile::remove(picPath); }
+
+void Mpris::metadataChanged() { EmitNotification("Metadata", metadata()); }
+
+QVariantMap Mpris::metadata() const
+{
+    QString stationTitle = qvariant_cast< QString >(radioController->property("title"));
+    QString stationText = qvariant_cast< QString >(radioController->property("text"));
+    if (stationText.simplified().isEmpty())
+        stationText = stationTitle;
+    QString picPathAsUrl = QString::fromUtf8(QUrl::fromLocalFile(picPath).toEncoded());
+
+    QVariantMap map;
+    map.insert("mpris:trackid", "io.welle.welle-io.Service." + QString::number(autoService));
+    if (!picPathAsUrl.isEmpty())
+        map.insert("mpris:artUrl", picPathAsUrl);
+    map.insert("xesam:album", stationTitle.simplified());
+    map.insert("xesam:title", stationText.simplified());
+    return map;
+}
+
+double Mpris::minimumRate() const { return 1.0; }
+
+QString Mpris::playbackStatus() const { return m_playbackStatus; }
+
+qlonglong Mpris::position() const { return 0; }
+
+double Mpris::rate() const { return 1.0; }
+
+void Mpris::setRate(double value) {}
+
+bool Mpris::shuffle() const { return false; }
+
+void Mpris::setShuffle(bool value) {}
+
+double Mpris::volume() const { return (double) qvariant_cast< qreal >(radioController->property("volume")); }
+
+void Mpris::setVolume(double value) { radioController->setVolume(value); }
+
+void Mpris::Next()
+{
+    int next = std::min(stationArray.size()-1, getCurrentStationIndex()+1);
+    QJsonObject obj = stationArray.at(next).toObject();
+
+    QString autoChannel = obj.value("channelName").toString();
+    quint32 autoService = obj.value("stationSId").toInt();
+    QString title = obj.value("stationName").toString();
+    if (autoService != this->autoService  || autoChannel != this->autoChannel)
+        radioController->play(autoChannel, title, autoService);
+}
+
+void Mpris::OpenUri(const QString &Uri) {}
+
+void Mpris::Pause() { Stop(); }
+
+void Mpris::Play()
+{
+    this->autoChannel = qvariant_cast< QString >(radioController->property("autoChannel"));
+    this->autoService = qvariant_cast< quint32 >(radioController->property("autoService"));
+    QString title =  qvariant_cast< QString >(radioController->property("title"));
+    radioController->play(this->autoChannel, title, this->autoService);
+}
+
+void Mpris::PlayPause()
+{
+    if (m_isPlaying)
+        Stop();
+    else
+        Play();
+}
+
+void Mpris::Previous()
+{
+    int previous = std::max(0, getCurrentStationIndex()-1);
+    QJsonObject obj = stationArray.at(previous).toObject();
+
+    QString autoChannel = obj.value("channelName").toString();
+    quint32 autoService = obj.value("stationSId").toInt();
+    QString title = obj.value("stationName").toString();
+    if (autoService != this->autoService || autoChannel != this->autoChannel)
+        radioController->play(autoChannel, title, autoService);
+}
+
+void Mpris::Seek(qlonglong Offset) {}
+
+void Mpris::SetPosition(const QDBusObjectPath &TrackId, qlonglong Position) {}
+
+void Mpris::Stop() { radioController->stop(); }
+
+void Mpris::EmitNotification(const QString& name, const QVariant& val)
+{
+    EmitNotification(name, val, "org.mpris.MediaPlayer2.Player");
+}
+
+void Mpris::EmitNotification(const QString& name,
+                             const QVariant& val,
+                             const QString& mprisEntity)
+{
+    QDBusMessage msg = QDBusMessage::createSignal("/org/mpris/MediaPlayer2",
+                                                  "org.freedesktop.DBus.Properties",
+                                                  "PropertiesChanged");
+    QVariantMap map;
+    map.insert(name, val);
+    QVariantList args = QVariantList() << mprisEntity << map << QStringList();
+    msg.setArguments(args);
+    QDBusConnection::sessionBus().send(msg);
+}
diff --git a/src/welle-gui/mpris/mpris.h b/src/welle-gui/mpris/mpris.h
new file mode 100644
index 0000000..9593a91
--- /dev/null
+++ b/src/welle-gui/mpris/mpris.h
@@ -0,0 +1,181 @@
+/*
+ *    Copyright (C) 2020
+ *    tenzap (@github)
+ *
+ *    Copyright (C) 2019
+ *    Matthias P. Braendli (matthias.braendli@mpb.li)
+ *
+ *    Copyright (C) 2017
+ *    Albrecht Lohofener (albrechtloh@gmx.de)
+ *
+ *    This file is part of the welle.io.
+ *    Many of the ideas as implemented in welle.io are derived from
+ *    other work, made available through the GNU general Public License.
+ *    All copyrights of the original authors are recognized.
+ *
+ *    welle.io is free software; you can redistribute it and/or modify
+ *    it under the terms of the GNU General Public License as published by
+ *    the Free Software Foundation; either version 2 of the License, or
+ *    (at your option) any later version.
+ *
+ *    welle.io is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *    GNU General Public License for more details.
+ *
+ *    You should have received a copy of the GNU General Public License
+ *    along with welle.io; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * This file was partly generated by qdbusxml2cpp version 0.8
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ */
+
+#ifndef MPRIS_H
+#define MPRIS_H
+
+#include <QtCore/QObject>
+#include <QtDBus/QtDBus>
+#include "../radio_controller.h"
+
+class CGUIHelper;
+
+QT_BEGIN_NAMESPACE
+class QByteArray;
+template<class T> class QList;
+template<class Key, class Value> class QMap;
+class QString;
+class QStringList;
+class QVariant;
+QT_END_NAMESPACE
+
+class Mpris: public QObject
+{
+    Q_OBJECT
+public:
+    Mpris(CRadioController *RadioController, QObject *parent );
+    virtual ~Mpris();
+    void setStationArray(QString serializedJson, QString, int);
+    void setFullscreenState(bool value);
+
+public: // PROPERTIES
+    Q_PROPERTY(bool CanQuit READ canQuit)
+    bool canQuit() const;
+
+    Q_PROPERTY(bool CanRaise READ canRaise)
+    bool canRaise() const;
+
+    Q_PROPERTY(bool CanSetFullscreen READ canSetFullscreen)
+    bool canSetFullscreen() const;
+
+    Q_PROPERTY(QString DesktopEntry READ desktopEntry)
+    QString desktopEntry() const;
+
+    Q_PROPERTY(bool Fullscreen READ fullscreen WRITE setFullscreen)
+    bool fullscreen() const;
+    void setFullscreen(bool value);
+
+    Q_PROPERTY(bool HasTrackList READ hasTrackList)
+    bool hasTrackList() const;
+
+    Q_PROPERTY(QString Identity READ identity)
+    QString identity() const;
+
+    Q_PROPERTY(QStringList SupportedMimeTypes READ supportedMimeTypes)
+    QStringList supportedMimeTypes() const;
+
+    Q_PROPERTY(QStringList SupportedUriSchemes READ supportedUriSchemes)
+    QStringList supportedUriSchemes() const;
+
+    Q_PROPERTY(bool CanControl READ canControl)
+    bool canControl() const;
+
+    Q_PROPERTY(bool CanGoNext READ canGoNext)
+    bool canGoNext() const;
+
+    Q_PROPERTY(bool CanGoPrevious READ canGoPrevious)
+    bool canGoPrevious() const;
+
+    Q_PROPERTY(bool CanPause READ canPause)
+    bool canPause() const;
+
+    Q_PROPERTY(bool CanPlay READ canPlay)
+    bool canPlay() const;
+
+    Q_PROPERTY(bool CanSeek READ canSeek)
+    bool canSeek() const;
+
+    Q_PROPERTY(QString LoopStatus READ loopStatus WRITE setLoopStatus)
+    QString loopStatus() const;
+    void setLoopStatus(const QString &value);
+
+    Q_PROPERTY(double MaximumRate READ maximumRate)
+    double maximumRate() const;
+
+    Q_PROPERTY(QVariantMap Metadata READ metadata)
+    QVariantMap metadata() const;
+
+    Q_PROPERTY(double MinimumRate READ minimumRate)
+    double minimumRate() const;
+
+    Q_PROPERTY(QString PlaybackStatus READ playbackStatus)
+    QString playbackStatus() const;
+
+    Q_PROPERTY(qlonglong Position READ position)
+    qlonglong position() const;
+
+    Q_PROPERTY(double Rate READ rate WRITE setRate)
+    double rate() const;
+    void setRate(double value);
+
+    Q_PROPERTY(bool Shuffle READ shuffle WRITE setShuffle)
+    bool shuffle() const;
+    void setShuffle(bool value);
+
+    Q_PROPERTY(double Volume READ volume WRITE setVolume)
+    double volume() const;
+    void setVolume(double value);
+
+public Q_SLOTS: // METHODS
+    void Quit();
+    void Raise();
+    void Next();
+    void OpenUri(const QString &Uri);
+    void Pause();
+    void Play();
+    void PlayPause();
+    void Previous();
+    void Seek(qlonglong Offset);
+    void SetPosition(const QDBusObjectPath &TrackId, qlonglong Position);
+    void Stop();
+Q_SIGNALS: // SIGNALS
+    void Seeked(qlonglong Position);
+
+private:
+    CRadioController *radioController;
+    CGUIHelper *guiHelper;
+    void EmitNotification(const QString& name, const QVariant& val);
+    void EmitNotification(const QString& name, const QVariant& val,
+                          const QString& mprisEntity);
+    int getCurrentStationIndex();
+    void deletePicFile();
+    QString picPath;
+    QString m_playbackStatus;
+    bool m_isPlaying;
+    quint32 autoService;
+    QString autoChannel;
+    QJsonArray stationArray;
+    bool fullscreenState = false;
+
+private slots:
+    void motChanged(QString pictureName, QString categoryTitle, int categoryId, int slideId);
+    void motReseted();
+    void metadataChanged();
+    void isPlayingChanged(bool);
+    void volumeChanged(qreal);
+    void autoServiceChanged(quint32);
+    void autoChannelChanged(QString);
+};
+
+#endif
diff --git a/src/welle-gui/mpris/mpris_mp2.cpp b/src/welle-gui/mpris/mpris_mp2.cpp
new file mode 100644
index 0000000..e0ea0ba
--- /dev/null
+++ b/src/welle-gui/mpris/mpris_mp2.cpp
@@ -0,0 +1,107 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp org.mpris.MediaPlayer2.xml -a mpris_mp2
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ *
+ * This is an auto-generated file.
+ * Do not edit! All changes made to it will be lost.
+ */
+
+#include "mpris_mp2.h"
+#include <QtCore/QMetaObject>
+#include <QtCore/QByteArray>
+#include <QtCore/QList>
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QVariant>
+
+/*
+ * Implementation of adaptor class MediaPlayer2Adaptor
+ */
+
+MediaPlayer2Adaptor::MediaPlayer2Adaptor(QObject *parent)
+    : QDBusAbstractAdaptor(parent)
+{
+    // constructor
+    setAutoRelaySignals(true);
+}
+
+MediaPlayer2Adaptor::~MediaPlayer2Adaptor()
+{
+    // destructor
+}
+
+bool MediaPlayer2Adaptor::canQuit() const
+{
+    // get the value of property CanQuit
+    return qvariant_cast< bool >(parent()->property("CanQuit"));
+}
+
+bool MediaPlayer2Adaptor::canRaise() const
+{
+    // get the value of property CanRaise
+    return qvariant_cast< bool >(parent()->property("CanRaise"));
+}
+
+bool MediaPlayer2Adaptor::canSetFullscreen() const
+{
+    // get the value of property CanSetFullscreen
+    return qvariant_cast< bool >(parent()->property("CanSetFullscreen"));
+}
+
+QString MediaPlayer2Adaptor::desktopEntry() const
+{
+    // get the value of property DesktopEntry
+    return qvariant_cast< QString >(parent()->property("DesktopEntry"));
+}
+
+bool MediaPlayer2Adaptor::fullscreen() const
+{
+    // get the value of property Fullscreen
+    return qvariant_cast< bool >(parent()->property("Fullscreen"));
+}
+
+void MediaPlayer2Adaptor::setFullscreen(bool value)
+{
+    // set the value of property Fullscreen
+    parent()->setProperty("Fullscreen", QVariant::fromValue(value));
+}
+
+bool MediaPlayer2Adaptor::hasTrackList() const
+{
+    // get the value of property HasTrackList
+    return qvariant_cast< bool >(parent()->property("HasTrackList"));
+}
+
+QString MediaPlayer2Adaptor::identity() const
+{
+    // get the value of property Identity
+    return qvariant_cast< QString >(parent()->property("Identity"));
+}
+
+QStringList MediaPlayer2Adaptor::supportedMimeTypes() const
+{
+    // get the value of property SupportedMimeTypes
+    return qvariant_cast< QStringList >(parent()->property("SupportedMimeTypes"));
+}
+
+QStringList MediaPlayer2Adaptor::supportedUriSchemes() const
+{
+    // get the value of property SupportedUriSchemes
+    return qvariant_cast< QStringList >(parent()->property("SupportedUriSchemes"));
+}
+
+void MediaPlayer2Adaptor::Quit()
+{
+    // handle method call org.mpris.MediaPlayer2.Quit
+    QMetaObject::invokeMethod(parent(), "Quit");
+}
+
+void MediaPlayer2Adaptor::Raise()
+{
+    // handle method call org.mpris.MediaPlayer2.Raise
+    QMetaObject::invokeMethod(parent(), "Raise");
+}
+
diff --git a/src/welle-gui/mpris/mpris_mp2.h b/src/welle-gui/mpris/mpris_mp2.h
new file mode 100644
index 0000000..05b5d83
--- /dev/null
+++ b/src/welle-gui/mpris/mpris_mp2.h
@@ -0,0 +1,87 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp org.mpris.MediaPlayer2.xml -a mpris_mp2
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ *
+ * This is an auto-generated file.
+ * This file may have been hand-edited. Look for HAND-EDIT comments
+ * before re-generating it.
+ */
+
+#ifndef MPRIS_MP2_H
+#define MPRIS_MP2_H
+
+#include <QtCore/QObject>
+#include <QtDBus/QtDBus>
+QT_BEGIN_NAMESPACE
+class QByteArray;
+template<class T> class QList;
+template<class Key, class Value> class QMap;
+class QString;
+class QStringList;
+class QVariant;
+QT_END_NAMESPACE
+
+/*
+ * Adaptor class for interface org.mpris.MediaPlayer2
+ */
+class MediaPlayer2Adaptor: public QDBusAbstractAdaptor
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "org.mpris.MediaPlayer2")
+    Q_CLASSINFO("D-Bus Introspection", ""
+"  <interface name=\"org.mpris.MediaPlayer2\">\n"
+"    <method name=\"Raise\"/>\n"
+"    <method name=\"Quit\"/>\n"
+"    <property access=\"read\" type=\"b\" name=\"CanQuit\"/>\n"
+"    <property access=\"readwrite\" type=\"b\" name=\"Fullscreen\"/>\n"
+"    <property access=\"read\" type=\"b\" name=\"CanSetFullscreen\"/>\n"
+"    <property access=\"read\" type=\"b\" name=\"CanRaise\"/>\n"
+"    <property access=\"read\" type=\"b\" name=\"HasTrackList\"/>\n"
+"    <property access=\"read\" type=\"s\" name=\"Identity\"/>\n"
+"    <property access=\"read\" type=\"s\" name=\"DesktopEntry\"/>\n"
+"    <property access=\"read\" type=\"as\" name=\"SupportedUriSchemes\"/>\n"
+"    <property access=\"read\" type=\"as\" name=\"SupportedMimeTypes\"/>\n"
+"  </interface>\n"
+        "")
+public:
+    MediaPlayer2Adaptor(QObject *parent);
+    virtual ~MediaPlayer2Adaptor();
+
+public: // PROPERTIES
+    Q_PROPERTY(bool CanQuit READ canQuit)
+    bool canQuit() const;
+
+    Q_PROPERTY(bool CanRaise READ canRaise)
+    bool canRaise() const;
+
+    Q_PROPERTY(bool CanSetFullscreen READ canSetFullscreen)
+    bool canSetFullscreen() const;
+
+    Q_PROPERTY(QString DesktopEntry READ desktopEntry)
+    QString desktopEntry() const;
+
+    Q_PROPERTY(bool Fullscreen READ fullscreen WRITE setFullscreen)
+    bool fullscreen() const;
+    void setFullscreen(bool value);
+
+    Q_PROPERTY(bool HasTrackList READ hasTrackList)
+    bool hasTrackList() const;
+
+    Q_PROPERTY(QString Identity READ identity)
+    QString identity() const;
+
+    Q_PROPERTY(QStringList SupportedMimeTypes READ supportedMimeTypes)
+    QStringList supportedMimeTypes() const;
+
+    Q_PROPERTY(QStringList SupportedUriSchemes READ supportedUriSchemes)
+    QStringList supportedUriSchemes() const;
+
+public Q_SLOTS: // METHODS
+    void Quit();
+    void Raise();
+Q_SIGNALS: // SIGNALS
+};
+
+#endif
diff --git a/src/welle-gui/mpris/mpris_mp2_player.cpp b/src/welle-gui/mpris/mpris_mp2_player.cpp
new file mode 100644
index 0000000..b8faba9
--- /dev/null
+++ b/src/welle-gui/mpris/mpris_mp2_player.cpp
@@ -0,0 +1,203 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp org.mpris.MediaPlayer2.Player.xml -a mpris_mp2_player
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ *
+ * This is an auto-generated file.
+ * Do not edit! All changes made to it will be lost.
+ */
+
+#include "mpris_mp2_player.h"
+#include <QtCore/QMetaObject>
+#include <QtCore/QByteArray>
+#include <QtCore/QList>
+#include <QtCore/QMap>
+#include <QtCore/QString>
+#include <QtCore/QStringList>
+#include <QtCore/QVariant>
+
+/*
+ * Implementation of adaptor class PlayerAdaptor
+ */
+
+PlayerAdaptor::PlayerAdaptor(QObject *parent)
+    : QDBusAbstractAdaptor(parent)
+{
+    // constructor
+    setAutoRelaySignals(true);
+}
+
+PlayerAdaptor::~PlayerAdaptor()
+{
+    // destructor
+}
+
+bool PlayerAdaptor::canControl() const
+{
+    // get the value of property CanControl
+    return qvariant_cast< bool >(parent()->property("CanControl"));
+}
+
+bool PlayerAdaptor::canGoNext() const
+{
+    // get the value of property CanGoNext
+    return qvariant_cast< bool >(parent()->property("CanGoNext"));
+}
+
+bool PlayerAdaptor::canGoPrevious() const
+{
+    // get the value of property CanGoPrevious
+    return qvariant_cast< bool >(parent()->property("CanGoPrevious"));
+}
+
+bool PlayerAdaptor::canPause() const
+{
+    // get the value of property CanPause
+    return qvariant_cast< bool >(parent()->property("CanPause"));
+}
+
+bool PlayerAdaptor::canPlay() const
+{
+    // get the value of property CanPlay
+    return qvariant_cast< bool >(parent()->property("CanPlay"));
+}
+
+bool PlayerAdaptor::canSeek() const
+{
+    // get the value of property CanSeek
+    return qvariant_cast< bool >(parent()->property("CanSeek"));
+}
+
+QString PlayerAdaptor::loopStatus() const
+{
+    // get the value of property LoopStatus
+    return qvariant_cast< QString >(parent()->property("LoopStatus"));
+}
+
+void PlayerAdaptor::setLoopStatus(const QString &value)
+{
+    // set the value of property LoopStatus
+    parent()->setProperty("LoopStatus", QVariant::fromValue(value));
+}
+
+double PlayerAdaptor::maximumRate() const
+{
+    // get the value of property MaximumRate
+    return qvariant_cast< double >(parent()->property("MaximumRate"));
+}
+
+QVariantMap PlayerAdaptor::metadata() const
+{
+    // get the value of property Metadata
+    return qvariant_cast< QVariantMap >(parent()->property("Metadata"));
+}
+
+double PlayerAdaptor::minimumRate() const
+{
+    // get the value of property MinimumRate
+    return qvariant_cast< double >(parent()->property("MinimumRate"));
+}
+
+QString PlayerAdaptor::playbackStatus() const
+{
+    // get the value of property PlaybackStatus
+    return qvariant_cast< QString >(parent()->property("PlaybackStatus"));
+}
+
+qlonglong PlayerAdaptor::position() const
+{
+    // get the value of property Position
+    return qvariant_cast< qlonglong >(parent()->property("Position"));
+}
+
+double PlayerAdaptor::rate() const
+{
+    // get the value of property Rate
+    return qvariant_cast< double >(parent()->property("Rate"));
+}
+
+void PlayerAdaptor::setRate(double value)
+{
+    // set the value of property Rate
+    parent()->setProperty("Rate", QVariant::fromValue(value));
+}
+
+bool PlayerAdaptor::shuffle() const
+{
+    // get the value of property Shuffle
+    return qvariant_cast< bool >(parent()->property("Shuffle"));
+}
+
+void PlayerAdaptor::setShuffle(bool value)
+{
+    // set the value of property Shuffle
+    parent()->setProperty("Shuffle", QVariant::fromValue(value));
+}
+
+double PlayerAdaptor::volume() const
+{
+    // get the value of property Volume
+    return qvariant_cast< double >(parent()->property("Volume"));
+}
+
+void PlayerAdaptor::setVolume(double value)
+{
+    // set the value of property Volume
+    parent()->setProperty("Volume", QVariant::fromValue(value));
+}
+
+void PlayerAdaptor::Next()
+{
+    // handle method call org.mpris.MediaPlayer2.Player.Next
+    QMetaObject::invokeMethod(parent(), "Next");
+}
+
+void PlayerAdaptor::OpenUri(const QString &Uri)
+{
+    // handle method call org.mpris.MediaPlayer2.Player.OpenUri
+    QMetaObject::invokeMethod(parent(), "OpenUri", Q_ARG(QString, Uri));
+}
+
+void PlayerAdaptor::Pause()
+{
+    // handle method call org.mpris.MediaPlayer2.Player.Pause
+    QMetaObject::invokeMethod(parent(), "Pause");
+}
+
+void PlayerAdaptor::Play()
+{
+    // handle method call org.mpris.MediaPlayer2.Player.Play
+    QMetaObject::invokeMethod(parent(), "Play");
+}
+
+void PlayerAdaptor::PlayPause()
+{
+    // handle method call org.mpris.MediaPlayer2.Player.PlayPause
+    QMetaObject::invokeMethod(parent(), "PlayPause");
+}
+
+void PlayerAdaptor::Previous()
+{
+    // handle method call org.mpris.MediaPlayer2.Player.Previous
+    QMetaObject::invokeMethod(parent(), "Previous");
+}
+
+void PlayerAdaptor::Seek(qlonglong Offset)
+{
+    // handle method call org.mpris.MediaPlayer2.Player.Seek
+    QMetaObject::invokeMethod(parent(), "Seek", Q_ARG(qlonglong, Offset));
+}
+
+void PlayerAdaptor::SetPosition(const QDBusObjectPath &TrackId, qlonglong Position)
+{
+    // handle method call org.mpris.MediaPlayer2.Player.SetPosition
+    QMetaObject::invokeMethod(parent(), "SetPosition", Q_ARG(QDBusObjectPath, TrackId), Q_ARG(qlonglong, Position));
+}
+
+void PlayerAdaptor::Stop()
+{
+    // handle method call org.mpris.MediaPlayer2.Player.Stop
+    QMetaObject::invokeMethod(parent(), "Stop");
+}
+
diff --git a/src/welle-gui/mpris/mpris_mp2_player.h b/src/welle-gui/mpris/mpris_mp2_player.h
new file mode 100644
index 0000000..2e2e8c8
--- /dev/null
+++ b/src/welle-gui/mpris/mpris_mp2_player.h
@@ -0,0 +1,141 @@
+/*
+ * This file was generated by qdbusxml2cpp version 0.8
+ * Command line was: qdbusxml2cpp org.mpris.MediaPlayer2.Player.xml -a mpris_mp2_player
+ *
+ * qdbusxml2cpp is Copyright (C) 2017 The Qt Company Ltd.
+ *
+ * This is an auto-generated file.
+ * This file may have been hand-edited. Look for HAND-EDIT comments
+ * before re-generating it.
+ */
+
+#ifndef MPRIS_MP2_PLAYER_H
+#define MPRIS_MP2_PLAYER_H
+
+#include <QtCore/QObject>
+#include <QtDBus/QtDBus>
+QT_BEGIN_NAMESPACE
+class QByteArray;
+template<class T> class QList;
+template<class Key, class Value> class QMap;
+class QString;
+class QStringList;
+class QVariant;
+QT_END_NAMESPACE
+
+/*
+ * Adaptor class for interface org.mpris.MediaPlayer2.Player
+ */
+class PlayerAdaptor: public QDBusAbstractAdaptor
+{
+    Q_OBJECT
+    Q_CLASSINFO("D-Bus Interface", "org.mpris.MediaPlayer2.Player")
+    Q_CLASSINFO("D-Bus Introspection", ""
+"  <interface name=\"org.mpris.MediaPlayer2.Player\">\n"
+"    <method name=\"Next\"/>\n"
+"    <method name=\"Previous\"/>\n"
+"    <method name=\"Pause\"/>\n"
+"    <method name=\"PlayPause\"/>\n"
+"    <method name=\"Stop\"/>\n"
+"    <method name=\"Play\"/>\n"
+"    <method name=\"Seek\">\n"
+"      <arg direction=\"in\" type=\"x\" name=\"Offset\"/>\n"
+"    </method>\n"
+"    <method name=\"SetPosition\">\n"
+"      <arg direction=\"in\" type=\"o\" name=\"TrackId\"/>\n"
+"      <arg direction=\"in\" type=\"x\" name=\"Position\"/>\n"
+"    </method>\n"
+"    <method name=\"OpenUri\">\n"
+"      <arg direction=\"in\" type=\"s\" name=\"Uri\"/>\n"
+"    </method>\n"
+"    <signal name=\"Seeked\">\n"
+"      <arg type=\"x\" name=\"Position\"/>\n"
+"    </signal>\n"
+"    <property access=\"read\" type=\"s\" name=\"PlaybackStatus\"/>\n"
+"    <property access=\"readwrite\" type=\"s\" name=\"LoopStatus\"/>\n"
+"    <property access=\"readwrite\" type=\"d\" name=\"Rate\"/>\n"
+"    <property access=\"readwrite\" type=\"b\" name=\"Shuffle\"/>\n"
+"    <property access=\"read\" type=\"a{sv}\" name=\"Metadata\">\n"
+"      <annotation value=\"QVariantMap\" name=\"org.qtproject.QtDBus.QtTypeName\"/>\n"
+"    </property>\n"
+"    <property access=\"readwrite\" type=\"d\" name=\"Volume\"/>\n"
+"    <property access=\"read\" type=\"x\" name=\"Position\"/>\n"
+"    <property access=\"read\" type=\"d\" name=\"MinimumRate\"/>\n"
+"    <property access=\"read\" type=\"d\" name=\"MaximumRate\"/>\n"
+"    <property access=\"read\" type=\"b\" name=\"CanGoNext\"/>\n"
+"    <property access=\"read\" type=\"b\" name=\"CanGoPrevious\"/>\n"
+"    <property access=\"read\" type=\"b\" name=\"CanPlay\"/>\n"
+"    <property access=\"read\" type=\"b\" name=\"CanPause\"/>\n"
+"    <property access=\"read\" type=\"b\" name=\"CanSeek\"/>\n"
+"    <property access=\"read\" type=\"b\" name=\"CanControl\"/>\n"
+"  </interface>\n"
+        "")
+public:
+    PlayerAdaptor(QObject *parent);
+    virtual ~PlayerAdaptor();
+
+public: // PROPERTIES
+    Q_PROPERTY(bool CanControl READ canControl)
+    bool canControl() const;
+
+    Q_PROPERTY(bool CanGoNext READ canGoNext)
+    bool canGoNext() const;
+
+    Q_PROPERTY(bool CanGoPrevious READ canGoPrevious)
+    bool canGoPrevious() const;
+
+    Q_PROPERTY(bool CanPause READ canPause)
+    bool canPause() const;
+
+    Q_PROPERTY(bool CanPlay READ canPlay)
+    bool canPlay() const;
+
+    Q_PROPERTY(bool CanSeek READ canSeek)
+    bool canSeek() const;
+
+    Q_PROPERTY(QString LoopStatus READ loopStatus WRITE setLoopStatus)
+    QString loopStatus() const;
+    void setLoopStatus(const QString &value);
+
+    Q_PROPERTY(double MaximumRate READ maximumRate)
+    double maximumRate() const;
+
+    Q_PROPERTY(QVariantMap Metadata READ metadata)
+    QVariantMap metadata() const;
+
+    Q_PROPERTY(double MinimumRate READ minimumRate)
+    double minimumRate() const;
+
+    Q_PROPERTY(QString PlaybackStatus READ playbackStatus)
+    QString playbackStatus() const;
+
+    Q_PROPERTY(qlonglong Position READ position)
+    qlonglong position() const;
+
+    Q_PROPERTY(double Rate READ rate WRITE setRate)
+    double rate() const;
+    void setRate(double value);
+
+    Q_PROPERTY(bool Shuffle READ shuffle WRITE setShuffle)
+    bool shuffle() const;
+    void setShuffle(bool value);
+
+    Q_PROPERTY(double Volume READ volume WRITE setVolume)
+    double volume() const;
+    void setVolume(double value);
+
+public Q_SLOTS: // METHODS
+    void Next();
+    void OpenUri(const QString &Uri);
+    void Pause();
+    void Play();
+    void PlayPause();
+    void Previous();
+    void Seek(qlonglong Offset);
+    void SetPosition(const QDBusObjectPath &TrackId, qlonglong Position);
+    void Stop();
+Q_SIGNALS: // SIGNALS
+    void Seeked(qlonglong Position);
+};
+
+#endif
diff --git a/src/welle-gui/mpris/org.mpris.MediaPlayer2.Player.xml b/src/welle-gui/mpris/org.mpris.MediaPlayer2.Player.xml
new file mode 100644
index 0000000..711a74e
--- /dev/null
+++ b/src/welle-gui/mpris/org.mpris.MediaPlayer2.Player.xml
@@ -0,0 +1,43 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<node>
+	<interface name='org.mpris.MediaPlayer2.Player'>
+		<method name='Next'/>
+		<method name='Previous'/>
+		<method name='Pause'/>
+		<method name='PlayPause'/>
+		<method name='Stop'/>
+		<method name='Play'/>
+		<method name='Seek'>
+			<arg direction='in' name='Offset' type='x'/>
+		</method>
+		<method name='SetPosition'>
+			<arg direction='in' name='TrackId' type='o'/>
+			<arg direction='in' name='Position' type='x'/>
+		</method>
+		<method name='OpenUri'>
+			<arg direction='in' name='Uri' type='s'/>
+		</method>
+		<signal name='Seeked'>
+			<arg name='Position' type='x'/>
+		</signal>
+		<property name='PlaybackStatus' type='s' access='read'/>
+		<property name='LoopStatus' type='s' access='readwrite'/>
+		<property name='Rate' type='d' access='readwrite'/>
+		<property name='Shuffle' type='b' access='readwrite'/>
+		<property name='Metadata' type='a{sv}' access='read'>
+			<annotation name="org.qtproject.QtDBus.QtTypeName" value="QVariantMap"/>
+		</property>
+		<property name='Volume' type='d' access='readwrite'/>
+		<property name='Position' type='x' access='read'/>
+		<property name='MinimumRate' type='d' access='read'/>
+		<property name='MaximumRate' type='d' access='read'/>
+		<property name='CanGoNext' type='b' access='read'/>
+		<property name='CanGoPrevious' type='b' access='read'/>
+		<property name='CanPlay' type='b' access='read'/>
+		<property name='CanPause' type='b' access='read'/>
+		<property name='CanSeek' type='b' access='read'/>
+		<property name='CanControl' type='b' access='read'/>
+	</interface>
+</node>
diff --git a/src/welle-gui/mpris/org.mpris.MediaPlayer2.xml b/src/welle-gui/mpris/org.mpris.MediaPlayer2.xml
new file mode 100644
index 0000000..7e8d728
--- /dev/null
+++ b/src/welle-gui/mpris/org.mpris.MediaPlayer2.xml
@@ -0,0 +1,18 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+
+<node>
+	<interface name='org.mpris.MediaPlayer2'>
+		<method name='Raise'/>
+		<method name='Quit'/>
+		<property name='CanQuit' type='b' access='read'/>
+		<property name='Fullscreen' type='b' access='readwrite'/>
+		<property name='CanSetFullscreen' type='b' access='read'/>
+		<property name='CanRaise' type='b' access='read'/>
+		<property name='HasTrackList' type='b' access='read'/>
+		<property name='Identity' type='s' access='read'/>
+		<property name='DesktopEntry' type='s' access='read'/>
+		<property name='SupportedUriSchemes' type='as' access='read'/>
+		<property name='SupportedMimeTypes' type='as' access='read'/>
+	</interface>
+</node>
diff --git a/src/welle-gui/radio_controller.cpp b/src/welle-gui/radio_controller.cpp
index bdc0f85..5d20e76 100644
--- a/src/welle-gui/radio_controller.cpp
+++ b/src/welle-gui/radio_controller.cpp
@@ -237,33 +237,56 @@ void CRadioController::play(QString channel, QString title, quint32 service)
         stopScan();
     }
 
-    deviceRestart();
+    bool isRestartOk = deviceRestart();
     setChannel(channel, false);
     setService(service);
 
     currentLastChannel = QStringList() << serialise_serviceid(service) << channel;
     QSettings settings;
     settings.setValue("lastchannel", currentLastChannel);
+
+    if (isRestartOk) {
+        isPlaying = true;
+        emit isPlayingChanged(isPlaying);
+    } else {
+        resetTechnicalData();
+        currentTitle = title;
+        emit titleChanged();
+        currentText = tr("Playback failed");
+        emit textChanged();
+    }
 }
 
 void CRadioController::stop()
 {
+    if (radioReceiver) {
+        radioReceiver->stop();
+    }
+
     if (device) {
         device->stop();
     }
     else
         throw std::runtime_error("device is null in file " + std::string(__FILE__) +":"+ std::to_string(__LINE__));
 
-    audio.reset();
+    QString title = currentTitle;
+    resetTechnicalData();
+    currentTitle = title;
+    emit titleChanged();
+    currentText = tr("Stopped");
+    emit textChanged();
+
+    audio.stop();
     labelTimer.stop();
 }
 
 void CRadioController::setService(uint32_t service, bool force)
 {
-    if (currentService != service or force) {
+    if (currentService != service or force or isPlaying == false) {
         currentService = service;
         autoService = service;
         emit stationChanged();
+        emit autoServiceChanged(autoService);
 
         // Wait if we found the station inside the signal
         stationTimer.start(1000);
@@ -286,7 +309,9 @@ void CRadioController::setAutoPlay(bool isAutoPlayValue, QString channel, QStrin
 {
     isAutoPlay = isAutoPlayValue;
     autoChannel = channel;
+    emit autoChannelChanged(autoChannel);
     autoService = deserialise_serviceid(service.toStdString().c_str());
+    emit autoServiceChanged(autoService);
     currentLastChannel = QStringList() << service << channel;
 }
 
@@ -299,17 +324,21 @@ void CRadioController::setVolume(qreal Volume)
 
 void CRadioController::setChannel(QString Channel, bool isScan, bool Force)
 {
-    if (currentChannel != Channel || Force == true) {
+    if (currentChannel != Channel || Force == true || isPlaying == false) {
         if (device && device->getID() == CDeviceID::RAWFILE) {
             currentChannel = "File";
-            autoChannel = currentChannel;
+            if (!isScan)
+                autoChannel = currentChannel;
             currentEId = 0;
             currentEnsembleLabel = "";
             currentFrequency = 0;
         }
         else { // A real device
+            if(radioReceiver)
+                radioReceiver->stop(); // Stop the demodulator in order to avoid working with old data
             currentChannel = Channel;
-            autoChannel = currentChannel;
+            if (!isScan)
+                autoChannel = currentChannel;
             currentEId = 0;
             currentEnsembleLabel = "";
 
@@ -331,6 +360,8 @@ void CRadioController::setChannel(QString Channel, bool isScan, bool Force)
         }
 
         emit channelChanged();
+        if (!isScan)
+            emit autoChannelChanged(autoChannel);
         emit ensembleChanged();
         emit frequencyChanged();
     }
@@ -368,6 +399,8 @@ void CRadioController::startScan(void)
 {
     qDebug() << "RadioController:" << "Start channel scan";
 
+    stop();
+
     deviceRestart();
 
     if(device && device->getID() == CDeviceID::RAWFILE) {
@@ -383,6 +416,7 @@ void CRadioController::startScan(void)
         setChannel(Channel, true);
 
         isChannelScan = true;
+        emit isChannelScanChanged(isChannelScan);
         stationCount = 0;
         currentTitle = tr("Scanning") + " ... " + Channel
                 + " (" + QString::number((1 * 100 / NUMBEROFCHANNELS)) + "%)";
@@ -415,6 +449,7 @@ void CRadioController::stopScan(void)
     emit textChanged();
 
     isChannelScan = false;
+    emit isChannelScanChanged(isChannelScan);
     emit scanStopped();
 
     stop();
@@ -635,38 +670,56 @@ void CRadioController::resetTechnicalData(void)
     currentText = "";
     emit textChanged();
 
+    isPlaying = false;
+    emit isPlayingChanged(isPlaying);
+
     errorMsg = "";
     isSync = false;
+    emit isSyncChanged(isSync);
     isFICCRC = false;
+    emit isFICCRCChanged(isFICCRC);
     isSignal = false;
+    emit isSignalChanged(isSignal);
     snr = 0;
+    emit snrChanged(snr);
     frequencyCorrection = 0;
+    emit frequencyCorrectionChanged(frequencyCorrection);
     frequencyCorrectionPpm = NAN;
+    emit frequencyCorrectionPpmChanged(frequencyCorrectionPpm);
     bitRate = 0;
+    emit bitRateChanged(bitRate);
     audioSampleRate = 0;
     isDAB = true;
+    emit isDABChanged(isDAB);
     frameErrors = 0;
-    rsErrors = 0;
+    emit frameErrorsChanged(frameErrors);
+    rsUncorrectedErrors = 0;
+    emit rsUncorrectedErrorsChanged(this->rsUncorrectedErrors);
+    emit rsCorrectedErrorsChanged(this->rsCorrectedErrors);
     aaErrors = 0;
+    emit aacErrorsChanged(aaErrors);
 
     emit motReseted();
 }
 
-void CRadioController::deviceRestart()
+bool CRadioController::deviceRestart()
 {
     bool isPlay = false;
 
     if(device) {
         isPlay = device->restart();
+    } else {
+        return false;
     }
 
     if(!isPlay) {
         qDebug() << "RadioController:" << "Radio device is not ready or does not exist.";
         emit showErrorMessage(tr("Radio device is not ready or does not exist."));
-        return;
+        return false;
     }
 
     labelTimer.start(40);
+    return true;
 }
 
 /*****************
@@ -954,7 +1007,7 @@ void CRadioController::onMessage(message_level_t level, const std::string& text,
     }
 }
 
-void CRadioController::onSNR(int snr)
+void CRadioController::onSNR(float snr)
 {
     if (this->snr == snr)
         return;
@@ -1024,12 +1077,17 @@ void CRadioController::onFrameErrors(int frameErrors)
 
 void CRadioController::onRsErrors(bool uncorrectedErrors, int numCorrectedErrors)
 {
-    (void)numCorrectedErrors;
+    if (this->rsUncorrectedErrors != uncorrectedErrors)
+    {
+        this->rsUncorrectedErrors = uncorrectedErrors;
+        emit rsUncorrectedErrorsChanged(this->rsUncorrectedErrors);
+    }
 
-    if (this->rsErrors == uncorrectedErrors ? 1 : 0)
-        return;
-    this->rsErrors = uncorrectedErrors ? 1 : 0;
-    emit rsErrorsChanged(this->rsErrors);
+    if (this->rsCorrectedErrors != numCorrectedErrors)
+    {
+        this->rsCorrectedErrors = numCorrectedErrors;
+        emit rsCorrectedErrorsChanged(this->rsCorrectedErrors);
+    }
 }
 
 void CRadioController::onAacErrors(int aacErrors)
diff --git a/src/welle-gui/radio_controller.h b/src/welle-gui/radio_controller.h
index 2d80875..f913180 100644
--- a/src/welle-gui/radio_controller.h
+++ b/src/welle-gui/radio_controller.h
@@ -63,17 +63,20 @@ class CRadioController :
     Q_PROPERTY(QString deviceName MEMBER deviceName NOTIFY deviceNameChanged)
     Q_PROPERTY(CDeviceID deviceId  MEMBER deviceId NOTIFY deviceIdChanged)
     Q_PROPERTY(QDateTime dateTime MEMBER currentDateTime NOTIFY dateTimeChanged)
+    Q_PROPERTY(bool isPlaying MEMBER isPlaying NOTIFY isPlayingChanged)
+    Q_PROPERTY(bool isChannelScan MEMBER isChannelScan NOTIFY isChannelScanChanged)
     Q_PROPERTY(bool isSync MEMBER isSync NOTIFY isSyncChanged)
     Q_PROPERTY(bool isFICCRC MEMBER isFICCRC NOTIFY isFICCRCChanged)
     Q_PROPERTY(bool isSignal MEMBER isSignal NOTIFY isSignalChanged)
     Q_PROPERTY(QString audioMode MEMBER audioMode NOTIFY audioModeChanged)
     Q_PROPERTY(bool isDAB MEMBER isDAB NOTIFY isDABChanged)
-    Q_PROPERTY(int snr MEMBER snr NOTIFY snrChanged)
+    Q_PROPERTY(float snr MEMBER snr NOTIFY snrChanged)
     Q_PROPERTY(int frequencyCorrection MEMBER frequencyCorrection NOTIFY frequencyCorrectionChanged)
     Q_PROPERTY(float frequencyCorrectionPpm MEMBER frequencyCorrectionPpm NOTIFY frequencyCorrectionPpmChanged)
     Q_PROPERTY(int bitRate MEMBER bitRate NOTIFY bitRateChanged)
     Q_PROPERTY(int frameErrors MEMBER frameErrors NOTIFY frameErrorsChanged)
-    Q_PROPERTY(int rsErrors MEMBER rsErrors NOTIFY rsErrorsChanged)
+    Q_PROPERTY(int rsUncorrectedErrors MEMBER rsUncorrectedErrors NOTIFY rsUncorrectedErrorsChanged)
+    Q_PROPERTY(int rsCorrectedErrors MEMBER rsCorrectedErrors NOTIFY rsCorrectedErrorsChanged)
     Q_PROPERTY(int aacErrors MEMBER aaErrors NOTIFY aacErrorsChanged)
     Q_PROPERTY(bool agc MEMBER isAGC WRITE setAGC NOTIFY agcChanged)
     Q_PROPERTY(float gainValue MEMBER currentManualGainValue NOTIFY gainValueChanged)
@@ -84,9 +87,11 @@ class CRadioController :
 
     Q_PROPERTY(QString channel MEMBER currentChannel NOTIFY channelChanged)
     Q_PROPERTY(QStringList lastChannel MEMBER currentLastChannel NOTIFY lastChannelChanged)
+    Q_PROPERTY(QString autoChannel MEMBER autoChannel NOTIFY autoChannelChanged)
     Q_PROPERTY(QString ensemble MEMBER currentEnsembleLabel NOTIFY ensembleChanged)
     Q_PROPERTY(int frequency MEMBER currentFrequency NOTIFY frequencyChanged)
     Q_PROPERTY(quint32 service MEMBER currentService NOTIFY stationChanged)
+    Q_PROPERTY(quint32 autoService MEMBER autoService NOTIFY autoServiceChanged)
     Q_PROPERTY(QString stationType MEMBER currentStationType NOTIFY stationTypChanged)
     Q_PROPERTY(QString languageType MEMBER currentLanguageType NOTIFY languageTypeChanged)
     Q_PROPERTY(QString title MEMBER currentTitle NOTIFY titleChanged)
@@ -105,7 +110,7 @@ public:
     void setDeviceParam(QString param, QString value);
     Q_INVOKABLE void play(QString channel, QString title, quint32 service);
     void pause();
-    void stop();
+    Q_INVOKABLE void stop();
     void setService(uint32_t service, bool force = false);
     void setChannel(QString Channel, bool isScan, bool Force = false);
     Q_INVOKABLE void setManualChannel(QString Channel);
@@ -138,7 +143,7 @@ public:
     virtual void onNewDynamicLabel(const std::string& label) override;
     virtual void onMOT(const mot_file_t& mot_file) override;
     virtual void onPADLengthError(size_t announced_xpad_len, size_t xpad_len) override;
-    virtual void onSNR(int snr) override;
+    virtual void onSNR(float snr) override;
     virtual void onFrequencyCorrectorChange(int fine, int coarse) override;
     virtual void onSyncChange(char isSync) override;
     virtual void onSignalPresence(bool isSignal) override;
@@ -157,7 +162,7 @@ public:
 private:
     void initialise(void);
     void resetTechnicalData(void);
-    void deviceRestart(void);
+    bool deviceRestart(void);
 
     std::shared_ptr<CVirtualInput> device;
     QVariantMap commandLineOptions;
@@ -178,18 +183,20 @@ private:
 
     QString errorMsg;
     QDateTime currentDateTime;
+    bool isPlaying = false;
     bool isSync = false;
     bool isFICCRC = false;
     bool isSignal = false;
     bool isDAB = false;
     QString audioMode = "";
-    int snr = 0;
+    float snr = 0;
     int frequencyCorrection = 0;
     float frequencyCorrectionPpm = 0.0;
     int bitRate = 0;
     int audioSampleRate = 0;
     int frameErrors = 0;
-    int rsErrors = 0;
+    int rsUncorrectedErrors = 0;
+    int rsCorrectedErrors = 0;
     int aaErrors = 0;
     int gainCount = 0;
     int stationCount = 0;
@@ -250,17 +257,20 @@ signals:
     void deviceNameChanged();
     void deviceIdChanged();
     void dateTimeChanged(QDateTime);
+    void isPlayingChanged(bool);
+    void isChannelScanChanged(bool isChannelScan);
     void isSyncChanged(bool);
     void isFICCRCChanged(bool);
     void isSignalChanged(bool);
     void isDABChanged(bool);
     void audioModeChanged(QString);
-    void snrChanged(int);
+    void snrChanged(float);
     void frequencyCorrectionChanged(int);
     void frequencyCorrectionPpmChanged(float);
     void bitRateChanged(int);
     void frameErrorsChanged(int);
-    void rsErrorsChanged(int);
+    void rsUncorrectedErrorsChanged(int);
+    void rsCorrectedErrorsChanged(int);
     void aacErrorsChanged(int);
     void gainCountChanged(int);
 
@@ -269,15 +279,17 @@ signals:
     void agcChanged(bool);
     void gainValueChanged(float);
     void gainChanged(int);
-    void volumeChanged(qreal);
+    void volumeChanged(qreal volume);
     void motChanged(mot_file_t);
     void motReseted(void);
 
     void channelChanged();
     void lastChannelChanged();
+    void autoChannelChanged(QString autoChannel);
     void ensembleChanged();
     void frequencyChanged();
     void stationChanged();
+    void autoServiceChanged(quint32 autoService);
     void stationTypChanged();
     void titleChanged();
     void textChanged();
diff --git a/src/welle-gui/resources.qrc b/src/welle-gui/resources.qrc
index 588b697..12c5d3c 100644
--- a/src/welle-gui/resources.qrc
+++ b/src/welle-gui/resources.qrc
@@ -24,6 +24,8 @@
         <file>icons/welle_io_icons/20x20/antenna_no_signal.png</file>
         <file>icons/welle_io_icons/20x20/speaker.png</file>
         <file>icons/welle_io_icons/20x20/speaker_mute.png</file>
+        <file>icons/welle_io_icons/20x20/play.png</file>
+        <file>icons/welle_io_icons/20x20/stop.png</file>
         <file>icons/welle_io_icons/20x20@2/back.png</file>
         <file>icons/welle_io_icons/20x20@2/next.png</file>
         <file>icons/welle_io_icons/20x20@2/drawer.png</file>
@@ -35,6 +37,8 @@
         <file>icons/welle_io_icons/20x20@2/antenna_no_signal.png</file>
         <file>icons/welle_io_icons/20x20@2/speaker.png</file>
         <file>icons/welle_io_icons/20x20@2/speaker_mute.png</file>
+        <file>icons/welle_io_icons/20x20@2/play.png</file>
+        <file>icons/welle_io_icons/20x20@2/stop.png</file>
         <file>icons/welle_io_icons/20x20@3/back.png</file>
         <file>icons/welle_io_icons/20x20@3/next.png</file>
         <file>icons/welle_io_icons/20x20@3/drawer.png</file>
@@ -46,6 +50,8 @@
         <file>icons/welle_io_icons/20x20@3/antenna_no_signal.png</file>
         <file>icons/welle_io_icons/20x20@3/speaker.png</file>
         <file>icons/welle_io_icons/20x20@3/speaker_mute.png</file>
+        <file>icons/welle_io_icons/20x20@3/play.png</file>
+        <file>icons/welle_io_icons/20x20@3/stop.png</file>
         <file>icons/welle_io_icons/20x20@4/back.png</file>
         <file>icons/welle_io_icons/20x20@4/next.png</file>
         <file>icons/welle_io_icons/20x20@4/drawer.png</file>
@@ -57,6 +63,8 @@
         <file>icons/welle_io_icons/20x20@4/antenna_no_signal.png</file>
         <file>icons/welle_io_icons/20x20@4/speaker.png</file>
         <file>icons/welle_io_icons/20x20@4/speaker_mute.png</file>
+        <file>icons/welle_io_icons/20x20@4/play.png</file>
+        <file>icons/welle_io_icons/20x20@4/stop.png</file>
         <file>i18n/de_DE.qm</file>
         <file>i18n/it_IT.qm</file>
         <file>i18n/hu_HU.qm</file>
@@ -93,6 +101,7 @@
         <file>QML/components/WButton.qml</file>
         <file>QML/components/WSpectrum.qml</file>
         <file>QML/components/WMenu.qml</file>
+        <file>QML/components/WToolTip.qml</file>
         <file>QML/components/qmldir</file>
         <file>QML/expertviews/ServiceDetails.qml</file>
         <file>QML/expertviews/ImpulseResponseGraph.qml</file>
diff --git a/src/welle-gui/version.h b/src/welle-gui/version.h
index 0e13fa4..c10d7dd 100644
--- a/src/welle-gui/version.h
+++ b/src/welle-gui/version.h
@@ -5,5 +5,5 @@
 #define GITHASH "unknown"
 #endif
 
-#define CURRENT_VERSION "2.2"
+#define CURRENT_VERSION "2.4"
 
diff --git a/src/welle-gui/waterfallitem.cpp b/src/welle-gui/waterfallitem.cpp
index 6b58a48..5ac6d9d 100644
--- a/src/welle-gui/waterfallitem.cpp
+++ b/src/welle-gui/waterfallitem.cpp
@@ -40,7 +40,6 @@ WaterfallItem::WaterfallItem(QQuickItem *parent)
     _samplesUpdated = false;
     _image = QImage((int)this->width(), (int)this->height(), QImage::Format_ARGB32);
     _image.fill(QColor(255, 255, 255));
-    _sensitivity = 0.05;
 
     // Generate displayable colors
     QImage img(500, 1, QImage::Format_ARGB32);
@@ -113,15 +112,6 @@ void WaterfallItem::plotMessage(QString message)
     messageToPlot = message;
 }
 
-float WaterfallItem::sensitivity() const {
-    return _sensitivity;
-}
-
-void WaterfallItem::setSensitivity(float value) {
-    _sensitivity = value;
-    emit this->sensitivityChanged();
-}
-
 float WaterfallItem::minValue() const
 {
     return _minValue;
@@ -146,11 +136,21 @@ void WaterfallItem::samplesCollected() {
     QPainter painter;
     painter.begin(&img);
 
+    // Find max value
+    float maxValue = 0;
+    for(int x = 0; x < _sampleNumber; x++)
+    {
+        float amplitude = (dataSeries.at(x).y() - _minValue);
+        if(maxValue < amplitude)
+            maxValue = amplitude;
+    }
+
     // Draw 1st pixel row: new values
     for (int x = 0; x < img.width(); x++) {
         unsigned i1 = x * _sampleNumber / img.width();
-        float amplitude = dataSeries.at(i1).y() - _minValue;
-        int value = (int)(amplitude * (float)_sensitivity * (float)_colors.length());
+        float amplitude = (dataSeries.at(i1).y() - _minValue);
+
+        int value = (int)(amplitude / maxValue * 256); // Scale to max value
         if (value < 0)
             value = 0;
         if (value >= _colors.length())
@@ -167,7 +167,7 @@ void WaterfallItem::samplesCollected() {
 
     // Draw message into the plot
     if(!messageToPlot.isEmpty()) {
-        // Draw everthing in black
+        // Draw everything in black
         painter.setPen(QColor("black"));
 
         // Draw horizontal line
diff --git a/src/welle-gui/waterfallitem.h b/src/welle-gui/waterfallitem.h
index 7a27a7a..c9d327d 100644
--- a/src/welle-gui/waterfallitem.h
+++ b/src/welle-gui/waterfallitem.h
@@ -29,13 +29,11 @@ class WaterfallItem : public QQuickPaintedItem
 {
     Q_OBJECT
     Q_PROPERTY(bool isStarted READ isStarted NOTIFY isStartedChanged)
-    Q_PROPERTY(float sensitivity READ sensitivity WRITE setSensitivity NOTIFY sensitivityChanged)
     Q_PROPERTY(float minValue READ minValue WRITE setMinValue NOTIFY minMinValueChanged)
 
     QImage _image;
     QList<QRgb> _colors;
     bool _samplesUpdated;
-    float _sensitivity;
     float _minValue;
     QLineSeries dataSeries;
     QString messageToPlot;
@@ -44,7 +42,6 @@ public:
     explicit WaterfallItem(QQuickItem *parent = 0);
     void paint(QPainter *painter);
     bool isStarted() const;
-    float sensitivity() const;
     void setSensitivity(float value);
     float minValue() const;
     void setMinValue(float value);
diff --git a/src/welle-gui/welle-gui.pro b/src/welle-gui/welle-gui.pro
index ae6761a..6fef182 100644
--- a/src/welle-gui/welle-gui.pro
+++ b/src/welle-gui/welle-gui.pro
@@ -2,7 +2,7 @@ include(../backend.pri)
 
 TEMPLATE = app
 TARGET = welle-io
-QT += quickcontrols2 qml quick charts multimedia
+QT += quickcontrols2 qml quick charts multimedia dbus
 
 RC_ICONS   =    icons/icon.ico
 RESOURCES +=    resources.qrc
@@ -57,7 +57,15 @@ DISTFILES +=    \
     QML/components/WSpectrum.qml \
     QML/components/WMenu.qml \
     QML/expertviews/ServiceDetails.qml \
-    QML/components/WDialog.qml
+    QML/components/WDialog.qml \
+    android/AndroidManifest.xml \
+    android/build.gradle \
+    android/gradle/wrapper/gradle-wrapper.jar \
+    android/gradle/wrapper/gradle-wrapper.properties \
+    android/gradle.properties \
+    android/gradlew \
+    android/gradlew.bat \
+    android/res/values/libs.xml
 
 ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android
 
@@ -84,6 +92,9 @@ HEADERS += \
     gui_helper.h \
     mot_image_provider.h \
     radio_controller.h \
+    mpris/mpris.h \
+    mpris/mpris_mp2.h \
+    mpris/mpris_mp2_player.h \
     waterfallitem.h \
     version.h
 
@@ -94,21 +105,57 @@ SOURCES += \
     gui_helper.cpp \
     mot_image_provider.cpp \
     radio_controller.cpp \
+    mpris/mpris.cpp \
+    mpris/mpris_mp2.cpp \
+    mpris/mpris_mp2_player.cpp \
     waterfallitem.cpp
 
 android {
     QT += androidextras
+    QT += svg
+    QT += multimediawidgets
+    qtHaveModule(virtualkeyboard): QT += virtualkeyboard
+
     HEADERS += android_rtl_sdr.h
     SOURCES += android_rtl_sdr.cpp
+
+    # Remove MPRIS related code since Qt for Android doesn't ship dbus
+    QT -= dbus
+    SOURCES -= \
+        mpris/mpris.cpp \
+        mpris/mpris_mp2.cpp \
+        mpris/mpris_mp2_player.cpp
+    HEADERS -= \
+        mpris/mpris.h \
+        mpris/mpris_mp2.h \
+        mpris/mpris_mp2_player.h
 }
 
-# Include git hash into build
+# Include git hash & BUILD_DATE into build
 unix: {
     GITHASHSTRING = $$system(git rev-parse --short HEAD)
+    isEmpty(SOURCE_DATE_EPOCH) {
+        SOURCE_DATE_EPOCH=$$(SOURCE_DATE_EPOCH)
+    }
+    isEmpty(SOURCE_DATE_EPOCH) {
+        SOURCE_DATE_EPOCH=$$system(git log -1 --pretty=%ct)
+    }
+    isEmpty(SOURCE_DATE_EPOCH) {
+        SOURCE_DATE_EPOCH=$$system(date +%s)
+    }
 }
 
 win32 {
     GITHASHSTRING = $$system(git.exe rev-parse --short HEAD)
+    isEmpty(SOURCE_DATE_EPOCH) {
+        SOURCE_DATE_EPOCH=$$(SOURCE_DATE_EPOCH)
+    }
+    isEmpty(SOURCE_DATE_EPOCH) {
+        SOURCE_DATE_EPOCH=$$system(git.exe log -1 --pretty=%ct)
+    }
+    isEmpty(SOURCE_DATE_EPOCH) {
+        SOURCE_DATE_EPOCH=$$system(powershell -Command (Get-Date -UFormat %s -Millisecond 0))
+    }
 } else:macx {
     ICON = icons/icon.icns
 }
@@ -120,3 +167,11 @@ win32 {
 else {
     warning("Can't get git hash.")
 }
+
+!isEmpty(SOURCE_DATE_EPOCH) {
+    message("BUILD_DATE = $$SOURCE_DATE_EPOCH")
+    DEFINES += BUILD_DATE=\\\"$$SOURCE_DATE_EPOCH\\\"
+}
+else {
+    warning("BUILD_DATE could not be set.")
+}
diff --git a/welle.io.pro b/welle.io.pro
index cf8e069..befece9 100644
--- a/welle.io.pro
+++ b/welle.io.pro
@@ -1,11 +1,11 @@
 TEMPLATE = subdirs
 SUBDIRS = src/welle-gui
 
-!android: {
-SUBDIRS += \
-    src/welle-cli \
-    src/tests
-}
+#!android: {
+#SUBDIRS += \
+#    src/welle-cli \
+#    src/tests
+#}
 
 DISTFILES += $$PWD/README.md
 
diff --git a/windows/create_installer.ps1 b/windows/create_installer.ps1
index 86c33eb..882f248 100644
--- a/windows/create_installer.ps1
+++ b/windows/create_installer.ps1
@@ -79,5 +79,5 @@ $Filename = $Date + "_" + $gitHash + "_Windows_welle-io-setup.exe"
 Write-Host "*** Creating $Filename ***" -ForegroundColor Red
 & "binarycreator" "--offline-only" "--config" "installer\config\config.xml" "--packages" "installer\packages" "$Filename"
 
-# Store file name to a enviroment variable
+# Store file name to a environment variable
 $env:welle_io_filename = $Filename
diff --git a/windows/packages/io.welle.welle/meta/package.xml b/windows/packages/io.welle.welle/meta/package.xml
index 72a7b8f..dbd0644 100644
--- a/windows/packages/io.welle.welle/meta/package.xml
+++ b/windows/packages/io.welle.welle/meta/package.xml
@@ -2,8 +2,8 @@
 <Package>
     <DisplayName>welle.io</DisplayName>
     <Description>welle.io</Description>
-    <Version>2.0</Version>
-    <ReleaseDate>2018-09-07</ReleaseDate>
+    <Version>2.3</Version>
+    <ReleaseDate>2021-05-22</ReleaseDate>
     <Licenses>
         <License name="GNU GENERAL PUBLIC LICENSE" file="COPYING" />
     </Licenses>

More details

Full run details