diff --git a/packages/addons/addon-depends/pcre2/package.mk b/packages/addons/addon-depends/pcre2/package.mk
new file mode 100644
index 0000000000..28ba317c6b
--- /dev/null
+++ b/packages/addons/addon-depends/pcre2/package.mk
@@ -0,0 +1,21 @@
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv)
+
+PKG_NAME="pcre2"
+PKG_VERSION="10.36"
+PKG_SHA256="a9ef39278113542968c7c73a31cfcb81aca1faa64690f400b907e8ab6b4a665c"
+PKG_LICENSE="BSD"
+PKG_SITE="http://www.pcre.org/"
+PKG_URL="https://ftp.pcre.org/pub/pcre/pcre2-${PKG_VERSION}.tar.bz2"
+PKG_DEPENDS_TARGET="toolchain"
+PKG_LONGDESC="A set of functions that implement regular expression pattern matching using the same syntax."
+PKG_TOOLCHAIN="cmake"
+PKG_BUILD_FLAGS="+pic"
+
+PKG_CMAKE_OPTS_TARGET="-DBUILD_SHARED_LIBS=OFF \
+ -DPCRE2_BUILD_PCRE2_16=ON \
+ -DPCRE2_SUPPORT_LIBREADLINE=OFF"
+
+post_makeinstall_target() {
+ safe_remove ${INSTALL}/usr/bin
+}
diff --git a/packages/addons/service/tvheadend43/addon.xml b/packages/addons/service/tvheadend43/addon.xml
new file mode 100644
index 0000000000..92b199becf
--- /dev/null
+++ b/packages/addons/service/tvheadend43/addon.xml
@@ -0,0 +1,34 @@
+
+
+
+
+@REQUIRES@
+
+
+ @PKG_ADDON_PROVIDES@
+
+
+ @PKG_ADDON_PROVIDES@
+
+
+ @PKG_SHORTDESC@
+
+@PKG_LONGDESC@
+
+
+@PKG_DISCLAIMER@
+
+ all
+
+@PKG_ADDON_NEWS@
+
+
+ resources/icon.png
+ resources/fanart.png
+@PKG_ADDON_SCREENSHOT@
+
+
+
diff --git a/packages/addons/service/tvheadend43/changelog.txt b/packages/addons/service/tvheadend43/changelog.txt
new file mode 100644
index 0000000000..939a143a03
--- /dev/null
+++ b/packages/addons/service/tvheadend43/changelog.txt
@@ -0,0 +1,2 @@
+100
+- initial LibreELEC version
diff --git a/packages/addons/service/tvheadend43/icon/icon.png b/packages/addons/service/tvheadend43/icon/icon.png
new file mode 100644
index 0000000000..1e25ce8b91
Binary files /dev/null and b/packages/addons/service/tvheadend43/icon/icon.png differ
diff --git a/packages/addons/service/tvheadend43/package.mk b/packages/addons/service/tvheadend43/package.mk
new file mode 100644
index 0000000000..4e074b70eb
--- /dev/null
+++ b/packages/addons/service/tvheadend43/package.mk
@@ -0,0 +1,130 @@
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
+
+PKG_NAME="tvheadend43"
+PKG_VERSION="fe0e5f1f9c8fa175183cede9b3182fb25de2d367"
+PKG_SHA256="64f006c76f6bb6f17bc5420ff42b7d9ca2530ae9fdd1a835afa91c8acecad3b7"
+PKG_VERSION_NUMBER="4.3-1940"
+PKG_REV="100"
+PKG_ARCH="any"
+PKG_LICENSE="GPL"
+PKG_SITE="http://www.tvheadend.org"
+PKG_URL="https://github.com/tvheadend/tvheadend/archive/${PKG_VERSION}.tar.gz"
+PKG_DEPENDS_TARGET="toolchain avahi comskip curl dvb-apps ffmpegx libdvbcsa libhdhomerun \
+ libiconv openssl pcre2 pngquant:host Python3:host tvh-dtv-scan-tables"
+PKG_DEPENDS_CONFIG="ffmpegx"
+PKG_SECTION="service"
+PKG_SHORTDESC="Tvheadend: a TV streaming server for Linux"
+PKG_LONGDESC="Tvheadend (${PKG_VERSION_NUMBER}): is a TV streaming server for Linux supporting DVB-S/S2, DVB-C, DVB-T/T2, IPTV, SAT>IP, ATSC and ISDB-T"
+PKG_BUILD_FLAGS="-sysroot"
+
+PKG_IS_ADDON="yes"
+PKG_ADDON_NAME="Tvheadend Server 4.3 (Alpha)"
+PKG_ADDON_TYPE="xbmc.service"
+
+# basic transcoding options
+PKG_TVH_TRANSCODING="\
+ --disable-ffmpeg_static \
+ --disable-libfdkaac_static \
+ --disable-libopus_static \
+ --disable-libtheora \
+ --disable-libtheora_static \
+ --disable-libvorbis_static \
+ --disable-libvpx_static \
+ --disable-libx264_static \
+ --disable-libx265_static \
+ --enable-libav \
+ --enable-libfdkaac \
+ --enable-libopus \
+ --enable-libvorbis \
+ --enable-libvpx \
+ --enable-libx264 \
+ --enable-libx265"
+
+# hw specific transcoding options
+if [ "$TARGET_ARCH" = x86_64 ]; then
+ PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET libva"
+ PKG_TVH_TRANSCODING="$PKG_TVH_TRANSCODING \
+ --enable-vaapi"
+fi
+
+# specific transcoding options
+if [[ "${TARGET_ARCH}" != "x86_64" ]]; then
+ PKG_TVH_TRANSCODING="${PKG_TVH_TRANSCODING} \
+ --disable-libvpx \
+ --disable-libx265"
+fi
+
+post_unpack() {
+ sed -e 's/VER="0.0.0~unknown"/VER="'${PKG_VERSION_NUMBER}' ~ LibreELEC Tvh-addon v'${ADDON_VERSION}'.'${PKG_REV}'"/g' -i ${PKG_BUILD}/support/version
+ sed -e 's|'/usr/bin/pngquant'|'${TOOLCHAIN}/bin/pngquant'|g' -i ${PKG_BUILD}/support/mkbundle
+}
+
+pre_configure_target() {
+ PKG_CONFIGURE_OPTS_TARGET="--prefix=/usr \
+ --arch=${TARGET_ARCH} \
+ --cpu=${TARGET_CPU} \
+ --cc=${CC} \
+ ${PKG_TVH_TRANSCODING} \
+ --enable-avahi \
+ --enable-bundle \
+ --disable-dbus_1 \
+ --enable-dvbcsa \
+ --disable-dvben50221 \
+ --disable-dvbscan \
+ --enable-hdhomerun_client \
+ --disable-hdhomerun_static \
+ --enable-epoll \
+ --enable-inotify \
+ --enable-pngquant \
+ --disable-libmfx_static \
+ --disable-nvenc \
+ --disable-uriparser \
+ --enable-tvhcsa \
+ --enable-trace \
+ --nowerror \
+ --disable-bintray_cache \
+ --python=${TOOLCHAIN}/bin/python"
+
+# fails to build in subdirs
+ cd ${PKG_BUILD}
+ rm -rf .${TARGET_NAME}
+
+# pass ffmpegx to build
+ CFLAGS+=" -I$(get_install_dir ffmpegx)/usr/local/include"
+ LDFLAGS+=" -L$(get_install_dir ffmpegx)/usr/local/lib"
+
+# pass libhdhomerun to build
+ CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/hdhomerun"
+
+ export CROSS_COMPILE="${TARGET_PREFIX}"
+ export CFLAGS+=" -I${SYSROOT_PREFIX}/usr/include/iconv -L${SYSROOT_PREFIX}/usr/lib/iconv"
+}
+
+post_make_target() {
+ ${CC} -O -fbuiltin -fomit-frame-pointer -fPIC -shared -o capmt_ca.so src/extra/capmt_ca.c -ldl
+}
+
+post_makeinstall_target() {
+ mkdir -p ${INSTALL}/usr/lib
+ cp -p capmt_ca.so ${INSTALL}/usr/lib
+}
+
+addon() {
+ mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/bin
+
+ cp ${PKG_DIR}/addon.xml ${ADDON_BUILD}/${PKG_ADDON_ID}
+
+ # set only version (revision will be added by buildsystem)
+ sed -e "s|@ADDON_VERSION@|${ADDON_VERSION}|g" \
+ -i ${ADDON_BUILD}/${PKG_ADDON_ID}/addon.xml
+
+ cp -P ${PKG_INSTALL}/usr/bin/tvheadend ${ADDON_BUILD}/${PKG_ADDON_ID}/bin
+ cp -P ${PKG_INSTALL}/usr/lib/capmt_ca.so ${ADDON_BUILD}/${PKG_ADDON_ID}/bin
+ cp -P $(get_install_dir comskip)/usr/bin/comskip ${ADDON_BUILD}/${PKG_ADDON_ID}/bin
+
+ # dvb-scan files
+ mkdir -p ${ADDON_BUILD}/${PKG_ADDON_ID}/dvb-scan
+ cp -r $(get_install_dir tvh-dtv-scan-tables)/usr/share/dvbv5/* \
+ ${ADDON_BUILD}/${PKG_ADDON_ID}/dvb-scan
+}
diff --git a/packages/addons/service/tvheadend43/patches/tvheadend43-01-dvb-scan-path.patch b/packages/addons/service/tvheadend43/patches/tvheadend43-01-dvb-scan-path.patch
new file mode 100644
index 0000000000..6acc023bd9
--- /dev/null
+++ b/packages/addons/service/tvheadend43/patches/tvheadend43-01-dvb-scan-path.patch
@@ -0,0 +1,11 @@
+--- a/src/input/mpegts/scanfile.c
++++ b/src/input/mpegts/scanfile.c
+@@ -921,7 +921,7 @@ scanfile_init ( const char *muxconf_path
+ #elif defined(PLATFORM_FREEBSD)
+ path = "/usr/local/share/dtv-scan-tables";
+ #else
+- path = "/usr/share/dvb";
++ path = "/storage/.kodi/addons/service.tvheadend43/dvb-scan";
+ #endif
+
+ if (!initialized) {
diff --git a/packages/addons/service/tvheadend43/patches/tvheadend43-02-hdhomerun-includes.patch b/packages/addons/service/tvheadend43/patches/tvheadend43-02-hdhomerun-includes.patch
new file mode 100644
index 0000000000..f5fd399e2d
--- /dev/null
+++ b/packages/addons/service/tvheadend43/patches/tvheadend43-02-hdhomerun-includes.patch
@@ -0,0 +1,35 @@
+fix libhdhomerun includes
+
+--- a/configure
++++ b/configure
+@@ -419,7 +419,7 @@ if enabled hdhomerun_static; then
+ else
+
+ if enabled_or_auto hdhomerun_client; then
+- if check_cc_header 'libhdhomerun/hdhomerun' libhdhomerun; then
++ if check_cc_header 'hdhomerun' libhdhomerun; then
+ enable hdhomerun_client
+ LDFLAGS="$LDFLAGS -lhdhomerun"
+ fi
+--- a/src/input/mpegts/tvhdhomerun/tvhdhomerun.c
++++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun.c
+@@ -17,7 +17,7 @@
+ * along with this program. If not, see .
+ */
+
+-#include "libhdhomerun/hdhomerun.h"
++#include "hdhomerun.h"
+
+ #include "tvheadend.h"
+ #include "input.h"
+--- a/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c
++++ b/src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c
+@@ -17,7 +17,7 @@
+ * along with this program. If not, see .
+ */
+
+-#include "libhdhomerun/hdhomerun.h"
++#include "hdhomerun.h"
+
+ #include
+ #include "tvheadend.h"
diff --git a/packages/addons/service/tvheadend43/source/bin/tv_grab_file b/packages/addons/service/tvheadend43/source/bin/tv_grab_file
new file mode 100755
index 0000000000..f2cf25ed88
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/bin/tv_grab_file
@@ -0,0 +1,76 @@
+#!/bin/sh
+
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
+
+if [ $# -lt 1 ]
+then
+ . /etc/profile
+
+ ADDON_HOME="$HOME/.kodi/userdata/addon_data/service.tvheadend43"
+ ADDON_SETTINGS="$ADDON_HOME/settings.xml"
+ XML_SETTINGS_VER="$(xmlstarlet sel -t -m settings -v @version $ADDON_SETTINGS)"
+ if [ "$XML_SETTINGS_VER" = "2" ]; then
+ XMLTV_TYPE="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_TYPE"]' $ADDON_SETTINGS)"
+ XMLTV_LOCATION_FILE="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_FILE"]' $ADDON_SETTINGS)"
+ XMLTV_LOCATION_WEB="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_WEB"]' $ADDON_SETTINGS | xmlstarlet unesc)"
+ XMLTV_LOCATION_SCRIPT="$(xmlstarlet sel -t -v '/settings/setting[@id="XMLTV_LOCATION_SCRIPT"]' $ADDON_SETTINGS)"
+ else
+ XMLTV_TYPE="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_TYPE"]' -v @value $ADDON_SETTINGS)"
+ XMLTV_LOCATION_FILE="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_FILE"]' -v @value $ADDON_SETTINGS)"
+ XMLTV_LOCATION_WEB="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_WEB"]' -v @value $ADDON_SETTINGS | xmlstarlet unesc)"
+ XMLTV_LOCATION_SCRIPT="$(xmlstarlet sel -t -m '/settings/setting[@id="XMLTV_LOCATION_SCRIPT"]' -v @value $ADDON_SETTINGS)"
+ fi
+
+ if [ "$XMLTV_TYPE" = "FILE" ]; then
+ case "$XMLTV_LOCATION_FILE" in
+ *.gz | *.bz2 | *.xz)
+ zcat "$XMLTV_LOCATION_FILE"
+ ;;
+ *)
+ cat "$XMLTV_LOCATION_FILE"
+ ;;
+ esac
+ exit 0
+ elif [ "$XMLTV_TYPE" = "SCRIPT" ]; then
+ if [ -e "$XMLTV_LOCATION_SCRIPT" ] ; then
+ exec "$XMLTV_LOCATION_SCRIPT"
+ fi
+ elif [ "$XMLTV_TYPE" = "WEB" ]; then
+ case "$XMLTV_LOCATION_WEB" in
+ *.gz | *.bz2 | *.xz)
+ wget -qO - "$XMLTV_LOCATION_WEB" | zcat
+ ;;
+ *)
+ wget -qO - "$XMLTV_LOCATION_WEB"
+ ;;
+ esac
+ exit 0
+ fi
+fi
+
+dflag=
+vflag=
+cflag=
+
+for a in "$@"
+do
+ [ "$a" = "-d" -o "$a" = "--description" ] && dflag=1
+ [ "$a" = "-v" -o "$a" = "--version" ] && vflag=1
+ [ "$a" = "-c" -o "$a" = "--capabilities" ] && cflag=1
+done
+
+if [ -n "$dflag" ]
+then
+ echo "tv_grab_file is a simple grabber that can be configured through the addon settings from Kodi"
+fi
+
+if [ -n "$vflag" ]
+then
+ echo "1.0"
+fi
+
+if [ -n "$cflag" ]
+then
+ echo "baseline"
+fi
diff --git a/packages/addons/service/tvheadend43/source/bin/tvheadend43.start b/packages/addons/service/tvheadend43/source/bin/tvheadend43.start
new file mode 100755
index 0000000000..9bf07a3187
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/bin/tvheadend43.start
@@ -0,0 +1,177 @@
+#!/bin/sh
+
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
+
+. /etc/profile
+
+oe_setup_addon service.tvheadend43
+
+ADDON_SETTINGS="$ADDON_HOME/settings.xml"
+
+COMSKIP_DIR="$ADDON_HOME/comskip"
+COMSKIP_SETTINGS_FILE="$COMSKIP_DIR/comskip.ini"
+
+DVR_SETTINGS_DIR="$ADDON_HOME/dvr/config"
+DVR_SETTINGS_FILE="$DVR_SETTINGS_DIR/8d0f5b7ae354d956d7fe5db25f5d0d24"
+
+EPGGRAB_SETTINGS_DIR="$ADDON_HOME/epggrab"
+EPGGRAB_SETTINGS_FILE="$EPGGRAB_SETTINGS_DIR/config"
+
+TIMESHIFT_SETTINGS_DIR="$ADDON_HOME/timeshift"
+TIMESHIFT_SETTINGS_FILE="$TIMESHIFT_SETTINGS_DIR/config"
+
+TVH_SETTINGS_DIR="$ADDON_HOME"
+TVH_SETTINGS_FILE="$TVH_SETTINGS_DIR/config"
+
+XMLTV_SETTINGS_DIR="$ADDON_HOME/xmltv"
+XMLTV_SETTINGS_FILE="$XMLTV_SETTINGS_DIR/config"
+
+TIMESHIFT_DIR="$ADDON_HOME/cache/timeshift"
+XMLTV_FILE="$ADDON_DIR/bin/tv_grab_file"
+
+chmod a+x $ADDON_DIR/bin/*
+
+# workaround to support old 4.1.x version upgrade for Tvh after 4.1.2369
+if [ -f "$ADDON_HOME/dvr/config/dvr-config" ]; then
+ rm $ADDON_HOME/dvr/config/dvr-config
+fi
+
+# workaround to create default Tvh directories without entering samba share
+if [ ! -d "/storage/recordings" ]; then
+ mkdir -p /storage/recordings /storage/picons/tvh /storage/picons/vdr
+fi
+
+if [ -f "$ADDON_HOME/channel/config/config.tmp" ]; then
+ rm $ADDON_HOME/channel/config/config.tmp
+fi
+
+if [ -f "$ADDON_HOME/channel/config/tag.tmp" ]; then
+ rm $ADDON_HOME/channel/config/tag.tmp
+fi
+
+# copy config files to userdata
+if [ ! -f "$COMSKIP_SETTINGS_FILE" ]; then
+ mkdir -p $COMSKIP_DIR
+ cp $ADDON_DIR/defaults/comskip/comskip.ini $COMSKIP_SETTINGS_FILE
+fi
+
+if [ ! -f "$DVR_SETTINGS_FILE" ]; then
+ mkdir -p $DVR_SETTINGS_DIR
+ cp $ADDON_DIR/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24 $DVR_SETTINGS_FILE
+fi
+
+if [ ! -f "$EPGGRAB_SETTINGS_FILE" ]; then
+ mkdir -p $EPGGRAB_SETTINGS_DIR
+ cp $ADDON_DIR/defaults/epggrab/config $EPGGRAB_SETTINGS_FILE
+fi
+
+if [ ! -f "$TIMESHIFT_SETTINGS_FILE" ]; then
+ mkdir -p $TIMESHIFT_DIR
+ mkdir -p $TIMESHIFT_SETTINGS_DIR
+ cp $ADDON_DIR/defaults/timeshift/config $TIMESHIFT_SETTINGS_FILE
+fi
+
+if [ ! -f "$TVH_SETTINGS_FILE" ]; then
+ mkdir -p $TVH_SETTINGS_DIR
+ cp $ADDON_DIR/defaults/config $TVH_SETTINGS_FILE
+fi
+
+if [ ! -f "$XMLTV_SETTINGS_FILE" ]; then
+ mkdir -p $XMLTV_SETTINGS_DIR
+ cp $ADDON_DIR/defaults/xmltv/config $XMLTV_SETTINGS_FILE
+fi
+
+# delayed Tvh startup
+if [ "$WORKAROUND_SLEEP" == "true" ]; then
+ sleep $WORKAROUND_SLEEP_TIME
+fi
+
+# support FritzBox Sat>IP Server detection workaround for AVM-Repeater and AVM-6490
+if [ "$AVM_SATIP_SERVER" == "true" ]; then
+ if [ "$AVM_DEVICE" == "AVM_Repeater" ]; then
+ AVM_SATIP="--satip_xml http://${AVM_ROUTER_IP}:49000/satipdesc.xml"
+ fi
+ if [ "$AVM_DEVICE" == "AVM_6490" ]; then
+ AVM_SATIP="--satip_xml http://${AVM_ROUTER_FAKE_IP}:49000/satipdesc.xml"
+ AVM_NUM="4"
+ fi
+
+ # add virtual ip as workaround for AVM limitation of one stream per ip
+ # AVM-Repeater (2 tuners)
+ ip address add ${AVM_IP1}/24 dev $AVM_ETH
+ ip address add ${AVM_IP2}/24 dev $AVM_ETH
+
+ # AVM-6490 (4 tuners)
+ if [ "$AVM_NUM" = "4" ]; then
+ ip address add ${AVM_IP3}/24 dev $AVM_ETH
+ ip address add ${AVM_IP4}/24 dev $AVM_ETH
+ fi
+fi
+
+# custom startup parameters
+if [ "$CUSTOM_START" != "true" ]; then
+ CUSTOM_ARGS=""
+fi
+
+# debug value generation
+if [ "$DEBUG_LOG_TRACE_1" != "NONE" ]; then
+ DEBUG_LOG_ARG="$DEBUG_LOG_TRACE_1"
+fi
+
+if [ "$DEBUG_LOG_TRACE_2" != "NONE" ]; then
+ DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_2"
+fi
+
+if [ "$DEBUG_LOG_TRACE_3" != "NONE" ]; then
+ DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_3"
+fi
+
+if [ "$DEBUG_LOG_TRACE_4" != "NONE" ]; then
+ DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_4"
+fi
+
+if [ "$DEBUG_LOG_TRACE_5" != "NONE" ]; then
+ DEBUG_LOG_ARG="$DEBUG_LOG_ARG,$DEBUG_LOG_TRACE_5"
+fi
+
+# if debuglog is activated and nothing selected to trace
+if [ -z "$DEBUG_LOG_ARG" ];then
+ DEBUG_LOG_ARG="all"
+fi
+
+# rename debuglog if already exist to prevent overwriting after crash
+if [ -f "${DEBUG_LOG_PATH}" ]; then
+ cp ${DEBUG_LOG_PATH} ${DEBUG_LOG_PATH}_$(date '+%Y-%m-%d_%H.%M.%S').txt
+fi
+
+# debug commandline
+if [ "$DEBUG_LOG" = "true" ]; then
+ TVHEADEND_ARG="-B -C -u root -g video -c $ADDON_HOME $AVM_SATIP $CUSTOM_ARGS -l ${DEBUG_LOG_PATH} --trace $DEBUG_LOG_ARG"
+else
+ TVHEADEND_ARG="-B -C -u root -g video -c $ADDON_HOME $AVM_SATIP $CUSTOM_ARGS"
+fi
+
+# start userspace DVB driver/addon
+for driver_dvb in $(find /storage/.kodi/addons/driver.dvb.*/bin/userspace-driver.sh -type f 2>/dev/null); do
+ driver_dvb_name=$(echo $driver_dvb | awk 'BEGIN {FS="/"} {printf("%s", $5)}')
+ logger -t Tvheadend "### Loading userspace DVB driver: $driver_dvb_name ###"
+ # use ". " because of variable export
+ . $driver_dvb
+done
+
+if [ "$WAIT_FOR_FEINIT" == "true" ] ; then
+ while [ true ] ; do
+ if [ -e /dev/dvb/adapter$((NUM_ADAPTERS-1))/frontend0 ] ; then
+ break
+ fi
+ sleep 1
+ done
+fi
+
+if [ "$PRELOAD_CAPMT_CA" == "true" ] ; then
+ logger -t Tvheadend "### Preloading capmt_ca.so library ###"
+ LD_PRELOAD="$ADDON_DIR/bin/capmt_ca.so $LD_PRELOAD" exec $ADDON_DIR/bin/tvheadend $TVHEADEND_ARG &>$ADDON_LOG_FILE
+else
+ exec $ADDON_DIR/bin/tvheadend $TVHEADEND_ARG &>$ADDON_LOG_FILE
+fi
diff --git a/packages/addons/service/tvheadend43/source/default.py b/packages/addons/service/tvheadend43/source/default.py
new file mode 100644
index 0000000000..93af06affa
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/default.py
@@ -0,0 +1,20 @@
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
+
+import subprocess
+import xbmc
+import xbmcaddon
+
+
+class Monitor(xbmc.Monitor):
+
+ def __init__(self, *args, **kwargs):
+ xbmc.Monitor.__init__(self)
+ self.id = xbmcaddon.Addon().getAddonInfo('id')
+
+ def onSettingsChanged(self):
+ subprocess.call(['systemctl', 'restart', self.id])
+
+
+if __name__ == "__main__":
+ Monitor().waitForAbort()
diff --git a/packages/addons/service/tvheadend43/source/defaults/comskip/comskip.ini b/packages/addons/service/tvheadend43/source/defaults/comskip/comskip.ini
new file mode 100644
index 0000000000..bf857d44d8
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/defaults/comskip/comskip.ini
@@ -0,0 +1,83 @@
+; See comskip.txt in the distribution zip file for many settable parameters, read manual.html, tuning.html and debugwindow.html for how to tune and debug comskip
+edl_mode=3 ; the mode specified in the generated edl file, 0=cut, 3=commercial break
+mkv_time_offset=30.0 ; offset in seconds, to work around what appears to be an Kodi or ffmpeg bug
+always_keep_first_seconds=2 ; Kodi has a bug that causes a segfault if we don't keep the start of the stream, I'll fix that when I get a chance
+
+detect_method=43 ; 1=black frame, 2=logo, 4=scene change, 8=fuzzy logic, 16=closed captions, 32=aspect ration, 64=silence, 128=cutscenes, 255=all
+validate_silence=1 ; Default, set to 0 to force using this clues if selected above.
+validate_uniform=1 ; Default, set to 0 to force using this clues (like pure white frames) if blackframe is selected above.
+validate_scenechange=1 ; Default, set to 0 to force using this clues if selected above.
+verbose=10 ; show a lot of extra info, level 5 is also OK, set to 0 to disable
+max_brightness=60 ; frame not black if any pixels checked are greater than this (scale 0 to 255)
+test_brightness=40 ; frame not pure black if any pixels checked are greater than this, will check average brightness (scale 0 to 255)
+max_avg_brightness=25 ; maximum average brightness for a dim frame to be considered black (scale 0 to 255) 0 means autosetting
+max_commercialbreak=600 ; maximum length in seconds to consider a segment a commercial break
+min_commercialbreak=25 ; minimum length in seconds to consider a segment a commercial break
+max_commercial_size=125 ; maximum time in seconds for a single commercial or multiple commercials if no breaks in between
+min_commercial_size=4 ; mimimum time in seconds for a single commercial
+min_show_segment_length=250 ; any segment longer than this will be scored towards show.
+non_uniformity=500 ; Set to 0 to disable cutpoints based on uniform frames
+max_volume=500 ; any frame with sound volume larger than this will not be regarded as black frame
+min_silence=12 ; Any deep silence longer than this amount of frames is a possible cutpoint
+ticker_tape=0 ; Amount of pixels from bottom to ignore in all processing
+logo_at_bottom=0 ; Set to 1 to search only for logo at the lower half of the video, do not combine with subtitle setting
+punish=0 ; Compare to average for sum of 1=brightness, 2=uniform 4=volume, 8=silence, 16=schange, set to 0 to disable
+punish_threshold=1.3 ; Multiply when amount is above average * punish_threshold
+punish_modifier=2 ; When above average * threshold multiply score by this value
+intelligent_brightness=0 ; Set to 1 to use a USA specific algorithm to tune some of the settings, not adviced outside the USA
+logo_percentile=0.92 ; if more then this amount of logo is found then logo detection will be disabled
+logo_threshold=0.75
+punish_no_logo=1 ; Default, set to 0 to avoid show segments without logo to be scored towards commercial
+aggressive_logo_rejection=0
+connect_blocks_with_logo=1 ; set to 1 if you want successive blocks with logo on the transition to be regarded as connected, set to 0 to disable
+logo_filter=0 ; set the size of the filter to apply to bad logo detection, 4 seems to be a good value.
+cut_on_ar_change=1 ; set to 1 if you want to cut also on aspect ratio changes when logo is present, set to 2 to force cuts on aspect ratio changes. set to 0 to disable
+delete_show_after_last_commercial=0 ; set to 1 if you want to delete the last block if its a show and after a commercial
+delete_show_before_or_after_current=0 ; set to 1 if you want to delete the previous and the next show in the recording, this can lead to the deletion of trailers of next show
+delete_block_after_commercial=0 ; set to max size of block in seconds to be discarded, set to 0 to disable
+remove_before=0 ; amount of seconds of show to be removed before ALL commercials
+remove_after=0 ; amount of seconds of show to be removed after ALL commercials
+shrink_logo=5 ; Reduce the duration of the logo with this amount of seconds
+after_logo=0 ; set to number of seconds after logo disappears comskip should start to search for silence to insert an additional cutpoint
+padding=0
+ms_audio_delay=5
+volume_slip=40
+skip_b_frames=0 ; Set to 1 to force Comskip to skip frames for higher processing speed.
+hardware_decode=0 ; Set to 1 to enable hardware accelerated video decoding, only available in donator version
+max_repair_size=200 ; Will repair maximum 200 missing MPEG frames in the timeline, set to 0 to disable repairing for players that don't use PTS.
+disable_heuristics=4 ; bit pattern for disabling heuristics, adding 1 disables heristics 1, adding 2 disables heristics 2, adding 4 disables heristics 3, 255 disables all heuristics
+delete_logo_file=0 ; set to 1 if you want comskip to tidy up after finishing
+output_framearray=0 ; create a big excel file for detailed analysis, set to 0 to disable
+output_data=0 ; create a dump of the user data channel, used for CC and XDS (such as V-Chip info). Can be use together with output_framearray to remote debug CC decoding
+output_videoredo=0 ; The old videoredo format
+output_videoredo3=0 ; The new videoredo v3 format.
+output_womble=0
+output_mls=0 ; set to 1 if you want MPeg Video Wizard bookmark file output
+output_cuttermaran=0
+output_mpeg2schnitt=0
+output_mpgtx=0
+output_dvrcut=0
+output_zoomplayer_chapter=0
+output_zoomplayer_cutlist=0
+output_edl=1
+output_dvrmstb=0 ; Set to 1 if you're running DVRMS-Toolbox
+output_edlx=0
+output_vcf=0
+output_bsplayer=0
+output_btv=0 ; set to 1 if you want Beyond TV chapter cutlist output
+output_projectx=0 ; set to 1 if you want ProjectX cutlist output (Xcl)
+output_avisynth=0
+output_vdr=1 ; set to 1 if you want Kodi to skipping commercials
+output_demux=0 ; set to 1 if you want comskip to demux the mpeg file while scanning
+sage_framenumber_bug=0
+sage_minute_bug=0
+live_tv=0 ; set to 1 if you use parallelprocessing and need the output while recording
+live_tv_retries=4 ; change to 16 when using live_tv in BTV, used for mpeg PS and TS
+dvrms_live_tv_retries=300 ; only used for dvr_ms
+standoff=0 ; change to 8000000 when using live_tv in BTV
+
+cuttermaran_options="cut=\"true\" unattended=\"true\" muxResult=\"false\" snapToCutPoints=\"true\" closeApp=\"true\""
+mpeg2schnitt_options="mpeg2schnitt.exe /S /E /R25 /Z %2 %1"
+avisynth_options="LoadPlugin(\"MPEG2Dec3.dll\") \nMPEG2Source(\"%s\")\n"
+dvrcut_options="dvrcut \"%s.dvr-ms\" \"%s_clean.dvr-ms\" "
+windowtitle="Comskip - %s"
\ No newline at end of file
diff --git a/packages/addons/service/tvheadend43/source/defaults/config b/packages/addons/service/tvheadend43/source/defaults/config
new file mode 100644
index 0000000000..de47b6a71c
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/defaults/config
@@ -0,0 +1,14 @@
+{
+ "wizard": "hello",
+ "uilevel": 1,
+ "uilevel_nochange": true,
+ "ui_quicktips": true,
+ "cookie_expires": 14,
+ "caclient_ui": true,
+ "epg_compress": true,
+ "prefer_picon": true,
+ "chiconpath": "file:///storage/picons/tvh/%C.png",
+ "chiconscheme": 2,
+ "piconpath": "file:///storage/picons/vdr/",
+ "piconscheme": 1
+}
diff --git a/packages/addons/service/tvheadend43/source/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24 b/packages/addons/service/tvheadend43/source/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24
new file mode 100644
index 0000000000..95ffc1a31f
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/defaults/dvr/config/8d0f5b7ae354d956d7fe5db25f5d0d24
@@ -0,0 +1,18 @@
+{
+ "storage": "/storage/recordings",
+ "retention-days": 2147483646,
+ "removal-days": 2147483647,
+ "pre-extra-time": 0,
+ "post-extra-time": 0,
+ "day-dir": false,
+ "channel-dir": false,
+ "channel-in-title": true,
+ "date-in-title": true,
+ "time-in-title": true,
+ "whitespace-in-title": false,
+ "title-dir": true,
+ "episode-in-title": true,
+ "tag-files": true,
+ "windows-compatible-filenames": true,
+ "charset": "UTF-8"
+}
diff --git a/packages/addons/service/tvheadend43/source/defaults/epggrab/config b/packages/addons/service/tvheadend43/source/defaults/epggrab/config
new file mode 100644
index 0000000000..230a1cd6f0
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/defaults/epggrab/config
@@ -0,0 +1,79 @@
+{
+ "channel_rename": true,
+ "channel_renumber": false,
+ "channel_reicon": false,
+ "epgdb_periodicsave": 2,
+ "ota_initial": true,
+ "modules": {
+ "opentv-skyit": {
+ "class": "epggrab_mod_ota",
+ "name": "OpenTV: Sky Italia",
+ "type": "Over-the-air",
+ "enabled": true,
+ "priority": 2
+ },
+ "opentv-skynz": {
+ "class": "epggrab_mod_ota",
+ "name": "OpenTV: Sky NZ",
+ "type": "Over-the-air",
+ "enabled": true,
+ "priority": 2
+ },
+ "opentv-skyuk": {
+ "class": "epggrab_mod_ota",
+ "name": "OpenTV: Sky UK",
+ "type": "Over-the-air",
+ "enabled": true,
+ "priority": 2
+ },
+ "opentv-ausat": {
+ "class": "epggrab_mod_ota",
+ "name": "OpenTV: Ausat",
+ "type": "Over-the-air",
+ "enabled": true,
+ "priority": 2
+ },
+ "psip": {
+ "class": "epggrab_mod_ota",
+ "name": "PSIP: ATSC Grabber",
+ "type": "Over-the-air",
+ "enabled": true,
+ "priority": 1
+ },
+ "Bulsatcom_39E": {
+ "class": "epggrab_mod_ota",
+ "name": "Bulsatcom: Bula 39E",
+ "type": "Over-the-air",
+ "enabled": true,
+ "priority": 5
+ },
+ "viasat_baltic": {
+ "class": "epggrab_mod_ota",
+ "name": "VIASAT: Baltic",
+ "type": "Over-the-air",
+ "enabled": true,
+ "priority": 5
+ },
+ "uk_freeview": {
+ "class": "epggrab_mod_ota",
+ "name": "UK: Freeview",
+ "type": "Over-the-air",
+ "enabled": true,
+ "priority": 5
+ },
+ "uk_freesat": {
+ "class": "epggrab_mod_ota",
+ "name": "UK: Freesat",
+ "type": "Over-the-air",
+ "enabled": true,
+ "priority": 5
+ },
+ "eit": {
+ "class": "epggrab_mod_ota",
+ "name": "EIT: DVB Grabber",
+ "type": "Over-the-air",
+ "enabled": true,
+ "priority": 1
+ }
+ }
+}
diff --git a/packages/addons/service/tvheadend43/source/defaults/timeshift/config b/packages/addons/service/tvheadend43/source/defaults/timeshift/config
new file mode 100644
index 0000000000..dc040e68c7
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/defaults/timeshift/config
@@ -0,0 +1,9 @@
+{
+ "enabled": 0,
+ "ondemand": 0,
+ "path": "/storage/.kodi/userdata/addon_data/service.tvheadend43/cache/timeshift",
+ "unlimited_period": 0,
+ "max_period": 3600,
+ "unlimited_size": 0,
+ "max_size": 3072
+}
diff --git a/packages/addons/service/tvheadend43/source/defaults/xmltv/config b/packages/addons/service/tvheadend43/source/defaults/xmltv/config
new file mode 100644
index 0000000000..b76d9b3fc6
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/defaults/xmltv/config
@@ -0,0 +1,14 @@
+{
+ "grabbers": [
+ {
+ "path": "/storage/.kodi/addons/service.tvheadend43/bin/tv_grab_file",
+ "description": "tv_grag_file is a simple grabber that just read the ~/.xmltv/tv_grab_file.xmltv file",
+ "version": "0.1\n",
+ "mtime": 1318774706,
+ "capabilities": 1
+ }
+ ],
+ "grab-interval": 12,
+ "grab-enabled": 1,
+ "current-grabber": "/storage/.kodi/addons/service.tvheadend43/bin/tv_grab_file"
+}
diff --git a/packages/addons/service/tvheadend43/source/download.py b/packages/addons/service/tvheadend43/source/download.py
new file mode 100644
index 0000000000..eb672e0740
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/download.py
@@ -0,0 +1,67 @@
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2018-present Team LibreELEC (https://libreelec.tv)
+
+import urllib.request, urllib.parse, urllib.error, os, zipfile
+from urllib.error import URLError
+import xbmc, xbmcvfs, xbmcgui, xbmcaddon
+import shutil
+import sys
+
+url = 'https://github.com/tvheadend/dtv-scan-tables/archive/tvheadend.zip'
+temp = xbmcvfs.translatePath('special://temp')
+temp_folder = os.path.join(temp, 'dtv-scan-tables-tvheadend')
+dest_folder = os.path.join(xbmcvfs.translatePath(xbmcaddon.Addon().getAddonInfo('path')), 'dvb-scan')
+archive = os.path.join(temp, 'dtv_scantables.zip')
+
+ADDON_NAME = xbmcaddon.Addon().getAddonInfo('name')
+LS = xbmcaddon.Addon().getLocalizedString
+SCANTABLES = ['atsc', 'channels-conf', 'dvb-c', 'dvb-s', 'dvb-t', 'isdb-t']
+
+class DownLoader():
+
+ def __init__(self):
+ self.dp = xbmcgui.DialogProgressBG()
+
+ def download(self, url, dest):
+ try:
+ self.dp.create(ADDON_NAME, LS(30042))
+ urllib.request.urlretrieve(url, dest, reporthook=self._pbhook)
+ self.dp.close()
+ zip = zipfile.ZipFile(archive)
+ if zip.testzip() is not None: raise zipfile.BadZipfile
+
+ if os.path.exists(temp_folder): shutil.rmtree(temp_folder)
+ if os.path.exists(dest_folder): shutil.rmtree(dest_folder)
+
+ self.dp.create(ADDON_NAME, LS(30043))
+ for idx, folder in enumerate(SCANTABLES):
+ self._pbhook(idx, 1, len(SCANTABLES) - 1)
+ for z in zip.filelist:
+ if folder in z.filename: zip.extract(z.filename, temp)
+
+ self.dp.close()
+ for folder in SCANTABLES:
+ shutil.copytree(os.path.join(temp_folder, folder), os.path.join(dest_folder, folder))
+
+ xbmcgui.Dialog().notification(ADDON_NAME, LS(30039), xbmcgui.NOTIFICATION_INFO)
+ except URLError as e:
+ xbmc.log('Could not download file: %s' % e.reason, xbmc.LOGERROR)
+ self.dp.close()
+ xbmcgui.Dialog().notification(ADDON_NAME, LS(30040), xbmcgui.NOTIFICATION_ERROR)
+ except zipfile.BadZipfile:
+ xbmc.log('Could not extract files from zip, bad zipfile', xbmc.LOGERROR)
+ xbmcgui.Dialog().notification(ADDON_NAME, LS(30041), xbmcgui.NOTIFICATION_ERROR)
+
+ def _pbhook(self, numblocks, blocksize, filesize):
+ percent = int((numblocks * blocksize * 100) / filesize)
+ self.dp.update(percent)
+
+
+if __name__ == '__main__':
+ try:
+ if sys.argv[1] == 'getscantables':
+ dl = DownLoader()
+ dl.download(url, archive)
+ except IndexError:
+ pass
+
diff --git a/packages/addons/service/tvheadend43/source/resources/language/English/strings.po b/packages/addons/service/tvheadend43/source/resources/language/English/strings.po
new file mode 100644
index 0000000000..3e854ccab1
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/resources/language/English/strings.po
@@ -0,0 +1,182 @@
+# Kodi Media Center language file
+# Addon Name: tvheadend43
+# Addon id: service.tvheadend43
+# Addon Provider: Team LibreELEC
+msgid ""
+msgstr ""
+
+msgctxt "#30000"
+msgid "XMLTV"
+msgstr ""
+
+msgctxt "#30001"
+msgid "DVB"
+msgstr ""
+
+msgctxt "#30002"
+msgid "DEBUG"
+msgstr ""
+
+msgctxt "#30003"
+msgid "FRITZ!Box Sat>IP"
+msgstr ""
+
+msgctxt "#30004"
+msgid "XMLTV Configuration"
+msgstr ""
+
+msgctxt "#30005"
+msgid "XMLTV source type"
+msgstr ""
+
+msgctxt "#30006"
+msgid "XMLTV File location"
+msgstr ""
+
+msgctxt "#30007"
+msgid "XMLTV Web location"
+msgstr ""
+
+msgctxt "#30008"
+msgid "XMLTV Script location"
+msgstr ""
+
+msgctxt "#30009"
+msgid "DVB Configuration"
+msgstr ""
+
+msgctxt "#30010"
+msgid "Unload DVB modules before suspend"
+msgstr ""
+
+msgctxt "#30011"
+msgid "Wait for frontend initialization"
+msgstr ""
+
+msgctxt "#30012"
+msgid "Number of adapters to wait for"
+msgstr ""
+
+msgctxt "#30013"
+msgid "Preload capmt_ca.so library"
+msgstr ""
+
+msgctxt "#30014"
+msgid "Delay the start of Tvheadend"
+msgstr ""
+
+msgctxt "#30015"
+msgid "Seconds delay"
+msgstr ""
+
+msgctxt "#30016"
+msgid "Custom start parameter"
+msgstr ""
+
+msgctxt "#30017"
+msgid "Parameter"
+msgstr ""
+
+msgctxt "#30018"
+msgid "FRITZ!Box Sat>IP server"
+msgstr ""
+
+msgctxt "#30019"
+msgid "AVM device"
+msgstr ""
+
+msgctxt "#30020"
+msgid "IP of the AVM Repeater"
+msgstr ""
+
+msgctxt "#30021"
+msgid "Router IP range (last digits are always .254)"
+msgstr ""
+
+msgctxt "#30022"
+msgid "Used network"
+msgstr ""
+
+msgctxt "#30023"
+msgid "Virtual IP #1"
+msgstr ""
+
+msgctxt "#30024"
+msgid "Virtual IP #2"
+msgstr ""
+
+msgctxt "#30025"
+msgid "Virtual IP #3"
+msgstr ""
+
+msgctxt "#30026"
+msgid "Virtual IP #4"
+msgstr ""
+
+msgctxt "#30027"
+msgid "TRACE Configuration"
+msgstr ""
+
+msgctxt "#30028"
+msgid "Path"
+msgstr ""
+
+msgctxt "#30029"
+msgid "Activate TRACE Debug"
+msgstr ""
+
+msgctxt "#30030"
+msgid "Debug Value #1"
+msgstr ""
+
+msgctxt "#30031"
+msgid "Debug Value #2"
+msgstr ""
+
+msgctxt "#30032"
+msgid "Debug Value #3"
+msgstr ""
+
+msgctxt "#30033"
+msgid "Debug Value #4"
+msgstr ""
+
+msgctxt "#30034"
+msgid "Debug Value #5"
+msgstr ""
+
+msgctxt "#30035"
+msgid "FRITZ!Box Configuration for FRITZ!OS 6.x (do not use for 7.x)"
+msgstr ""
+
+msgctxt "#30036"
+msgid "Scan Tables"
+msgstr ""
+
+msgctxt "#30037"
+msgid "Manage Scan-Tables"
+msgstr ""
+
+msgctxt "#30038"
+msgid "Download and install Scan-Tables"
+msgstr ""
+
+msgctxt "#30039"
+msgid "Download completed, tables installed"
+msgstr ""
+
+msgctxt "#30040"
+msgid "Could not download Scan-Tables"
+msgstr ""
+
+msgctxt "#30041"
+msgid "Could not extract zip files"
+msgstr ""
+
+msgctxt "#30042"
+msgid "Download Scan-Tables"
+msgstr ""
+
+msgctxt "#30043"
+msgid "Extract Scan-Tables"
+msgstr ""
diff --git a/packages/addons/service/tvheadend43/source/resources/screenshot-01.png b/packages/addons/service/tvheadend43/source/resources/screenshot-01.png
new file mode 100644
index 0000000000..e049349cee
Binary files /dev/null and b/packages/addons/service/tvheadend43/source/resources/screenshot-01.png differ
diff --git a/packages/addons/service/tvheadend43/source/resources/screenshot-02.png b/packages/addons/service/tvheadend43/source/resources/screenshot-02.png
new file mode 100644
index 0000000000..3baa01a479
Binary files /dev/null and b/packages/addons/service/tvheadend43/source/resources/screenshot-02.png differ
diff --git a/packages/addons/service/tvheadend43/source/resources/screenshot-03.png b/packages/addons/service/tvheadend43/source/resources/screenshot-03.png
new file mode 100644
index 0000000000..2b2759ac6f
Binary files /dev/null and b/packages/addons/service/tvheadend43/source/resources/screenshot-03.png differ
diff --git a/packages/addons/service/tvheadend43/source/resources/screenshot-04.png b/packages/addons/service/tvheadend43/source/resources/screenshot-04.png
new file mode 100644
index 0000000000..acba7b4f9d
Binary files /dev/null and b/packages/addons/service/tvheadend43/source/resources/screenshot-04.png differ
diff --git a/packages/addons/service/tvheadend43/source/resources/settings.xml b/packages/addons/service/tvheadend43/source/resources/settings.xml
new file mode 100644
index 0000000000..75820b68ca
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/resources/settings.xml
@@ -0,0 +1,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/addons/service/tvheadend43/source/settings-default.xml b/packages/addons/service/tvheadend43/source/settings-default.xml
new file mode 100644
index 0000000000..567a10b6c1
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/settings-default.xml
@@ -0,0 +1,31 @@
+
+
+ eth0
+ 192.168.178.201
+ 192.168.178.202
+ 192.168.178.203
+ 192.168.178.204
+ 192.168.178.254
+ 192.168.178.2
+ false
+
+ false
+ false
+ /storage/.kodi/userdata/addon_data/service.tvheadend43/debug.txt
+ NONE
+ NONE
+ NONE
+ NONE
+ NONE
+
+ 1
+ false
+
+ false
+ false
+ 1
+
+
+ http://
+ NONE
+
diff --git a/packages/addons/service/tvheadend43/source/sleep.d/tvheadend.power b/packages/addons/service/tvheadend43/source/sleep.d/tvheadend.power
new file mode 100755
index 0000000000..aced838807
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/sleep.d/tvheadend.power
@@ -0,0 +1,29 @@
+#!/bin/sh
+
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2016-present Team LibreELEC (https://libreelec.tv)
+
+. /etc/profile
+
+oe_setup_addon service.tvheadend43
+
+SERVICE="service.tvheadend43"
+
+case "$1" in
+ pre)
+ if systemctl is-active "$SERVICE" &>/dev/null ; then
+ systemctl stop "$SERVICE"
+ for module in $REMOVE_MODULES ; do
+ rmmod $module
+ done
+ fi
+ ;;
+ post)
+ if systemctl is-enabled "$SERVICE" &>/dev/null ; then
+ for module in $REMOVE_MODULES ; do
+ modprobe $module
+ done
+ systemctl start "$SERVICE"
+ fi
+ ;;
+esac
diff --git a/packages/addons/service/tvheadend43/source/system.d/service.tvheadend43.service b/packages/addons/service/tvheadend43/source/system.d/service.tvheadend43.service
new file mode 100644
index 0000000000..d6bdcec021
--- /dev/null
+++ b/packages/addons/service/tvheadend43/source/system.d/service.tvheadend43.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=TVHeadend43 Service
+After=network-online.service
+
+[Service]
+ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.tvheadend43/bin/tvheadend43.start"
+TimeoutStopSec=2
+Restart=always
+RestartSec=2
+StartLimitInterval=0
+
+[Install]
+WantedBy=kodi.target