diff --git a/default.py b/default.py
index d03f72f3..e6b92585 100644
--- a/default.py
+++ b/default.py
@@ -3,10 +3,8 @@ import xbmcplugin
 import xbmc
 import xbmcgui
 import xbmcvfs
-import os
-import threading
-import json
-import urllib
+import os, sys
+
 
 addonSettings = xbmcaddon.Addon(id='plugin.video.emby')
 cwd = addonSettings.getAddonInfo('path')
@@ -14,13 +12,10 @@ BASE_RESOURCE_PATH = xbmc.translatePath( os.path.join( cwd, 'resources', 'lib' )
 sys.path.append(BASE_RESOURCE_PATH)
 
 
-WINDOW = xbmcgui.Window(10000)
 
+import MainModule as mainModule
 import Utils as utils
-from PlaybackUtils import PlaybackUtils
-from DownloadUtils import DownloadUtils
-from ReadEmbyDB import ReadEmbyDB
-from API import API
+
 
 try:
     params = utils.get_params(sys.argv[2])
@@ -30,287 +25,39 @@ except:
     params = {}
     mode = None
 
-if  mode == "play" or mode == "playfromaddon":
-    # Play items via plugin://plugin.video.emby/
-    url = "{server}/mediabrowser/Users/{UserId}/Items/%s?format=json&ImageTypeLimit=1" % id
-    result = DownloadUtils().downloadUrl(url)
-    item = PlaybackUtils().PLAY(result, setup="service")
-
+##### Play items via plugin://plugin.video.emby/ #####
+if  mode == "play":
+    mainModule.doPlayback(id)
 
+##### DO DATABASE RESET #####
 elif mode == "reset":
     utils.reset()
 
+#### DO RESET AUTH #####    
 elif mode == "resetauth":
-    # User tried login and failed too many times
-    resp = xbmcgui.Dialog().yesno("Warning", "Emby might lock your account if you fail to log in too many times. Proceed anyway?")
-    if resp == 1:
-        xbmc.log("Reset login attempts.")
-        WINDOW.setProperty("Server_status", "Auth")
-    else:
-        xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)')
+    mainModule.resetAuth()
 
+##### BROWSE EMBY CHANNELS ROOT #####    
+elif  mode == "channels":
+    mainModule.BrowseChannels(id)
+
+##### BROWSE EMBY CHANNELS FOLDER #####    
+elif  mode == "channelsfolder":
+    folderid = params['folderid']
+    mainModule.BrowseChannels(id,folderid)    
     
-if  mode == "channels" or mode == "channelsfolder":
-    id = params['id']
-    
-    if mode == "channelsfolder":
-        folderid = params['folderid']
-        url = "{server}/mediabrowser/Channels/" + id + "/Items?userid={UserId}&folderid=" + folderid + "&format=json"
-    else:
-        if id == "0":
-            url = "{server}/mediabrowser/Channels?{UserId}&format=json"
-        else:
-            url = "{server}/mediabrowser/Channels/" + id + "/Items?userid={UserId}&format=json"
-    
-    pluginhandle = int(sys.argv[1])
-    _addon_id   =   int(sys.argv[1])
-    _addon_url  =   sys.argv[0]
-    
-    results = DownloadUtils().downloadUrl(url)
-    result = results.get("Items")
-    if(result == None):
-        result = []
-
-    item_count = len(result)
-    current_item = 1;
-        
-    for item in result:
-        print item
-        id=str(item.get("Id")).encode('utf-8')
-        type=item.get("Type").encode('utf-8')
-        
-        
-        if(item.get("Name") != None):
-            tempTitle = item.get("Name")
-            tempTitle=tempTitle.encode('utf-8')
-        else:
-            tempTitle = "Missing Title"
-            
-        if type=="ChannelFolderItem":
-            isFolder = True
-        else:
-            isFolder = False
-        item_type = str(type).encode('utf-8')
-        
-        if(item.get("ChannelId") != None):
-           channelId = str(item.get("ChannelId")).encode('utf-8')
-        
-        channelName = ''   
-        if(item.get("ChannelName") != None):
-           channelName = item.get("ChannelName").encode('utf-8')   
-           
-        if(item.get("PremiereDate") != None):
-            premieredatelist = (item.get("PremiereDate")).split("T")
-            premieredate = premieredatelist[0]
-        else:
-            premieredate = ""
-        
-        mediaStreams=API().getMediaStreams(item, True)
-                
-        people = API().getPeople(item)
-        
-        # Process Genres
-        genre = API().getGenre(item)
-                
-        # Process UserData
-        userData = item.get("UserData")
-        PlaybackPositionTicks = '100'
-        overlay = "0"
-        favorite = "False"
-        seekTime = 0
-        if(userData != None):
-            if userData.get("Played") != True:
-                overlay = "7"
-                watched = "true"
-            else:
-                overlay = "6"
-                watched = "false"
-            if userData.get("IsFavorite") == True:
-                overlay = "5"
-                favorite = "True"
-            else:
-                favorite = "False"
-            if userData.get("PlaybackPositionTicks") != None:
-                PlaybackPositionTicks = str(userData.get("PlaybackPositionTicks"))
-                reasonableTicks = int(userData.get("PlaybackPositionTicks")) / 1000
-                seekTime = reasonableTicks / 10000
-        
-        playCount = 0
-        if(userData != None and userData.get("Played") == True):
-            playCount = 1
-        # Populate the details list
-        details={'title'        : tempTitle,
-                 'channelname'  : channelName,
-                 'plot'         : item.get("Overview"),
-                 'Overlay'      : overlay,
-                 'playcount'    : str(playCount)}
-        
-        if item.get("Type") == "ChannelVideoItem":
-            xbmcplugin.setContent(pluginhandle, 'movies')
-        elif item.get("Type") == "ChannelAudioItem":
-            xbmcplugin.setContent(pluginhandle, 'songs')
-
-        # Populate the extraData list
-        extraData={'thumb'        : API().getArtwork(item, "Primary")  ,
-                   'fanart_image' : API().getArtwork(item, "Backdrop") ,
-                   'poster'       : API().getArtwork(item, "poster") , 
-                   'tvshow.poster': API().getArtwork(item, "tvshow.poster") ,
-                   'banner'       : API().getArtwork(item, "Banner") ,
-                   'clearlogo'    : API().getArtwork(item, "Logo") ,
-                   'discart'      : API().getArtwork(item, "Disc") ,
-                   'clearart'     : API().getArtwork(item, "Art") ,
-                   'landscape'    : API().getArtwork(item, "Thumb") ,
-                   'id'           : id ,
-                   'rating'       : item.get("CommunityRating"),
-                   'year'         : item.get("ProductionYear"),
-                   'premieredate' : premieredate,
-                   'genre'        : genre,
-                   'playcount'    : str(playCount),
-                   'itemtype'     : item_type}
-                   
-        if extraData['thumb'] == '':
-            extraData['thumb'] = extraData['fanart_image']
-            
-        liz = xbmcgui.ListItem(tempTitle)
-
-        artTypes=['poster', 'tvshow.poster', 'fanart_image', 'clearlogo', 'discart', 'banner', 'clearart', 'landscape', 'small_poster', 'tiny_poster', 'medium_poster','small_fanartimage', 'medium_fanartimage', 'medium_landscape', 'fanart_noindicators']
-        
-        for artType in artTypes:
-            imagePath=str(extraData.get(artType,''))
-            liz=PlaybackUtils().setArt(liz,artType, imagePath)
-        
-        liz.setThumbnailImage(API().getArtwork(item, "Primary"))
-        liz.setIconImage('DefaultTVShows.png')
-
-        extraData['mode'] = "channels"
-        
-        print "type-->" + type
-        
-        if type=="Channel":
-            file = _addon_url + "?id=%s&mode=channels"%id
-            xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=file, listitem=liz, isFolder=True)
-        
-        elif isFolder == True:
-            file = _addon_url + "?id=%s&mode=channelsfolder&folderid=%s" %(channelId, id)
-            xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=file, listitem=liz, isFolder=True)
-        else:
-            file = _addon_url + "?id=%s&mode=play"%id
-            liz.setProperty('IsPlayable', 'true')
-            xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=file, listitem=liz)
-
-    xbmcplugin.endOfDirectory(handle=int(sys.argv[1]))
-
+##### GET NEXTUP EPISODES FOR TAGNAME #####    
 elif  mode == "nextup":
-    #if the addon is called with nextup parameter, we return the nextepisodes list of the given tagname
-    tagname = params['id']
     limit = int(params['limit'])
-    xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
-    # First we get a list of all the in-progress TV shows - filtered by tag
-    json_query_string = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": { "sort": { "order": "descending", "method": "lastplayed" }, "filter": {"and": [{"operator":"true", "field":"inprogress", "value":""}, {"operator": "contains", "field": "tag", "value": "%s"}]}, "properties": [ "title", "studio", "mpaa", "file", "art" ]  }, "id": "libTvShows"}' %tagname)
-    print json_query_string    
-    
-    json_result = json.loads(json_query_string)
-    # If we found any, find the oldest unwatched show for each one.
-    if json_result.has_key('result') and json_result['result'].has_key('tvshows'):
-        for item in json_result['result']['tvshows']:
-            json_query2 = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": { "tvshowid": %d, "sort": {"method":"episode"}, "filter": {"field": "playcount", "operator": "lessthan", "value":"1"}, "properties": [ "title", "playcount", "season", "episode", "showtitle", "plot", "file", "rating", "resume", "tvshowid", "art", "streamdetails", "firstaired", "runtime", "writer", "dateadded", "lastplayed" ], "limits":{"end":1}}, "id": "1"}' %item['tvshowid'])
-
-            if json_query2:
-                json_query2 = json.loads(json_query2)
-                if json_query2.has_key('result') and json_query2['result'].has_key('episodes'):
-                    count = 0
-                    for item in json_query2['result']['episodes']:
-                        episode = "%.2d" % float(item['episode'])
-                        season = "%.2d" % float(item['season'])
-                        episodeno = "s%se%s" %(season,episode)
-                        watched = False
-                        if item['playcount'] >= 1:
-                            watched = True
-                        plot = item['plot']
-                        liz = xbmcgui.ListItem(item['title'])
-                        liz.setInfo( type="Video", infoLabels={ "Title": item['title'] })
-                        liz.setProperty('IsPlayable', 'true')
-                        liz.setInfo( type="Video", infoLabels={ "duration": str(item['runtime']/60) })
-                        liz.setInfo( type="Video", infoLabels={ "Episode": item['episode'] })
-                        liz.setInfo( type="Video", infoLabels={ "Season": item['season'] })
-                        liz.setInfo( type="Video", infoLabels={ "Premiered": item['firstaired'] })
-                        liz.setInfo( type="Video", infoLabels={ "Plot": plot })
-                        liz.setInfo( type="Video", infoLabels={ "TVshowTitle": item['showtitle'] })
-                        liz.setInfo( type="Video", infoLabels={ "Rating": str(round(float(item['rating']),1)) })
-                        liz.setInfo( type="Video", infoLabels={ "Playcount": item['playcount'] })
-                        if "director" in item:
-                            liz.setInfo( type="Video", infoLabels={ "Director": " / ".join(item['director']) })
-                        if "writer" in item:
-                            liz.setInfo( type="Video", infoLabels={ "Writer": " / ".join(item['writer']) })
-                        if "cast" in item:
-                            liz.setInfo( type="Video", infoLabels={ "Cast": cast[0] })
-                            liz.setInfo( type="Video", infoLabels={ "CastAndRole": cast[1] })
-                        liz.setProperty("episodeno", episodeno)
-                        liz.setProperty("resumetime", str(item['resume']['position']))
-                        liz.setProperty("totaltime", str(item['resume']['total']))
-                        liz.setArt(item['art'])
-                        liz.setThumbnailImage(item['art'].get('thumb',''))
-                        liz.setIconImage('DefaultTVShows.png')
-                        liz.setProperty("dbid", str(item['episodeid']))
-                        liz.setProperty("fanart_image", item['art'].get('tvshow.fanart',''))
-                        for key, value in item['streamdetails'].iteritems():
-                            for stream in value:
-                                liz.addStreamInfo( key, stream )
-                        #file = item['file'].replace("mode=play","mode=playfromaddon")
-                        xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=file, listitem=liz)
-                        count +=1
-                        if count == limit:
-                            break
-    xbmcplugin.endOfDirectory(handle=int(sys.argv[1]))
+    mainModule.getNextUpEpisodes(id, limit)
 
     
-#get extrafanart for listitem - this will only be used for skins that actually call the listitem's path + fanart dir... 
+##### GET EXTRAFANART FOR LISTITEM #####
 elif "extrafanart" in sys.argv[0]:
-    itemPath = ""
-    embyId = ""
+    mainModule.getExtraFanArt()
     
-    try:
-        #only do this if the listitem has actually changed
-        itemPath = xbmc.getInfoLabel("ListItem.FileNameAndPath")
-            
-        if not itemPath:
-            itemPath = xbmc.getInfoLabel("ListItem.Path")
-        
-        if ("/tvshows/" in itemPath or "/musicvideos/" in itemPath or "/movies/" in itemPath):
-            embyId = itemPath.split("/")[-2]
-
-            #we need to store the images locally for this to work because of the caching system in xbmc
-            fanartDir = xbmc.translatePath("special://thumbnails/emby/" + embyId + "/")
-            
-            if not xbmcvfs.exists(fanartDir):
-                #download the images to the cache directory
-                xbmcvfs.mkdir(fanartDir)
-                item = ReadEmbyDB().getFullItem(embyId)
-                if item != None:
-                    if item.has_key("BackdropImageTags"):
-                        if(len(item["BackdropImageTags"]) > 1):
-                            totalbackdrops = len(item["BackdropImageTags"]) 
-                            for index in range(1,totalbackdrops): 
-                                backgroundUrl = API().getArtwork(item, "Backdrop",str(index))
-                                fanartFile = os.path.join(fanartDir,"fanart" + str(index) + ".jpg")
-                                li = xbmcgui.ListItem(str(index), path=fanartFile)
-                                xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=fanartFile, listitem=li)
-                                xbmcvfs.copy(backgroundUrl,fanartFile) 
-                
-            else:
-                #use existing cached images
-                dirs, files = xbmcvfs.listdir(fanartDir)
-                count = 1
-                for file in files:
-                    count +=1
-                    li = xbmcgui.ListItem(file, path=os.path.join(fanartDir,file))
-                    xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=os.path.join(fanartDir,file), listitem=li)
-    except:
-        pass
-    
-    #always do endofdirectory to prevent errors in the logs
-    xbmcplugin.endOfDirectory(int(sys.argv[1]))
 
+##### SHOW ADDON SETTINGS #####    
 else:
     #open the addon settings if the addon is called directly from video addons
     try:
diff --git a/resources/lib/MainModule.py b/resources/lib/MainModule.py
new file mode 100644
index 00000000..0296d3f5
--- /dev/null
+++ b/resources/lib/MainModule.py
@@ -0,0 +1,293 @@
+import xbmcaddon
+import xbmcplugin
+import xbmc
+import xbmcgui
+import xbmcvfs
+import os, sys
+import threading
+import json
+import urllib
+
+
+WINDOW = xbmcgui.Window(10000)
+
+import Utils as utils
+from PlaybackUtils import PlaybackUtils
+from DownloadUtils import DownloadUtils
+from ReadEmbyDB import ReadEmbyDB
+from API import API
+
+
+##### Play items via plugin://plugin.video.emby/ #####
+def doPlayback(id):
+    url = "{server}/mediabrowser/Users/{UserId}/Items/%s?format=json&ImageTypeLimit=1" % id
+    result = DownloadUtils().downloadUrl(url)
+    item = PlaybackUtils().PLAY(result, setup="default")
+
+
+#### DO RESET AUTH #####    
+def resetAuth():
+    # User tried login and failed too many times
+    resp = xbmcgui.Dialog().yesno("Warning", "Emby might lock your account if you fail to log in too many times. Proceed anyway?")
+    if resp == 1:
+        xbmc.log("Reset login attempts.")
+        WINDOW.setProperty("Server_status", "Auth")
+    else:
+        xbmc.executebuiltin('Addon.OpenSettings(plugin.video.emby)')
+
+##### BROWSE EMBY CHANNELS #####    
+def BrowseChannels(id, folderid=None):
+    
+    _addon_id   =   int(sys.argv[1])
+    _addon_url  =   sys.argv[0]
+    
+    
+    if folderid:
+        url = "{server}/mediabrowser/Channels/" + id + "/Items?userid={UserId}&folderid=" + folderid + "&format=json"
+    else:
+        if id == "0": # id 0 is the root channels folder
+            url = "{server}/mediabrowser/Channels?{UserId}&format=json"
+        else:
+            url = "{server}/mediabrowser/Channels/" + id + "/Items?userid={UserId}&format=json"
+
+    results = DownloadUtils().downloadUrl(url)
+    if results:
+        result = results.get("Items")
+        if(result == None):
+            result = []
+
+        item_count = len(result)
+        current_item = 1;
+            
+        for item in result:
+            id=str(item.get("Id")).encode('utf-8')
+            type=item.get("Type").encode('utf-8')
+            
+            
+            if(item.get("Name") != None):
+                tempTitle = item.get("Name")
+                tempTitle=tempTitle.encode('utf-8')
+            else:
+                tempTitle = "Missing Title"
+                
+            if type=="ChannelFolderItem":
+                isFolder = True
+            else:
+                isFolder = False
+            item_type = str(type).encode('utf-8')
+            
+            if(item.get("ChannelId") != None):
+               channelId = str(item.get("ChannelId")).encode('utf-8')
+            
+            channelName = ''   
+            if(item.get("ChannelName") != None):
+               channelName = item.get("ChannelName").encode('utf-8')   
+               
+            if(item.get("PremiereDate") != None):
+                premieredatelist = (item.get("PremiereDate")).split("T")
+                premieredate = premieredatelist[0]
+            else:
+                premieredate = ""
+            
+            mediaStreams=API().getMediaStreams(item, True)
+                    
+            people = API().getPeople(item)
+            
+            # Process Genres
+            genre = API().getGenre(item)
+                    
+            # Process UserData
+            userData = item.get("UserData")
+            PlaybackPositionTicks = '100'
+            overlay = "0"
+            favorite = "False"
+            seekTime = 0
+            if(userData != None):
+                if userData.get("Played") != True:
+                    overlay = "7"
+                    watched = "true"
+                else:
+                    overlay = "6"
+                    watched = "false"
+                if userData.get("IsFavorite") == True:
+                    overlay = "5"
+                    favorite = "True"
+                else:
+                    favorite = "False"
+                if userData.get("PlaybackPositionTicks") != None:
+                    PlaybackPositionTicks = str(userData.get("PlaybackPositionTicks"))
+                    reasonableTicks = int(userData.get("PlaybackPositionTicks")) / 1000
+                    seekTime = reasonableTicks / 10000
+            
+            playCount = 0
+            if(userData != None and userData.get("Played") == True):
+                playCount = 1
+            # Populate the details list
+            details={'title'        : tempTitle,
+                     'channelname'  : channelName,
+                     'plot'         : item.get("Overview"),
+                     'Overlay'      : overlay,
+                     'playcount'    : str(playCount)}
+            
+            if item.get("Type") == "ChannelVideoItem":
+                xbmcplugin.setContent(_addon_id, 'movies')
+            elif item.get("Type") == "ChannelAudioItem":
+                xbmcplugin.setContent(_addon_id, 'songs')
+
+            # Populate the extraData list
+            extraData={'thumb'        : API().getArtwork(item, "Primary")  ,
+                       'fanart_image' : API().getArtwork(item, "Backdrop") ,
+                       'poster'       : API().getArtwork(item, "poster") , 
+                       'tvshow.poster': API().getArtwork(item, "tvshow.poster") ,
+                       'banner'       : API().getArtwork(item, "Banner") ,
+                       'clearlogo'    : API().getArtwork(item, "Logo") ,
+                       'discart'      : API().getArtwork(item, "Disc") ,
+                       'clearart'     : API().getArtwork(item, "Art") ,
+                       'landscape'    : API().getArtwork(item, "Thumb") ,
+                       'id'           : id ,
+                       'rating'       : item.get("CommunityRating"),
+                       'year'         : item.get("ProductionYear"),
+                       'premieredate' : premieredate,
+                       'genre'        : genre,
+                       'playcount'    : str(playCount),
+                       'itemtype'     : item_type}
+                       
+            if extraData['thumb'] == '':
+                extraData['thumb'] = extraData['fanart_image']
+                
+            liz = xbmcgui.ListItem(tempTitle)
+
+            artTypes=['poster', 'tvshow.poster', 'fanart_image', 'clearlogo', 'discart', 'banner', 'clearart', 'landscape', 'small_poster', 'tiny_poster', 'medium_poster','small_fanartimage', 'medium_fanartimage', 'medium_landscape', 'fanart_noindicators']
+            
+            for artType in artTypes:
+                imagePath=str(extraData.get(artType,''))
+                liz=PlaybackUtils().setArt(liz,artType, imagePath)
+            
+            liz.setThumbnailImage(API().getArtwork(item, "Primary"))
+            liz.setIconImage('DefaultTVShows.png')
+            #liz.setInfo( type="Video", infoLabels={ "Rating": item.get("CommunityRating") })
+            #liz.setInfo( type="Video", infoLabels={ "Plot": item.get("Overview") })
+            
+            if type=="Channel":
+                file = _addon_url + "?id=%s&mode=channels"%id
+                xbmcplugin.addDirectoryItem(handle=_addon_id, url=file, listitem=liz, isFolder=True)
+            
+            elif isFolder == True:
+                file = _addon_url + "?id=%s&mode=channelsfolder&folderid=%s" %(channelId, id)
+                xbmcplugin.addDirectoryItem(handle=_addon_id, url=file, listitem=liz, isFolder=True)
+            else:
+                file = _addon_url + "?id=%s&mode=play"%id
+                liz.setProperty('IsPlayable', 'true')
+                xbmcplugin.addDirectoryItem(handle=_addon_id, url=file, listitem=liz)
+
+    xbmcplugin.endOfDirectory(handle=int(sys.argv[1]))
+
+##### GET NEXTUP EPISODES FOR TAGNAME #####    
+def getNextUpEpisodes(tagname,limit):
+    #if the addon is called with nextup parameter, we return the nextepisodes list of the given tagname
+    xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
+    # First we get a list of all the in-progress TV shows - filtered by tag
+    json_query_string = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": { "sort": { "order": "descending", "method": "lastplayed" }, "filter": {"and": [{"operator":"true", "field":"inprogress", "value":""}, {"operator": "contains", "field": "tag", "value": "%s"}]}, "properties": [ "title", "studio", "mpaa", "file", "art" ]  }, "id": "libTvShows"}' %tagname)
+    print json_query_string    
+    
+    json_result = json.loads(json_query_string)
+    # If we found any, find the oldest unwatched show for each one.
+    if json_result.has_key('result') and json_result['result'].has_key('tvshows'):
+        for item in json_result['result']['tvshows']:
+            json_query2 = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetEpisodes", "params": { "tvshowid": %d, "sort": {"method":"episode"}, "filter": {"field": "playcount", "operator": "lessthan", "value":"1"}, "properties": [ "title", "playcount", "season", "episode", "showtitle", "plot", "file", "rating", "resume", "tvshowid", "art", "streamdetails", "firstaired", "runtime", "writer", "dateadded", "lastplayed" ], "limits":{"end":1}}, "id": "1"}' %item['tvshowid'])
+
+            if json_query2:
+                json_query2 = json.loads(json_query2)
+                if json_query2.has_key('result') and json_query2['result'].has_key('episodes'):
+                    count = 0
+                    for item in json_query2['result']['episodes']:
+                        episode = "%.2d" % float(item['episode'])
+                        season = "%.2d" % float(item['season'])
+                        episodeno = "s%se%s" %(season,episode)
+                        watched = False
+                        if item['playcount'] >= 1:
+                            watched = True
+                        plot = item['plot']
+                        liz = xbmcgui.ListItem(item['title'])
+                        liz.setInfo( type="Video", infoLabels={ "Title": item['title'] })
+                        liz.setProperty('IsPlayable', 'true')
+                        liz.setInfo( type="Video", infoLabels={ "duration": str(item['runtime']/60) })
+                        liz.setInfo( type="Video", infoLabels={ "Episode": item['episode'] })
+                        liz.setInfo( type="Video", infoLabels={ "Season": item['season'] })
+                        liz.setInfo( type="Video", infoLabels={ "Premiered": item['firstaired'] })
+                        liz.setInfo( type="Video", infoLabels={ "Plot": plot })
+                        liz.setInfo( type="Video", infoLabels={ "TVshowTitle": item['showtitle'] })
+                        liz.setInfo( type="Video", infoLabels={ "Rating": str(round(float(item['rating']),1)) })
+                        liz.setInfo( type="Video", infoLabels={ "Playcount": item['playcount'] })
+                        if "director" in item:
+                            liz.setInfo( type="Video", infoLabels={ "Director": " / ".join(item['director']) })
+                        if "writer" in item:
+                            liz.setInfo( type="Video", infoLabels={ "Writer": " / ".join(item['writer']) })
+                        if "cast" in item:
+                            liz.setInfo( type="Video", infoLabels={ "Cast": cast[0] })
+                            liz.setInfo( type="Video", infoLabels={ "CastAndRole": cast[1] })
+                        liz.setProperty("episodeno", episodeno)
+                        liz.setProperty("resumetime", str(item['resume']['position']))
+                        liz.setProperty("totaltime", str(item['resume']['total']))
+                        liz.setArt(item['art'])
+                        liz.setThumbnailImage(item['art'].get('thumb',''))
+                        liz.setIconImage('DefaultTVShows.png')
+                        liz.setProperty("dbid", str(item['episodeid']))
+                        liz.setProperty("fanart_image", item['art'].get('tvshow.fanart',''))
+                        for key, value in item['streamdetails'].iteritems():
+                            for stream in value:
+                                liz.addStreamInfo( key, stream )
+                        xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=item['file'], listitem=liz)
+                        count +=1
+                        if count == limit:
+                            break
+    xbmcplugin.endOfDirectory(handle=int(sys.argv[1]))
+
+    
+##### GET EXTRAFANART FOR LISTITEM #####
+def getExtraFanArt():
+    itemPath = ""
+    embyId = ""
+    #get extrafanart for listitem - this will only be used for skins that actually call the listitem's path + fanart dir... 
+    try:
+        #only do this if the listitem has actually changed
+        itemPath = xbmc.getInfoLabel("ListItem.FileNameAndPath")
+            
+        if not itemPath:
+            itemPath = xbmc.getInfoLabel("ListItem.Path")
+        
+        if ("/tvshows/" in itemPath or "/musicvideos/" in itemPath or "/movies/" in itemPath):
+            embyId = itemPath.split("/")[-2]
+
+            #we need to store the images locally for this to work because of the caching system in xbmc
+            fanartDir = xbmc.translatePath("special://thumbnails/emby/" + embyId + "/")
+            
+            if not xbmcvfs.exists(fanartDir):
+                #download the images to the cache directory
+                xbmcvfs.mkdir(fanartDir)
+                item = ReadEmbyDB().getFullItem(embyId)
+                if item != None:
+                    if item.has_key("BackdropImageTags"):
+                        if(len(item["BackdropImageTags"]) > 1):
+                            totalbackdrops = len(item["BackdropImageTags"]) 
+                            for index in range(1,totalbackdrops): 
+                                backgroundUrl = API().getArtwork(item, "Backdrop",str(index))
+                                fanartFile = os.path.join(fanartDir,"fanart" + str(index) + ".jpg")
+                                li = xbmcgui.ListItem(str(index), path=fanartFile)
+                                xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=fanartFile, listitem=li)
+                                xbmcvfs.copy(backgroundUrl,fanartFile) 
+                
+            else:
+                #use existing cached images
+                dirs, files = xbmcvfs.listdir(fanartDir)
+                count = 1
+                for file in files:
+                    count +=1
+                    li = xbmcgui.ListItem(file, path=os.path.join(fanartDir,file))
+                    xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=os.path.join(fanartDir,file), listitem=li)
+    except:
+        pass
+    
+    #always do endofdirectory to prevent errors in the logs
+    xbmcplugin.endOfDirectory(int(sys.argv[1]))
+