From 168bab2b01bed17e3e2ac51987e5d88634f49db1 Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Thu, 31 Jan 2019 23:23:55 +0100
Subject: [PATCH 01/15] Rebrand addon name and id and make it compatible with
 Jellyfin

---
 .gitignore                                    |   1 +
 addon.xml                                     |  24 ++---
 context.py                                    |   2 +-
 context_play.py                               |   2 +-
 default.py                                    |   2 +-
 icon.png                                      | Bin 1850 -> 40709 bytes
 .../resource.language.de_de/strings.po        |   2 +-
 .../resource.language.en_gb/strings.po        |   2 +-
 .../resource.language.fr_fr/strings.po        |   2 +-
 .../resource.language.it_it/strings.po        |   2 +-
 .../resource.language.nl_nl/strings.po        |   2 +-
 .../resource.language.pl_pl/strings.po        |   2 +-
 resources/lib/client.py                       |   2 +-
 resources/lib/database/__init__.py            |  10 +--
 resources/lib/downloader.py                   |   2 +-
 resources/lib/emby/core/connection_manager.py |   2 +-
 resources/lib/entrypoint/context.py           |   4 +-
 resources/lib/entrypoint/default.py           |  84 +++++++++---------
 resources/lib/entrypoint/service.py           |   7 +-
 resources/lib/helper/playutils.py             |   2 +-
 resources/lib/helper/translate.py             |   2 +-
 resources/lib/helper/utils.py                 |   6 +-
 resources/lib/monitor.py                      |   8 +-
 resources/lib/objects/actions.py              |  14 +--
 resources/lib/objects/movies.py               |   4 +-
 resources/lib/objects/musicvideos.py          |   2 +-
 resources/lib/objects/tvshows.py              |  10 +--
 resources/lib/player.py                       |   2 +-
 resources/lib/views.py                        |   6 +-
 resources/lib/webservice.py                   |   2 +-
 resources/settings.xml                        |  16 ++--
 .../script-emby-connect-login-manual.xml      |  10 +--
 .../1080i/script-emby-connect-login.xml       |  14 +--
 .../script-emby-connect-server-manual.xml     |  10 +--
 .../1080i/script-emby-connect-server.xml      |   8 +-
 .../1080i/script-emby-connect-users.xml       |   6 +-
 service.py                                    |   2 +-
 37 files changed, 136 insertions(+), 142 deletions(-)

diff --git a/.gitignore b/.gitignore
index 959fc2ad..c0132b4d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,4 @@ machine_guid
 /resources/media/Thumbs.db
 
 .idea/
+.DS_Store
diff --git a/addon.xml b/addon.xml
index d355868e..c5f9cded 100644
--- a/addon.xml
+++ b/addon.xml
@@ -1,13 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon  id="plugin.video.emby"
-        name="Emby" 
-        version="4.0.3"
+<addon  id="plugin.video.jellyfin"
+        name="Jellyfin" 
+        version="10.1.0"
         provider-name="angelblue05">
   <requires>
     <import addon="xbmc.python" version="2.25.0"/>
-    <import addon="plugin.video.emby.movies" version="0.14" />
-    <import addon="plugin.video.emby.tvshows" version="0.14" />
-    <import addon="plugin.video.emby.musicvideos" version="0.14" />
   </requires>
   <extension    point="xbmc.python.pluginsource"
                 library="default.py">
@@ -31,18 +28,13 @@
     <platform>all</platform>
     <language>en</language>
     <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
-    <forum>http://emby.media/community/index.php?/forum/99-kodi/</forum>
-    <website>http://emby.media/</website>
-    <source>https://github.com/MediaBrowser/plugin.video.emby</source>
+    <forum>https://forum.jellyfin.org</forum>
+    <website>https://jellyfin.media/</website>
+    <source>https://github.com/jellyfin/jellyfin-kodi</source>
     <summary lang="en"></summary>
-    <description lang="en">Welcome to Emby for Kodi A whole new way to manage and view your media library. The Emby addon for Kodi combines the best of Kodi - ultra smooth navigation, beautiful UIs and playback of any file under the sun, and Emby - the most powerful fully open source multi-client media metadata indexer and server.&#10;&#10;Emby for Kodi is the absolute best way to enjoy the incredible Kodi playback engine combined with the power of Emby's centralized database. Features: Direct integration with the Kodi library for native Kodi speed Instant synchronization with the Emby server Full support for Movie, TV and Music collections Emby Server direct stream and transcoding support - use Kodi when you are away from home!</description>
+    <description lang="en">Welcome to Jellyfin for Kodi A whole new way to manage and view your media library. The Jellyfin addon for Kodi combines the best of Kodi - ultra smooth navigation, beautiful UIs and playback of any file under the sun, and Jellyfin - the most powerful fully open source multi-client media metadata indexer and server.&#10;&#10;Jellyfin for Kodi is the absolute best way to enjoy the incredible Kodi playback engine combined with the power of Jellyfin's centralized database. Features: Direct integration with the Kodi library for native Kodi speed Instant synchronization with the Jellyfin server Full support for Movie, TV and Music collections Jellyfin Server direct stream and transcoding support - use Kodi when you are away from home!</description>
     <news>
-      New stable release
-      The wiki has been updated, PLEASE READ: https://github.com/MediaBrowser/plugin.video.emby/wiki
-      Fix playback for Kodi Leia
-      Fix masterlock
-      Home videos and pictures now show under videos and picture add-ons
-      Dependencies were updated to 0.14!
+      Rebrand in progress
     </news>
   </extension>
 </addon>
diff --git a/context.py b/context.py
index 3a89a817..fdec02ad 100644
--- a/context.py
+++ b/context.py
@@ -11,7 +11,7 @@ import xbmcaddon
 
 #################################################################################################
 
-__addon__ = xbmcaddon.Addon(id='plugin.video.emby')
+__addon__ = xbmcaddon.Addon(id='plugin.video.jellyfin')
 __base__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'resources', 'lib')).decode('utf-8')
 __libraries__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'libraries')).decode('utf-8')
 __pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'emby')).decode('utf-8')
diff --git a/context_play.py b/context_play.py
index 58ee93fb..6ed686cc 100644
--- a/context_play.py
+++ b/context_play.py
@@ -11,7 +11,7 @@ import xbmcaddon
 
 #################################################################################################
 
-__addon__ = xbmcaddon.Addon(id='plugin.video.emby')
+__addon__ = xbmcaddon.Addon(id='plugin.video.jellyfin')
 __base__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'resources', 'lib')).decode('utf-8')
 __libraries__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'libraries')).decode('utf-8')
 __pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'emby')).decode('utf-8')
diff --git a/default.py b/default.py
index 6f1b05a0..8092bb94 100644
--- a/default.py
+++ b/default.py
@@ -11,7 +11,7 @@ import xbmcaddon
 
 #################################################################################################
 
-__addon__ = xbmcaddon.Addon(id='plugin.video.emby')
+__addon__ = xbmcaddon.Addon(id='plugin.video.jellyfin')
 __base__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'resources', 'lib')).decode('utf-8')
 __libraries__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'libraries')).decode('utf-8')
 __pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'emby')).decode('utf-8')
diff --git a/icon.png b/icon.png
index cb7c85caf3cba44da1dd5bb456035b7622204ff4..6360cfab34c543d457a2d69b2a03ae2ee7ce163b 100644
GIT binary patch
literal 40709
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

literal 1850
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

diff --git a/resources/language/resource.language.de_de/strings.po b/resources/language/resource.language.de_de/strings.po
index 34c9eb7c..ed1a7a15 100644
--- a/resources/language/resource.language.de_de/strings.po
+++ b/resources/language/resource.language.de_de/strings.po
@@ -1,6 +1,6 @@
 # Emby for Kodi language file
 # Addon Name: Emby for Kodi
-# Addon id: plugin.video.emby
+# Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 # Translators:
 # Wolfgang Petri <horstepipe@googlemail.com>, 2018
diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po
index 897396a3..d0408eb8 100644
--- a/resources/language/resource.language.en_gb/strings.po
+++ b/resources/language/resource.language.en_gb/strings.po
@@ -1,6 +1,6 @@
 # Emby for Kodi language file
 # Addon Name: Emby for Kodi
-# Addon id: plugin.video.emby
+# Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 msgid ""
 msgstr ""
diff --git a/resources/language/resource.language.fr_fr/strings.po b/resources/language/resource.language.fr_fr/strings.po
index 356133c1..03a1a716 100644
--- a/resources/language/resource.language.fr_fr/strings.po
+++ b/resources/language/resource.language.fr_fr/strings.po
@@ -1,6 +1,6 @@
 # Emby for Kodi language file
 # Addon Name: Emby for Kodi
-# Addon id: plugin.video.emby
+# Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 # Translators:
 # Jean Fontaine <balayop@yahoo.fr>, 2018
diff --git a/resources/language/resource.language.it_it/strings.po b/resources/language/resource.language.it_it/strings.po
index e94cf631..b4e2d650 100644
--- a/resources/language/resource.language.it_it/strings.po
+++ b/resources/language/resource.language.it_it/strings.po
@@ -1,6 +1,6 @@
 # Emby for Kodi language file
 # Addon Name: Emby for Kodi
-# Addon id: plugin.video.emby
+# Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 # Translators:
 # EffeF, 2019
diff --git a/resources/language/resource.language.nl_nl/strings.po b/resources/language/resource.language.nl_nl/strings.po
index 724b877c..732a7d13 100644
--- a/resources/language/resource.language.nl_nl/strings.po
+++ b/resources/language/resource.language.nl_nl/strings.po
@@ -1,6 +1,6 @@
 # Emby for Kodi language file
 # Addon Name: Emby for Kodi
-# Addon id: plugin.video.emby
+# Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 # Translators:
 # 63ac71fcbd0581bb567b1f0d798c7970, 2019
diff --git a/resources/language/resource.language.pl_pl/strings.po b/resources/language/resource.language.pl_pl/strings.po
index 7877ad59..8170e3e2 100644
--- a/resources/language/resource.language.pl_pl/strings.po
+++ b/resources/language/resource.language.pl_pl/strings.po
@@ -1,6 +1,6 @@
 # Emby for Kodi language file
 # Addon Name: Emby for Kodi
-# Addon id: plugin.video.emby
+# Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 # Translators:
 # Michał Sawicz <michal@sawicz.net>, 2019
diff --git a/resources/lib/client.py b/resources/lib/client.py
index 8f523448..6c2b1a15 100644
--- a/resources/lib/client.py
+++ b/resources/lib/client.py
@@ -82,7 +82,7 @@ def get_device_id(reset=False):
     if client_id:
         return client_id
 
-    directory = xbmc.translatePath('special://profile/addon_data/plugin.video.emby/').decode('utf-8')
+    directory = xbmc.translatePath('special://profile/addon_data/plugin.video.jellyfin/').decode('utf-8')
 
     if not xbmcvfs.exists(directory):
         xbmcvfs.mkdir(directory)
diff --git a/resources/lib/database/__init__.py b/resources/lib/database/__init__.py
index 6ed45e6a..b6161cb8 100644
--- a/resources/lib/database/__init__.py
+++ b/resources/lib/database/__init__.py
@@ -238,7 +238,7 @@ def reset():
     if dialog("yesno", heading="{emby}", line1=_(33086)):
         reset_artwork()
 
-    addon_data = xbmc.translatePath("special://profile/addon_data/plugin.video.emby/").decode('utf-8')
+    addon_data = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
 
     if dialog("yesno", heading="{emby}", line1=_(33087)):
 
@@ -326,7 +326,7 @@ def reset_artwork():
 
 def get_sync():
 
-    path = xbmc.translatePath("special://profile/addon_data/plugin.video.emby/").decode('utf-8')
+    path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
     
     if not xbmcvfs.exists(path):
         xbmcvfs.mkdirs(path)
@@ -346,7 +346,7 @@ def get_sync():
 
 def save_sync(sync):
 
-    path = xbmc.translatePath("special://profile/addon_data/plugin.video.emby/").decode('utf-8')
+    path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
     
     if not xbmcvfs.exists(path):
         xbmcvfs.mkdirs(path)
@@ -358,7 +358,7 @@ def save_sync(sync):
 
 def get_credentials():
 
-    path = xbmc.translatePath("special://profile/addon_data/plugin.video.emby/").decode('utf-8')
+    path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
     
     if not xbmcvfs.exists(path):
         xbmcvfs.mkdirs(path)
@@ -384,7 +384,7 @@ def get_credentials():
 def save_credentials(credentials):
 
     credentials = credentials or {}
-    path = xbmc.translatePath("special://profile/addon_data/plugin.video.emby/").decode('utf-8')
+    path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
     
     if not xbmcvfs.exists(path):
         xbmcvfs.mkdirs(path)
diff --git a/resources/lib/downloader.py b/resources/lib/downloader.py
index 43c43d1c..6cc5c35c 100644
--- a/resources/lib/downloader.py
+++ b/resources/lib/downloader.py
@@ -24,7 +24,7 @@ from emby.core.exceptions import HTTPException
 
 LOG = logging.getLogger("EMBY."+__name__)
 LIMIT = min(int(settings('limitIndex') or 50), 50)
-CACHE = xbmc.translatePath(os.path.join(xbmcaddon.Addon(id='plugin.video.emby').getAddonInfo('profile').decode('utf-8'), 'emby')).decode('utf-8')
+CACHE = xbmc.translatePath(os.path.join(xbmcaddon.Addon(id='plugin.video.jellyfin').getAddonInfo('profile').decode('utf-8'), 'emby')).decode('utf-8')
 
 #################################################################################################
 
diff --git a/resources/lib/emby/core/connection_manager.py b/resources/lib/emby/core/connection_manager.py
index 62b3dce3..85e9ff4a 100644
--- a/resources/lib/emby/core/connection_manager.py
+++ b/resources/lib/emby/core/connection_manager.py
@@ -43,7 +43,7 @@ def get_server_address(server, mode):
 
 class ConnectionManager(object):
 
-    min_server_version = "3.0.5930"
+    min_server_version = "10.1.0"
     server_version = min_server_version
     user = {}
     server_id = None
diff --git a/resources/lib/entrypoint/context.py b/resources/lib/entrypoint/context.py
index d5078eed..f45bb06c 100644
--- a/resources/lib/entrypoint/context.py
+++ b/resources/lib/entrypoint/context.py
@@ -18,7 +18,7 @@ from objects import Actions
 #################################################################################################
 
 LOG = logging.getLogger("EMBY."+__name__)
-XML_PATH = (xbmcaddon.Addon('plugin.video.emby').getAddonInfo('path'), "default", "1080i")
+XML_PATH = (xbmcaddon.Addon('plugin.video.jellyfin').getAddonInfo('path'), "default", "1080i")
 OPTIONS = {
     'Refresh': _(30410),
     'Delete': _(30409),
@@ -153,7 +153,7 @@ class Context(object):
             TheVoid('FavoriteItem', {'ServerId': self.server, 'Id': self.item['Id'], 'Favorite': False})
 
         elif selected == OPTIONS['Addon']:
-            xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)')
+            xbmc.executebuiltin('Addon.OpenSettings(plugin.video.jellyfin)')
 
         elif selected == OPTIONS['Delete']:
             self.delete_item()
diff --git a/resources/lib/entrypoint/default.py b/resources/lib/entrypoint/default.py
index 3c46a911..43d43e84 100644
--- a/resources/lib/entrypoint/default.py
+++ b/resources/lib/entrypoint/default.py
@@ -109,7 +109,7 @@ class Events(object):
         elif mode == 'removeserver':
             event('RemoveServer', {'Id': server})
         elif mode == 'settings':
-            xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)')
+            xbmc.executebuiltin('Addon.OpenSettings(plugin.video.jellyfin)')
         elif mode == 'adduser':
             add_user()
         elif mode == 'checkupdate':
@@ -153,13 +153,13 @@ def listing():
 
         if view_id and node in ('movies', 'tvshows', 'musicvideos', 'music', 'mixed') and view_id not in whitelist:
             label = "%s %s" % (label.decode('utf-8'), _(33166))
-            context.append((_(33123), "RunPlugin(plugin://plugin.video.emby/?mode=synclib&id=%s)" % view_id))
+            context.append((_(33123), "RunPlugin(plugin://plugin.video.jellyfin/?mode=synclib&id=%s)" % view_id))
 
         if view_id and node in ('movies', 'tvshows', 'musicvideos', 'music') and view_id in whitelist:
 
-            context.append((_(33136), "RunPlugin(plugin://plugin.video.emby/?mode=updatelib&id=%s)" % view_id))
-            context.append((_(33132), "RunPlugin(plugin://plugin.video.emby/?mode=repairlib&id=%s)" % view_id))
-            context.append((_(33133), "RunPlugin(plugin://plugin.video.emby/?mode=removelib&id=%s)" % view_id))
+            context.append((_(33136), "RunPlugin(plugin://plugin.video.jellyfin/?mode=updatelib&id=%s)" % view_id))
+            context.append((_(33132), "RunPlugin(plugin://plugin.video.jellyfin/?mode=repairlib&id=%s)" % view_id))
+            context.append((_(33133), "RunPlugin(plugin://plugin.video.jellyfin/?mode=removelib&id=%s)" % view_id))
 
         LOG.debug("--[ listing/%s/%s ] %s", node, label, path)
 
@@ -177,25 +177,25 @@ def listing():
         context = []
 
         if server.get('ManualAddress'):
-            context.append((_(33141), "RunPlugin(plugin://plugin.video.emby/?mode=removeserver&server=%s)" % server['Id']))
+            context.append((_(33141), "RunPlugin(plugin://plugin.video.jellyfin/?mode=removeserver&server=%s)" % server['Id']))
 
         if 'AccessToken' not in server:
-            directory("%s (%s)" % (server['Name'], _(30539)), "plugin://plugin.video.emby/?mode=login&server=%s" % server['Id'], False, context=context)
+            directory("%s (%s)" % (server['Name'], _(30539)), "plugin://plugin.video.jellyfin/?mode=login&server=%s" % server['Id'], False, context=context)
         else:
-            directory(server['Name'], "plugin://plugin.video.emby/?mode=browse&server=%s" % server['Id'], context=context)
+            directory(server['Name'], "plugin://plugin.video.jellyfin/?mode=browse&server=%s" % server['Id'], context=context)
 
 
-    directory(_(33194), "plugin://plugin.video.emby/?mode=managelibs", True)
-    directory(_(33134), "plugin://plugin.video.emby/?mode=addserver", False)
-    directory(_(33054), "plugin://plugin.video.emby/?mode=adduser", False)
-    directory(_(5), "plugin://plugin.video.emby/?mode=settings", False)
-    directory(_(33058), "plugin://plugin.video.emby/?mode=reset", False)
-    directory(_(33192), "plugin://plugin.video.emby/?mode=restartservice", False)
+    directory(_(33194), "plugin://plugin.video.jellyfin/?mode=managelibs", True)
+    directory(_(33134), "plugin://plugin.video.jellyfin/?mode=addserver", False)
+    directory(_(33054), "plugin://plugin.video.jellyfin/?mode=adduser", False)
+    directory(_(5), "plugin://plugin.video.jellyfin/?mode=settings", False)
+    directory(_(33058), "plugin://plugin.video.jellyfin/?mode=reset", False)
+    directory(_(33192), "plugin://plugin.video.jellyfin/?mode=restartservice", False)
 
     if settings('backupPath'):
-        directory(_(33092), "plugin://plugin.video.emby/?mode=backup", False)
+        directory(_(33092), "plugin://plugin.video.jellyfin/?mode=backup", False)
 
-    directory(_(33163), None, False, artwork="special://home/addons/plugin.video.emby/donations.png")
+    directory(_(33163), None, False, artwork="special://home/addons/plugin.video.jellyfin/donations.png")
 
     xbmcplugin.setContent(int(sys.argv[1]), 'files')
     xbmcplugin.endOfDirectory(int(sys.argv[1]))
@@ -216,20 +216,20 @@ def directory(label, path, folder=True, artwork=None, fanart=None, context=None)
 def dir_listitem(label, path, artwork=None, fanart=None):
 
     li = xbmcgui.ListItem(label, path=path)
-    li.setThumbnailImage(artwork or "special://home/addons/plugin.video.emby/icon.png")
-    li.setArt({"fanart": fanart or "special://home/addons/plugin.video.emby/fanart.jpg"})
-    li.setArt({"landscape": artwork or fanart or "special://home/addons/plugin.video.emby/fanart.jpg"})
+    li.setThumbnailImage(artwork or "special://home/addons/plugin.video.jellyfin/icon.png")
+    li.setArt({"fanart": fanart or "special://home/addons/plugin.video.jellyfin/fanart.jpg"})
+    li.setArt({"landscape": artwork or fanart or "special://home/addons/plugin.video.jellyfin/fanart.jpg"})
 
     return li
 
 def manage_libraries():
 
-    directory(_(33098), "plugin://plugin.video.emby/?mode=refreshboxsets", False)
-    directory(_(33154), "plugin://plugin.video.emby/?mode=addlibs", False)
-    directory(_(33139), "plugin://plugin.video.emby/?mode=updatelibs", False)
-    directory(_(33140), "plugin://plugin.video.emby/?mode=repairlibs", False)
-    directory(_(33184), "plugin://plugin.video.emby/?mode=removelibs", False)
-    directory(_(33060), "plugin://plugin.video.emby/?mode=thememedia", False)
+    directory(_(33098), "plugin://plugin.video.jellyfin/?mode=refreshboxsets", False)
+    directory(_(33154), "plugin://plugin.video.jellyfin/?mode=addlibs", False)
+    directory(_(33139), "plugin://plugin.video.jellyfin/?mode=updatelibs", False)
+    directory(_(33140), "plugin://plugin.video.jellyfin/?mode=repairlibs", False)
+    directory(_(33184), "plugin://plugin.video.jellyfin/?mode=removelibs", False)
+    directory(_(33060), "plugin://plugin.video.jellyfin/?mode=thememedia", False)
 
     xbmcplugin.setContent(int(sys.argv[1]), 'files')
     xbmcplugin.endOfDirectory(int(sys.argv[1]))
@@ -343,16 +343,16 @@ def browse(media, view_id=None, folder=None, server_id=None):
                     'folder': item['Id'],
                     'server': server_id
                 }
-                path = "%s?%s" % ("plugin://plugin.video.emby/",  urllib.urlencode(params))
+                path = "%s?%s" % ("plugin://plugin.video.jellyfin/",  urllib.urlencode(params))
                 context = []
 
                 if item['Type'] in ('Series', 'Season', 'Playlist'):
-                    context.append(("Play", "RunPlugin(plugin://plugin.video.emby/?mode=playlist&id=%s&server=%s)" % (item['Id'], server_id)))
+                    context.append(("Play", "RunPlugin(plugin://plugin.video.jellyfin/?mode=playlist&id=%s&server=%s)" % (item['Id'], server_id)))
 
                 if item['UserData']['Played']:
-                    context.append((_(16104), "RunPlugin(plugin://plugin.video.emby/?mode=unwatched&id=%s&server=%s)" % (item['Id'], server_id)))
+                    context.append((_(16104), "RunPlugin(plugin://plugin.video.jellyfin/?mode=unwatched&id=%s&server=%s)" % (item['Id'], server_id)))
                 else:
-                    context.append((_(16103), "RunPlugin(plugin://plugin.video.emby/?mode=watched&id=%s&server=%s)" % (item['Id'], server_id)))
+                    context.append((_(16103), "RunPlugin(plugin://plugin.video.jellyfin/?mode=watched&id=%s&server=%s)" % (item['Id'], server_id)))
 
                 li.addContextMenuItems(context)
                 list_li.append((path, li, True))
@@ -366,7 +366,7 @@ def browse(media, view_id=None, folder=None, server_id=None):
                     'folder': 'genres-%s' % item['Id'],
                     'server': server_id
                 }
-                path = "%s?%s" % ("plugin://plugin.video.emby/",  urllib.urlencode(params))
+                path = "%s?%s" % ("plugin://plugin.video.jellyfin/",  urllib.urlencode(params))
                 list_li.append((path, li, True))
 
             else:
@@ -376,14 +376,14 @@ def browse(media, view_id=None, folder=None, server_id=None):
                         'mode': "play",
                         'server': server_id
                     }
-                    path = "%s?%s" % ("plugin://plugin.video.emby/", urllib.urlencode(params))
+                    path = "%s?%s" % ("plugin://plugin.video.jellyfin/", urllib.urlencode(params))
                     li.setProperty('path', path)
-                    context = [(_(13412), "RunPlugin(plugin://plugin.video.emby/?mode=playlist&id=%s&server=%s)" % (item['Id'], server_id))]
+                    context = [(_(13412), "RunPlugin(plugin://plugin.video.jellyfin/?mode=playlist&id=%s&server=%s)" % (item['Id'], server_id))]
 
                     if item['UserData']['Played']:
-                        context.append((_(16104), "RunPlugin(plugin://plugin.video.emby/?mode=unwatched&id=%s&server=%s)" % (item['Id'], server_id)))
+                        context.append((_(16104), "RunPlugin(plugin://plugin.video.jellyfin/?mode=unwatched&id=%s&server=%s)" % (item['Id'], server_id)))
                     else:
-                        context.append((_(16103), "RunPlugin(plugin://plugin.video.emby/?mode=watched&id=%s&server=%s)" % (item['Id'], server_id)))
+                        context.append((_(16103), "RunPlugin(plugin://plugin.video.jellyfin/?mode=watched&id=%s&server=%s)" % (item['Id'], server_id)))
 
                     li.addContextMenuItems(context)
 
@@ -419,7 +419,7 @@ def browse_subfolders(media, view_id, server_id=None):
             'folder': view_id if node[0] == 'all' else node[0],
             'server': server_id
         }
-        path = "%s?%s" % ("plugin://plugin.video.emby/",  urllib.urlencode(params))
+        path = "%s?%s" % ("plugin://plugin.video.jellyfin/",  urllib.urlencode(params))
         directory(node[1] or view['Name'], path)
 
     xbmcplugin.setContent(int(sys.argv[1]), 'files')
@@ -443,7 +443,7 @@ def browse_letters(media, view_id, server_id=None):
             'folder': 'firstletter-%s' % node,
             'server': server_id
         }
-        path = "%s?%s" % ("plugin://plugin.video.emby/",  urllib.urlencode(params))
+        path = "%s?%s" % ("plugin://plugin.video.jellyfin/",  urllib.urlencode(params))
         directory(node, path)
 
     xbmcplugin.setContent(int(sys.argv[1]), 'files')
@@ -489,7 +489,7 @@ def get_fanart(item_id, path, server_id=None):
     ''' Get extra fanart for listitems. This is called by skinhelper.
         Images are stored locally, due to the Kodi caching system.
     '''
-    if not item_id and 'plugin.video.emby' in path:
+    if not item_id and 'plugin.video.jellyfin' in path:
         item_id = path.split('/')[-2]
 
     if not item_id:
@@ -533,7 +533,7 @@ def get_video_extras(item_id, path, server_id=None):
     ''' Returns the video files for the item as plugin listing, can be used
         to browse actual files or video extras, etc.
     '''
-    if not item_id and 'plugin.video.emby' in path:
+    if not item_id and 'plugin.video.jellyfin' in path:
         item_id = path.split('/')[-2]
 
     if not item_id:
@@ -547,7 +547,7 @@ def get_video_extras(item_id, path, server_id=None):
         #returns the video files for the item as plugin listing, can be used for browsing the actual files or videoextras etc.
         emby = embyserver.Read_EmbyServer()
         if not embyId:
-            if "plugin.video.emby" in embyPath:
+            if "plugin.video.jellyfin" in embyPath:
                 embyId = embyPath.split("/")[-2]
         if embyId:
             item = emby.getItem(embyId)
@@ -769,7 +769,7 @@ def get_themes():
     from helper.playutils import PlayUtils
     from helper.xmls import tvtunes_nfo
 
-    library = xbmc.translatePath("special://profile/addon_data/plugin.video.emby/library").decode('utf-8')
+    library = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/library").decode('utf-8')
     play = settings('useDirectPaths') == "1"
 
     if not xbmcvfs.exists(library + '/'):
@@ -863,8 +863,8 @@ def backup():
 
         delete_folder(backup)
 
-    addon_data = xbmc.translatePath("special://profile/addon_data/plugin.video.emby").decode('utf-8')
-    destination_data = os.path.join(backup, "addon_data", "plugin.video.emby")
+    addon_data = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin").decode('utf-8')
+    destination_data = os.path.join(backup, "addon_data", "plugin.video.jellyfin")
     destination_databases = os.path.join(backup, "Database")
 
     if not xbmcvfs.mkdirs(path) or not xbmcvfs.mkdirs(destination_databases):
diff --git a/resources/lib/entrypoint/service.py b/resources/lib/entrypoint/service.py
index 2fe12f32..0b0392f5 100644
--- a/resources/lib/entrypoint/service.py
+++ b/resources/lib/entrypoint/service.py
@@ -180,7 +180,8 @@ class Service(xbmc.Monitor):
         '''
         LOG.info("--[ check updates/%s ]", objects.version)
         kodi = "DEV" if settings('devMode.bool') else xbmc.getInfoLabel('System.BuildVersion')
-
+        # FIXME we do not want their updates
+        return False
         try:
             versions = requests.get('http://kodi.emby.media/Public%20testing/Dependencies/databases.json').json()
             build = find(versions, kodi)
@@ -220,10 +221,10 @@ class Service(xbmc.Monitor):
         ''' All notifications are sent via NotifyAll built-in or Kodi.
             Central hub.
         '''
-        if sender.lower() not in ('plugin.video.emby', 'xbmc'):
+        if sender.lower() not in ('plugin.video.jellyfin', 'xbmc'):
             return
 
-        if sender == 'plugin.video.emby':
+        if sender == 'plugin.video.jellyfin':
             method = method.split('.')[1]
 
             if method not in ('ServerUnreachable', 'ServerShuttingDown', 'UserDataChanged', 'ServerConnect',
diff --git a/resources/lib/helper/playutils.py b/resources/lib/helper/playutils.py
index f3146cdc..9814416b 100644
--- a/resources/lib/helper/playutils.py
+++ b/resources/lib/helper/playutils.py
@@ -503,7 +503,7 @@ class PlayUtils(object):
         ''' Download external subtitles to temp folder
             to be able to have proper names to streams.
         '''
-        temp = xbmc.translatePath("special://profile/addon_data/plugin.video.emby/temp/").decode('utf-8')
+        temp = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/temp/").decode('utf-8')
 
         if not xbmcvfs.exists(temp):
             xbmcvfs.mkdir(temp)
diff --git a/resources/lib/helper/translate.py b/resources/lib/helper/translate.py
index a0731c2d..d6d62248 100644
--- a/resources/lib/helper/translate.py
+++ b/resources/lib/helper/translate.py
@@ -22,7 +22,7 @@ def _(string):
     if type(string) != int:
         string = STRINGS[string]
 
-    result = xbmcaddon.Addon('plugin.video.emby').getLocalizedString(string)
+    result = xbmcaddon.Addon('plugin.video.jellyfin').getLocalizedString(string)
 
     if not result:
         result = xbmc.getLocalizedString(string)
diff --git a/resources/lib/helper/utils.py b/resources/lib/helper/utils.py
index 71d5bbbb..09e229b4 100644
--- a/resources/lib/helper/utils.py
+++ b/resources/lib/helper/utils.py
@@ -26,7 +26,7 @@ LOG = logging.getLogger("EMBY."+__name__)
 #################################################################################################
 
 def addon_id():
-    return "plugin.video.emby"
+    return "plugin.video.jellyfin"
 
 def kodi_version():
     return xbmc.getInfoLabel('System.BuildVersion')[:2]
@@ -134,7 +134,7 @@ def event(method, data=None, sender=None, hexlify=False):
     ''' Data is a dictionary.
     '''
     data = data or {}
-    sender = sender or "plugin.video.emby"
+    sender = sender or "plugin.video.jellyfin"
 
     if hexlify:
         data = '\\"[\\"{0}\\"]\\"'.format(binascii.hexlify(json.dumps(data)))
@@ -150,7 +150,7 @@ def dialog(dialog_type, *args, **kwargs):
 
     if "icon" in kwargs:
         kwargs['icon'] = kwargs['icon'].replace("{emby}",
-                                                "special://home/addons/plugin.video.emby/icon.png")
+                                                "special://home/addons/plugin.video.jellyfin/icon.png")
     if "heading" in kwargs:
         kwargs['heading'] = kwargs['heading'].replace("{emby}", _('addon_name'))
 
diff --git a/resources/lib/monitor.py b/resources/lib/monitor.py
index d488092b..cbb03f26 100644
--- a/resources/lib/monitor.py
+++ b/resources/lib/monitor.py
@@ -50,10 +50,10 @@ class Monitor(xbmc.Monitor):
 
     def onNotification(self, sender, method, data):
 
-        if sender.lower() not in ('plugin.video.emby', 'xbmc', 'upnextprovider.signal'):
+        if sender.lower() not in ('plugin.video.jellyfin', 'xbmc', 'upnextprovider.signal'):
             return
 
-        if sender == 'plugin.video.emby':
+        if sender == 'plugin.video.jellyfin':
             method = method.split('.')[1]
 
             if method not in ('GetItem', 'ReportProgressRequested', 'LoadServer', 'RandomItems', 'Recommended',
@@ -69,7 +69,7 @@ class Monitor(xbmc.Monitor):
         elif sender.startswith('upnextprovider'):
             method = method.split('.')[1]
 
-            if method not in ('plugin.video.emby_play_action'):
+            if method not in ('plugin.video.jellyfin_play_action'):
                 return
 
             data = json.loads(data)
@@ -312,7 +312,7 @@ class Monitor(xbmc.Monitor):
                 "Mute,Unmute,SetVolume,"
                 "Play,Playstate,PlayNext,PlayMediaSource"
             ),
-            'IconUrl': "https://raw.githubusercontent.com/MediaBrowser/plugin.video.emby/develop/kodi_icon.png",
+            'IconUrl': "https://raw.githubusercontent.com/MediaBrowser/plugin.video.jellyfin/develop/kodi_icon.png",
         })
 
         session = server['api'].get_device(self.device_id)
diff --git a/resources/lib/objects/actions.py b/resources/lib/objects/actions.py
index e2f550cf..b439dbd3 100644
--- a/resources/lib/objects/actions.py
+++ b/resources/lib/objects/actions.py
@@ -215,7 +215,7 @@ class Actions(object):
             LOG.info("[ playlist/%s ] %s", item['Id'], item['Name'])
 
             self.set_listitem(item, listitem, None, False)
-            path = "plugin://plugin.video.emby/?mode=play&id=%s&playlist=true" % item['Id']
+            path = "plugin://plugin.video.jellyfin/?mode=play&id=%s&playlist=true" % item['Id']
             listitem.setPath(path)
 
             playlist.add(path, listitem, index)
@@ -312,9 +312,9 @@ class Actions(object):
         obj['Artwork']['Thumb'] = obj['Artwork']['Thumb'] or ""
 
         if not intro and not obj['Type'] == 'Trailer':
-            obj['Artwork']['Primary'] = obj['Artwork']['Primary'] or "special://home/addons/plugin.video.emby/icon.png"
+            obj['Artwork']['Primary'] = obj['Artwork']['Primary'] or "special://home/addons/plugin.video.jellyfin/icon.png"
         else:
-            obj['Artwork']['Primary'] = obj['Artwork']['Primary'] or obj['Artwork']['Thumb'] or (obj['Artwork']['Backdrop'][0] if len(obj['Artwork']['Backdrop']) else "special://home/addons/plugin.video.emby/fanart.jpg")
+            obj['Artwork']['Primary'] = obj['Artwork']['Primary'] or obj['Artwork']['Thumb'] or (obj['Artwork']['Backdrop'][0] if len(obj['Artwork']['Backdrop']) else "special://home/addons/plugin.video.jellyfin/fanart.jpg")
             obj['Artwork']['Primary'] += "&KodiTrailer=true" if obj['Type'] == 'Trailer' else "&KodiCinemaMode=true"
             obj['Artwork']['Backdrop'] = [obj['Artwork']['Primary']]
 
@@ -472,9 +472,9 @@ class Actions(object):
         obj['Runtime'] = round(float((obj['Runtime'] or 0) / 10000000.0), 6)
         obj['PlayCount'] = API.get_playcount(obj['Played'], obj['PlayCount']) or 0
         obj['Overlay'] = 7 if obj['Played'] else 6
-        obj['Artwork']['Primary'] = obj['Artwork']['Primary'] or "special://home/addons/plugin.video.emby/icon.png"
-        obj['Artwork']['Thumb'] = obj['Artwork']['Thumb'] or "special://home/addons/plugin.video.emby/fanart.jpg"
-        obj['Artwork']['Backdrop'] = obj['Artwork']['Backdrop'] or ["special://home/addons/plugin.video.emby/fanart.jpg"]
+        obj['Artwork']['Primary'] = obj['Artwork']['Primary'] or "special://home/addons/plugin.video.jellyfin/icon.png"
+        obj['Artwork']['Thumb'] = obj['Artwork']['Thumb'] or "special://home/addons/plugin.video.jellyfin/fanart.jpg"
+        obj['Artwork']['Backdrop'] = obj['Artwork']['Backdrop'] or ["special://home/addons/plugin.video.jellyfin/fanart.jpg"]
 
 
         metadata = {
@@ -657,7 +657,7 @@ class Actions(object):
         ''' Base resume dialog based on Kodi settings.
         '''
         LOG.info("Resume dialog called.")
-        XML_PATH = (xbmcaddon.Addon('plugin.video.emby').getAddonInfo('path'), "default", "1080i")
+        XML_PATH = (xbmcaddon.Addon('plugin.video.jellyfin').getAddonInfo('path'), "default", "1080i")
 
         dialog = resume.ResumeDialog("script-emby-resume.xml", *XML_PATH)
         dialog.set_resume_point("Resume from %s" % str(timedelta(seconds=seektime)).split(".")[0])
diff --git a/resources/lib/objects/movies.py b/resources/lib/objects/movies.py
index cf32699c..c49c587c 100644
--- a/resources/lib/objects/movies.py
+++ b/resources/lib/objects/movies.py
@@ -169,7 +169,7 @@ class Movies(KodiDb):
             if obj['LocalTrailer']:
 
                 trailer = self.server['api'].get_local_trailers(obj['Id'])
-                obj['Trailer'] = "plugin://plugin.video.emby/trailer?id=%s&mode=play" % trailer[0]['Id']
+                obj['Trailer'] = "plugin://plugin.video.jellyfin/trailer?id=%s&mode=play" % trailer[0]['Id']
 
             elif obj['Trailer']:
                 obj['Trailer'] = "plugin://plugin.video.youtube/play/?video_id=%s" % obj['Trailer'].rsplit('=', 1)[1]
@@ -192,7 +192,7 @@ class Movies(KodiDb):
             obj['Path'] = obj['Path'].replace(obj['Filename'], "")
 
         else:
-            obj['Path'] = "plugin://plugin.video.emby.movies/"
+            obj['Path'] = "plugin://plugin.video.jellyfin/"
             params = {
                 'filename': obj['Filename'].encode('utf-8'),
                 'id': obj['Id'],
diff --git a/resources/lib/objects/musicvideos.py b/resources/lib/objects/musicvideos.py
index 1a528ba4..1dc536e6 100644
--- a/resources/lib/objects/musicvideos.py
+++ b/resources/lib/objects/musicvideos.py
@@ -174,7 +174,7 @@ class MusicVideos(KodiDb):
             obj['Path'] = obj['Path'].replace(obj['Filename'], "")
 
         else:
-            obj['Path'] = "plugin://plugin.video.emby.musicvideos/"
+            obj['Path'] = "plugin://plugin.video.jellyfin/"
             params = {
                 'filename': obj['Filename'].encode('utf-8'),
                 'id': obj['Id'],
diff --git a/resources/lib/objects/tvshows.py b/resources/lib/objects/tvshows.py
index 5e8c4ec3..d3ab66fb 100644
--- a/resources/lib/objects/tvshows.py
+++ b/resources/lib/objects/tvshows.py
@@ -217,7 +217,7 @@ class TVShows(KodiDb):
             if not validate(obj['Path']):
                 raise Exception("Failed to validate path. User stopped.")
         else:
-            obj['TopLevel'] = "plugin://plugin.video.emby.tvshows/"
+            obj['TopLevel'] = "plugin://plugin.video.jellyfin/"
             obj['Path'] = "%s%s/" % (obj['TopLevel'], obj['Id'])
 
 
@@ -354,7 +354,7 @@ class TVShows(KodiDb):
         if not self.direct_path and obj['Resume']:
 
             temp_obj = dict(obj)
-            temp_obj['Path'] = "plugin://plugin.video.emby.tvshows/"
+            temp_obj['Path'] = "plugin://plugin.video.jellyfin/"
             temp_obj['PathId'] = self.get_path(*values(temp_obj, QU.get_path_obj))
             temp_obj['FileId'] = self.add_file(*values(temp_obj, QU.add_file_obj))
             self.update_file(*values(temp_obj, QU.update_file_obj))
@@ -419,7 +419,7 @@ class TVShows(KodiDb):
 
             obj['Path'] = obj['Path'].replace(obj['Filename'], "")
         else:
-            obj['Path'] = "plugin://plugin.video.emby.tvshows/%s/" % obj['SeriesId']
+            obj['Path'] = "plugin://plugin.video.jellyfin/%s/" % obj['SeriesId']
             params = {
                 'filename': obj['Filename'].encode('utf-8'),
                 'id': obj['Id'],
@@ -493,14 +493,14 @@ class TVShows(KodiDb):
 
                 temp_obj = dict(obj)
                 temp_obj['Filename'] = self.get_filename(*values(temp_obj, QU.get_file_obj))
-                temp_obj['Path'] = "plugin://plugin.video.emby.tvshows/"
+                temp_obj['Path'] = "plugin://plugin.video.jellyfin/"
                 self.remove_file(*values(temp_obj, QU.delete_file_obj))
 
             elif not self.direct_path and obj['Resume']:
 
                 temp_obj = dict(obj)
                 temp_obj['Filename'] = self.get_filename(*values(temp_obj, QU.get_file_obj))
-                temp_obj['PathId'] = self.get_path("plugin://plugin.video.emby.tvshows/")
+                temp_obj['PathId'] = self.get_path("plugin://plugin.video.jellyfin/")
                 temp_obj['FileId'] = self.add_file(*values(temp_obj, QU.add_file_obj))
                 self.update_file(*values(temp_obj, QU.update_file_obj))
                 self.add_playstate(*values(temp_obj, QU.add_bookmark_obj))
diff --git a/resources/lib/player.py b/resources/lib/player.py
index 2f522008..277b50d8 100644
--- a/resources/lib/player.py
+++ b/resources/lib/player.py
@@ -415,7 +415,7 @@ class Player(xbmc.Player):
                 item['Server']['api'].close_transcode(item['DeviceId'])
 
 
-            path = xbmc.translatePath("special://profile/addon_data/plugin.video.emby/temp/").decode('utf-8')
+            path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/temp/").decode('utf-8')
 
             if xbmcvfs.exists(path):
                 dirs, files = xbmcvfs.listdir(path)
diff --git a/resources/lib/views.py b/resources/lib/views.py
index d75b91d6..7b39ea2a 100644
--- a/resources/lib/views.py
+++ b/resources/lib/views.py
@@ -359,7 +359,7 @@ class Views(object):
         else:
             element = etree.Element('node', {'order': str(index), 'type': "folder"})
 
-        etree.SubElement(element, 'icon').text = "special://home/addons/plugin.video.emby/icon.png"
+        etree.SubElement(element, 'icon').text = "special://home/addons/plugin.video.jellyfin/icon.png"
 
         return element
 
@@ -877,7 +877,7 @@ class Views(object):
             'mode': "nextepisodes",
             'limit': self.limit
         }
-        return "%s?%s" % ("plugin://plugin.video.emby/", urllib.urlencode(params))
+        return "%s?%s" % ("plugin://plugin.video.jellyfin/", urllib.urlencode(params))
 
     def window_browse(self, view, node=None):
 
@@ -892,7 +892,7 @@ class Views(object):
         if node:
             params['folder'] = node
 
-        return "%s?%s" % ("plugin://plugin.video.emby/", urllib.urlencode(params))
+        return "%s?%s" % ("plugin://plugin.video.jellyfin/", urllib.urlencode(params))
 
     def window_clear(self, name=None):
 
diff --git a/resources/lib/webservice.py b/resources/lib/webservice.py
index 9e5f9d33..0561d301 100644
--- a/resources/lib/webservice.py
+++ b/resources/lib/webservice.py
@@ -126,7 +126,7 @@ class requestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
 
             xbmc.log("[ webservice ] path: %s params: %s" % (str(self.path), str(params)), xbmc.LOGWARNING)
 
-            path = ("plugin://plugin.video.emby?mode=play&id=%s&dbid=%s&filename=%s&transcode=%s"
+            path = ("plugin://plugin.video.jellyfin?mode=play&id=%s&dbid=%s&filename=%s&transcode=%s"
                     % (params.get('Id'), params.get('KodiId'), params.get('Name'), params.get('transcode') or False))
 
             self.send_response(200)
diff --git a/resources/settings.xml b/resources/settings.xml
index 27853e48..3cec88c2 100644
--- a/resources/settings.xml
+++ b/resources/settings.xml
@@ -5,11 +5,11 @@
 		<setting label="30003" id="idMethod" type="enum" values="Manual|Emby Connect" default="0" />
 		<setting label="30024" id="username" type="text" default="" visible="eq(-1,0)" />
 		<setting label="30543" id="connectUsername" type="text" default="" visible="!eq(0,) + eq(-2,1)" />
-		<setting label="30600" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=connect)" visible="eq(-3,1) + eq(-1,)" option="close" />
-		<setting label="30618" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=connect)" visible="eq(-4,1) + !eq(-2,)" option="close" />
+		<setting label="30600" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=connect)" visible="eq(-3,1) + eq(-1,)" option="close" />
+		<setting label="30618" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=connect)" visible="eq(-4,1) + !eq(-2,)" option="close" />
 		<setting label="30001" id="serverName" type="text" default="" />
 		<setting label="30000" id="server" type="text" default="" visible="true" />
-		<setting label="33150" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=updateserver)" visible="!eq(-1,)" option="close" />
+		<setting label="33150" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=updateserver)" visible="!eq(-1,)" option="close" />
 		<setting label="30500" id="sslverify" type="bool" default="true" visible="true" />
 
 		<setting type="sep" />
@@ -92,19 +92,19 @@
 	<category label="30022"><!-- Advanced -->
 		<setting label="30004" id="logLevel" type="enum" values="Disabled|Info|Debug" default="1" />
 		<setting label="33164" id="maskInfo" type="bool" default="true" />
-		<setting label="30239" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=reset)" option="close" />
-		<setting label="30535" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=deviceid)" option="close" />
+		<setting label="30239" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=reset)" option="close" />
+		<setting label="30535" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=deviceid)" option="close" />
 		<setting label="33196" type="lsep" />
 		<setting label="33195" id="enableAddon" type="bool" default="true" />
-		<setting label="33180" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=restartservice)" option="close" />
+		<setting label="33180" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=restartservice)" option="close" />
 		<setting label="30529" id="startupDelay" type="number" default="0" option="int" />
-		<setting label="33161" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=checkupdate)" option="close" />
+		<setting label="33161" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=checkupdate)" option="close" />
 		<setting label="Developer mode" id="devMode" type="bool" default="false" />
 		
 		<setting type="sep" />
 		<setting label="33104" type="lsep"/>
 		<setting label="33093" type="folder" id="backupPath" option="writeable" />
-		<setting label="33092" type="action" action="RunPlugin(plugin://plugin.video.emby?mode=backup)" visible="!eq(-1,)" option="close" />
+		<setting label="33092" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=backup)" visible="!eq(-1,)" option="close" />
 	</category>
 
 </settings>
diff --git a/resources/skins/default/1080i/script-emby-connect-login-manual.xml b/resources/skins/default/1080i/script-emby-connect-login-manual.xml
index b2175bc1..d83cb56e 100644
--- a/resources/skins/default/1080i/script-emby-connect-login-manual.xml
+++ b/resources/skins/default/1080i/script-emby-connect-login-manual.xml
@@ -57,12 +57,12 @@
 							<font>font13</font>
 							<textcolor>white</textcolor>
 							<textshadow>66000000</textshadow>
-							<label>[B]$ADDON[plugin.video.emby 30612][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30612][/B]</label>
 						</control>
 						<control type="group" id="101">
 							<height>110</height>
 							<control type="label">
-								<label>$ADDON[plugin.video.emby 30024]</label>
+								<label>$ADDON[plugin.video.jellyfin 30024]</label>
 								<textcolor>ffe1e1e1</textcolor>
 								<shadowcolor>66000000</shadowcolor>
 								<font>font12</font>
@@ -83,7 +83,7 @@
 						<control type="group" id="102">
 							<height>110</height>
 							<control type="label">
-								<label>$ADDON[plugin.video.emby 30602]</label>
+								<label>$ADDON[plugin.video.jellyfin 30602]</label>
 								<textcolor>ffe1e1e1</textcolor>
 								<textshadow>66000000</textshadow>
 								<font>font12</font>
@@ -103,7 +103,7 @@
 							</control>
 						</control>
 						<control type="button" id="200">
-							<label>[B]$ADDON[plugin.video.emby 30605][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30605][/B]</label>
 							<width>426</width>
 							<height>65</height>
 							<font>font13</font>
@@ -121,7 +121,7 @@
 							<animation effect="slide" time="0" end="17,0" condition="true">Conditional</animation>
 						</control>
 						<control type="button" id="201">
-							<label>[B]$ADDON[plugin.video.emby 30606][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30606][/B]</label>
 							<width>426</width>
 							<height>65</height>
 							<font>font13</font>
diff --git a/resources/skins/default/1080i/script-emby-connect-login.xml b/resources/skins/default/1080i/script-emby-connect-login.xml
index 3b46c85e..7fbb8842 100644
--- a/resources/skins/default/1080i/script-emby-connect-login.xml
+++ b/resources/skins/default/1080i/script-emby-connect-login.xml
@@ -56,12 +56,12 @@
 							<font>font13</font>
 							<textcolor>white</textcolor>
 							<textshadow>66000000</textshadow>
-							<label>[B]$ADDON[plugin.video.emby 30612][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30612][/B]</label>
 						</control>
 						<control type="group" id="101">
 							<height>110</height>
 							<control type="label">
-								<label>$ADDON[plugin.video.emby 30024]</label>
+								<label>$ADDON[plugin.video.jellyfin 30024]</label>
 								<textcolor>ffe1e1e1</textcolor>
 								<shadowcolor>66000000</shadowcolor>
 								<font>font12</font>
@@ -82,7 +82,7 @@
 						<control type="group" id="102">
 							<height>110</height>
 							<control type="label">
-								<label>$ADDON[plugin.video.emby 30602]</label>
+								<label>$ADDON[plugin.video.jellyfin 30602]</label>
 								<textcolor>ffe1e1e1</textcolor>
 								<textshadow>66000000</textshadow>
 								<font>font12</font>
@@ -102,7 +102,7 @@
 							</control>
 						</control>
 						<control type="button" id="200">
-							<label>[B]$ADDON[plugin.video.emby 30605][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30605][/B]</label>
 							<width>426</width>
 							<height>65</height>
 							<font>font13</font>
@@ -119,7 +119,7 @@
 							<animation effect="slide" time="0" end="17,0" condition="true">Conditional</animation>
 						</control>
 						<control type="button" id="201">
-							<label>[B]$ADDON[plugin.video.emby 30606][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30606][/B]</label>
 							<width>426</width>
 							<height>65</height>
 							<font>font13</font>
@@ -141,7 +141,7 @@
 						</control>
 						<control type="group">
 							<control type="label">
-								<label>$ADDON[plugin.video.emby 30603]</label>
+								<label>$ADDON[plugin.video.jellyfin 30603]</label>
 								<font>font_flag</font>
 								<textcolor>ff464646</textcolor>
 								<shadowcolor>66000000</shadowcolor>
@@ -165,7 +165,7 @@
 								<control type="label">
 									<top>135</top>
 									<align>center</align>
-									<label>[UPPERCASE]$ADDON[plugin.video.emby 30604][/UPPERCASE]</label>
+									<label>[UPPERCASE]$ADDON[plugin.video.jellyfin 30604][/UPPERCASE]</label>
 									<font>font_flag</font>
 									<scroll>true</scroll>
 									<textcolor>FF52b54b</textcolor>
diff --git a/resources/skins/default/1080i/script-emby-connect-server-manual.xml b/resources/skins/default/1080i/script-emby-connect-server-manual.xml
index 7aa3f37a..7a436d61 100644
--- a/resources/skins/default/1080i/script-emby-connect-server-manual.xml
+++ b/resources/skins/default/1080i/script-emby-connect-server-manual.xml
@@ -57,12 +57,12 @@
 							<font>font13</font>
 							<textcolor>white</textcolor>
 							<textshadow>66000000</textshadow>
-							<label>[B]$ADDON[plugin.video.emby 30614][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30614][/B]</label>
 						</control>
 						<control type="group" id="101">
 							<height>110</height>
 							<control type="label">
-								<label>$ADDON[plugin.video.emby 30615]</label>
+								<label>$ADDON[plugin.video.jellyfin 30615]</label>
 								<textcolor>ffe1e1e1</textcolor>
 								<shadowcolor>66000000</shadowcolor>
 								<font>font12</font>
@@ -83,7 +83,7 @@
 						<control type="group" id="102">
 							<height>110</height>
 							<control type="label">
-								<label>$ADDON[plugin.video.emby 30030]</label>
+								<label>$ADDON[plugin.video.jellyfin 30030]</label>
 								<textcolor>ffe1e1e1</textcolor>
 								<textshadow>66000000</textshadow>
 								<font>font12</font>
@@ -103,7 +103,7 @@
 							</control>
 						</control>
 						<control type="button" id="200">
-							<label>[B]$ADDON[plugin.video.emby 30616][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30616][/B]</label>
 							<width>426</width>
 							<height>65</height>
 							<font>font13</font>
@@ -120,7 +120,7 @@
 							<animation effect="slide" time="0" end="17,0" condition="true">Conditional</animation>
 						</control>
 						<control type="button" id="201">
-							<label>[B]$ADDON[plugin.video.emby 30606][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30606][/B]</label>
 							<width>426</width>
 							<height>65</height>
 							<font>font13</font>
diff --git a/resources/skins/default/1080i/script-emby-connect-server.xml b/resources/skins/default/1080i/script-emby-connect-server.xml
index 37bf63e0..c20c535d 100644
--- a/resources/skins/default/1080i/script-emby-connect-server.xml
+++ b/resources/skins/default/1080i/script-emby-connect-server.xml
@@ -64,7 +64,7 @@
 							<font>font13</font>
 							<textcolor>white</textcolor>
 							<textshadow>66000000</textshadow>
-							<label>[B]$ADDON[plugin.video.emby 30607][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30607][/B]</label>
 						</control>
 						<control type="group" id="101">
 							<height>200</height>
@@ -161,7 +161,7 @@
 							<height>20</height>
 						</control>
 						<control type="button" id="205">
-							<label>[B]$ADDON[plugin.video.emby 30600][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30600][/B]</label>
 							<width>476</width>
 							<height>65</height>
 							<font>font13</font>
@@ -179,7 +179,7 @@
 							<animation effect="slide" time="0" end="17,0" condition="true">Conditional</animation>
 						</control>
 						<control type="button" id="206">
-							<label>[B]$ADDON[plugin.video.emby 30611][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30611][/B]</label>
 							<width>476</width>
 							<height>65</height>
 							<font>font13</font>
@@ -197,7 +197,7 @@
 							<animation effect="slide" time="0" end="17,0" condition="true">Conditional</animation>
 						</control>
 						<control type="button" id="201">
-							<label>[B]$ADDON[plugin.video.emby 30606][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30606][/B]</label>
 							<width>476</width>
 							<height>65</height>
 							<font>font13</font>
diff --git a/resources/skins/default/1080i/script-emby-connect-users.xml b/resources/skins/default/1080i/script-emby-connect-users.xml
index 9547d718..dfb2ce91 100644
--- a/resources/skins/default/1080i/script-emby-connect-users.xml
+++ b/resources/skins/default/1080i/script-emby-connect-users.xml
@@ -57,7 +57,7 @@
 							<font>font13</font>
 							<textcolor>white</textcolor>
 							<textshadow>66000000</textshadow>
-							<label>[B]$ADDON[plugin.video.emby 30612][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30612][/B]</label>
 						</control>
 						<control type="list" id="155">
 							<animation effect="slide" time="0" start="0,0" end="148,0" condition="Integer.IsEqual(Container(155).NumItems,2)">Conditional</animation>
@@ -175,7 +175,7 @@
 							</focusedlayout>
 						</control>
 						<control type="button" id="200">
-							<label>[B]$ADDON[plugin.video.emby 30540][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30540][/B]</label>
 							<width>874</width>
 							<height>65</height>
 							<font>font13</font>
@@ -193,7 +193,7 @@
 							<animation effect="slide" time="0" end="17,0" condition="true">Conditional</animation>
 						</control>
 						<control type="button" id="201">
-							<label>[B]$ADDON[plugin.video.emby 30606][/B]</label>
+							<label>[B]$ADDON[plugin.video.jellyfin 30606][/B]</label>
 							<width>874</width>
 							<height>65</height>
 							<font>font13</font>
diff --git a/service.py b/service.py
index 3292a122..64dfc595 100644
--- a/service.py
+++ b/service.py
@@ -13,7 +13,7 @@ import xbmcaddon
 
 #################################################################################################
 
-__addon__ = xbmcaddon.Addon(id='plugin.video.emby')
+__addon__ = xbmcaddon.Addon(id='plugin.video.jellyfin')
 __base__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'resources', 'lib')).decode('utf-8')
 __libraries__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'libraries')).decode('utf-8')
 __pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'emby')).decode('utf-8')

From 59c1dd42e3be9fbe20303e7dcdb73fad0750c3d6 Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 14:10:33 +0100
Subject: [PATCH 02/15] Change most string occurrences of Emby to Jellyfin
 (case sensitive)

---
 .gitignore                                    |   1 +
 CONTRIBUTING.md                               |   2 +-
 README.md                                     |  20 +--
 addon.xml                                     |   4 +-
 context.py                                    |   6 +-
 context_play.py                               |   6 +-
 default.py                                    |   6 +-
 .../resource.language.de_de/strings.po        | 134 ++++++++---------
 .../resource.language.en_gb/strings.po        |  68 ++++-----
 .../resource.language.fr_fr/strings.po        | 128 ++++++++--------
 .../resource.language.it_it/strings.po        | 136 ++++++++---------
 .../resource.language.nl_nl/strings.po        | 140 +++++++++---------
 .../resource.language.pl_pl/strings.po        | 132 ++++++++---------
 resources/lib/client.py                       |  20 +--
 resources/lib/connect.py                      |  24 +--
 resources/lib/database/__init__.py            |  61 ++++----
 resources/lib/database/emby_db.py             |   2 +-
 resources/lib/database/queries.py             |  92 ++++++------
 resources/lib/dialogs/context.py              |   6 +-
 resources/lib/dialogs/loginconnect.py         |  10 +-
 resources/lib/dialogs/loginmanual.py          |   2 +-
 resources/lib/dialogs/resume.py               |   2 +-
 resources/lib/dialogs/serverconnect.py        |   6 +-
 resources/lib/dialogs/servermanual.py         |   6 +-
 resources/lib/dialogs/usersconnect.py         |   4 +-
 resources/lib/downloader.py                   |  14 +-
 resources/lib/emby/__init__.py                |  26 ++--
 resources/lib/emby/client.py                  |   4 +-
 resources/lib/emby/core/api.py                |   2 +-
 resources/lib/emby/core/configuration.py      |   2 +-
 resources/lib/emby/core/connection_manager.py |   4 +-
 resources/lib/emby/core/credentials.py        |   2 +-
 resources/lib/emby/core/exceptions.py         |   2 +-
 resources/lib/emby/core/http.py               |   4 +-
 resources/lib/emby/core/ws_client.py          |   2 +-
 resources/lib/emby/helpers/utils.py           |   2 +-
 resources/lib/entrypoint/__init__.py          |   2 +-
 resources/lib/entrypoint/context.py           |  16 +-
 resources/lib/entrypoint/default.py           |  56 +++----
 resources/lib/entrypoint/service.py           |  88 +++++------
 resources/lib/full_sync.py                    |  42 +++---
 resources/lib/helper/api.py                   |   8 +-
 resources/lib/helper/exceptions.py            |   2 +-
 resources/lib/helper/loghandler.py            |  12 +-
 resources/lib/helper/playutils.py             |  14 +-
 resources/lib/helper/translate.py             |   2 +-
 resources/lib/helper/utils.py                 |  18 +--
 resources/lib/helper/wrapper.py               |   4 +-
 resources/lib/helper/xmls.py                  |  15 +-
 resources/lib/library.py                      |  48 +++---
 resources/lib/monitor.py                      |  20 +--
 resources/lib/objects/actions.py              |  38 ++---
 resources/lib/objects/kodi/artwork.py         |   8 +-
 resources/lib/objects/kodi/kodi.py            |   2 +-
 resources/lib/objects/kodi/movies.py          |   2 +-
 resources/lib/objects/kodi/music.py           |   2 +-
 resources/lib/objects/kodi/musicvideos.py     |   2 +-
 resources/lib/objects/kodi/queries.py         |   2 +-
 resources/lib/objects/kodi/tvshows.py         |   2 +-
 resources/lib/objects/movies.py               |   4 +-
 resources/lib/objects/music.py                |  10 +-
 resources/lib/objects/musicvideos.py          |   6 +-
 resources/lib/objects/obj.py                  |   4 +-
 resources/lib/objects/obj_map.json            |  16 +-
 resources/lib/objects/tvshows.py              |   6 +-
 resources/lib/objects/utils.py                |   2 +-
 resources/lib/player.py                       |  28 ++--
 resources/lib/setup.py                        |  14 +-
 resources/lib/views.py                        |  68 ++++-----
 resources/lib/webservice.py                   |   2 +-
 resources/settings.xml                        |   4 +-
 ... script-jellyfin-connect-login-manual.xml} |   0
 ....xml => script-jellyfin-connect-login.xml} |   0
 ...script-jellyfin-connect-server-manual.xml} |   0
 ...xml => script-jellyfin-connect-server.xml} |   0
 ....xml => script-jellyfin-connect-users.xml} |   0
 ...ontext.xml => script-jellyfin-context.xml} |   0
 ...-resume.xml => script-jellyfin-resume.xml} |   6 +-
 service.py                                    |   8 +-
 79 files changed, 833 insertions(+), 832 deletions(-)
 rename resources/skins/default/1080i/{script-emby-connect-login-manual.xml => script-jellyfin-connect-login-manual.xml} (100%)
 rename resources/skins/default/1080i/{script-emby-connect-login.xml => script-jellyfin-connect-login.xml} (100%)
 rename resources/skins/default/1080i/{script-emby-connect-server-manual.xml => script-jellyfin-connect-server-manual.xml} (100%)
 rename resources/skins/default/1080i/{script-emby-connect-server.xml => script-jellyfin-connect-server.xml} (100%)
 rename resources/skins/default/1080i/{script-emby-connect-users.xml => script-jellyfin-connect-users.xml} (100%)
 rename resources/skins/default/1080i/{script-emby-context.xml => script-jellyfin-context.xml} (100%)
 rename resources/skins/default/1080i/{script-emby-resume.xml => script-jellyfin-resume.xml} (95%)

diff --git a/.gitignore b/.gitignore
index c0132b4d..9547020e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,3 +5,4 @@ machine_guid
 
 .idea/
 .DS_Store
+.vscode/
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 7938f5fc..118cdfc9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,6 +1,6 @@
 # How to contribute
 
-Thanks you for contributing to Emby for Kodi!
+Thanks you for contributing to Jellyfin for Kodi!
 
 * Make pull requests towards the **master** branch;
 * Keep the maximum line length shorter than 100 characters to keep things clean and readable;
diff --git a/README.md b/README.md
index 52258167..89ebb2c4 100644
--- a/README.md
+++ b/README.md
@@ -1,22 +1,22 @@
-# Emby for Kodi
+# Jellyfin for Kodi
 
-[![EmbyKodi_Banner](https://i.imgur.com/hx4cx41.png)](https://emby.media/community/index.php?/forum/99-kodi/)
+[![EmbyKodi_Banner](https://i.imgur.com/hx4cx41.png)](https://forum.jellyfin.org/)
 
 [![Wiki](https://img.shields.io/badge/get%20started-wiki-brightgreen.svg)](https://github.com/MediaBrowser/plugin.video.emby/wiki) 
-[![Forums](https://img.shields.io/badge/report%20issues-forums-3960C1.svg)](https://emby.media/community/index.php?/forum/99-kodi/)
+[![Forums](https://img.shields.io/badge/report%20issues-forums-3960C1.svg)](https://forum.jellyfin.org/)
 [![Donate](https://img.shields.io/badge/donate-kofi-blue.svg)](https://ko-fi.com/A5354BI)
-[![Emby](https://img.shields.io/badge/server-emby-52b54b.svg)](https://emby.media/)
+[![Emby](https://img.shields.io/badge/server-emby-52b54b.svg)](https://jellyfin.media/)
 ___
 **A whole new way to manage and view your media library.**
 
-The Emby for Kodi add-on combines the best of Kodi - ultra smooth navigation, beautiful UIs and playback of any file under the sun, and Emby - the most powerful open source multi-client media metadata indexer and server. You can now retire your MySQL setup in favor of a more flexible setup.
+The Jellyfin for Kodi add-on combines the best of Kodi - ultra smooth navigation, beautiful UIs and playback of any file under the sun, and Jellyfin - the most powerful open source multi-client media metadata indexer and server. You can now retire your MySQL setup in favor of a more flexible setup.
 
-Synchronize your media on your Emby server to the native Kodi database, browsing your media at full speed, while retaining the ability to use other Kodi add-ons to enhance your experience. In addition, you can use any Kodi skin you'd like!
+Synchronize your media on your Jellyfin server to the native Kodi database, browsing your media at full speed, while retaining the ability to use other Kodi add-ons to enhance your experience. In addition, you can use any Kodi skin you'd like!
 ___
 
 ### Supported
 
-The add-on supports a hybrid approach. You can decide which Emby libraries to sync to the Kodi database. Other libraries and features are accessible dynamically, as a plugin listing.
+The add-on supports a hybrid approach. You can decide which Jellyfin libraries to sync to the Kodi database. Other libraries and features are accessible dynamically, as a plugin listing.
 - Library types available to sync:
   + Movies and sets
   + TV shows
@@ -29,13 +29,13 @@ The add-on supports a hybrid approach. You can decide which Emby libraries to sy
   + Theme media
 - Direct play and transcode
 - A 2-way watched and resume state between your server and Kodi. This is a near instant feature.
-- Remote control your Kodi; send play commands from your Emby web client or Emby mobile apps.
+- Remote control your Kodi; send play commands from your Jellyfin web client or Jellyfin mobile apps.
 - Extrafanart (rotating backgrounds) for skins that support it
 - Offer to delete content after playback
-- Backup your emby kodi profile. See the [Emby backup option](https://github.com/MediaBrowser/plugin.video.emby/wiki/Create-and-restore-from-backup)
+- Backup your Jellyfin Kodi profile. See the [Jellyfin backup option](https://github.com/MediaBrowser/plugin.video.emby/wiki/Create-and-restore-from-backup)
 - and more...
 
-### Install Emby for Kodi
+### Install Jellyfin for Kodi
 Get started with the [wiki guide](https://github.com/MediaBrowser/plugin.video.emby/wiki)
 
 ### Known limitations
diff --git a/addon.xml b/addon.xml
index c5f9cded..7732032f 100644
--- a/addon.xml
+++ b/addon.xml
@@ -16,11 +16,11 @@
     <menu id="kodi.core.main">
       <item library="context.py">
         <label>30401</label>
-        <visible>[!String.IsEmpty(ListItem.DBID) + !String.IsEqual(ListItem.DBID,-1) | !String.IsEmpty(ListItem.Property(embyid))] + !String.IsEmpty(Window(10000).Property(emby_context))</visible>
+        <visible>[!String.IsEmpty(ListItem.DBID) + !String.IsEqual(ListItem.DBID,-1) | !String.IsEmpty(ListItem.Property(jellyfinid))] + !String.IsEmpty(Window(10000).Property(jellyfin_context))</visible>
       </item>
       <item library="context_play.py">
         <label>30402</label>
-        <visible>[[!String.IsEmpty(ListItem.DBID) + !String.IsEqual(ListItem.DBID,-1) | !String.IsEmpty(ListItem.Property(embyid))] + [String.IsEqual(ListItem.DBTYPE,movie) | String.IsEqual(ListItem.DBTYPE,episode)]] + !String.IsEmpty(Window(10000).Property(emby_context_transcode))</visible>
+        <visible>[[!String.IsEmpty(ListItem.DBID) + !String.IsEqual(ListItem.DBID,-1) | !String.IsEmpty(ListItem.Property(jellyfinid))] + [String.IsEqual(ListItem.DBTYPE,movie) | String.IsEqual(ListItem.DBTYPE,episode)]] + !String.IsEmpty(Window(10000).Property(jellyfin_context_transcode))</visible>
       </item>
     </menu>
   </extension>
diff --git a/context.py b/context.py
index fdec02ad..5b3107f4 100644
--- a/context.py
+++ b/context.py
@@ -14,8 +14,8 @@ import xbmcaddon
 __addon__ = xbmcaddon.Addon(id='plugin.video.jellyfin')
 __base__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'resources', 'lib')).decode('utf-8')
 __libraries__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'libraries')).decode('utf-8')
-__pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'emby')).decode('utf-8')
-__cache__ = xbmc.translatePath('special://temp/emby').decode('utf-8')
+__pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'jellyfin')).decode('utf-8')
+__cache__ = xbmc.translatePath('special://temp/jellyfin').decode('utf-8')
 
 sys.path.insert(0, __cache__)
 sys.path.insert(0, __pcache__)
@@ -28,7 +28,7 @@ from entrypoint import Context
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY.context")
+LOG = logging.getLogger("JELLYFIN.context")
 
 #################################################################################################
 
diff --git a/context_play.py b/context_play.py
index 6ed686cc..c59ce3dd 100644
--- a/context_play.py
+++ b/context_play.py
@@ -14,8 +14,8 @@ import xbmcaddon
 __addon__ = xbmcaddon.Addon(id='plugin.video.jellyfin')
 __base__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'resources', 'lib')).decode('utf-8')
 __libraries__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'libraries')).decode('utf-8')
-__pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'emby')).decode('utf-8')
-__cache__ = xbmc.translatePath('special://temp/emby').decode('utf-8')
+__pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'jellyfin')).decode('utf-8')
+__cache__ = xbmc.translatePath('special://temp/jellyfin').decode('utf-8')
 
 sys.path.insert(0, __cache__)
 sys.path.insert(0, __pcache__)
@@ -28,7 +28,7 @@ from entrypoint import Context
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY.context")
+LOG = logging.getLogger("JELLYFIN.context")
 
 #################################################################################################
 
diff --git a/default.py b/default.py
index 8092bb94..d3ccbc89 100644
--- a/default.py
+++ b/default.py
@@ -14,8 +14,8 @@ import xbmcaddon
 __addon__ = xbmcaddon.Addon(id='plugin.video.jellyfin')
 __base__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'resources', 'lib')).decode('utf-8')
 __libraries__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'libraries')).decode('utf-8')
-__pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'emby')).decode('utf-8')
-__cache__ = xbmc.translatePath('special://temp/emby').decode('utf-8')
+__pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'jellyfin')).decode('utf-8')
+__cache__ = xbmc.translatePath('special://temp/jellyfin').decode('utf-8')
 
 sys.path.insert(0, __cache__)
 sys.path.insert(0, __pcache__)
@@ -28,7 +28,7 @@ from entrypoint import Events
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY.default")
+LOG = logging.getLogger("JELLYFIN.default")
 
 #################################################################################################
 
diff --git a/resources/language/resource.language.de_de/strings.po b/resources/language/resource.language.de_de/strings.po
index ed1a7a15..78a6e0be 100644
--- a/resources/language/resource.language.de_de/strings.po
+++ b/resources/language/resource.language.de_de/strings.po
@@ -1,5 +1,5 @@
-# Emby for Kodi language file
-# Addon Name: Emby for Kodi
+# Jellyfin for Kodi language file
+# Addon Name: Jellyfin for Kodi
 # Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 # Translators:
@@ -9,7 +9,7 @@
 # 
 msgid ""
 msgstr ""
-"Project-Id-Version: Emby for Kodi\n"
+"Project-Id-Version: Jellyfin for Kodi\n"
 "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "PO-Revision-Date: 2018-09-07 20:10+0000\n"
 "Last-Translator: Benni <semool@secure-mail.biz>, 2019\n"
@@ -21,8 +21,8 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 msgctxt "#29999"
-msgid "Emby for Kodi"
-msgstr "Emby für Kodi"
+msgid "Jellyfin for Kodi"
+msgstr "Jellyfin für Kodi"
 
 msgctxt "#30000"
 msgid "Server address"
@@ -193,12 +193,12 @@ msgid "TV Shows"
 msgstr "Serien"
 
 msgctxt "#30401"
-msgid "Emby options"
-msgstr "Emby Optionen"
+msgid "Jellyfin options"
+msgstr "Jellyfin Optionen"
 
 msgctxt "#30402"
-msgid "Emby transcode"
-msgstr "Emby transkodieren"
+msgid "Jellyfin transcode"
+msgstr "Jellyfin transkodieren"
 
 msgctxt "#30405"
 msgid "Add to favorites"
@@ -213,8 +213,8 @@ msgid "Settings"
 msgstr "Einstellungen"
 
 msgctxt "#30409"
-msgid "Delete from Emby"
-msgstr "Vom Emby Server löschen"
+msgid "Delete from Jellyfin"
+msgstr "Vom Jellyfin Server löschen"
 
 msgctxt "#30410"
 msgid "Refresh this item"
@@ -353,8 +353,8 @@ msgid "Display message"
 msgstr "Nachricht anzeigen"
 
 msgctxt "#30600"
-msgid "Sign in with Emby Connect"
-msgstr "Mit Emby Connect anmelden"
+msgid "Sign in with Jellyfin Connect"
+msgstr "Mit Jellyfin Connect anmelden"
 
 msgctxt "#30602"
 msgid "Password"
@@ -393,8 +393,8 @@ msgid "Please sign in"
 msgstr "Bitte melden Sie sich an"
 
 msgctxt "#30613"
-msgid "Change Emby Connect user"
-msgstr "Emby Connect Benutzer wechseln"
+msgid "Change Jellyfin Connect user"
+msgstr "Jellyfin Connect Benutzer wechseln"
 
 msgctxt "#30614"
 msgid "Connect to server"
@@ -413,8 +413,8 @@ msgid "Server or port cannot be empty"
 msgstr "Server oder Port muss eingetragen werden"
 
 msgctxt "#30618"
-msgid "Change Emby Connect user"
-msgstr "Emby Connect Benutzer wechseln"
+msgid "Change Jellyfin Connect user"
+msgstr "Jellyfin Connect Benutzer wechseln"
 
 msgctxt "#33000"
 msgid "Welcome"
@@ -437,8 +437,8 @@ msgid "Choose the subtitles stream"
 msgstr "Untertitel Spur wählen"
 
 msgctxt "#33015"
-msgid "Delete file from Emby?"
-msgstr "Datei vom Emby Server löschen?"
+msgid "Delete file from Jellyfin?"
+msgstr "Datei vom Jellyfin Server löschen?"
 
 msgctxt "#33016"
 msgid "Play trailers?"
@@ -454,16 +454,16 @@ msgstr "Rufe ab:"
 
 msgctxt "#33022"
 msgid ""
-"Detected the database needs to be recreated for this version of Emby for "
+"Detected the database needs to be recreated for this version of Jellyfin for "
 "Kodi. Proceed?"
 msgstr ""
-"Die Datenbank muss neu erstellt werden für diese 'Emby for Kodi' Version. "
+"Die Datenbank muss neu erstellt werden für diese 'Jellyfin for Kodi' Version. "
 "Fortfahren?"
 
 msgctxt "#33023"
-msgid "Emby for Kodi will not work correctly until the database is reset."
+msgid "Jellyfin for Kodi will not work correctly until the database is reset."
 msgstr ""
-"'Emby for Kodi' wird nicht richtig funktionieren ohne einen Datenbank Reset."
+"'Jellyfin for Kodi' wird nicht richtig funktionieren ohne einen Datenbank Reset."
 
 msgctxt "#33025"
 msgid "Completed in:"
@@ -475,12 +475,12 @@ msgstr "Es wurde eine neue Geräte-ID erstellt und Kodi wird nun neugestartet."
 
 msgctxt "#33035"
 msgid ""
-"Caution! If you choose Native mode, certain Emby features will be missing, "
-"such as: Emby cinema mode, direct stream/transcode options and parental "
+"Caution! If you choose Native mode, certain Jellyfin features will be missing, "
+"such as: Jellyfin cinema mode, direct stream/transcode options and parental "
 "access schedule."
 msgstr ""
-"Achtung: Wenn du den nativen Modus wählst, werden einige Emby Funktionen "
-"fehlen, wie z.B.: Emby Kinomodus, Transkodierungsoptionen und der Zeitplan "
+"Achtung: Wenn du den nativen Modus wählst, werden einige Jellyfin Funktionen "
+"fehlen, wie z.B.: Jellyfin Kinomodus, Transkodierungsoptionen und der Zeitplan "
 "für die Kindersicherung."
 
 msgctxt "#33036"
@@ -502,11 +502,11 @@ msgstr "Kodi kann die Datei nicht finden:"
 msgctxt "#33048"
 msgid ""
 "You may need to verify your network credentials in the add-on settings or "
-"use the Emby path substitution to format your path correctly (Emby dashboard"
+"use the Jellyfin path substitution to format your path correctly (Jellyfin dashboard"
 " > library). Stop syncing?"
 msgstr ""
 "Du solltest deine Netzwerkzugangsdaten in den Addon Einstellungen überprüfen"
-" oder die Emby Funktion \"(Optionaler) Gemeinsamer Netzwerkordner\" (Emby "
+" oder die Jellyfin Funktion \"(Optionaler) Gemeinsamer Netzwerkordner\" (Jellyfin "
 "Dashboard > Bibliothek > Verzeichnisse) benutzen. Synchronisierung "
 "abbrechen?"
 
@@ -551,8 +551,8 @@ msgid "Remove all cached artwork?"
 msgstr "Alle zwischengespeicherten Bilder entfernen?"
 
 msgctxt "#33087"
-msgid "Reset all Emby add-on settings?"
-msgstr "Alle Emby Addon Einstellungen zurücksetzen?"
+msgid "Reset all Jellyfin add-on settings?"
+msgstr "Alle Jellyfin Addon Einstellungen zurücksetzen?"
 
 msgctxt "#33088"
 msgid ""
@@ -584,10 +584,10 @@ msgstr "Backup Ordner"
 msgctxt "#33097"
 msgid ""
 "Important, cleanonupdate was removed in your advanced settings to prevent "
-"conflict with Emby for Kodi. Kodi will restart now."
+"conflict with Jellyfin for Kodi. Kodi will restart now."
 msgstr ""
 "Wichtig, cleanonupdate wurde aus deinen Advanced Settings enfernt um "
-"Probleme mit 'Emby for Kodi' zu vermeiden. Kodi wird nun neu gestartet."
+"Probleme mit 'Jellyfin for Kodi' zu vermeiden. Kodi wird nun neu gestartet."
 
 msgctxt "#33098"
 msgid "Refresh boxsets"
@@ -595,12 +595,12 @@ msgstr "Sammlungen aktualisieren"
 
 msgctxt "#33099"
 msgid ""
-"Install the server plugin Kodi companion to automatically apply emby library"
+"Install the server plugin Kodi companion to automatically apply jellyfin library"
 " updates at startup. This setting can be found in the add-on settings > sync"
 " options > Enable Kodi Companion."
 msgstr ""
-"Installiere auf dem Emby Server das 'Kodi Companion' Plugin um automatische "
-"Updates der Bibliothek zu erhalten. Diese Einstellung findest du unter 'Emby"
+"Installiere auf dem Jellyfin Server das 'Kodi Companion' Plugin um automatische "
+"Updates der Bibliothek zu erhalten. Diese Einstellung findest du unter 'Jellyfin"
 " Addon Einstellungen > Syncronisierung > Aktiviere Kodi Companion'."
 
 msgctxt "#33100"
@@ -706,12 +706,12 @@ msgstr ""
 msgctxt "#33119"
 msgid ""
 "Something went wrong during the sync. You'll be able to restore progress "
-"when restarting Kodi. If the problem persists, please report on the Emby for"
+"when restarting Kodi. If the problem persists, please report on the Jellyfin for"
 " Kodi forums, with your Kodi log."
 msgstr ""
 "Es gab einen Fehler bei der Synchronisierung. Du kannst den Fortschritt "
 "wiederherstellen, wenn du Kodi neu startest. Sollte das Problem weiterhin "
-"bestehen, melde es bitte mit deiner Kodi Logdatei im \"Emby for Kodi "
+"bestehen, melde es bitte mit deiner Kodi Logdatei im \"Jellyfin for Kodi "
 "Forum\"."
 
 msgctxt "#33120"
@@ -736,10 +736,10 @@ msgstr "Schließe Personen mit ein (langsam)"
 
 msgctxt "#33125"
 msgid ""
-"Choose the Emby views to sync to Kodi. You can optionally sync libraries at "
+"Choose the Jellyfin views to sync to Kodi. You can optionally sync libraries at "
 "a later time."
 msgstr ""
-"Wähle die Emby Datenbanken, welche synchronisiert werden sollen. Optional "
+"Wähle die Jellyfin Datenbanken, welche synchronisiert werden sollen. Optional "
 "können diese auch nachträglich synchronisiert werden."
 
 msgctxt "#33126"
@@ -754,17 +754,17 @@ msgctxt "#33128"
 msgid ""
 "Failed to retrieve latest content updates. No content updates will be "
 "applied until Kodi is restarted. If this issue persists, please report on "
-"the Emby for Kodi forums, with your Kodi log."
+"the Jellyfin for Kodi forums, with your Kodi log."
 msgstr ""
 "Fehler beim Empfang der letzten Inhaltsänderungen.  Es werden keine "
 "Inhaltsänderungen angewendet ehe Kodi neu gestartet wird. Sollte das Problem"
-" weiterhin bestehen, melde es bitte mit deiner Kodi Logdatei im \"Emby for "
+" weiterhin bestehen, melde es bitte mit deiner Kodi Logdatei im \"Jellyfin for "
 "Kodi Forum\"."
 
 msgctxt "#33129"
-msgid "You can sync libraries by launching the Emby add-on > Add libraries."
+msgid "You can sync libraries by launching the Jellyfin add-on > Add libraries."
 msgstr ""
-"Du kannst die Bibliothek syncronisieren über 'Emby Addon > Bibliothek "
+"Du kannst die Bibliothek syncronisieren über 'Jellyfin Addon > Bibliothek "
 "hinzufügen."
 
 msgctxt "#33130"
@@ -838,22 +838,22 @@ msgstr "Datenbank entfernen"
 
 msgctxt "#33145"
 msgid ""
-"Please make sure your Samba (smb) share of your Emby server is accessible to"
+"Please make sure your Samba (smb) share of your Jellyfin server is accessible to"
 " your Kodi installation and that you have path substitution configured on "
 "your server. Otherwise, Kodi may fail to locate your files."
 msgstr ""
-"Bitte stell sicher das deine Samba Freigabe (smb) auf deinem Emby Server für"
+"Bitte stell sicher das deine Samba Freigabe (smb) auf deinem Jellyfin Server für"
 " Kodi zugänglich ist und das '(Optionaler) Gemeinsamer Netzwerkordner' auf "
-"dem Emby Server korrekt eingestellt ist. Ansonsten kann Kodi die Dateien "
+"dem Jellyfin Server korrekt eingestellt ist. Ansonsten kann Kodi die Dateien "
 "nicht finden."
 
 msgctxt "#33146"
-msgid "Unable to connect to Emby."
-msgstr "Verbindung zu Emby fehlgeschlagen."
+msgid "Unable to connect to Jellyfin."
+msgstr "Verbindung zu Jellyfin fehlgeschlagen."
 
 msgctxt "#33147"
-msgid "Your access to Emby is restricted."
-msgstr "Dein Zugang zu Emby ist eingeschränkt."
+msgid "Your access to Jellyfin is restricted."
+msgstr "Dein Zugang zu Jellyfin ist eingeschränkt."
 
 msgctxt "#33148"
 msgid "Your access to this server is restricted."
@@ -882,8 +882,8 @@ msgid "Unable to locate TV Tunes in Kodi."
 msgstr "TV Tunes Addon nicht gefunden"
 
 msgctxt "#33153"
-msgid "Your Emby theme media has been synced to Kodi"
-msgstr "Deine Emby Media Themes wurden synchronisiert"
+msgid "Your Jellyfin theme media has been synced to Kodi"
+msgstr "Deine Jellyfin Media Themes wurden synchronisiert"
 
 msgctxt "#33154"
 msgid "Add libraries"
@@ -891,11 +891,11 @@ msgstr "Bibliothek hinzufügen"
 
 msgctxt "#33155"
 msgid ""
-"The currently applied patch for Emby for Kodi is corrupted! Please post to "
-"the Emby for Kodi forums if this issue persists. This will need to be fixed "
+"The currently applied patch for Jellyfin for Kodi is corrupted! Please post to "
+"the Jellyfin for Kodi forums if this issue persists. This will need to be fixed "
 "as soon as possible."
 msgstr ""
-"Der aktuell angewendete Patch ist fehlerhaft! Bitte melde dich im 'Emby for "
+"Der aktuell angewendete Patch ist fehlerhaft! Bitte melde dich im 'Jellyfin for "
 "Kodi' Forum wenn der Fehler wiederholt auftritt. Der Fehler sollte so "
 "schnell wie möglich behoben werden."
 
@@ -916,8 +916,8 @@ msgid "Enable audio/subtitles selection"
 msgstr "Audio/Untertitel Auswahl aktivieren"
 
 msgctxt "#33160"
-msgid "To avoid errors, please update Emby for Kodi to version: "
-msgstr "Um Fehler zu vermeiden update bitte 'Emby for Kodi' zur Version:"
+msgid "To avoid errors, please update Jellyfin for Kodi to version: "
+msgstr "Um Fehler zu vermeiden update bitte 'Jellyfin for Kodi' zur Version:"
 
 msgctxt "#33161"
 msgid "Check for updates"
@@ -969,10 +969,10 @@ msgctxt "#33172"
 msgid ""
 "You have {number} updates pending. This may take a little while before "
 "seeing new content. It might be faster to update your libraries via "
-"launching the Emby add-on > update libraries. Proceed anyway?"
+"launching the Jellyfin add-on > update libraries. Proceed anyway?"
 msgstr ""
 "Es stehen {number} Updates an. Es kann eine Weile dauern ehe neue Inhalte "
-"angezeigt werden. Es könnte schneller gehen die Datenbank über 'Emby Addon >"
+"angezeigt werden. Es könnte schneller gehen die Datenbank über 'Jellyfin Addon >"
 " Datenbank aktualisieren' auf den neuesten Stand zu bringen. Trotzdem "
 "fortfahren? "
 
@@ -986,7 +986,7 @@ msgstr "Parallele Downloads (Standard: 3)"
 
 msgctxt "#33175"
 msgid ""
-"Paging tip: Each download thread requests your max items value from Emby at "
+"Paging tip: Each download thread requests your max items value from Jellyfin at "
 "the same time."
 msgstr ""
 "Tip: Jeder Download Vorgang nutzt jeweils die eingestellte 'Maximal parallel"
@@ -1012,8 +1012,8 @@ msgid "Force transcode"
 msgstr "Transkodierung erzwingen"
 
 msgctxt "#33180"
-msgid "Restart Emby for Kodi"
-msgstr "'Emby for Kodi' neustarten"
+msgid "Restart Jellyfin for Kodi"
+msgstr "'Jellyfin for Kodi' neustarten"
 
 msgctxt "#33181"
 msgid "Restarting to apply the patch"
@@ -1066,12 +1066,12 @@ msgid "Enable Kodi database discovery"
 msgstr "'Kodi Database discovery' aktivieren?"
 
 msgctxt "#33191"
-msgid "Restart Emby for Kodi to apply this change?"
-msgstr "'Emby for Kodi' Neustarten zum anwenden der Änderung?"
+msgid "Restart Jellyfin for Kodi to apply this change?"
+msgstr "'Jellyfin for Kodi' Neustarten zum anwenden der Änderung?"
 
 msgctxt "#33192"
-msgid "Restart Emby for Kodi"
-msgstr "'Emby for Kodi' neustarten"
+msgid "Restart Jellyfin for Kodi"
+msgstr "'Jellyfin for Kodi' neustarten"
 
 msgctxt "#33193"
 msgid "Restarting..."
diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po
index d0408eb8..ce954053 100644
--- a/resources/language/resource.language.en_gb/strings.po
+++ b/resources/language/resource.language.en_gb/strings.po
@@ -1,10 +1,10 @@
-# Emby for Kodi language file
-# Addon Name: Emby for Kodi
+# Jellyfin for Kodi language file
+# Addon Name: Jellyfin for Kodi
 # Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 msgid ""
 msgstr ""
-"Project-Id-Version: Emby for Kodi\n"
+"Project-Id-Version: Jellyfin for Kodi\n"
 "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Language-Team: \n"
@@ -15,7 +15,7 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 msgctxt "#29999"
-msgid "Emby for Kodi"
+msgid "Jellyfin for Kodi"
 msgstr ""
 
 msgctxt "#30000"
@@ -187,11 +187,11 @@ msgid "TV Shows"
 msgstr ""
 
 msgctxt "#30401"
-msgid "Emby options"
+msgid "Jellyfin options"
 msgstr ""
 
 msgctxt "#30402"
-msgid "Emby transcode"
+msgid "Jellyfin transcode"
 msgstr ""
 
 msgctxt "#30405"
@@ -207,7 +207,7 @@ msgid "Settings"
 msgstr ""
 
 msgctxt "#30409"
-msgid "Delete from Emby"
+msgid "Delete from Jellyfin"
 msgstr ""
 
 msgctxt "#30410"
@@ -347,7 +347,7 @@ msgid "Display message"
 msgstr ""
 
 msgctxt "#30600"
-msgid "Sign in with Emby Connect"
+msgid "Sign in with Jellyfin Connect"
 msgstr ""
 
 msgctxt "#30602"
@@ -387,7 +387,7 @@ msgid "Please sign in"
 msgstr ""
 
 msgctxt "#30613"
-msgid "Change Emby Connect user"
+msgid "Change Jellyfin Connect user"
 msgstr ""
 
 msgctxt "#30614"
@@ -407,7 +407,7 @@ msgid "Server or port cannot be empty"
 msgstr ""
 
 msgctxt "#30618"
-msgid "Change Emby Connect user"
+msgid "Change Jellyfin Connect user"
 msgstr ""
 
 msgctxt "#33000"
@@ -431,7 +431,7 @@ msgid "Choose the subtitles stream"
 msgstr ""
 
 msgctxt "#33015"
-msgid "Delete file from Emby?"
+msgid "Delete file from Jellyfin?"
 msgstr ""
 
 msgctxt "#33016"
@@ -447,11 +447,11 @@ msgid "Gathering:"
 msgstr ""
 
 msgctxt "#33022"
-msgid "Detected the database needs to be recreated for this version of Emby for Kodi. Proceed?"
+msgid "Detected the database needs to be recreated for this version of Jellyfin for Kodi. Proceed?"
 msgstr ""
 
 msgctxt "#33023"
-msgid "Emby for Kodi will not work correctly until the database is reset."
+msgid "Jellyfin for Kodi will not work correctly until the database is reset."
 msgstr ""
 
 msgctxt "#33025"
@@ -463,7 +463,7 @@ msgid "A new device Id has been generated. Kodi will now restart."
 msgstr ""
 
 msgctxt "#33035"
-msgid "Caution! If you choose Native mode, certain Emby features will be missing, such as: Emby cinema mode, direct stream/transcode options and parental access schedule."
+msgid "Caution! If you choose Native mode, certain Jellyfin features will be missing, such as: Jellyfin cinema mode, direct stream/transcode options and parental access schedule."
 msgstr ""
 
 msgctxt "#33036"
@@ -483,7 +483,7 @@ msgid "Kodi can't locate file:"
 msgstr ""
 
 msgctxt "#33048"
-msgid "You may need to verify your network credentials in the add-on settings or use the Emby path substitution to format your path correctly (Emby dashboard > library). Stop syncing?"
+msgid "You may need to verify your network credentials in the add-on settings or use the Jellyfin path substitution to format your path correctly (Jellyfin dashboard > library). Stop syncing?"
 msgstr ""
 
 msgctxt "#33049"
@@ -527,7 +527,7 @@ msgid "Remove all cached artwork?"
 msgstr ""
 
 msgctxt "#33087"
-msgid "Reset all Emby add-on settings?"
+msgid "Reset all Jellyfin add-on settings?"
 msgstr ""
 
 msgctxt "#33088"
@@ -555,7 +555,7 @@ msgid "Backup folder"
 msgstr ""
 
 msgctxt "#33097"
-msgid "Important, cleanonupdate was removed in your advanced settings to prevent conflict with Emby for Kodi. Kodi will restart now."
+msgid "Important, cleanonupdate was removed in your advanced settings to prevent conflict with Jellyfin for Kodi. Kodi will restart now."
 msgstr ""
 
 msgctxt "#33098"
@@ -563,7 +563,7 @@ msgid "Refresh boxsets"
 msgstr ""
 
 msgctxt "#33099"
-msgid "Install the server plugin Kodi companion to automatically apply emby library updates at startup. This setting can be found in the add-on settings > sync options > Enable Kodi Companion."
+msgid "Install the server plugin Kodi companion to automatically apply Jellyfin library updates at startup. This setting can be found in the add-on settings > sync options > Enable Kodi Companion."
 msgstr ""
 
 msgctxt "#33100"
@@ -643,7 +643,7 @@ msgid "You've change the playback mode. Kodi needs to be reset to apply the chan
 msgstr ""
 
 msgctxt "#33119"
-msgid "Something went wrong during the sync. You'll be able to restore progress when restarting Kodi. If the problem persists, please report on the Emby for Kodi forums, with your Kodi log."
+msgid "Something went wrong during the sync. You'll be able to restore progress when restarting Kodi. If the problem persists, please report on the Jellyfin for Kodi forums, with your Kodi log."
 msgstr ""
 
 msgctxt "#33120"
@@ -667,7 +667,7 @@ msgid "Include people (slow)"
 msgstr ""
 
 msgctxt "#33125"
-msgid "Choose the Emby views to sync to Kodi. You can optionally sync libraries at a later time."
+msgid "Choose the Jellyfin views to sync to Kodi. You can optionally sync libraries at a later time."
 msgstr ""
 
 msgctxt "#33126"
@@ -679,11 +679,11 @@ msgid "Proceed"
 msgstr ""
 
 msgctxt "#33128"
-msgid "Failed to retrieve latest content updates. No content updates will be applied until Kodi is restarted. If this issue persists, please report on the Emby for Kodi forums, with your Kodi log."
+msgid "Failed to retrieve latest content updates. No content updates will be applied until Kodi is restarted. If this issue persists, please report on the Jellyfin for Kodi forums, with your Kodi log."
 msgstr ""
 
 msgctxt "#33129"
-msgid "You can sync libraries by launching the Emby add-on > Add libraries."
+msgid "You can sync libraries by launching the Jellyfin add-on > Add libraries."
 msgstr ""
 
 msgctxt "#33130"
@@ -747,15 +747,15 @@ msgid "Removing library"
 msgstr ""
 
 msgctxt "#33145"
-msgid "Please make sure your Samba (smb) share of your Emby server is accessible to your Kodi installation and that you have path substitution configured on your server. Otherwise, Kodi may fail to locate your files."
+msgid "Please make sure your Samba (smb) share of your Jellyfin server is accessible to your Kodi installation and that you have path substitution configured on your server. Otherwise, Kodi may fail to locate your files."
 msgstr ""
 
 msgctxt "#33146"
-msgid "Unable to connect to Emby."
+msgid "Unable to connect to Jellyfin."
 msgstr ""
 
 msgctxt "#33147"
-msgid "Your access to Emby is restricted."
+msgid "Your access to Jellyfin is restricted."
 msgstr ""
 
 msgctxt "#33148"
@@ -779,7 +779,7 @@ msgid "Unable to locate TV Tunes in Kodi."
 msgstr ""
 
 msgctxt "#33153"
-msgid "Your Emby theme media has been synced to Kodi"
+msgid "Your Jellyfin theme media has been synced to Kodi"
 msgstr ""
 
 msgctxt "#33154"
@@ -787,7 +787,7 @@ msgid "Add libraries"
 msgstr ""
 
 msgctxt "#33155"
-msgid "The currently applied patch for Emby for Kodi is corrupted! Please post to the Emby for Kodi forums if this issue persists. This will need to be fixed as soon as possible."
+msgid "The currently applied patch for Jellyfin for Kodi is corrupted! Please post to the Jellyfin for Kodi forums if this issue persists. This will need to be fixed as soon as possible."
 msgstr ""
 
 msgctxt "#33156"
@@ -807,7 +807,7 @@ msgid "Enable audio/subtitles selection"
 msgstr ""
 
 msgctxt "#33160"
-msgid "To avoid errors, please update Emby for Kodi to version: "
+msgid "To avoid errors, please update Jellyfin for Kodi to version: "
 msgstr ""
 
 msgctxt "#33161"
@@ -855,7 +855,7 @@ msgid "By first letter"
 msgstr ""
 
 msgctxt "#33172"
-msgid "You have {number} updates pending. This may take a little while before seeing new content. It might be faster to update your libraries via launching the Emby add-on > update libraries. Proceed anyway?"
+msgid "You have {number} updates pending. This may take a little while before seeing new content. It might be faster to update your libraries via launching the Jellyfin add-on > update libraries. Proceed anyway?"
 msgstr ""
 
 msgctxt "#33173"
@@ -867,7 +867,7 @@ msgid "Paging - download threads (default: 3)"
 msgstr ""
 
 msgctxt "#33175"
-msgid "Paging tip: Each download thread requests your max items value from Emby at the same time."
+msgid "Paging tip: Each download thread requests your max items value from Jellyfin at the same time."
 msgstr ""
 
 msgctxt "#33176"
@@ -887,7 +887,7 @@ msgid "Force transcode"
 msgstr ""
 
 msgctxt "#33180"
-msgid "Restart Emby for Kodi"
+msgid "Restart Jellyfin for Kodi"
 msgstr ""
 
 msgctxt "#33181"
@@ -923,11 +923,11 @@ msgid "Would you like to sync Rotten Tomatoes ratings?"
 msgstr ""
 
 msgctxt "#33191"
-msgid "Restart Emby for Kodi to apply this change?"
+msgid "Restart Jellyfin for Kodi to apply this change?"
 msgstr ""
 
 msgctxt "#33192"
-msgid "Restart Emby for Kodi"
+msgid "Restart Jellyfin for Kodi"
 msgstr ""
 
 msgctxt "#33193"
@@ -939,7 +939,7 @@ msgid "Manage libraries"
 msgstr ""
 
 msgctxt "#33195"
-msgid "Enable Emby for Kodi"
+msgid "Enable Jellyfin for Kodi"
 msgstr ""
 
 msgctxt "#33196"
diff --git a/resources/language/resource.language.fr_fr/strings.po b/resources/language/resource.language.fr_fr/strings.po
index 03a1a716..09e453be 100644
--- a/resources/language/resource.language.fr_fr/strings.po
+++ b/resources/language/resource.language.fr_fr/strings.po
@@ -1,5 +1,5 @@
-# Emby for Kodi language file
-# Addon Name: Emby for Kodi
+# Jellyfin for Kodi language file
+# Addon Name: Jellyfin for Kodi
 # Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 # Translators:
@@ -7,7 +7,7 @@
 # 
 msgid ""
 msgstr ""
-"Project-Id-Version: Emby for Kodi\n"
+"Project-Id-Version: Jellyfin for Kodi\n"
 "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "PO-Revision-Date: 2018-09-07 20:10+0000\n"
 "Last-Translator: Jean Fontaine <balayop@yahoo.fr>, 2018\n"
@@ -19,8 +19,8 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n > 1);\n"
 
 msgctxt "#29999"
-msgid "Emby for Kodi"
-msgstr "Emby pour Kodi"
+msgid "Jellyfin for Kodi"
+msgstr "Jellyfin pour Kodi"
 
 msgctxt "#30000"
 msgid "Server address"
@@ -191,12 +191,12 @@ msgid "TV Shows"
 msgstr "Séries TV"
 
 msgctxt "#30401"
-msgid "Emby options"
-msgstr "Options Emby"
+msgid "Jellyfin options"
+msgstr "Options Jellyfin"
 
 msgctxt "#30402"
-msgid "Emby transcode"
-msgstr "Emby transcodage"
+msgid "Jellyfin transcode"
+msgstr "Jellyfin transcodage"
 
 msgctxt "#30405"
 msgid "Add to favorites"
@@ -211,8 +211,8 @@ msgid "Settings"
 msgstr "Paramètres"
 
 msgctxt "#30409"
-msgid "Delete from Emby"
-msgstr "Supprimer d'Emby"
+msgid "Delete from Jellyfin"
+msgstr "Supprimer d'Jellyfin"
 
 msgctxt "#30410"
 msgid "Refresh this item"
@@ -352,8 +352,8 @@ msgid "Display message"
 msgstr "Afficher le message"
 
 msgctxt "#30600"
-msgid "Sign in with Emby Connect"
-msgstr "S'identifier avec Emby Connect"
+msgid "Sign in with Jellyfin Connect"
+msgstr "S'identifier avec Jellyfin Connect"
 
 msgctxt "#30602"
 msgid "Password"
@@ -392,8 +392,8 @@ msgid "Please sign in"
 msgstr "Veuillez vous identifier"
 
 msgctxt "#30613"
-msgid "Change Emby Connect user"
-msgstr "Changer d'utilisateur Emby Connect"
+msgid "Change Jellyfin Connect user"
+msgstr "Changer d'utilisateur Jellyfin Connect"
 
 msgctxt "#30614"
 msgid "Connect to server"
@@ -412,8 +412,8 @@ msgid "Server or port cannot be empty"
 msgstr "Le serveur ou le port ne peuvent pas être vides"
 
 msgctxt "#30618"
-msgid "Change Emby Connect user"
-msgstr "Changer d'utilisateur Emby Connect"
+msgid "Change Jellyfin Connect user"
+msgstr "Changer d'utilisateur Jellyfin Connect"
 
 msgctxt "#33000"
 msgid "Welcome"
@@ -436,8 +436,8 @@ msgid "Choose the subtitles stream"
 msgstr "Choisissez le flux de sous-titres"
 
 msgctxt "#33015"
-msgid "Delete file from Emby?"
-msgstr "Supprimer le fichier depuis Emby ?"
+msgid "Delete file from Jellyfin?"
+msgstr "Supprimer le fichier depuis Jellyfin ?"
 
 msgctxt "#33016"
 msgid "Play trailers?"
@@ -453,14 +453,14 @@ msgstr "Rassemblage:"
 
 msgctxt "#33022"
 msgid ""
-"Detected the database needs to be recreated for this version of Emby for "
+"Detected the database needs to be recreated for this version of Jellyfin for "
 "Kodi. Proceed?"
 msgstr ""
-"La base de données doit être recréée pour cette version d'Emby pour Kodi. "
+"La base de données doit être recréée pour cette version d'Jellyfin pour Kodi. "
 "Continuer ?"
 
 msgctxt "#33023"
-msgid "Emby for Kodi will not work correctly until the database is reset."
+msgid "Jellyfin for Kodi will not work correctly until the database is reset."
 msgstr ""
 
 msgctxt "#33025"
@@ -474,12 +474,12 @@ msgstr ""
 
 msgctxt "#33035"
 msgid ""
-"Caution! If you choose Native mode, certain Emby features will be missing, "
-"such as: Emby cinema mode, direct stream/transcode options and parental "
+"Caution! If you choose Native mode, certain Jellyfin features will be missing, "
+"such as: Jellyfin cinema mode, direct stream/transcode options and parental "
 "access schedule."
 msgstr ""
-"Attention ! Si vous choisissez le mode natif, certaines fonctions Emby "
-"seront manquantes, telles que : le mode cinéma d'Emby, les options de flux "
+"Attention ! Si vous choisissez le mode natif, certaines fonctions Jellyfin "
+"seront manquantes, telles que : le mode cinéma d'Jellyfin, les options de flux "
 "direct/transcodage et la planification de l'accès parental."
 
 msgctxt "#33036"
@@ -501,12 +501,12 @@ msgstr "Kodi ne peut pas localiser le fichier :"
 msgctxt "#33048"
 msgid ""
 "You may need to verify your network credentials in the add-on settings or "
-"use the Emby path substitution to format your path correctly (Emby dashboard"
+"use the Jellyfin path substitution to format your path correctly (Jellyfin dashboard"
 " > library). Stop syncing?"
 msgstr ""
 "Vous devez peut-être vérifier vos identifiants réseau dans les paramètres de"
-" l'extension ou utiliser la substitution de chemin Emby pour formater "
-"correctement votre chemin (tableau de bord Emby > bibliothèque). Arrêter de "
+" l'extension ou utiliser la substitution de chemin Jellyfin pour formater "
+"correctement votre chemin (tableau de bord Jellyfin > bibliothèque). Arrêter de "
 "synchroniser ?"
 
 msgctxt "#33049"
@@ -551,8 +551,8 @@ msgid "Remove all cached artwork?"
 msgstr "Supprimer toutes les illustrations en cache ?"
 
 msgctxt "#33087"
-msgid "Reset all Emby add-on settings?"
-msgstr "Réinitialiser tous les paramètres de l'extension Emby ?"
+msgid "Reset all Jellyfin add-on settings?"
+msgstr "Réinitialiser tous les paramètres de l'extension Jellyfin ?"
 
 msgctxt "#33088"
 msgid ""
@@ -584,10 +584,10 @@ msgstr "Dossier de sauvegarde"
 msgctxt "#33097"
 msgid ""
 "Important, cleanonupdate was removed in your advanced settings to prevent "
-"conflict with Emby for Kodi. Kodi will restart now."
+"conflict with Jellyfin for Kodi. Kodi will restart now."
 msgstr ""
 "Important, cleanonupdate a été supprimé dans vos paramètres avancés pour "
-"éviter tout conflit avec Emby pour Kodi. Kodi va redémarrer maintenant."
+"éviter tout conflit avec Jellyfin pour Kodi. Kodi va redémarrer maintenant."
 
 msgctxt "#33098"
 msgid "Refresh boxsets"
@@ -595,12 +595,12 @@ msgstr "Rafraîchir les sagas"
 
 msgctxt "#33099"
 msgid ""
-"Install the server plugin Kodi companion to automatically apply emby library"
+"Install the server plugin Kodi companion to automatically apply Jellyfin library"
 " updates at startup. This setting can be found in the add-on settings > sync"
 " options > Enable Kodi Companion."
 msgstr ""
 "Installez le plugin serveur Kodi companion pour appliquer automatiquement "
-"les mises à jour de la bibliothèque emby au démarrage. Ce paramètre se "
+"les mises à jour de la bibliothèque Jellyfin au démarrage. Ce paramètre se "
 "trouve dans les paramètres complémentaires > options de synchronisation > "
 "Activer Kodi Companion."
 
@@ -707,12 +707,12 @@ msgstr ""
 msgctxt "#33119"
 msgid ""
 "Something went wrong during the sync. You'll be able to restore progress "
-"when restarting Kodi. If the problem persists, please report on the Emby for"
+"when restarting Kodi. If the problem persists, please report on the Jellyfin for"
 " Kodi forums, with your Kodi log."
 msgstr ""
 "Quelque chose s'est mal passé pendant la synchronisation. Vous pourrez "
 "restaurer la progression au redémarrage de Kodi. Si le problème persiste, "
-"merci de nous le signaler sur les forums Emby pour Kodi, avec votre journal "
+"merci de nous le signaler sur les forums Jellyfin pour Kodi, avec votre journal "
 "Kodi."
 
 msgctxt "#33120"
@@ -737,10 +737,10 @@ msgstr "Inclure les individus (lent)"
 
 msgctxt "#33125"
 msgid ""
-"Choose the Emby views to sync to Kodi. You can optionally sync libraries at "
+"Choose the Jellyfin views to sync to Kodi. You can optionally sync libraries at "
 "a later time."
 msgstr ""
-"Choisir les vues Emby à synchroniser avec Kodi. Vous pouvez éventuellement "
+"Choisir les vues Jellyfin à synchroniser avec Kodi. Vous pouvez éventuellement "
 "synchroniser les médiathèques ultérieurement."
 
 msgctxt "#33126"
@@ -755,17 +755,17 @@ msgctxt "#33128"
 msgid ""
 "Failed to retrieve latest content updates. No content updates will be "
 "applied until Kodi is restarted. If this issue persists, please report on "
-"the Emby for Kodi forums, with your Kodi log."
+"the Jellyfin for Kodi forums, with your Kodi log."
 msgstr ""
 "Impossible de récupérer les dernières mises à jour du contenu. Aucune mise à"
 " jour du contenu ne sera appliquée tant que Kodi n'aura pas redémarré. Si ce"
-" problème persiste, merci de le signaler sur les forums Emby pour Kodi, avec"
+" problème persiste, merci de le signaler sur les forums Jellyfin pour Kodi, avec"
 " votre journal Kodi."
 
 msgctxt "#33129"
-msgid "You can sync libraries by launching the Emby add-on > Add libraries."
+msgid "You can sync libraries by launching the Jellyfin add-on > Add libraries."
 msgstr ""
-"Vous pouvez synchroniser les médiathèques en lançant l'add-on Emby > Ajouter"
+"Vous pouvez synchroniser les médiathèques en lançant l'add-on Jellyfin > Ajouter"
 " des médiathèques."
 
 msgctxt "#33130"
@@ -839,22 +839,22 @@ msgstr "Suppression de la médiathèque"
 
 msgctxt "#33145"
 msgid ""
-"Please make sure your Samba (smb) share of your Emby server is accessible to"
+"Please make sure your Samba (smb) share of your Jellyfin server is accessible to"
 " your Kodi installation and that you have path substitution configured on "
 "your server. Otherwise, Kodi may fail to locate your files."
 msgstr ""
-"Veuillez vous assurer que le partage Samba (smb) de votre serveur Emby est "
+"Veuillez vous assurer que le partage Samba (smb) de votre serveur Jellyfin est "
 "accessible à votre installation Kodi et que vous avez configuré la "
 "substitution de chemin sur votre serveur. Sinon, Kodi pourrait ne pas "
 "localiser vos fichiers."
 
 msgctxt "#33146"
-msgid "Unable to connect to Emby."
-msgstr "Impossible de se connecter à Emby."
+msgid "Unable to connect to Jellyfin."
+msgstr "Impossible de se connecter à Jellyfin."
 
 msgctxt "#33147"
-msgid "Your access to Emby is restricted."
-msgstr "Votre accès à Emby est limité."
+msgid "Your access to Jellyfin is restricted."
+msgstr "Votre accès à Jellyfin est limité."
 
 msgctxt "#33148"
 msgid "Your access to this server is restricted."
@@ -883,8 +883,8 @@ msgid "Unable to locate TV Tunes in Kodi."
 msgstr "Impossible de trouver TV Tunes dans Kodi."
 
 msgctxt "#33153"
-msgid "Your Emby theme media has been synced to Kodi"
-msgstr "Votre média de thème Emby a été synchronisé avec Kodi"
+msgid "Your Jellyfin theme media has been synced to Kodi"
+msgstr "Votre média de thème Jellyfin a été synchronisé avec Kodi"
 
 msgctxt "#33154"
 msgid "Add libraries"
@@ -892,12 +892,12 @@ msgstr "Ajouter des médiathèques"
 
 msgctxt "#33155"
 msgid ""
-"The currently applied patch for Emby for Kodi is corrupted! Please post to "
-"the Emby for Kodi forums if this issue persists. This will need to be fixed "
+"The currently applied patch for Jellyfin for Kodi is corrupted! Please post to "
+"the Jellyfin for Kodi forums if this issue persists. This will need to be fixed "
 "as soon as possible."
 msgstr ""
-"Le patch actuellement appliqué pour Emby pour Kodi est corrompu ! Veuillez "
-"poster sur les forums Emby pour Kodi si ce problème persiste. Cette "
+"Le patch actuellement appliqué pour Jellyfin pour Kodi est corrompu ! Veuillez "
+"poster sur les forums Jellyfin pour Kodi si ce problème persiste. Cette "
 "situation devra être corrigée dès que possible."
 
 msgctxt "#33156"
@@ -917,9 +917,9 @@ msgid "Enable audio/subtitles selection"
 msgstr "Activer la sélection audio/sous-titres"
 
 msgctxt "#33160"
-msgid "To avoid errors, please update Emby for Kodi to version: "
+msgid "To avoid errors, please update Jellyfin for Kodi to version: "
 msgstr ""
-"Pour éviter les erreurs, veuillez mettre à jour la version d'Emby pour Kodi "
+"Pour éviter les erreurs, veuillez mettre à jour la version d'Jellyfin pour Kodi "
 ": "
 
 msgctxt "#33161"
@@ -972,11 +972,11 @@ msgctxt "#33172"
 msgid ""
 "You have {number} updates pending. This may take a little while before "
 "seeing new content. It might be faster to update your libraries via "
-"launching the Emby add-on > update libraries. Proceed anyway?"
+"launching the Jellyfin add-on > update libraries. Proceed anyway?"
 msgstr ""
 "Vous avez {number} mises à jour en attente. Cela peut prendre un peu de "
 "temps avant de voir le nouveau contenu. Il peut être plus rapide de mettre à"
-" jour vos médiathèques en lançant l'add-on Emby > mettre à jour les "
+" jour vos médiathèques en lançant l'add-on Jellyfin > mettre à jour les "
 "médiathèques. Procéder quand même ?"
 
 msgctxt "#33173"
@@ -989,11 +989,11 @@ msgstr ""
 
 msgctxt "#33175"
 msgid ""
-"Paging tip: Each download thread requests your max items value from Emby at "
+"Paging tip: Each download thread requests your max items value from Jellyfin at "
 "the same time."
 msgstr ""
 "Conseil de pagination : Chaque téléchargement demande la valeur maximale des"
-" éléments d'Emby en même temps."
+" éléments d'Jellyfin en même temps."
 
 msgctxt "#33176"
 msgid "Update or repair your libraries to apply the changes below."
@@ -1016,7 +1016,7 @@ msgid "Force transcode"
 msgstr "Forcer le transcodage"
 
 msgctxt "#33180"
-msgid "Restart Emby for Kodi"
+msgid "Restart Jellyfin for Kodi"
 msgstr ""
 
 msgctxt "#33181"
@@ -1054,11 +1054,11 @@ msgid "Would you like to sync Rotten Tomatoes ratings?"
 msgstr ""
 
 msgctxt "#33191"
-msgid "Restart Emby for Kodi to apply this change?"
+msgid "Restart Jellyfin for Kodi to apply this change?"
 msgstr ""
 
 msgctxt "#33192"
-msgid "Restart Emby for Kodi"
+msgid "Restart Jellyfin for Kodi"
 msgstr ""
 
 msgctxt "#33193"
diff --git a/resources/language/resource.language.it_it/strings.po b/resources/language/resource.language.it_it/strings.po
index b4e2d650..b5487cec 100644
--- a/resources/language/resource.language.it_it/strings.po
+++ b/resources/language/resource.language.it_it/strings.po
@@ -1,5 +1,5 @@
-# Emby for Kodi language file
-# Addon Name: Emby for Kodi
+# Jellyfin for Kodi language file
+# Addon Name: Jellyfin for Kodi
 # Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 # Translators:
@@ -7,7 +7,7 @@
 # 
 msgid ""
 msgstr ""
-"Project-Id-Version: Emby for Kodi\n"
+"Project-Id-Version: Jellyfin for Kodi\n"
 "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "PO-Revision-Date: 2018-09-07 20:10+0000\n"
 "Last-Translator: EffeF, 2019\n"
@@ -19,8 +19,8 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 msgctxt "#29999"
-msgid "Emby for Kodi"
-msgstr "Emby per Kodi"
+msgid "Jellyfin for Kodi"
+msgstr "Jellyfin per Kodi"
 
 msgctxt "#30000"
 msgid "Server address"
@@ -191,12 +191,12 @@ msgid "TV Shows"
 msgstr "Serie TV"
 
 msgctxt "#30401"
-msgid "Emby options"
-msgstr "Opzioni Emby"
+msgid "Jellyfin options"
+msgstr "Opzioni Jellyfin"
 
 msgctxt "#30402"
-msgid "Emby transcode"
-msgstr "Transcodifica Emby"
+msgid "Jellyfin transcode"
+msgstr "Transcodifica Jellyfin"
 
 msgctxt "#30405"
 msgid "Add to favorites"
@@ -211,8 +211,8 @@ msgid "Settings"
 msgstr "Impostazioni"
 
 msgctxt "#30409"
-msgid "Delete from Emby"
-msgstr "Elimina da Emby"
+msgid "Delete from Jellyfin"
+msgstr "Elimina da Jellyfin"
 
 msgctxt "#30410"
 msgid "Refresh this item"
@@ -351,8 +351,8 @@ msgid "Display message"
 msgstr "Mostra messggio"
 
 msgctxt "#30600"
-msgid "Sign in with Emby Connect"
-msgstr "Accedi con Emby Connect"
+msgid "Sign in with Jellyfin Connect"
+msgstr "Accedi con Jellyfin Connect"
 
 msgctxt "#30602"
 msgid "Password"
@@ -391,8 +391,8 @@ msgid "Please sign in"
 msgstr "Per favore accedi"
 
 msgctxt "#30613"
-msgid "Change Emby Connect user"
-msgstr "Cambia utente Emby Connect"
+msgid "Change Jellyfin Connect user"
+msgstr "Cambia utente Jellyfin Connect"
 
 msgctxt "#30614"
 msgid "Connect to server"
@@ -411,8 +411,8 @@ msgid "Server or port cannot be empty"
 msgstr "Server o porta non possono essere vuoti"
 
 msgctxt "#30618"
-msgid "Change Emby Connect user"
-msgstr "Cambia utente Emby Connect"
+msgid "Change Jellyfin Connect user"
+msgstr "Cambia utente Jellyfin Connect"
 
 msgctxt "#33000"
 msgid "Welcome"
@@ -435,8 +435,8 @@ msgid "Choose the subtitles stream"
 msgstr "Scegli il flusso dei sottotitoli"
 
 msgctxt "#33015"
-msgid "Delete file from Emby?"
-msgstr "Eliminare file da Emby?"
+msgid "Delete file from Jellyfin?"
+msgstr "Eliminare file da Jellyfin?"
 
 msgctxt "#33016"
 msgid "Play trailers?"
@@ -452,16 +452,16 @@ msgstr "Raggruppa:"
 
 msgctxt "#33022"
 msgid ""
-"Detected the database needs to be recreated for this version of Emby for "
+"Detected the database needs to be recreated for this version of Jellyfin for "
 "Kodi. Proceed?"
 msgstr ""
-"Rilevato che il database deve essere ricreato per questa versione di Emby "
+"Rilevato che il database deve essere ricreato per questa versione di Jellyfin "
 "per Kodi. Procedere?"
 
 msgctxt "#33023"
-msgid "Emby for Kodi will not work correctly until the database is reset."
+msgid "Jellyfin for Kodi will not work correctly until the database is reset."
 msgstr ""
-"Emby per Kodi non funzionerà correttamente fino al ripristino del database."
+"Jellyfin per Kodi non funzionerà correttamente fino al ripristino del database."
 
 msgctxt "#33025"
 msgid "Completed in:"
@@ -473,12 +473,12 @@ msgstr "È stato generato un nuovo ID dispositivo. Kodi verrà riavviato."
 
 msgctxt "#33035"
 msgid ""
-"Caution! If you choose Native mode, certain Emby features will be missing, "
-"such as: Emby cinema mode, direct stream/transcode options and parental "
+"Caution! If you choose Native mode, certain Jellyfin features will be missing, "
+"such as: Jellyfin cinema mode, direct stream/transcode options and parental "
 "access schedule."
 msgstr ""
-"Attenzione! Se si sceglie la modalità nativa, alcune funzionalità di Emby "
-"saranno assenti, come ad esempio: modalità cinema Emby, opzioni streaming "
+"Attenzione! Se si sceglie la modalità nativa, alcune funzionalità di Jellyfin "
+"saranno assenti, come ad esempio: modalità cinema Jellyfin, opzioni streaming "
 "diretto/transcodifica e il controllo parentale."
 
 msgctxt "#33036"
@@ -500,12 +500,12 @@ msgstr "Kodi non riesce a localizzare il file:"
 msgctxt "#33048"
 msgid ""
 "You may need to verify your network credentials in the add-on settings or "
-"use the Emby path substitution to format your path correctly (Emby dashboard"
+"use the Jellyfin path substitution to format your path correctly (Jellyfin dashboard"
 " > library). Stop syncing?"
 msgstr ""
 "Potrebbe essere necessario verificare le credenziali di rete nelle "
-"impostazioni dell'add-on o utilizzare la sostituzione del percorso Emby per "
-"formattare correttamente il percorso (pannello controllo Emby > librerie). "
+"impostazioni dell'add-on o utilizzare la sostituzione del percorso Jellyfin per "
+"formattare correttamente il percorso (pannello controllo Jellyfin > librerie). "
 "Interrompere la sincronizzazione?"
 
 msgctxt "#33049"
@@ -549,8 +549,8 @@ msgid "Remove all cached artwork?"
 msgstr "Rimuove tutte le artwork dalla cache?"
 
 msgctxt "#33087"
-msgid "Reset all Emby add-on settings?"
-msgstr "Resetta tutte le impostazioni dell'add-on Emby?"
+msgid "Reset all Jellyfin add-on settings?"
+msgstr "Resetta tutte le impostazioni dell'add-on Jellyfin?"
 
 msgctxt "#33088"
 msgid ""
@@ -582,10 +582,10 @@ msgstr "Cartella backup"
 msgctxt "#33097"
 msgid ""
 "Important, cleanonupdate was removed in your advanced settings to prevent "
-"conflict with Emby for Kodi. Kodi will restart now."
+"conflict with Jellyfin for Kodi. Kodi will restart now."
 msgstr ""
 "Importante, cleanonupdate è stato rimosso nelle impostazioni avanzate per "
-"evitare conflitti con Emby per Kodi. Kodi verrà riavviato."
+"evitare conflitti con Jellyfin per Kodi. Kodi verrà riavviato."
 
 msgctxt "#33098"
 msgid "Refresh boxsets"
@@ -593,12 +593,12 @@ msgstr "Aggiorna collezioni"
 
 msgctxt "#33099"
 msgid ""
-"Install the server plugin Kodi companion to automatically apply emby library"
+"Install the server plugin Kodi companion to automatically apply Jellyfin library"
 " updates at startup. This setting can be found in the add-on settings > sync"
 " options > Enable Kodi Companion."
 msgstr ""
 "Installa il plugin Kodi companion sul server per applicare automaticamente "
-"gli aggiornamenti della libreria Emby all'avvio. Questa impostazione può "
+"gli aggiornamenti della libreria Jellyfin all'avvio. Questa impostazione può "
 "essere trovata nelle impostazioni dell'add-on > opzioni di sincronizzazione>"
 " Abilita Kodi Companion."
 
@@ -703,12 +703,12 @@ msgstr ""
 msgctxt "#33119"
 msgid ""
 "Something went wrong during the sync. You'll be able to restore progress "
-"when restarting Kodi. If the problem persists, please report on the Emby for"
+"when restarting Kodi. If the problem persists, please report on the Jellyfin for"
 " Kodi forums, with your Kodi log."
 msgstr ""
 "Qualcosa è andato storto durante la sincronizzazione. Sarai in grado di "
 "ripristinare i progressi al riavvio di Kodi. Se il problema persiste, si "
-"prega di riferire sul forum di Emby per Kodi, con il tuo log di Kodi."
+"prega di riferire sul forum di Jellyfin per Kodi, con il tuo log di Kodi."
 
 msgctxt "#33120"
 msgid "Select the libraries to add"
@@ -732,10 +732,10 @@ msgstr "Includi persone (lento)"
 
 msgctxt "#33125"
 msgid ""
-"Choose the Emby views to sync to Kodi. You can optionally sync libraries at "
+"Choose the Jellyfin views to sync to Kodi. You can optionally sync libraries at "
 "a later time."
 msgstr ""
-"Scegli le viste Emby da sincronizzare con Kodi. Puoi opzionalmente "
+"Scegli le viste Jellyfin da sincronizzare con Kodi. Puoi opzionalmente "
 "sincronizzare le librerie in un secondo momento."
 
 msgctxt "#33126"
@@ -750,17 +750,17 @@ msgctxt "#33128"
 msgid ""
 "Failed to retrieve latest content updates. No content updates will be "
 "applied until Kodi is restarted. If this issue persists, please report on "
-"the Emby for Kodi forums, with your Kodi log."
+"the Jellyfin for Kodi forums, with your Kodi log."
 msgstr ""
 "Impossibile recuperare gli ultimi aggiornamenti dei contenuti. Nessun "
 "aggiornamento dei contenuti verrà applicato fino al riavvio di Kodi. Se il "
-"problema persiste, segnalalo sul forum di Emby per Kodi, con il tuo log di "
+"problema persiste, segnalalo sul forum di Jellyfin per Kodi, con il tuo log di "
 "Kodi."
 
 msgctxt "#33129"
-msgid "You can sync libraries by launching the Emby add-on > Add libraries."
+msgid "You can sync libraries by launching the Jellyfin add-on > Add libraries."
 msgstr ""
-"È possibile sincronizzare le librerie avviando l'add-on Emby > Aggiungi "
+"È possibile sincronizzare le librerie avviando l'add-on Jellyfin > Aggiungi "
 "librerie."
 
 msgctxt "#33130"
@@ -834,22 +834,22 @@ msgstr "Rimozione della libreria"
 
 msgctxt "#33145"
 msgid ""
-"Please make sure your Samba (smb) share of your Emby server is accessible to"
+"Please make sure your Samba (smb) share of your Jellyfin server is accessible to"
 " your Kodi installation and that you have path substitution configured on "
 "your server. Otherwise, Kodi may fail to locate your files."
 msgstr ""
-"Assicurati che la tua condivisione di Samba (smb) del tuo server Emby sia "
+"Assicurati che la tua condivisione di Samba (smb) del tuo server Jellyfin sia "
 "accessibile all'installazione di Kodi e che sia stata configurata la "
 "sostituzione del percorso sul tuo server. In caso contrario, Kodi potrebbe "
 "non riuscire a individuare i file."
 
 msgctxt "#33146"
-msgid "Unable to connect to Emby."
-msgstr "Impossibile connettersi a Emby."
+msgid "Unable to connect to Jellyfin."
+msgstr "Impossibile connettersi a Jellyfin."
 
 msgctxt "#33147"
-msgid "Your access to Emby is restricted."
-msgstr "Il tuo accesso a Emby è limitato."
+msgid "Your access to Jellyfin is restricted."
+msgstr "Il tuo accesso a Jellyfin è limitato."
 
 msgctxt "#33148"
 msgid "Your access to this server is restricted."
@@ -878,8 +878,8 @@ msgid "Unable to locate TV Tunes in Kodi."
 msgstr "Impossibile trovare TV Tunes in Kodi."
 
 msgctxt "#33153"
-msgid "Your Emby theme media has been synced to Kodi"
-msgstr "I tuoi temi multimediali Emby sono stati sincronizzati con Kodi"
+msgid "Your Jellyfin theme media has been synced to Kodi"
+msgstr "I tuoi temi multimediali Jellyfin sono stati sincronizzati con Kodi"
 
 msgctxt "#33154"
 msgid "Add libraries"
@@ -887,12 +887,12 @@ msgstr "Aggiungi librerie"
 
 msgctxt "#33155"
 msgid ""
-"The currently applied patch for Emby for Kodi is corrupted! Please post to "
-"the Emby for Kodi forums if this issue persists. This will need to be fixed "
+"The currently applied patch for Jellyfin for Kodi is corrupted! Please post to "
+"the Jellyfin for Kodi forums if this issue persists. This will need to be fixed "
 "as soon as possible."
 msgstr ""
-"La patch attualmente applicata per Emby per Kodi è corrotta! Si prega di "
-"postare sul forum di Emby per Kodi se questo problema persiste. Questo dovrà"
+"La patch attualmente applicata per Jellyfin per Kodi è corrotta! Si prega di "
+"postare sul forum di Jellyfin per Kodi se questo problema persiste. Questo dovrà"
 " essere risolto il prima possibile."
 
 msgctxt "#33156"
@@ -912,8 +912,8 @@ msgid "Enable audio/subtitles selection"
 msgstr "Abilita selezione audio/sottotitoli"
 
 msgctxt "#33160"
-msgid "To avoid errors, please update Emby for Kodi to version: "
-msgstr "Per evitare errori, aggiorna Emby per Kodi alla versione:"
+msgid "To avoid errors, please update Jellyfin for Kodi to version: "
+msgstr "Per evitare errori, aggiorna Jellyfin per Kodi alla versione:"
 
 msgctxt "#33161"
 msgid "Check for updates"
@@ -964,11 +964,11 @@ msgctxt "#33172"
 msgid ""
 "You have {number} updates pending. This may take a little while before "
 "seeing new content. It might be faster to update your libraries via "
-"launching the Emby add-on > update libraries. Proceed anyway?"
+"launching the Jellyfin add-on > update libraries. Proceed anyway?"
 msgstr ""
 "Hai {number} aggiornamenti in sospeso. Questo potrebbe richiedere un po' di "
 "tempo prima di poter vedere i nuovi contenuti. Potrebbe essere più rapido "
-"aggiornare le tue librerie avviando l'add-on di Emby > Aggiorna librerie. "
+"aggiornare le tue librerie avviando l'add-on di Jellyfin > Aggiorna librerie. "
 "Procedere comunque?"
 
 msgctxt "#33173"
@@ -981,11 +981,11 @@ msgstr "Chiamata - thread di download (default: 3)"
 
 msgctxt "#33175"
 msgid ""
-"Paging tip: Each download thread requests your max items value from Emby at "
+"Paging tip: Each download thread requests your max items value from Jellyfin at "
 "the same time."
 msgstr ""
 "Suggerimento: ogni thread di download richiede il tuoi elementi richiesti "
-"massimi da Emby contemporaneamente."
+"massimi da Jellyfin contemporaneamente."
 
 msgctxt "#33176"
 msgid "Update or repair your libraries to apply the changes below."
@@ -1005,8 +1005,8 @@ msgid "Force transcode"
 msgstr "Forza transcodifica"
 
 msgctxt "#33180"
-msgid "Restart Emby for Kodi"
-msgstr "Riavvia Emby per Kodi"
+msgid "Restart Jellyfin for Kodi"
+msgstr "Riavvia Jellyfin per Kodi"
 
 msgctxt "#33181"
 msgid "Restarting to apply the patch"
@@ -1059,12 +1059,12 @@ msgid "Enable Kodi database discovery"
 msgstr "Abilita il rilevamento del database Kodi"
 
 msgctxt "#33191"
-msgid "Restart Emby for Kodi to apply this change?"
-msgstr "Riavvia Emby per Kodi per applicare questo cambiamento?"
+msgid "Restart Jellyfin for Kodi to apply this change?"
+msgstr "Riavvia Jellyfin per Kodi per applicare questo cambiamento?"
 
 msgctxt "#33192"
-msgid "Restart Emby for Kodi"
-msgstr "Riavvia Emby per Kodi"
+msgid "Restart Jellyfin for Kodi"
+msgstr "Riavvia Jellyfin per Kodi"
 
 msgctxt "#33193"
 msgid "Restarting..."
diff --git a/resources/language/resource.language.nl_nl/strings.po b/resources/language/resource.language.nl_nl/strings.po
index 732a7d13..62f91c10 100644
--- a/resources/language/resource.language.nl_nl/strings.po
+++ b/resources/language/resource.language.nl_nl/strings.po
@@ -1,5 +1,5 @@
-# Emby for Kodi language file
-# Addon Name: Emby for Kodi
+# Jellyfin for Kodi language file
+# Addon Name: Jellyfin for Kodi
 # Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 # Translators:
@@ -7,7 +7,7 @@
 # 
 msgid ""
 msgstr ""
-"Project-Id-Version: Emby for Kodi\n"
+"Project-Id-Version: Jellyfin for Kodi\n"
 "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "PO-Revision-Date: 2018-09-07 20:10+0000\n"
 "Last-Translator: 63ac71fcbd0581bb567b1f0d798c7970, 2019\n"
@@ -19,8 +19,8 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 msgctxt "#29999"
-msgid "Emby for Kodi"
-msgstr "Emby voor Kodi"
+msgid "Jellyfin for Kodi"
+msgstr "Jellyfin voor Kodi"
 
 msgctxt "#30000"
 msgid "Server address"
@@ -191,12 +191,12 @@ msgid "TV Shows"
 msgstr "TV series"
 
 msgctxt "#30401"
-msgid "Emby options"
-msgstr "Emby opties"
+msgid "Jellyfin options"
+msgstr "Jellyfin opties"
 
 msgctxt "#30402"
-msgid "Emby transcode"
-msgstr "Emby transcode"
+msgid "Jellyfin transcode"
+msgstr "Jellyfin transcode"
 
 msgctxt "#30405"
 msgid "Add to favorites"
@@ -211,8 +211,8 @@ msgid "Settings"
 msgstr "Instellingen"
 
 msgctxt "#30409"
-msgid "Delete from Emby"
-msgstr "Uit Emby verwijderen"
+msgid "Delete from Jellyfin"
+msgstr "Uit Jellyfin verwijderen"
 
 msgctxt "#30410"
 msgid "Refresh this item"
@@ -351,8 +351,8 @@ msgid "Display message"
 msgstr "Melding tonen"
 
 msgctxt "#30600"
-msgid "Sign in with Emby Connect"
-msgstr "Aanmelden met Emby Connect"
+msgid "Sign in with Jellyfin Connect"
+msgstr "Aanmelden met Jellyfin Connect"
 
 msgctxt "#30602"
 msgid "Password"
@@ -391,8 +391,8 @@ msgid "Please sign in"
 msgstr "Aanmelden"
 
 msgctxt "#30613"
-msgid "Change Emby Connect user"
-msgstr "Emby Connect gebruiker wijzigen"
+msgid "Change Jellyfin Connect user"
+msgstr "Jellyfin Connect gebruiker wijzigen"
 
 msgctxt "#30614"
 msgid "Connect to server"
@@ -411,8 +411,8 @@ msgid "Server or port cannot be empty"
 msgstr "Server of poort kan niet leeg zijn"
 
 msgctxt "#30618"
-msgid "Change Emby Connect user"
-msgstr "Emby Connect gebruiker wijzigen"
+msgid "Change Jellyfin Connect user"
+msgstr "Jellyfin Connect gebruiker wijzigen"
 
 msgctxt "#33000"
 msgid "Welcome"
@@ -435,8 +435,8 @@ msgid "Choose the subtitles stream"
 msgstr "Kies ondertitel stream"
 
 msgctxt "#33015"
-msgid "Delete file from Emby?"
-msgstr "Bestand uit Emby verwijderen?"
+msgid "Delete file from Jellyfin?"
+msgstr "Bestand uit Jellyfin verwijderen?"
 
 msgctxt "#33016"
 msgid "Play trailers?"
@@ -452,15 +452,15 @@ msgstr "Verzamelen:"
 
 msgctxt "#33022"
 msgid ""
-"Detected the database needs to be recreated for this version of Emby for "
+"Detected the database needs to be recreated for this version of Jellyfin for "
 "Kodi. Proceed?"
 msgstr ""
-"De databank moet opnieuw gemaakt worden voor deze versie van Emby for Kodi. "
+"De databank moet opnieuw gemaakt worden voor deze versie van Jellyfin for Kodi. "
 "Verder gaan?"
 
 msgctxt "#33023"
-msgid "Emby for Kodi will not work correctly until the database is reset."
-msgstr "Emby for Kodi werkt niet correct voor dat de databank gereset is."
+msgid "Jellyfin for Kodi will not work correctly until the database is reset."
+msgstr "Jellyfin for Kodi werkt niet correct voor dat de databank gereset is."
 
 msgctxt "#33025"
 msgid "Completed in:"
@@ -472,12 +472,12 @@ msgstr "Een nieuw apparaat id is aangemaakt. Kodi start nu opnieuw."
 
 msgctxt "#33035"
 msgid ""
-"Caution! If you choose Native mode, certain Emby features will be missing, "
-"such as: Emby cinema mode, direct stream/transcode options and parental "
+"Caution! If you choose Native mode, certain Jellyfin features will be missing, "
+"such as: Jellyfin cinema mode, direct stream/transcode options and parental "
 "access schedule."
 msgstr ""
-"Opgepast! Bij het kiezen van Native mode, zullen bepaalde Emby mogelijkheden"
-" ontbreken zoals: Emby Cinema modus, direct stream/transcode opties and "
+"Opgepast! Bij het kiezen van Native mode, zullen bepaalde Jellyfin mogelijkheden"
+" ontbreken zoals: Jellyfin Cinema modus, direct stream/transcode opties and "
 "ouderlijke toegang planning."
 
 msgctxt "#33036"
@@ -499,12 +499,12 @@ msgstr "Kodi kan volgende bestand niet vinden:"
 msgctxt "#33048"
 msgid ""
 "You may need to verify your network credentials in the add-on settings or "
-"use the Emby path substitution to format your path correctly (Emby dashboard"
+"use the Jellyfin path substitution to format your path correctly (Jellyfin dashboard"
 " > library). Stop syncing?"
 msgstr ""
 "Misschien is het nodig uw netwerk gegevens na te kijken in de add-on "
-"instellingen of gebruik de Emby path vervanging om uw folder correct te "
-"formateren (Emby dashboard > bibliotheek). Synchroniseren stoppen?"
+"instellingen of gebruik de Jellyfin path vervanging om uw folder correct te "
+"formateren (Jellyfin dashboard > bibliotheek). Synchroniseren stoppen?"
 
 msgctxt "#33049"
 msgid "New"
@@ -547,8 +547,8 @@ msgid "Remove all cached artwork?"
 msgstr "Cached artwork verwijderen?"
 
 msgctxt "#33087"
-msgid "Reset all Emby add-on settings?"
-msgstr "Alle Emby add-on instellingen resetten?"
+msgid "Reset all Jellyfin add-on settings?"
+msgstr "Alle Jellyfin add-on instellingen resetten?"
 
 msgctxt "#33088"
 msgid ""
@@ -580,10 +580,10 @@ msgstr "Backup folder"
 msgctxt "#33097"
 msgid ""
 "Important, cleanonupdate was removed in your advanced settings to prevent "
-"conflict with Emby for Kodi. Kodi will restart now."
+"conflict with Jellyfin for Kodi. Kodi will restart now."
 msgstr ""
 "Belangrijd, cleanonupdate is verwijderen uit de geavanceerde instellingen om"
-" een conflict met Emby for Kodi te voorkomen. Kodi start nu opnieuw op."
+" een conflict met Jellyfin for Kodi te voorkomen. Kodi start nu opnieuw op."
 
 msgctxt "#33098"
 msgid "Refresh boxsets"
@@ -591,11 +591,11 @@ msgstr "Boxsets vernieuwen"
 
 msgctxt "#33099"
 msgid ""
-"Install the server plugin Kodi companion to automatically apply emby library"
+"Install the server plugin Kodi companion to automatically apply Jellyfin library"
 " updates at startup. This setting can be found in the add-on settings > sync"
 " options > Enable Kodi Companion."
 msgstr ""
-"Installeer de server plugin Kodi companion om Emby bibliotheek updates "
+"Installeer de server plugin Kodi companion om Jellyfin bibliotheek updates "
 "automatisch te laten lopen bij het opstarten. Deze instellingen kan gevonden"
 " worden in de add-on instellingen > synchroniseer opties > Kodi Companion "
 "inschakelen."
@@ -700,12 +700,12 @@ msgstr ""
 msgctxt "#33119"
 msgid ""
 "Something went wrong during the sync. You'll be able to restore progress "
-"when restarting Kodi. If the problem persists, please report on the Emby for"
+"when restarting Kodi. If the problem persists, please report on the Jellyfin for"
 " Kodi forums, with your Kodi log."
 msgstr ""
 "Er is iets mis gegaan tijdens de synchronisatie. U kunt de voortgang "
 "herstellen als u Kodi opnieuw opstart. Als het probleem blijft, meld dit "
-"probleem dan op de Emby for Kodi forums, met uw Kodi log."
+"probleem dan op de Jellyfin for Kodi forums, met uw Kodi log."
 
 msgctxt "#33120"
 msgid "Select the libraries to add"
@@ -729,10 +729,10 @@ msgstr "Mensen meerekenen (langzaam)"
 
 msgctxt "#33125"
 msgid ""
-"Choose the Emby views to sync to Kodi. You can optionally sync libraries at "
+"Choose the Jellyfin views to sync to Kodi. You can optionally sync libraries at "
 "a later time."
 msgstr ""
-"Kies de Emby zichten om naar Kodi te synchroniseren. U kunt later de "
+"Kies de Jellyfin zichten om naar Kodi te synchroniseren. U kunt later de "
 "bibliotheken optioneel synchroniseren."
 
 msgctxt "#33126"
@@ -747,16 +747,16 @@ msgctxt "#33128"
 msgid ""
 "Failed to retrieve latest content updates. No content updates will be "
 "applied until Kodi is restarted. If this issue persists, please report on "
-"the Emby for Kodi forums, with your Kodi log."
+"the Jellyfin for Kodi forums, with your Kodi log."
 msgstr ""
 "Het is mislukt om de laatste inhoud updates te verkrijgen. Er worden geen "
 "inhoud updates toe gepast totdat Kodi opnieuw is opgestart. Als deze fout "
-"blijft komen, meld u dan op de Emby for Kodi forums met uw Kodi log."
+"blijft komen, meld u dan op de Jellyfin for Kodi forums met uw Kodi log."
 
 msgctxt "#33129"
-msgid "You can sync libraries by launching the Emby add-on > Add libraries."
+msgid "You can sync libraries by launching the Jellyfin add-on > Add libraries."
 msgstr ""
-"U kunt bibliotheken synchroniseren door de Emby add-on > bibliotheken "
+"U kunt bibliotheken synchroniseren door de Jellyfin add-on > bibliotheken "
 "toevoegen te starten."
 
 msgctxt "#33130"
@@ -829,21 +829,21 @@ msgstr "Bibliotheek wordt verwijderen"
 
 msgctxt "#33145"
 msgid ""
-"Please make sure your Samba (smb) share of your Emby server is accessible to"
+"Please make sure your Samba (smb) share of your Jellyfin server is accessible to"
 " your Kodi installation and that you have path substitution configured on "
 "your server. Otherwise, Kodi may fail to locate your files."
 msgstr ""
-"Controleer of uw Samba (smb) gedeelde map van uw Emby server toegankelijk is"
+"Controleer of uw Samba (smb) gedeelde map van uw Jellyfin server toegankelijk is"
 " voor uw Kodi installatie en dat path substitution op uw server is "
 "ingesteld. anders kan voorkomen dat het Kodi mislukt uw bestanden te vinden."
 
 msgctxt "#33146"
-msgid "Unable to connect to Emby."
-msgstr "Niet in staat om met Emby te verbinden."
+msgid "Unable to connect to Jellyfin."
+msgstr "Niet in staat om met Jellyfin te verbinden."
 
 msgctxt "#33147"
-msgid "Your access to Emby is restricted."
-msgstr "Uw toegang tot Emby is beperkt."
+msgid "Your access to Jellyfin is restricted."
+msgstr "Uw toegang tot Jellyfin is beperkt."
 
 msgctxt "#33148"
 msgid "Your access to this server is restricted."
@@ -872,8 +872,8 @@ msgid "Unable to locate TV Tunes in Kodi."
 msgstr "Niet in staat om TV Tunes in Kodi te vinden."
 
 msgctxt "#33153"
-msgid "Your Emby theme media has been synced to Kodi"
-msgstr "Uw Emby thema media is gesynchroniseerd met Kodi"
+msgid "Your Jellyfin theme media has been synced to Kodi"
+msgstr "Uw Jellyfin thema media is gesynchroniseerd met Kodi"
 
 msgctxt "#33154"
 msgid "Add libraries"
@@ -881,12 +881,12 @@ msgstr "Bibliotheken toevoegen"
 
 msgctxt "#33155"
 msgid ""
-"The currently applied patch for Emby for Kodi is corrupted! Please post to "
-"the Emby for Kodi forums if this issue persists. This will need to be fixed "
+"The currently applied patch for Jellyfin for Kodi is corrupted! Please post to "
+"the Jellyfin for Kodi forums if this issue persists. This will need to be fixed "
 "as soon as possible."
 msgstr ""
-"De huidige toegepaste patch voor Emby is beschadigd! Maak alstublieft een "
-"melding op de Emby voor Kodi forums als het probleem blijft. Dit moet yo "
+"De huidige toegepaste patch voor Jellyfin is beschadigd! Maak alstublieft een "
+"melding op de Jellyfin voor Kodi forums als het probleem blijft. Dit moet yo "
 "snel als mogelijk verholpen worden."
 
 msgctxt "#33156"
@@ -906,8 +906,8 @@ msgid "Enable audio/subtitles selection"
 msgstr "Schaken audio/ondertitel keuze in"
 
 msgctxt "#33160"
-msgid "To avoid errors, please update Emby for Kodi to version: "
-msgstr "Om problemen voorkomen, update Emby for Kodi naar versie:"
+msgid "To avoid errors, please update Jellyfin for Kodi to version: "
+msgstr "Om problemen voorkomen, update Jellyfin for Kodi naar versie:"
 
 msgctxt "#33161"
 msgid "Check for updates"
@@ -958,11 +958,11 @@ msgctxt "#33172"
 msgid ""
 "You have {number} updates pending. This may take a little while before "
 "seeing new content. It might be faster to update your libraries via "
-"launching the Emby add-on > update libraries. Proceed anyway?"
+"launching the Jellyfin add-on > update libraries. Proceed anyway?"
 msgstr ""
 "U heeft {number} wachtende updates. Het kan misschien even during voordat u "
 "nieuwe inhoud ziet. Misschien gaat het updaten van uw bibliotheken sneller "
-"door de Emby add-on bibliotheken updaten te starten. Toch doorgaan?"
+"door de Jellyfin add-on bibliotheken updaten te starten. Toch doorgaan?"
 
 msgctxt "#33173"
 msgid "Forget about the previous sync? This is not recommended."
@@ -974,10 +974,10 @@ msgstr "Paging - download threads (standaard: 3)"
 
 msgctxt "#33175"
 msgid ""
-"Paging tip: Each download thread requests your max items value from Emby at "
+"Paging tip: Each download thread requests your max items value from Jellyfin at "
 "the same time."
 msgstr ""
-"Paging tip: Elke download thread vraagt naar uw maximum items waarde by Emby"
+"Paging tip: Elke download thread vraagt naar uw maximum items waarde by Jellyfin"
 " op hetzelfde moment."
 
 msgctxt "#33176"
@@ -999,8 +999,8 @@ msgid "Force transcode"
 msgstr "Transkodering dwingen"
 
 msgctxt "#33180"
-msgid "Restart Emby for Kodi"
-msgstr "Emby for Kodi opnieuw starten"
+msgid "Restart Jellyfin for Kodi"
+msgstr "Jellyfin for Kodi opnieuw starten"
 
 msgctxt "#33181"
 msgid "Restarting to apply the patch"
@@ -1039,12 +1039,12 @@ msgid "Would you like to sync Rotten Tomatoes ratings?"
 msgstr "Rotten Tomatoes ratings synchroniseren?"
 
 msgctxt "#33191"
-msgid "Restart Emby for Kodi to apply this change?"
-msgstr "Emby for Kodi opnieuw opstarten om de wijziging toe te passen?"
+msgid "Restart Jellyfin for Kodi to apply this change?"
+msgstr "Jellyfin for Kodi opnieuw opstarten om de wijziging toe te passen?"
 
 msgctxt "#33192"
-msgid "Restart Emby for Kodi"
-msgstr "Emby for Kodi opnieuw starten"
+msgid "Restart Jellyfin for Kodi"
+msgstr "Jellyfin for Kodi opnieuw starten"
 
 msgctxt "#33193"
 msgid "Restarting..."
@@ -1055,8 +1055,8 @@ msgid "Manage libraries"
 msgstr "Bibliotheken beheren"
 
 msgctxt "#33195"
-msgid "Enable Emby for Kodi"
-msgstr "Emby for Kodi inschakelen"
+msgid "Enable Jellyfin for Kodi"
+msgstr "Jellyfin for Kodi inschakelen"
 
 msgctxt "#33196"
 msgid "Advanced options"
diff --git a/resources/language/resource.language.pl_pl/strings.po b/resources/language/resource.language.pl_pl/strings.po
index 8170e3e2..314f76ef 100644
--- a/resources/language/resource.language.pl_pl/strings.po
+++ b/resources/language/resource.language.pl_pl/strings.po
@@ -1,5 +1,5 @@
-# Emby for Kodi language file
-# Addon Name: Emby for Kodi
+# Jellyfin for Kodi language file
+# Addon Name: Jellyfin for Kodi
 # Addon id: plugin.video.jellyfin
 # Addon Provider: angelblue05
 # Translators:
@@ -7,7 +7,7 @@
 # 
 msgid ""
 msgstr ""
-"Project-Id-Version: Emby for Kodi\n"
+"Project-Id-Version: Jellyfin for Kodi\n"
 "POT-Creation-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "PO-Revision-Date: 2018-09-07 20:10+0000\n"
 "Last-Translator: Michał Sawicz <michal@sawicz.net>, 2019\n"
@@ -19,8 +19,8 @@ msgstr ""
 "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
 
 msgctxt "#29999"
-msgid "Emby for Kodi"
-msgstr "Emby dla Kodi"
+msgid "Jellyfin for Kodi"
+msgstr "Jellyfin dla Kodi"
 
 msgctxt "#30000"
 msgid "Server address"
@@ -191,12 +191,12 @@ msgid "TV Shows"
 msgstr "Seriale"
 
 msgctxt "#30401"
-msgid "Emby options"
-msgstr "Opcje Emby"
+msgid "Jellyfin options"
+msgstr "Opcje Jellyfin"
 
 msgctxt "#30402"
-msgid "Emby transcode"
-msgstr "Transkodowanie Emby"
+msgid "Jellyfin transcode"
+msgstr "Transkodowanie Jellyfin"
 
 msgctxt "#30405"
 msgid "Add to favorites"
@@ -211,8 +211,8 @@ msgid "Settings"
 msgstr "Ustawienia"
 
 msgctxt "#30409"
-msgid "Delete from Emby"
-msgstr "Usuń z Emby"
+msgid "Delete from Jellyfin"
+msgstr "Usuń z Jellyfin"
 
 msgctxt "#30410"
 msgid "Refresh this item"
@@ -351,8 +351,8 @@ msgid "Display message"
 msgstr "Wyświetl wiadomość"
 
 msgctxt "#30600"
-msgid "Sign in with Emby Connect"
-msgstr "Zaloguj z Emby Connect"
+msgid "Sign in with Jellyfin Connect"
+msgstr "Zaloguj z Jellyfin Connect"
 
 msgctxt "#30602"
 msgid "Password"
@@ -391,8 +391,8 @@ msgid "Please sign in"
 msgstr "Proszę się zalogować"
 
 msgctxt "#30613"
-msgid "Change Emby Connect user"
-msgstr "Zmień użytkownika Emby Connect"
+msgid "Change Jellyfin Connect user"
+msgstr "Zmień użytkownika Jellyfin Connect"
 
 msgctxt "#30614"
 msgid "Connect to server"
@@ -411,8 +411,8 @@ msgid "Server or port cannot be empty"
 msgstr "Nazwa hosta i port nie mogą być puste"
 
 msgctxt "#30618"
-msgid "Change Emby Connect user"
-msgstr "Zmień użytkownika Emby Connect"
+msgid "Change Jellyfin Connect user"
+msgstr "Zmień użytkownika Jellyfin Connect"
 
 msgctxt "#33000"
 msgid "Welcome"
@@ -435,8 +435,8 @@ msgid "Choose the subtitles stream"
 msgstr "Wybierz napisy"
 
 msgctxt "#33015"
-msgid "Delete file from Emby?"
-msgstr "Usunąć plik z Emby?"
+msgid "Delete file from Jellyfin?"
+msgstr "Usunąć plik z Jellyfin?"
 
 msgctxt "#33016"
 msgid "Play trailers?"
@@ -452,16 +452,16 @@ msgstr "Pobieranie:"
 
 msgctxt "#33022"
 msgid ""
-"Detected the database needs to be recreated for this version of Emby for "
+"Detected the database needs to be recreated for this version of Jellyfin for "
 "Kodi. Proceed?"
 msgstr ""
-"Wykryto konieczność rekonstrukcji bazy dla tej wersji Emby dla Kodi. "
+"Wykryto konieczność rekonstrukcji bazy dla tej wersji Jellyfin dla Kodi. "
 "Kontynuować?"
 
 msgctxt "#33023"
-msgid "Emby for Kodi will not work correctly until the database is reset."
+msgid "Jellyfin for Kodi will not work correctly until the database is reset."
 msgstr ""
-"Emby dla Kodi nie będzie działało poprawnie dopóki baza nie zostanie "
+"Jellyfin dla Kodi nie będzie działało poprawnie dopóki baza nie zostanie "
 "zresetowana."
 
 msgctxt "#33025"
@@ -476,11 +476,11 @@ msgstr ""
 
 msgctxt "#33035"
 msgid ""
-"Caution! If you choose Native mode, certain Emby features will be missing, "
-"such as: Emby cinema mode, direct stream/transcode options and parental "
+"Caution! If you choose Native mode, certain Jellyfin features will be missing, "
+"such as: Jellyfin cinema mode, direct stream/transcode options and parental "
 "access schedule."
 msgstr ""
-"Uwaga! Jeśli wybierzesz tryb Natywny, niektóre funkcje Emby będą "
+"Uwaga! Jeśli wybierzesz tryb Natywny, niektóre funkcje Jellyfin będą "
 "niedostępne, np.: tryb kinowy, opcje strumieniowania bezpośredniego i "
 "transkodowania, harmonogram ograniczeń wiekowych."
 
@@ -503,11 +503,11 @@ msgstr "Kodi nie odnalazł pliku:"
 msgctxt "#33048"
 msgid ""
 "You may need to verify your network credentials in the add-on settings or "
-"use the Emby path substitution to format your path correctly (Emby dashboard"
+"use the Jellyfin path substitution to format your path correctly (Jellyfin dashboard"
 " > library). Stop syncing?"
 msgstr ""
 "Być może należy sprawdzić dane logowania w sieci w ustawieniach dodatku lub "
-"format podstawienia ścieżki w Emby (Kokpit Emby > Biblioteki). Zatrzymać "
+"format podstawienia ścieżki w Jellyfin (Kokpit Jellyfin > Biblioteki). Zatrzymać "
 "synchronizację?"
 
 msgctxt "#33049"
@@ -551,8 +551,8 @@ msgid "Remove all cached artwork?"
 msgstr "Usunąć pobrane grafiki?"
 
 msgctxt "#33087"
-msgid "Reset all Emby add-on settings?"
-msgstr "Zresetować wszystkie ustawienia dodatku Emby?"
+msgid "Reset all Jellyfin add-on settings?"
+msgstr "Zresetować wszystkie ustawienia dodatku Jellyfin?"
 
 msgctxt "#33088"
 msgid ""
@@ -584,10 +584,10 @@ msgstr "Folder kopii zapasowej"
 msgctxt "#33097"
 msgid ""
 "Important, cleanonupdate was removed in your advanced settings to prevent "
-"conflict with Emby for Kodi. Kodi will restart now."
+"conflict with Jellyfin for Kodi. Kodi will restart now."
 msgstr ""
 "Ważne: \"cleanonupdate\" zostało usunięte z ustawień zaawansowanych aby "
-"zapobiec konfliktowi z Emby dla Kodi. Kodi zostanie uruchomione ponownie."
+"zapobiec konfliktowi z Jellyfin dla Kodi. Kodi zostanie uruchomione ponownie."
 
 msgctxt "#33098"
 msgid "Refresh boxsets"
@@ -595,11 +595,11 @@ msgstr "Odśwież kolekcje"
 
 msgctxt "#33099"
 msgid ""
-"Install the server plugin Kodi companion to automatically apply emby library"
+"Install the server plugin Kodi companion to automatically apply Jellyfin library"
 " updates at startup. This setting can be found in the add-on settings > sync"
 " options > Enable Kodi Companion."
 msgstr ""
-"Zainstaluj wtyczkę serwera Emby \"Kodi Companion\" by automatycznie pobierać"
+"Zainstaluj wtyczkę serwera Jellyfin \"Kodi Companion\" by automatycznie pobierać"
 " aktualizacje bazy danych. Właściwa opcja znajduje się w ustawieniach "
 "dodatku > Synchronizacja > Włącz Kodi Companion."
 
@@ -700,12 +700,12 @@ msgstr ""
 msgctxt "#33119"
 msgid ""
 "Something went wrong during the sync. You'll be able to restore progress "
-"when restarting Kodi. If the problem persists, please report on the Emby for"
+"when restarting Kodi. If the problem persists, please report on the Jellyfin for"
 " Kodi forums, with your Kodi log."
 msgstr ""
 "Coś poszło nie tak podczas synchronizacji. Po uruchomieniu Kodi ponownie "
 "będzie możliwe jej wznowienie. Jeśli problem się powtórzy, proszę zgłoś go "
-"na forum Emby for Kodi, dołączając dziennik zdarzeń Kodi."
+"na forum Jellyfin for Kodi, dołączając dziennik zdarzeń Kodi."
 
 msgctxt "#33120"
 msgid "Select the libraries to add"
@@ -729,10 +729,10 @@ msgstr "Pobieraj twórców (wolne)"
 
 msgctxt "#33125"
 msgid ""
-"Choose the Emby views to sync to Kodi. You can optionally sync libraries at "
+"Choose the Jellyfin views to sync to Kodi. You can optionally sync libraries at "
 "a later time."
 msgstr ""
-"Wybierz biblioteki Emby do synchronizacji z Kodi. Możesz to także zrobić "
+"Wybierz biblioteki Jellyfin do synchronizacji z Kodi. Możesz to także zrobić "
 "później."
 
 msgctxt "#33126"
@@ -747,16 +747,16 @@ msgctxt "#33128"
 msgid ""
 "Failed to retrieve latest content updates. No content updates will be "
 "applied until Kodi is restarted. If this issue persists, please report on "
-"the Emby for Kodi forums, with your Kodi log."
+"the Jellyfin for Kodi forums, with your Kodi log."
 msgstr ""
 "Nie udało się pobrać ostatnich aktualizacji. Nie zostaną one zapisane dopóki"
 " Kodi nie zostanie zrestartowane. Jeśli problem się powtórzy, proszę zgłoś "
-"go na forum Emby for Kodi, dołączając dziennik zdarzeń Kodi."
+"go na forum Jellyfin for Kodi, dołączając dziennik zdarzeń Kodi."
 
 msgctxt "#33129"
-msgid "You can sync libraries by launching the Emby add-on > Add libraries."
+msgid "You can sync libraries by launching the Jellyfin add-on > Add libraries."
 msgstr ""
-"Możesz zsynchronizować biblioteki wybierając dodatek Emby > Dodaj biblioteki"
+"Możesz zsynchronizować biblioteki wybierając dodatek Jellyfin > Dodaj biblioteki"
 
 msgctxt "#33130"
 msgid "Select the source"
@@ -797,7 +797,7 @@ msgid ""
 "remove content, you'll need to repair the library."
 msgstr ""
 "Możesz ręcznie aktualizować bibliotekę zamiast polegać na wtyczce serwera "
-"Kodi Companion. Wybierz \"Zaktualizuj biblioteki\" w dodatku Emby. Aby "
+"Kodi Companion. Wybierz \"Zaktualizuj biblioteki\" w dodatku Jellyfin. Aby "
 "usunąć zawartość, należy naprawić biblioteki."
 
 msgctxt "#33139"
@@ -826,21 +826,21 @@ msgstr "Usuwanie biblioteki"
 
 msgctxt "#33145"
 msgid ""
-"Please make sure your Samba (smb) share of your Emby server is accessible to"
+"Please make sure your Samba (smb) share of your Jellyfin server is accessible to"
 " your Kodi installation and that you have path substitution configured on "
 "your server. Otherwise, Kodi may fail to locate your files."
 msgstr ""
-"Upewnij się, że udział Samba (smb) twojego serwera Emby jest dostępny dla "
+"Upewnij się, że udział Samba (smb) twojego serwera Jellyfin jest dostępny dla "
 "tej instalacji Kodi i udostępniony folder sieciowy jest skonfigurowany na "
 "serwerze. W przeciwnym razie Kodi może nie odnaleźć twoich plików."
 
 msgctxt "#33146"
-msgid "Unable to connect to Emby."
-msgstr "Błąd połączenia z Emby"
+msgid "Unable to connect to Jellyfin."
+msgstr "Błąd połączenia z Jellyfin"
 
 msgctxt "#33147"
-msgid "Your access to Emby is restricted."
-msgstr "Dostęp do Emby jest ograniczony."
+msgid "Your access to Jellyfin is restricted."
+msgstr "Dostęp do Jellyfin jest ograniczony."
 
 msgctxt "#33148"
 msgid "Your access to this server is restricted."
@@ -868,7 +868,7 @@ msgid "Unable to locate TV Tunes in Kodi."
 msgstr "Nie znaleziono TV Tunes w Kodi."
 
 msgctxt "#33153"
-msgid "Your Emby theme media has been synced to Kodi"
+msgid "Your Jellyfin theme media has been synced to Kodi"
 msgstr "Media przewodnie zostały zsynchronizowane z Kodi"
 
 msgctxt "#33154"
@@ -877,12 +877,12 @@ msgstr "Dodaj biblioteki"
 
 msgctxt "#33155"
 msgid ""
-"The currently applied patch for Emby for Kodi is corrupted! Please post to "
-"the Emby for Kodi forums if this issue persists. This will need to be fixed "
+"The currently applied patch for Jellyfin for Kodi is corrupted! Please post to "
+"the Jellyfin for Kodi forums if this issue persists. This will need to be fixed "
 "as soon as possible."
 msgstr ""
-"Zainstalowana poprawka Emby dla Kodi jest uszkodzona! Proszę zgłoś ten błąd "
-"na forum Emby for Kodi jeśli problem się powtórzy. Konieczna jest szybka "
+"Zainstalowana poprawka Jellyfin dla Kodi jest uszkodzona! Proszę zgłoś ten błąd "
+"na forum Jellyfin for Kodi jeśli problem się powtórzy. Konieczna jest szybka "
 "aktualizacja."
 
 msgctxt "#33156"
@@ -902,8 +902,8 @@ msgid "Enable audio/subtitles selection"
 msgstr "Włącz wybór ścieżki dźwiękowej/napisów"
 
 msgctxt "#33160"
-msgid "To avoid errors, please update Emby for Kodi to version: "
-msgstr "Aby uniknąć błędów, należy zaktualizować Emby dla Kodi do wersji:"
+msgid "To avoid errors, please update Jellyfin for Kodi to version: "
+msgstr "Aby uniknąć błędów, należy zaktualizować Jellyfin dla Kodi do wersji:"
 
 msgctxt "#33161"
 msgid "Check for updates"
@@ -954,10 +954,10 @@ msgctxt "#33172"
 msgid ""
 "You have {number} updates pending. This may take a little while before "
 "seeing new content. It might be faster to update your libraries via "
-"launching the Emby add-on > update libraries. Proceed anyway?"
+"launching the Jellyfin add-on > update libraries. Proceed anyway?"
 msgstr ""
 "Do pobrania jest {number} aktualizacji. To może trochę potrwać. Szybszą "
-"opcją może być pełna aktualizacja w dodatku Emby > Aktualizuj biblioteki. "
+"opcją może być pełna aktualizacja w dodatku Jellyfin > Aktualizuj biblioteki. "
 "Kontynuować mimo to?"
 
 msgctxt "#33173"
@@ -970,7 +970,7 @@ msgstr "Paginacja - wątki pobierania (domyślnie: 3)"
 
 msgctxt "#33175"
 msgid ""
-"Paging tip: Each download thread requests your max items value from Emby at "
+"Paging tip: Each download thread requests your max items value from Jellyfin at "
 "the same time."
 msgstr ""
 "Paginacja: każdy z wątków pobiera maksymalną ilość pozycji w tym samym "
@@ -993,8 +993,8 @@ msgid "Force transcode"
 msgstr "Wymuś transkodowanie"
 
 msgctxt "#33180"
-msgid "Restart Emby for Kodi"
-msgstr "Zrestartuj Emby dla Kodi"
+msgid "Restart Jellyfin for Kodi"
+msgstr "Zrestartuj Jellyfin dla Kodi"
 
 msgctxt "#33181"
 msgid "Restarting to apply the patch"
@@ -1034,12 +1034,12 @@ msgid "Would you like to sync Rotten Tomatoes ratings?"
 msgstr "Czy synchronizować ocenę z Rotten Tomatoes?"
 
 msgctxt "#33191"
-msgid "Restart Emby for Kodi to apply this change?"
-msgstr "Zrestartować Emby dla Kodi by zaaplikować tę zmianę?"
+msgid "Restart Jellyfin for Kodi to apply this change?"
+msgstr "Zrestartować Jellyfin dla Kodi by zaaplikować tę zmianę?"
 
 msgctxt "#33192"
-msgid "Restart Emby for Kodi"
-msgstr "Zrestartuj Emby dla Kodi"
+msgid "Restart Jellyfin for Kodi"
+msgstr "Zrestartuj Jellyfin dla Kodi"
 
 msgctxt "#33193"
 msgid "Restarting..."
@@ -1050,7 +1050,7 @@ msgid "Manage libraries"
 msgstr "Zarządzaj bibliotekami"
 
 msgctxt "#33195"
-msgid "Enable Emby for Kodi"
+msgid "Enable Jellyfin for Kodi"
 msgstr ""
 
 msgctxt "#33196"
diff --git a/resources/lib/client.py b/resources/lib/client.py
index 6c2b1a15..44a4f041 100644
--- a/resources/lib/client.py
+++ b/resources/lib/client.py
@@ -15,7 +15,7 @@ from helper.utils import create_id
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
@@ -71,13 +71,13 @@ def get_device_name():
 def get_device_id(reset=False):
 
     ''' Return the device_id if already loaded.
-        It will load from emby_guid file. If it's a fresh
+        It will load from jellyfin_guid file. If it's a fresh
         setup, it will generate a new GUID to uniquely
         identify the setup for all users.
 
-        window prop: emby_deviceId
+        window prop: jellyfin_deviceId
     '''
-    client_id = window('emby_deviceId')
+    client_id = window('jellyfin_deviceId')
 
     if client_id:
         return client_id
@@ -87,29 +87,29 @@ def get_device_id(reset=False):
     if not xbmcvfs.exists(directory):
         xbmcvfs.mkdir(directory)
 
-    emby_guid = os.path.join(directory, "emby_guid")
-    file_guid = xbmcvfs.File(emby_guid)
+    jellyfin_guid = os.path.join(directory, "jellyfin_guid")
+    file_guid = xbmcvfs.File(jellyfin_guid)
     client_id = file_guid.read()
 
     if not client_id or reset:
         LOG.info("Generating a new GUID.")
 
         client_id = str("%012X" % create_id())
-        file_guid = xbmcvfs.File(emby_guid, 'w')
+        file_guid = xbmcvfs.File(jellyfin_guid, 'w')
         file_guid.write(client_id)
 
     file_guid.close()
 
     LOG.info("DeviceId loaded: %s", client_id)
-    window('emby_deviceId', value=client_id)
+    window('jellyfin_deviceId', value=client_id)
 
     return client_id
 
 def reset_device_id():
 
-    window('emby_deviceId', clear=True)
+    window('jellyfin_deviceId', clear=True)
     get_device_id(True)
-    dialog("ok", heading="{emby}", line1=_(33033))
+    dialog("ok", heading="{jellyfin}", line1=_(33033))
     xbmc.executebuiltin('RestartApp')
 
 def get_info():
diff --git a/resources/lib/connect.py b/resources/lib/connect.py
index 86bee85d..c0525003 100644
--- a/resources/lib/connect.py
+++ b/resources/lib/connect.py
@@ -20,7 +20,7 @@ from emby.core.exceptions import HTTPException
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 XML_PATH = (xbmcaddon.Addon(addon_id()).getAddonInfo('path'), "default", "1080i")
 
 ##################################################################################################
@@ -78,11 +78,11 @@ class Connect(object):
 
     def get_client(self, server_id=None):
 
-        ''' Get Emby client.
+        ''' Get Jellyfin client.
         '''
         client = Emby(server_id)
         client['config/app']("Kodi", self.info['Version'], self.info['DeviceName'], self.info['DeviceId'])
-        client['config']['http.user_agent'] = "Emby-Kodi/%s" % self.info['Version']
+        client['config']['http.user_agent'] = "Jellyfin-Kodi/%s" % self.info['Version']
         client['config']['auth.ssl'] = self.get_ssl()
 
         return client
@@ -152,20 +152,20 @@ class Connect(object):
         settings('username', self.user['Name'])
 
         if 'PrimaryImageTag' in self.user:
-            window('EmbyUserImage', api.API(self.user, client['auth/server-address']).get_user_artwork(self.user['Id']))
+            window('JellyfinUserImage', api.API(self.user, client['auth/server-address']).get_user_artwork(self.user['Id']))
 
     def select_servers(self, state=None):
 
         state = state or self.connect_manager.connect({'enableAutoLogin': False})
         user = state.get('ConnectUser') or {}
 
-        dialog = ServerConnect("script-emby-connect-server.xml", *XML_PATH)
+        dialog = ServerConnect("script-jellyfin-connect-server.xml", *XML_PATH)
         dialog.set_args(**{
             'connect_manager': self.connect_manager,
             'username': user.get('DisplayName', ""),
             'user_image': user.get('ImageUrl'),
             'servers': state.get('Servers', []),
-            'emby_connect': False if user else True
+            'jellyfin_connect': False if user else True
         })
         dialog.doModal()
 
@@ -174,7 +174,7 @@ class Connect(object):
             return
 
         elif dialog.is_connect_login():
-            LOG.debug("Login with emby connect")
+            LOG.debug("Login with jellyfin connect")
             try:
                 self.login_connect()
             except RuntimeError: pass
@@ -209,7 +209,7 @@ class Connect(object):
 
         ''' Return server or raise error.
         '''
-        dialog = ServerManual("script-emby-connect-server-manual.xml", *XML_PATH)
+        dialog = ServerManual("script-jellyfin-connect-server-manual.xml", *XML_PATH)
         dialog.set_args(**{'connect_manager': manager or self.connect_manager})
         dialog.doModal()
 
@@ -220,7 +220,7 @@ class Connect(object):
 
     def setup_login_connect(self):
 
-        ''' Setup emby connect by itself.
+        ''' Setup jellyfin connect by itself.
         '''
         client = self.get_client()
         client.set_credentials(get_credentials())
@@ -238,7 +238,7 @@ class Connect(object):
 
         ''' Return connect user or raise error.
         '''
-        dialog = LoginConnect("script-emby-connect-login.xml", *XML_PATH)
+        dialog = LoginConnect("script-jellyfin-connect-login.xml", *XML_PATH)
         dialog.set_args(**{'connect_manager': manager or self.connect_manager})
         dialog.doModal()
 
@@ -258,7 +258,7 @@ class Connect(object):
             except RuntimeError:
                 raise RuntimeError("No user selected")
 
-        dialog = UsersConnect("script-emby-connect-users.xml", *XML_PATH)
+        dialog = UsersConnect("script-jellyfin-connect-users.xml", *XML_PATH)
         dialog.set_args(**{'server': server, 'users': users})
         dialog.doModal()
 
@@ -303,7 +303,7 @@ class Connect(object):
         
         ''' Return manual login user authenticated or raise error.
         '''
-        dialog = LoginManual("script-emby-connect-login-manual.xml", *XML_PATH)
+        dialog = LoginManual("script-jellyfin-connect-login-manual.xml", *XML_PATH)
         dialog.set_args(**{'connect_manager': manager or self.connect_manager, 'username': user or {}})
         dialog.doModal()
 
diff --git a/resources/lib/database/__init__.py b/resources/lib/database/__init__.py
index b6161cb8..3fb5e715 100644
--- a/resources/lib/database/__init__.py
+++ b/resources/lib/database/__init__.py
@@ -18,7 +18,7 @@ from objects import obj
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
@@ -26,7 +26,7 @@ LOG = logging.getLogger("EMBY."+__name__)
 class Database(object):
 
     ''' This should be called like a context.
-        i.e. with Database('emby') as db:
+        i.e. with Database('jellyfin') as db:
             db.cursor
             db.conn.commit()
     '''
@@ -36,7 +36,7 @@ class Database(object):
 
     def __init__(self, file=None, commit_close=True):
 
-        ''' file: emby, texture, music, video, :memory: or path to file
+        ''' file: jellyfin, texture, music, video, :memory: or path to file
         '''
         self.db_file = file or "video"
         self.commit_close = commit_close
@@ -50,14 +50,14 @@ class Database(object):
         self.conn = sqlite3.connect(self.path, timeout=self.timeout)
         self.cursor = self.conn.cursor()
 
-        if self.db_file in ('video', 'music', 'texture', 'emby'):
+        if self.db_file in ('video', 'music', 'texture', 'jellyfin'):
             self.conn.execute("PRAGMA journal_mode=WAL") # to avoid writing conflict with kodi
 
         LOG.debug("--->[ database: %s ] %s", self.db_file, id(self.conn))
 
-        if not window('emby_db_check.bool') and self.db_file == 'emby':
+        if not window('jellyfin_db_check.bool') and self.db_file == 'jellyfin':
 
-            window('emby_db_check.bool', True)
+            window('jellyfin_db_check.bool', True)
             emby_tables(self.cursor)
             self.conn.commit()
 
@@ -185,45 +185,45 @@ class Database(object):
 
 def emby_tables(cursor):
 
-    ''' Create the tables for the emby database.
-        emby, view, version
+    ''' Create the tables for the jellyfin database.
+        jellyfin, view, version
     '''
     cursor.execute(
-        """CREATE TABLE IF NOT EXISTS emby(
-        emby_id TEXT UNIQUE, media_folder TEXT, emby_type TEXT, media_type TEXT,
+        """CREATE TABLE IF NOT EXISTS jellyfin(
+        jellyfin_id TEXT UNIQUE, media_folder TEXT, jellyfin_type TEXT, media_type TEXT,
         kodi_id INTEGER, kodi_fileid INTEGER, kodi_pathid INTEGER, parent_id INTEGER,
-        checksum INTEGER, emby_parent_id TEXT)""")
+        checksum INTEGER, jellyfin_parent_id TEXT)""")
     cursor.execute(
         """CREATE TABLE IF NOT EXISTS view(
         view_id TEXT UNIQUE, view_name TEXT, media_type TEXT)""")
     cursor.execute("CREATE TABLE IF NOT EXISTS version(idVersion TEXT)")
 
-    columns = cursor.execute("SELECT * FROM emby")
-    if 'emby_parent_id' not in [description[0] for description in columns.description]:
+    columns = cursor.execute("SELECT * FROM jellyfin")
+    if 'jellyfin_parent_id' not in [description[0] for description in columns.description]:
         
-        LOG.info("Add missing column emby_parent_id")
-        cursor.execute("ALTER TABLE emby ADD COLUMN emby_parent_id 'TEXT'")
+        LOG.info("Add missing column jellyfin_parent_id")
+        cursor.execute("ALTER TABLE jellyfin ADD COLUMN jellyfin_parent_id 'TEXT'")
 
 def reset():
 
-    ''' Reset both the emby database and the kodi database.
+    ''' Reset both the jellyfin database and the kodi database.
     '''
     from views import Views
     views = Views()
 
-    if not dialog("yesno", heading="{emby}", line1=_(33074)):
+    if not dialog("yesno", heading="{jellyfin}", line1=_(33074)):
         return
 
-    window('emby_should_stop.bool', True)
+    window('jellyfin_should_stop.bool', True)
     count = 10
 
-    while window('emby_sync.bool'):
+    while window('jellyfin_sync.bool'):
 
         LOG.info("Sync is running...")
         count -= 1
 
         if not count:
-            dialog("ok", heading="{emby}", line1=_(33085))
+            dialog("ok", heading="{jellyfin}", line1=_(33085))
 
             return
 
@@ -235,12 +235,12 @@ def reset():
     views.delete_playlists()
     views.delete_nodes()
 
-    if dialog("yesno", heading="{emby}", line1=_(33086)):
+    if dialog("yesno", heading="{jellyfin}", line1=_(33086)):
         reset_artwork()
 
     addon_data = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
 
-    if dialog("yesno", heading="{emby}", line1=_(33087)):
+    if dialog("yesno", heading="{jellyfin}", line1=_(33087)):
 
         xbmcvfs.delete(os.path.join(addon_data, "settings.xml"))
         xbmcvfs.delete(os.path.join(addon_data, "data.json"))
@@ -253,7 +253,7 @@ def reset():
     settings('MinimumSetup', "")
     settings('MusicRescan.bool', False)
     settings('SyncInstallRunDone.bool', False)
-    dialog("ok", heading="{emby}", line1=_(33088))
+    dialog("ok", heading="{jellyfin}", line1=_(33088))
     xbmc.executebuiltin('RestartApp')
 
 def reset_kodi():
@@ -267,7 +267,7 @@ def reset_kodi():
             if name != 'version':
                 videodb.cursor.execute("DELETE FROM " + name)
 
-    if settings('enableMusic.bool') or dialog("yesno", heading="{emby}", line1=_(33162)):
+    if settings('enableMusic.bool') or dialog("yesno", heading="{jellyfin}", line1=_(33162)):
 
         with Database('music') as musicdb:
             musicdb.cursor.execute("SELECT tbl_name FROM sqlite_master WHERE type='table'")
@@ -282,7 +282,7 @@ def reset_kodi():
 
 def reset_emby():
     
-    with Database('emby') as embydb:    
+    with Database('jellyfin') as embydb:    
         embydb.cursor.execute("SELECT tbl_name FROM sqlite_master WHERE type='table'")
 
         for table in embydb.cursor.fetchall():
@@ -291,11 +291,11 @@ def reset_emby():
             if name not in ('version', 'view'):
                 embydb.cursor.execute("DELETE FROM " + name)
 
-            embydb.cursor.execute("DROP table IF EXISTS emby")
+            embydb.cursor.execute("DROP table IF EXISTS jellyfin")
             embydb.cursor.execute("DROP table IF EXISTS view")
             embydb.cursor.execute("DROP table IF EXISTS version")
 
-    LOG.warn("[ reset emby ]")
+    LOG.warn("[ reset jellyfin ]")
 
 def reset_artwork():
 
@@ -382,7 +382,6 @@ def get_credentials():
     return credentials
 
 def save_credentials(credentials):
-
     credentials = credentials or {}
     path = xbmc.translatePath("special://profile/addon_data/plugin.video.jellyfin/").decode('utf-8')
     
@@ -394,13 +393,13 @@ def save_credentials(credentials):
 
 def get_item(kodi_id, media):
 
-    ''' Get emby item based on kodi id and media.
+    ''' Get jellyfin item based on kodi id and media.
     '''
-    with Database('emby') as embydb:
+    with Database('jellyfin') as jellyfindb:
         item = emby_db.EmbyDatabase(embydb.cursor).get_full_item_by_kodi_id(kodi_id, media)
 
         if not item:
-            LOG.debug("Not an emby item")
+            LOG.debug("Not an jellyfin item")
 
             return
 
diff --git a/resources/lib/database/emby_db.py b/resources/lib/database/emby_db.py
index dc3cc744..88c5f260 100644
--- a/resources/lib/database/emby_db.py
+++ b/resources/lib/database/emby_db.py
@@ -8,7 +8,7 @@ import queries as QU
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
diff --git a/resources/lib/database/queries.py b/resources/lib/database/queries.py
index e03a8f0f..00d032df 100644
--- a/resources/lib/database/queries.py
+++ b/resources/lib/database/queries.py
@@ -1,8 +1,8 @@
 
 get_item =              """ SELECT  kodi_id, kodi_fileid, kodi_pathid, parent_id, media_type, 
-						            emby_type, media_folder, emby_parent_id  
-				            FROM	emby 
-				            WHERE 	emby_id = ? 
+						            jellyfin_type, media_folder, jellyfin_parent_id  
+				            FROM	jellyfin 
+				            WHERE 	jellyfin_id = ? 
 			            """
 get_item_obj =              [   "{Id}"
                             ]
@@ -10,20 +10,20 @@ get_item_series_obj =       [   "{SeriesId}"
                             ]
 get_item_song_obj =         [   "{SongAlbumId}"
                             ]
-get_item_id_by_parent =	""" SELECT 	emby_id, kodi_id 
-							FROM 	emby 
+get_item_id_by_parent =	""" SELECT 	jellyfin_id, kodi_id 
+							FROM 	jellyfin 
 							WHERE 	parent_id = ? 
 							AND 	media_type = ? 
 						"""
 get_item_id_by_parent_boxset_obj =  [   "{SetId}","movie"
                                     ]
-get_item_by_parent =    """ SELECT  emby_id, kodi_id, kodi_fileid
-                            FROM    emby 
+get_item_by_parent =    """ SELECT  jellyfin_id, kodi_id, kodi_fileid
+                            FROM    jellyfin 
                             WHERE   parent_id = ? 
                             AND     media_type = ? 
                         """
-get_item_by_media_folder =  """ SELECT  emby_id, emby_type 
-                                FROM    emby 
+get_item_by_media_folder =  """ SELECT  jellyfin_id, jellyfin_type 
+                                FROM    jellyfin 
                                 WHERE   media_folder = ? 
                             """
 get_item_by_parent_movie_obj =  [   "{KodiId}","movie"
@@ -39,31 +39,31 @@ get_item_by_parent_album_obj =  [   "{ParentId}","album"
 get_item_by_parent_song_obj =   [   "{ParentId}","song"
                                 ]
 get_item_by_wild =      """	SELECT 	kodi_id, media_type 
-							FROM 	emby 
-							WHERE 	emby_id LIKE ? 
+							FROM 	jellyfin 
+							WHERE 	jellyfin_id LIKE ? 
 						"""
 get_item_by_wild_obj =          [   "{Id}"
                                 ]
-get_item_by_kodi =	    """	SELECT 	emby_id, parent_id, media_folder, emby_type, checksum 
-							FROM 	emby 
+get_item_by_kodi =	    """	SELECT 	jellyfin_id, parent_id, media_folder, jellyfin_type, checksum 
+							FROM 	jellyfin 
 							WHERE 	kodi_id = ? 
 							AND 	media_type = ? 
 						"""
-get_checksum =	     	"""	SELECT 	emby_id, checksum 
-							FROM 	emby 
-							WHERE 	emby_type = ? 
+get_checksum =	     	"""	SELECT 	jellyfin_id, checksum 
+							FROM 	jellyfin 
+							WHERE 	jellyfin_type = ? 
 						"""
 get_view_name =         """ SELECT  view_name 
                             FROM    view 
                             WHERE   view_id = ? 
                         """
-get_media_by_id =       """ SELECT  emby_type 
-                            FROM    emby 
-                            WHERE   emby_id = ? 
+get_media_by_id =       """ SELECT  jellyfin_type 
+                            FROM    jellyfin 
+                            WHERE   jellyfin_id = ? 
                         """
-get_media_by_parent_id =    """ SELECT  emby_id, emby_type, kodi_id, kodi_fileid  
-                                FROM    emby 
-                                WHERE   emby_parent_id = ?
+get_media_by_parent_id =    """ SELECT  jellyfin_id, jellyfin_type, kodi_id, kodi_fileid  
+                                FROM    jellyfin 
+                                WHERE   jellyfin_parent_id = ?
                             """
 get_view =              """ SELECT  view_name, media_type 
                             FROM    view 
@@ -76,8 +76,8 @@ get_views_by_media =    """ SELECT  *
                             FROM    view 
                             WHERE   media_type = ? 
                         """
-get_items_by_media =    """ SELECT  emby_id 
-                            FROM    emby 
+get_items_by_media =    """ SELECT  jellyfin_id 
+                            FROM    jellyfin 
                             WHERE   media_type = ?
                         """
 get_version =           """ SELECT  idVersion 
@@ -86,36 +86,36 @@ get_version =           """ SELECT  idVersion
 
 
 
-add_reference =	        """	INSERT OR REPLACE INTO	emby(emby_id, kodi_id, kodi_fileid, kodi_pathid, emby_type, 
-														 media_type, parent_id, checksum, media_folder, emby_parent_id) 
+add_reference =	        """	INSERT OR REPLACE INTO	jellyfin(jellyfin_id, kodi_id, kodi_fileid, kodi_pathid, jellyfin_type, 
+														 media_type, parent_id, checksum, media_folder, jellyfin_parent_id) 
                 			VALUES 					(?, ?, ?, ?, ?, ?, ?, ?, ?, ?) 
                 		"""
 add_reference_movie_obj =   [   "{Id}","{MovieId}","{FileId}","{PathId}","Movie","movie", None,"{Checksum}","{LibraryId}",
-                                "{EmbyParentId}"
+                                "{JellyfinParentId}"
                             ]
 add_reference_boxset_obj =  [   "{Id}","{SetId}",None,None,"BoxSet","set",None,"{Checksum}",None,None
                             ]
 add_reference_tvshow_obj =  [   "{Id}","{ShowId}",None,"{PathId}","Series","tvshow",None,"{Checksum}","{LibraryId}",
-                                "{EmbyParentId}"
+                                "{JellyfinParentId}"
                             ]
 add_reference_season_obj =  [   "{Id}","{SeasonId}",None,None,"Season","season","{ShowId}",None,None,None
                             ]
 add_reference_pool_obj =    [   "{SeriesId}","{ShowId}",None,"{PathId}","Series","tvshow",None,"{Checksum}","{LibraryId}",None
                             ]
 add_reference_episode_obj = [   "{Id}","{EpisodeId}","{FileId}","{PathId}","Episode","episode","{SeasonId}","{Checksum}",
-                                None,"{EmbyParentId}"
+                                None,"{JellyfinParentId}"
                             ]
 add_reference_mvideo_obj =  [   "{Id}","{MvideoId}","{FileId}","{PathId}","MusicVideo","musicvideo",None,"{Checksum}",
-                                "{LibraryId}","{EmbyParentId}"
+                                "{LibraryId}","{JellyfinParentId}"
                             ]
 add_reference_artist_obj =  [   "{Id}","{ArtistId}",None,None,"{ArtistType}","artist",None,"{Checksum}","{LibraryId}",
-                                "{EmbyParentId}"
+                                "{JellyfinParentId}"
                             ]
-add_reference_album_obj =   [   "{Id}","{AlbumId}",None,None,"MusicAlbum","album",None,"{Checksum}",None,"{EmbyParentId}"
+add_reference_album_obj =   [   "{Id}","{AlbumId}",None,None,"MusicAlbum","album",None,"{Checksum}",None,"{JellyfinParentId}"
                             ]
 add_reference_song_obj =    [   "{Id}","{SongId}",None,"{PathId}","Audio","song","{AlbumId}","{Checksum}",
-                                None,"{EmbyParentId}"
-                            ]
+                                None,"{JellyfinParentId}"
+                            ]  
 add_view =              """ INSERT OR REPLACE INTO  view(view_id, view_name, media_type)
                             VALUES                  (?, ?, ?)
                         """
@@ -124,15 +124,15 @@ add_version =           """ INSERT OR REPLACE INTO  version(idVersion)
                         """
 
 
-update_reference =      """	UPDATE 	emby 
+update_reference =      """	UPDATE 	jellyfin 
     						SET 	checksum = ? 
-    						WHERE 	emby_id = ?
+    						WHERE 	jellyfin_id = ?
     					"""
 update_reference_obj =      [   "{Checksum}", "{Id}"
                             ]
-update_parent =     	"""	UPDATE 	emby 
+update_parent =     	"""	UPDATE 	jellyfin 
     						SET 	parent_id = ? 
-    						WHERE 	emby_id = ? 
+    						WHERE 	jellyfin_id = ? 
     					"""
 update_parent_movie_obj =  [   "{SetId}","{Id}"
                             ]
@@ -142,12 +142,12 @@ update_parent_album_obj =   [   "{ArtistId}","{AlbumId}"]
 
 
 
-delete_item =		    """	DELETE FROM emby 
-    						WHERE 		emby_id = ? 
+delete_item =		    """	DELETE FROM jellyfin 
+    						WHERE 		jellyfin_id = ? 
     					"""
 delete_item_obj =           [   "{Id}"
                             ]
-delete_item_by_parent =	""" DELETE FROM	emby 
+delete_item_by_parent =	""" DELETE FROM	jellyfin 
     						WHERE 		parent_id = ? 
     						AND 		media_type = ?
     					"""
@@ -163,20 +163,20 @@ delete_item_by_parent_artist_obj =  [   "{ParentId}","artist"
                                     ]
 delete_item_by_parent_album_obj =   [   "{KodiId}","album"
                                     ]
-delete_item_by_kodi =	"""	DELETE FROM	emby 
+delete_item_by_kodi =	"""	DELETE FROM	jellyfin 
     						WHERE 		kodi_id = ? 
     						AND 		media_type = ?
     					"""
-delete_item_by_wild =	"""	DELETE FROM emby 
-    						WHERE 		emby_id LIKE ? 
+delete_item_by_wild =	"""	DELETE FROM jellyfin 
+    						WHERE 		jellyfin_id LIKE ? 
     					"""
 delete_view =           """ DELETE FROM view 
                             WHERE       view_id = ?
                         """
 delete_parent_boxset_obj = [    None, "{Movie}"
                            ]
-delete_media_by_parent_id = """ DELETE FROM emby 
-                                WHERE       emby_parent_id = ? 
+delete_media_by_parent_id = """ DELETE FROM jellyfin 
+                                WHERE       jellyfin_parent_id = ? 
                             """
 delete_version =        """ DELETE FROM version
                         """
diff --git a/resources/lib/dialogs/context.py b/resources/lib/dialogs/context.py
index 562809ac..9d1c2c2e 100644
--- a/resources/lib/dialogs/context.py
+++ b/resources/lib/dialogs/context.py
@@ -12,7 +12,7 @@ from helper import window, addon_id
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 ACTION_PARENT_DIR = 9
 ACTION_PREVIOUS_MENU = 10
 ACTION_BACK = 92
@@ -45,8 +45,8 @@ class ContextMenu(xbmcgui.WindowXMLDialog):
 
     def onInit(self):
 
-        if window('EmbyUserImage'):
-            self.getControl(USER_IMAGE).setImage(window('EmbyUserImage'))
+        if window('JellyfinUserImage'):
+            self.getControl(USER_IMAGE).setImage(window('JellyfinUserImage'))
 
         height = 479 + (len(self._options) * 55)
         LOG.info("options: %s", self._options)
diff --git a/resources/lib/dialogs/loginconnect.py b/resources/lib/dialogs/loginconnect.py
index ed490422..04ba48dc 100644
--- a/resources/lib/dialogs/loginconnect.py
+++ b/resources/lib/dialogs/loginconnect.py
@@ -12,7 +12,7 @@ from helper import _, addon_id, settings, dialog
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 ACTION_PARENT_DIR = 9
 ACTION_PREVIOUS_MENU = 10
 ACTION_BACK = 92
@@ -39,7 +39,7 @@ class LoginConnect(xbmcgui.WindowXMLDialog):
         xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
 
     def set_args(self, **kwargs):
-        # connect_manager, user_image, servers, emby_connect
+        # connect_manager, user_image, servers, jellyfin_connect
         for key, value in kwargs.iteritems():
             setattr(self, key, value)
 
@@ -70,7 +70,7 @@ class LoginConnect(xbmcgui.WindowXMLDialog):
     def onClick(self, control):
 
         if control == SIGN_IN:
-            # Sign in to emby connect
+            # Sign in to jellyfin connect
             self._disable_error()
 
             user = self.user_field.getText()
@@ -128,8 +128,8 @@ class LoginConnect(xbmcgui.WindowXMLDialog):
         settings('connectUsername', value=username)
         settings('idMethod', value="1")
 
-        dialog("notification", heading="{emby}", message="%s %s" % (_(33000), username.decode('utf-8')),
-               icon=result['User'].get('ImageUrl') or "{emby}",
+        dialog("notification", heading="{jellyfin}", message="%s %s" % (_(33000), username.decode('utf-8')),
+               icon=result['User'].get('ImageUrl') or "{jellyfin}",
                time=2000,
                sound=False)
 
diff --git a/resources/lib/dialogs/loginmanual.py b/resources/lib/dialogs/loginmanual.py
index 5c884628..2122089e 100644
--- a/resources/lib/dialogs/loginmanual.py
+++ b/resources/lib/dialogs/loginmanual.py
@@ -12,7 +12,7 @@ from helper import _, addon_id
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 ACTION_PARENT_DIR = 9
 ACTION_PREVIOUS_MENU = 10
 ACTION_BACK = 92
diff --git a/resources/lib/dialogs/resume.py b/resources/lib/dialogs/resume.py
index 9dfe8610..aeb0397f 100644
--- a/resources/lib/dialogs/resume.py
+++ b/resources/lib/dialogs/resume.py
@@ -10,7 +10,7 @@ import xbmcaddon
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 ACTION_PARENT_DIR = 9
 ACTION_PREVIOUS_MENU = 10
 ACTION_BACK = 92
diff --git a/resources/lib/dialogs/serverconnect.py b/resources/lib/dialogs/serverconnect.py
index 2b79c497..497abb51 100644
--- a/resources/lib/dialogs/serverconnect.py
+++ b/resources/lib/dialogs/serverconnect.py
@@ -12,7 +12,7 @@ from emby.core.connection_manager import CONNECTION_STATE
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 ACTION_PARENT_DIR = 9
 ACTION_PREVIOUS_MENU = 10
 ACTION_BACK = 92
@@ -45,7 +45,7 @@ class ServerConnect(xbmcgui.WindowXMLDialog):
         xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
 
     def set_args(self, **kwargs):
-        # connect_manager, user_image, servers, emby_connect
+        # connect_manager, user_image, servers, jellyfin_connect
         for key, value in kwargs.iteritems():
             setattr(self, key, value)
 
@@ -76,7 +76,7 @@ class ServerConnect(xbmcgui.WindowXMLDialog):
         if self.user_image is not None:
             self.getControl(USER_IMAGE).setImage(self.user_image)
 
-        if not self.emby_connect: # Change connect user
+        if not self.jellyfin_connect: # Change connect user
             self.getControl(EMBY_CONNECT).setLabel("[B]%s[/B]" % _(30618))
 
         if self.servers:
diff --git a/resources/lib/dialogs/servermanual.py b/resources/lib/dialogs/servermanual.py
index 45eebcf3..49d2413a 100644
--- a/resources/lib/dialogs/servermanual.py
+++ b/resources/lib/dialogs/servermanual.py
@@ -13,7 +13,7 @@ from emby.core.connection_manager import CONNECTION_STATE
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 ACTION_PARENT_DIR = 9
 ACTION_PREVIOUS_MENU = 10
 ACTION_BACK = 92
@@ -40,7 +40,7 @@ class ServerManual(xbmcgui.WindowXMLDialog):
         xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
 
     def set_args(self, **kwargs):
-        # connect_manager, user_image, servers, emby_connect
+        # connect_manager, user_image, servers, jellyfin_connect
         for key, value in kwargs.iteritems():
             setattr(self, key, value)
 
@@ -72,7 +72,7 @@ class ServerManual(xbmcgui.WindowXMLDialog):
     def onClick(self, control):
 
         if control == CONNECT:
-            # Sign in to emby connect
+            # Sign in to jellyfin connect
             self._disable_error()
 
             server = self.host_field.getText()
diff --git a/resources/lib/dialogs/usersconnect.py b/resources/lib/dialogs/usersconnect.py
index 5c4a55b0..a5fadda5 100644
--- a/resources/lib/dialogs/usersconnect.py
+++ b/resources/lib/dialogs/usersconnect.py
@@ -9,7 +9,7 @@ import xbmcgui
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 ACTION_PARENT_DIR = 9
 ACTION_PREVIOUS_MENU = 10
 ACTION_BACK = 92
@@ -34,7 +34,7 @@ class UsersConnect(xbmcgui.WindowXMLDialog):
         xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
 
     def set_args(self, **kwargs):
-        # connect_manager, user_image, servers, emby_connect
+        # connect_manager, user_image, servers, jellyfin_connect
         for key, value in kwargs.iteritems():
             setattr(self, key, value)
 
diff --git a/resources/lib/downloader.py b/resources/lib/downloader.py
index 6cc5c35c..f70218c0 100644
--- a/resources/lib/downloader.py
+++ b/resources/lib/downloader.py
@@ -22,9 +22,9 @@ from emby.core.exceptions import HTTPException
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 LIMIT = min(int(settings('limitIndex') or 50), 50)
-CACHE = xbmc.translatePath(os.path.join(xbmcaddon.Addon(id='plugin.video.jellyfin').getAddonInfo('profile').decode('utf-8'), 'emby')).decode('utf-8')
+CACHE = xbmc.translatePath(os.path.join(xbmcaddon.Addon(id='plugin.video.jellyfin').getAddonInfo('profile').decode('utf-8'), 'jellyfin')).decode('utf-8')
 
 #################################################################################################
 
@@ -317,7 +317,7 @@ class GetItemWorker(threading.Thread):
 
                 self.queue.task_done()
 
-                if window('emby_should_stop.bool'):
+                if window('jellyfin_should_stop.bool'):
                     break
 
 class TheVoid(object):
@@ -342,16 +342,16 @@ class TheVoid(object):
 
         while True:
 
-            response = window('emby_%s.json' % self.data['VoidName'])
+            response = window('jellyfin_%s.json' % self.data['VoidName'])
 
             if response != "":
 
-                LOG.debug("--<[ nostromo/emby_%s.json ]", self.data['VoidName'])
-                window('emby_%s' % self.data['VoidName'], clear=True)
+                LOG.debug("--<[ nostromo/jellyfin_%s.json ]", self.data['VoidName'])
+                window('jellyfin_%s' % self.data['VoidName'], clear=True)
 
                 return response
 
-            if window('emby_should_stop.bool'):
+            if window('jellyfin_should_stop.bool'):
                 LOG.info("Abandon mission! A black hole just swallowed [ %s/%s ]", self.method, self.data['VoidName'])
                 
                 return
diff --git a/resources/lib/emby/__init__.py b/resources/lib/emby/__init__.py
index cc9f4775..2112b5e2 100644
--- a/resources/lib/emby/__init__.py
+++ b/resources/lib/emby/__init__.py
@@ -14,13 +14,13 @@ class NullHandler(logging.Handler):
         print(self.format(record))
 
 loghandler = NullHandler
-LOG = logging.getLogger('Emby')
+LOG = logging.getLogger('Jellyfin')
 
 #################################################################################################
 
 def config(level=logging.INFO):
 
-    logger = logging.getLogger('Emby')
+    logger = logging.getLogger('Jellyfin')
     logger.addHandler(Emby.loghandler())
     logger.setLevel(level)
 
@@ -40,15 +40,15 @@ def ensure_client():
 
 class Emby(object):
 
-    ''' This is your Embyclient, you can create more than one. The server_id is only a temporary thing
-        to communicate with the EmbyClient().
+    ''' This is your Jellyfinclient, you can create more than one. The server_id is only a temporary thing
+        to communicate with the JellyfinClient().
 
-        from emby import Emby
+        from jellyfin import Jellyfin
 
-        Emby('123456')['config/app']
+        Jellyfin('123456')['config/app']
 
         # Permanent client reference
-        client = Emby('123456').get_client()
+        client = Jellyfin('123456').get_client()
         client['config/app']
     '''
 
@@ -68,9 +68,9 @@ class Emby(object):
     @classmethod
     def set_loghandler(cls, func=loghandler, level=logging.INFO):
 
-        for handler in logging.getLogger('Emby').handlers:
+        for handler in logging.getLogger('Jellyfin').handlers:
             if isinstance(handler, cls.loghandler):
-                logging.getLogger('Emby').removeHandler(handler)
+                logging.getLogger('Jellyfin').removeHandler(handler)
 
         cls.loghandler = func
         config(level)
@@ -83,7 +83,7 @@ class Emby(object):
         self.client[self.server_id].stop()
         self.client.pop(self.server_id, None)
 
-        LOG.info("---[ STOPPED EMBYCLIENT: %s ]---", self.server_id)
+        LOG.info("---[ STOPPED JELLYFINCLIENT: %s ]---", self.server_id)
 
     @classmethod
     def close_all(cls):
@@ -92,7 +92,7 @@ class Emby(object):
             cls.client[client].stop()
 
         cls.client = {}
-        LOG.info("---[ STOPPED ALL EMBYCLIENTS ]---")
+        LOG.info("---[ STOPPED ALL JELLYFINCLIENT ]---")
 
     @classmethod
     def get_active_clients(cls):
@@ -119,8 +119,8 @@ class Emby(object):
         self.client[self.server_id] = EmbyClient()
 
         if self.server_id == 'default':
-            LOG.info("---[ START EMBYCLIENT ]---")
+            LOG.info("---[ START JELLYFINCLIENT ]---")
         else:
-            LOG.info("---[ START EMBYCLIENT: %s ]---", self.server_id)
+            LOG.info("---[ START JELLYFINCLIENT: %s ]---", self.server_id)
 
 config()
\ No newline at end of file
diff --git a/resources/lib/emby/client.py b/resources/lib/emby/client.py
index d78fc07d..d4ba426b 100644
--- a/resources/lib/emby/client.py
+++ b/resources/lib/emby/client.py
@@ -12,7 +12,7 @@ from core.connection_manager import ConnectionManager, CONNECTION_STATE
 
 #################################################################################################
 
-LOG = logging.getLogger('Emby.'+__name__)
+LOG = logging.getLogger('JELLYFIN.'+__name__)
 
 #################################################################################################
 
@@ -30,7 +30,7 @@ class EmbyClient(object):
     logged_in = False
 
     def __init__(self):
-        LOG.debug("EmbyClient initializing...")
+        LOG.debug("JellyfinClient initializing...")
 
         self.config = Config()
         self.http = HTTP(self)
diff --git a/resources/lib/emby/core/api.py b/resources/lib/emby/core/api.py
index 7dbdc19a..d23efdec 100644
--- a/resources/lib/emby/core/api.py
+++ b/resources/lib/emby/core/api.py
@@ -50,7 +50,7 @@ class API(object):
 
     #################################################################################################
 
-    # Bigger section of the Emby api
+    # Bigger section of the Jellyfin api
 
     #################################################################################################
 
diff --git a/resources/lib/emby/core/configuration.py b/resources/lib/emby/core/configuration.py
index 6966c85f..ae1f1ccd 100644
--- a/resources/lib/emby/core/configuration.py
+++ b/resources/lib/emby/core/configuration.py
@@ -12,7 +12,7 @@ import logging
 
 DEFAULT_HTTP_MAX_RETRIES = 3
 DEFAULT_HTTP_TIMEOUT = 30
-LOG = logging.getLogger('Emby.'+__name__)
+LOG = logging.getLogger('JELLYFIN.'+__name__)
 
 #################################################################################################
 
diff --git a/resources/lib/emby/core/connection_manager.py b/resources/lib/emby/core/connection_manager.py
index 85e9ff4a..64b71687 100644
--- a/resources/lib/emby/core/connection_manager.py
+++ b/resources/lib/emby/core/connection_manager.py
@@ -14,7 +14,7 @@ from http import HTTP
 
 #################################################################################################
 
-LOG = logging.getLogger('Emby.'+__name__)
+LOG = logging.getLogger('JELLYFIN.'+__name__)
 CONNECTION_STATE = {
     'Unavailable': 0,
     'ServerSelection': 1,
@@ -516,7 +516,7 @@ class ConnectionManager(object):
     def _server_discovery(self):
         
         MULTI_GROUP = ("<broadcast>", 7359)
-        MESSAGE = "who is EmbyServer?"
+        MESSAGE = "who is JellyfinServer?"
         
         sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
         sock.settimeout(1.0) # This controls the socket.timeout exception
diff --git a/resources/lib/emby/core/credentials.py b/resources/lib/emby/core/credentials.py
index 6e47e342..83c4f924 100644
--- a/resources/lib/emby/core/credentials.py
+++ b/resources/lib/emby/core/credentials.py
@@ -10,7 +10,7 @@ from datetime import datetime
 
 #################################################################################################
 
-LOG = logging.getLogger('Emby.'+__name__)
+LOG = logging.getLogger('JELLYFIN.'+__name__)
 
 #################################################################################################
 
diff --git a/resources/lib/emby/core/exceptions.py b/resources/lib/emby/core/exceptions.py
index 2a00a336..c2a93ff1 100644
--- a/resources/lib/emby/core/exceptions.py
+++ b/resources/lib/emby/core/exceptions.py
@@ -3,7 +3,7 @@
 #################################################################################################
 
 class HTTPException(Exception):
-    # Emby HTTP exception
+    # Jellyfin HTTP exception
     def __init__(self, status, message):
         self.status = status
         self.message = message
diff --git a/resources/lib/emby/core/http.py b/resources/lib/emby/core/http.py
index 8b8a6f83..65e6589e 100644
--- a/resources/lib/emby/core/http.py
+++ b/resources/lib/emby/core/http.py
@@ -11,7 +11,7 @@ from exceptions import HTTPException
 
 #################################################################################################
 
-LOG = logging.getLogger('Emby.'+__name__)
+LOG = logging.getLogger('Jellyfin.'+__name__)
 
 #################################################################################################
 
@@ -69,7 +69,7 @@ class HTTP(object):
 
     def request(self, data, session=None):
 
-        ''' Give a chance to retry the connection. Emby sometimes can be slow to answer back
+        ''' Give a chance to retry the connection. Jellyfin sometimes can be slow to answer back
             data dictionary can contain:
             type: GET, POST, etc.
             url: (optional)
diff --git a/resources/lib/emby/core/ws_client.py b/resources/lib/emby/core/ws_client.py
index 7d70ce64..f2f52c3a 100644
--- a/resources/lib/emby/core/ws_client.py
+++ b/resources/lib/emby/core/ws_client.py
@@ -13,7 +13,7 @@ from ..resources import websocket
 
 ##################################################################################################
 
-LOG = logging.getLogger('Emby.'+__name__)
+LOG = logging.getLogger('JELLYFIN.'+__name__)
 
 ##################################################################################################
 
diff --git a/resources/lib/emby/helpers/utils.py b/resources/lib/emby/helpers/utils.py
index 3faa66c4..0bfa0bc1 100644
--- a/resources/lib/emby/helpers/utils.py
+++ b/resources/lib/emby/helpers/utils.py
@@ -7,7 +7,7 @@ from uuid import uuid4
 
 #################################################################################################
 
-LOG = logging.getLogger('Emby.'+__name__)
+LOG = logging.getLogger('JELLYFIN.'+__name__)
 
 #################################################################################################
 
diff --git a/resources/lib/entrypoint/__init__.py b/resources/lib/entrypoint/__init__.py
index 3778b389..d85962f5 100644
--- a/resources/lib/entrypoint/__init__.py
+++ b/resources/lib/entrypoint/__init__.py
@@ -15,7 +15,7 @@ from emby import Emby
 Emby.set_loghandler(loghandler.LogHandler, logging.DEBUG)
 loghandler.reset()
 loghandler.config()
-LOG = logging.getLogger('EMBY.entrypoint')
+LOG = logging.getLogger('JELLYFIN.entrypoint')
 
 #################################################################################################
 
diff --git a/resources/lib/entrypoint/context.py b/resources/lib/entrypoint/context.py
index f45bb06c..a9ba6ad9 100644
--- a/resources/lib/entrypoint/context.py
+++ b/resources/lib/entrypoint/context.py
@@ -17,7 +17,7 @@ from objects import Actions
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 XML_PATH = (xbmcaddon.Addon('plugin.video.jellyfin').getAddonInfo('path'), "default", "1080i")
 OPTIONS = {
     'Refresh': _(30410),
@@ -40,13 +40,13 @@ class Context(object):
         try:
             self.kodi_id = sys.listitem.getVideoInfoTag().getDbId() or None
             self.media = self.get_media_type()
-            self.server = sys.listitem.getProperty('embyserver') or None
-            item_id = sys.listitem.getProperty('embyid')
+            self.server = sys.listitem.getProperty('jellyfinserver') or None
+            item_id = sys.listitem.getProperty('jellyfinid')
         except AttributeError:
             self.server = None
 
-            if xbmc.getInfoLabel('ListItem.Property(embyid)'):
-                item_id = xbmc.getInfoLabel('ListItem.Property(embyid)')
+            if xbmc.getInfoLabel('ListItem.Property(jellyfinid)'):
+                item_id = xbmc.getInfoLabel('ListItem.Property(jellyfinid)')
             else:
                 self.kodi_id = xbmc.getInfoLabel('ListItem.DBID')
                 self.media = xbmc.getInfoLabel('ListItem.DBTYPE')
@@ -96,7 +96,7 @@ class Context(object):
 
     def get_item_id(self):
 
-        ''' Get synced item from embydb.
+        ''' Get synced item from jellyfindb.
         '''
         item = database.get_item(self.kodi_id, self.media)
 
@@ -130,7 +130,7 @@ class Context(object):
 
         options.append(OPTIONS['Addon'])
 
-        context_menu = context.ContextMenu("script-emby-context.xml", *XML_PATH)
+        context_menu = context.ContextMenu("script-jellyfin-context.xml", *XML_PATH)
         context_menu.set_options(options)
         context_menu.doModal()
 
@@ -164,7 +164,7 @@ class Context(object):
 
         if not settings('skipContextMenu.bool'):
 
-            if not dialog("yesno", heading="{emby}", line1=_(33015)):
+            if not dialog("yesno", heading="{jellyfin}", line1=_(33015)):
                 delete = False
 
         if delete:
diff --git a/resources/lib/entrypoint/default.py b/resources/lib/entrypoint/default.py
index 43d43e84..0305e254 100644
--- a/resources/lib/entrypoint/default.py
+++ b/resources/lib/entrypoint/default.py
@@ -24,7 +24,7 @@ from helper import _, event, settings, window, dialog, api, JSONRPC
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
@@ -55,15 +55,15 @@ class Events(object):
 
         if '/extrafanart' in base_url:
 
-            emby_path = path[1:]
-            emby_id = params.get('id')
-            get_fanart(emby_id, emby_path, server)
+            jellyfin_path = path[1:]
+            jellyfin_id = params.get('id')
+            get_fanart(jellyfin_id, jellyfin_path, server)
 
         elif '/Extras' in base_url or '/VideoFiles' in base_url:
 
-            emby_path = path[1:]
-            emby_id = params.get('id')
-            get_video_extras(emby_id, emby_path, server)
+            jellyfin_path = path[1:]
+            jellyfin_id = params.get('id')
+            get_video_extras(jellyfin_id, jellyfin_path, server)
 
         elif mode =='play':
 
@@ -101,7 +101,7 @@ class Events(object):
         elif mode == 'addlibs':
             event('AddLibrarySelection')
         elif mode == 'connect':
-            event('EmbyConnect')
+            event('jellyfinConnect')
         elif mode == 'addserver':
             event('AddServer')
         elif mode == 'login':
@@ -123,14 +123,14 @@ class Events(object):
         elif mode == 'backup':
             backup()
         elif mode == 'restartservice':
-            window('emby.restart.bool', True)
+            window('jellyfin.restart.bool', True)
         else:
             listing()
 
 
 def listing():
 
-    ''' Display all emby nodes and dynamic entries when appropriate.
+    ''' Display all jellyfin nodes and dynamic entries when appropriate.
     '''
     total = int(window('Emby.nodes.total') or 0)
     sync = get_sync()
@@ -240,12 +240,12 @@ def browse(media, view_id=None, folder=None, server_id=None):
     '''
     LOG.info("--[ v:%s/%s ] %s", view_id, media, folder)
 
-    if not window('emby_online.bool') and server_id is None:
+    if not window('jellyfin_online.bool') and server_id is None:
 
         monitor = xbmc.Monitor()
 
         for i in range(300):
-            if window('emby_online.bool'):
+            if window('jellyfin_online.bool'):
                 break
             elif monitor.waitForAbort(0.1):
                 return
@@ -330,8 +330,8 @@ def browse(media, view_id=None, folder=None, server_id=None):
         for item in listing:
 
             li = xbmcgui.ListItem()
-            li.setProperty('embyid', item['Id'])
-            li.setProperty('embyserver', server_id)
+            li.setProperty('jellyfinid', item['Id'])
+            li.setProperty('jellyfinserver', server_id)
             actions.set_listitem(item, li)
 
             if item.get('IsFolder'):
@@ -402,7 +402,7 @@ def browse(media, view_id=None, folder=None, server_id=None):
 
 def browse_subfolders(media, view_id, server_id=None):
 
-    ''' Display submenus for emby views.
+    ''' Display submenus for jellyfin views.
     '''
     from views import DYNNODES
 
@@ -498,7 +498,7 @@ def get_fanart(item_id, path, server_id=None):
     LOG.info("[ extra fanart ] %s", item_id)
     objects = Objects()
     list_li = []
-    directory = xbmc.translatePath("special://thumbnails/emby/%s/" % item_id).decode('utf-8')
+    directory = xbmc.translatePath("special://thumbnails/jellyfin/%s/" % item_id).decode('utf-8')
     server = TheVoid('GetServerAddress', {'ServerId': server_id}).get()
 
     if not xbmcvfs.exists(directory):
@@ -543,7 +543,7 @@ def get_video_extras(item_id, path, server_id=None):
     # TODO
 
     """
-    def getVideoFiles(embyId,embyPath):
+    def getVideoFiles(jellyfinId,jellyfinPath):
         #returns the video files for the item as plugin listing, can be used for browsing the actual files or videoextras etc.
         emby = embyserver.Read_EmbyServer()
         if not embyId:
@@ -573,7 +573,7 @@ def get_next_episodes(item_id, limit):
 
     ''' Only for synced content.
     '''
-    with Database('emby') as embydb:
+    with Database('jellyfin') as embydb:
 
         db = emby_db.EmbyDatabase(embydb.cursor)
         library = db.get_view_name(item_id)
@@ -730,7 +730,7 @@ def add_user():
 
     ''' Add or remove users from the default server session.
     '''
-    if not window('emby_online.bool'):
+    if not window('jellyfin_online.bool'):
         return
 
     session = TheVoid('GetSession', {}).get()
@@ -782,11 +782,11 @@ def get_themes():
         tvtunes.setSetting('custom_path', library)
         LOG.info("TV Tunes custom path is enabled and set.")
     else:
-        dialog("ok", heading="{emby}", line1=_(33152))
+        dialog("ok", heading="{jellyfin}", line1=_(33152))
 
         return
 
-    with Database('emby') as embydb:
+    with Database('jellyfin') as embydb:
         all_views = emby_db.EmbyDatabase(embydb.cursor).get_views()
         views = [x[0] for x in all_views if x[2] in ('movies', 'tvshows', 'mixed')]
 
@@ -831,7 +831,7 @@ def get_themes():
 
         tvtunes_nfo(nfo_file, paths)
 
-    dialog("notification", heading="{emby}", message=_(33153), icon="{emby}", time=1000, sound=False)
+    dialog("notification", heading="{jellyfin}", message=_(33153), icon="{jellyfin}", time=1000, sound=False)
 
 def delete_item():
 
@@ -843,7 +843,7 @@ def delete_item():
 
 def backup():
 
-    ''' Emby backup.
+    ''' Jellyfin backup.
     '''
     from helper.utils import delete_folder, copytree
 
@@ -857,7 +857,7 @@ def backup():
     backup = os.path.join(path, folder_name)
 
     if xbmcvfs.exists(backup + '/'):
-        if not dialog("yesno", heading="{emby}", line1=_(33090)):
+        if not dialog("yesno", heading="{jellyfin}", line1=_(33090)):
 
             return backup()
 
@@ -870,7 +870,7 @@ def backup():
     if not xbmcvfs.mkdirs(path) or not xbmcvfs.mkdirs(destination_databases):
 
         LOG.info("Unable to create all directories")
-        dialog("notification", heading="{emby}", icon="{emby}", message=_(33165), sound=False)
+        dialog("notification", heading="{jellyfin}", icon="{jellyfin}", message=_(33165), sound=False)
 
         return
 
@@ -878,9 +878,9 @@ def backup():
 
     databases = Objects().objects
 
-    db = xbmc.translatePath(databases['emby']).decode('utf-8')
+    db = xbmc.translatePath(databases['jellyfin']).decode('utf-8')
     xbmcvfs.copy(db, os.path.join(destination_databases, db.rsplit('\\', 1)[1]))
-    LOG.info("copied emby.db")
+    LOG.info("copied jellyfin.db")
 
     db = xbmc.translatePath(databases['video']).decode('utf-8')
     filename = db.rsplit('\\', 1)[1]
@@ -895,4 +895,4 @@ def backup():
         LOG.info("copied %s", filename)
 
     LOG.info("backup completed")
-    dialog("ok", heading="{emby}", line1="%s %s" % (_(33091), backup))
+    dialog("ok", heading="{jellyfin}", line1="%s %s" % (_(33091), backup))
diff --git a/resources/lib/entrypoint/service.py b/resources/lib/entrypoint/service.py
index 0b0392f5..270f5b46 100644
--- a/resources/lib/entrypoint/service.py
+++ b/resources/lib/entrypoint/service.py
@@ -26,7 +26,7 @@ from database import Database, emby_db, reset
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
@@ -43,7 +43,7 @@ class Service(xbmc.Monitor):
 
     def __init__(self):
 
-        window('emby_should_stop', clear=True)
+        window('jellyfin_should_stop', clear=True)
 
         self.settings['addon_version'] = client.get_version()
         self.settings['profile'] = xbmc.translatePath('special://profile')
@@ -53,14 +53,14 @@ class Service(xbmc.Monitor):
         self.settings['enable_context'] = settings('enableContext.bool')
         self.settings['enable_context_transcode'] = settings('enableContextTranscode.bool')
         self.settings['kodi_companion'] = settings('kodiCompanion.bool')
-        window('emby_logLevel', value=str(self.settings['log_level']))
-        window('emby_kodiProfile', value=self.settings['profile'])
+        window('jellyfin_logLevel', value=str(self.settings['log_level']))
+        window('jellyfin_kodiProfile', value=self.settings['profile'])
         settings('platformDetected', client.get_platform())
 
         if self.settings['enable_context']:
-            window('emby_context.bool', True)
+            window('jellyfin_context.bool', True)
         if self.settings['enable_context_transcode']:
-            window('emby_context_transcode.bool', True)
+            window('jellyfin_context_transcode.bool', True)
 
         LOG.warn("--->>>[ %s ]", client.get_addon_name())
         LOG.warn("Version: %s", client.get_version())
@@ -78,7 +78,7 @@ class Service(xbmc.Monitor):
         except Exception as error:
             LOG.error(error)
 
-        window('emby.connected.bool', True)
+        window('jellyfin.connected.bool', True)
         self.check_update()
         settings('groupedSets.bool', objects.utils.get_grouped_set())
         xbmc.Monitor.__init__(self)
@@ -99,9 +99,9 @@ class Service(xbmc.Monitor):
         self.settings['mode'] = settings('useDirectPaths')
 
         while self.running:
-            if window('emby_online.bool'):
+            if window('jellyfin_online.bool'):
 
-                if self.settings['profile'] != window('emby_kodiProfile'):
+                if self.settings['profile'] != window('jellyfin_kodiProfile'):
                     LOG.info("[ profile switch ] %s", self.settings['profile'])
 
                     break
@@ -118,10 +118,10 @@ class Service(xbmc.Monitor):
                         if update:
                             self.settings['last_progress_report'] = datetime.today()
 
-            if window('emby.restart.bool'):
+            if window('jellyfin.restart.bool'):
 
-                window('emby.restart', clear=True)
-                dialog("notification", heading="{emby}", message=_(33193), icon="{emby}", time=1000, sound=False)
+                window('jellyfin.restart', clear=True)
+                dialog("notification", heading="{jellyfin}", message=_(33193), icon="{jellyfin}", time=1000, sound=False)
 
                 raise Exception('RestartService')
 
@@ -142,7 +142,7 @@ class Service(xbmc.Monitor):
 
     def stop_default(self):
 
-        window('emby_online', clear=True)
+        window('jellyfin_online', clear=True)
         Emby().close()
 
         if self.library_thread is not None:
@@ -154,7 +154,7 @@ class Service(xbmc.Monitor):
 
         ''' Check the database version to ensure we do not need to do a reset.
         '''
-        with Database('emby') as embydb:
+        with Database('jellyfin') as embydb:
 
             version = emby_db.EmbyDatabase(embydb.cursor).get_version()
             LOG.info("---[ db/%s ]", version)
@@ -202,12 +202,12 @@ class Service(xbmc.Monitor):
             get_objects(zipfile, label + '.zip')
             self.reload_objects()
 
-            dialog("notification", heading="{emby}", message=_(33156), icon="{emby}")
+            dialog("notification", heading="{jellyfin}", message=_(33156), icon="{jellyfin}")
             LOG.info("--[ new objects/%s ]", objects.version)
 
             try:
                 if compare_version(self.settings['addon_version'], objects.embyversion) < 0:
-                    dialog("ok", heading="{emby}", line1="%s %s" % (_(33160), objects.embyversion))
+                    dialog("ok", heading="{jellyfin}", line1="%s %s" % (_(33160), objects.embyversion))
             except Exception:
                 pass
 
@@ -229,7 +229,7 @@ class Service(xbmc.Monitor):
 
             if method not in ('ServerUnreachable', 'ServerShuttingDown', 'UserDataChanged', 'ServerConnect',
                               'LibraryChanged', 'ServerOnline', 'SyncLibrary', 'RepairLibrary', 'RemoveLibrary',
-                              'EmbyConnect', 'SyncLibrarySelection', 'RepairLibrarySelection', 'AddServer',
+                              'JellyfinConnect', 'SyncLibrarySelection', 'RepairLibrarySelection', 'AddServer',
                               'Unauthorized', 'UpdateServer', 'UserConfigurationUpdated', 'ServerRestarting',
                               'RemoveServer', 'AddLibrarySelection', 'CheckUpdate', 'RemoveLibrarySelection'):
                 return
@@ -246,7 +246,7 @@ class Service(xbmc.Monitor):
         if method == 'ServerOnline':
             if data.get('ServerId') is None:
 
-                window('emby_online.bool', True)
+                window('jellyfin_online.bool', True)
                 self.settings['auth_check'] = True
                 self.warn = True
 
@@ -254,8 +254,8 @@ class Service(xbmc.Monitor):
 
                     users = [user for user in (settings('additionalUsers') or "").decode('utf-8').split(',') if user]
                     users.insert(0, settings('username').decode('utf-8'))
-                    dialog("notification", heading="{emby}", message="%s %s" % (_(33000), ", ".join(users)),
-                            icon="{emby}", time=1500, sound=False)
+                    dialog("notification", heading="{jellyfin}", message="%s %s" % (_(33000), ", ".join(users)),
+                            icon="{jellyfin}", time=1500, sound=False)
 
                 if self.library_thread is None:
 
@@ -267,7 +267,7 @@ class Service(xbmc.Monitor):
             if self.warn or data.get('ServerId'):
 
                 self.warn = data.get('ServerId') is not None
-                dialog("notification", heading="{emby}", message=_(33146) if data.get('ServerId') is None else _(33149), icon=xbmcgui.NOTIFICATION_ERROR)
+                dialog("notification", heading="{jellyfin}", message=_(33146) if data.get('ServerId') is None else _(33149), icon=xbmcgui.NOTIFICATION_ERROR)
 
             if data.get('ServerId') is None:
                 self.stop_default()
@@ -278,7 +278,7 @@ class Service(xbmc.Monitor):
                 self.start_default()
 
         elif method == 'Unauthorized':
-            dialog("notification", heading="{emby}", message=_(33147) if data['ServerId'] is None else _(33148), icon=xbmcgui.NOTIFICATION_ERROR)
+            dialog("notification", heading="{jellyfin}", message=_(33147) if data['ServerId'] is None else _(33148), icon=xbmcgui.NOTIFICATION_ERROR)
 
             if data.get('ServerId') is None and self.settings['auth_check']:
 
@@ -295,7 +295,7 @@ class Service(xbmc.Monitor):
                 return
             
             if settings('restartMsg.bool'):
-                dialog("notification", heading="{emby}", message=_(33006), icon="{emby}")
+                dialog("notification", heading="{jellyfin}", message=_(33006), icon="{jellyfin}")
 
             self.stop_default()
 
@@ -308,7 +308,7 @@ class Service(xbmc.Monitor):
             self.connect.register(data['Id'])
             xbmc.executebuiltin("Container.Refresh")
 
-        elif method == 'EmbyConnect':
+        elif method == 'JellyfinConnect':
             self.connect.setup_login_connect()
 
         elif method == 'AddServer':
@@ -323,18 +323,18 @@ class Service(xbmc.Monitor):
 
         elif method == 'UpdateServer':
 
-            dialog("ok", heading="{emby}", line1=_(33151))
+            dialog("ok", heading="{jellyfin}", line1=_(33151))
             self.connect.setup_manual_server()
 
         elif method == 'UserDataChanged' and self.library_thread:
-            if data.get('ServerId') or not window('emby_startup.bool'):
+            if data.get('ServerId') or not window('jellyfin_startup.bool'):
                 return
 
             LOG.info("[ UserDataChanged ] %s", data)
             self.library_thread.userdata(data['UserDataList'])
 
         elif method == 'LibraryChanged' and self.library_thread:
-            if data.get('ServerId') or not window('emby_startup.bool'):
+            if data.get('ServerId') or not window('jellyfin_startup.bool'):
                 return
 
             LOG.info("[ LibraryChanged ] %s", data)
@@ -342,7 +342,7 @@ class Service(xbmc.Monitor):
             self.library_thread.removed(data['ItemsRemoved'])
 
         elif method == 'System.OnQuit':
-            window('emby_should_stop.bool', True)
+            window('jellyfin_should_stop.bool', True)
             self.running = False
 
         elif method in ('SyncLibrarySelection', 'RepairLibrarySelection', 'AddLibrarySelection', 'RemoveLibrarySelection'):
@@ -382,7 +382,7 @@ class Service(xbmc.Monitor):
         elif method == 'System.OnSleep':
             
             LOG.info("-->[ sleep ]")
-            window('emby_should_stop.bool', True)
+            window('jellyfin_should_stop.bool', True)
 
             if self.library_thread is not None:
 
@@ -403,7 +403,7 @@ class Service(xbmc.Monitor):
             LOG.info("--<[ sleep ]")
             xbmc.sleep(10000)# Allow network to wake up
             self.monitor.sleep = False
-            window('emby_should_stop', clear=True)
+            window('jellyfin_should_stop', clear=True)
 
             try:
                 self.connect.register()
@@ -426,34 +426,34 @@ class Service(xbmc.Monitor):
         elif method == 'CheckUpdate':
 
             if not self.check_update(True):
-                dialog("notification", heading="{emby}", message=_(21341), icon="{emby}", sound=False)
+                dialog("notification", heading="{jellyfin}", message=_(21341), icon="{jellyfin}", sound=False)
             else:
-                dialog("notification", heading="{emby}", message=_(33181), icon="{emby}", sound=False)
-                window('emby.restart.bool', True)
+                dialog("notification", heading="{jellyfin}", message=_(33181), icon="{jellyfin}", sound=False)
+                window('jellyfin.restart.bool', True)
 
     def onSettingsChanged(self):
 
         ''' React to setting changes that impact window values.
         '''
-        if window('emby_should_stop.bool'):
+        if window('jellyfin_should_stop.bool'):
             return
 
         if settings('logLevel') != self.settings['log_level']:
 
             log_level = settings('logLevel')
-            window('emby_logLevel', str(log_level))
+            window('jellyfin_logLevel', str(log_level))
             self.settings['logLevel'] = log_level
             LOG.warn("New log level: %s", log_level)
 
         if settings('enableContext.bool') != self.settings['enable_context']:
 
-            window('emby_context', settings('enableContext'))
+            window('jellyfin_context', settings('enableContext'))
             self.settings['enable_context'] = settings('enableContext.bool')
             LOG.warn("New context setting: %s", self.settings['enable_context'])
 
         if settings('enableContextTranscode.bool') != self.settings['enable_context_transcode']:
 
-            window('emby_context_transcode', settings('enableContextTranscode'))
+            window('jellyfin_context_transcode', settings('enableContextTranscode'))
             self.settings['enable_context_transcode'] = settings('enableContextTranscode.bool')
             LOG.warn("New context transcode setting: %s", self.settings['enable_context_transcode'])
 
@@ -465,13 +465,13 @@ class Service(xbmc.Monitor):
             if not self.settings.get('mode_warn'):
 
                 self.settings['mode_warn'] = True
-                dialog("yesno", heading="{emby}", line1=_(33118))
+                dialog("yesno", heading="{jellyfin}", line1=_(33118))
 
         if settings('kodiCompanion.bool') != self.settings['kodi_companion']:
             self.settings['kodi_companion'] = settings('kodiCompanion.bool')
 
             if not self.settings['kodi_companion']:
-                dialog("ok", heading="{emby}", line1=_(33138))
+                dialog("ok", heading="{jellyfin}", line1=_(33138))
 
     def reload_objects(self):
 
@@ -497,14 +497,14 @@ class Service(xbmc.Monitor):
     def shutdown(self):
 
         LOG.warn("---<[ EXITING ]")
-        window('emby_should_stop.bool', True)
+        window('jellyfin_should_stop.bool', True)
 
         properties = [ # TODO: review
-            "emby_state", "emby_serverStatus", "emby_currUser",
+            "jellyfin_state", "jellyfin_serverStatus", "jellyfin_currUser",
 
-            "emby_play", "emby_online", "emby.connected", "emby.resume", "emby_startup",
-            "emby.external", "emby.external_check", "emby_deviceId", "emby_db_check", "emby_pathverified",
-            "emby_sync"
+            "jellyfin_play", "jellyfin_online", "jellyfin.connected", "jellyfin.resume", "jellyfin_startup",
+            "jellyfin.external", "jellyfin.external_check", "jellyfin_deviceId", "jellyfin_db_check", "jellyfin_pathverified",
+            "jellyfin_sync"
         ]
         for prop in properties:
             window(prop, clear=True)
diff --git a/resources/lib/full_sync.py b/resources/lib/full_sync.py
index 0381ac9b..aca9be55 100644
--- a/resources/lib/full_sync.py
+++ b/resources/lib/full_sync.py
@@ -19,7 +19,7 @@ from views import Views
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
@@ -27,7 +27,7 @@ LOG = logging.getLogger("EMBY."+__name__)
 class FullSync(object):
 
     ''' This should be called like a context.
-        i.e. with FullSync('emby') as sync:
+        i.e. with FullSync('jellyfin') as sync:
             sync.libraries()
     '''
     # Borg - multiple instances, shared state
@@ -45,7 +45,7 @@ class FullSync(object):
         self.__dict__ = self._shared_state
 
         if self.running:
-            dialog("ok", heading="{emby}", line1=_(33197))
+            dialog("ok", heading="{jellyfin}", line1=_(33197))
 
             raise Exception("Sync is already running.")
 
@@ -65,7 +65,7 @@ class FullSync(object):
             set_screensaver(value="")
 
         self.running = True
-        window('emby_sync.bool', True)
+        window('jellyfin_sync.bool', True)
 
         return self
 
@@ -104,7 +104,7 @@ class FullSync(object):
 
     def get_libraries(self, library_id=None):
 
-        with Database('emby') as embydb:
+        with Database('jellyfin') as embydb:
             if library_id is None:
                 return emby_db.EmbyDatabase(embydb.cursor).get_views()
             else:
@@ -117,10 +117,10 @@ class FullSync(object):
         '''
         if self.sync['Libraries']:
 
-            if not dialog("yesno", heading="{emby}", line1=_(33102)):
+            if not dialog("yesno", heading="{jellyfin}", line1=_(33102)):
 
-                if not dialog("yesno", heading="{emby}", line1=_(33173)):
-                    dialog("ok", heading="{emby}", line1=_(33122))
+                if not dialog("yesno", heading="{jellyfin}", line1=_(33173)):
+                    dialog("ok", heading="{jellyfin}", line1=_(33122))
 
                     raise LibraryException("ProgressStopped")
                 else:
@@ -146,7 +146,7 @@ class FullSync(object):
 
         ''' Select all or certain libraries to be whitelisted.
         '''
-        if dialog("yesno", heading="{emby}", line1=_(33125), nolabel=_(33127), yeslabel=_(33126)):
+        if dialog("yesno", heading="{jellyfin}", line1=_(33125), nolabel=_(33127), yeslabel=_(33126)):
             LOG.info("Selected sync later.")
 
             raise LibraryException('SyncLibraryLater')
@@ -204,8 +204,8 @@ class FullSync(object):
         save_sync(self.sync)
 
         xbmc.executebuiltin('UpdateLibrary(video)')
-        dialog("notification", heading="{emby}", message="%s %s" % (_(33025), str(elapsed).split('.')[0]),
-               icon="{emby}", sound=False)
+        dialog("notification", heading="{jellyfin}", message="%s %s" % (_(33025), str(elapsed).split('.')[0]),
+               icon="{jellyfin}", sound=False)
         LOG.info("Full sync completed in: %s", str(elapsed).split('.')[0])
 
     def process_library(self, library_id):
@@ -251,7 +251,7 @@ class FullSync(object):
 
             if not 'Failed to validate path' in error:
 
-                dialog("ok", heading="{emby}", line1=_(33119))
+                dialog("ok", heading="{jellyfin}", line1=_(33119))
                 LOG.error("full sync exited unexpectedly")
                 save_sync(self.sync)
 
@@ -266,7 +266,7 @@ class FullSync(object):
 
         with self.library.database_lock:
             with Database() as videodb:
-                with Database('emby') as embydb:
+                with Database('jellyfin') as embydb:
 
                     obj = Movies(self.server, embydb, videodb, self.direct_path)
 
@@ -287,7 +287,7 @@ class FullSync(object):
 
     def movies_compare(self, library, obj, embydb):
 
-        ''' Compare entries from library to what's in the embydb. Remove surplus
+        ''' Compare entries from library to what's in the jellyfindb. Remove surplus
         '''
         db = emby_db.EmbyDatabase(embydb.cursor)
 
@@ -307,7 +307,7 @@ class FullSync(object):
 
         with self.library.database_lock:
             with Database() as videodb:
-                with Database('emby') as embydb:
+                with Database('jellyfin') as embydb:
                     obj = TVShows(self.server, embydb, videodb, self.direct_path, True)
 
                     for items in server.get_items(library['Id'], "Series", False, self.sync['RestorePoint'].get('params')):
@@ -357,7 +357,7 @@ class FullSync(object):
 
         with self.library.database_lock:
             with Database() as videodb:
-                with Database('emby') as embydb:
+                with Database('jellyfin') as embydb:
                     obj = MusicVideos(self.server, embydb, videodb, self.direct_path)
 
                     for items in server.get_items(library['Id'], "MusicVideo", False, self.sync['RestorePoint'].get('params')):
@@ -397,7 +397,7 @@ class FullSync(object):
 
         with self.library.music_database_lock:
             with Database('music') as musicdb:
-                with Database('emby') as embydb:
+                with Database('jellyfin') as embydb:
                     obj = Music(self.server, embydb, musicdb, self.direct_path)
 
                     for items in server.get_artists(library['Id'], False, self.sync['RestorePoint'].get('params')):
@@ -459,7 +459,7 @@ class FullSync(object):
 
         with self.library.database_lock:
             with Database() as videodb:
-                with Database('emby') as embydb:
+                with Database('jellyfin') as embydb:
                     obj = Movies(self.server, embydb, videodb, self.direct_path)
 
                     for items in server.get_items(library_id, "BoxSet", False, self.sync['RestorePoint'].get('params')):
@@ -482,7 +482,7 @@ class FullSync(object):
 
         with self.library.database_lock:
             with Database() as videodb:
-                with Database('emby') as embydb:
+                with Database('jellyfin') as embydb:
 
                     obj = Movies(self.server, embydb, videodb, self.direct_path)
                     obj.boxsets_reset()
@@ -497,7 +497,7 @@ class FullSync(object):
         MEDIA = self.library.MEDIA
         direct_path = self.library.direct_path
 
-        with Database('emby') as embydb:
+        with Database('jellyfin') as embydb:
 
             db = emby_db.EmbyDatabase(embydb.cursor)
             library = db.get_view(library_id.replace('Mixed:', ""))
@@ -558,7 +558,7 @@ class FullSync(object):
         ''' Exiting sync
         '''
         self.running = False
-        window('emby_sync', clear=True)
+        window('jellyfin_sync', clear=True)
 
         if not settings('dbSyncScreensaver.bool') and self.screensaver is not None:
 
diff --git a/resources/lib/helper/api.py b/resources/lib/helper/api.py
index beee246f..3b43c01b 100644
--- a/resources/lib/helper/api.py
+++ b/resources/lib/helper/api.py
@@ -10,7 +10,7 @@ from . import settings
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
@@ -28,7 +28,7 @@ class API(object):
 
     def get_playcount(self, played, playcount):
 
-        ''' Convert Emby played/playcount into
+        ''' Convert Jellyfin played/playcount into
             the Kodi equivalent. The playcount is tied to the watch status.
         '''
         return (playcount or 1) if played else None
@@ -231,7 +231,7 @@ class API(object):
 
     def get_user_artwork(self, user_id):
     
-        ''' Get emby user profile picture.
+        ''' Get jellyfin user profile picture.
         '''
         return "%s/emby/Users/%s/Images/Primary?Format=original" % (self.server, user_id)
 
@@ -302,7 +302,7 @@ class API(object):
 
     def get_backdrops(self, item_id, tags, query=None):
 
-        ''' Get backdrops based of "BackdropImageTags" in the emby object.
+        ''' Get backdrops based of "BackdropImageTags" in the jellyfin object.
         '''
         backdrops = []
 
diff --git a/resources/lib/helper/exceptions.py b/resources/lib/helper/exceptions.py
index b3bacc3f..6e2e747e 100644
--- a/resources/lib/helper/exceptions.py
+++ b/resources/lib/helper/exceptions.py
@@ -3,7 +3,7 @@
 #################################################################################################
 
 class LibraryException(Exception):
-    # Emby library sync exception
+    # Jellyfin library sync exception
     def __init__(self, status):
         self.status = status
 
diff --git a/resources/lib/helper/loghandler.py b/resources/lib/helper/loghandler.py
index 8fb2698f..04fa723c 100644
--- a/resources/lib/helper/loghandler.py
+++ b/resources/lib/helper/loghandler.py
@@ -14,14 +14,14 @@ from . import window, settings
 
 def config():
 
-    logger = logging.getLogger('EMBY')
+    logger = logging.getLogger('JELLYFIN')
     logger.addHandler(LogHandler())
     logger.setLevel(logging.DEBUG)
 
 def reset():
 
-    for handler in logging.getLogger('EMBY').handlers:
-        logging.getLogger('EMBY').removeHandler(handler)
+    for handler in logging.getLogger('JELLYFIN').handlers:
+        logging.getLogger('JELLYFIN').removeHandler(handler)
 
 
 class LogHandler(logging.StreamHandler):
@@ -56,10 +56,10 @@ class LogHandler(logging.StreamHandler):
 
             if self.mask_info:
                 for server in self.sensitive['Server']:
-                    string = string.replace(server.encode('utf-8') or "{server}", "{emby-server}")
+                    string = string.replace(server.encode('utf-8') or "{server}", "{jellyfin-server}")
 
                 for token in self.sensitive['Token']:
-                    string = string.replace(token.encode('utf-8')  or "{token}", "{emby-token}")
+                    string = string.replace(token.encode('utf-8')  or "{token}", "{jellyfin-token}")
 
             try:
                 xbmc.log(string, level=xbmc.LOGNOTICE)
@@ -76,7 +76,7 @@ class LogHandler(logging.StreamHandler):
             logging.DEBUG: 2
         }
         try:
-            log_level = int(window('emby_logLevel'))
+            log_level = int(window('jellyfin_logLevel'))
         except ValueError:
             log_level = 0
 
diff --git a/resources/lib/helper/playutils.py b/resources/lib/helper/playutils.py
index 9814416b..b8a9966d 100644
--- a/resources/lib/helper/playutils.py
+++ b/resources/lib/helper/playutils.py
@@ -21,7 +21,7 @@ from emby import Emby
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
@@ -32,7 +32,7 @@ def set_properties(item, method, server_id=None):
     '''
     info = item.get('PlaybackInfo') or {}
 
-    current = window('emby_play.json') or []
+    current = window('jellyfin_play.json') or []
     current.append({
         'Type': item['Type'],
         'Id': item['Id'],
@@ -51,7 +51,7 @@ def set_properties(item, method, server_id=None):
         'CurrentEpisode': info.get('CurrentEpisode')
     })
 
-    window('emby_play.json', current)
+    window('jellyfin_play.json', current)
 
 class PlayUtils(object):
 
@@ -178,7 +178,7 @@ class PlayUtils(object):
     def get(self, source, audio=None, subtitle=None):
 
         ''' The server returns sources based on the MaxStreamingBitrate value and other filters.
-            prop: embyfilename for ?? I thought it was to pass the real path to subtitle add-ons but it's not working?
+            prop: jellyfinfilename for ?? I thought it was to pass the real path to subtitle add-ons but it's not working?
         '''
         self.info['MediaSourceId'] = source['Id']
 
@@ -214,7 +214,7 @@ class PlayUtils(object):
         self.item['PlaybackInfo'].update(self.info)
 
         API = api.API(self.item, self.info['ServerAddress'])
-        window('embyfilename', value=API.get_file_path(source.get('Path')).encode('utf-8'))
+        window('jellyfinfilename', value=API.get_file_path(source.get('Path')).encode('utf-8'))
 
     def live_stream(self, source):
 
@@ -454,7 +454,7 @@ class PlayUtils(object):
     def set_external_subs(self, source, listitem):
 
         ''' Try to download external subs locally so we can label them.
-            Since Emby returns all possible tracks together, sort them.
+            Since Jellyfin returns all possible tracks together, sort them.
             IsTextSubtitleStream if true, is available to download from server.
         '''
         if not settings('enableExternalSubs.bool') or not source['MediaStreams']:
@@ -528,7 +528,7 @@ class PlayUtils(object):
         ''' For transcoding only
             Present the list of audio/subs to select from, before playback starts.
 
-            Since Emby returns all possible tracks together, sort them.
+            Since Jellyfin returns all possible tracks together, sort them.
             IsTextSubtitleStream if true, is available to download from server.
         '''
         prefs = ""
diff --git a/resources/lib/helper/translate.py b/resources/lib/helper/translate.py
index d6d62248..70c5e3cb 100644
--- a/resources/lib/helper/translate.py
+++ b/resources/lib/helper/translate.py
@@ -11,7 +11,7 @@ import xbmcaddon
 
 ##################################################################################################
 
-LOG = logging.getLogger('EMBY.'+__name__)
+LOG = logging.getLogger('JELLYFIN.'+__name__)
 
 ##################################################################################################
 
diff --git a/resources/lib/helper/utils.py b/resources/lib/helper/utils.py
index 09e229b4..da7bee4d 100644
--- a/resources/lib/helper/utils.py
+++ b/resources/lib/helper/utils.py
@@ -21,7 +21,7 @@ from dateutil import tz, parser
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
@@ -149,10 +149,10 @@ def dialog(dialog_type, *args, **kwargs):
     d = xbmcgui.Dialog()
 
     if "icon" in kwargs:
-        kwargs['icon'] = kwargs['icon'].replace("{emby}",
+        kwargs['icon'] = kwargs['icon'].replace("{jellyfin}",
                                                 "special://home/addons/plugin.video.jellyfin/icon.png")
     if "heading" in kwargs:
-        kwargs['heading'] = kwargs['heading'].replace("{emby}", _('addon_name'))
+        kwargs['heading'] = kwargs['heading'].replace("{jellyfin}", _('addon_name'))
 
     types = {
         'yesno': d.yesno,
@@ -172,11 +172,11 @@ def should_stop():
     if xbmc.Monitor().waitForAbort(0.00001):
         return True
 
-    if window('emby_should_stop.bool'):
+    if window('jellyfin_should_stop.bool'):
         LOG.info("exiiiiitttinggg")
         return True
 
-    if not window('emby_online.bool'):
+    if not window('jellyfin_online.bool'):
         return True
 
     return False
@@ -235,7 +235,7 @@ def validate(path):
 
     ''' Verify if path is accessible.
     '''
-    if window('emby_pathverified.bool'):
+    if window('jellyfin_pathverified.bool'):
         return True
 
     path = path if os.path.supports_unicode_filenames else path.encode('utf-8')
@@ -243,11 +243,11 @@ def validate(path):
     if not xbmcvfs.exists(path):
         LOG.info("Could not find %s", path)
 
-        if dialog("yesno", heading="{emby}", line1="%s %s. %s" % (_(33047), path, _(33048))):
+        if dialog("yesno", heading="{jellyfin}", line1="%s %s. %s" % (_(33047), path, _(33048))):
 
             return False
 
-    window('emby_pathverified.bool', True)
+    window('jellyfin_pathverified.bool', True)
 
     return True
 
@@ -292,7 +292,7 @@ def delete_folder(path=None):
     '''
     LOG.debug("--[ delete folder ]")
     delete_path = path is not None
-    path = path or xbmc.translatePath('special://temp/emby').decode('utf-8')
+    path = path or xbmc.translatePath('special://temp/jellyfin').decode('utf-8')
     dirs, files = xbmcvfs.listdir(path)
 
     delete_recursive(path, dirs)
diff --git a/resources/lib/helper/wrapper.py b/resources/lib/helper/wrapper.py
index 7747ff6e..a0172cdb 100644
--- a/resources/lib/helper/wrapper.py
+++ b/resources/lib/helper/wrapper.py
@@ -11,7 +11,7 @@ from utils import should_stop
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
@@ -101,7 +101,7 @@ def stop(default=None):
 
 def emby_item():
 
-    ''' Wrapper to retrieve the emby_db item.
+    ''' Wrapper to retrieve the jellyfin_db item.
     '''
     def decorator(func):
         def wrapper(self, item, *args, **kwargs):
diff --git a/resources/lib/helper/xmls.py b/resources/lib/helper/xmls.py
index 5ca11099..071233b3 100644
--- a/resources/lib/helper/xmls.py
+++ b/resources/lib/helper/xmls.py
@@ -13,14 +13,14 @@ from . import _, indent, write_xml, dialog, settings
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
 def sources():
 
     ''' Create master lock compatible sources.
-        Also add the kodi.emby.media source.
+        Also add the kodi.jellyfin.media source.
     '''
     path = xbmc.translatePath("special://profile/").decode('utf-8')
     file = os.path.join(path, 'sources.xml')
@@ -52,7 +52,7 @@ def sources():
             if (protocol == 'smb://' and count_smb > 0) or (protocol == 'http://' and count_http > 0):
 
                 source = etree.SubElement(video, 'source')
-                etree.SubElement(source, 'name').text = "Emby"
+                etree.SubElement(source, 'name').text = "Jellyfin"
                 etree.SubElement(source, 'path', attrib={'pathversion': "1"}).text = protocol
                 etree.SubElement(source, 'allowsharing').text = "true"
 
@@ -63,12 +63,13 @@ def sources():
             files = etree.SubElement(xml, 'files')
 
         for source in xml.findall('.//path'):
-            if source.text == 'http://kodi.emby.media':
+            # TODO get a repo url
+            if source.text == 'http://kodi.jellyfin.media':
                 break
         else:
             source = etree.SubElement(files, 'source')
-            etree.SubElement(source, 'name').text = "kodi.emby.media"
-            etree.SubElement(source, 'path', attrib={'pathversion': "1"}).text = "http://kodi.emby.media"
+            etree.SubElement(source, 'name').text = "kodi.jellyfin.media"
+            etree.SubElement(source, 'path', attrib={'pathversion': "1"}).text = "http://kodi.jellyfin.media"
             etree.SubElement(source, 'allowsharing').text = "true"
     except Exception as error:
         LOG.exception(error)
@@ -124,7 +125,7 @@ def advanced_settings():
             indent(xml)
             write_xml(etree.tostring(xml, 'UTF-8'), path)
 
-            dialog("ok", heading="{emby}", line1=_(33097))
+            dialog("ok", heading="{jellyfin}", line1=_(33097))
             xbmc.executebuiltin('RestartApp')
 
             return True
diff --git a/resources/lib/library.py b/resources/lib/library.py
index a69098e4..01e2405a 100644
--- a/resources/lib/library.py
+++ b/resources/lib/library.py
@@ -22,7 +22,7 @@ from emby import Emby
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 LIMIT = min(int(settings('limitIndex') or 50), 50)
 DTHREADS = int(settings('limitThreads') or 3)
 MEDIA = {
@@ -101,7 +101,7 @@ class Library(threading.Thread):
         if not self.startup():
             self.stop_client()
 
-        window('emby_startup.bool', True)
+        window('jellyfin_startup.bool', True)
 
         while not self.stop_thread:
 
@@ -151,7 +151,7 @@ class Library(threading.Thread):
             self.worker_notify()
 
         if self.pending_refresh:
-            window('emby_sync.bool', True)
+            window('jellyfin_sync.bool', True)
 
             if self.total_updates > self.progress_display:
                 queue_size = self.worker_queue_size()
@@ -177,7 +177,7 @@ class Library(threading.Thread):
             self.pending_refresh = False
             self.save_last_sync()
             self.total_updates = 0
-            window('emby_sync', clear=True)
+            window('jellyfin_sync', clear=True)
 
             if self.progress_updates:
 
@@ -206,7 +206,7 @@ class Library(threading.Thread):
         ''' When there's an active thread. Let the main thread know.
         '''
         self.pending_refresh = True
-        window('emby_sync.bool', True)
+        window('jellyfin_sync.bool', True)
 
     def worker_queue_size(self):
 
@@ -227,7 +227,7 @@ class Library(threading.Thread):
 
     def worker_downloads(self):
 
-        ''' Get items from emby and place them in the appropriate queues.
+        ''' Get items from jellyfin and place them in the appropriate queues.
         '''
         for queue in ((self.updated_queue, self.updated_output), (self.userdata_queue, self.userdata_output)):
             if queue[0].qsize() and len(self.download_threads) < DTHREADS:
@@ -238,7 +238,7 @@ class Library(threading.Thread):
 
     def worker_sort(self):
 
-        ''' Get items based on the local emby database and place item in appropriate queues.
+        ''' Get items based on the local jellyfin database and place item in appropriate queues.
         '''
         if self.removed_queue.qsize() and len(self.emby_threads) < 2:
 
@@ -350,10 +350,10 @@ class Library(threading.Thread):
                 if settings('kodiCompanion.bool'):
 
                     for plugin in self.server['api'].get_plugins():
-                        if plugin['Name'] in ("Emby.Kodi Sync Queue", "Kodi companion"):
+                        if plugin['Name'] in ("Jellyfin.Kodi Sync Queue", "Kodi companion"):
                             
                             if not self.fast_sync():
-                                dialog("ok", heading="{emby}", line1=_(33128))
+                                dialog("ok", heading="{jellyfin}", line1=_(33128))
 
                                 raise Exception("Failed to retrieve latest updates")
 
@@ -369,7 +369,7 @@ class Library(threading.Thread):
 
             if error.status in 'SyncLibraryLater':
 
-                dialog("ok", heading="{emby}", line1=_(33129))
+                dialog("ok", heading="{jellyfin}", line1=_(33129))
                 settings('SyncInstallRunDone.bool', True)
                 sync = get_sync()
                 sync['Libraries'] = []
@@ -379,7 +379,7 @@ class Library(threading.Thread):
 
             elif error.status == 'CompanionMissing':
 
-                dialog("ok", heading="{emby}", line1=_(33099))
+                dialog("ok", heading="{jellyfin}", line1=_(33099))
                 settings('kodiCompanion.bool', False)
 
                 return True
@@ -422,7 +422,7 @@ class Library(threading.Thread):
 
                 ''' Inverse yes no, in case the dialog is forced closed by Kodi.
                 '''
-                if dialog("yesno", heading="{emby}", line1=_(33172).replace('{number}', str(total)), nolabel=_(107), yeslabel=_(106)):
+                if dialog("yesno", heading="{jellyfin}", line1=_(33172).replace('{number}', str(total)), nolabel=_(107), yeslabel=_(106)):
                     LOG.warn("Large updates skipped.")
 
                     return True
@@ -482,7 +482,7 @@ class Library(threading.Thread):
         whitelist = [x.replace('Mixed:', "") for x in sync['Whitelist']]
         libraries = []
 
-        with Database('emby') as embydb:
+        with Database('jellyfin') as embydb:
             db = emby_db.EmbyDatabase(embydb.cursor)
 
             if mode in ('SyncLibrarySelection', 'RepairLibrarySelection', 'RemoveLibrarySelection'):
@@ -614,7 +614,7 @@ class UpdatedWorker(threading.Thread):
 
         with self.lock:
             with self.database as kodidb:
-                with Database('emby') as embydb:
+                with Database('jellyfin') as embydb:
 
                     while True:
 
@@ -636,7 +636,7 @@ class UpdatedWorker(threading.Thread):
 
                         self.queue.task_done()
 
-                        if window('emby_should_stop.bool'):
+                        if window('jellyfin_should_stop.bool'):
                             break
 
         LOG.info("--<[ q:updated/%s ]", id(self))
@@ -658,7 +658,7 @@ class UserDataWorker(threading.Thread):
 
         with self.lock:
             with self.database as kodidb:
-                with Database('emby') as embydb:
+                with Database('jellyfin') as embydb:
 
                     while True:
 
@@ -679,7 +679,7 @@ class UserDataWorker(threading.Thread):
 
                         self.queue.task_done()
 
-                        if window('emby_should_stop.bool'):
+                        if window('jellyfin_should_stop.bool'):
                             break
 
         LOG.info("--<[ q:userdata/%s ]", id(self))
@@ -698,7 +698,7 @@ class SortWorker(threading.Thread):
 
     def run(self):
 
-        with Database('emby') as embydb:
+        with Database('jellyfin') as embydb:
             database = emby_db.EmbyDatabase(embydb.cursor)
 
             while True:
@@ -715,14 +715,14 @@ class SortWorker(threading.Thread):
                     items = database.get_media_by_parent_id(item_id)
 
                     if not items:
-                        LOG.info("Could not find media %s in the emby database.", item_id)
+                        LOG.info("Could not find media %s in the jellyfin database.", item_id)
                     else:
                         for item in items:
                             self.output[item[1]].put({'Id': item[0], 'Type': item[1]})
 
                 self.queue.task_done()
 
-                if window('emby_should_stop.bool'):
+                if window('jellyfin_should_stop.bool'):
                     break
 
         LOG.info("--<[ q:sort/%s ]", id(self))
@@ -744,7 +744,7 @@ class RemovedWorker(threading.Thread):
 
         with self.lock:
             with self.database as kodidb:
-                with Database('emby') as embydb:
+                with Database('jellyfin') as embydb:
 
                     while True:
 
@@ -765,7 +765,7 @@ class RemovedWorker(threading.Thread):
 
                         self.queue.task_done()
 
-                        if window('emby_should_stop.bool'):
+                        if window('jellyfin_should_stop.bool'):
                             break
 
         LOG.info("--<[ q:removed/%s ]", id(self))
@@ -796,11 +796,11 @@ class NotifyWorker(threading.Thread):
 
             if time and (not self.player.isPlayingVideo() or xbmc.getCondVisibility('VideoPlayer.Content(livetv)')):
                 dialog("notification", heading="%s %s" % (_(33049), item[0]), message=item[1],
-                       icon="{emby}", time=time, sound=False)
+                       icon="{jellyfin}", time=time, sound=False)
 
             self.queue.task_done()
 
-            if window('emby_should_stop.bool'):
+            if window('jellyfin_should_stop.bool'):
                 break
 
         LOG.info("--<[ q:notify/%s ]", id(self))
diff --git a/resources/lib/monitor.py b/resources/lib/monitor.py
index cbb03f26..2d297abb 100644
--- a/resources/lib/monitor.py
+++ b/resources/lib/monitor.py
@@ -22,7 +22,7 @@ from webservice import WebService
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
@@ -114,7 +114,7 @@ class Monitor(xbmc.Monitor):
                 except Exception as error:
 
                     LOG.error(error)
-                    dialog("ok", heading="{emby}", line1=_(33142))
+                    dialog("ok", heading="{jellyfin}", line1=_(33142))
 
                     return
 
@@ -272,8 +272,8 @@ class Monitor(xbmc.Monitor):
 
     def void_responder(self, data, result):
 
-        window('emby_%s.json' % data['VoidName'], result)
-        LOG.debug("--->[ nostromo/emby_%s.json ] sent", data['VoidName'])
+        window('jellyfin_%s.json' % data['VoidName'], result)
+        LOG.debug("--->[ nostromo/jellyfin_%s.json ] sent", data['VoidName'])
 
     def server_instance(self, server_id=None):
 
@@ -323,7 +323,7 @@ class Monitor(xbmc.Monitor):
         ''' Setup additional users images.
         '''
         for i in range(10):
-            window('EmbyAdditionalUserImage.%s' % i, clear=True)
+            window('JellyfinAdditionalUserImage.%s' % i, clear=True)
 
         try:
             session = server['api'].get_device(self.device_id)
@@ -336,12 +336,12 @@ class Monitor(xbmc.Monitor):
 
             info = server['api'].get_user(user['UserId'])
             image = api.API(info, server['config/auth.server']).get_user_artwork(user['UserId'])
-            window('EmbyAdditionalUserImage.%s' % index, image)
-            window('EmbyAdditionalUserPosition.%s' % user['UserId'], str(index))
+            window('JellyfinAdditionalUserImage.%s' % index, image)
+            window('JellyfinAdditionalUserPosition.%s' % user['UserId'], str(index))
 
     def playstate(self, data):
 
-        ''' Emby playstate updates.
+        ''' Jellyfin playstate updates.
         '''
         command = data['Command']
         actions = {
@@ -367,7 +367,7 @@ class Monitor(xbmc.Monitor):
 
     def general_commands(self, data):
 
-        ''' General commands from Emby to control the Kodi interface.
+        ''' General commands from Jellyfin to control the Kodi interface.
         '''
         command = data['Name']
         args = data['Arguments']
@@ -392,7 +392,7 @@ class Monitor(xbmc.Monitor):
 
         elif command == 'DisplayMessage':
             dialog("notification", heading=args['Header'], message=args['Text'],
-                   icon="{emby}", time=int(settings('displayMessage'))*1000)
+                   icon="{jellyfin}", time=int(settings('displayMessage'))*1000)
 
         elif command == 'SendString':
             JSONRPC('Input.SendText').execute({'text': args['String'], 'done': False})
diff --git a/resources/lib/objects/actions.py b/resources/lib/objects/actions.py
index b439dbd3..cdd92dad 100644
--- a/resources/lib/objects/actions.py
+++ b/resources/lib/objects/actions.py
@@ -23,7 +23,7 @@ from utils import get_play_action
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
@@ -89,8 +89,8 @@ class Actions(object):
             Detect the seektime for video type content.
             Verify the default video action set in Kodi for accurate resume behavior.
         '''
-        seektime = window('emby.resume.bool')
-        window('emby.resume', clear=True)
+        seektime = window('jellyfin.resume.bool')
+        window('jellyfin.resume', clear=True)
 
         if item['MediaType'] in ('Video', 'Audio'):
             resume = item['UserData'].get('PlaybackPositionTicks')
@@ -128,7 +128,7 @@ class Actions(object):
 
             if settings('askCinema') == "true":
 
-                resp = dialog("yesno", heading="{emby}", line1=_(33016))
+                resp = dialog("yesno", heading="{jellyfin}", line1=_(33016))
                 if not resp:
 
                     enabled = False
@@ -148,7 +148,7 @@ class Actions(object):
 
                     self.stack.append([intro['PlaybackInfo']['Path'], listitem])
 
-                window('emby.skip.%s' % intro['Id'], value="true")
+                window('jellyfin.skip.%s' % intro['Id'], value="true")
 
     def _set_additional_parts(self, item_id):
 
@@ -659,7 +659,7 @@ class Actions(object):
         LOG.info("Resume dialog called.")
         XML_PATH = (xbmcaddon.Addon('plugin.video.jellyfin').getAddonInfo('path'), "default", "1080i")
 
-        dialog = resume.ResumeDialog("script-emby-resume.xml", *XML_PATH)
+        dialog = resume.ResumeDialog("script-jellyfin-resume.xml", *XML_PATH)
         dialog.set_resume_point("Resume from %s" % str(timedelta(seconds=seektime)).split(".")[0])
         dialog.doModal()
 
@@ -721,14 +721,14 @@ def on_update(data, server):
 
     if item:
 
-        if not window('emby.skip.%s.bool' % item[0]):
+        if not window('jellyfin.skip.%s.bool' % item[0]):
             server['api'].item_played(item[0], playcount)
 
-        window('emby.skip.%s' % item[0], clear=True)
+        window('jellyfin.skip.%s' % item[0], clear=True)
 
 def on_play(data, server):
 
-    ''' Setup progress for emby playback.
+    ''' Setup progress for jellyfin playback.
     '''
     player = xbmc.Player()
 
@@ -781,7 +781,7 @@ def special_listener():
     '''
     player = xbmc.Player()
     isPlaying = player.isPlaying()
-    count = int(window('emby.external_count') or 0)
+    count = int(window('jellyfin.external_count') or 0)
 
     if (not isPlaying and xbmc.getCondVisibility('Window.IsVisible(DialogContextMenu.xml)') and
         xbmc.getInfoLabel('Control.GetLabel(1002)') == xbmc.getLocalizedString(12021)):
@@ -791,24 +791,24 @@ def special_listener():
         if control == 1002: # Start from beginning
 
             LOG.info("Resume dialog: Start from beginning selected.")
-            window('emby.resume.bool', False)
+            window('jellyfin.resume.bool', False)
         else:
             LOG.info("Resume dialog: Resume selected.")
-            window('emby.resume.bool', True)
+            window('jellyfin.resume.bool', True)
 
-    elif isPlaying and not window('emby.external_check'):
+    elif isPlaying and not window('jellyfin.external_check'):
         time = player.getTime()
 
         if time > 1: # Not external player.
 
-            window('emby.external_check', value="true")
-            window('emby.external_count', value="0")
+            window('jellyfin.external_check', value="true")
+            window('jellyfin.external_count', value="0")
         elif count == 120:
 
             LOG.info("External player detected.")
-            window('emby.external.bool', True)
-            window('emby.external_check.bool', True)
-            window('emby.external_count', value="0")
+            window('jellyfin.external.bool', True)
+            window('jellyfin.external_check.bool', True)
+            window('jellyfin.external_count', value="0")
 
         elif time == 0:
-            window('emby.external_count', value=str(count + 1))
+            window('jellyfin.external_count', value=str(count + 1))
diff --git a/resources/lib/objects/kodi/artwork.py b/resources/lib/objects/kodi/artwork.py
index 15144e99..6e5412d7 100644
--- a/resources/lib/objects/kodi/artwork.py
+++ b/resources/lib/objects/kodi/artwork.py
@@ -17,7 +17,7 @@ import requests
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
@@ -247,7 +247,7 @@ from __objs__ import QU
 
 ##################################################################################################
 
-log = logging.getLogger("EMBY."+__name__)
+log = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
@@ -278,7 +278,7 @@ class Artwork(object):
         # This method will sync all Kodi artwork to textures13.db
         # and cache them locally. This takes diskspace!
         if not dialog(type_="yesno",
-                      heading="{emby}",
+                      heading="{jellyfin}",
                       line1=_(33042)):
             return
 
@@ -288,7 +288,7 @@ class Artwork(object):
         pdialog.create(_(29999), _(33043))
 
         # ask to rest all existing or not
-        if dialog(type_="yesno", heading="{emby}", line1=_(33044)):
+        if dialog(type_="yesno", heading="{jellyfin}", line1=_(33044)):
             log.info("Resetting all cache data first")
             self.delete_cache()
 
diff --git a/resources/lib/objects/kodi/kodi.py b/resources/lib/objects/kodi/kodi.py
index 81e9078d..845d3ff9 100644
--- a/resources/lib/objects/kodi/kodi.py
+++ b/resources/lib/objects/kodi/kodi.py
@@ -12,7 +12,7 @@ from helper import values
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
diff --git a/resources/lib/objects/kodi/movies.py b/resources/lib/objects/kodi/movies.py
index e2600a75..a01f7fe1 100644
--- a/resources/lib/objects/kodi/movies.py
+++ b/resources/lib/objects/kodi/movies.py
@@ -9,7 +9,7 @@ import queries as QU
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
diff --git a/resources/lib/objects/kodi/music.py b/resources/lib/objects/kodi/music.py
index 3e1db882..5402a3b5 100644
--- a/resources/lib/objects/kodi/music.py
+++ b/resources/lib/objects/kodi/music.py
@@ -9,7 +9,7 @@ from kodi import Kodi
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
diff --git a/resources/lib/objects/kodi/musicvideos.py b/resources/lib/objects/kodi/musicvideos.py
index 50b8e91d..5e8f7e54 100644
--- a/resources/lib/objects/kodi/musicvideos.py
+++ b/resources/lib/objects/kodi/musicvideos.py
@@ -9,7 +9,7 @@ from kodi import Kodi
 
 ##################################################################################################
 
-log = logging.getLogger("EMBY."+__name__)
+log = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
diff --git a/resources/lib/objects/kodi/queries.py b/resources/lib/objects/kodi/queries.py
index d2c37110..2678cd75 100644
--- a/resources/lib/objects/kodi/queries.py
+++ b/resources/lib/objects/kodi/queries.py
@@ -1,5 +1,5 @@
 
-''' Queries for the Kodi database. obj reflect key/value to retrieve from emby items.
+''' Queries for the Kodi database. obj reflect key/value to retrieve from jellyfin items.
     Some functions require additional information, therefore obj do not always reflect
     the Kodi database query values.
 '''
diff --git a/resources/lib/objects/kodi/tvshows.py b/resources/lib/objects/kodi/tvshows.py
index 8da80f00..35ee64c1 100644
--- a/resources/lib/objects/kodi/tvshows.py
+++ b/resources/lib/objects/kodi/tvshows.py
@@ -9,7 +9,7 @@ from kodi import Kodi
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
diff --git a/resources/lib/objects/movies.py b/resources/lib/objects/movies.py
index c49c587c..426a3e7f 100644
--- a/resources/lib/objects/movies.py
+++ b/resources/lib/objects/movies.py
@@ -14,7 +14,7 @@ from helper import api, catch, stop, validate, emby_item, library_check, values,
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
@@ -320,7 +320,7 @@ class Movies(KodiDb):
     @emby_item()
     def remove(self, item_id, e_item):
 
-        ''' Remove movieid, fileid, emby reference.
+        ''' Remove movieid, fileid, jellyfin reference.
             Remove artwork, boxset
         '''
         obj = {'Id': item_id}
diff --git a/resources/lib/objects/music.py b/resources/lib/objects/music.py
index a80b0d33..fe0fd428 100644
--- a/resources/lib/objects/music.py
+++ b/resources/lib/objects/music.py
@@ -14,7 +14,7 @@ from helper import api, catch, stop, validate, emby_item, values, library_check,
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
@@ -103,7 +103,7 @@ class Music(KodiDb):
         
         ''' Add object to kodi.
 
-            safety checks: It looks like Emby supports the same artist multiple times.
+            safety checks: It looks like Jellyfin supports the same artist multiple times.
             Kodi doesn't allow that. In case that happens we just merge the artist entries.
         '''
         obj['ArtistId'] = self.get(*values(obj, QU.get_artist_obj))
@@ -203,7 +203,7 @@ class Music(KodiDb):
     def artist_link(self, obj):
 
         ''' Assign main artists to album.
-            Artist does not exist in emby database, create the reference.
+            Artist does not exist in jellyfin database, create the reference.
         '''
         for artist in (obj['AlbumArtists'] or []):
 
@@ -392,7 +392,7 @@ class Music(KodiDb):
     def song_artist_link(self, obj):
         
         ''' Assign main artists to song.
-            Artist does not exist in emby database, create the reference.
+            Artist does not exist in jellyfin database, create the reference.
         '''
         for index, artist in enumerate(obj['ArtistItems'] or []):
 
@@ -533,7 +533,7 @@ class Music(KodiDb):
     @emby_item()
     def get_child(self, item_id, e_item):
 
-        ''' Get all child elements from tv show emby id.
+        ''' Get all child elements from tv show jellyfin id.
         '''
         obj = {'Id': item_id}
         child = []
diff --git a/resources/lib/objects/musicvideos.py b/resources/lib/objects/musicvideos.py
index 1dc536e6..69b55189 100644
--- a/resources/lib/objects/musicvideos.py
+++ b/resources/lib/objects/musicvideos.py
@@ -14,7 +14,7 @@ from helper import api, catch, stop, validate, library_check, emby_item, values,
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
@@ -51,7 +51,7 @@ class MusicVideos(KodiDb):
         ''' If item does not exist, entry will be added.
             If item exists, entry will be updated.
 
-            If we don't get the track number from Emby, see if we can infer it
+            If we don't get the track number from Jellyfin, see if we can infer it
             from the sortname attribute.
         '''
         API = api.API(item, self.server['auth/server-address'])
@@ -220,7 +220,7 @@ class MusicVideos(KodiDb):
     @emby_item()
     def remove(self, item_id, e_item):
 
-        ''' Remove mvideoid, fileid, pathid, emby reference. 
+        ''' Remove mvideoid, fileid, pathid, jellyfin reference. 
         '''
         obj = {'Id': item_id}
 
diff --git a/resources/lib/objects/obj.py b/resources/lib/objects/obj.py
index e5f76964..16b0a34e 100644
--- a/resources/lib/objects/obj.py
+++ b/resources/lib/objects/obj.py
@@ -8,7 +8,7 @@ import os
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
@@ -37,7 +37,7 @@ class Objects(object):
         ''' Syntax to traverse the item dictionary.
             This of the query almost as a url.
 
-            Item is the Emby item json object structure
+            Item is the Jellyfin item json object structure
 
             ",": each element will be used as a fallback until a value is found.
             "?": split filters and key name from the query part, i.e. MediaSources/0?$Name
diff --git a/resources/lib/objects/obj_map.json b/resources/lib/objects/obj_map.json
index 420c0120..f2ff9d15 100644
--- a/resources/lib/objects/obj_map.json
+++ b/resources/lib/objects/obj_map.json
@@ -2,7 +2,7 @@
 	"video": "special://database/MyVideos107.db",
 	"music": "special://database/MyMusic60.db",
 	"texture": "special://database/Textures13.db",
-	"emby": "special://database/emby.db",
+	"jellyfin": "special://database/jellyfin.db",
 	"MovieProviderName": "imdb",
 	"Movie": {
 		"Id": "Id",
@@ -40,7 +40,7 @@
 		"Audio": "MediaSources/0/MediaStreams:?Type=Audio",
 		"Video": "MediaSources/0/MediaStreams:?Type=Video",
 		"Container": "MediaSources/0/Container",
-		"EmbyParentId": "ParentId",
+		"JellyfinParentId": "ParentId",
 		"CriticRating": "CriticRating"
 	},
 	"MovieUserData": {
@@ -77,7 +77,7 @@
 		"Tags": "Tags",
 		"Favorite": "UserData/IsFavorite",
 		"RecursiveCount": "RecursiveItemCount",
-		"EmbyParentId": "ParentId",
+		"JellyfinParentId": "ParentId",
 		"Status": "Status"
 	},
 	"Season": {
@@ -119,7 +119,7 @@
 		"Video": "MediaSources/0/MediaStreams:?Type=Video",
 		"Container": "MediaSources/0/Container",
 		"Location": "LocationType",
-		"EmbyParentId": "SeriesId,ParentId"
+		"JellyfinParentId": "SeriesId,ParentId"
 	},
 	"EpisodeUserData": {
 		"Id": "Id",
@@ -160,7 +160,7 @@
 		"Played": "UserData/Played",
 		"Favorite": "UserData/IsFavorite",
 		"Directors": "People:?Type=Director$Name",
-		"EmbyParentId": "ParentId"
+		"JellyfinParentId": "ParentId"
 	},
 	"MusicVideoUserData": {
 		"Id": "Id",
@@ -178,7 +178,7 @@
 		"UniqueId": "ProviderIds/MusicBrainzArtist",
 		"Genres": "Genres",
 		"Bio": "Overview",
-		"EmbyParentId": "ParentId"
+		"JellyfinParentId": "ParentId"
 	},
 	"Album": {
 		"Id": "Id",
@@ -190,7 +190,7 @@
 		"AlbumArtists": "AlbumArtists",
 		"Artists": "AlbumArtists:?$Name",
 		"ArtistItems": "ArtistItems",
-		"EmbyParentId": "ParentId"
+		"JellyfinParentId": "ParentId"
 	},
 	"Song": {
 		"Id": "Id",
@@ -213,7 +213,7 @@
 		"Album": "Album",
 		"SongAlbumId": "AlbumId",
 		"Container": "MediaSources/0/Container",
-		"EmbyParentId": "ParentId"
+		"JellyfinParentId": "ParentId"
 	},
 	"SongUserData": {
 		"Id": "Id",
diff --git a/resources/lib/objects/tvshows.py b/resources/lib/objects/tvshows.py
index d3ab66fb..4d9c0b01 100644
--- a/resources/lib/objects/tvshows.py
+++ b/resources/lib/objects/tvshows.py
@@ -16,7 +16,7 @@ from helper import api, catch, stop, validate, emby_item, library_check, setting
 
 ##################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 ##################################################################################################
 
@@ -512,7 +512,7 @@ class TVShows(KodiDb):
     @emby_item()
     def remove(self, item_id, e_item):
         
-        ''' Remove showid, fileid, pathid, emby reference.
+        ''' Remove showid, fileid, pathid, jellyfin reference.
             There's no episodes left, delete show and any possible remaining seasons
         '''
         obj = {'Id': item_id}
@@ -614,7 +614,7 @@ class TVShows(KodiDb):
     @emby_item()
     def get_child(self, item_id, e_item):
 
-        ''' Get all child elements from tv show emby id.
+        ''' Get all child elements from tv show jellyfin id.
         '''
         obj = {'Id': item_id}
         child = []
diff --git a/resources/lib/objects/utils.py b/resources/lib/objects/utils.py
index f952d631..9f3b5052 100644
--- a/resources/lib/objects/utils.py
+++ b/resources/lib/objects/utils.py
@@ -8,7 +8,7 @@ from helper import JSONRPC
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
diff --git a/resources/lib/player.py b/resources/lib/player.py
index 277b50d8..aadc60ec 100644
--- a/resources/lib/player.py
+++ b/resources/lib/player.py
@@ -15,7 +15,7 @@ from emby import Emby
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
@@ -43,7 +43,7 @@ class Player(xbmc.Player):
 
         ''' We may need to wait for info to be set in kodi monitor.
             Accounts for scenario where Kodi starts playback and exits immediately.
-            First, ensure previous playback terminated correctly in Emby.
+            First, ensure previous playback terminated correctly in Jellyfin.
         '''
         self.stop_playback()
         self.up_next = False
@@ -69,7 +69,7 @@ class Player(xbmc.Player):
 
                 return
 
-        items = window('emby_play.json')
+        items = window('jellyfin_play.json')
         item = None
 
         while not items:
@@ -77,11 +77,11 @@ class Player(xbmc.Player):
             if monitor.waitForAbort(2):
                 return
 
-            items = window('emby_play.json')
+            items = window('jellyfin_play.json')
             count += 1
 
             if count == 20:
-                LOG.info("Could not find emby prop...")
+                LOG.info("Could not find jellyfin prop...")
 
                 return
 
@@ -93,7 +93,7 @@ class Player(xbmc.Player):
         else:
             item = items.pop(0)
 
-        window('emby_play.json', items)
+        window('jellyfin_play.json', items)
 
         self.set_item(current_file, item)
         data = {
@@ -111,7 +111,7 @@ class Player(xbmc.Player):
             'SubtitleStreamIndex': item['SubtitleStreamIndex']
         }
         item['Server']['api'].session_playing(data)
-        window('emby.skip.%s.bool' % item['Id'], True)
+        window('jellyfin.skip.%s.bool' % item['Id'], True)
 
         if monitor.waitForAbort(2):
             return
@@ -302,7 +302,7 @@ class Player(xbmc.Player):
 
     def report_playback(self, report=True):
 
-        ''' Report playback progress to emby server.
+        ''' Report playback progress to jellyfin server.
             Check if the user seek.
         '''
         current_file = self.get_playing_file()
@@ -312,7 +312,7 @@ class Player(xbmc.Player):
 
         item = self.get_file_info(current_file)
 
-        if window('emby.external.bool'):
+        if window('jellyfin.external.bool'):
             return
 
         if not report:
@@ -365,7 +365,7 @@ class Player(xbmc.Player):
         
         ''' Will be called when user stops playing a file.
         '''
-        window('emby_play', clear=True)
+        window('jellyfin_play', clear=True)
         self.stop_playback()
         LOG.info("--<[ playback ]")
 
@@ -388,10 +388,10 @@ class Player(xbmc.Player):
         for file in self.played:
             item = self.get_file_info(file)
 
-            window('emby.skip.%s.bool' % item['Id'], True)
+            window('jellyfin.skip.%s.bool' % item['Id'], True)
 
-            if window('emby.external.bool'):
-                window('emby.external', clear=True)
+            if window('jellyfin.external.bool'):
+                window('jellyfin.external', clear=True)
 
                 if int(item['CurrentPosition']) == 1:
                     item['CurrentPosition'] = int(item['Runtime'])
@@ -442,6 +442,6 @@ class Player(xbmc.Player):
                     if dialog("yesno", heading=_(30091), line1=_(33015), autoclose=120000):
                         item['Server']['api'].delete_item(item['Id'])
 
-            window('emby.external_check', clear=True)
+            window('jellyfin.external_check', clear=True)
 
         self.played.clear()
diff --git a/resources/lib/setup.py b/resources/lib/setup.py
index 6701ecbc..001161ad 100644
--- a/resources/lib/setup.py
+++ b/resources/lib/setup.py
@@ -10,7 +10,7 @@ from helper import _, settings, dialog, JSONRPC, compare_version
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
@@ -42,7 +42,7 @@ class Setup(object):
                 if not self.get_web_server():
 
                     settings('enableTextureCache.bool', False)
-                    dialog("ok", heading="{emby}", line1=_(33103))
+                    dialog("ok", heading="{jellyfin}", line1=_(33103))
                     
                     return
 
@@ -105,24 +105,24 @@ class Setup(object):
         settings('useDirectPaths', value="1" if value else "0")
 
         if value:
-            dialog("ok", heading="{emby}", line1=_(33145))
+            dialog("ok", heading="{jellyfin}", line1=_(33145))
 
     def _is_artwork_caching(self):
 
-        value = dialog("yesno", heading="{emby}", line1=_(33117))
+        value = dialog("yesno", heading="{jellyfin}", line1=_(33117))
         settings('enableTextureCache.bool', value)
 
     def _is_empty_shows(self):
 
-        value = dialog("yesno", heading="{emby}", line1=_(33100))
+        value = dialog("yesno", heading="{jellyfin}", line1=_(33100))
         settings('syncEmptyShows.bool', value)
 
     def _is_rotten_tomatoes(self):
 
-        value = dialog("yesno", heading="{emby}", line1=_(33188))
+        value = dialog("yesno", heading="{jellyfin}", line1=_(33188))
         settings('syncRottenTomatoes.bool', value)
 
     def _is_music(self):
 
-        value = dialog("yesno", heading="{emby}", line1=_(33039))
+        value = dialog("yesno", heading="{jellyfin}", line1=_(33039))
         settings('enableMusic.bool', value=value)
diff --git a/resources/lib/views.py b/resources/lib/views.py
index 7b39ea2a..d7899cc1 100644
--- a/resources/lib/views.py
+++ b/resources/lib/views.py
@@ -19,7 +19,7 @@ from emby import Emby
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 NODES = {
     'tvshows': [
         ('all', None),
@@ -148,16 +148,16 @@ class Views(object):
 
     def add_library(self, view):
 
-        ''' Add entry to view table in emby database.
+        ''' Add entry to view table in jellyfin database.
         '''
-        with Database('emby') as embydb:
+        with Database('jellyfin') as embydb:
             emby_db.EmbyDatabase(embydb.cursor).add_view(view['Id'], view['Name'], view['Media'])
 
     def remove_library(self, view_id):
 
-        ''' Remove entry from view table in emby database.
+        ''' Remove entry from view table in jellyfin database.
         '''
-        with Database('emby') as embydb:
+        with Database('jellyfin') as embydb:
             emby_db.EmbyDatabase(embydb.cursor).remove_view(view_id)
 
         self.delete_playlist_by_id(view_id)
@@ -203,7 +203,7 @@ class Views(object):
 
             self.add_library(library)
 
-        with Database('emby') as embydb:
+        with Database('jellyfin') as embydb:
 
             views = emby_db.EmbyDatabase(embydb.cursor).get_views()
             removed = []
@@ -226,7 +226,7 @@ class Views(object):
         playlist_path = xbmc.translatePath("special://profile/playlists/video").decode('utf-8')
         index = 0
 
-        with Database('emby') as embydb:
+        with Database('jellyfin') as embydb:
             db = emby_db.EmbyDatabase(embydb.cursor)
 
             for library in self.sync['Whitelist']:
@@ -268,7 +268,7 @@ class Views(object):
 
         ''' Create or update the xps file.
         '''
-        file = os.path.join(path, "emby%s%s.xsp" % (view['Media'], view['Id']))
+        file = os.path.join(path, "jellyfin%s%s.xsp" % (view['Media'], view['Id']))
 
         try:
             xml = etree.parse(file).getroot()
@@ -297,7 +297,7 @@ class Views(object):
 
         ''' Create or update the video node file.
         '''
-        folder = os.path.join(path, "emby%s%s" % (view['Media'], view['Id']))
+        folder = os.path.join(path, "jellyfin%s%s" % (view['Media'], view['Id']))
 
         if not xbmcvfs.exists(folder):
             xbmcvfs.mkdir(folder)
@@ -311,7 +311,7 @@ class Views(object):
 
     def add_single_node(self, path, index, item_type, view):
 
-        file = os.path.join(path, "emby_%s.xml" % view['Tag'].replace(" ", ""))
+        file = os.path.join(path, "jellyfin_%s.xml" % view['Tag'].replace(" ", ""))
 
         try:
             xml = etree.parse(file).getroot()
@@ -657,7 +657,7 @@ class Views(object):
 
     def order_media_folders(self, folders):
 
-        ''' Returns a list of sorted media folders based on the Emby views.
+        ''' Returns a list of sorted media folders based on the Jellyfin views.
             Insert them in SortedViews and remove Views that are not in media folders.
         '''
         if not folders:
@@ -677,12 +677,12 @@ class Views(object):
     def window_nodes(self):
 
         ''' Just read from the database and populate based on SortedViews
-            Setup the window properties that reflect the emby server views and more.
+            Setup the window properties that reflect the jellyfin server views and more.
         '''
         self.window_clear()
-        self.window_clear('Emby.wnodes')
+        self.window_clear('Jellyfin.wnodes')
 
-        with Database('emby') as embydb:
+        with Database('jellyfin') as embydb:
             libraries = emby_db.EmbyDatabase(embydb.cursor).get_views()
 
         libraries = self.order_media_folders(libraries or [])
@@ -743,8 +743,8 @@ class Views(object):
             self.window_single_node(index, "favorites", single)
             index += 1
 
-        window('Emby.nodes.total', str(index))
-        window('Emby.wnodes.total', str(windex))
+        window('Jellyfin.nodes.total', str(index))
+        window('Jellyfin.wnodes.total', str(windex))
 
     def window_node(self, index, view, node=None, node_label=None):
 
@@ -773,17 +773,17 @@ class Views(object):
 
         if node in ('all', 'music'):
 
-            window_prop = "Emby.nodes.%s" % index
+            window_prop = "Jellyfin.nodes.%s" % index
             window('%s.index' % window_prop, path.replace('all.xml', "")) # dir
             window('%s.title' % window_prop, view['Name'].encode('utf-8'))
             window('%s.content' % window_prop, path)
 
         elif node == 'browse':
 
-            window_prop = "Emby.nodes.%s" % index
+            window_prop = "Jellyfin.nodes.%s" % index
             window('%s.title' % window_prop, view['Name'].encode('utf-8'))
         else:
-            window_prop = "Emby.nodes.%s.%s" % (index, node)
+            window_prop = "Jellyfin.nodes.%s.%s" % (index, node)
             window('%s.title' % window_prop, node_label.encode('utf-8'))
             window('%s.content' % window_prop, path)
 
@@ -796,10 +796,10 @@ class Views(object):
 
         ''' Single destination node.
         '''
-        path = "library://video/emby_%s.xml" % view['Tag'].replace(" ", "")
+        path = "library://video/jellyfin_%s.xml" % view['Tag'].replace(" ", "")
         window_path = "ActivateWindow(Videos,%s,return)" % path
 
-        window_prop = "Emby.nodes.%s" % index
+        window_prop = "Jellyfin.nodes.%s" % index
         window('%s.title' % window_prop, view['Name'])
         window('%s.path' % window_prop, window_path)
         window('%s.content' % window_prop, path)
@@ -825,18 +825,18 @@ class Views(object):
 
         if node == 'all':
 
-            window_prop = "Emby.wnodes.%s" % index
+            window_prop = "Jellyfin.wnodes.%s" % index
             window('%s.index' % window_prop, path.replace('all.xml', "")) # dir
             window('%s.title' % window_prop, view['Name'].encode('utf-8'))
             window('%s.content' % window_prop, path)
 
         elif node == 'browse':
 
-            window_prop = "Emby.wnodes.%s" % index
+            window_prop = "Jellyfin.wnodes.%s" % index
             window('%s.title' % window_prop, view['Name'].encode('utf-8'))
             window('%s.content' % window_prop, path)
         else:
-            window_prop = "Emby.wnodes.%s.%s" % (index, node)
+            window_prop = "Jellyfin.wnodes.%s.%s" % (index, node)
             window('%s.title' % window_prop, node_label.encode('utf-8'))
             window('%s.content' % window_prop, path)
 
@@ -865,7 +865,7 @@ class Views(object):
                 window('%s.artwork' % prop, clear=True)
 
     def window_path(self, view, node):
-        return "library://video/emby%s%s/%s.xml" % (view['Media'], view['Id'], node)
+        return "library://video/jellyfin%s%s/%s.xml" % (view['Media'], view['Id'], node)
 
     def window_music(self, view):
         return "library://music/"
@@ -898,7 +898,7 @@ class Views(object):
 
         ''' Clearing window prop setup for Views.
         '''
-        total = int(window((name or 'Emby.nodes') + '.total') or 0)
+        total = int(window((name or 'Jellyfin.nodes') + '.total') or 0)
         props = [
 
             "index","id","path","artwork","title","content","type"
@@ -914,10 +914,10 @@ class Views(object):
         ]
         for i in range(total):
             for prop in props:
-                window('Emby.nodes.%s.%s' % (str(i), prop), clear=True)
+                window('Jellyfin.nodes.%s.%s' % (str(i), prop), clear=True)
 
         for prop in props:
-            window('Emby.nodes.%s' % prop, clear=True)
+            window('Jellyfin.nodes.%s' % prop, clear=True)
 
     def delete_playlist(self, path):
 
@@ -926,12 +926,12 @@ class Views(object):
 
     def delete_playlists(self):
 
-        ''' Remove all emby playlists.
+        ''' Remove all jellyfin playlists.
         '''
         path = xbmc.translatePath("special://profile/playlists/video/").decode('utf-8')
         _, files = xbmcvfs.listdir(path)
         for file in files:
-            if file.decode('utf-8').startswith('emby'):
+            if file.decode('utf-8').startswith('jellyfin'):
                 self.delete_playlist(os.path.join(path, file.decode('utf-8')))
 
     def delete_playlist_by_id(self, view_id):
@@ -943,7 +943,7 @@ class Views(object):
         for file in files:
             file = file.decode('utf-8')
 
-            if file.startswith('emby') and file.endswith('%s.xsp' % view_id):
+            if file.startswith('jellyfin') and file.endswith('%s.xsp' % view_id):
                 self.delete_playlist(os.path.join(path, file.decode('utf-8')))
 
     def delete_node(self, path):
@@ -960,12 +960,12 @@ class Views(object):
 
         for file in files:
 
-            if file.startswith('emby'):
+            if file.startswith('jellyfin'):
                 self.delete_node(os.path.join(path, file.decode('utf-8')))
 
         for directory in dirs:
 
-            if directory.startswith('emby'):
+            if directory.startswith('jellyfin'):
                 _, files = xbmcvfs.listdir(os.path.join(path, directory.decode('utf-8')))
 
                 for file in files:
@@ -982,7 +982,7 @@ class Views(object):
 
         for directory in dirs:
 
-            if directory.startswith('emby') and directory.endswith(view_id):
+            if directory.startswith('jellyfin') and directory.endswith(view_id):
                 _, files = xbmcvfs.listdir(os.path.join(path, directory.decode('utf-8')))
 
                 for file in files:
diff --git a/resources/lib/webservice.py b/resources/lib/webservice.py
index 0561d301..99b23c88 100644
--- a/resources/lib/webservice.py
+++ b/resources/lib/webservice.py
@@ -13,7 +13,7 @@ import xbmc
 #################################################################################################
 
 PORT = 57578
-LOG = logging.getLogger("EMBY."+__name__)
+LOG = logging.getLogger("JELLYFIN."+__name__)
 
 #################################################################################################
 
diff --git a/resources/settings.xml b/resources/settings.xml
index 3cec88c2..dff56dec 100644
--- a/resources/settings.xml
+++ b/resources/settings.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
 <settings>
 
-	<category label="29999"><!-- Emby -->
-		<setting label="30003" id="idMethod" type="enum" values="Manual|Emby Connect" default="0" />
+	<category label="29999"><!-- Jellyfin -->
+		<setting label="30003" id="idMethod" type="enum" values="Manual|Jellyfin Connect" default="0" />
 		<setting label="30024" id="username" type="text" default="" visible="eq(-1,0)" />
 		<setting label="30543" id="connectUsername" type="text" default="" visible="!eq(0,) + eq(-2,1)" />
 		<setting label="30600" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=connect)" visible="eq(-3,1) + eq(-1,)" option="close" />
diff --git a/resources/skins/default/1080i/script-emby-connect-login-manual.xml b/resources/skins/default/1080i/script-jellyfin-connect-login-manual.xml
similarity index 100%
rename from resources/skins/default/1080i/script-emby-connect-login-manual.xml
rename to resources/skins/default/1080i/script-jellyfin-connect-login-manual.xml
diff --git a/resources/skins/default/1080i/script-emby-connect-login.xml b/resources/skins/default/1080i/script-jellyfin-connect-login.xml
similarity index 100%
rename from resources/skins/default/1080i/script-emby-connect-login.xml
rename to resources/skins/default/1080i/script-jellyfin-connect-login.xml
diff --git a/resources/skins/default/1080i/script-emby-connect-server-manual.xml b/resources/skins/default/1080i/script-jellyfin-connect-server-manual.xml
similarity index 100%
rename from resources/skins/default/1080i/script-emby-connect-server-manual.xml
rename to resources/skins/default/1080i/script-jellyfin-connect-server-manual.xml
diff --git a/resources/skins/default/1080i/script-emby-connect-server.xml b/resources/skins/default/1080i/script-jellyfin-connect-server.xml
similarity index 100%
rename from resources/skins/default/1080i/script-emby-connect-server.xml
rename to resources/skins/default/1080i/script-jellyfin-connect-server.xml
diff --git a/resources/skins/default/1080i/script-emby-connect-users.xml b/resources/skins/default/1080i/script-jellyfin-connect-users.xml
similarity index 100%
rename from resources/skins/default/1080i/script-emby-connect-users.xml
rename to resources/skins/default/1080i/script-jellyfin-connect-users.xml
diff --git a/resources/skins/default/1080i/script-emby-context.xml b/resources/skins/default/1080i/script-jellyfin-context.xml
similarity index 100%
rename from resources/skins/default/1080i/script-emby-context.xml
rename to resources/skins/default/1080i/script-jellyfin-context.xml
diff --git a/resources/skins/default/1080i/script-emby-resume.xml b/resources/skins/default/1080i/script-jellyfin-resume.xml
similarity index 95%
rename from resources/skins/default/1080i/script-emby-resume.xml
rename to resources/skins/default/1080i/script-jellyfin-resume.xml
index 2d8d591a..0443877b 100644
--- a/resources/skins/default/1080i/script-emby-resume.xml
+++ b/resources/skins/default/1080i/script-jellyfin-resume.xml
@@ -51,8 +51,8 @@
 							<width>100%</width>
 							<height>25</height>
 							<aspectratio align="right">keep</aspectratio>
-							<texture diffuse="user_image.png">$INFO[Window(Home).Property(EmbyUserImage)]</texture>
-							<visible>!String.IsEmpty(Window(Home).Property(EmbyUserImage))</visible>
+							<texture diffuse="user_image.png">$INFO[Window(Home).Property(JellyfinUserImage)]</texture>
+							<visible>!String.IsEmpty(Window(Home).Property(JellyfinUserImage))</visible>
 						</control>
 						<control type="image">
 							<right>20</right>
@@ -60,7 +60,7 @@
 							<height>25</height>
 							<aspectratio align="right">keep</aspectratio>
 							<texture diffuse="user_image.png">userflyoutdefault.png</texture>
-							<visible>String.IsEmpty(Window(Home).Property(EmbyUserImage))</visible>
+							<visible>String.IsEmpty(Window(Home).Property(JellyfinUserImage))</visible>
 						</control>
 					</control>
 					<control type="image">
diff --git a/service.py b/service.py
index 64dfc595..ccd53d0b 100644
--- a/service.py
+++ b/service.py
@@ -16,8 +16,8 @@ import xbmcaddon
 __addon__ = xbmcaddon.Addon(id='plugin.video.jellyfin')
 __base__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'resources', 'lib')).decode('utf-8')
 __libraries__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('path'), 'libraries')).decode('utf-8')
-__pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'emby')).decode('utf-8')
-__cache__ = xbmc.translatePath('special://temp/emby').decode('utf-8')
+__pcache__ = xbmc.translatePath(os.path.join(__addon__.getAddonInfo('profile'), 'jellyfin')).decode('utf-8')
+__cache__ = xbmc.translatePath('special://temp/jellyfin').decode('utf-8')
 
 sys.path.insert(0, __libraries__)
 
@@ -38,7 +38,7 @@ from emby import Emby
 
 #################################################################################################
 
-LOG = logging.getLogger("EMBY.service")
+LOG = logging.getLogger("JELLYFIN.service")
 DELAY = int(settings('startupDelay') if settings('SyncInstallRunDone.bool') else 4 or 0)
 
 #################################################################################################
@@ -85,7 +85,7 @@ if __name__ == "__main__":
     while True:
 
         if not settings('enableAddon.bool'):
-            LOG.warn("Emby for Kodi is not enabled.")
+            LOG.warn("Jellyfin for Kodi is not enabled.")
 
             break
 

From 481ee11301616238907e749174347a051b6a1cb4 Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 14:51:59 +0100
Subject: [PATCH 03/15] Remove Connect

---
 .../resource.language.de_de/strings.po        |   8 -
 .../resource.language.en_gb/strings.po        |   8 -
 .../resource.language.fr_fr/strings.po        |   8 -
 .../resource.language.it_it/strings.po        |   8 -
 .../resource.language.nl_nl/strings.po        |   8 -
 .../resource.language.pl_pl/strings.po        |   8 -
 resources/lib/connect.py                      |  40 +---
 resources/lib/dialogs/__init__.py             |   1 -
 resources/lib/dialogs/loginconnect.py         | 147 -------------
 resources/lib/dialogs/loginmanual.py          |   2 +-
 resources/lib/dialogs/serverconnect.py        |  13 +-
 resources/lib/emby/core/connection_manager.py |  34 ---
 resources/lib/emby/core/ws_client.py          |   2 +-
 resources/lib/entrypoint/service.py           |   3 -
 resources/settings.xml                        |   2 -
 .../1080i/script-jellyfin-connect-login.xml   | 203 ------------------
 .../1080i/script-jellyfin-connect-server.xml  |  20 +-
 17 files changed, 7 insertions(+), 508 deletions(-)
 delete mode 100644 resources/lib/dialogs/loginconnect.py
 delete mode 100644 resources/skins/default/1080i/script-jellyfin-connect-login.xml

diff --git a/resources/language/resource.language.de_de/strings.po b/resources/language/resource.language.de_de/strings.po
index 78a6e0be..13ab68da 100644
--- a/resources/language/resource.language.de_de/strings.po
+++ b/resources/language/resource.language.de_de/strings.po
@@ -352,10 +352,6 @@ msgctxt "#30547"
 msgid "Display message"
 msgstr "Nachricht anzeigen"
 
-msgctxt "#30600"
-msgid "Sign in with Jellyfin Connect"
-msgstr "Mit Jellyfin Connect anmelden"
-
 msgctxt "#30602"
 msgid "Password"
 msgstr "Passwort"
@@ -412,10 +408,6 @@ msgctxt "#30617"
 msgid "Server or port cannot be empty"
 msgstr "Server oder Port muss eingetragen werden"
 
-msgctxt "#30618"
-msgid "Change Jellyfin Connect user"
-msgstr "Jellyfin Connect Benutzer wechseln"
-
 msgctxt "#33000"
 msgid "Welcome"
 msgstr "Willkommen"
diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po
index ce954053..fa95164e 100644
--- a/resources/language/resource.language.en_gb/strings.po
+++ b/resources/language/resource.language.en_gb/strings.po
@@ -346,10 +346,6 @@ msgctxt "#30547"
 msgid "Display message"
 msgstr ""
 
-msgctxt "#30600"
-msgid "Sign in with Jellyfin Connect"
-msgstr ""
-
 msgctxt "#30602"
 msgid "Password"
 msgstr ""
@@ -406,10 +402,6 @@ msgctxt "#30617"
 msgid "Server or port cannot be empty"
 msgstr ""
 
-msgctxt "#30618"
-msgid "Change Jellyfin Connect user"
-msgstr ""
-
 msgctxt "#33000"
 msgid "Welcome"
 msgstr ""
diff --git a/resources/language/resource.language.fr_fr/strings.po b/resources/language/resource.language.fr_fr/strings.po
index 09e453be..fab7aea9 100644
--- a/resources/language/resource.language.fr_fr/strings.po
+++ b/resources/language/resource.language.fr_fr/strings.po
@@ -351,10 +351,6 @@ msgctxt "#30547"
 msgid "Display message"
 msgstr "Afficher le message"
 
-msgctxt "#30600"
-msgid "Sign in with Jellyfin Connect"
-msgstr "S'identifier avec Jellyfin Connect"
-
 msgctxt "#30602"
 msgid "Password"
 msgstr "Mot de passe"
@@ -411,10 +407,6 @@ msgctxt "#30617"
 msgid "Server or port cannot be empty"
 msgstr "Le serveur ou le port ne peuvent pas être vides"
 
-msgctxt "#30618"
-msgid "Change Jellyfin Connect user"
-msgstr "Changer d'utilisateur Jellyfin Connect"
-
 msgctxt "#33000"
 msgid "Welcome"
 msgstr "Bienvenue"
diff --git a/resources/language/resource.language.it_it/strings.po b/resources/language/resource.language.it_it/strings.po
index b5487cec..bb343b1a 100644
--- a/resources/language/resource.language.it_it/strings.po
+++ b/resources/language/resource.language.it_it/strings.po
@@ -350,10 +350,6 @@ msgctxt "#30547"
 msgid "Display message"
 msgstr "Mostra messggio"
 
-msgctxt "#30600"
-msgid "Sign in with Jellyfin Connect"
-msgstr "Accedi con Jellyfin Connect"
-
 msgctxt "#30602"
 msgid "Password"
 msgstr "Password"
@@ -410,10 +406,6 @@ msgctxt "#30617"
 msgid "Server or port cannot be empty"
 msgstr "Server o porta non possono essere vuoti"
 
-msgctxt "#30618"
-msgid "Change Jellyfin Connect user"
-msgstr "Cambia utente Jellyfin Connect"
-
 msgctxt "#33000"
 msgid "Welcome"
 msgstr "Benvenuto"
diff --git a/resources/language/resource.language.nl_nl/strings.po b/resources/language/resource.language.nl_nl/strings.po
index 62f91c10..6b0a83a7 100644
--- a/resources/language/resource.language.nl_nl/strings.po
+++ b/resources/language/resource.language.nl_nl/strings.po
@@ -350,10 +350,6 @@ msgctxt "#30547"
 msgid "Display message"
 msgstr "Melding tonen"
 
-msgctxt "#30600"
-msgid "Sign in with Jellyfin Connect"
-msgstr "Aanmelden met Jellyfin Connect"
-
 msgctxt "#30602"
 msgid "Password"
 msgstr "Wachtwoord"
@@ -410,10 +406,6 @@ msgctxt "#30617"
 msgid "Server or port cannot be empty"
 msgstr "Server of poort kan niet leeg zijn"
 
-msgctxt "#30618"
-msgid "Change Jellyfin Connect user"
-msgstr "Jellyfin Connect gebruiker wijzigen"
-
 msgctxt "#33000"
 msgid "Welcome"
 msgstr "Welkom"
diff --git a/resources/language/resource.language.pl_pl/strings.po b/resources/language/resource.language.pl_pl/strings.po
index 314f76ef..eccb5b3a 100644
--- a/resources/language/resource.language.pl_pl/strings.po
+++ b/resources/language/resource.language.pl_pl/strings.po
@@ -350,10 +350,6 @@ msgctxt "#30547"
 msgid "Display message"
 msgstr "Wyświetl wiadomość"
 
-msgctxt "#30600"
-msgid "Sign in with Jellyfin Connect"
-msgstr "Zaloguj z Jellyfin Connect"
-
 msgctxt "#30602"
 msgid "Password"
 msgstr "Hasło"
@@ -410,10 +406,6 @@ msgctxt "#30617"
 msgid "Server or port cannot be empty"
 msgstr "Nazwa hosta i port nie mogą być puste"
 
-msgctxt "#30618"
-msgid "Change Jellyfin Connect user"
-msgstr "Zmień użytkownika Jellyfin Connect"
-
 msgctxt "#33000"
 msgid "Welcome"
 msgstr "Witaj"
diff --git a/resources/lib/connect.py b/resources/lib/connect.py
index c0525003..f417f3d5 100644
--- a/resources/lib/connect.py
+++ b/resources/lib/connect.py
@@ -12,7 +12,7 @@ import xbmcvfs
 
 import client
 from database import get_credentials, save_credentials
-from dialogs import ServerConnect, UsersConnect, LoginConnect, LoginManual, ServerManual
+from dialogs import ServerConnect, UsersConnect, LoginManual, ServerManual
 from helper import _, settings, addon_id, event, api, dialog, window
 from emby import Emby
 from emby.core.connection_manager import get_server_address, CONNECTION_STATE
@@ -164,8 +164,7 @@ class Connect(object):
             'connect_manager': self.connect_manager,
             'username': user.get('DisplayName', ""),
             'user_image': user.get('ImageUrl'),
-            'servers': state.get('Servers', []),
-            'jellyfin_connect': False if user else True
+            'servers': state.get('Servers', [])
         })
         dialog.doModal()
 
@@ -173,12 +172,6 @@ class Connect(object):
             LOG.debug("Server selected: %s", dialog.get_server())
             return
 
-        elif dialog.is_connect_login():
-            LOG.debug("Login with jellyfin connect")
-            try:
-                self.login_connect()
-            except RuntimeError: pass
-
         elif dialog.is_manual_server():
             LOG.debug("Adding manual server")
             try:
@@ -218,35 +211,6 @@ class Connect(object):
         else:
             raise RuntimeError("Server is not connected")
 
-    def setup_login_connect(self):
-
-        ''' Setup jellyfin connect by itself.
-        '''
-        client = self.get_client()
-        client.set_credentials(get_credentials())
-        manager = client.auth
-
-        try:
-            self.login_connect(manager)
-        except RuntimeError:
-            return
-
-        credentials = client.get_credentials()
-        save_credentials(credentials)
-
-    def login_connect(self, manager=None):
-
-        ''' Return connect user or raise error.
-        '''
-        dialog = LoginConnect("script-jellyfin-connect-login.xml", *XML_PATH)
-        dialog.set_args(**{'connect_manager': manager or self.connect_manager})
-        dialog.doModal()
-
-        if dialog.is_logged_in():
-            return dialog.get_user()
-        else:
-            raise RuntimeError("Connect user is not logged in")
-
     def login(self):
 
         users = self.connect_manager['public-users']
diff --git a/resources/lib/dialogs/__init__.py b/resources/lib/dialogs/__init__.py
index a0208889..5b9b227f 100644
--- a/resources/lib/dialogs/__init__.py
+++ b/resources/lib/dialogs/__init__.py
@@ -1,5 +1,4 @@
 from serverconnect import ServerConnect
 from usersconnect import UsersConnect
-from loginconnect import LoginConnect
 from loginmanual import LoginManual
 from servermanual import ServerManual
diff --git a/resources/lib/dialogs/loginconnect.py b/resources/lib/dialogs/loginconnect.py
deleted file mode 100644
index 04ba48dc..00000000
--- a/resources/lib/dialogs/loginconnect.py
+++ /dev/null
@@ -1,147 +0,0 @@
-# -*- coding: utf-8 -*-
-
-##################################################################################################
-
-import logging
-import os
-
-import xbmcgui
-import xbmcaddon
-
-from helper import _, addon_id, settings, dialog
-
-##################################################################################################
-
-LOG = logging.getLogger("JELLYFIN."+__name__)
-ACTION_PARENT_DIR = 9
-ACTION_PREVIOUS_MENU = 10
-ACTION_BACK = 92
-SIGN_IN = 200
-CANCEL = 201
-ERROR_TOGGLE = 202
-ERROR_MSG = 203
-ERROR = {
-    'Invalid': 1,
-    'Empty': 2
-}
-
-##################################################################################################
-
-
-class LoginConnect(xbmcgui.WindowXMLDialog):
-
-    _user = None
-    error = None
-
-
-    def __init__(self, *args, **kwargs):
-
-        xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
-
-    def set_args(self, **kwargs):
-        # connect_manager, user_image, servers, jellyfin_connect
-        for key, value in kwargs.iteritems():
-            setattr(self, key, value)
-
-    def is_logged_in(self):
-        return True if self._user else False
-
-    def get_user(self):
-        return self._user
-
-
-    def onInit(self):
-
-        self.user_field = self._add_editcontrol(755, 338, 40, 415)
-        self.setFocus(self.user_field)
-        self.password_field = self._add_editcontrol(755, 448, 40, 415, password=1)
-        self.signin_button = self.getControl(SIGN_IN)
-        self.remind_button = self.getControl(CANCEL)
-        self.error_toggle = self.getControl(ERROR_TOGGLE)
-        self.error_msg = self.getControl(ERROR_MSG)
-
-        self.user_field.controlUp(self.remind_button)
-        self.user_field.controlDown(self.password_field)
-        self.password_field.controlUp(self.user_field)
-        self.password_field.controlDown(self.signin_button)
-        self.signin_button.controlUp(self.password_field)
-        self.remind_button.controlDown(self.user_field)
-
-    def onClick(self, control):
-
-        if control == SIGN_IN:
-            # Sign in to jellyfin connect
-            self._disable_error()
-
-            user = self.user_field.getText()
-            password = self.password_field.getText()
-
-            if not user or not password:
-                # Display error
-                self._error(ERROR['Empty'], _('empty_user_pass'))
-                LOG.error("Username or password cannot be null")
-
-            elif self._login(user, password):
-                self.close()
-
-        elif control == CANCEL:
-            # Remind me later
-            self.close()
-
-    def onAction(self, action):
-
-        if (self.error == ERROR['Empty']
-                and self.user_field.getText() and self.password_field.getText()):
-            self._disable_error()
-
-        if action in (ACTION_BACK, ACTION_PARENT_DIR, ACTION_PREVIOUS_MENU):
-            self.close()
-
-    def _add_editcontrol(self, x, y, height, width, password=0):
-
-        media = os.path.join(xbmcaddon.Addon(addon_id()).getAddonInfo('path'), 'resources', 'skins', 'default', 'media')
-        control = xbmcgui.ControlEdit(0, 0, 0, 0,
-                                      label="User",
-                                      font="font13",
-                                      textColor="FF52b54b",
-                                      disabledColor="FF888888",
-                                      focusTexture="-",
-                                      noFocusTexture="-",
-                                      isPassword=password)
-        control.setPosition(x, y)
-        control.setHeight(height)
-        control.setWidth(width)
-
-        self.addControl(control)
-        return control
-
-    def _login(self, username, password):
-
-        result = self.connect_manager['login-connect'](username, password)
-        if result is False:
-            self._error(ERROR['Invalid'], _('invalid_auth'))
-
-            return False
-
-        self._user = result
-        username = result['User']['Name']
-        settings('connectUsername', value=username)
-        settings('idMethod', value="1")
-
-        dialog("notification", heading="{jellyfin}", message="%s %s" % (_(33000), username.decode('utf-8')),
-               icon=result['User'].get('ImageUrl') or "{jellyfin}",
-               time=2000,
-               sound=False)
-
-        return True
-
-    def _error(self, state, message):
-
-        self.error = state
-        self.error_msg.setLabel(message)
-        self.error_toggle.setVisibleCondition('true')
-
-    def _disable_error(self):
-
-        self.error = None
-        self.error_toggle.setVisibleCondition('false')
diff --git a/resources/lib/dialogs/loginmanual.py b/resources/lib/dialogs/loginmanual.py
index 2122089e..2c587861 100644
--- a/resources/lib/dialogs/loginmanual.py
+++ b/resources/lib/dialogs/loginmanual.py
@@ -36,7 +36,7 @@ class LoginManual(xbmcgui.WindowXMLDialog):
         xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
 
     def set_args(self, **kwargs):
-        # connect_manager, user_image, servers, emby_connect
+        # connect_manager, user_image, servers
         for key, value in kwargs.iteritems():
             setattr(self, key, value)
 
diff --git a/resources/lib/dialogs/serverconnect.py b/resources/lib/dialogs/serverconnect.py
index 497abb51..9c05fbe6 100644
--- a/resources/lib/dialogs/serverconnect.py
+++ b/resources/lib/dialogs/serverconnect.py
@@ -24,7 +24,6 @@ CANCEL = 201
 MESSAGE_BOX = 202
 MESSAGE = 203
 BUSY = 204
-EMBY_CONNECT = 205
 MANUAL_SERVER = 206
 
 ##################################################################################################
@@ -45,7 +44,7 @@ class ServerConnect(xbmcgui.WindowXMLDialog):
         xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
 
     def set_args(self, **kwargs):
-        # connect_manager, user_image, servers, jellyfin_connect
+        # connect_manager, user_image, servers
         for key, value in kwargs.iteritems():
             setattr(self, key, value)
 
@@ -76,9 +75,6 @@ class ServerConnect(xbmcgui.WindowXMLDialog):
         if self.user_image is not None:
             self.getControl(USER_IMAGE).setImage(self.user_image)
 
-        if not self.jellyfin_connect: # Change connect user
-            self.getControl(EMBY_CONNECT).setLabel("[B]%s[/B]" % _(30618))
-
         if self.servers:
             self.setFocus(self.list_)
 
@@ -109,12 +105,7 @@ class ServerConnect(xbmcgui.WindowXMLDialog):
 
     def onClick(self, control):
 
-        if control == EMBY_CONNECT:
-            self.connect_manager.clear_data()
-            self._connect_login = True
-            self.close()
-
-        elif control == MANUAL_SERVER:
+        if control == MANUAL_SERVER:
             self._manual_server = True
             self.close()
 
diff --git a/resources/lib/emby/core/connection_manager.py b/resources/lib/emby/core/connection_manager.py
index 64b71687..68411aeb 100644
--- a/resources/lib/emby/core/connection_manager.py
+++ b/resources/lib/emby/core/connection_manager.py
@@ -69,8 +69,6 @@ class ConnectionManager(object):
             return self.connect
         elif key == "login":
             return self.login
-        elif key == "login-connect":
-            return self.login_to_connect
         elif key == "connect-user":
             return self.connect_user()
         elif key == "connect-token":
@@ -159,38 +157,6 @@ class ConnectionManager(object):
 
         return servers
 
-    def login_to_connect(self, username, password):
-
-        if not username:
-            raise AttributeError("username cannot be empty")
-
-        if not password:
-            raise AttributeError("password cannot be empty")
-
-        try:
-            result = self._request_url({
-                'type': "POST",
-                'url': self.get_connect_url("user/authenticate"),
-                'data': {
-                    'nameOrEmail': username,
-                    'password': self._get_connect_password_hash(password)
-                },
-                'dataType': "json"
-            })
-        except Exception as error: # Failed to login
-            LOG.error(error)
-            return False
-        else:
-            credentials = self.credentials.get_credentials()
-            credentials['ConnectAccessToken'] = result['AccessToken']
-            credentials['ConnectUserId'] = result['User']['Id']
-            credentials['ConnectUser'] = result['User']['DisplayName']
-            self.credentials.get_credentials(credentials)
-            # Signed in
-            self._on_connect_user_signin(result['User'])
-
-        return result
-
     def login(self, server, username, password=None, clear=True, options={}):
 
         if not username:
diff --git a/resources/lib/emby/core/ws_client.py b/resources/lib/emby/core/ws_client.py
index f2f52c3a..1784eca7 100644
--- a/resources/lib/emby/core/ws_client.py
+++ b/resources/lib/emby/core/ws_client.py
@@ -82,7 +82,7 @@ class WSClient(threading.Thread):
         message = json.loads(message)
         data = message.get('Data', {})
 
-        if message['MessageType'] in ('RefreshProgress'):
+        if message['MessageType'] in ('RefreshProgress',):
             LOG.debug("Ignoring %s", message)
 
             return
diff --git a/resources/lib/entrypoint/service.py b/resources/lib/entrypoint/service.py
index 270f5b46..f0aa77e8 100644
--- a/resources/lib/entrypoint/service.py
+++ b/resources/lib/entrypoint/service.py
@@ -308,9 +308,6 @@ class Service(xbmc.Monitor):
             self.connect.register(data['Id'])
             xbmc.executebuiltin("Container.Refresh")
 
-        elif method == 'JellyfinConnect':
-            self.connect.setup_login_connect()
-
         elif method == 'AddServer':
 
             self.connect.setup_manual_server()
diff --git a/resources/settings.xml b/resources/settings.xml
index dff56dec..3db34d32 100644
--- a/resources/settings.xml
+++ b/resources/settings.xml
@@ -5,8 +5,6 @@
 		<setting label="30003" id="idMethod" type="enum" values="Manual|Jellyfin Connect" default="0" />
 		<setting label="30024" id="username" type="text" default="" visible="eq(-1,0)" />
 		<setting label="30543" id="connectUsername" type="text" default="" visible="!eq(0,) + eq(-2,1)" />
-		<setting label="30600" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=connect)" visible="eq(-3,1) + eq(-1,)" option="close" />
-		<setting label="30618" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=connect)" visible="eq(-4,1) + !eq(-2,)" option="close" />
 		<setting label="30001" id="serverName" type="text" default="" />
 		<setting label="30000" id="server" type="text" default="" visible="true" />
 		<setting label="33150" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=updateserver)" visible="!eq(-1,)" option="close" />
diff --git a/resources/skins/default/1080i/script-jellyfin-connect-login.xml b/resources/skins/default/1080i/script-jellyfin-connect-login.xml
deleted file mode 100644
index 7fbb8842..00000000
--- a/resources/skins/default/1080i/script-jellyfin-connect-login.xml
+++ /dev/null
@@ -1,203 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<window>
-	<animation type="WindowOpen" reversible="false">
-		<effect type="zoom" start="80" end="100" center="960,540" delay="160" tween="circle" easin="out" time="240" />
-		<effect type="fade" delay="160" end="100" time="240" />
-	</animation>
-	<animation type="WindowClose" reversible="false">
-		<effect type="zoom" start="100" end="80" center="960,540" easing="in" tween="circle" easin="out" time="240" />
-		<effect type="fade" start="100" end="0" time="240" />
-	</animation>
-	<controls>
-		<control type="group">
-			<control type="image">
-				<top>-200</top>
-				<bottom>-200</bottom>
-				<left>-200</left>
-				<right>-200</right>
-				<texture colordiffuse="CC000000">white.png</texture>
-				<aspectratio>stretch</aspectratio>
-				<animation effect="fade" end="100" time="200">WindowOpen</animation>
-				<animation effect="fade" start="100" end="0" time="200">WindowClose</animation>
-			</control>
-			<control type="group">
-				<centerleft>50%</centerleft>
-				<centertop>50%</centertop>
-				<width>470</width>
-				<height>660</height>
-				<control type="group">
-					<top>-30</top>
-					<control type="image">
-						<left>20</left>
-						<width>100%</width>
-						<height>25</height>
-						<texture>logo-white.png</texture>
-						<aspectratio align="left">keep</aspectratio>
-					</control>
-				</control>
-				<control type="image">
-					<width>100%</width>
-					<height>660</height>
-					<texture colordiffuse="ff222326" border="10">dialogs/dialog_back.png</texture>
-				</control>
-				<control type="group">
-					<centerleft>50%</centerleft>
-					<top>10</top>
-					<width>460</width>
-					<height>660</height>
-					<control type="grouplist" id="100">
-						<orientation>vertical</orientation>
-						<itemgap>0</itemgap>
-						<control type="label">
-							<width>100%</width>
-							<height>75</height>
-							<aligny>center</aligny>
-							<textoffsetx>20</textoffsetx>
-							<font>font13</font>
-							<textcolor>white</textcolor>
-							<textshadow>66000000</textshadow>
-							<label>[B]$ADDON[plugin.video.jellyfin 30612][/B]</label>
-						</control>
-						<control type="group" id="101">
-							<height>110</height>
-							<control type="label">
-								<label>$ADDON[plugin.video.jellyfin 30024]</label>
-								<textcolor>ffe1e1e1</textcolor>
-								<shadowcolor>66000000</shadowcolor>
-								<font>font12</font>
-								<aligny>top</aligny>
-								<textoffsetx>20</textoffsetx>
-							</control>
-							<control type="label">
-								<height>50</height>
-							</control>
-							<control type="image">
-								<left>20</left>
-								<right>20</right>
-								<height>1</height>
-								<top>90</top>
-								<texture colordiffuse="ff525252">white.png</texture>
-							</control>
-						</control>
-						<control type="group" id="102">
-							<height>110</height>
-							<control type="label">
-								<label>$ADDON[plugin.video.jellyfin 30602]</label>
-								<textcolor>ffe1e1e1</textcolor>
-								<textshadow>66000000</textshadow>
-								<font>font12</font>
-								<aligny>top</aligny>
-								<textoffsetx>20</textoffsetx>
-							</control>
-							<control type="label">
-								<height>50</height>
-							</control>
-							<control type="image">
-								<description>separator</description>
-								<left>20</left>
-								<right>20</right>
-								<height>1</height>
-								<top>90</top>
-								<texture colordiffuse="ff525252">white.png</texture>
-							</control>
-						</control>
-						<control type="button" id="200">
-							<label>[B]$ADDON[plugin.video.jellyfin 30605][/B]</label>
-							<width>426</width>
-							<height>65</height>
-							<font>font13</font>
-							<textcolor>ffe1e1e1</textcolor>
-							<focusedcolor>white</focusedcolor>
-							<selectedcolor>ffe1e1e1</selectedcolor>
-							<shadowcolor>66000000</shadowcolor>
-							<textoffsetx>20</textoffsetx>
-							<aligny>center</aligny>
-							<align>center</align>
-							<texturefocus border="10" colordiffuse="ff52b54b">buttons/shadow_smallbutton.png</texturefocus>
-							<texturenofocus border="10" colordiffuse="ff464646">buttons/shadow_smallbutton.png</texturenofocus>
-							<pulseonselect>no</pulseonselect>
-							<animation effect="slide" time="0" end="17,0" condition="true">Conditional</animation>
-						</control>
-						<control type="button" id="201">
-							<label>[B]$ADDON[plugin.video.jellyfin 30606][/B]</label>
-							<width>426</width>
-							<height>65</height>
-							<font>font13</font>
-							<textcolor>ffe1e1e1</textcolor>
-							<focusedcolor>white</focusedcolor>
-							<selectedcolor>ffe1e1e1</selectedcolor>
-							<shadowcolor>66000000</shadowcolor>
-							<textoffsetx>20</textoffsetx>
-							<aligny>center</aligny>
-							<align>center</align>
-							<texturefocus border="10" colordiffuse="ff52b54b">buttons/shadow_smallbutton.png</texturefocus>
-							<texturenofocus border="10" colordiffuse="ff464646">buttons/shadow_smallbutton.png</texturenofocus>
-							<pulseonselect>no</pulseonselect>
-							<animation effect="slide" time="0" end="17,0" condition="true">Conditional</animation>
-						</control>
-						<control type="label">
-							<description>spacer</description>
-							<height>20</height>
-						</control>
-						<control type="group">
-							<control type="label">
-								<label>$ADDON[plugin.video.jellyfin 30603]</label>
-								<font>font_flag</font>
-								<textcolor>ff464646</textcolor>
-								<shadowcolor>66000000</shadowcolor>
-								<wrapmultiline>true</wrapmultiline>
-								<scroll>true</scroll>
-								<aligny>top</aligny>
-								<height>160</height>
-								<left>20</left>
-								<right>160</right>
-							</control>
-							<control type="group">
-								<top>10</top>
-								<right>20</right>
-								<width>130</width>
-								<control type="image">
-									<width>130</width>
-									<height>130</height>
-									<description>qrcode</description>
-									<texture>qrcode_disclaimer.png</texture>
-								</control>
-								<control type="label">
-									<top>135</top>
-									<align>center</align>
-									<label>[UPPERCASE]$ADDON[plugin.video.jellyfin 30604][/UPPERCASE]</label>
-									<font>font_flag</font>
-									<scroll>true</scroll>
-									<textcolor>FF52b54b</textcolor>
-									<shadowcolor>66000000</shadowcolor>
-									<aligny>top</aligny>
-								</control>
-							</control>
-						</control>
-					</control>
-				</control>
-				<control type="group" id="202">
-					<top>660</top>
-					<visible>false</visible>
-					<control type="image">
-						<description>Error box</description>
-						<width>100%</width>
-						<height>70</height>
-						<texture colordiffuse="ff222326" border="10">dialogs/dialog_back.png</texture>
-					</control>
-					<control type="label" id="203">
-						<top>10</top>
-						<height>50</height>
-						<textcolor>ffe1e1e1</textcolor>
-						<scroll>true</scroll>
-						<shadowcolor>66000000</shadowcolor>
-						<font>font12</font>
-						<textoffsetx>20</textoffsetx>
-						<aligny>center</aligny>
-						<align>center</align>
-					</control>
-				</control>
-			</control>
-		</control>
-	</controls>
-</window>
\ No newline at end of file
diff --git a/resources/skins/default/1080i/script-jellyfin-connect-server.xml b/resources/skins/default/1080i/script-jellyfin-connect-server.xml
index c20c535d..15056fea 100644
--- a/resources/skins/default/1080i/script-jellyfin-connect-server.xml
+++ b/resources/skins/default/1080i/script-jellyfin-connect-server.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <window>
-	<defaultcontrol always="true">205</defaultcontrol>
+	<defaultcontrol always="true">206</defaultcontrol>
 	<animation type="WindowOpen" reversible="false">
 		<effect type="zoom" start="80" end="100" center="960,540" delay="160" tween="circle" easin="out" time="240" />
 		<effect type="fade" delay="160" end="100" time="240" />
@@ -160,24 +160,6 @@
 							<description>spacer</description>
 							<height>20</height>
 						</control>
-						<control type="button" id="205">
-							<label>[B]$ADDON[plugin.video.jellyfin 30600][/B]</label>
-							<width>476</width>
-							<height>65</height>
-							<font>font13</font>
-							<textcolor>ffe1e1e1</textcolor>
-							<focusedcolor>white</focusedcolor>
-							<selectedcolor>ffe1e1e1</selectedcolor>
-							<shadowcolor>66000000</shadowcolor>
-							<textoffsetx>20</textoffsetx>
-							<aligny>center</aligny>
-							<align>center</align>
-							<texturefocus border="10" colordiffuse="ff52b54b">buttons/shadow_smallbutton.png</texturefocus>
-							<texturenofocus border="10" colordiffuse="ff464646">buttons/shadow_smallbutton.png</texturenofocus>
-							<pulseonselect>no</pulseonselect>
-							<onup>155</onup>
-							<animation effect="slide" time="0" end="17,0" condition="true">Conditional</animation>
-						</control>
 						<control type="button" id="206">
 							<label>[B]$ADDON[plugin.video.jellyfin 30611][/B]</label>
 							<width>476</width>

From 647636430f431549d636a0349a5198a93da7ed9d Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 15:41:24 +0100
Subject: [PATCH 04/15] Remove more Connect

---
 resources/lib/connect.py                      |   4 +-
 resources/lib/dialogs/serverconnect.py        |   4 -
 resources/lib/dialogs/usersconnect.py         |   3 +-
 resources/lib/emby/core/connection_manager.py | 192 +-----------------
 resources/lib/entrypoint/default.py           |   2 -
 resources/lib/entrypoint/service.py           |   2 +-
 6 files changed, 8 insertions(+), 199 deletions(-)

diff --git a/resources/lib/connect.py b/resources/lib/connect.py
index f417f3d5..f2336d25 100644
--- a/resources/lib/connect.py
+++ b/resources/lib/connect.py
@@ -115,7 +115,7 @@ class Connect(object):
 
                 return state['Credentials']
 
-            elif (server_selection or state['State'] in (CONNECTION_STATE['ConnectSignIn'], CONNECTION_STATE['ServerSelection']) or 
+            elif (server_selection or state['State'] == CONNECTION_STATE['ServerSelection'] or 
                   state['State'] == CONNECTION_STATE['Unavailable'] and not settings('SyncInstallRunDone.bool')):
 
                 self.select_servers(state)
@@ -157,7 +157,7 @@ class Connect(object):
     def select_servers(self, state=None):
 
         state = state or self.connect_manager.connect({'enableAutoLogin': False})
-        user = state.get('ConnectUser') or {}
+        user = {}
 
         dialog = ServerConnect("script-jellyfin-connect-server.xml", *XML_PATH)
         dialog.set_args(**{
diff --git a/resources/lib/dialogs/serverconnect.py b/resources/lib/dialogs/serverconnect.py
index 9c05fbe6..9cc74596 100644
--- a/resources/lib/dialogs/serverconnect.py
+++ b/resources/lib/dialogs/serverconnect.py
@@ -54,13 +54,9 @@ class ServerConnect(xbmcgui.WindowXMLDialog):
     def get_server(self):
         return self._selected_server
 
-    def is_connect_login(self):
-        return self._connect_login
-
     def is_manual_server(self):
         return self._manual_server
 
-
     def onInit(self):
 
         self.message = self.getControl(MESSAGE)
diff --git a/resources/lib/dialogs/usersconnect.py b/resources/lib/dialogs/usersconnect.py
index a5fadda5..eaebfdab 100644
--- a/resources/lib/dialogs/usersconnect.py
+++ b/resources/lib/dialogs/usersconnect.py
@@ -34,7 +34,7 @@ class UsersConnect(xbmcgui.WindowXMLDialog):
         xbmcgui.WindowXMLDialog.__init__(self, *args, **kwargs)
 
     def set_args(self, **kwargs):
-        # connect_manager, user_image, servers, jellyfin_connect
+        # connect_manager, user_image, servers
         for key, value in kwargs.iteritems():
             setattr(self, key, value)
 
@@ -47,7 +47,6 @@ class UsersConnect(xbmcgui.WindowXMLDialog):
     def is_manual_login(self):
         return self._manual_login
 
-
     def onInit(self):
 
         self.list_ = self.getControl(LIST)
diff --git a/resources/lib/emby/core/connection_manager.py b/resources/lib/emby/core/connection_manager.py
index 68411aeb..64adbee7 100644
--- a/resources/lib/emby/core/connection_manager.py
+++ b/resources/lib/emby/core/connection_manager.py
@@ -20,7 +20,6 @@ CONNECTION_STATE = {
     'ServerSelection': 1,
     'ServerSignIn': 2,
     'SignedIn': 3,
-    'ConnectSignIn': 4,
     'ServerUpdateNeeded': 5
 }
 CONNECTION_MODE = {
@@ -69,12 +68,6 @@ class ConnectionManager(object):
             return self.connect
         elif key == "login":
             return self.login
-        elif key == "connect-user":
-            return self.connect_user()
-        elif key == "connect-token":
-            return self.connect_token()
-        elif key == "connect-user-id":
-            return self.connect_user_id()
         elif key == "server":
             return self.get_server_info(self.server_id)
         elif key == "server-id":
@@ -111,8 +104,6 @@ class ConnectionManager(object):
 
         self.user = None
         credentials = self.credentials.get_credentials()
-        credentials['ConnectAccessToken'] = None
-        credentials['ConnectUserId'] = None
         credentials['Servers'] = list()
         self.credentials.get_credentials(credentials)
 
@@ -133,19 +124,14 @@ class ConnectionManager(object):
 
         # Clone the credentials
         credentials = self.credentials.get_credentials()
-        connect_servers = self._get_connect_servers(credentials)
         found_servers = self._find_servers(self._server_discovery())
 
-        if not connect_servers and not found_servers and not credentials['Servers']: # back out right away, no point in continuing
+        if not found_servers and not credentials['Servers']: # back out right away, no point in continuing
             LOG.info("Found no servers")
-
             return list()
 
         servers = list(credentials['Servers'])
         self._merge_servers(servers, found_servers)
-        self._merge_servers(servers, connect_servers)
-
-        servers = self._filter_servers(servers, connect_servers)
 
         try:
             servers.sort(key=lambda x: datetime.strptime(x['DateLastAccessed'], "%Y-%m-%dT%H:%M:%SZ"), reverse=True)
@@ -240,15 +226,6 @@ class ConnectionManager(object):
         LOG.info("Begin connect")
         return self._connect_to_servers(self.get_available_servers(), options)
 
-    def connect_user(self):
-        return self.user
-
-    def connect_user_id(self):
-        return self.credentials.get_credentials().get('ConnectUserId')
-
-    def connect_token(self):
-        return self.credentials.get_credentials().get('ConnectAccessToken')
-
     def emby_user_id(self):
         return self.get_server_info(self.server_id)['UserId']
 
@@ -270,9 +247,6 @@ class ConnectionManager(object):
     def get_public_users(self):
         return self.client.emby.get_public_users()
 
-    def get_connect_url(self, handler):
-        return "https://connect.emby.media/service/%s" % handler
-
     def get_emby_url(self, base, handler):
         return "%s/emby/%s" % (base, handler)
 
@@ -310,12 +284,6 @@ class ConnectionManager(object):
 
         if len(servers) == 1:
             result = self.connect_to_server(servers[0], options)
-
-            """
-            if result['State'] == CONNECTION_STATE['Unavailable']:
-                result['State'] = CONNECTION_STATE['ConnectSignIn'] if result['ConnectUser'] is None else CONNECTION_STATE['ServerSelection']
-            """
-
             LOG.debug("resolving connectToServers with result['State']: %s", result)
 
             return result
@@ -330,12 +298,10 @@ class ConnectionManager(object):
 
         # Return loaded credentials if exists
         credentials = self.credentials.get_credentials()
-        self._ensure_connect_user(credentials)
 
         return {
             'Servers': servers,
-            'State': CONNECTION_STATE['ConnectSignIn'] if (not len(servers) and not self.connect_user()) else (result.get('State') or CONNECTION_STATE['ServerSelection']),
-            'ConnectUser': self.connect_user()
+            'State': result.get('State') or CONNECTION_STATE['ServerSelection'],
         }
 
     def _try_connect(self, url, timeout=None, options={}):
@@ -408,20 +374,11 @@ class ConnectionManager(object):
     def _on_successful_connection(self, server, system_info, connection_mode, options):
 
         credentials = self.credentials.get_credentials()
-
-        if credentials.get('ConnectAccessToken') and options.get('enableAutoLogin') is not False:
-            
-            if self._ensure_connect_user(credentials) is not False:
-
-                if server.get('ExchangeToken'):
-                    self._add_authentication_info_from_connect(server, connection_mode, credentials, options)
-
         return self._after_connect_validated(server, credentials, system_info, connection_mode, True, options)
 
     def _resolve_failure(self):
         return {
-            'State': CONNECTION_STATE['Unavailable'],
-            'ConnectUser': self.connect_user()
+            'State': CONNECTION_STATE['Unavailable']
         }
 
     def _get_min_server_version(self, val=None):
@@ -462,23 +419,6 @@ class ConnectionManager(object):
     def _string_equals_ignore_case(self, str1, str2):
         return (str1 or "").lower() == (str2 or "").lower()
 
-    def _get_connect_user(self, user_id, access_token):
-
-        if not user_id:
-            raise AttributeError("null userId")
-
-        if not access_token:
-            raise AttributeError("null accessToken")
-
-        return self._request_url({
-            'type': "GET",
-            'url': self.get_connect_url('user?id=%s' % user_id),
-            'dataType': "json",
-            'headers': {
-                'X-Connect-UserToken': access_token
-            }
-        })
-
     def _server_discovery(self):
         
         MULTI_GROUP = ("<broadcast>", 7359)
@@ -516,37 +456,6 @@ class ConnectionManager(object):
                 LOG.error("Error trying to find servers: %s", e)
                 return servers
 
-    def _get_connect_servers(self, credentials):
-
-        LOG.info("Begin getConnectServers")
-        
-        servers = list()
-
-        if not credentials.get('ConnectAccessToken') or not credentials.get('ConnectUserId'):
-            return servers
-
-        url = self.get_connect_url("servers?userId=%s" % credentials['ConnectUserId'])
-        request = {
-            'type': "GET",
-            'url': url,
-            'dataType': "json",
-            'headers': {
-                'X-Connect-UserToken': credentials['ConnectAccessToken']
-            }
-        }
-        for server in self._request_url(request):
-            servers.append({
-                'ExchangeToken': server['AccessKey'],
-                'ConnectServerId': server['Id'],
-                'Id': server['SystemId'],
-                'Name': server['Name'],
-                'RemoteAddress': server['Url'],
-                'LocalAddress': server['LocalAddress'],
-                'UserLinkType': "Guest" if server['UserType'].lower() == "guest" else "LinkedUser",
-            })
-
-        return servers
-
     def _get_last_used_server(self):
 
         servers = self.credentials.get_credentials()['Servers']
@@ -590,22 +499,6 @@ class ConnectionManager(object):
         else:
             return servers
 
-    def _filter_servers(self, servers, connect_servers):
-        
-        filtered = list()
-        for server in servers:
-            if server.get('ExchangeToken') is None:
-                # It's not a connect server, so assume it's still valid
-                filtered.append(server)
-                continue
-
-            for connect_server in connect_servers:
-                if server['Id'] == connect_server['Id']:
-                    filtered.append(server)
-                    break
-
-        return filtered
-
     def _convert_endpoint_address_to_manual_address(self, info):
         
         if info.get('Address') and info.get('EndpointAddress'):
@@ -634,45 +527,6 @@ class ConnectionManager(object):
 
         return address
 
-    def _get_connect_password_hash(self, password):
-
-        password = self._clean_connect_password(password)
-        return hashlib.md5(password).hexdigest()
-
-    def _clean_connect_password(self, password):
-
-        password = password or ""
-
-        password = password.replace("&", '&amp;')
-        password = password.replace("/", '&#092;')
-        password = password.replace("!", '&#33;')
-        password = password.replace("$", '&#036;')
-        password = password.replace("\"", '&quot;')
-        password = password.replace("<", '&lt;')
-        password = password.replace(">", '&gt;')
-        password = password.replace("'", '&#39;')
-
-        return password
-
-    def _ensure_connect_user(self, credentials):
-
-        if self.user and self.user['Id'] == credentials['ConnectUserId']:
-            return
-
-        elif credentials.get('ConnectUserId') and credentials.get('ConnectAccessToken'):
-            self.user = None
-
-            try:
-                result = self._get_connect_user(credentials['ConnectUserId'], credentials['ConnectAccessToken'])
-                self._on_connect_user_signin(result)
-            except Exception:
-                return False
-
-    def _on_connect_user_signin(self, user):
-
-        self.user = user
-        LOG.info("connectusersignedin %s", user)
-
     def _save_user_info_into_credentials(self, server, user):
 
         info = {
@@ -681,43 +535,6 @@ class ConnectionManager(object):
         }
         self.credentials.add_update_user(server, info)
 
-    def _add_authentication_info_from_connect(self, server, connection_mode, credentials, options={}):
-
-        if not server.get('ExchangeToken'):
-            raise KeyError("server['ExchangeToken'] cannot be null")
-
-        if not credentials.get('ConnectUserId'):
-            raise KeyError("credentials['ConnectUserId'] cannot be null")
-
-        auth =  "MediaBrowser "
-        auth += "Client=%s, " % self.config['app.name']
-        auth += "Device=%s, " % self.config['app.device_name']
-        auth += "DeviceId=%s, " % self.config['app.device_id']
-        auth += "Version=%s " % self.config['app.version']
-
-        try:
-            auth = self._request_url({
-                'url': self.get_emby_url(get_server_address(server, connection_mode), "Connect/Exchange"),
-                'type': "GET",
-                'dataType': "json",
-                'verify': options.get('ssl'),
-                'params': {
-                    'ConnectUserId': credentials['ConnectUserId']
-                },
-                'headers': {
-                    'X-MediaBrowser-Token': server['ExchangeToken'],
-                    'X-Emby-Authorization': auth
-                }
-            })
-        except Exception:
-            server['UserId'] = None
-            server['AccessToken'] = None
-            return False
-        else:
-            server['UserId'] = auth['LocalUserId']
-            server['AccessToken'] = auth['AccessToken']
-            return auth
-
     def _after_connect_validated(self, server, credentials, system_info, connection_mode, verify_authentication, options):
 
         if options.get('enableAutoLogin') == False:
@@ -753,8 +570,7 @@ class ConnectionManager(object):
         self.config['auth.ssl'] = options.get('ssl', self.config['auth.ssl'])
 
         result = {
-            'Servers': [server],
-            'ConnectUser': self.connect_user()
+            'Servers': [server]
         }
 
         result['State'] = CONNECTION_STATE['SignedIn'] if server.get('AccessToken') else CONNECTION_STATE['ServerSignIn']
diff --git a/resources/lib/entrypoint/default.py b/resources/lib/entrypoint/default.py
index 0305e254..e3161899 100644
--- a/resources/lib/entrypoint/default.py
+++ b/resources/lib/entrypoint/default.py
@@ -100,8 +100,6 @@ class Events(object):
             event('RemoveLibrarySelection')
         elif mode == 'addlibs':
             event('AddLibrarySelection')
-        elif mode == 'connect':
-            event('jellyfinConnect')
         elif mode == 'addserver':
             event('AddServer')
         elif mode == 'login':
diff --git a/resources/lib/entrypoint/service.py b/resources/lib/entrypoint/service.py
index f0aa77e8..b6ffcb3e 100644
--- a/resources/lib/entrypoint/service.py
+++ b/resources/lib/entrypoint/service.py
@@ -229,7 +229,7 @@ class Service(xbmc.Monitor):
 
             if method not in ('ServerUnreachable', 'ServerShuttingDown', 'UserDataChanged', 'ServerConnect',
                               'LibraryChanged', 'ServerOnline', 'SyncLibrary', 'RepairLibrary', 'RemoveLibrary',
-                              'JellyfinConnect', 'SyncLibrarySelection', 'RepairLibrarySelection', 'AddServer',
+                              'SyncLibrarySelection', 'RepairLibrarySelection', 'AddServer',
                               'Unauthorized', 'UpdateServer', 'UserConfigurationUpdated', 'ServerRestarting',
                               'RemoveServer', 'AddLibrarySelection', 'CheckUpdate', 'RemoveLibrarySelection'):
                 return

From 233192863ab42e7bd6fe072fbe775bfc2af91ccf Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 18:21:22 +0100
Subject: [PATCH 05/15] Change emby to jellyfin in functions, variables etc.

---
 addon.xml                                     |  2 +-
 resources/lib/connect.py                      | 12 +--
 resources/lib/database/__init__.py            | 26 +++---
 .../database/{emby_db.py => jellyfin_db.py}   |  2 +-
 resources/lib/dialogs/loginmanual.py          |  1 -
 resources/lib/dialogs/serverconnect.py        |  2 +-
 resources/lib/dialogs/servermanual.py         |  3 +-
 resources/lib/downloader.py                   | 16 ++--
 resources/lib/entrypoint/__init__.py          |  4 +-
 resources/lib/entrypoint/default.py           | 26 +++---
 resources/lib/entrypoint/service.py           | 18 ++--
 resources/lib/full_sync.py                    | 72 +++++++--------
 resources/lib/helper/__init__.py              |  2 +-
 resources/lib/helper/playutils.py             |  1 -
 resources/lib/helper/wrapper.py               | 10 +--
 resources/lib/{emby => jellyfin}/__init__.py  | 12 +--
 resources/lib/{emby => jellyfin}/client.py    |  6 +-
 .../lib/{emby => jellyfin}/core/__init__.py   |  0
 resources/lib/{emby => jellyfin}/core/api.py  | 10 +--
 .../{emby => jellyfin}/core/configuration.py  |  0
 .../core/connection_manager.py                | 18 ++--
 .../{emby => jellyfin}/core/credentials.py    |  0
 .../lib/{emby => jellyfin}/core/exceptions.py |  0
 resources/lib/{emby => jellyfin}/core/http.py |  0
 .../lib/{emby => jellyfin}/core/ws_client.py  |  0
 .../{emby => jellyfin}/helpers/__init__.py    |  0
 .../lib/{emby => jellyfin}/helpers/utils.py   |  0
 .../{emby => jellyfin}/resources/__init__.py  |  0
 .../{emby => jellyfin}/resources/websocket.py |  0
 resources/lib/library.py                      | 30 +++----
 resources/lib/monitor.py                      | 10 +--
 resources/lib/objects/actions.py              |  1 -
 resources/lib/objects/movies.py               | 42 ++++-----
 resources/lib/objects/music.py                | 82 ++++++++---------
 resources/lib/objects/musicvideos.py          | 24 ++---
 resources/lib/objects/tvshows.py              | 88 +++++++++----------
 resources/lib/player.py                       |  4 +-
 resources/lib/views.py                        | 26 +++---
 service.py                                    |  1 -
 39 files changed, 273 insertions(+), 278 deletions(-)
 rename resources/lib/database/{emby_db.py => jellyfin_db.py} (99%)
 rename resources/lib/{emby => jellyfin}/__init__.py (91%)
 rename resources/lib/{emby => jellyfin}/client.py (96%)
 rename resources/lib/{emby => jellyfin}/core/__init__.py (100%)
 rename resources/lib/{emby => jellyfin}/core/api.py (96%)
 rename resources/lib/{emby => jellyfin}/core/configuration.py (100%)
 rename resources/lib/{emby => jellyfin}/core/connection_manager.py (97%)
 rename resources/lib/{emby => jellyfin}/core/credentials.py (100%)
 rename resources/lib/{emby => jellyfin}/core/exceptions.py (100%)
 rename resources/lib/{emby => jellyfin}/core/http.py (100%)
 rename resources/lib/{emby => jellyfin}/core/ws_client.py (100%)
 rename resources/lib/{emby => jellyfin}/helpers/__init__.py (100%)
 rename resources/lib/{emby => jellyfin}/helpers/utils.py (100%)
 rename resources/lib/{emby => jellyfin}/resources/__init__.py (100%)
 rename resources/lib/{emby => jellyfin}/resources/websocket.py (100%)

diff --git a/addon.xml b/addon.xml
index 7732032f..aa00fea5 100644
--- a/addon.xml
+++ b/addon.xml
@@ -32,7 +32,7 @@
     <website>https://jellyfin.media/</website>
     <source>https://github.com/jellyfin/jellyfin-kodi</source>
     <summary lang="en"></summary>
-    <description lang="en">Welcome to Jellyfin for Kodi A whole new way to manage and view your media library. The Jellyfin addon for Kodi combines the best of Kodi - ultra smooth navigation, beautiful UIs and playback of any file under the sun, and Jellyfin - the most powerful fully open source multi-client media metadata indexer and server.&#10;&#10;Jellyfin for Kodi is the absolute best way to enjoy the incredible Kodi playback engine combined with the power of Jellyfin's centralized database. Features: Direct integration with the Kodi library for native Kodi speed Instant synchronization with the Jellyfin server Full support for Movie, TV and Music collections Jellyfin Server direct stream and transcoding support - use Kodi when you are away from home!</description>
+    <description lang="en">Welcome to Jellyfin for Kodi!&#10;A whole new way to manage and view your media library. The Jellyfin addon for Kodi combines the best of Kodi - ultra smooth navigation, beautiful UIs and playback of any file under the sun, and Jellyfin - the most powerful fully open source multi-client media metadata indexer and server.&#10;&#10;Jellyfin for Kodi is the absolute best way to enjoy the incredible Kodi playback engine combined with the power of Jellyfin's centralized database. Features:&#10;* Direct integration with the Kodi library for native Kodi speed&#10;* Instant synchronization with the Jellyfin server&#10;* Full support for Movie, TV and Music collections&#10;* Jellyfin Server direct stream and transcoding support - use Kodi when you are away from home!</description>
     <news>
       Rebrand in progress
     </news>
diff --git a/resources/lib/connect.py b/resources/lib/connect.py
index f2336d25..b1fba75d 100644
--- a/resources/lib/connect.py
+++ b/resources/lib/connect.py
@@ -14,9 +14,9 @@ import client
 from database import get_credentials, save_credentials
 from dialogs import ServerConnect, UsersConnect, LoginManual, ServerManual
 from helper import _, settings, addon_id, event, api, dialog, window
-from emby import Emby
-from emby.core.connection_manager import get_server_address, CONNECTION_STATE
-from emby.core.exceptions import HTTPException
+from jellyfin import Jellyfin
+from jellyfin.core.connection_manager import get_server_address, CONNECTION_STATE
+from jellyfin.core.exceptions import HTTPException
 
 ##################################################################################################
 
@@ -65,7 +65,7 @@ class Connect(object):
         save_credentials(credentials)
 
         try:
-            Emby(server_id).start(True)
+            Jellyfin(server_id).start(True)
         except ValueError as error:
             LOG.error(error)
 
@@ -80,7 +80,7 @@ class Connect(object):
 
         ''' Get Jellyfin client.
         '''
-        client = Emby(server_id)
+        client = Jellyfin(server_id)
         client['config/app']("Kodi", self.info['Version'], self.info['DeviceName'], self.info['DeviceId'])
         client['config']['http.user_agent'] = "Jellyfin-Kodi/%s" % self.info['Version']
         client['config']['auth.ssl'] = self.get_ssl()
@@ -280,7 +280,7 @@ class Connect(object):
 
         ''' Stop client and remove server.
         '''
-        Emby(server_id).close()
+        Jellyfin(server_id).close()
         credentials = get_credentials()
 
         for server in credentials['Servers']:
diff --git a/resources/lib/database/__init__.py b/resources/lib/database/__init__.py
index 3fb5e715..a2431e35 100644
--- a/resources/lib/database/__init__.py
+++ b/resources/lib/database/__init__.py
@@ -11,7 +11,7 @@ import sqlite3
 import xbmc
 import xbmcvfs
 
-import emby_db
+import jellyfin_db
 from helper.utils import delete_folder
 from helper import _, settings, window, dialog
 from objects import obj
@@ -58,7 +58,7 @@ class Database(object):
         if not window('jellyfin_db_check.bool') and self.db_file == 'jellyfin':
 
             window('jellyfin_db_check.bool', True)
-            emby_tables(self.cursor)
+            jellyfin_tables(self.cursor)
             self.conn.commit()
 
         return self
@@ -183,7 +183,7 @@ class Database(object):
         self.cursor.close()
         self.conn.close()
 
-def emby_tables(cursor):
+def jellyfin_tables(cursor):
 
     ''' Create the tables for the jellyfin database.
         jellyfin, view, version
@@ -231,7 +231,7 @@ def reset():
             return
 
     reset_kodi()
-    reset_emby()
+    reset_jellyfin()
     views.delete_playlists()
     views.delete_nodes()
 
@@ -280,20 +280,20 @@ def reset_kodi():
 
     LOG.warn("[ reset kodi ]")
 
-def reset_emby():
+def reset_jellyfin():
     
-    with Database('jellyfin') as embydb:    
-        embydb.cursor.execute("SELECT tbl_name FROM sqlite_master WHERE type='table'")
+    with Database('jellyfin') as jellyfindb:
+        jellyfindb.cursor.execute("SELECT tbl_name FROM sqlite_master WHERE type='table'")
 
-        for table in embydb.cursor.fetchall():
+        for table in jellyfindb.cursor.fetchall():
             name = table[0]
 
             if name not in ('version', 'view'):
-                embydb.cursor.execute("DELETE FROM " + name)
+                jellyfindb.cursor.execute("DELETE FROM " + name)
 
-            embydb.cursor.execute("DROP table IF EXISTS jellyfin")
-            embydb.cursor.execute("DROP table IF EXISTS view")
-            embydb.cursor.execute("DROP table IF EXISTS version")
+            jellyfindb.cursor.execute("DROP table IF EXISTS jellyfin")
+            jellyfindb.cursor.execute("DROP table IF EXISTS view")
+            jellyfindb.cursor.execute("DROP table IF EXISTS version")
 
     LOG.warn("[ reset jellyfin ]")
 
@@ -396,7 +396,7 @@ def get_item(kodi_id, media):
     ''' Get jellyfin item based on kodi id and media.
     '''
     with Database('jellyfin') as jellyfindb:
-        item = emby_db.EmbyDatabase(embydb.cursor).get_full_item_by_kodi_id(kodi_id, media)
+        item = jellyfin_db.JellyfinDatabase(jellyfindb.cursor).get_full_item_by_kodi_id(kodi_id, media)
 
         if not item:
             LOG.debug("Not an jellyfin item")
diff --git a/resources/lib/database/emby_db.py b/resources/lib/database/jellyfin_db.py
similarity index 99%
rename from resources/lib/database/emby_db.py
rename to resources/lib/database/jellyfin_db.py
index 88c5f260..5365b358 100644
--- a/resources/lib/database/emby_db.py
+++ b/resources/lib/database/jellyfin_db.py
@@ -13,7 +13,7 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
 ##################################################################################################
 
 
-class EmbyDatabase():
+class JellyfinDatabase():
 
 
     def __init__(self, cursor):
diff --git a/resources/lib/dialogs/loginmanual.py b/resources/lib/dialogs/loginmanual.py
index 2c587861..525ea355 100644
--- a/resources/lib/dialogs/loginmanual.py
+++ b/resources/lib/dialogs/loginmanual.py
@@ -72,7 +72,6 @@ class LoginManual(xbmcgui.WindowXMLDialog):
     def onClick(self, control):
 
         if control == SIGN_IN:
-            # Sign in to emby connect
             self._disable_error()
 
             user = self.user_field.getText()
diff --git a/resources/lib/dialogs/serverconnect.py b/resources/lib/dialogs/serverconnect.py
index 9cc74596..f5fce12c 100644
--- a/resources/lib/dialogs/serverconnect.py
+++ b/resources/lib/dialogs/serverconnect.py
@@ -8,7 +8,7 @@ import xbmc
 import xbmcgui
 
 from helper import _
-from emby.core.connection_manager import CONNECTION_STATE
+from jellyfin.core.connection_manager import CONNECTION_STATE
 
 ##################################################################################################
 
diff --git a/resources/lib/dialogs/servermanual.py b/resources/lib/dialogs/servermanual.py
index 49d2413a..a7889cc2 100644
--- a/resources/lib/dialogs/servermanual.py
+++ b/resources/lib/dialogs/servermanual.py
@@ -9,7 +9,7 @@ import xbmcgui
 import xbmcaddon
 
 from helper import _, addon_id
-from emby.core.connection_manager import CONNECTION_STATE
+from jellyfin.core.connection_manager import CONNECTION_STATE
 
 ##################################################################################################
 
@@ -72,7 +72,6 @@ class ServerManual(xbmcgui.WindowXMLDialog):
     def onClick(self, control):
 
         if control == CONNECT:
-            # Sign in to jellyfin connect
             self._disable_error()
 
             server = self.host_field.getText()
diff --git a/resources/lib/downloader.py b/resources/lib/downloader.py
index f70218c0..2094bad0 100644
--- a/resources/lib/downloader.py
+++ b/resources/lib/downloader.py
@@ -16,9 +16,9 @@ import xbmcaddon
 import requests
 from helper.utils import should_stop, delete_folder
 from helper import settings, stop, event, window, kodi_version, unzip, create_id
-from emby import Emby
-from emby.core import api
-from emby.core.exceptions import HTTPException
+from jellyfin import Jellyfin
+from jellyfin.core import api
+from jellyfin.core.exceptions import HTTPException
 
 #################################################################################################
 
@@ -28,7 +28,7 @@ CACHE = xbmc.translatePath(os.path.join(xbmcaddon.Addon(id='plugin.video.jellyfi
 
 #################################################################################################
 
-def get_embyserver_url(handler):
+def get_jellyfinserver_url(handler):
 
     if handler.startswith('/'):
 
@@ -46,16 +46,16 @@ def browse_info():
 def _http(action, url, request={}, server_id=None):
     request.update({'url': url, 'type': action})
     
-    return Emby(server_id)['http/request'](request)
+    return Jellyfin(server_id)['http/request'](request)
 
 def _get(handler, params=None, server_id=None):
-    return  _http("GET", get_embyserver_url(handler), {'params': params}, server_id)
+    return  _http("GET", get_jellyfinserver_url(handler), {'params': params}, server_id)
 
 def _post(handler, json=None, params=None, server_id=None):
-    return  _http("POST", get_embyserver_url(handler), {'params': params, 'json': json}, server_id)
+    return  _http("POST", get_jellyfinserver_url(handler), {'params': params, 'json': json}, server_id)
 
 def _delete(handler, params=None, server_id=None):
-    return  _http("DELETE", get_embyserver_url(handler), {'params': params}, server_id)
+    return  _http("DELETE", get_jellyfinserver_url(handler), {'params': params}, server_id)
 
 def validate_view(library_id, item_id):
 
diff --git a/resources/lib/entrypoint/__init__.py b/resources/lib/entrypoint/__init__.py
index d85962f5..1c7899e6 100644
--- a/resources/lib/entrypoint/__init__.py
+++ b/resources/lib/entrypoint/__init__.py
@@ -8,11 +8,11 @@ import xbmc
 import xbmcvfs
 
 from helper import loghandler
-from emby import Emby
+from jellyfin import Jellyfin
 
 #################################################################################################
 
-Emby.set_loghandler(loghandler.LogHandler, logging.DEBUG)
+Jellyfin.set_loghandler(loghandler.LogHandler, logging.DEBUG)
 loghandler.reset()
 loghandler.config()
 LOG = logging.getLogger('JELLYFIN.entrypoint')
diff --git a/resources/lib/entrypoint/default.py b/resources/lib/entrypoint/default.py
index e3161899..a409ccd3 100644
--- a/resources/lib/entrypoint/default.py
+++ b/resources/lib/entrypoint/default.py
@@ -17,7 +17,7 @@ import xbmcplugin
 import xbmcaddon
 
 import client
-from database import reset, get_sync, Database, emby_db, get_credentials
+from database import reset, get_sync, Database, jellyfin_db, get_credentials
 from objects import Objects, Actions
 from downloader import TheVoid
 from helper import _, event, settings, window, dialog, api, JSONRPC
@@ -130,14 +130,14 @@ def listing():
 
     ''' Display all jellyfin nodes and dynamic entries when appropriate.
     '''
-    total = int(window('Emby.nodes.total') or 0)
+    total = int(window('Jellyfin.nodes.total') or 0)
     sync = get_sync()
     whitelist = [x.replace('Mixed:', "") for x in sync['Whitelist']]
     servers = get_credentials()['Servers'][1:]
 
     for i in range(total):
 
-        window_prop = "Emby.nodes.%s" % i
+        window_prop = "Jellyfin.nodes.%s" % i
         path = window('%s.index' % window_prop)
 
         if not path:
@@ -543,12 +543,12 @@ def get_video_extras(item_id, path, server_id=None):
     """
     def getVideoFiles(jellyfinId,jellyfinPath):
         #returns the video files for the item as plugin listing, can be used for browsing the actual files or videoextras etc.
-        emby = embyserver.Read_EmbyServer()
-        if not embyId:
-            if "plugin.video.jellyfin" in embyPath:
-                embyId = embyPath.split("/")[-2]
-        if embyId:
-            item = emby.getItem(embyId)
+        jellyfin = jellyfinserver.Read_JellyfinServer()
+        if not jellyfinId:
+            if "plugin.video.jellyfin" in jellyfinPath:
+                jellyfinId = jellyfinPath.split("/")[-2]
+        if jellyfinId:
+            item = jellyfin.getItem(jellyfinId)
             putils = playutils.PlayUtils(item)
             if putils.isDirectPlay():
                 #only proceed if we can access the files directly. TODO: copy local on the fly if accessed outside
@@ -571,9 +571,9 @@ def get_next_episodes(item_id, limit):
 
     ''' Only for synced content.
     '''
-    with Database('jellyfin') as embydb:
+    with Database('jellyfin') as jellyfindb:
 
-        db = emby_db.EmbyDatabase(embydb.cursor)
+        db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
         library = db.get_view_name(item_id)
 
         if not library:
@@ -784,8 +784,8 @@ def get_themes():
 
         return
 
-    with Database('jellyfin') as embydb:
-        all_views = emby_db.EmbyDatabase(embydb.cursor).get_views()
+    with Database('jellyfin') as jellyfindb:
+        all_views = jellyfin_db.JellyfinDatabase(jellyfindb.cursor).get_views()
         views = [x[0] for x in all_views if x[2] in ('movies', 'tvshows', 'mixed')]
 
 
diff --git a/resources/lib/entrypoint/service.py b/resources/lib/entrypoint/service.py
index b6ffcb3e..8abe4c06 100644
--- a/resources/lib/entrypoint/service.py
+++ b/resources/lib/entrypoint/service.py
@@ -21,8 +21,8 @@ import requests
 from views import Views, verify_kodi_defaults
 from helper import _, window, settings, event, dialog, find, compare_version
 from downloader import get_objects
-from emby import Emby
-from database import Database, emby_db, reset
+from jellyfin import Jellyfin
+from database import Database, jellyfin_db, reset
 
 #################################################################################################
 
@@ -143,7 +143,7 @@ class Service(xbmc.Monitor):
     def stop_default(self):
 
         window('jellyfin_online', clear=True)
-        Emby().close()
+        Jellyfin().close()
 
         if self.library_thread is not None:
 
@@ -154,9 +154,9 @@ class Service(xbmc.Monitor):
 
         ''' Check the database version to ensure we do not need to do a reset.
         '''
-        with Database('jellyfin') as embydb:
+        with Database('jellyfin') as jellyfindb:
 
-            version = emby_db.EmbyDatabase(embydb.cursor).get_version()
+            version = jellyfin_db.JellyfinDatabase(jellyfindb.cursor).get_version()
             LOG.info("---[ db/%s ]", version)
 
         if version and compare_version(version, "3.1.0") < 0:
@@ -206,8 +206,8 @@ class Service(xbmc.Monitor):
             LOG.info("--[ new objects/%s ]", objects.version)
 
             try:
-                if compare_version(self.settings['addon_version'], objects.embyversion) < 0:
-                    dialog("ok", heading="{jellyfin}", line1="%s %s" % (_(33160), objects.embyversion))
+                if compare_version(self.settings['addon_version'], objects.jellyfinversion) < 0:
+                    dialog("ok", heading="{jellyfin}", line1="%s %s" % (_(33160), objects.jellyfinversion))
             except Exception:
                 pass
 
@@ -386,7 +386,7 @@ class Service(xbmc.Monitor):
                 self.library_thread.stop_client()
                 self.library_thread = None
 
-            Emby.close_all()
+            Jellyfin.close_all()
             self.monitor.server = []
             self.monitor.sleep = True
 
@@ -506,7 +506,7 @@ class Service(xbmc.Monitor):
         for prop in properties:
             window(prop, clear=True)
 
-        Emby.close_all()
+        Jellyfin.close_all()
 
         if self.library_thread is not None:
             self.library_thread.stop_client()
diff --git a/resources/lib/full_sync.py b/resources/lib/full_sync.py
index aca9be55..aa5b3b1b 100644
--- a/resources/lib/full_sync.py
+++ b/resources/lib/full_sync.py
@@ -12,7 +12,7 @@ import xbmcvfs
 
 import downloader as server
 import helper.xmls as xmls
-from database import Database, get_sync, save_sync, emby_db
+from database import Database, get_sync, save_sync, jellyfin_db
 from helper import _, settings, window, progress, dialog, LibraryException
 from helper.utils import get_screensaver, set_screensaver
 from views import Views
@@ -104,11 +104,11 @@ class FullSync(object):
 
     def get_libraries(self, library_id=None):
 
-        with Database('jellyfin') as embydb:
+        with Database('jellyfin') as jellyfindb:
             if library_id is None:
-                return emby_db.EmbyDatabase(embydb.cursor).get_views()
+                return jellyfin_db.JellyfinDatabase(jellyfindb.cursor).get_views()
             else:
-                return emby_db.EmbyDatabase(embydb.cursor).get_view(library_id)
+                return jellyfin_db.JellyfinDatabase(jellyfindb.cursor).get_view(library_id)
 
     def mapping(self):
 
@@ -266,9 +266,9 @@ class FullSync(object):
 
         with self.library.database_lock:
             with Database() as videodb:
-                with Database('jellyfin') as embydb:
+                with Database('jellyfin') as jellyfindb:
 
-                    obj = Movies(self.server, embydb, videodb, self.direct_path)
+                    obj = Movies(self.server, jellyfindb, videodb, self.direct_path)
 
                     for items in server.get_items(library['Id'], "Movie", False, self.sync['RestorePoint'].get('params')):
                         
@@ -283,13 +283,13 @@ class FullSync(object):
                             obj.movie(movie, library=library)
 
                     if self.update_library:
-                        self.movies_compare(library, obj, embydb)
+                        self.movies_compare(library, obj, jellyfindb)
 
-    def movies_compare(self, library, obj, embydb):
+    def movies_compare(self, library, obj, jellyfinydb):
 
         ''' Compare entries from library to what's in the jellyfindb. Remove surplus
         '''
-        db = emby_db.EmbyDatabase(embydb.cursor)
+        db = jellyfin_db.JellyfinDatabase(jellyfinydb.cursor)
 
         items = db.get_item_by_media_folder(library['Id'])
         current = obj.item_ids
@@ -307,8 +307,8 @@ class FullSync(object):
 
         with self.library.database_lock:
             with Database() as videodb:
-                with Database('jellyfin') as embydb:
-                    obj = TVShows(self.server, embydb, videodb, self.direct_path, True)
+                with Database('jellyfin') as jellyfindb:
+                    obj = TVShows(self.server, jellyfindb, videodb, self.direct_path, True)
 
                     for items in server.get_items(library['Id'], "Series", False, self.sync['RestorePoint'].get('params')):
 
@@ -330,13 +330,13 @@ class FullSync(object):
                                         obj.episode(episode)
 
                     if self.update_library:
-                        self.tvshows_compare(library, obj, embydb)
+                        self.tvshows_compare(library, obj, jellyfindb)
 
-    def tvshows_compare(self, library, obj, embydb):
+    def tvshows_compare(self, library, obj, jellyfindb):
 
-        ''' Compare entries from library to what's in the embydb. Remove surplus
+        ''' Compare entries from library to what's in the jellyfindb. Remove surplus
         '''
-        db = emby_db.EmbyDatabase(embydb.cursor)
+        db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
 
         items = db.get_item_by_media_folder(library['Id'])
         for x in list(items):
@@ -357,8 +357,8 @@ class FullSync(object):
 
         with self.library.database_lock:
             with Database() as videodb:
-                with Database('jellyfin') as embydb:
-                    obj = MusicVideos(self.server, embydb, videodb, self.direct_path)
+                with Database('jellyfin') as jellyfindb:
+                    obj = MusicVideos(self.server, jellyfindb, videodb, self.direct_path)
 
                     for items in server.get_items(library['Id'], "MusicVideo", False, self.sync['RestorePoint'].get('params')):
 
@@ -373,13 +373,13 @@ class FullSync(object):
                             obj.musicvideo(mvideo, library=library)
 
                     if self.update_library:
-                        self.musicvideos_compare(library, obj, embydb)
+                        self.musicvideos_compare(library, obj, jellyfindb)
 
-    def musicvideos_compare(self, library, obj, embydb):
+    def musicvideos_compare(self, library, obj, jellyfindb):
 
-        ''' Compare entries from library to what's in the embydb. Remove surplus
+        ''' Compare entries from library to what's in the jellyfindb. Remove surplus
         '''
-        db = emby_db.EmbyDatabase(embydb.cursor)
+        db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
 
         items = db.get_item_by_media_folder(library['Id'])
         current = obj.item_ids
@@ -397,8 +397,8 @@ class FullSync(object):
 
         with self.library.music_database_lock:
             with Database('music') as musicdb:
-                with Database('jellyfin') as embydb:
-                    obj = Music(self.server, embydb, musicdb, self.direct_path)
+                with Database('jellyfin') as jellyfindb:
+                    obj = Music(self.server, jellyfindb, musicdb, self.direct_path)
 
                     for items in server.get_artists(library['Id'], False, self.sync['RestorePoint'].get('params')):
 
@@ -432,13 +432,13 @@ class FullSync(object):
 
 
                     if self.update_library:
-                        self.music_compare(library, obj, embydb)
+                        self.music_compare(library, obj, jellyfindb)
 
-    def music_compare(self, library, obj, embydb):
+    def music_compare(self, library, obj, jellyfindb):
 
-        ''' Compare entries from library to what's in the embydb. Remove surplus
+        ''' Compare entries from library to what's in the jellyfindb. Remove surplus
         '''
-        db = emby_db.EmbyDatabase(embydb.cursor)
+        db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
 
         items = db.get_item_by_media_folder(library['Id'])
         for x in list(items):
@@ -459,8 +459,8 @@ class FullSync(object):
 
         with self.library.database_lock:
             with Database() as videodb:
-                with Database('jellyfin') as embydb:
-                    obj = Movies(self.server, embydb, videodb, self.direct_path)
+                with Database('jellyfin') as jellyfindb:
+                    obj = Movies(self.server, jellyfindb, videodb, self.direct_path)
 
                     for items in server.get_items(library_id, "BoxSet", False, self.sync['RestorePoint'].get('params')):
 
@@ -482,9 +482,9 @@ class FullSync(object):
 
         with self.library.database_lock:
             with Database() as videodb:
-                with Database('jellyfin') as embydb:
+                with Database('jellyfin') as jellyfindb:
 
-                    obj = Movies(self.server, embydb, videodb, self.direct_path)
+                    obj = Movies(self.server, jellyfindb, videodb, self.direct_path)
                     obj.boxsets_reset()
 
         self.boxsets(None)
@@ -497,9 +497,9 @@ class FullSync(object):
         MEDIA = self.library.MEDIA
         direct_path = self.library.direct_path
 
-        with Database('jellyfin') as embydb:
+        with Database('jellyfin') as jellyfindb:
 
-            db = emby_db.EmbyDatabase(embydb.cursor)
+            db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
             library = db.get_view(library_id.replace('Mixed:', ""))
             items = db.get_item_by_media_folder(library_id.replace('Mixed:', ""))
             media = 'music' if library[1] == 'music' else 'video'
@@ -518,7 +518,7 @@ class FullSync(object):
                             movies = [x for x in items if x[1] == 'Movie']
                             tvshows = [x for x in items if x[1] == 'Series']
 
-                            obj = MEDIA['Movie'](self.server, embydb, kodidb, direct_path)['Remove']
+                            obj = MEDIA['Movie'](self.server, jellyfindb, kodidb, direct_path)['Remove']
 
                             for item in movies:
 
@@ -526,7 +526,7 @@ class FullSync(object):
                                 dialog.update(int((float(count) / float(len(items))*100)), heading="%s: %s" % (_('addon_name'), library[0]))
                                 count += 1
 
-                            obj = MEDIA['Series'](self.server, embydb, kodidb, direct_path)['Remove']
+                            obj = MEDIA['Series'](self.server, jellyfindb, kodidb, direct_path)['Remove']
 
                             for item in tvshows:
 
@@ -534,7 +534,7 @@ class FullSync(object):
                                 dialog.update(int((float(count) / float(len(items))*100)), heading="%s: %s" % (_('addon_name'), library[0]))
                                 count += 1
                         else:
-                            obj = MEDIA[items[0][1]](self.server, embydb, kodidb, direct_path)['Remove']
+                            obj = MEDIA[items[0][1]](self.server, jellyfindb, kodidb, direct_path)['Remove']
 
                             for item in items:
 
diff --git a/resources/lib/helper/__init__.py b/resources/lib/helper/__init__.py
index 5575306f..4e279cd6 100644
--- a/resources/lib/helper/__init__.py
+++ b/resources/lib/helper/__init__.py
@@ -22,5 +22,5 @@ from wrapper import progress
 from wrapper import catch
 from wrapper import silent_catch
 from wrapper import stop
-from wrapper import emby_item
+from wrapper import jellyfin_item
 from wrapper import library_check
diff --git a/resources/lib/helper/playutils.py b/resources/lib/helper/playutils.py
index b8a9966d..a7423d5b 100644
--- a/resources/lib/helper/playutils.py
+++ b/resources/lib/helper/playutils.py
@@ -17,7 +17,6 @@ import collections
 import requests
 from . import _, settings, window, dialog
 from downloader import TheVoid
-from emby import Emby
 
 #################################################################################################
 
diff --git a/resources/lib/helper/wrapper.py b/resources/lib/helper/wrapper.py
index a0172cdb..c9649c01 100644
--- a/resources/lib/helper/wrapper.py
+++ b/resources/lib/helper/wrapper.py
@@ -99,13 +99,13 @@ def stop(default=None):
         return wrapper
     return decorator
 
-def emby_item():
+def jellyfin_item():
 
     ''' Wrapper to retrieve the jellyfin_db item.
     '''
     def decorator(func):
         def wrapper(self, item, *args, **kwargs):
-            e_item = self.emby_db.get_item_by_id(item['Id'] if type(item) == dict else item)
+            e_item = self.jellyfin_db.get_item_by_id(item['Id'] if type(item) == dict else item)
 
             return func(self, item, e_item=e_item, *args, **kwargs)
 
@@ -129,7 +129,7 @@ def library_check():
                 if 'e_item' in kwargs:
                     try:
                         view_id = kwargs['e_item'][6]
-                        view_name = self.emby_db.get_view_name(view_id)
+                        view_name = self.jellyfin_db.get_view_name(view_id)
                         view = {'Name': view_name, 'Id': view_id}
                     except Exception:
                         view = None
@@ -141,7 +141,7 @@ def library_check():
                         if item['Type'] == 'MusicArtist':
 
                             try:
-                                views = self.emby_db.get_views_by_media('music')[0]
+                                views = self.jellyfin_db.get_views_by_media('music')[0]
                             except Exception:
                                 return
 
@@ -152,7 +152,7 @@ def library_check():
                         for ancestor in ancestors:
                             if ancestor['Type'] == 'CollectionFolder':
 
-                                view = self.emby_db.get_view_name(ancestor['Id'])
+                                view = self.jellyfin_db.get_view_name(ancestor['Id'])
                                 view = {'Id': None, 'Name': None} if view is None else {'Name': ancestor['Name'], 'Id': ancestor['Id']}
 
                                 break
diff --git a/resources/lib/emby/__init__.py b/resources/lib/jellyfin/__init__.py
similarity index 91%
rename from resources/lib/emby/__init__.py
rename to resources/lib/jellyfin/__init__.py
index 2112b5e2..06046328 100644
--- a/resources/lib/emby/__init__.py
+++ b/resources/lib/jellyfin/__init__.py
@@ -4,7 +4,7 @@
 
 import logging
 
-from client import EmbyClient
+from client import JellyfinClient
 from helpers import has_attribute
 
 #################################################################################################
@@ -21,7 +21,7 @@ LOG = logging.getLogger('Jellyfin')
 def config(level=logging.INFO):
 
     logger = logging.getLogger('Jellyfin')
-    logger.addHandler(Emby.loghandler())
+    logger.addHandler(Jellyfin.loghandler())
     logger.setLevel(level)
 
 def ensure_client():
@@ -38,7 +38,7 @@ def ensure_client():
     return decorator
 
 
-class Emby(object):
+class Jellyfin(object):
 
     ''' This is your Jellyfinclient, you can create more than one. The server_id is only a temporary thing
         to communicate with the JellyfinClient().
@@ -92,7 +92,7 @@ class Emby(object):
             cls.client[client].stop()
 
         cls.client = {}
-        LOG.info("---[ STOPPED ALL JELLYFINCLIENT ]---")
+        LOG.info("---[ STOPPED ALL JELLYFINCLIENTS ]---")
 
     @classmethod
     def get_active_clients(cls):
@@ -102,7 +102,7 @@ class Emby(object):
     def __setattr__(self, name, value):
 
         if has_attribute(self, name):
-            return super(Emby, self).__setattr__(name, value)
+            return super(Jellyfin, self).__setattr__(name, value)
 
         setattr(self.client[self.server_id], name, value)
 
@@ -116,7 +116,7 @@ class Emby(object):
 
     def construct(self):
 
-        self.client[self.server_id] = EmbyClient()
+        self.client[self.server_id] = JellyfinClient()
 
         if self.server_id == 'default':
             LOG.info("---[ START JELLYFINCLIENT ]---")
diff --git a/resources/lib/emby/client.py b/resources/lib/jellyfin/client.py
similarity index 96%
rename from resources/lib/emby/client.py
rename to resources/lib/jellyfin/client.py
index d4ba426b..c57bf729 100644
--- a/resources/lib/emby/client.py
+++ b/resources/lib/jellyfin/client.py
@@ -25,7 +25,7 @@ def callback(message, data):
     pass
 
 
-class EmbyClient(object):
+class JellyfinClient(object):
 
     logged_in = False
 
@@ -36,7 +36,7 @@ class EmbyClient(object):
         self.http = HTTP(self)
         self.wsc = WSClient(self)
         self.auth = ConnectionManager(self)
-        self.emby = api.API(self.http)
+        self.jellyfin = api.API(self.http)
         self.callback_ws = callback
         self.callback = callback
 
@@ -100,7 +100,7 @@ class EmbyClient(object):
             return self.auth.__shortcuts__(key.replace('auth/', "", 1))
 
         elif key.startswith('api'):
-            return self.emby
+            return self.jellyfin
 
         elif key == 'connected':
             return self.logged_in
diff --git a/resources/lib/emby/core/__init__.py b/resources/lib/jellyfin/core/__init__.py
similarity index 100%
rename from resources/lib/emby/core/__init__.py
rename to resources/lib/jellyfin/core/__init__.py
diff --git a/resources/lib/emby/core/api.py b/resources/lib/jellyfin/core/api.py
similarity index 96%
rename from resources/lib/emby/core/api.py
rename to resources/lib/jellyfin/core/api.py
index d23efdec..04d966b3 100644
--- a/resources/lib/emby/core/api.py
+++ b/resources/lib/jellyfin/core/api.py
@@ -2,7 +2,7 @@
 
 #################################################################################################
 
-def emby_url(client, handler):
+def jellyfin_url(client, handler):
     return  "%s/emby/%s" % (client.config['auth.server'], handler)
 
 def basic_info():
@@ -96,9 +96,9 @@ class API(object):
     def artwork(self, item_id, art, max_width, ext="jpg", index=None):
 
         if index is None:
-            return  emby_url(self.client, "Items/%s/Images/%s?MaxWidth=%s&format=%s" % (item_id, art, max_width, ext))
+            return  jellyfin_url(self.client, "Items/%s/Images/%s?MaxWidth=%s&format=%s" % (item_id, art, max_width, ext))
 
-        return emby_url(self.client, "Items/%s/Images/%s/%s?MaxWidth=%s&format=%s" % (item_id, art, index, max_width, ext))
+        return jellyfin_url(self.client, "Items/%s/Images/%s/%s?MaxWidth=%s&format=%s" % (item_id, art, index, max_width, ext))
 
     #################################################################################################
 
@@ -306,13 +306,13 @@ class API(object):
         return  self.users("/PlayedItems/%s" % item_id, "POST" if watched else "DELETE")
 
     def get_sync_queue(self, date, filters=None):
-        return  self._get("Emby.Kodi.SyncQueue/{UserId}/GetItems", params={
+        return  self._get("Jellyfin.Plugin.KodiSyncQueue/{UserId}/GetItems", params={
                     'LastUpdateDT': date,
                     'filter': filters or None
                 })
 
     def get_server_time(self):
-        return  self._get("Emby.Kodi.SyncQueue/GetServerDateTime")
+        return  self._get("Jellyfin.Plugin.KodiSyncQueue/GetServerDateTime")
 
     def get_play_info(self, item_id, profile):
         return  self.items("/%s/PlaybackInfo" % item_id, "POST", json={
diff --git a/resources/lib/emby/core/configuration.py b/resources/lib/jellyfin/core/configuration.py
similarity index 100%
rename from resources/lib/emby/core/configuration.py
rename to resources/lib/jellyfin/core/configuration.py
diff --git a/resources/lib/emby/core/connection_manager.py b/resources/lib/jellyfin/core/connection_manager.py
similarity index 97%
rename from resources/lib/emby/core/connection_manager.py
rename to resources/lib/jellyfin/core/connection_manager.py
index 64adbee7..b363d48e 100644
--- a/resources/lib/emby/core/connection_manager.py
+++ b/resources/lib/jellyfin/core/connection_manager.py
@@ -75,11 +75,11 @@ class ConnectionManager(object):
         elif key == "server-version":
             return self.server_version
         elif key == "user-id":
-            return self.emby_user_id()
+            return self.jellyfin_user_id()
         elif key == "public-users":
             return self.get_public_users()
         elif key == "token":
-            return self.emby_token()
+            return self.jellyfin_token()
         elif key == "manual-server":
             return self.connect_to_address
         elif key == "connect-to-server":
@@ -154,7 +154,7 @@ class ConnectionManager(object):
         try:
             request = {
                 'type': "POST",
-                'url': self.get_emby_url(server, "Users/AuthenticateByName"),
+                'url': self.get_jellyfin_url(server, "Users/AuthenticateByName"),
                 'json': {
                     'username': username,
                     'password': hashlib.sha1(password or "").hexdigest(),
@@ -226,10 +226,10 @@ class ConnectionManager(object):
         LOG.info("Begin connect")
         return self._connect_to_servers(self.get_available_servers(), options)
 
-    def emby_user_id(self):
+    def jellyfin_user_id(self):
         return self.get_server_info(self.server_id)['UserId']
 
-    def emby_token(self):
+    def jellyfin_token(self):
         return self.get_server_info(self.server_id)['AccessToken']
 
     def get_server_info(self, server_id):
@@ -245,9 +245,9 @@ class ConnectionManager(object):
                 return server
 
     def get_public_users(self):
-        return self.client.emby.get_public_users()
+        return self.client.jellyfin.get_public_users()
 
-    def get_emby_url(self, base, handler):
+    def get_jellyfin_url(self, base, handler):
         return "%s/emby/%s" % (base, handler)
 
     def _request_url(self, request, headers=True):
@@ -306,7 +306,7 @@ class ConnectionManager(object):
 
     def _try_connect(self, url, timeout=None, options={}):
 
-        url = self.get_emby_url(url, "system/info/public")
+        url = self.get_jellyfin_url(url, "system/info/public")
         LOG.info("tryConnect url: %s", url)
 
         return self._request_url({
@@ -582,7 +582,7 @@ class ConnectionManager(object):
         try:
             system_info = self._request_url({
                 'type': "GET",
-                'url': self.get_emby_url(get_server_address(server, connection_mode), "System/Info"),
+                'url': self.get_jellyfin_url(get_server_address(server, connection_mode), "System/Info"),
                 'verify': options.get('ssl'),
                 'dataType': "json",
                 'headers': {
diff --git a/resources/lib/emby/core/credentials.py b/resources/lib/jellyfin/core/credentials.py
similarity index 100%
rename from resources/lib/emby/core/credentials.py
rename to resources/lib/jellyfin/core/credentials.py
diff --git a/resources/lib/emby/core/exceptions.py b/resources/lib/jellyfin/core/exceptions.py
similarity index 100%
rename from resources/lib/emby/core/exceptions.py
rename to resources/lib/jellyfin/core/exceptions.py
diff --git a/resources/lib/emby/core/http.py b/resources/lib/jellyfin/core/http.py
similarity index 100%
rename from resources/lib/emby/core/http.py
rename to resources/lib/jellyfin/core/http.py
diff --git a/resources/lib/emby/core/ws_client.py b/resources/lib/jellyfin/core/ws_client.py
similarity index 100%
rename from resources/lib/emby/core/ws_client.py
rename to resources/lib/jellyfin/core/ws_client.py
diff --git a/resources/lib/emby/helpers/__init__.py b/resources/lib/jellyfin/helpers/__init__.py
similarity index 100%
rename from resources/lib/emby/helpers/__init__.py
rename to resources/lib/jellyfin/helpers/__init__.py
diff --git a/resources/lib/emby/helpers/utils.py b/resources/lib/jellyfin/helpers/utils.py
similarity index 100%
rename from resources/lib/emby/helpers/utils.py
rename to resources/lib/jellyfin/helpers/utils.py
diff --git a/resources/lib/emby/resources/__init__.py b/resources/lib/jellyfin/resources/__init__.py
similarity index 100%
rename from resources/lib/emby/resources/__init__.py
rename to resources/lib/jellyfin/resources/__init__.py
diff --git a/resources/lib/emby/resources/websocket.py b/resources/lib/jellyfin/resources/websocket.py
similarity index 100%
rename from resources/lib/emby/resources/websocket.py
rename to resources/lib/jellyfin/resources/websocket.py
diff --git a/resources/lib/library.py b/resources/lib/library.py
index 01e2405a..2adab038 100644
--- a/resources/lib/library.py
+++ b/resources/lib/library.py
@@ -12,13 +12,13 @@ import xbmc
 import xbmcgui
 
 from objects import Movies, TVShows, MusicVideos, Music
-from database import Database, emby_db, get_sync, save_sync
+from database import Database, jellyfin_db, get_sync, save_sync
 from full_sync import FullSync
 from views import Views
 from downloader import GetItemWorker
 from helper import _, api, stop, settings, window, dialog, event, progress, LibraryException
 from helper.utils import split_list, set_screensaver, get_screensaver
-from emby import Emby
+from jellyfin import Jellyfin
 
 ##################################################################################################
 
@@ -62,7 +62,7 @@ class Library(threading.Thread):
         self.progress_display = int(settings('syncProgress') or 50)
         self.monitor = monitor
         self.player = monitor.monitor.player
-        self.server = Emby().get_client()
+        self.server = Jellyfin().get_client()
         self.updated_queue = Queue.Queue()
         self.userdata_queue = Queue.Queue()
         self.removed_queue = Queue.Queue()
@@ -71,7 +71,7 @@ class Library(threading.Thread):
         self.removed_output = self.__new_queues__()
         self.notify_output = Queue.Queue()
 
-        self.emby_threads = []
+        self.jellyfin_threads = []
         self.download_threads = []
         self.notify_threads = []
         self.writer_threads = {'updated': [], 'userdata': [], 'removed': []}
@@ -240,7 +240,7 @@ class Library(threading.Thread):
 
         ''' Get items based on the local jellyfin database and place item in appropriate queues.
         '''
-        if self.removed_queue.qsize() and len(self.emby_threads) < 2:
+        if self.removed_queue.qsize() and len(self.jellyfin_threads) < 2:
 
             new_thread = SortWorker(self.removed_queue, self.removed_output)
             new_thread.start()
@@ -482,8 +482,8 @@ class Library(threading.Thread):
         whitelist = [x.replace('Mixed:', "") for x in sync['Whitelist']]
         libraries = []
 
-        with Database('jellyfin') as embydb:
-            db = emby_db.EmbyDatabase(embydb.cursor)
+        with Database('jellyfin') as jellyfindb:
+            db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
 
             if mode in ('SyncLibrarySelection', 'RepairLibrarySelection', 'RemoveLibrarySelection'):
                 for library in sync['Whitelist']:
@@ -614,7 +614,7 @@ class UpdatedWorker(threading.Thread):
 
         with self.lock:
             with self.database as kodidb:
-                with Database('jellyfin') as embydb:
+                with Database('jellyfin') as jellyfindb:
 
                     while True:
 
@@ -623,7 +623,7 @@ class UpdatedWorker(threading.Thread):
                         except Queue.Empty:
                             break
 
-                        obj = MEDIA[item['Type']](self.args[0], embydb, kodidb, self.args[1])[item['Type']]
+                        obj = MEDIA[item['Type']](self.args[0], jellyfindb, kodidb, self.args[1])[item['Type']]
 
                         try:
                             if obj(item) and self.notify:
@@ -658,7 +658,7 @@ class UserDataWorker(threading.Thread):
 
         with self.lock:
             with self.database as kodidb:
-                with Database('jellyfin') as embydb:
+                with Database('jellyfin') as jellyfindb:
 
                     while True:
 
@@ -667,7 +667,7 @@ class UserDataWorker(threading.Thread):
                         except Queue.Empty:
                             break
 
-                        obj = MEDIA[item['Type']](self.args[0], embydb, kodidb, self.args[1])['UserData']
+                        obj = MEDIA[item['Type']](self.args[0], jellyfindb, kodidb, self.args[1])['UserData']
 
                         try:
                             obj(item)
@@ -698,8 +698,8 @@ class SortWorker(threading.Thread):
 
     def run(self):
 
-        with Database('jellyfin') as embydb:
-            database = emby_db.EmbyDatabase(embydb.cursor)
+        with Database('jellyfin') as jellyfindb:
+            database = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
 
             while True:
 
@@ -744,7 +744,7 @@ class RemovedWorker(threading.Thread):
 
         with self.lock:
             with self.database as kodidb:
-                with Database('jellyfin') as embydb:
+                with Database('jellyfin') as jellyfindb:
 
                     while True:
 
@@ -753,7 +753,7 @@ class RemovedWorker(threading.Thread):
                         except Queue.Empty:
                             break
 
-                        obj = MEDIA[item['Type']](self.args[0], embydb, kodidb, self.args[1])['Remove']
+                        obj = MEDIA[item['Type']](self.args[0], jellyfindb, kodidb, self.args[1])['Remove']
 
                         try:
                             obj(item['Id'])
diff --git a/resources/lib/monitor.py b/resources/lib/monitor.py
index 2d297abb..5d583b2d 100644
--- a/resources/lib/monitor.py
+++ b/resources/lib/monitor.py
@@ -17,7 +17,7 @@ import player
 from client import get_device_id
 from objects import Actions, PlaylistWorker, on_play, on_update, special_listener
 from helper import _, settings, window, dialog, event, api, JSONRPC
-from emby import Emby
+from jellyfin import Jellyfin
 from webservice import WebService
 
 #################################################################################################
@@ -118,9 +118,9 @@ class Monitor(xbmc.Monitor):
 
                     return
 
-            server = Emby(data['ServerId'])
+            server = Jellyfin(data['ServerId'])
         except Exception:
-            server = Emby()
+            server = Jellyfin()
 
         if method == 'GetItem':
 
@@ -169,7 +169,7 @@ class Monitor(xbmc.Monitor):
 
         elif method == 'GetUsers':
 
-            users = server['api'].get_users(data.get('IsDisabled', True), data.get('IsHidden', True))
+            users = server['api'].get_users()
             self.void_responder(data, users)
 
         elif method == 'GetTranscodeOptions':
@@ -277,7 +277,7 @@ class Monitor(xbmc.Monitor):
 
     def server_instance(self, server_id=None):
 
-        server = Emby(server_id)
+        server = Jellyfin(server_id)
         self.post_capabilities(server)
 
         if server_id is not None:
diff --git a/resources/lib/objects/actions.py b/resources/lib/objects/actions.py
index cdd92dad..1112fb3b 100644
--- a/resources/lib/objects/actions.py
+++ b/resources/lib/objects/actions.py
@@ -18,7 +18,6 @@ from downloader import TheVoid
 from obj import Objects
 from helper import _, playutils, api, window, settings, dialog, JSONRPC
 from dialogs import resume
-from emby import Emby
 from utils import get_play_action
 
 #################################################################################################
diff --git a/resources/lib/objects/movies.py b/resources/lib/objects/movies.py
index 426a3e7f..c1b2f5b7 100644
--- a/resources/lib/objects/movies.py
+++ b/resources/lib/objects/movies.py
@@ -9,8 +9,8 @@ import urllib
 import downloader as server
 from obj import Objects
 from kodi import Movies as KodiDb, queries as QU
-from database import emby_db, queries as QUEM
-from helper import api, catch, stop, validate, emby_item, library_check, values, settings, Local
+from database import jellyfin_db, queries as QUEM
+from helper import api, catch, stop, validate, jellyfin_item, library_check, values, settings, Local
 
 ##################################################################################################
 
@@ -21,14 +21,14 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
 
 class Movies(KodiDb):
 
-    def __init__(self, server, embydb, videodb, direct_path):
+    def __init__(self, server, jellyfindb, videodb, direct_path):
 
         self.server = server
-        self.emby = embydb
+        self.jellyfin = jellyfindb
         self.video = videodb
         self.direct_path = direct_path
 
-        self.emby_db = emby_db.EmbyDatabase(embydb.cursor)
+        self.jellyfin_db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
         self.objects = Objects()
         self.item_ids = []
 
@@ -46,7 +46,7 @@ class Movies(KodiDb):
             return self.remove
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     @library_check()
     def movie(self, item, e_item, library):
         
@@ -146,7 +146,7 @@ class Movies(KodiDb):
         obj['FileId'] = self.add_file(*values(obj, QU.add_file_obj))
 
         self.add(*values(obj, QU.add_movie_obj))
-        self.emby_db.add_reference(*values(obj, QUEM.add_reference_movie_obj))
+        self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_movie_obj))
         LOG.info("ADD movie [%s/%s/%s] %s: %s", obj['PathId'], obj['FileId'], obj['MovieId'], obj['Id'], obj['Title'])
 
     def movie_update(self, obj):
@@ -160,7 +160,7 @@ class Movies(KodiDb):
         self.update_unique_id(*values(obj, QU.update_unique_id_movie_obj))
 
         self.update(*values(obj, QU.update_movie_obj))
-        self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
+        self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
         LOG.info("UPDATE movie [%s/%s/%s] %s: %s", obj['PathId'], obj['FileId'], obj['MovieId'], obj['Id'], obj['Title'])
 
     def trailer(self, obj):
@@ -203,7 +203,7 @@ class Movies(KodiDb):
 
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def boxset(self, item, e_item):
                 
         ''' If item does not exist, entry will be added.
@@ -234,11 +234,11 @@ class Movies(KodiDb):
             temp_obj['Movie'] = movie
             temp_obj['MovieId'] = obj['Current'][temp_obj['Movie']]
             self.remove_from_boxset(*values(temp_obj, QU.delete_movie_set_obj))
-            self.emby_db.update_parent_id(*values(temp_obj, QUEM.delete_parent_boxset_obj))
+            self.jellyfin_db.update_parent_id(*values(temp_obj, QUEM.delete_parent_boxset_obj))
             LOG.info("DELETE from boxset [%s] %s: %s", temp_obj['SetId'], temp_obj['Title'], temp_obj['MovieId'])
 
         self.artwork.add(obj['Artwork'], obj['SetId'], "set")
-        self.emby_db.add_reference(*values(obj, QUEM.add_reference_boxset_obj))
+        self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_boxset_obj))
         LOG.info("UPDATE boxset [%s] %s", obj['SetId'], obj['Title'])
 
     def boxset_current(self, obj):
@@ -246,7 +246,7 @@ class Movies(KodiDb):
         ''' Add or removes movies based on the current movies found in the boxset.
         '''
         try:
-            current = self.emby_db.get_item_id_by_parent_id(*values(obj, QUEM.get_item_id_by_parent_boxset_obj))
+            current = self.jellyfin_db.get_item_id_by_parent_id(*values(obj, QUEM.get_item_id_by_parent_boxset_obj))
             movies = dict(current)
         except ValueError:
             movies = {}
@@ -261,7 +261,7 @@ class Movies(KodiDb):
                 temp_obj['Id'] = movie['Id']
 
                 try:
-                    temp_obj['MovieId'] = self.emby_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
+                    temp_obj['MovieId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
                 except TypeError:
                     LOG.info("Failed to process %s to boxset.", temp_obj['Title'])
 
@@ -270,7 +270,7 @@ class Movies(KodiDb):
                 if temp_obj['Id'] not in obj['Current']:
 
                     self.set_boxset(*values(temp_obj, QU.update_movie_set_obj))
-                    self.emby_db.update_parent_id(*values(temp_obj, QUEM.update_parent_movie_obj))
+                    self.jellyfin_db.update_parent_id(*values(temp_obj, QUEM.update_parent_movie_obj))
                     LOG.info("ADD to boxset [%s/%s] %s: %s to boxset", temp_obj['SetId'], temp_obj['MovieId'], temp_obj['Title'], temp_obj['Id'])
                 else:
                     obj['Current'].pop(temp_obj['Id'])
@@ -279,12 +279,12 @@ class Movies(KodiDb):
 
         ''' Special function to remove all existing boxsets.
         '''
-        boxsets = self.emby_db.get_items_by_media('set')
+        boxsets = self.jellyfin_db.get_items_by_media('set')
         for boxset in boxsets:
             self.remove(boxset[0])
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def userdata(self, item, e_item):
         
         ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks
@@ -313,11 +313,11 @@ class Movies(KodiDb):
 
         LOG.debug("New resume point %s: %s", obj['Id'], obj['Resume'])
         self.add_playstate(*values(obj, QU.add_bookmark_obj))
-        self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
+        self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
         LOG.info("USERDATA movie [%s/%s] %s: %s", obj['FileId'], obj['MovieId'], obj['Id'], obj['Title'])
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def remove(self, item_id, e_item):
 
         ''' Remove movieid, fileid, jellyfin reference.
@@ -338,15 +338,15 @@ class Movies(KodiDb):
             self.delete(*values(obj, QU.delete_movie_obj))
         elif obj['Media'] == 'set':
 
-            for movie in self.emby_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_movie_obj)):
+            for movie in self.jellyfin_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_movie_obj)):
                 
                 temp_obj = dict(obj)
                 temp_obj['MovieId'] = movie[1]
                 temp_obj['Movie'] = movie[0]
                 self.remove_from_boxset(*values(temp_obj, QU.delete_movie_set_obj))
-                self.emby_db.update_parent_id(*values(temp_obj, QUEM.delete_parent_boxset_obj))
+                self.jellyfin_db.update_parent_id(*values(temp_obj, QUEM.delete_parent_boxset_obj))
 
             self.delete_boxset(*values(obj, QU.delete_set_obj))
 
-        self.emby_db.remove_item(*values(obj, QUEM.delete_item_obj))
+        self.jellyfin_db.remove_item(*values(obj, QUEM.delete_item_obj))
         LOG.info("DELETE %s [%s/%s] %s", obj['Media'], obj['FileId'], obj['KodiId'], obj['Id'])
diff --git a/resources/lib/objects/music.py b/resources/lib/objects/music.py
index fe0fd428..cb1c1c4a 100644
--- a/resources/lib/objects/music.py
+++ b/resources/lib/objects/music.py
@@ -9,8 +9,8 @@ import urllib
 
 from obj import Objects
 from kodi import Music as KodiDb, queries_music as QU
-from database import emby_db, queries as QUEM
-from helper import api, catch, stop, validate, emby_item, values, library_check, settings, Local
+from database import jellyfin_db, queries as QUEM
+from helper import api, catch, stop, validate, jellyfin_item, values, library_check, settings, Local
 
 ##################################################################################################
 
@@ -21,14 +21,14 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
 
 class Music(KodiDb):
 
-    def __init__(self, server, embydb, musicdb, direct_path):
+    def __init__(self, server, jellyfindb, musicdb, direct_path):
 
         self.server = server
-        self.emby = embydb
+        self.jellyfin = jellyfindb
         self.music = musicdb
         self.direct_path = direct_path
 
-        self.emby_db = emby_db.EmbyDatabase(embydb.cursor)
+        self.jellyfin_db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
         self.objects = Objects()
         self.item_ids = []
 
@@ -48,7 +48,7 @@ class Music(KodiDb):
             return self.remove
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     @library_check()
     def artist(self, item, e_item, library):
 
@@ -107,19 +107,19 @@ class Music(KodiDb):
             Kodi doesn't allow that. In case that happens we just merge the artist entries.
         '''
         obj['ArtistId'] = self.get(*values(obj, QU.get_artist_obj))
-        self.emby_db.add_reference(*values(obj, QUEM.add_reference_artist_obj))
+        self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_artist_obj))
         LOG.info("ADD artist [%s] %s: %s", obj['ArtistId'], obj['Name'], obj['Id'])
 
     def artist_update(self, obj):
 
         ''' Update object to kodi.
         '''
-        self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
+        self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
         LOG.info("UPDATE artist [%s] %s: %s", obj['ArtistId'], obj['Name'], obj['Id'])
 
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def album(self, item, e_item):
 
         ''' Update object to kodi.
@@ -172,14 +172,14 @@ class Music(KodiDb):
         ''' Add object to kodi.
         '''
         obj['AlbumId'] = self.get_album(*values(obj, QU.get_album_obj))
-        self.emby_db.add_reference(*values(obj, QUEM.add_reference_album_obj))
+        self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_album_obj))
         LOG.info("ADD album [%s] %s: %s", obj['AlbumId'], obj['Title'], obj['Id'])
 
     def album_update(self, obj):
         
         ''' Update object to kodi.
         '''
-        self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
+        self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
         LOG.info("UPDATE album [%s] %s: %s", obj['AlbumId'], obj['Title'], obj['Id'])
 
     def artist_discography(self, obj):
@@ -193,12 +193,12 @@ class Music(KodiDb):
             temp_obj['AlbumId'] = obj['Id']
 
             try:
-                temp_obj['ArtistId'] = self.emby_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
+                temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
             except TypeError:
                 continue
 
             self.add_discography(*values(temp_obj, QU.update_discography_obj))
-            self.emby_db.update_parent_id(*values(temp_obj, QUEM.update_parent_album_obj))
+            self.jellyfin_db.update_parent_id(*values(temp_obj, QUEM.update_parent_album_obj))
 
     def artist_link(self, obj):
 
@@ -212,12 +212,12 @@ class Music(KodiDb):
             temp_obj['Id'] = artist['Id']
 
             try:
-                temp_obj['ArtistId'] = self.emby_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
+                temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
             except TypeError:
 
                 try:
                     self.artist(self.server['api'].get_item(temp_obj['Id']), library=None)
-                    temp_obj['ArtistId'] = self.emby_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
+                    temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
                 except Exception as error:
                     LOG.error(error)
                     continue
@@ -228,7 +228,7 @@ class Music(KodiDb):
 
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def song(self, item, e_item):
 
         ''' Update object to kodi.
@@ -310,7 +310,7 @@ class Music(KodiDb):
         obj['PathId'] = self.add_path(obj['Path'])
 
         try:
-            obj['AlbumId'] = self.emby_db.get_item_by_id(*values(obj, QUEM.get_item_song_obj))[0]
+            obj['AlbumId'] = self.jellyfin_db.get_item_by_id(*values(obj, QUEM.get_item_song_obj))[0]
         except TypeError:
 
             try:
@@ -318,12 +318,12 @@ class Music(KodiDb):
                     raise TypeError("No album id found associated?")
 
                 self.album(self.server['api'].get_item(obj['SongAlbumId']))
-                obj['AlbumId'] = self.emby_db.get_item_by_id(*values(obj, QUEM.get_item_song_obj))[0]
+                obj['AlbumId'] = self.jellyfin_db.get_item_by_id(*values(obj, QUEM.get_item_song_obj))[0]
             except TypeError:
                 self.single(obj)
 
         self.add_song(*values(obj, QU.add_song_obj))
-        self.emby_db.add_reference(*values(obj, QUEM.add_reference_song_obj))
+        self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_song_obj))
         LOG.debug("ADD song [%s/%s/%s] %s: %s", obj['PathId'], obj['AlbumId'], obj['SongId'], obj['Id'], obj['Title'])
 
     def song_update(self, obj):
@@ -333,7 +333,7 @@ class Music(KodiDb):
         self.update_path(*values(obj, QU.update_path_obj))
 
         self.update_song(*values(obj, QU.update_song_obj))
-        self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
+        self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
         LOG.info("UPDATE song [%s/%s/%s] %s: %s", obj['PathId'], obj['AlbumId'], obj['SongId'], obj['Id'], obj['Title'])
 
     def get_song_path_filename(self, obj, api):
@@ -368,12 +368,12 @@ class Music(KodiDb):
             artists.append(temp_obj['Name'])
 
             try:
-                temp_obj['ArtistId'] = self.emby_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
+                temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
             except TypeError:
 
                 try:
                     self.artist(self.server['api'].get_item(temp_obj['Id']), library=None)
-                    temp_obj['ArtistId'] = self.emby_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
+                    temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
                 except Exception as error:
                     LOG.error(error)
                     continue
@@ -402,12 +402,12 @@ class Music(KodiDb):
             temp_obj['Index'] = index
 
             try:
-                temp_obj['ArtistId'] = self.emby_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
+                temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
             except TypeError:
 
                 try:
                     self.artist(self.server['api'].get_item(temp_obj['Id']), library=None)
-                    temp_obj['ArtistId'] = self.emby_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
+                    temp_obj['ArtistId'] = self.jellyfin_db.get_item_by_id(*values(temp_obj, QUEM.get_item_obj))[0]
                 except Exception as error:
                     LOG.error(error)
                     continue
@@ -422,7 +422,7 @@ class Music(KodiDb):
 
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def userdata(self, item, e_item):
         
         ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks
@@ -446,11 +446,11 @@ class Music(KodiDb):
 
             self.rate_song(*values(obj, QU.update_song_rating_obj))
 
-        self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
+        self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
         LOG.info("USERDATA %s [%s] %s: %s", obj['Media'], obj['KodiId'], obj['Id'], obj['Title'])
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def remove(self, item_id, e_item):
         
         ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks
@@ -470,47 +470,47 @@ class Music(KodiDb):
         if obj['Media'] == 'song':
             
             self.remove_song(obj['KodiId'], obj['Id'])
-            self.emby_db.remove_wild_item(obj['id'])
+            self.jellyfin_db.remove_wild_item(obj['id'])
 
-            for item in self.emby_get_item_by_wild_id(*values(obj, QUEM.get_item_by_wild_obj)):
+            for item in self.jellyfin_db.get_item_by_wild_id(*values(obj, QUEM.get_item_by_wild_obj)):
                 if item[1] == 'album':
 
                     temp_obj = dict(obj)
                     temp_obj['ParentId'] = item[0]
 
-                    if not self.emby_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_song_obj)):
+                    if not self.jellyfin_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_song_obj)):
                         self.remove_album(temp_obj['ParentId'], obj['Id'])
 
         elif obj['Media'] == 'album':
             obj['ParentId'] = obj['KodiId']
 
-            for song in self.emby_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_song_obj)):
+            for song in self.jellyfin_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_song_obj)):
                 self.remove_song(song[1], obj['Id'])
             else:
-                self.emby_db.remove_items_by_parent_id(*values(obj, QUEM.delete_item_by_parent_song_obj))
+                self.jellyfin_db.remove_items_by_parent_id(*values(obj, QUEM.delete_item_by_parent_song_obj))
 
             self.remove_album(obj['KodiId'], obj['Id'])
 
         elif obj['Media'] == 'artist':
             obj['ParentId'] = obj['KodiId']
 
-            for album in self.emby_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_album_obj)):
+            for album in self.jellyfin_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_album_obj)):
 
                 temp_obj = dict(obj)
                 temp_obj['ParentId'] = album[1]
 
-                for song in self.emby_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_song_obj)):
+                for song in self.jellyfin_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_song_obj)):
                     self.remove_song(song[1], obj['Id'])
                 else:
-                    self.emby_db.remove_items_by_parent_id(*values(temp_obj, QUEM.delete_item_by_parent_song_obj))
-                    self.emby_db.remove_items_by_parent_id(*values(temp_obj, QUEM.delete_item_by_parent_artist_obj))
+                    self.jellyfin_db.remove_items_by_parent_id(*values(temp_obj, QUEM.delete_item_by_parent_song_obj))
+                    self.jellyfin_db.remove_items_by_parent_id(*values(temp_obj, QUEM.delete_item_by_parent_artist_obj))
                     self.remove_album(temp_obj['ParentId'], obj['Id'])
             else:
-                self.emby_db.remove_items_by_parent_id(*values(obj, QUEM.delete_item_by_parent_album_obj))
+                self.jellyfin_db.remove_items_by_parent_id(*values(obj, QUEM.delete_item_by_parent_album_obj))
 
             self.remove_artist(obj['KodiId'], obj['Id'])
 
-        self.emby_db.remove_item(*values(obj, QUEM.delete_item_obj))
+        self.jellyfin_db.remove_item(*values(obj, QUEM.delete_item_obj))
 
     def remove_artist(self, kodi_id, item_id):
         
@@ -530,7 +530,7 @@ class Music(KodiDb):
         self.delete_song(kodi_id)
         LOG.info("DELETE song [%s] %s", kodi_id, item_id)
 
-    @emby_item()
+    @jellyfin_item()
     def get_child(self, item_id, e_item):
 
         ''' Get all child elements from tv show jellyfin id.
@@ -548,13 +548,13 @@ class Music(KodiDb):
 
         obj['ParentId'] = obj['KodiId']
 
-        for album in self.emby_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_album_obj)):
+        for album in self.jellyfin_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_album_obj)):
 
             temp_obj = dict(obj)
             temp_obj['ParentId'] = album[1]
             child.append((album[0],))
 
-            for song in self.emby_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_song_obj)):
+            for song in self.jellyfin_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_song_obj)):
                 child.append((song[0],))
 
         return child
diff --git a/resources/lib/objects/musicvideos.py b/resources/lib/objects/musicvideos.py
index 69b55189..e4beb00d 100644
--- a/resources/lib/objects/musicvideos.py
+++ b/resources/lib/objects/musicvideos.py
@@ -9,8 +9,8 @@ import urllib
 
 from obj import Objects
 from kodi import MusicVideos as KodiDb, queries as QU
-from database import emby_db, queries as QUEM
-from helper import api, catch, stop, validate, library_check, emby_item, values, Local
+from database import jellyfin_db, queries as QUEM
+from helper import api, catch, stop, validate, library_check, jellyfin_item, values, Local
 
 ##################################################################################################
 
@@ -21,14 +21,14 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
 
 class MusicVideos(KodiDb):
 
-    def __init__(self, server, embydb, videodb, direct_path):
+    def __init__(self, server, jellyfindb, videodb, direct_path):
 
         self.server = server
-        self.emby = embydb
+        self.jellyfin = jellyfindb
         self.video = videodb
         self.direct_path = direct_path
 
-        self.emby_db = emby_db.EmbyDatabase(embydb.cursor)
+        self.jellyfin_db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
         self.objects = Objects()
         self.item_ids = []
 
@@ -44,7 +44,7 @@ class MusicVideos(KodiDb):
             return self.remove
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     @library_check()
     def musicvideo(self, item, e_item, library):
 
@@ -149,7 +149,7 @@ class MusicVideos(KodiDb):
         obj['FileId'] = self.add_file(*values(obj, QU.add_file_obj))
 
         self.add(*values(obj, QU.add_musicvideo_obj))
-        self.emby_db.add_reference(*values(obj, QUEM.add_reference_mvideo_obj))
+        self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_mvideo_obj))
         LOG.info("ADD mvideo [%s/%s/%s] %s: %s", obj['PathId'], obj['FileId'], obj['MvideoId'], obj['Id'], obj['Title'])
 
     def musicvideo_update(self, obj):
@@ -157,7 +157,7 @@ class MusicVideos(KodiDb):
         ''' Update object to kodi.
         '''
         self.update(*values(obj, QU.update_musicvideo_obj))
-        self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
+        self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
         LOG.info("UPDATE mvideo [%s/%s/%s] %s: %s", obj['PathId'], obj['FileId'], obj['MvideoId'], obj['Id'], obj['Title'])
 
     def get_path_filename(self, obj):
@@ -185,7 +185,7 @@ class MusicVideos(KodiDb):
 
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def userdata(self, item, e_item):
         
         ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks
@@ -213,11 +213,11 @@ class MusicVideos(KodiDb):
             self.remove_tag(*values(obj, QU.delete_tag_mvideo_obj))
 
         self.add_playstate(*values(obj, QU.add_bookmark_obj))
-        self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
+        self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
         LOG.info("USERDATA mvideo [%s/%s] %s: %s", obj['FileId'], obj['MvideoId'], obj['Id'], obj['Title'])
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def remove(self, item_id, e_item):
 
         ''' Remove mvideoid, fileid, pathid, jellyfin reference. 
@@ -237,5 +237,5 @@ class MusicVideos(KodiDb):
         if self.direct_path:
             self.remove_path(*values(obj, QU.delete_path_obj))
 
-        self.emby_db.remove_item(*values(obj, QUEM.delete_item_obj))
+        self.jellyfin_db.remove_item(*values(obj, QUEM.delete_item_obj))
         LOG.info("DELETE musicvideo %s [%s/%s] %s", obj['MvideoId'], obj['PathId'], obj['FileId'], obj['Id'])
diff --git a/resources/lib/objects/tvshows.py b/resources/lib/objects/tvshows.py
index 4d9c0b01..33d96dbd 100644
--- a/resources/lib/objects/tvshows.py
+++ b/resources/lib/objects/tvshows.py
@@ -11,8 +11,8 @@ from ntpath import dirname
 from obj import Objects
 from kodi import TVShows as KodiDb, queries as QU
 import downloader as server
-from database import emby_db, queries as QUEM
-from helper import api, catch, stop, validate, emby_item, library_check, settings, values, Local
+from database import jellyfin_db, queries as QUEM
+from helper import api, catch, stop, validate, jellyfin_item, library_check, settings, values, Local
 
 ##################################################################################################
 
@@ -23,15 +23,15 @@ LOG = logging.getLogger("JELLYFIN."+__name__)
 
 class TVShows(KodiDb):
 
-    def __init__(self, server, embydb, videodb, direct_path, update_library=False):
+    def __init__(self, server, jellyfindb, videodb, direct_path, update_library=False):
 
         self.server = server
-        self.emby = embydb
+        self.jellyfin = jellyfindb
         self.video = videodb
         self.direct_path = direct_path
         self.update_library = update_library
 
-        self.emby_db = emby_db.EmbyDatabase(embydb.cursor)
+        self.jellyfin_db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
         self.objects = Objects()
         self.item_ids = []
 
@@ -51,7 +51,7 @@ class TVShows(KodiDb):
             return self.remove
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     @library_check()
     def tvshow(self, item, e_item, library):
 
@@ -143,18 +143,18 @@ class TVShows(KodiDb):
                 self.item_ids.append(season['SeriesId'])
 
                 try:
-                    self.emby_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj))[0]
+                    self.jellyfin_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj))[0]
 
                     if self.update_library:
                         season_episodes[season['Id']] = season['SeriesId']
                 except TypeError:
 
-                    self.emby_db.add_reference(*values(obj, QUEM.add_reference_pool_obj))
+                    self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_pool_obj))
                     LOG.info("POOL %s [%s/%s]", obj['Title'], obj['Id'], obj['SeriesId'])
                     season_episodes[season['Id']] = season['SeriesId']
                 
             try:
-                self.emby_db.get_item_by_id(season['Id'])[0]
+                self.jellyfin_db.get_item_by_id(season['Id'])[0]
                 self.item_ids.append(season['Id'])
             except TypeError:
                 self.season(season, obj['ShowId'])
@@ -184,7 +184,7 @@ class TVShows(KodiDb):
         obj['PathId'] = self.add_path(*values(obj, QU.get_path_obj))
 
         self.add(*values(obj, QU.add_tvshow_obj))
-        self.emby_db.add_reference(*values(obj, QUEM.add_reference_tvshow_obj))
+        self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_tvshow_obj))
         LOG.info("ADD tvshow [%s/%s/%s] %s: %s", obj['TopPathId'], obj['PathId'], obj['ShowId'], obj['Title'], obj['Id'])
 
     def tvshow_update(self, obj):
@@ -198,7 +198,7 @@ class TVShows(KodiDb):
         self.update_unique_id(*values(obj, QU.update_unique_id_tvshow_obj))
 
         self.update(*values(obj, QU.update_tvshow_obj))
-        self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
+        self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
         LOG.info("UPDATE tvshow [%s/%s] %s: %s", obj['PathId'], obj['ShowId'], obj['Title'], obj['Id'])
 
     def get_path_filename(self, obj):
@@ -237,7 +237,7 @@ class TVShows(KodiDb):
         if obj['ShowId'] is None:
 
             try:
-                obj['ShowId'] = self.emby_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj))[0]
+                obj['ShowId'] = self.jellyfin_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj))[0]
             except (KeyError, TypeError):
                 LOG.error("Unable to add series %s", obj['SeriesId'])
 
@@ -247,7 +247,7 @@ class TVShows(KodiDb):
         obj['Artwork'] = API.get_all_artwork(self.objects.map(item, 'Artwork'))
 
         if obj['Location'] != "Virtual":
-            self.emby_db.add_reference(*values(obj, QUEM.add_reference_season_obj))
+            self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_season_obj))
             self.item_ids.append(obj['Id'])
 
         self.artwork.add(obj['Artwork'], obj['SeasonId'], "season")
@@ -255,7 +255,7 @@ class TVShows(KodiDb):
 
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def episode(self, item, e_item):
 
         ''' If item does not exist, entry will be added.
@@ -384,7 +384,7 @@ class TVShows(KodiDb):
 
             return self.episode_add(obj)
 
-        self.emby_db.add_reference(*values(obj, QUEM.add_reference_episode_obj))
+        self.jellyfin_db.add_reference(*values(obj, QUEM.add_reference_episode_obj))
         LOG.debug("ADD episode [%s/%s] %s: %s", obj['PathId'], obj['FileId'], obj['Id'], obj['Title'])
 
     def episode_update(self, obj):
@@ -399,8 +399,8 @@ class TVShows(KodiDb):
 
         self.update_episode(*values(obj, QU.update_episode_obj))
 
-        self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
-        self.emby_db.update_parent_id(*values(obj, QUEM.update_parent_episode_obj))
+        self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
+        self.jellyfin_db.update_parent_id(*values(obj, QUEM.update_parent_episode_obj))
         LOG.debug("UPDATE episode [%s/%s] %s: %s", obj['PathId'], obj['FileId'], obj['Id'], obj['Title'])
 
     def get_episode_path_filename(self, obj):
@@ -429,13 +429,13 @@ class TVShows(KodiDb):
             obj['Filename'] = "%s?%s" % (obj['Path'], urllib.urlencode(params))
 
     def get_show_id(self, obj):
-        obj['ShowId'] = self.emby_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj))
+        obj['ShowId'] = self.jellyfin_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj))
 
         if obj['ShowId'] is None:
 
             try:
                 self.tvshow(self.server['api'].get_item(obj['SeriesId']), library=None)
-                obj['ShowId'] = self.emby_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj))[0]
+                obj['ShowId'] = self.jellyfin_db.get_item_by_id(*values(obj, QUEM.get_item_series_obj))[0]
             except (TypeError, KeyError):
                 LOG.error("Unable to add series %s", obj['SeriesId'])
 
@@ -449,7 +449,7 @@ class TVShows(KodiDb):
 
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def userdata(self, item, e_item):
         
         ''' This updates: Favorite, LastPlayedDate, Playcount, PlaybackPositionTicks
@@ -505,11 +505,11 @@ class TVShows(KodiDb):
                 self.update_file(*values(temp_obj, QU.update_file_obj))
                 self.add_playstate(*values(temp_obj, QU.add_bookmark_obj))
 
-        self.emby_db.update_reference(*values(obj, QUEM.update_reference_obj))
+        self.jellyfin_db.update_reference(*values(obj, QUEM.update_reference_obj))
         LOG.info("USERDATA %s [%s/%s] %s: %s", obj['Media'], obj['FileId'], obj['KodiId'], obj['Id'], obj['Title'])
 
     @stop()
-    @emby_item()
+    @jellyfin_item()
     def remove(self, item_id, e_item):
         
         ''' Remove showid, fileid, pathid, jellyfin reference.
@@ -529,7 +529,7 @@ class TVShows(KodiDb):
 
             temp_obj = dict(obj)
             self.remove_episode(obj['KodiId'], obj['FileId'], obj['Id'])
-            season = self.emby_db.get_full_item_by_kodi_id(*values(obj, QUEM.delete_item_by_parent_season_obj))
+            season = self.jellyfin_db.get_full_item_by_kodi_id(*values(obj, QUEM.delete_item_by_parent_season_obj))
 
             try:
                 temp_obj['Id'] = season[0]
@@ -537,61 +537,61 @@ class TVShows(KodiDb):
             except TypeError:
                 return
 
-            if not self.emby_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_episode_obj)):
+            if not self.jellyfin_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_episode_obj)):
 
                 self.remove_season(obj['ParentId'], obj['Id'])
-                self.emby_db.remove_item(*values(temp_obj, QUEM.delete_item_obj))
+                self.jellyfin_db.remove_item(*values(temp_obj, QUEM.delete_item_obj))
 
-            temp_obj['Id'] = self.emby_db.get_item_by_kodi_id(*values(temp_obj, QUEM.get_item_by_parent_tvshow_obj))
+            temp_obj['Id'] = self.jellyfin_db.get_item_by_kodi_id(*values(temp_obj, QUEM.get_item_by_parent_tvshow_obj))
 
             if not self.get_total_episodes(*values(temp_obj, QU.get_total_episodes_obj)):
 
-                for season in self.emby_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_season_obj)):
+                for season in self.jellyfin_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_season_obj)):
                     self.remove_season(season[1], obj['Id'])
                 else:
-                    self.emby_db.remove_items_by_parent_id(*values(temp_obj, QUEM.delete_item_by_parent_season_obj))
+                    self.jellyfin_db.remove_items_by_parent_id(*values(temp_obj, QUEM.delete_item_by_parent_season_obj))
 
                 self.remove_tvshow(temp_obj['ParentId'], obj['Id'])
-                self.emby_db.remove_item(*values(temp_obj, QUEM.delete_item_obj))
+                self.jellyfin_db.remove_item(*values(temp_obj, QUEM.delete_item_obj))
 
         elif obj['Media'] == 'tvshow':
             obj['ParentId'] = obj['KodiId']
 
-            for season in self.emby_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_season_obj)):
+            for season in self.jellyfin_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_season_obj)):
                 
                 temp_obj = dict(obj)
                 temp_obj['ParentId'] = season[1]
 
-                for episode in self.emby_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_episode_obj)):
+                for episode in self.jellyfin_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_episode_obj)):
                     self.remove_episode(episode[1], episode[2], obj['Id'])
                 else:
-                    self.emby_db.remove_items_by_parent_id(*values(temp_obj, QUEM.delete_item_by_parent_episode_obj))
+                    self.jellyfin_db.remove_items_by_parent_id(*values(temp_obj, QUEM.delete_item_by_parent_episode_obj))
             else:
-                self.emby_db.remove_items_by_parent_id(*values(obj, QUEM.delete_item_by_parent_season_obj))
+                self.jellyfin_db.remove_items_by_parent_id(*values(obj, QUEM.delete_item_by_parent_season_obj))
 
             self.remove_tvshow(obj['KodiId'], obj['Id'])
 
         elif obj['Media'] == 'season':
 
-            for episode in self.emby_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_episode_obj)):
+            for episode in self.jellyfin_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_episode_obj)):
                 self.remove_episode(episode[1], episode[2], obj['Id'])
             else:
-                self.emby_db.remove_items_by_parent_id(*values(obj, QUEM.delete_item_by_parent_episode_obj))
+                self.jellyfin_db.remove_items_by_parent_id(*values(obj, QUEM.delete_item_by_parent_episode_obj))
 
             self.remove_season(obj['KodiId'], obj['Id'])
 
-            if not self.emby_db.get_item_by_parent_id(*values(obj, QUEM.delete_item_by_parent_season_obj)):
+            if not self.jellyfin_db.get_item_by_parent_id(*values(obj, QUEM.delete_item_by_parent_season_obj)):
 
                 self.remove_tvshow(obj['ParentId'], obj['Id'])
-                self.emby_db.remove_item_by_kodi_id(*values(obj, QUEM.delete_item_by_parent_tvshow_obj))
+                self.jellyfin_db.remove_item_by_kodi_id(*values(obj, QUEM.delete_item_by_parent_tvshow_obj))
 
         # Remove any series pooling episodes
-        for episode in self.emby_db.get_media_by_parent_id(obj['Id']):
+        for episode in self.jellyfin_db.get_media_by_parent_id(obj['Id']):
             self.remove_episode(episode[2], episode[3], obj['Id'])
         else:
-            self.emby_db.remove_media_by_parent_id(obj['Id'])
+            self.jellyfin_db.remove_media_by_parent_id(obj['Id'])
 
-        self.emby_db.remove_item(*values(obj, QUEM.delete_item_obj))
+        self.jellyfin_db.remove_item(*values(obj, QUEM.delete_item_obj))
 
     def remove_tvshow(self, kodi_id, item_id):
         
@@ -611,7 +611,7 @@ class TVShows(KodiDb):
         self.delete_episode(kodi_id, file_id)
         LOG.info("DELETE episode [%s/%s] %s", file_id, kodi_id, item_id)
 
-    @emby_item()
+    @jellyfin_item()
     def get_child(self, item_id, e_item):
 
         ''' Get all child elements from tv show jellyfin id.
@@ -629,16 +629,16 @@ class TVShows(KodiDb):
 
         obj['ParentId'] = obj['KodiId']
 
-        for season in self.emby_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_season_obj)):
+        for season in self.jellyfin_db.get_item_by_parent_id(*values(obj, QUEM.get_item_by_parent_season_obj)):
             
             temp_obj = dict(obj)
             temp_obj['ParentId'] = season[1]
             child.append(season[0])
 
-            for episode in self.emby_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_episode_obj)):
+            for episode in self.jellyfin_db.get_item_by_parent_id(*values(temp_obj, QUEM.get_item_by_parent_episode_obj)):
                 child.append(episode[0])
 
-        for episode in self.emby_db.get_media_by_parent_id(obj['Id']):
+        for episode in self.jellyfin_db.get_media_by_parent_id(obj['Id']):
             child.append(episode[0])
 
         return child
diff --git a/resources/lib/player.py b/resources/lib/player.py
index aadc60ec..8f5e9c1d 100644
--- a/resources/lib/player.py
+++ b/resources/lib/player.py
@@ -11,7 +11,7 @@ import xbmcvfs
 
 from objects.obj import Objects
 from helper import _, api, window, settings, dialog, event, silent_catch, JSONRPC
-from emby import Emby
+from jellyfin import Jellyfin
 
 #################################################################################################
 
@@ -148,7 +148,7 @@ class Player(xbmc.Player):
             'CurrentPosition': item.get('CurrentPosition') or int(seektime),
             'Muted': muted,
             'Volume': volume,
-            'Server': Emby(item['ServerId']).get_client(),
+            'Server': Jellyfin(item['ServerId']).get_client(),
             'Paused': False
         })
 
diff --git a/resources/lib/views.py b/resources/lib/views.py
index d7899cc1..0ebc5773 100644
--- a/resources/lib/views.py
+++ b/resources/lib/views.py
@@ -12,10 +12,10 @@ import xbmc
 import xbmcvfs
 
 import downloader as server
-from database import Database, emby_db, get_sync, save_sync
+from database import Database, jellyfin_db, get_sync, save_sync
 from objects.kodi import kodi
 from helper import _, api, indent, write_xml, window, event
-from emby import Emby
+from jellyfin import Jellyfin
 
 #################################################################################################
 
@@ -144,21 +144,21 @@ class Views(object):
     def __init__(self):
 
         self.sync = get_sync()
-        self.server = Emby()
+        self.server = Jellyfin()
 
     def add_library(self, view):
 
         ''' Add entry to view table in jellyfin database.
         '''
-        with Database('jellyfin') as embydb:
-            emby_db.EmbyDatabase(embydb.cursor).add_view(view['Id'], view['Name'], view['Media'])
+        with Database('jellyfin') as jellyfindb:
+            jellyfin_db.JellyfinDatabase(jellyfindb.cursor).add_view(view['Id'], view['Name'], view['Media'])
 
     def remove_library(self, view_id):
 
         ''' Remove entry from view table in jellyfin database.
         '''
-        with Database('jellyfin') as embydb:
-            emby_db.EmbyDatabase(embydb.cursor).remove_view(view_id)
+        with Database('jellyfin') as jellyfindb:
+            jellyfin_db.JellyfinDatabase(jellyfindb.cursor).remove_view(view_id)
 
         self.delete_playlist_by_id(view_id)
         self.delete_node_by_id(view_id)
@@ -203,9 +203,9 @@ class Views(object):
 
             self.add_library(library)
 
-        with Database('jellyfin') as embydb:
+        with Database('jellyfin') as jellyfindb:
 
-            views = emby_db.EmbyDatabase(embydb.cursor).get_views()
+            views = jellyfin_db.JellyfinDatabase(jellyfindb.cursor).get_views()
             removed = []
 
             for view in views:
@@ -226,8 +226,8 @@ class Views(object):
         playlist_path = xbmc.translatePath("special://profile/playlists/video").decode('utf-8')
         index = 0
 
-        with Database('jellyfin') as embydb:
-            db = emby_db.EmbyDatabase(embydb.cursor)
+        with Database('jellyfin') as jellyfindb:
+            db = jellyfin_db.JellyfinDatabase(jellyfindb.cursor)
 
             for library in self.sync['Whitelist']:
 
@@ -682,8 +682,8 @@ class Views(object):
         self.window_clear()
         self.window_clear('Jellyfin.wnodes')
 
-        with Database('jellyfin') as embydb:
-            libraries = emby_db.EmbyDatabase(embydb.cursor).get_views()
+        with Database('jellyfin') as jellyfindb:
+            libraries = jellyfin_db.JellyfinDatabase(jellyfindb.cursor).get_views()
 
         libraries = self.order_media_folders(libraries or [])
         index = 0
diff --git a/service.py b/service.py
index ccd53d0b..adb58c05 100644
--- a/service.py
+++ b/service.py
@@ -34,7 +34,6 @@ sys.path.append(__base__)
 
 from entrypoint import Service
 from helper import settings
-from emby import Emby
 
 #################################################################################################
 

From fd9cde60083a9f9475a2026cfb85d5059b35f316 Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 18:28:50 +0100
Subject: [PATCH 06/15] Fix some tuples

---
 resources/lib/monitor.py         | 2 +-
 resources/lib/objects/actions.py | 2 +-
 resources/lib/views.py           | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/resources/lib/monitor.py b/resources/lib/monitor.py
index 5d583b2d..eab1d72c 100644
--- a/resources/lib/monitor.py
+++ b/resources/lib/monitor.py
@@ -69,7 +69,7 @@ class Monitor(xbmc.Monitor):
         elif sender.startswith('upnextprovider'):
             method = method.split('.')[1]
 
-            if method not in ('plugin.video.jellyfin_play_action'):
+            if method not in ('plugin.video.jellyfin_play_action',):
                 return
 
             data = json.loads(data)
diff --git a/resources/lib/objects/actions.py b/resources/lib/objects/actions.py
index 1112fb3b..2b88ca56 100644
--- a/resources/lib/objects/actions.py
+++ b/resources/lib/objects/actions.py
@@ -238,7 +238,7 @@ class Actions(object):
             obj['Artwork'] = API.get_all_artwork(objects.map(item, 'Artwork'))
             self.listitem_photo(obj, listitem, item)
 
-        elif item['Type'] in ('TvChannel'):
+        elif item['Type'] in ('TvChannel',):
 
             obj = objects.map(item, 'BrowseChannel')
             obj['Artwork'] = API.get_all_artwork(objects.map(item, 'Artwork'))
diff --git a/resources/lib/views.py b/resources/lib/views.py
index 0ebc5773..1e6b8901 100644
--- a/resources/lib/views.py
+++ b/resources/lib/views.py
@@ -250,7 +250,7 @@ class Views(object):
                         if view['Media'] in ('movies', 'tvshows', 'musicvideos'):
                             self.add_playlist(playlist_path, view)
 
-                        if view['Media'] not in ('music'):
+                        if view['Media'] not in ('music',):
                             self.add_nodes(node_path, view)
 
                     index += 1

From 5f720da986a7e08414a97f9352705ef6ea85c862 Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 21:22:00 +0100
Subject: [PATCH 07/15] Update icon url to jellyfin repo

---
 resources/lib/monitor.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/resources/lib/monitor.py b/resources/lib/monitor.py
index eab1d72c..bc34b8a8 100644
--- a/resources/lib/monitor.py
+++ b/resources/lib/monitor.py
@@ -312,7 +312,7 @@ class Monitor(xbmc.Monitor):
                 "Mute,Unmute,SetVolume,"
                 "Play,Playstate,PlayNext,PlayMediaSource"
             ),
-            'IconUrl': "https://raw.githubusercontent.com/MediaBrowser/plugin.video.jellyfin/develop/kodi_icon.png",
+            'IconUrl': "https://raw.githubusercontent.com/jellyfin/jellyfin-kodi/master/kodi_icon.png",
         })
 
         session = server['api'].get_device(self.device_id)

From 5fba6555a8ee8e3acbfee7bf79fb571c058bf52b Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 21:26:29 +0100
Subject: [PATCH 08/15] Remove automatic object updates

---
 .../resource.language.de_de/strings.po        |  4 --
 .../resource.language.en_gb/strings.po        |  4 --
 .../resource.language.fr_fr/strings.po        |  4 --
 .../resource.language.it_it/strings.po        |  4 --
 .../resource.language.nl_nl/strings.po        |  4 --
 .../resource.language.pl_pl/strings.po        |  4 --
 resources/lib/entrypoint/default.py           |  2 -
 resources/lib/entrypoint/service.py           | 54 +------------------
 resources/settings.xml                        |  1 -
 9 files changed, 1 insertion(+), 80 deletions(-)

diff --git a/resources/language/resource.language.de_de/strings.po b/resources/language/resource.language.de_de/strings.po
index 13ab68da..78a237b9 100644
--- a/resources/language/resource.language.de_de/strings.po
+++ b/resources/language/resource.language.de_de/strings.po
@@ -911,10 +911,6 @@ msgctxt "#33160"
 msgid "To avoid errors, please update Jellyfin for Kodi to version: "
 msgstr "Um Fehler zu vermeiden update bitte 'Jellyfin for Kodi' zur Version:"
 
-msgctxt "#33161"
-msgid "Check for updates"
-msgstr "Nach Updates suchen"
-
 msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr "Musik Datenbank zurücksetzen?"
diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po
index fa95164e..08e3d787 100644
--- a/resources/language/resource.language.en_gb/strings.po
+++ b/resources/language/resource.language.en_gb/strings.po
@@ -802,10 +802,6 @@ msgctxt "#33160"
 msgid "To avoid errors, please update Jellyfin for Kodi to version: "
 msgstr ""
 
-msgctxt "#33161"
-msgid "Check for updates"
-msgstr ""
-
 msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr ""
diff --git a/resources/language/resource.language.fr_fr/strings.po b/resources/language/resource.language.fr_fr/strings.po
index fab7aea9..d0e97a8f 100644
--- a/resources/language/resource.language.fr_fr/strings.po
+++ b/resources/language/resource.language.fr_fr/strings.po
@@ -914,10 +914,6 @@ msgstr ""
 "Pour éviter les erreurs, veuillez mettre à jour la version d'Jellyfin pour Kodi "
 ": "
 
-msgctxt "#33161"
-msgid "Check for updates"
-msgstr "Rechercher des mises à jour"
-
 msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr "Réinitialiser la médiathèque musicale ?"
diff --git a/resources/language/resource.language.it_it/strings.po b/resources/language/resource.language.it_it/strings.po
index bb343b1a..09cdadf3 100644
--- a/resources/language/resource.language.it_it/strings.po
+++ b/resources/language/resource.language.it_it/strings.po
@@ -907,10 +907,6 @@ msgctxt "#33160"
 msgid "To avoid errors, please update Jellyfin for Kodi to version: "
 msgstr "Per evitare errori, aggiorna Jellyfin per Kodi alla versione:"
 
-msgctxt "#33161"
-msgid "Check for updates"
-msgstr "Ricerca aggiornamenti"
-
 msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr "Ripristinare la libreria musicale?"
diff --git a/resources/language/resource.language.nl_nl/strings.po b/resources/language/resource.language.nl_nl/strings.po
index 6b0a83a7..e947b63d 100644
--- a/resources/language/resource.language.nl_nl/strings.po
+++ b/resources/language/resource.language.nl_nl/strings.po
@@ -901,10 +901,6 @@ msgctxt "#33160"
 msgid "To avoid errors, please update Jellyfin for Kodi to version: "
 msgstr "Om problemen voorkomen, update Jellyfin for Kodi naar versie:"
 
-msgctxt "#33161"
-msgid "Check for updates"
-msgstr "Naar updates zoeken"
-
 msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr "Muziek bibliotheek resetten?"
diff --git a/resources/language/resource.language.pl_pl/strings.po b/resources/language/resource.language.pl_pl/strings.po
index eccb5b3a..5c4daf16 100644
--- a/resources/language/resource.language.pl_pl/strings.po
+++ b/resources/language/resource.language.pl_pl/strings.po
@@ -897,10 +897,6 @@ msgctxt "#33160"
 msgid "To avoid errors, please update Jellyfin for Kodi to version: "
 msgstr "Aby uniknąć błędów, należy zaktualizować Jellyfin dla Kodi do wersji:"
 
-msgctxt "#33161"
-msgid "Check for updates"
-msgstr "Sprawdź aktualizacje"
-
 msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr "Zresetować bibliotekę muzyki?"
diff --git a/resources/lib/entrypoint/default.py b/resources/lib/entrypoint/default.py
index a409ccd3..0b12a1fc 100644
--- a/resources/lib/entrypoint/default.py
+++ b/resources/lib/entrypoint/default.py
@@ -110,8 +110,6 @@ class Events(object):
             xbmc.executebuiltin('Addon.OpenSettings(plugin.video.jellyfin)')
         elif mode == 'adduser':
             add_user()
-        elif mode == 'checkupdate':
-            event('CheckUpdate')
         elif mode == 'updateserver':
             event('UpdateServer')
         elif mode == 'thememedia':
diff --git a/resources/lib/entrypoint/service.py b/resources/lib/entrypoint/service.py
index 8abe4c06..74e01a72 100644
--- a/resources/lib/entrypoint/service.py
+++ b/resources/lib/entrypoint/service.py
@@ -79,7 +79,6 @@ class Service(xbmc.Monitor):
             LOG.error(error)
 
         window('jellyfin.connected.bool', True)
-        self.check_update()
         settings('groupedSets.bool', objects.utils.get_grouped_set())
         xbmc.Monitor.__init__(self)
 
@@ -173,49 +172,6 @@ class Service(xbmc.Monitor):
 
                 raise Exception("Completed database reset")
 
-    def check_update(self, forced=False):
-
-        ''' Check for objects build version and compare.
-            This pulls a dict that contains all the information for the build needed.
-        '''
-        LOG.info("--[ check updates/%s ]", objects.version)
-        kodi = "DEV" if settings('devMode.bool') else xbmc.getInfoLabel('System.BuildVersion')
-        # FIXME we do not want their updates
-        return False
-        try:
-            versions = requests.get('http://kodi.emby.media/Public%20testing/Dependencies/databases.json').json()
-            build = find(versions, kodi)
-
-            if not build:
-                raise Exception("build %s incompatible?!" % kodi)
-
-            label, zipfile = build.split('-', 1)
-
-            if label == 'DEV' and forced:
-                LOG.info("--[ force/objects/%s ]", label)
-
-            elif label == objects.version:
-                LOG.info("--[ objects/%s ]", objects.version)
-
-                return False
-
-            get_objects(zipfile, label + '.zip')
-            self.reload_objects()
-
-            dialog("notification", heading="{jellyfin}", message=_(33156), icon="{jellyfin}")
-            LOG.info("--[ new objects/%s ]", objects.version)
-
-            try:
-                if compare_version(self.settings['addon_version'], objects.jellyfinversion) < 0:
-                    dialog("ok", heading="{jellyfin}", line1="%s %s" % (_(33160), objects.jellyfinversion))
-            except Exception:
-                pass
-
-        except Exception as error:
-            LOG.exception(error)
-
-        return True
-    
     def onNotification(self, sender, method, data):
 
         ''' All notifications are sent via NotifyAll built-in or Kodi.
@@ -231,7 +187,7 @@ class Service(xbmc.Monitor):
                               'LibraryChanged', 'ServerOnline', 'SyncLibrary', 'RepairLibrary', 'RemoveLibrary',
                               'SyncLibrarySelection', 'RepairLibrarySelection', 'AddServer',
                               'Unauthorized', 'UpdateServer', 'UserConfigurationUpdated', 'ServerRestarting',
-                              'RemoveServer', 'AddLibrarySelection', 'CheckUpdate', 'RemoveLibrarySelection'):
+                              'RemoveServer', 'AddLibrarySelection', 'RemoveLibrarySelection'):
                 return
 
             data = json.loads(data)[0]
@@ -420,14 +376,6 @@ class Service(xbmc.Monitor):
             if data.get('ServerId') is None:
                 Views().get_views()
 
-        elif method == 'CheckUpdate':
-
-            if not self.check_update(True):
-                dialog("notification", heading="{jellyfin}", message=_(21341), icon="{jellyfin}", sound=False)
-            else:
-                dialog("notification", heading="{jellyfin}", message=_(33181), icon="{jellyfin}", sound=False)
-                window('jellyfin.restart.bool', True)
-
     def onSettingsChanged(self):
 
         ''' React to setting changes that impact window values.
diff --git a/resources/settings.xml b/resources/settings.xml
index 3db34d32..d907a8e1 100644
--- a/resources/settings.xml
+++ b/resources/settings.xml
@@ -96,7 +96,6 @@
 		<setting label="33195" id="enableAddon" type="bool" default="true" />
 		<setting label="33180" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=restartservice)" option="close" />
 		<setting label="30529" id="startupDelay" type="number" default="0" option="int" />
-		<setting label="33161" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=checkupdate)" option="close" />
 		<setting label="Developer mode" id="devMode" type="bool" default="false" />
 		
 		<setting type="sep" />

From 995f871e19a0f283cef081e0d7ae5090fab195a5 Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 21:30:18 +0100
Subject: [PATCH 09/15] Remove Connect as a login method option

---
 resources/settings.xml | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/resources/settings.xml b/resources/settings.xml
index d907a8e1..5d6f630d 100644
--- a/resources/settings.xml
+++ b/resources/settings.xml
@@ -2,9 +2,8 @@
 <settings>
 
 	<category label="29999"><!-- Jellyfin -->
-		<setting label="30003" id="idMethod" type="enum" values="Manual|Jellyfin Connect" default="0" />
-		<setting label="30024" id="username" type="text" default="" visible="eq(-1,0)" />
-		<setting label="30543" id="connectUsername" type="text" default="" visible="!eq(0,) + eq(-2,1)" />
+		<setting label="30003" id="idMethod" type="enum" values="Manual" default="0" />
+		<setting label="30024" id="username" type="text" default="" visible="true" />
 		<setting label="30001" id="serverName" type="text" default="" />
 		<setting label="30000" id="server" type="text" default="" visible="true" />
 		<setting label="33150" type="action" action="RunPlugin(plugin://plugin.video.jellyfin?mode=updateserver)" visible="!eq(-1,)" option="close" />

From 8f4d2bfb89198ffd7751272c00f0e5a008f36c02 Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 21:31:06 +0100
Subject: [PATCH 10/15] Remove trailing whitespace

---
 resources/lib/database/queries.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/resources/lib/database/queries.py b/resources/lib/database/queries.py
index 00d032df..5b9c4a7f 100644
--- a/resources/lib/database/queries.py
+++ b/resources/lib/database/queries.py
@@ -115,7 +115,7 @@ add_reference_album_obj =   [   "{Id}","{AlbumId}",None,None,"MusicAlbum","album
                             ]
 add_reference_song_obj =    [   "{Id}","{SongId}",None,"{PathId}","Audio","song","{AlbumId}","{Checksum}",
                                 None,"{JellyfinParentId}"
-                            ]  
+                            ]
 add_view =              """ INSERT OR REPLACE INTO  view(view_id, view_name, media_type)
                             VALUES                  (?, ?, ?)
                         """

From fe6ebc9bf82619d08393015972cca4e8ef322abb Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 22:17:32 +0100
Subject: [PATCH 11/15] Update readme

---
 README.md | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/README.md b/README.md
index 89ebb2c4..30d536fe 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,6 @@
 # Jellyfin for Kodi
-
+<!--
+TODO
 [![EmbyKodi_Banner](https://i.imgur.com/hx4cx41.png)](https://forum.jellyfin.org/)
 
 [![Wiki](https://img.shields.io/badge/get%20started-wiki-brightgreen.svg)](https://github.com/MediaBrowser/plugin.video.emby/wiki) 
@@ -7,6 +8,7 @@
 [![Donate](https://img.shields.io/badge/donate-kofi-blue.svg)](https://ko-fi.com/A5354BI)
 [![Emby](https://img.shields.io/badge/server-emby-52b54b.svg)](https://jellyfin.media/)
 ___
+-->
 **A whole new way to manage and view your media library.**
 
 The Jellyfin for Kodi add-on combines the best of Kodi - ultra smooth navigation, beautiful UIs and playback of any file under the sun, and Jellyfin - the most powerful open source multi-client media metadata indexer and server. You can now retire your MySQL setup in favor of a more flexible setup.
@@ -32,16 +34,18 @@ The add-on supports a hybrid approach. You can decide which Jellyfin libraries t
 - Remote control your Kodi; send play commands from your Jellyfin web client or Jellyfin mobile apps.
 - Extrafanart (rotating backgrounds) for skins that support it
 - Offer to delete content after playback
-- Backup your Jellyfin Kodi profile. See the [Jellyfin backup option](https://github.com/MediaBrowser/plugin.video.emby/wiki/Create-and-restore-from-backup)
+- Backup your Jellyfin Kodi profile.
 - and more...
 
 ### Install Jellyfin for Kodi
-Get started with the [wiki guide](https://github.com/MediaBrowser/plugin.video.emby/wiki)
+1. Install Jellyfin for Kodi from zip.
+2. Within a few seconds you should be prompted for your server-details.
+3. Once you're succesfully authenticated with your Emby server, the initial sync will start. 
+4. The first sync of the Emby server to the local Kodi database may take some time depending on your device and library size.
+5. Once the full sync is done, you can browse your media in Kodi, and syncs will be done automatically in the background.
+
+<!-- Get started with the [wiki guide](https://github.com/MediaBrowser/plugin.video.emby/wiki) -->
 
 ### Known limitations
 - Chapter images are missing unless native playback mode is used.
-- Certain add-ons that depend on seeing where your content is located will not work unless native playback mode is selected.
-
-___
-### Help translate
-Check [Transifex](https://www.transifex.com/emby-for-kodi/emby-for-kodi/stringspo/) to help translate this project. Thank you!
+- Certain add-ons that depend on seeing where your content is located will not work unless native playback mode is selected.
\ No newline at end of file

From c50d4957682107f8970766e05a48652d8a40749c Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 22:19:19 +0100
Subject: [PATCH 12/15] Replace emby in readme

---
 README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index 30d536fe..43caee00 100644
--- a/README.md
+++ b/README.md
@@ -40,8 +40,8 @@ The add-on supports a hybrid approach. You can decide which Jellyfin libraries t
 ### Install Jellyfin for Kodi
 1. Install Jellyfin for Kodi from zip.
 2. Within a few seconds you should be prompted for your server-details.
-3. Once you're succesfully authenticated with your Emby server, the initial sync will start. 
-4. The first sync of the Emby server to the local Kodi database may take some time depending on your device and library size.
+3. Once you're succesfully authenticated with your Jellyfin server, the initial sync will start. 
+4. The first sync of the Jellyfin server to the local Kodi database may take some time depending on your device and library size.
 5. Once the full sync is done, you can browse your media in Kodi, and syncs will be done automatically in the background.
 
 <!-- Get started with the [wiki guide](https://github.com/MediaBrowser/plugin.video.emby/wiki) -->

From a0fb2207ac631dcf52b255c7437431d39d3f64e3 Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 22:29:12 +0100
Subject: [PATCH 13/15] Remove donations

---
 donations.png                                    | Bin 9087 -> 0 bytes
 .../language/resource.language.de_de/strings.po  |   4 ----
 .../language/resource.language.en_gb/strings.po  |   4 ----
 .../language/resource.language.fr_fr/strings.po  |   4 ----
 .../language/resource.language.it_it/strings.po  |   4 ----
 .../language/resource.language.nl_nl/strings.po  |   4 ----
 .../language/resource.language.pl_pl/strings.po  |   4 ----
 resources/lib/entrypoint/default.py              |   2 --
 8 files changed, 26 deletions(-)
 delete mode 100644 donations.png

diff --git a/donations.png b/donations.png
deleted file mode 100644
index fd5c0a4a7b4b40052a50670ef659fb50f9737b8c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 9087
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
IWXuEpA0mmw*Z=?k

diff --git a/resources/language/resource.language.de_de/strings.po b/resources/language/resource.language.de_de/strings.po
index 78a237b9..165a329c 100644
--- a/resources/language/resource.language.de_de/strings.po
+++ b/resources/language/resource.language.de_de/strings.po
@@ -915,10 +915,6 @@ msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr "Musik Datenbank zurücksetzen?"
 
-msgctxt "#33163"
-msgid "Support this project"
-msgstr "Unterstütze dieses Projekt"
-
 msgctxt "#33164"
 msgid "Mask sensitive information in log (does not apply to kodi logging)"
 msgstr ""
diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po
index 08e3d787..10c58d90 100644
--- a/resources/language/resource.language.en_gb/strings.po
+++ b/resources/language/resource.language.en_gb/strings.po
@@ -806,10 +806,6 @@ msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr ""
 
-msgctxt "#33163"
-msgid "Support this project"
-msgstr ""
-
 msgctxt "#33164"
 msgid "Mask sensitive information in log (does not apply to kodi logging)"
 msgstr ""
diff --git a/resources/language/resource.language.fr_fr/strings.po b/resources/language/resource.language.fr_fr/strings.po
index d0e97a8f..81c9047c 100644
--- a/resources/language/resource.language.fr_fr/strings.po
+++ b/resources/language/resource.language.fr_fr/strings.po
@@ -918,10 +918,6 @@ msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr "Réinitialiser la médiathèque musicale ?"
 
-msgctxt "#33163"
-msgid "Support this project"
-msgstr "Soutenir ce projet"
-
 msgctxt "#33164"
 msgid "Mask sensitive information in log (does not apply to kodi logging)"
 msgstr ""
diff --git a/resources/language/resource.language.it_it/strings.po b/resources/language/resource.language.it_it/strings.po
index 09cdadf3..ed73f169 100644
--- a/resources/language/resource.language.it_it/strings.po
+++ b/resources/language/resource.language.it_it/strings.po
@@ -911,10 +911,6 @@ msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr "Ripristinare la libreria musicale?"
 
-msgctxt "#33163"
-msgid "Support this project"
-msgstr "Supporta questo progetto"
-
 msgctxt "#33164"
 msgid "Mask sensitive information in log (does not apply to kodi logging)"
 msgstr ""
diff --git a/resources/language/resource.language.nl_nl/strings.po b/resources/language/resource.language.nl_nl/strings.po
index e947b63d..393c5175 100644
--- a/resources/language/resource.language.nl_nl/strings.po
+++ b/resources/language/resource.language.nl_nl/strings.po
@@ -905,10 +905,6 @@ msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr "Muziek bibliotheek resetten?"
 
-msgctxt "#33163"
-msgid "Support this project"
-msgstr "Dit project ondersteunen"
-
 msgctxt "#33164"
 msgid "Mask sensitive information in log (does not apply to kodi logging)"
 msgstr ""
diff --git a/resources/language/resource.language.pl_pl/strings.po b/resources/language/resource.language.pl_pl/strings.po
index 5c4daf16..578e5f96 100644
--- a/resources/language/resource.language.pl_pl/strings.po
+++ b/resources/language/resource.language.pl_pl/strings.po
@@ -901,10 +901,6 @@ msgctxt "#33162"
 msgid "Reset the music library?"
 msgstr "Zresetować bibliotekę muzyki?"
 
-msgctxt "#33163"
-msgid "Support this project"
-msgstr "Wesprzyj projekt"
-
 msgctxt "#33164"
 msgid "Mask sensitive information in log (does not apply to kodi logging)"
 msgstr ""
diff --git a/resources/lib/entrypoint/default.py b/resources/lib/entrypoint/default.py
index 0b12a1fc..aeba133f 100644
--- a/resources/lib/entrypoint/default.py
+++ b/resources/lib/entrypoint/default.py
@@ -191,8 +191,6 @@ def listing():
     if settings('backupPath'):
         directory(_(33092), "plugin://plugin.video.jellyfin/?mode=backup", False)
 
-    directory(_(33163), None, False, artwork="special://home/addons/plugin.video.jellyfin/donations.png")
-
     xbmcplugin.setContent(int(sys.argv[1]), 'files')
     xbmcplugin.endOfDirectory(int(sys.argv[1]))
 

From c0c737e9f05bf94f9ac40f189a086c0f1b1f7d07 Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 22:30:16 +0100
Subject: [PATCH 14/15] Add assets as per the Kodi guidelines

---
 addon.xml | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/addon.xml b/addon.xml
index aa00fea5..6c02034c 100644
--- a/addon.xml
+++ b/addon.xml
@@ -36,5 +36,9 @@
     <news>
       Rebrand in progress
     </news>
+    <assets>
+      <icon>icon.png</icon>
+      <fanart>fanart.jpg</fanart>
+    </assets>
   </extension>
 </addon>

From 6e6b23adb5cf7d1179957d5c3d82128d3e0e4f7d Mon Sep 17 00:00:00 2001
From: Claus Vium <clausvium@gmail.com>
Date: Sat, 2 Feb 2019 22:32:55 +0100
Subject: [PATCH 15/15] Add web archive link

---
 README.md | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 43caee00..c56a0f06 100644
--- a/README.md
+++ b/README.md
@@ -34,7 +34,8 @@ The add-on supports a hybrid approach. You can decide which Jellyfin libraries t
 - Remote control your Kodi; send play commands from your Jellyfin web client or Jellyfin mobile apps.
 - Extrafanart (rotating backgrounds) for skins that support it
 - Offer to delete content after playback
-- Backup your Jellyfin Kodi profile.
+- Backup your Jellyfin Kodi profile ([Create and restore from backup
+](https://web.archive.org/web/20190202213116/https://github.com/MediaBrowser/plugin.video.emby/wiki/create-and-restore-from-backup))
 - and more...
 
 ### Install Jellyfin for Kodi