Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_about.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_about.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_about.py	(revision 6774)
@@ -0,0 +1,77 @@
+from enigma import getDesktop
+
+from Screens.Screen import Screen
+
+from Components.Label import Label
+from Components.Button import Button
+from Components.Pixmap import Pixmap
+from Components.ActionMap import ActionMap
+
+from Tools.LoadPixmap import LoadPixmap
+
+from crossepglib import *
+from crossepg_locale import _
+
+import os
+import sys
+
+class CrossEPG_About(Screen):
+	def __init__(self, session):
+		self.session = session
+		if (getDesktop(0).size().width() < 800):
+			skin = "%s/skins/about_sd.xml" % (os.path.dirname(sys.modules[__name__].__file__))
+		else:
+			skin = "%s/skins/about_hd.xml" % (os.path.dirname(sys.modules[__name__].__file__))
+		f = open(skin, "r")
+		self.skin = f.read()
+		f.close()
+
+		Screen.__init__(self, session)
+		
+		self.config = CrossEPG_Config()
+		self.config.load()
+		
+		self["about"] = Label("")
+		self["rytec_pix"] = Pixmap()
+		self["rytec_text"] = Label("")
+		self["krkadoni_pix"] = Pixmap()
+		self["krkadoni_text"] = Label("")
+
+		self["actions"] = ActionMap(["SetupActions", "ColorActions"],
+		{
+			"red": self.quit,
+			"cancel": self.quit
+		}, -2)
+		
+		self["key_red"] = Button(_("Back"))
+		self["key_green"] = Button("")
+		self["key_yellow"] = Button("")
+		self["key_blue"] = Button("")
+
+		try:
+			from version import version
+		except Exception, e:
+			version = "unknow version"
+
+		credit = "SIFTeam CrossEPG %s (c) 2009-2010 Sandro Cavazzoni\n" % version
+		credit += "http://code.google.com/p/crossepg/\n\n"
+		credit += "Application credits:\n"
+		credit += "- Sandro Cavazzoni aka skaman (main developer)\n"
+		credit += "- Ambrosa (scripts developer)\n"
+		credit += "- Spaeleus (italian translations)\n"
+		credit += "- Bodyan (ukrainian translations)\n\n"
+		credit += "Sources credits:\n"
+		credit += "- Rytec http://www.rytec.be (xmltv providers for many countries)\n"
+		credit += "- Krkadoni http://www.krkadoni.com/ (xmltv provider for Ex Yugoslavia and various xepgdb sources maintainer)\n"
+		credit += "- Bodyan and dillinger http://linux-sat.tv/ (xmltv provider for ex USSR channels)"
+		self["about"].setText(credit)
+
+		self.onFirstExecBegin.append(self.setImages)
+
+	def setImages(self):
+		self["rytec_pix"].instance.setPixmapFromFile("%s/images/rytec.png" % (os.path.dirname(sys.modules[__name__].__file__)))
+		self["krkadoni_pix"].instance.setPixmapFromFile("%s/images/krkadoni.png" % (os.path.dirname(sys.modules[__name__].__file__)))
+
+	def quit(self):
+		self.close()
+	
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_auto.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_auto.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_auto.py	(revision 6774)
@@ -0,0 +1,298 @@
+from enigma import * #, quitMainloop
+from Components.ServiceEventTracker import ServiceEventTracker
+from Tools.Directories import fileExists
+from crossepglib import *
+from crossepg_downloader import CrossEPG_Downloader
+from crossepg_converter import CrossEPG_Converter
+from crossepg_loader import CrossEPG_Loader
+from crossepg_importer import CrossEPG_Importer
+from crossepg_locale import _
+from Screens.Screen import Screen
+
+from time import *
+
+import os
+
+class CrossEPG_Auto(Screen):
+	POLL_TIMER = 1800000	# poll every 30 minutes
+	#POLL_TIMER = 18000
+	POLL_TIMER_FAST = 10000	# poll every 10 seconds
+	POLL_TIMER_BOOT = 60000	# poll every 1 minute
+
+	def __init__(self):
+		self.session = None
+
+		self.timer = eTimer()
+		self.standbyTimer = eTimer()
+		self.delayedInitTimer = eTimer()
+
+		self.timer.callback.append(self.poll)
+		self.standbyTimer.callback.append(self.backToStandby)
+		self.delayedInitTimer.callback.append(self.init)
+
+		self.config = CrossEPG_Config()
+		self.patchtype = getEPGPatchType()
+
+		self.pdownloader = None
+		self.pimporter = None
+		self.pconverter = None
+		self.ploader = None
+
+		self.osd = False
+		self.ontune = False
+		self.lock = False
+
+		if fileExists("/tmp/crossepg.standby"):
+			os.system("rm -f /tmp/crossepg.standby")
+			print "[CrossEPG_Auto] coming back in standby in 30 seconds"
+			self.standbyTimer.start(30000, 1)
+			
+		self.config.load()
+		
+		if self.config.force_load_on_boot:
+			self.loader()
+
+	def init(self, session = None):
+		if session != None:
+			self.session = session
+			
+		if time() < 1262325600:		# if before 2010 probably the clock isn't yet updated
+			self.delayedInitTimer.start(60000, 1)	#initialization delayed of 1 minute
+			return
+			
+		self.resetDailyDownloadDateCache()
+		self.timer.start(self.POLL_TIMER_BOOT, 1)
+
+	def forcePoll(self):
+		self.timer.stop()
+		self.resetDailyDownloadDateCache()
+		self.timer.start(self.POLL_TIMER_FAST, 1)
+		
+	def resetDailyDownloadDateCache(self):
+		self.config.load()
+		now = time()
+		ttime = localtime(now)
+		ltime = (ttime[0], ttime[1], ttime[2], self.config.download_daily_hours, self.config.download_daily_minutes, 0, ttime[6], ttime[7], ttime[8])
+		stime = mktime(ltime)
+		if stime < now:
+			ttime = localtime(stime+86400)	# 24 hours in future
+
+		# to avoid problems with internal clock (big changes on date/time)
+		# we step forward of 24 hours until the new time is greater than now
+		while ttime < now:
+			ttime = ttime+86400	# 24 hours in future
+		
+		self.cacheYear = ttime[0]
+		self.cacheMonth = ttime[1]
+		self.cacheDay = ttime[2]
+			
+	def poll(self):
+		from Screens.Standby import inStandby
+		self.config.load()
+
+		if self.lock:
+			print "[CrossEPG_Auto] poll"
+			self.timer.start(self.POLL_TIMER_FAST, 1)
+		elif self.session.nav.RecordTimer.isRecording() or abs(self.session.nav.RecordTimer.getNextRecordingTime() - time()) <= 900 or abs(self.session.nav.RecordTimer.getNextZapTime() - time()) <= 900:
+			print "[CrossEPG_Auto] poll"
+			self.timer.start(self.POLL_TIMER, 1)
+		elif self.config.download_standby_enabled and inStandby:
+			self.providers = []
+			now = time()
+
+			if self.config.last_full_download_timestamp <= now - (24*60*60):
+				self.config.last_full_download_timestamp = now
+				self.config.last_partial_download_timestamp = now
+				self.config.save()
+				self.providers = self.config.providers
+			elif self.config.last_partial_download_timestamp <= now - (60*60): # skip xmltv... we download it only one time a day
+				self.config.last_partial_download_timestamp = now
+				self.config.save()
+				providers = self.config.getAllProviders()
+				i = 0
+				for provider in providers[0]:
+					if self.config.providers.count(provider) > 0:
+						if providers[2][i] == "opentv":
+							self.providers.append(provider)
+						else:
+							print "[CrossEPG_Auto] is not OpenTV : skip provider %s (we download it only one time a day)" % provider
+					i += 1
+
+			if len(self.providers) == 0:
+				print "[CrossEPG_Auto] poll"
+				self.timer.start(self.POLL_TIMER, 1)
+			else:
+				print "[CrossEPG_Auto] automatic download in standby"
+				self.osd = False
+				self.ontune = False
+				self.config.deleteLog()
+				self.download(self.providers)
+		elif self.config.download_daily_enabled:
+			now = time()
+			ttime = localtime(now)
+			ltime = (self.cacheYear, self.cacheMonth, self.cacheDay, self.config.download_daily_hours, self.config.download_daily_minutes, 0, ttime[6], ttime[7], ttime[8])
+			stime = mktime(ltime)
+			if stime < now and self.config.last_full_download_timestamp != stime:
+				from Screens.Standby import inStandby
+				self.osd = (inStandby == None)
+				self.ontune = False
+				self.config.last_full_download_timestamp = stime
+				self.config.last_partial_download_timestamp = stime
+				self.config.save()
+				ttime = localtime(stime+86400)	# 24 hours in future
+				# to avoid problems with internal clock (big changes on date/time)
+				# we step forward of 24 hours until the new time is greater than now
+				while ttime < now:
+					ttime = ttime+86400	# 24 hours in future
+				self.cacheYear = ttime[0]
+				self.cacheMonth = ttime[1]
+				self.cacheDay = ttime[2]
+				self.config.deleteLog()
+				self.download(self.config.providers)
+			elif stime < now + (self.POLL_TIMER / 1000) and self.config.last_full_download_timestamp != stime:
+				print "[CrossEPG_Auto] poll"
+				delta = int(stime - now);
+				self.timer.start((delta + 5)*1000, 1)	# 5 seconds offset
+			else:
+				print "[CrossEPG_Auto] poll"
+				self.timer.start(self.POLL_TIMER, 1)
+		elif self.config.download_tune_enabled:
+			now = time()
+			if self.config.last_partial_download_timestamp <= now - (60*60):
+				providerok = None
+				sservice = self.session.nav.getCurrentlyPlayingServiceReference()
+				if sservice:
+					service = sservice.toString()
+
+					providers = self.config.getAllProviders()
+					i = 0
+					for provider in providers[0]:
+						if providers[2][i] == "opentv":
+							if self.config.getChannelID(provider) == service:
+								providerok = provider
+								break;
+						i += 1
+
+				if providerok:
+					print "[CrossEPG_Auto] automatic download on tune"
+					self.osd = False
+					self.ontune = True
+					self.config.last_partial_download_timestamp = now
+					self.config.save()
+					self.config.deleteLog()
+					self.download([provider,])
+				else:
+					print "[CrossEPG_Auto] poll"
+					self.timer.start(self.POLL_TIMER, 1)
+			else:
+				print "[CrossEPG_Auto] poll"
+				self.timer.start(self.POLL_TIMER, 1)
+		else:
+			print "[CrossEPG_Auto] poll"
+			self.timer.start(self.POLL_TIMER, 1)
+
+	def download(self, providers):
+		print "[CrossEPG_Auto] providers selected for download:"
+		for provider in providers:
+			print "[CrossEPG_Auto] %s" % provider
+		if self.osd:
+			self.session.openWithCallback(self.downloadCallback, CrossEPG_Downloader, providers)
+		else:
+			self.pdownloader = CrossEPG_Downloader(self.session, providers, self.downloadCallback, True)
+
+	def downloadCallback(self, ret):
+		self.pdownloader = None
+
+		from Screens.Standby import inStandby
+		if inStandby: # if in standby force service stop
+			self.session.nav.stopService()
+
+		if ret:
+			if self.config.csv_import_enabled == 1 and not self.ontune:
+				self.importer()
+			else:
+				if self.patchtype != 3:
+					self.converter()
+				else:
+					self.loader()
+		else:
+			self.timer.start(self.POLL_TIMER, 1)
+
+	def importer(self):
+		print "[CrossEPG_Auto] start csv import"
+		if self.osd:
+			self.session.openWithCallback(self.importerCallback, CrossEPG_Importer)
+		else:
+			self.pimporter = CrossEPG_Importer(self.session, self.importerCallback, True)
+
+	def importerCallback(self, ret):
+		self.pimporter = None
+
+		if ret:
+			if self.patchtype != 3:
+				self.converter()
+			else:
+				self.loader()
+		else:
+			self.timer.start(self.POLL_TIMER, 1)
+
+	def converter(self):
+		print "[CrossEPG_Auto] start epg.dat conversion"
+		if self.osd:
+			self.session.openWithCallback(self.converterCallback, CrossEPG_Converter)
+		else:
+			self.pconverter = CrossEPG_Converter(self.session, self.converterCallback, True)
+
+	def converterCallback(self, ret):
+		self.pconverter = None
+
+		if ret:
+			if self.patchtype != -1:
+				self.loader()
+			else:
+				if self.config.download_daily_reboot:
+					from Screens.Standby import inStandby
+					if inStandby:
+						os.system("touch /tmp/crossepg.standby")
+					else:
+						os.system("rm /tmp/crossepg.standby")
+					print "[CrossEPG_Auto] rebooting"
+					from Screens.Standby import TryQuitMainloop
+					self.session.open(TryQuitMainloop, 3)
+				else:
+					self.timer.start(self.POLL_TIMER, 1)
+		else:
+			self.timer.start(self.POLL_TIMER, 1)
+
+	def loader(self):
+		if self.osd:
+			self.session.openWithCallback(self.loaderCallback, CrossEPG_Loader)
+		else:
+			self.ploader = CrossEPG_Loader(self.session, self.loaderCallback, True)
+
+	def loaderCallback(self, ret):
+		self.ploader = None
+		self.timer.start(self.POLL_TIMER, 1)
+
+	def stop(self):
+		if self.pdownloader:
+			self.pdownloader.quit()
+			self.pdownloader = None
+		if self.pimporter:
+			self.pimporter.quit()
+			self.pimporter = None
+		if self.pconverter:
+			self.pconverter.quit()
+			self.pconverter = None
+		if self.ploader:
+			self.ploader.quit()
+			self.ploader = None
+
+	def backToStandby(self):
+		from Screens.Standby import inStandby
+		if inStandby == None:
+			print "[CrossEPG_Auto] coming back in standby"
+			from Screens.Standby import Standby
+			self.session.open(Standby)
+
+crossepg_auto = CrossEPG_Auto()
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_converter.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_converter.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_converter.py	(revision 6774)
@@ -0,0 +1,130 @@
+from enigma import getDesktop, eTimer
+
+from Components.Label import Label
+from Components.Pixmap import Pixmap
+from Components.ProgressBar import ProgressBar
+from Components.ActionMap import NumberActionMap
+
+from Screens.Screen import Screen
+from Screens.MessageBox import MessageBox
+
+from crossepglib import *
+from crossepg_locale import _
+
+import os
+import sys
+
+class CrossEPG_Converter(Screen):
+	def __init__(self, session, pcallback = None, noosd = False):
+		self.session = session
+		if (getDesktop(0).size().width() < 800):
+			skin = "%s/skins/downloader_sd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+			self.isHD = 0
+		else:
+			skin = "%s/skins/downloader_hd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+			self.isHD = 1
+		f = open(skin, "r")
+		self.skin = f.read()
+		f.close()
+		Screen.__init__(self, session)
+		
+		self["background"] = Pixmap()
+		self["action"] = Label(_("Starting converter"))
+		self["status"] = Label("")
+		self["progress"] = ProgressBar()
+		self["progress"].hide()
+		self["actions"] = NumberActionMap(["WizardActions", "InputActions"],
+		{
+			"back": self.quit
+		}, -1)
+		
+		self.retValue = True	
+		self.config = CrossEPG_Config()
+		self.config.load()
+		self.lamedb = self.config.lamedb
+		self.db_root = self.config.db_root
+		if not pathExists(self.db_root):
+			if not createDir(self.db_root):
+				self.db_root = "/hdd/crossepg"
+				
+		self.pcallback = pcallback
+		
+		self.wrapper = CrossEPG_Wrapper()
+		self.wrapper.addCallback(self.wrapperCallback)
+		
+		self.hideprogress = eTimer()
+		self.hideprogress.callback.append(self["progress"].hide)
+		
+		self.pcallbacktimer = eTimer()
+		self.pcallbacktimer.callback.append(self.doCallback)
+
+		if noosd:
+			self.wrappertimer = eTimer()
+			self.wrappertimer.callback.append(self.startWrapper)
+			self.wrappertimer.start(100, 1)
+		else:
+			self.onFirstExecBegin.append(self.firstExec)
+
+	def firstExec(self):
+		if self.isHD:
+			self["background"].instance.setPixmapFromFile("%s/images/background_hd.png" % (os.path.dirname(sys.modules[__name__].__file__)))
+		else:
+			self["background"].instance.setPixmapFromFile("%s/images/background.png" % (os.path.dirname(sys.modules[__name__].__file__)))
+		self.startWrapper()
+
+	def startWrapper(self):
+		self.wrapper.init(CrossEPG_Wrapper.CMD_CONVERTER, self.db_root)
+		
+	def wrapperCallback(self, event, param):
+		if event == CrossEPG_Wrapper.EVENT_READY:
+			self.wrapper.epgdat("%s/ext.epg.dat" % (self.db_root))
+			self.wrapper.lamedb("/etc/enigma2/%s" % (self.lamedb))
+			self.wrapper.convert()
+			
+		elif event == CrossEPG_Wrapper.EVENT_END:
+			self.wrapper.delCallback(self.wrapperCallback)
+			self.wrapper.quit()
+			self.closeAndCallback(self.retValue)
+				
+		elif event == CrossEPG_Wrapper.EVENT_ACTION:
+			self["action"].text = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_STATUS:
+			self["status"].text = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_PROGRESS:
+			self["progress"].setValue(param)
+			
+		elif event == CrossEPG_Wrapper.EVENT_PROGRESSONOFF:
+			if param:
+				self.hideprogress.stop()
+				self["progress"].setValue(0)
+				self["progress"].show()
+			else:
+				self["progress"].setValue(100)
+				self.hideprogress.start(500, 1)
+				
+		elif event == CrossEPG_Wrapper.EVENT_QUIT:
+			self.closeAndCallback(self.retValue)
+			
+		elif event == CrossEPG_Wrapper.EVENT_ERROR:
+			self.session.open(MessageBox, _("CrossEPG error: %s") % (param), type = MessageBox.TYPE_INFO, timeout = 20)
+			self.retValue = False
+			self.quit()
+			
+	def quit(self):
+		if self.wrapper.running():
+			self.retValue = False
+			self.wrapper.quit()
+		else:
+			self.closeAndCallback(False)
+
+	def closeAndCallback(self, ret):
+		self.retValue = ret
+		self.close(ret)
+		self.pcallbacktimer.start(0, 1)
+
+	def doCallback(self):
+		if self.pcallback:
+			self.pcallback(self.retValue)
+
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_downloader.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_downloader.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_downloader.py	(revision 6774)
@@ -0,0 +1,196 @@
+from enigma import getDesktop, iPlayableService, eTimer, eServiceReference
+
+from Components.Label import Label
+from Components.Pixmap import Pixmap
+from Components.ProgressBar import ProgressBar
+from Components.ServiceEventTracker import ServiceEventTracker
+from Components.ActionMap import NumberActionMap
+
+from Screens.Screen import Screen
+from Screens.MessageBox import MessageBox
+
+from crossepglib import *
+from crossepg_locale import _
+
+import os
+import sys
+
+class CrossEPG_Downloader(Screen):
+	def __init__(self, session, providers, pcallback = None, noosd = False):
+		if (getDesktop(0).size().width() < 800):
+			skin = "%s/skins/downloader_sd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+			self.isHD = 0
+		else:
+			skin = "%s/skins/downloader_hd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+			self.isHD = 1
+		f = open(skin, "r")
+		self.skin = f.read()
+		f.close()
+		Screen.__init__(self, session)
+
+		self.session = session
+		
+		self["background"] = Pixmap()
+		self["action"] = Label(_("Starting downloader"))
+		self["status"] = Label("")
+		self["progress"] = ProgressBar()
+		self["progress"].hide()
+		self["actions"] = NumberActionMap(["WizardActions", "InputActions"],
+		{
+			"back": self.quit
+		}, -1)
+		
+		self.__event_tracker = ServiceEventTracker(screen=self, eventmap=
+		{
+			iPlayableService.evTunedIn: self.tuned,
+		})
+		
+		self.retValue = True
+		self.provider_index = 0
+		self.status = 0
+		self.open = False
+		self.saved = False
+		self.tune_enabled = False
+		self.oldService = self.session.nav.getCurrentlyPlayingServiceReference()
+		self.config = CrossEPG_Config()
+		self.config.load()
+		self.providers = providers
+		self.pcallback = pcallback
+		
+		self.wrapper = CrossEPG_Wrapper()
+		self.wrapper.addCallback(self.wrapperCallback)
+		
+		self.timeout = eTimer()
+		self.timeout.callback.append(self.quit)
+		
+		self.hideprogress = eTimer()
+		self.hideprogress.callback.append(self["progress"].hide)
+		
+		self.pcallbacktimer = eTimer()
+		self.pcallbacktimer.callback.append(self.doCallback)
+
+		self.wrappertimer = eTimer()
+		self.wrappertimer.callback.append(self.initWrapper)
+
+		if noosd:
+			self.wrappertimer.start(100, 1)
+		else:
+			self.onFirstExecBegin.append(self.firstExec)
+			
+	def firstExec(self):
+		if self.isHD:
+			self["background"].instance.setPixmapFromFile("%s/images/background_hd.png" % (os.path.dirname(sys.modules[__name__].__file__)))
+		else:
+			self["background"].instance.setPixmapFromFile("%s/images/background.png" % (os.path.dirname(sys.modules[__name__].__file__)))
+		self.wrappertimer.start(100, 1)
+
+	def initWrapper(self):
+		if len(self.providers) == 0:
+			self.closeAndCallback(True)
+		else:
+			self.wrapper.init(CrossEPG_Wrapper.CMD_DOWNLOADER, self.config.db_root)
+	
+	def download(self):
+		if self.config.getChannelProtocol(self.providers[self.provider_index]) != "script":
+			if not self.open:
+				self.wrapper.open()
+				self.open = True
+				self.saved = False
+		else:
+			if self.open:
+				self.wrapper.save()
+				self.saved = True
+				self.provider_index -= 1
+				return
+			
+		service = self.config.getChannelID(self.providers[self.provider_index])
+		try:
+			cservice = self.session.nav.getCurrentlyPlayingServiceReference().toString()
+		except Exception, e:
+			cservice = None
+			
+		if service:
+			print "[CrossEPG_Downloader] %s service is %s" % (self.providers[self.provider_index], service)
+			if service == cservice:
+				self.wrapper.download(self.providers[self.provider_index])
+			else:
+				self.tune_enabled = True
+				self.wrapper.wait()
+				self.timeout.start(60000, 1)
+				self.session.nav.playService(eServiceReference(service))
+		else:
+			self.wrapper.download(self.providers[self.provider_index])
+	
+	def wrapperCallback(self, event, param):
+		if event == CrossEPG_Wrapper.EVENT_READY:
+			self.download()
+			
+		elif event == CrossEPG_Wrapper.EVENT_END:
+			if self.saved and self.open:
+				self.wrapper.close()
+				self.open = False
+				
+			if self.status == 0:
+				self.provider_index += 1
+				if self.provider_index < len(self.providers):
+					self.download()
+				else:
+					self.status = 1
+					if self.oldService:
+						self.session.nav.playService(self.oldService)
+					if self.open:
+						self.wrapper.save()
+					else:
+						self.wrapper.quit()
+			else:
+				if self.open:
+					self.wrapper.close()
+				self.wrapper.quit()
+				
+		elif event == CrossEPG_Wrapper.EVENT_ACTION:
+			self["action"].text = param
+			self["status"].text = ""
+			
+		elif event == CrossEPG_Wrapper.EVENT_STATUS or event == CrossEPG_Wrapper.EVENT_URL:
+			self["status"].text = param
+
+		elif event == CrossEPG_Wrapper.EVENT_PROGRESS:
+			self["progress"].setValue(param)
+			
+		elif event == CrossEPG_Wrapper.EVENT_PROGRESSONOFF:
+			if param:
+				self.hideprogress.stop()
+				self["progress"].setValue(0)
+				self["progress"].show()
+			else:
+				self["progress"].setValue(100)
+				self.hideprogress.start(500, 1)
+		elif event == CrossEPG_Wrapper.EVENT_QUIT:
+			self.closeAndCallback(self.retValue)
+		elif event == CrossEPG_Wrapper.EVENT_ERROR:
+			self.session.open(MessageBox, _("CrossEPG error: %s") % (param), type = MessageBox.TYPE_INFO, timeout = 20)
+			self.retValue = False
+			self.quit()
+			
+	def tuned(self):
+		if self.tune_enabled:
+			self.timeout.stop()
+			self.wrapper.download(self.providers[self.provider_index])
+			self.tune_enabled = False
+			
+	def quit(self):
+		if self.wrapper.running():
+			self.retValue = False
+			self.wrapper.quit()
+		else:
+			self.closeAndCallback(False)
+
+	def closeAndCallback(self, ret):
+		self.retValue = ret
+		self.pcallbacktimer.start(0, 1)
+		self.close(ret)
+
+	def doCallback(self):
+		if self.pcallback:
+			self.pcallback(self.retValue)
+
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_importer.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_importer.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_importer.py	(revision 6774)
@@ -0,0 +1,142 @@
+from enigma import getDesktop, eTimer
+
+from Components.Label import Label
+from Components.Pixmap import Pixmap
+from Components.ProgressBar import ProgressBar
+from Components.ActionMap import NumberActionMap
+
+from Screens.Screen import Screen
+from Screens.MessageBox import MessageBox
+
+from crossepglib import *
+from crossepg_locale import _
+
+import os
+import sys
+
+class CrossEPG_Importer(Screen):
+	def __init__(self, session, pcallback = None, noosd = False):
+		self.session = session
+		if (getDesktop(0).size().width() < 800):
+			skin = "%s/skins/downloader_sd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+			self.isHD = 0
+		else:
+			skin = "%s/skins/downloader_hd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+			self.isHD = 1
+		f = open(skin, "r")
+		self.skin = f.read()
+		f.close()
+		Screen.__init__(self, session)
+		
+		self["background"] = Pixmap()
+		self["action"] = Label(_("Starting importer"))
+		self["status"] = Label("")
+		self["progress"] = ProgressBar()
+		self["progress"].hide()
+		self["actions"] = NumberActionMap(["WizardActions", "InputActions"],
+		{
+			"back": self.quit
+		}, -1)
+		
+		self.retValue = True	
+		self.config = CrossEPG_Config()
+		self.config.load()
+		self.lamedb = self.config.lamedb
+		self.db_root = self.config.db_root
+		if not pathExists(self.db_root):
+			if not createDir(self.db_root):
+				self.db_root = "/hdd/crossepg"
+				
+		self.pcallback = pcallback
+		
+		self.wrapper = CrossEPG_Wrapper()
+		self.wrapper.addCallback(self.wrapperCallback)
+		
+		self.hideprogress = eTimer()
+		self.hideprogress.callback.append(self["progress"].hide)
+		
+		self.pcallbacktimer = eTimer()
+		self.pcallbacktimer.callback.append(self.doCallback)
+
+		self.status = 0
+
+		if noosd:
+			self.wrappertimer = eTimer()
+			self.wrappertimer.callback.append(self.startWrapper)
+			self.wrappertimer.start(100, 1)
+		else:
+			self.onFirstExecBegin.append(self.firstExec)
+
+	def firstExec(self):
+		if self.isHD:
+			self["background"].instance.setPixmapFromFile("%s/images/background_hd.png" % (os.path.dirname(sys.modules[__name__].__file__)))
+		else:
+			self["background"].instance.setPixmapFromFile("%s/images/background.png" % (os.path.dirname(sys.modules[__name__].__file__)))
+		self.startWrapper()
+
+	def startWrapper(self):
+		self.wrapper.init(CrossEPG_Wrapper.CMD_IMPORTER, self.db_root)
+	
+	def wrapperCallback(self, event, param):
+		if event == CrossEPG_Wrapper.EVENT_READY:
+			self.wrapper.importx()
+			
+		elif event == CrossEPG_Wrapper.EVENT_END:
+			if self.status == 0:
+				self.status += 1
+				self.wrapper.save()
+			else:
+				self.wrapper.delCallback(self.wrapperCallback)
+				self.wrapper.quit()
+				self.closeAndCallback(self.retValue)
+				
+		elif event == CrossEPG_Wrapper.EVENT_FILE:
+			self["action"].text = _("Parsing")
+			self["status"].text = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_URL:
+			self["action"].text = _("Downloading")
+			self["status"].text = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_ACTION:
+			self["action"].text = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_STATUS:
+			self["status"].text = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_PROGRESS:
+			self["progress"].setValue(param)
+			
+		elif event == CrossEPG_Wrapper.EVENT_PROGRESSONOFF:
+			if param:
+				self.hideprogress.stop()
+				self["progress"].setValue(0)
+				self["progress"].show()
+			else:
+				self["progress"].setValue(100)
+				self.hideprogress.start(500, 1)
+				
+		elif event == CrossEPG_Wrapper.EVENT_QUIT:
+			self.closeAndCallback(self.retValue)
+			
+		elif event == CrossEPG_Wrapper.EVENT_ERROR:
+			self.session.open(MessageBox, _("CrossEPG error: %s") % (param), type = MessageBox.TYPE_INFO, timeout = 20)
+			self.retValue = False
+			self.quit()
+			
+	def quit(self):
+		if self.wrapper.running():
+			self.retValue = False
+			self.wrapper.quit()
+		else:
+			self.closeAndCallback(False)
+
+	def closeAndCallback(self, ret):
+		self.retValue = ret
+		self.close(ret)
+		self.pcallbacktimer.start(0, 1)
+
+	def doCallback(self):
+		if self.pcallback:
+			self.pcallback(self.retValue)
+
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_info.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_info.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_info.py	(revision 6774)
@@ -0,0 +1,84 @@
+from enigma import getDesktop
+
+from Screens.Screen import Screen
+
+from Components.Label import Label
+from Components.Button import Button
+from Components.ActionMap import ActionMap
+
+from crossepglib import *
+from crossepg_locale import _
+
+import os
+import sys
+
+class CrossEPG_Info(Screen):
+	def __init__(self, session):
+		self.session = session
+		if (getDesktop(0).size().width() < 800):
+			skin = "%s/skins/info_sd.xml" % (os.path.dirname(sys.modules[__name__].__file__))
+		else:
+			skin = "%s/skins/info_hd.xml" % (os.path.dirname(sys.modules[__name__].__file__))
+		f = open(skin, "r")
+		self.skin = f.read()
+		f.close()
+
+		Screen.__init__(self, session)
+		
+		self.config = CrossEPG_Config()
+		self.config.load()
+		
+		self["version"] = Label("")
+		self["create"] = Label("")
+		self["last_update"] = Label("")
+		self["headersdb_size"] = Label("")
+		self["descriptorsdb_size"] = Label("")
+		self["indexesdb_size"] = Label("")
+		self["aliasesdb_size"] = Label("")
+		self["total_size"] = Label("")
+		self["channels_count"] = Label("")
+		self["events_count"] = Label("")
+		self["hashes_count"] = Label("")
+		self["actions"] = ActionMap(["SetupActions", "ColorActions"],
+		{
+			"red": self.quit,
+			"cancel": self.quit
+		}, -2)
+		
+		self["key_red"] = Button(_("Back"))
+		self["key_green"] = Button("")
+		self["key_yellow"] = Button("")
+		self["key_blue"] = Button("")
+		
+		self.wrapper = CrossEPG_Wrapper()
+		self.wrapper.addCallback(self.__wrapperCallback)
+		self.wrapper.init(CrossEPG_Wrapper.CMD_INFO, self.config.db_root)
+			
+	def quit(self):
+		if not self.wrapper.running():
+			self.close()
+	
+	def __wrapperCallback(self, event, param):
+		if event == CrossEPG_Wrapper.INFO_HEADERSDB_SIZE:
+			self["headersdb_size"].text = _("Headers db size: %s") % (param)
+		elif event == CrossEPG_Wrapper.INFO_DESCRIPTORSDB_SIZE:
+			self["descriptorsdb_size"].text = _("Descriptors db size: %s") % (param)
+		elif event == CrossEPG_Wrapper.INFO_INDEXESDB_SIZE:
+			self["indexesdb_size"].text = _("Indexes db size: %s") % (param)
+		elif event == CrossEPG_Wrapper.INFO_ALIASESDB_SIZE:
+			self["aliasesdb_size"].text = _("Aliases db size: %s") % (param)
+		elif event == CrossEPG_Wrapper.INFO_TOTAL_SIZE:
+			self["total_size"].text = _("Total size: %s") % (param)
+		elif event == CrossEPG_Wrapper.INFO_CHANNELS_COUNT:
+			self["channels_count"].text = _("Channels count: %s") % (param)
+		elif event == CrossEPG_Wrapper.INFO_EVENTS_COUNT:
+			self["events_count"].text = _("Events count: %s") % (param)
+		elif event == CrossEPG_Wrapper.INFO_HASHES_COUNT:
+			self["hashes_count"].text = _("Hashes count: %s") % (param)
+		elif event == CrossEPG_Wrapper.INFO_CREATION_TIME:
+			self["create"].text = _("Creation time: %s") % (param)
+		elif event == CrossEPG_Wrapper.INFO_UPDATE_TIME:
+			self["last_update"].text = _("Last update time: %s") % (param)
+		elif event == CrossEPG_Wrapper.INFO_VERSION:
+			self["version"].text = _("Version: %s") % (param)
+			
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_loader.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_loader.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_loader.py	(revision 6774)
@@ -0,0 +1,226 @@
+from enigma import getDesktop, eTimer
+
+from Components.config import config
+from Components.Label import Label
+from Components.Pixmap import Pixmap
+from Components.ProgressBar import ProgressBar
+from Components.ActionMap import NumberActionMap
+
+from Screens.Screen import Screen
+from Screens.MessageBox import MessageBox
+
+from crossepglib import *
+from crossepg_locale import _
+
+import _enigma
+import os
+import sys
+
+class CrossEPG_Loader(Screen):
+	def __init__(self, session, pcallback = None, noosd = False):
+		self.session = session
+		if (getDesktop(0).size().width() < 800):
+			skin = "%s/skins/downloader_sd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+			self.isHD = 0
+		else:
+			skin = "%s/skins/downloader_hd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+			self.isHD = 1
+		f = open(skin, "r")
+		self.skin = f.read()
+		f.close()
+		Screen.__init__(self, session)
+
+		self["background"] = Pixmap()
+		self["action"] = Label(_("Loading data"))
+		self["status"] = Label("")
+		self["progress"] = ProgressBar()
+		self["progress"].hide()
+		
+		self.retValue = True	
+		self.config = CrossEPG_Config()
+		self.config.load()
+		self.db_root = self.config.db_root
+		if not pathExists(self.db_root):
+			if not createDir(self.db_root):
+				self.db_root = "/hdd/crossepg"
+				
+		self.pcallback = pcallback
+		self.wrapper = None
+
+		self.pcallbacktimer = eTimer()
+		self.pcallbacktimer.callback.append(self.doCallback)
+		
+		if pathExists("/usr/crossepg"):
+			self.home_directory = "/usr/crossepg"
+		elif pathExists("/var/crossepg"):
+			self.home_directory = "/var/crossepg"
+		else:
+			print "[CrossEPG_Config] ERROR!! CrossEPG binaries non found"
+		
+		# check for common patches
+		try:
+			self.xepgpatch = new.instancemethod(_enigma.eEPGCache_crossepgImportEPGv21,None,eEPGCache)
+			print "[CrossEPG_Loader] patch crossepg v2.1 found"
+		except Exception, e:
+			self.xepgpatch = None
+			
+		try:
+			self.epgpatch = new.instancemethod(_enigma.eEPGCache_load,None,eEPGCache)
+			print "[CrossEPG_Loader] patch epgcache.load() found"
+		except Exception, e:
+			self.epgpatch = None
+			
+		try:
+			self.edgpatch = new.instancemethod(_enigma.eEPGCache_reloadEpg,None,eEPGCache)
+			print "[CrossEPG_Loader] patch EDG NEMESIS found"
+		except Exception, e:
+			self.edgpatch = None
+			
+		try:
+			self.oudeispatch = new.instancemethod(_enigma.eEPGCache_importEvent,None,eEPGCache)
+			print "[CrossEPG_Loader] patch Oudeis found"
+		except Exception, e:
+			self.oudeispatch = None
+		
+		if self.xepgpatch:
+			self.timer = eTimer()
+			self.timer.callback.append(self.loadEPG2)
+			self.timer.start(200, 1)
+
+		elif self.epgpatch:
+			self.timer = eTimer()
+			self.timer.callback.append(self.loadEPG)
+			self.timer.start(200, 1)
+			
+		elif self.edgpatch:
+			self.timer = eTimer()
+			self.timer.callback.append(self.loadEDG)
+			self.timer.start(200, 1)
+			
+		elif self.oudeispatch:
+			self["actions"] = NumberActionMap(["WizardActions", "InputActions"],
+			{
+				"back": self.quit
+			}, -1)
+			
+			self.wrapper = CrossEPG_Wrapper()
+			self.wrapper.addCallback(self.wrapperCallback)
+			
+			self.timeout = eTimer()
+			self.timeout.callback.append(self.quit)
+			
+			self.hideprogress = eTimer()
+			self.hideprogress.callback.append(self["progress"].hide)
+			
+			self.epg_channel = None;
+			self.epg_tuple = ()
+			self.epg_starttime = 0
+			self.epg_length = 0
+			self.epg_name = ""
+			
+			self.wrapper.init(CrossEPG_Wrapper.CMD_CONVERTER, self.db_root)
+		else:
+			print "No patch found... please reboot enigma2 manually"
+			self.closeAndCallback(True)
+
+		if not noosd:
+			self.onFirstExecBegin.append(self.firstExec)
+
+	def firstExec(self):
+		if self.isHD:
+			self["background"].instance.setPixmapFromFile("%s/images/background_hd.png" % (os.path.dirname(sys.modules[__name__].__file__)))
+		else:
+			self["background"].instance.setPixmapFromFile("%s/images/background.png" % (os.path.dirname(sys.modules[__name__].__file__)))
+
+	def loadEPG2(self):
+		print "[CrossEPG_Loader] loading data with crossepg patch v2"
+		self.xepgpatch(eEPGCache.getInstance(), self.db_root)
+		self.closeAndCallback(True)
+	
+	def loadEPG(self):
+		cmd = "%s/crossepg_epgcopy %s/ext.epg.dat /hdd/epg.dat" % (self.home_directory, self.db_root)
+		print "[CrossEPG_Loader] %s" % (cmd)
+		os.system(cmd)
+		self.epgpatch(eEPGCache.getInstance())
+		self.closeAndCallback(True)
+		
+	def loadEDG(self):
+		cmd = "%s/crossepg_epgcopy %s/ext.epg.dat %s/epg.dat" % (self.home_directory, self.db_root, config.nemepg.path.value)
+		print "[CrossEPG_Loader] %s" % (cmd)
+		os.system(cmd)
+		self.edgpatch(eEPGCache.getInstance())
+		self.closeAndCallback(True)
+		
+	def wrapperCallback(self, event, param):
+		if event == CrossEPG_Wrapper.EVENT_READY:
+			self.wrapper.text()
+			
+		elif event == CrossEPG_Wrapper.EVENT_END:
+			self.wrapper.quit()
+			
+		elif event == CrossEPG_Wrapper.EVENT_ACTION:
+			self["action"].text = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_STATUS:
+			self["status"].text = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_PROGRESS:
+			self["progress"].setValue(param)
+			
+		elif event == CrossEPG_Wrapper.EVENT_CHANNEL:
+			if self.epg_channel:
+				if len(self.epg_tuple) > 0:
+					self.oudeispatch(eEPGCache.getInstance(), self.epg_channel, self.epg_tuple)
+					self.epg_tuple = ()
+			self.epg_channel = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_STARTTIME:
+			self.epg_starttime = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_LENGTH:
+			self.epg_length = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_NAME:
+			self.epg_name = param
+			
+		elif event == CrossEPG_Wrapper.EVENT_DESCRIPTION:
+			if self.epg_channel:
+				self.epg_tuple += ((self.epg_starttime, self.epg_length, self.epg_name, self.epg_name, param, 0),)
+			
+		elif event == CrossEPG_Wrapper.EVENT_PROGRESSONOFF:
+			if param:
+				self.hideprogress.stop()
+				self["progress"].setValue(0)
+				self["progress"].show()
+			else:
+				self["progress"].setValue(100)
+				self.hideprogress.start(500, 1)
+		elif event == CrossEPG_Wrapper.EVENT_QUIT:
+			if self.epg_channel:
+				if len(self.epg_tuple) > 0:
+					self.oudeispatch(eEPGCache.getInstance(), self.epg_channel, self.epg_tuple)
+			self.closeAndCallback(self.retValue)
+			
+		elif event == CrossEPG_Wrapper.EVENT_ERROR:
+			self.session.open(MessageBox, _("CrossEPG error: %s") % (param), type = MessageBox.TYPE_INFO, timeout = 20)
+			self.retValue = False
+			self.quit()
+			
+	def quit(self):
+		if self.wrapper:
+			if self.wrapper.running():
+				self.retValue = False
+				self.wrapper.quit()
+				return
+
+		self.closeAndCallback(False)
+
+	def closeAndCallback(self, ret):
+		self.retValue = ret
+		self.close(ret)
+		self.pcallbacktimer.start(0, 1)
+
+	def doCallback(self):
+		if self.pcallback:
+			self.pcallback(self.retValue)
+
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_locale.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_locale.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_locale.py	(revision 6774)
@@ -0,0 +1,25 @@
+from Components.Language import language
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_LANGUAGE
+
+import os,gettext
+
+PluginLanguageDomain = "CrossEPG"
+PluginLanguagePath = "SystemPlugins/CrossEPG/po"
+
+def localeInit():
+	lang = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
+	os.environ["LANGUAGE"] = lang # Enigma doesn't set this (or LC_ALL, LC_MESSAGES, LANG). gettext needs it!
+	print "[CrossEPG] set language to ", lang
+	gettext.bindtextdomain(PluginLanguageDomain, resolveFilename(SCOPE_PLUGINS, PluginLanguagePath))
+	gettext.bindtextdomain('enigma2', resolveFilename(SCOPE_LANGUAGE, ""))
+
+def _(txt):
+	t = gettext.dgettext(PluginLanguageDomain, txt)
+	if t == txt:
+		#print "[CrossEPG] fallback to default translation for", txt
+		t = gettext.dgettext('enigma2', txt)
+	return t
+
+
+localeInit()
+language.addCallback(localeInit)
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_main.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_main.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_main.py	(revision 6774)
@@ -0,0 +1,86 @@
+from enigma import *
+from Screens.MessageBox import MessageBox
+
+from crossepglib import *
+from crossepg_downloader import CrossEPG_Downloader
+from crossepg_importer import CrossEPG_Importer
+from crossepg_converter import CrossEPG_Converter
+from crossepg_loader import CrossEPG_Loader
+from crossepg_setup import CrossEPG_Setup
+from crossepg_menu import CrossEPG_Menu
+from crossepg_auto import crossepg_auto
+
+class CrossEPG_Main:
+	def __init__(self):
+		self.config = CrossEPG_Config()
+		self.patchtype = getEPGPatchType()
+		
+	def downloader(self, session, **kwargs):
+		self.session = session
+		crossepg_auto.lock = True
+		crossepg_auto.stop()
+		self.config.load()
+		if self.config.configured == 0:
+			self.session.open(MessageBox, _("Please configure crossepg before start downloader"), type = MessageBox.TYPE_ERROR)
+		else:
+			self.config.deleteLog()
+			self.session.openWithCallback(self.downloadCallback, CrossEPG_Downloader, self.config.providers)
+
+	def downloadCallback(self, ret):
+		if ret:
+			if self.config.csv_import_enabled == 1:
+				self.importer()
+			else:
+				if self.patchtype != 3:
+					self.converter()
+				else:
+					self.loader()
+		else:
+			crossepg_auto.lock = False
+
+	def importer(self):
+		self.session.openWithCallback(self.importerCallback, CrossEPG_Importer)
+
+	def importerCallback(self, ret):
+		if ret:
+			if self.patchtype != 3:
+				self.converter()
+			else:
+				self.loader()
+		else:
+			crossepg_auto.lock = False
+
+	def converter(self):
+		self.session.openWithCallback(self.converterCallback, CrossEPG_Converter)
+
+	def converterCallback(self, ret):
+		if ret:
+			if self.patchtype != -1:
+				self.loader()
+			else:
+				if self.config.download_manual_reboot:
+					from Screens.Standby import TryQuitMainloop
+					self.session.open(TryQuitMainloop, 3)
+				else:
+					crossepg_auto.lock = False
+		else:
+			crossepg_auto.lock = False
+
+	def loader(self):
+		self.session.openWithCallback(self.loaderCallback, CrossEPG_Loader)
+
+	def loaderCallback(self, ret):
+		crossepg_auto.lock = False
+
+	def setup(self, session, **kwargs):
+		crossepg_auto.lock = True
+		crossepg_auto.stop()
+		session.openWithCallback(self.setupCallback, CrossEPG_Menu)
+
+	def setupCallback(self):
+		crossepg_auto.lock = False
+
+	def autostart(self, reason, session):
+		crossepg_auto.init(session)
+		
+crossepg_main = CrossEPG_Main()
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_menu.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_menu.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_menu.py	(revision 6774)
@@ -0,0 +1,164 @@
+from enigma import *
+from crossepglib import *
+from crossepg_auto import crossepg_auto
+from crossepg_info import CrossEPG_Info
+from crossepg_about import CrossEPG_About
+from crossepg_providers import CrossEPG_Providers
+from crossepg_setup import CrossEPG_Setup
+from crossepg_downloader import CrossEPG_Downloader
+from crossepg_importer import CrossEPG_Importer
+from crossepg_converter import CrossEPG_Converter
+from crossepg_loader import CrossEPG_Loader
+from crossepg_ordering import CrossEPG_Ordering
+from crossepg_locale import _
+
+from Screens.Screen import Screen
+from Screens.MessageBox import MessageBox
+
+from Components.Label import Label
+from Components.Button import Button
+from Components.MenuList import MenuList
+from Components.Sources.List import List
+from Components.MultiContent import MultiContentEntryText
+from Components.Harddisk import harddiskmanager
+from Components.PluginComponent import plugins
+from Components.ActionMap import ActionMap
+from Tools.LoadPixmap import LoadPixmap
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS
+from Plugins.Plugin import PluginDescriptor
+
+from time import *
+
+try:
+	from version import version
+except Exception, e:
+	pass
+
+import _enigma
+
+class CrossEPG_Menu(Screen):
+	def __init__(self, session):
+		if (getDesktop(0).size().width() < 800):
+			skin = "%s/skins/menu_sd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+		else:
+			skin = "%s/skins/menu_hd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+		f = open(skin, "r")
+		self.skin = f.read()
+		f.close()
+		Screen.__init__(self, session)
+
+		self.config = CrossEPG_Config()
+		self.config.load()
+		self.patchtype = getEPGPatchType()
+
+		l = []
+		l.append(self.buildListEntry(_("Configure"), "configure.png"))
+		l.append(self.buildListEntry(_("XMLTV providers"), "xmltv.png"))
+		l.append(self.buildListEntry(_("OpenTV providers"), "opentv.png"))
+		l.append(self.buildListEntry(_("XEPGDB providers"), "xepgdb.png"))
+		l.append(self.buildListEntry(_("Scripts providers"), "scripts.png"))
+		l.append(self.buildListEntry(_("Providers start order"), "reorder.png"))
+		l.append(self.buildListEntry(_("Download now"), "download.png"))
+		l.append(self.buildListEntry(_("Force csv import now"), "csv.png"))
+		l.append(self.buildListEntry(_("Force epg.dat conversion now"), "conversion.png"))
+		l.append(self.buildListEntry(_("Force epg reload"), "reload.png"))
+		l.append(self.buildListEntry(_("Info about database"), "dbinfo.png"))
+		l.append(self.buildListEntry(_("About"), "about.png"))
+
+		self["list"] = List(l)
+		self["setupActions"] = ActionMap(["SetupActions"],
+		{
+			"cancel": self.quit,
+			"ok": self.openSelected,
+		}, -2)
+
+		self.onFirstExecBegin.append(self.setTitleWithVerion)
+		
+		if self.config.configured == 0:
+			self.onFirstExecBegin.append(self.openSetup)
+
+	def buildListEntry(self, description, image):
+		pixmap = LoadPixmap(cached=True, path="%s/images/%s" % (os.path.dirname(sys.modules[__name__].__file__), image));
+		return((pixmap, description))
+
+	def openSetup(self):
+		self.session.open(CrossEPG_Setup)
+			
+	def setTitleWithVerion(self):
+		try:
+			global version
+			self.setTitle("CrossEPG - %s" % version)
+		except Exception, e:
+			self.setTitle("CrossEPG - unknow version")
+
+	def openSelected(self):
+		index = self["list"].getIndex()
+		if index == 0:
+			self.session.open(CrossEPG_Setup)
+		elif index == 1:
+			self.session.open(CrossEPG_Providers, "xmltv")
+		elif index == 2:
+			self.session.open(CrossEPG_Providers, "opentv")
+		elif index == 3:
+			self.session.open(CrossEPG_Providers, "xepgdb")
+		elif index == 4:
+			self.session.open(CrossEPG_Providers, "script")
+		elif index == 5:
+			self.session.open(CrossEPG_Ordering)
+		elif index == 6:
+			self.config.load()
+			self.config.deleteLog()
+			self.downloader()
+		elif index == 7:
+			self.importer()
+		elif index == 8:
+			self.converter()
+		elif index == 9:
+			self.loader()
+		elif index == 10:
+			self.session.open(CrossEPG_Info)
+		elif index == 11:
+			self.session.open(CrossEPG_About)
+		
+	def quit(self):
+		self.close()
+
+	def downloader(self):
+		self.config.load()
+		self.session.openWithCallback(self.downloadCallback, CrossEPG_Downloader, self.config.providers)
+
+	def downloadCallback(self, ret):
+		if ret:
+			if self.config.csv_import_enabled == 1:
+				self.importer()
+			else:
+				if self.patchtype != 3:
+					self.converter()
+				else:
+					self.loader()
+
+	def importer(self):
+		self.session.openWithCallback(self.importerCallback, CrossEPG_Importer)
+
+	def importerCallback(self, ret):
+		if ret:
+			if self.patchtype != 3:
+				self.converter()
+			else:
+				self.loader()
+
+	def converter(self):
+		self.session.openWithCallback(self.converterCallback, CrossEPG_Converter)
+
+	def converterCallback(self, ret):
+		if ret:
+			if self.patchtype != -1:
+				self.loader()
+			else:
+				if self.config.download_manual_reboot:
+					from Screens.Standby import TryQuitMainloop
+					session.open(TryQuitMainloop, 3)
+
+	def loader(self):
+		self.session.open(CrossEPG_Loader)
+
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_ordering.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_ordering.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_ordering.py	(revision 6774)
@@ -0,0 +1,116 @@
+from enigma import getDesktop
+
+from Screens.Screen import Screen
+
+from Components.Label import Label
+from Components.Button import Button
+from Components.ActionMap import ActionMap
+from Components.Sources.List import List
+
+from Tools.LoadPixmap import LoadPixmap
+
+from crossepg_locale import _
+
+from crossepglib import *
+
+class CrossEPG_Ordering(Screen):
+	def __init__(self, session):
+		if (getDesktop(0).size().width() < 800):
+			skin = "%s/skins/providers_sd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+		else:
+			skin = "%s/skins/providers_hd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+		f = open(skin, "r")
+		self.skin = f.read()
+		f.close()
+		Screen.__init__(self, session)
+
+		self.config = CrossEPG_Config()
+		self.config.load()
+		self.providers = self.config.getAllProviders()
+		self.list = []
+
+		self["list"] = List(self.list)
+		self["list"].onSelectionChanged.append(self.selectionChanged)
+		self["key_red"] = Button(_("Back"))
+		self["key_green"] = Button("")
+		self["key_yellow"] = Button("")
+		self["key_blue"] = Button("")
+		self["setupActions"] = ActionMap(["SetupActions", "ColorActions"],
+		{
+			"red": self.quit,
+			"cancel": self.quit,
+			"green": self.moveUp,
+			"yellow": self.moveDown,
+		}, -2)
+
+		self.buildList()
+		self.onFirstExecBegin.append(self.setCustomTitle)
+		self.onFirstExecBegin.append(self.selectionChanged)
+
+	def setCustomTitle(self):
+		self.setTitle(_("CrossEPG - Providers start order"))
+
+	def getProviderDescription(self, provider):
+		i = 0
+		for prv in self.providers[0]:
+			if prv == provider:
+				return self.providers[1][i]
+			i += 1
+			
+		return provider
+	
+	def buildList(self):
+		self.list = []
+		for provider in self.config.providers:
+			self.list.append(self.buildListEntry(provider, self.getProviderDescription(provider)))
+
+		self["list"].setList(self.list)
+
+	def buildListEntry(self, name, description):
+		return((description, None, name))
+		
+	def selectionChanged(self):
+		if len(self.list) <= 1:
+			return
+
+		index = self["list"].getIndex()
+		if index == 0:
+			self["key_green"].setText("")
+			self["key_yellow"].setText(_("Move down"))
+		elif index == len(self.list) - 1:
+			self["key_green"].setText(_("Move up"))
+			self["key_yellow"].setText("")
+		else:
+			self["key_green"].setText(_("Move up"))
+			self["key_yellow"].setText(_("Move down"))
+
+	def moveUp(self):
+		if len(self.list) <= 1:
+			return
+
+		index = self["list"].getIndex()
+		if index > 0:
+			tmp = self.config.providers[index - 1]
+			self.config.providers[index - 1] = self.config.providers[index]
+			self.config.providers[index] = tmp
+			
+			self.buildList()
+			self["list"].setIndex(index - 1)
+			
+	def moveDown(self):
+		if len(self.list) <= 1:
+			return
+
+		index = self["list"].getIndex()
+		if index < len(self.list) - 1:
+			tmp = self.config.providers[index + 1]
+			self.config.providers[index + 1] = self.config.providers[index]
+			self.config.providers[index] = tmp
+
+			self.buildList()
+			self["list"].setIndex(index + 1)
+
+	def quit(self):
+		self.config.save()
+		self.close()
+
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_providers.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_providers.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_providers.py	(revision 6774)
@@ -0,0 +1,137 @@
+from enigma import getDesktop
+
+from Screens.Screen import Screen
+
+from Components.Label import Label
+from Components.Button import Button
+from Components.ActionMap import ActionMap
+from Components.Sources.List import List
+
+from Tools.LoadPixmap import LoadPixmap
+
+from crossepg_downloader import CrossEPG_Downloader
+from crossepg_converter import CrossEPG_Converter
+from crossepg_loader import CrossEPG_Loader
+from crossepg_locale import _
+
+from crossepglib import *
+
+class CrossEPG_Providers(Screen):
+	def __init__(self, session, protocol):
+		if (getDesktop(0).size().width() < 800):
+			skin = "%s/skins/providers_sd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+		else:
+			skin = "%s/skins/providers_hd.xml" % os.path.dirname(sys.modules[__name__].__file__)
+		f = open(skin, "r")
+		self.skin = f.read()
+		f.close()
+		Screen.__init__(self, session)
+
+		self.patchtype = getEPGPatchType()
+		self.config = CrossEPG_Config()
+		self.config.load()
+		self.providers = self.config.getAllProviders()
+		self.protocol = protocol
+
+		self.old_service = None
+		self.list = []
+
+		self["list"] = List(self.list)
+		self["list"].onSelectionChanged.append(self.selectionChanged)
+		self["key_red"] = Button(_("Back"))
+		self["key_green"] = Button(_("Enable"))
+		self["key_yellow"] = Button(_("Download"))
+		self["key_blue"] = Button("")
+		self["setupActions"] = ActionMap(["SetupActions", "ColorActions"],
+		{
+			"red": self.quit,
+			"cancel": self.quit,
+			"green": self.switchState,
+			"ok": self.switchState,
+			"yellow": self.download,
+		}, -2)
+
+		self.buildList()
+		self.onFirstExecBegin.append(self.setTitleByProtocol)
+		self.onFirstExecBegin.append(self.selectionChanged)
+
+	def setTitleByProtocol(self):
+		if self.protocol == "xmltv":
+			self.setTitle("CrossEPG - XMLTV providers")
+		elif self.protocol == "opentv":
+			self.setTitle("CrossEPG - OpenTV providers")
+		elif self.protocol == "xepgdb":
+			self.setTitle("CrossEPG - XEPGDB providers")
+		elif self.protocol == "scripts":
+			self.setTitle("CrossEPG - Scripts providers")
+
+	def buildList(self):
+		self.list = []
+		i = 0
+		for provider in self.providers[0]:
+			if self.providers[2][i] == self.protocol:
+				self.list.append(self.buildListEntry(provider, self.providers[1][i], self.config.providers.count(provider) > 0))
+			i += 1
+
+		self["list"].setList(self.list)
+
+	def buildListEntry(self, name, description, enabled):
+		if enabled:
+			pixmap = LoadPixmap(cached=True, path="%s/images/enabled.png" % os.path.dirname(sys.modules[__name__].__file__));
+			return((description, pixmap, name))
+		else:
+			return((description, None, name))
+		
+	def selectionChanged(self):
+		if len(self.list) == 0:
+			return
+
+		index = self["list"].getIndex()
+		provider = self.list[index][2]
+		if self.config.providers.count(provider) > 0:
+			self["key_green"].setText(_("Disable"))
+		else:
+			self["key_green"].setText(_("Enable"))
+
+	def switchState(self):
+		if len(self.list) == 0:
+			return
+
+		index = self["list"].getIndex()
+		provider = self.list[index][2]
+		if self.config.providers.count(provider) > 0:
+			self.config.providers.remove(provider)
+		else:
+			self.config.providers.append(provider)
+
+		self.buildList()
+		self["list"].setIndex(index)
+
+	def download(self):
+		if len(self.list) == 0:
+			return
+
+		index = self["list"].getIndex()
+		self.session.openWithCallback(self.downloadCallback, CrossEPG_Downloader, [self.list[index][2],])
+
+	def downloadCallback(self, ret):
+		if ret:
+			if self.patchtype != 3:
+				self.converter()
+			else:
+				self.loader()
+
+	def converter(self):
+		self.session.openWithCallback(self.converterCallback, CrossEPG_Converter)
+
+	def converterCallback(self, ret):
+		if ret and self.patchtype != -1:
+			self.loader()
+
+	def loader(self):
+		self.session.open(CrossEPG_Loader)
+
+	def quit(self):
+		self.config.save()
+		self.close()
+
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_setup.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_setup.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepg_setup.py	(revision 6774)
@@ -0,0 +1,298 @@
+from enigma import getDesktop
+
+from Screens.Screen import Screen
+from Screens.MessageBox import MessageBox
+
+from Components.config import KEY_LEFT, KEY_RIGHT, KEY_HOME, KEY_END, KEY_0, ConfigYesNo, ConfigSelection, ConfigClock
+from Components.ConfigList import ConfigList
+from Components.Button import Button
+from Components.Label import Label
+from Components.Harddisk import harddiskmanager
+from Components.PluginComponent import plugins
+from Components.ActionMap import NumberActionMap
+
+from Tools.Directories import resolveFilename, SCOPE_PLUGINS
+
+from Plugins.Plugin import PluginDescriptor
+
+from crossepglib import *
+from crossepg_locale import _
+from crossepg_auto import crossepg_auto
+
+from time import *
+
+class CrossEPG_Setup(Screen):
+	def __init__(self, session):
+		if (getDesktop(0).size().width() < 800):
+			skin = "%s/skins/setup_sd.xml" % (os.path.dirname(sys.modules[__name__].__file__))
+		else:
+			skin = "%s/skins/setup_hd.xml" % (os.path.dirname(sys.modules[__name__].__file__))
+		f = open(skin, "r")
+		self.skin = f.read()
+		f.close()
+		Screen.__init__(self, session)
+
+		patchtype = getEPGPatchType()
+		if patchtype == 0 or patchtype == 1 or patchtype == 3:
+			self.fastpatch = True
+		else:
+			self.fastpatch = False
+		
+		self.session = session
+
+		self.config = CrossEPG_Config()
+		self.config.load()
+
+		self.lamedbs = self.config.getAllLamedbs()
+
+		self.lamedbs_desc = []
+		self.mountpoint = []
+		self.mountdescription = []
+		self.automatictype = []
+
+		self.show_extension = self.config.show_extension
+		self.show_plugin = self.config.show_plugin
+
+		# make devices entries
+		if self.config.isQBOXHD():
+			self.mountdescription.append(_("Internal flash"))
+			self.mountpoint.append("/var/crossepg/data")
+
+		for partition in harddiskmanager.getMountedPartitions():
+			if (partition.mountpoint != '/') and (partition.mountpoint != ''): # and self.isMountedInRW(partition.mountpoint):
+				self.mountpoint.append(partition.mountpoint + "/crossepg")
+
+				if partition.description != '':
+					self.mountdescription.append(partition.description)
+				else:
+					self.mountdescription.append(partition.mountpoint)
+				
+		if not self.config.isQBOXHD():		# for other decoders we add internal flash as last entry (it's unsuggested)
+			self.mountdescription.append(_("Internal flash (unsuggested)"))
+			self.mountpoint.append(self.config.home_directory + "/data")
+			
+		# make lamedb entries
+		for lamedb in self.lamedbs:
+			if lamedb == "lamedb":
+				self.lamedbs_desc.append(_("main lamedb"))
+			else:
+				self.lamedbs_desc.append(lamedb.replace("lamedb.", "").replace(".", " "))
+				
+		# make automatic type entries
+		self.automatictype.append(_("disabled"))
+		self.automatictype.append(_("once a day"))
+		self.automatictype.append(_("every hour (only in standby)"))
+
+		self.list = []
+		self["config"] = ConfigList(self.list, session = self.session)
+		self["config"].onSelectionChanged.append(self.setInfo)
+		self["information"] = Label("")
+		self["key_red"] = Button(_("Back"))
+		self["key_green"] = Button()
+		self["key_yellow"] = Button()
+		self["key_blue"] = Button("")
+		self["config_actions"] = NumberActionMap(["SetupActions", "InputAsciiActions", "KeyboardInputActions", "ColorActions"],
+		{
+			"red": self.quit,
+			"cancel": self.quit,
+			"left": self.keyLeft,
+			"right": self.keyRight,
+			"home": self.keyHome,
+			"end": self.keyEnd,
+			"1": self.keyNumberGlobal,
+			"2": self.keyNumberGlobal,
+			"3": self.keyNumberGlobal,
+			"4": self.keyNumberGlobal,
+			"5": self.keyNumberGlobal,
+			"6": self.keyNumberGlobal,
+			"7": self.keyNumberGlobal,
+			"8": self.keyNumberGlobal,
+			"9": self.keyNumberGlobal,
+			"0": self.keyNumberGlobal
+		}, -1) # to prevent left/right overriding the listbox
+
+		self.makeList()
+
+	def showWarning(self):	
+		self.session.open(MessageBox, _("PLEASE READ!\nNo disk found. An hard drive or an usb pen is HARDLY SUGGESTED. If you still want use your internal flash pay attention to:\n(1) If you don't have enough free space your box may completely block and you need to flash it again\n(2) Many write operations on your internal flash may damage your flash memory"), type = MessageBox.TYPE_ERROR)
+	
+	def keyLeft(self):
+		self["config"].handleKey(KEY_LEFT)
+		self.update()
+		#self.setInfo()
+
+	def keyRight(self):
+		self["config"].handleKey(KEY_RIGHT)
+		self.update()
+		#self.setInfo()
+
+	def keyHome(self):
+		self["config"].handleKey(KEY_HOME)
+		self.update()
+		#self.setInfo()
+
+	def keyEnd(self):
+		self["config"].handleKey(KEY_END)
+		self.update()
+		#self.setInfo()
+
+	def keyNumberGlobal(self, number):
+		self["config"].handleKey(KEY_0 + number)
+		self.update()
+		#self.setInfo()
+
+	def makeList(self):
+		self.list = []
+
+		device_default = None
+		i = 0
+		for mountpoint in self.mountpoint:
+			if mountpoint == self.config.db_root:
+				device_default = self.mountdescription[i]
+			i += 1
+
+		# default device is really important... if miss a default we force it on first entry and update now the main config
+		if device_default == None:
+			self.config.db_root = self.mountpoint[0]
+			device_default = self.mountdescription[0]
+			
+		lamedb_default = _("main lamedb")
+		if self.config.lamedb != "lamedb":
+			lamedb_default = self.config.lamedb.replace("lamedb.", "").replace(".", " ")
+
+		scheduled_default = None
+		if self.config.download_standby_enabled:
+			scheduled_default = _("every hour (only in standby)")
+		elif self.config.download_daily_enabled:
+			scheduled_default = _("once a day")
+		else:
+			scheduled_default = _("disabled")
+
+		self.list.append((_("Storage device"), ConfigSelection(self.mountdescription, device_default)))
+		if len(self.lamedbs_desc) > 1:
+			self.list.append((_("Preferred lamedb"), ConfigSelection(self.lamedbs_desc, lamedb_default)))
+
+		self.list.append((_("Enable csv import"), ConfigYesNo(self.config.csv_import_enabled > 0)))
+		self.list.append((_("Force epg reload on boot"), ConfigYesNo(self.config.force_load_on_boot > 0)))
+		self.list.append((_("Download on tune"), ConfigYesNo(self.config.download_tune_enabled > 0)))
+		self.list.append((_("Scheduled download"), ConfigSelection(self.automatictype, scheduled_default)))
+
+		if self.config.download_daily_enabled:
+			ttime = localtime()
+			ltime = (ttime[0], ttime[1], ttime[2], self.config.download_daily_hours, self.config.download_daily_minutes, ttime[5], ttime[6], ttime[7], ttime[8])
+			self.list.append((_("Scheduled download at"), ConfigClock(mktime(ltime))))
+
+		if not self.fastpatch:
+			self.list.append((_("Reboot after a scheduled download"), ConfigYesNo(self.config.download_daily_reboot > 0)))
+			self.list.append((_("Reboot after a manual download"), ConfigYesNo(self.config.download_manual_reboot > 0)))
+		self.list.append((_("Show as plugin"), ConfigYesNo(self.config.show_plugin > 0)))
+		self.list.append((_("Show as extension"), ConfigYesNo(self.config.show_extension > 0)))
+
+		self["config"].setList(self.list)
+		self.setInfo()
+
+	def update(self):
+		redraw = False
+		self.config.db_root = self.mountpoint[self.list[0][1].getIndex()]
+		
+		i = 1
+		if len(self.lamedbs_desc) > 1:
+			self.config.lamedb = self.lamedbs[self.list[i][1].getIndex()]
+			i += 1
+
+		self.config.csv_import_enabled = int(self.list[i][1].getValue())
+		self.config.force_load_on_boot = int(self.list[i+1][1].getValue())
+		self.config.download_tune_enabled = int(self.list[i+2][1].getValue())
+
+		dailycache = self.config.download_daily_enabled
+		standbycache = self.config.download_standby_enabled
+		if self.list[i+3][1].getIndex() == 0:
+			self.config.download_daily_enabled = 0
+			self.config.download_standby_enabled = 0
+		elif self.list[i+3][1].getIndex() == 1:
+			self.config.download_daily_enabled = 1
+			self.config.download_standby_enabled = 0
+		else:
+			self.config.download_daily_enabled = 0
+			self.config.download_standby_enabled = 1
+
+		if dailycache != self.config.download_daily_enabled or standbycache != self.config.download_standby_enabled:
+			redraw = True
+
+		i += 4
+		if dailycache:
+			self.config.download_daily_hours = self.list[i][1].getValue()[0]
+			self.config.download_daily_minutes = self.list[i][1].getValue()[1]
+			i += 1
+
+		if not self.fastpatch:
+			self.config.download_daily_reboot = int(self.list[i][1].getValue())
+			self.config.download_manual_reboot = int(self.list[i+1][1].getValue())
+			i += 2
+
+		self.config.show_plugin = int(self.list[i][1].getValue())
+		self.config.show_extension = int(self.list[i+1][1].getValue())
+
+		if redraw:
+			self.makeList()
+
+	def setInfo(self):
+		index = self["config"].getCurrentIndex()
+		if len(self.lamedbs_desc) <= 1 and index > 0:
+			index += 1
+		if self.config.download_daily_enabled == 0 and index > 5:
+			index += 1
+		if self.fastpatch and index > 6:
+			index += 2
+
+		if index == 0:
+			self["information"].setText(_("Drive where you save data.\nThe drive MUST be mounted in rw"))
+		elif index == 1:
+			self["information"].setText(_("Lamedb used for epg.dat conversion.\nThis option doesn't work with crossepg patch v2"))
+		elif index == 2:
+			self["information"].setText(_("Import *.csv and *.bin from %s/import or %s/import\n(*.bin are binaries with a csv as stdout)") % (self.config.db_root, self.config.home_directory))
+		elif index == 3:
+			self["information"].setText(_("Reload epg at every boot.\nNormally it's not necessary but recover epg after an enigma2 crash"))
+		elif index == 4:
+			self["information"].setText(_("Only for opentv providers.\nIf you zap on channel used from a provider it download the epg in background"))
+		elif index == 5:
+			if self.config.download_standby_enabled:
+				self["information"].setText(_("When the decoder is in standby opentv providers will be automatically downloaded every hour.\nXMLTV providers will be always downloaded only once a day"))
+			elif self.config.download_daily_enabled:
+				self["information"].setText(_("Download epg once a day"))
+			else:
+				self["information"].setText(_("Scheduled download disabled"))
+		elif index == 6:
+			self["information"].setText(_("Time for scheduled daily download"))
+		elif index == 7:
+			self["information"].setText(_("Automatically reboot the decoder after a scheduled download"))
+		elif index == 8:
+			self["information"].setText(_("Automatically reboot the decoder after a manual download"))
+		elif index == 9:
+			self["information"].setText(_("Show crossepg in plugin menu"))
+		elif index == 10:
+			self["information"].setText(_("Show crossepg in extensions menu"))
+		
+	def quit(self):
+		self.config.last_full_download_timestamp = 0
+		self.config.last_partial_download_timestamp = 0
+		self.config.configured = 1
+		self.config.save()
+		if self.show_extension != self.config.show_extension or self.show_plugin != self.config.show_plugin:
+			for plugin in plugins.getPlugins(PluginDescriptor.WHERE_PLUGINMENU):
+				if plugin.name == "CrossEPG Downloader":
+					plugins.removePlugin(plugin)
+				
+			for plugin in plugins.getPlugins(PluginDescriptor.WHERE_EXTENSIONSMENU):
+				if plugin.name == "CrossEPG Downloader":
+					plugins.removePlugin(plugin)
+				
+			plugins.readPluginList(resolveFilename(SCOPE_PLUGINS))
+			
+		crossepg_auto.forcePoll()
+		
+		if self.config.db_root == self.config.home_directory + "/data" and not self.config.isQBOXHD():
+			self.showWarning()
+			
+		self.close()
+
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepglib.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepglib.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/crossepglib.py	(revision 6774)
@@ -0,0 +1,643 @@
+from enigma import *
+from crossepg_locale import _
+from Tools.Directories import crawlDirectory, pathExists, createDir
+from types import *
+
+import sys, traceback
+import os
+import re
+import time
+import new
+import _enigma
+
+# return value
+# -1 none
+# 0 simple epgcache.load() patch
+# 1 edg nemesis patch
+# 2 oudeis patch
+# 3 crossepg v2.1 patch
+def getEPGPatchType():
+	try:
+		xepgpatch = new.instancemethod(_enigma.eEPGCache_crossepgImportEPGv21,None,eEPGCache)
+		return 3
+	except Exception, e:
+		pass
+
+	try:
+		epgpatch = new.instancemethod(_enigma.eEPGCache_load,None,eEPGCache)
+		return 0
+	except Exception, e:
+		pass
+		
+	try:
+		edgpatch = new.instancemethod(_enigma.eEPGCache_reloadEpg,None,eEPGCache)
+		return 1
+	except Exception, e:
+		pass
+		
+	try:
+		oudeispatch = new.instancemethod(_enigma.eEPGCache_importEvent,None,eEPGCache)
+		return 2
+	except Exception, e:
+		pass
+
+	return -1
+
+class CrossEPG_Config:
+	providers = [ ]
+	db_root = "/hdd/crossepg"
+	lamedb = "lamedb"
+	home_directory = ""
+	
+	force_load_on_boot = 0
+	download_daily_enabled = 0
+	download_daily_hours = 4
+	download_daily_minutes = 0
+	download_daily_reboot = 1
+	download_tune_enabled = 0
+	download_standby_enabled = 0
+	download_manual_reboot = 0
+	csv_import_enabled = 0
+	show_plugin = 1
+	show_extension = 1
+	last_partial_download_timestamp = 0
+	last_full_download_timestamp = 0
+	configured = 0
+	
+	def __init__(self):
+		if pathExists("/usr/crossepg"):
+			self.home_directory = "/usr/crossepg"
+		elif pathExists("/var/crossepg"):
+			self.home_directory = "/var/crossepg"
+		else:
+			print "[CrossEPG_Config] ERROR!! CrossEPG binaries non found"
+			
+	def load(self):
+		try:
+			f = open("%s/crossepg.config" % (self.home_directory), "r")
+		except Exception, e:
+			#print "[CrossEPG_Config] %s" % (e)
+			return
+			
+		commentRe = re.compile(r"#(.*)")
+		entryRe = re.compile(r"(.*)=(.*)")
+		
+		for line in f.readlines(): 
+			try:
+				comment = re.findall(commentRe, line)
+				if not comment:
+					entry = re.findall(entryRe, line)
+					if entry:
+						key = entry[0][0].strip()
+						value = entry[0][1].strip()
+						if key == "db_root":
+							self.db_root = value
+						if key == "lamedb":
+							self.lamedb = value
+						elif key == "providers":
+							self.providers = []
+							tmp = value.split("|")
+							for p in tmp:
+								if len(p) > 0 and os.path.exists("%s/providers/%s.conf" % (self.home_directory, p)):
+									self.providers.append(p)
+						elif key == "force_load_on_boot":
+							self.force_load_on_boot = int(value);
+						elif key == "download_daily_enabled":
+							self.download_daily_enabled = int(value);
+						elif key == "download_daily_hours":
+							self.download_daily_hours = int(value);
+						elif key == "download_daily_minutes":
+							self.download_daily_minutes = int(value);
+						elif key == "download_tune_enabled":
+							self.download_tune_enabled = int(value);
+						elif key == "download_daily_reboot":
+							self.download_daily_reboot = int(value);
+						elif key == "download_manual_reboot":
+							self.download_manual_reboot = int(value);
+						elif key == "download_standby_enabled":
+							self.download_standby_enabled = int(value);
+						elif key == "last_partial_download_timestamp":
+							self.last_partial_download_timestamp = int(value);
+						elif key == "last_full_download_timestamp":
+							self.last_full_download_timestamp = int(value);
+						elif key == "csv_import_enabled":
+							self.csv_import_enabled = int(value);
+						elif key == "show_plugin":
+							self.show_plugin = int(value);
+						elif key == "show_extension":
+							self.show_extension = int(value);
+						elif key == "configured":
+							self.configured = int(value);
+			except Exception:
+				pass
+
+		f.close()
+		
+	def save(self):
+		try:
+			f = open("%s/crossepg.config" % (self.home_directory), "w")
+		except Exception, e:
+			print "[CrossEPG_Config] %s" % (e)
+			return
+
+		tmp = []
+		for p in self.providers:
+			if len(p) > 0:
+					tmp.append(p)
+		self.providers = tmp
+		
+		f.write("db_root=%s\n" % (self.db_root))
+		f.write("lamedb=%s\n" % (self.lamedb))
+		f.write("providers=%s\n" % ("|".join(self.providers)))
+		f.write("force_load_on_boot=%d\n" % (self.force_load_on_boot))
+		f.write("download_daily_enabled=%d\n" % (self.download_daily_enabled))
+		f.write("download_daily_hours=%d\n" % (self.download_daily_hours))
+		f.write("download_daily_minutes=%d\n" % (self.download_daily_minutes))
+		f.write("download_daily_reboot=%d\n" % (self.download_daily_reboot))
+		f.write("download_tune_enabled=%d\n" % (self.download_tune_enabled))
+		f.write("download_manual_reboot=%d\n" % (self.download_manual_reboot))
+		f.write("download_standby_enabled=%d\n" % (self.download_standby_enabled))
+		f.write("last_full_download_timestamp=%d\n" % (self.last_full_download_timestamp))
+		f.write("last_partial_download_timestamp=%d\n" % (self.last_partial_download_timestamp))
+		f.write("csv_import_enabled=%d\n" % (self.csv_import_enabled))
+		f.write("show_plugin=%d\n" % (self.show_plugin))
+		f.write("show_extension=%d\n" % (self.show_extension))
+		f.write("configured=%d\n" % (self.configured))
+		
+		f.close()
+		
+	def getChannelProtocol(self, provider):
+		try:
+			f = open("%s/providers/%s.conf" % (self.home_directory, provider), "r")
+		except Exception, e:
+			print "[CrossEPG_Config] %s" % (e)
+			return
+			
+		proto = re.compile(r"protocol=(.*)")
+		for line in f.readlines(): 
+			zproto = re.findall(proto, line)
+			if zproto:
+				f.close()
+				return zproto[0].strip()
+		
+		f.close()
+		return ""
+	
+	def getChannelID(self, provider):
+		try:
+			f = open("%s/providers/%s.conf" % (self.home_directory, provider), "r")
+		except Exception, e:
+			print "[CrossEPG_Config] %s" % (e)
+			return
+			
+		nid = -1;
+		tsid = -1;
+		sid = -1;
+		namespace = -1;
+		nidRe = re.compile(r"nid=(.*)")
+		tsidRe = re.compile(r"tsid=(.*)")
+		sidRe = re.compile(r"sid=(.*)")
+		namespaceRe = re.compile(r"namespace=(.*)")
+		
+		for line in f.readlines(): 
+			znid = re.findall(nidRe, line)
+			if znid:
+				nid = int(znid[0])
+			zsid = re.findall(sidRe, line)
+			if zsid:
+				sid = int(zsid[0])
+			ztsid = re.findall(tsidRe, line)	
+			if ztsid:
+				tsid = int(ztsid[0])
+			znamespace = re.findall(namespaceRe, line)	
+			if znamespace:
+				namespace = int(znamespace[0]);
+		
+		if nid == -1 or sid == -1 or tsid == -1:
+			return
+		
+		f.close()
+		return "1:0:1:%X:%X:%X:%X:0:0:0:" % (sid, tsid, nid, namespace)
+		
+	def getAllProviders(self):
+		providers = list()
+		providersdesc = list()
+		providersproto = list()
+		cfiles = crawlDirectory("%s/providers/" % (self.home_directory), ".*\.conf$")
+		for cfile in cfiles:
+			providers.append(cfile[1].replace(".conf", ""))
+			
+		providers.sort()
+		
+		for provider in providers:
+			try:
+				descadded = False
+				protoadded = False
+				f = open("%s/providers/%s.conf" % (self.home_directory, provider), "r")
+				desc = re.compile(r"description=(.*)")
+				proto = re.compile(r"protocol=(.*)")
+				for line in f.readlines(): 
+					zdesc = re.findall(desc, line)
+					if zdesc:
+						providersdesc.append(zdesc[0].strip())
+						descadded = True
+
+					zproto = re.findall(proto, line)
+					if zproto:
+						providersproto.append(zproto[0].strip())
+						protoadded = True
+
+					if descadded and protoadded:
+						break
+
+				f.close()
+				
+				if not descadded:
+					providersdesc.append(provider)
+
+				if not protoadded:
+					providersproto.append(None)
+					
+			except Exception, e:
+				print "[CrossEPG_Config] %s" % (e)
+				providersdesc.append(provider)
+				providersproto.append(None)
+				
+		ret = [providers, providersdesc, providersproto]
+		return ret
+			
+	def getAllLamedbs(self):
+		lamedbs = list()
+		cfiles = crawlDirectory("/etc/enigma2/", "^lamedb.*")
+		for cfile in cfiles:
+			lamedbs.append(cfile[1])
+			
+		return lamedbs
+	
+	def isQBOXHD(self):
+		try:
+			ret = False
+			f = open("/proc/stb/info/model", "r")
+			model = f.read().strip()
+			if model == "qboxhd" or model == "qboxhd-mini":
+				ret = True
+			f.close()
+			return ret
+		except Exception, e:
+			return False
+		
+	def deleteLog(self):
+		try:
+			os.unlink(self.db_root + "/crossepg.log")
+		except Exception, e:
+			print e
+
+class CrossEPG_Wrapper:
+	EVENT_READY			= 0
+	EVENT_OK			= 1
+	EVENT_START			= 2
+	EVENT_END			= 3
+	EVENT_QUIT			= 4
+	EVENT_ERROR			= 5
+	EVENT_ACTION			= 6
+	EVENT_STATUS			= 7
+	EVENT_PROGRESS			= 8
+	EVENT_PROGRESSONOFF		= 9
+	EVENT_CHANNEL			= 10
+	EVENT_STARTTIME			= 11
+	EVENT_LENGTH			= 12
+	EVENT_NAME			= 13
+	EVENT_DESCRIPTION		= 14
+	EVENT_FILE			= 15
+	EVENT_URL			= 16
+	
+	INFO_HEADERSDB_SIZE		= 50
+	INFO_DESCRIPTORSDB_SIZE	= 51
+	INFO_INDEXESDB_SIZE		= 52
+	INFO_ALIASESDB_SIZE		= 53
+	INFO_TOTAL_SIZE			= 54
+	INFO_CHANNELS_COUNT		= 55
+	INFO_EVENTS_COUNT		= 56
+	INFO_HASHES_COUNT		= 57
+	INFO_CREATION_TIME		= 58
+	INFO_UPDATE_TIME		= 59
+	INFO_VERSION			= 60
+	
+	CMD_DOWNLOADER	= 0
+	CMD_CONVERTER	= 1
+	CMD_INFO		= 2
+	CMD_IMPORTER	= 3
+
+	home_directory = ""
+
+	def __init__(self):
+		self.cmd = eConsoleAppContainer()
+		self.cache = None
+		self.callbackList = []
+		self.type = 0
+		self.maxSize = "0 byte"
+		
+		versionlist = getEnigmaVersionString().split("-");
+		
+		self.oldapi = False
+		try:
+			if len(versionlist) >= 3:
+				self.version = int(versionlist[0]+versionlist[1]+versionlist[2])
+				if self.version < 20100716:
+					self.oldapi = True
+		except Exception:
+			pass
+				
+		config = CrossEPG_Config()
+		if config.isQBOXHD():
+				self.oldapi = True
+		
+		if pathExists("/usr/crossepg"):
+			self.home_directory = "/usr/crossepg"
+		elif pathExists("/var/crossepg"):
+			self.home_directory = "/var/crossepg"
+		else:
+			print "[CrossEPG_Config] ERROR!! CrossEPG binaries non found"
+		
+	def init(self, cmd, dbdir):
+		if not pathExists(dbdir):
+			if not createDir(dbdir):
+				dbdir = "/hdd/crossepg"
+				
+		if cmd == self.CMD_DOWNLOADER:
+			x = "%s/crossepg_downloader -r -d %s" % (self.home_directory, dbdir)
+		elif cmd == self.CMD_CONVERTER:
+			x = "%s/crossepg_dbconverter -r -d %s" % (self.home_directory, dbdir)
+		elif cmd == self.CMD_INFO:
+			x = "%s/crossepg_dbinfo -r -d %s" % (self.home_directory, dbdir)
+		elif cmd == self.CMD_IMPORTER:
+			importdir = "%s/import/" % (dbdir)
+			x = "%s/crossepg_importer -r -i %s -d %s" % (self.home_directory, importdir, dbdir)
+		else:
+			print "[CrossEPG_Wrapper] unknow command on init"
+			return
+			
+		print "[CrossEPG_Wrapper] executing %s" % (x)
+		self.cmd.appClosed.append(self.__cmdFinished)
+		self.cmd.dataAvail.append(self.__cmdData)
+		if self.cmd.execute(x):
+			self.cmdFinished(-1)
+			
+	def __cmdFinished(self, retval):
+		self.__callCallbacks(self.EVENT_QUIT)
+		self.cmd.appClosed.remove(self.__cmdFinished)
+		self.cmd.dataAvail.remove(self.__cmdData)
+
+	def __cmdData(self, data):
+		if self.cache is None:
+			self.cache = data
+		else:
+			self.cache += data
+
+		if '\n' in data:
+			splitcache = self.cache.split('\n')
+			if self.cache[-1] == '\n':
+				iteration = splitcache
+				self.cache = None
+			else:
+				iteration = splitcache[:-1]
+				self.cache = splitcache[-1]
+			for mydata in iteration:
+				if mydata != '':
+					self.__parseLine(mydata)
+
+	def __parseLine(self, data):
+		if data.find("CHANNEL ") == 0:
+			self.__callCallbacks(self.EVENT_CHANNEL, data[7:])
+		elif data.find("STARTTIME ") == 0:
+			self.__callCallbacks(self.EVENT_STARTTIME, int(data[10:]))
+		elif data.find("LENGTH ") == 0:
+			self.__callCallbacks(self.EVENT_LENGTH, int(data[7:]))
+		elif data.find("NAME ") == 0:
+			self.__callCallbacks(self.EVENT_NAME, data[5:])
+		elif data.find("DESCRIPTION ") == 0:
+			self.__callCallbacks(self.EVENT_DESCRIPTION, data[12:].replace("\\n", "\n"))
+		elif data == "READY":
+			print "[CrossEPG_Wrapper] <- READY"
+			self.__callCallbacks(self.EVENT_READY, None)
+		elif data == "START":
+			print "[CrossEPG_Wrapper] <- START"
+			self.__callCallbacks(self.EVENT_START, None)
+		elif data == "END":
+			print "[CrossEPG_Wrapper] <- END"
+			self.__callCallbacks(self.EVENT_END, None)
+		elif data == "OK":
+			print "[CrossEPG_Wrapper] <- OK"
+			self.__callCallbacks(self.EVENT_OK, None)
+		elif data.find("ERROR ") == 0:
+			ttype = data[5:]
+			self.__callCallbacks(self.EVENT_ERROR, data[6:])
+		elif data.find("TYPE ") == 0:
+			ttype = data[5:]
+			print "[CrossEPG_Wrapper] <- TYPE %s" % (ttype)
+			if ttype == "READ CHANNELS":
+				self.type = 0;
+				self.__callCallbacks(self.EVENT_ACTION, _("Reading channels"))
+			elif ttype == "READ TITLES":
+				self.type = 1;
+				self.__callCallbacks(self.EVENT_ACTION, _("Reading titles"))
+			elif ttype == "PARSE TITLES":
+				self.type = 2;
+				self.__callCallbacks(self.EVENT_ACTION, _("Parsing titles"))
+			elif ttype == "READ SUMMARIES":
+				self.type = 3;
+				self.__callCallbacks(self.EVENT_ACTION, _("Reading summaries"))
+			elif ttype == "PARSE SUMMARIES":
+				self.type = 4;
+				self.__callCallbacks(self.EVENT_ACTION, _("Parsing summaries"))
+			elif ttype == "DOWNLOADING CHANNELS LIST":
+				self.type = 5;
+				self.__callCallbacks(self.EVENT_ACTION, _("Downloading channels list"))
+			elif ttype == "DEFLATING CHANNELS LIST":
+				self.type = 6;
+				self.__callCallbacks(self.EVENT_ACTION, _("Deflating channels list"))
+			elif ttype == "PARSING CHANNELS LIST":
+				self.type = 7;
+				self.__callCallbacks(self.EVENT_ACTION, _("Parsing channels list"))
+			elif ttype == "DOWNLOADING EVENTS":
+				self.type = 8;
+				self.__callCallbacks(self.EVENT_ACTION, _("Downloading events"))
+			elif ttype == "DEFLATING EVENTS":
+				self.type = 9;
+				self.__callCallbacks(self.EVENT_ACTION, _("Deflating events"))
+			elif ttype == "PARSING EVENTS":
+				self.type = 10;
+				self.__callCallbacks(self.EVENT_ACTION, _("Parsing events"))
+			elif ttype == "DOWNLOADING XEPGDB":
+				self.type = 11;
+				self.__callCallbacks(self.EVENT_ACTION, _("Downloading XEPGDB"))
+			elif ttype == "PARSING XEPGDB":
+				self.type = 12;
+				self.__callCallbacks(self.EVENT_ACTION, _("Merging XEPGDB"))
+			elif ttype == "DEFLATING XEPGDB":
+				self.type = 13;
+				self.__callCallbacks(self.EVENT_ACTION, _("Deflating XEPGDB"))
+			elif ttype == "RUNNING SCRIPT":
+				self.type = 14;
+				self.__callCallbacks(self.EVENT_ACTION, _("Running script"))
+			elif ttype.find("RUNNING CSCRIPT ") == 0:
+				self.type = 14;
+				self.__callCallbacks(self.EVENT_ACTION, _("Running script") + " " + data[21:])
+				
+		elif data.find("CHANNELS ") == 0:
+			self.__callCallbacks(self.EVENT_STATUS, _("%s channels") % (data[9:]))
+		elif data.find("SIZE ") == 0:
+			if self.type == 1 or self.type == 3:
+				self.maxSize = data[5:]
+				self.__callCallbacks(self.EVENT_STATUS, _("Read %s") % (data[5:]))
+			else:
+				self.__callCallbacks(self.EVENT_STATUS, _("%s of %s") % (data[5:], self.maxSize))
+		elif data.find("PROGRESS ") == 0:
+			if data[9:] == "ON":
+				self.__callCallbacks(self.EVENT_PROGRESSONOFF, True)
+			elif data[9:] == "OFF":
+				self.__callCallbacks(self.EVENT_PROGRESSONOFF, False)
+			else:
+				self.__callCallbacks(self.EVENT_PROGRESS, int(data[9:]))
+		elif data.find("FILE ") == 0:
+			self.__callCallbacks(self.EVENT_FILE, data[5:])
+		elif data.find("URL ") == 0:
+			self.__callCallbacks(self.EVENT_URL, data[4:])
+		elif data.find("VERSION ") == 0:
+			self.__callCallbacks(self.INFO_VERSION, data[8:])
+		elif data.find("HEADERSDB_SIZE ") == 0:
+			self.__callCallbacks(self.INFO_HEADERSDB_SIZE, data[15:])
+		elif data.find("DESCRIPTORSDB_SIZE ") == 0:
+			self.__callCallbacks(self.INFO_DESCRIPTORSDB_SIZE, data[19:])
+		elif data.find("INDEXESDB_SIZE ") == 0:
+			self.__callCallbacks(self.INFO_INDEXESDB_SIZE, data[15:])
+		elif data.find("ALIASESDB_SIZE ") == 0:
+			self.__callCallbacks(self.INFO_ALIASESDB_SIZE, data[15:])
+		elif data.find("TOTAL_SIZE ") == 0:
+			self.__callCallbacks(self.INFO_TOTAL_SIZE, data[11:])
+		elif data.find("CHANNELS_COUNT ") == 0:
+			self.__callCallbacks(self.INFO_CHANNELS_COUNT, data[15:])
+		elif data.find("EVENTS_COUNT ") == 0:
+			self.__callCallbacks(self.INFO_EVENTS_COUNT, data[13:])
+		elif data.find("HASHES_COUNT ") == 0:
+			self.__callCallbacks(self.INFO_HASHES_COUNT, data[13:])
+		elif data.find("CREATION_TIME ") == 0:
+			self.__callCallbacks(self.INFO_CREATION_TIME, data[14:])
+		elif data.find("UPDATE_TIME ") == 0:
+			self.__callCallbacks(self.INFO_UPDATE_TIME, data[12:])
+		elif data.find("LOGTEXT ") == 0:
+			self.__callCallbacks(self.EVENT_STATUS, data[8:])
+
+	def __callCallbacks(self, event, param = None):
+		for callback in self.callbackList:
+			callback(event, param)
+
+	def addCallback(self, callback):
+		self.callbackList.append(callback)
+
+	def delCallback(self, callback):
+		self.callbackList.remove(callback)
+
+	def running(self):
+		return self.cmd.running()
+		
+	def lamedb(self, value):
+		print "[CrossEPG_Wrapper] -> LAMEDB %s" % (value)
+		cmd = "LAMEDB %s\n" % (value)
+		if self.oldapi:
+			self.cmd.write(cmd, len(cmd))
+		else:
+			self.cmd.write(cmd)
+		
+	def epgdat(self, value):
+		print "[CrossEPG_Wrapper] -> EPGDAT %s" % (value)
+		cmd = "EPGDAT %s\n" % (value)
+		if self.oldapi:
+			self.cmd.write(cmd, len(cmd))
+		else:
+			self.cmd.write(cmd)
+			
+	def demuxer(self, value):
+		print "[CrossEPG_Wrapper] -> DEMUXER %s" % (value)
+		cmd = "DEMUXER %s\n" % (value)
+		if self.oldapi:
+			self.cmd.write(cmd, len(cmd))
+		else:
+			self.cmd.write(cmd)
+
+	def download(self, provider):
+		print "[CrossEPG_Wrapper] -> DOWNLOAD %s" % (provider)
+		cmd = "DOWNLOAD %s\n" % (provider)
+		if self.oldapi:
+			self.cmd.write(cmd, len(cmd))
+		else:
+			self.cmd.write(cmd)
+		
+	def convert(self):
+		print "[CrossEPG_Wrapper] -> CONVERT"
+		self.__callCallbacks(self.EVENT_ACTION, _("Converting data"))
+		self.__callCallbacks(self.EVENT_STATUS, "")
+		if self.oldapi:
+			self.cmd.write("CONVERT\n", 8)
+		else:
+			self.cmd.write("CONVERT\n")
+		
+	def importx(self):
+		print "[CrossEPG_Wrapper] -> IMPORT"
+		if self.oldapi:
+			self.cmd.write("IMPORT\n", 7)
+		else:
+			self.cmd.write("IMPORT\n")
+		
+	def text(self):
+		print "[CrossEPG_Wrapper] -> TEXT"
+		self.__callCallbacks(self.EVENT_ACTION, _("Loading data"))
+		self.__callCallbacks(self.EVENT_STATUS, "")
+		if self.oldapi:
+			self.cmd.write("TEXT\n", 5)
+		else:
+			self.cmd.write("TEXT\n")
+			
+	def stop(self):
+		print "[CrossEPG_Wrapper] -> STOP"
+		if self.oldapi:
+			self.cmd.write("STOP\n", 5)
+		else:
+			self.cmd.write("STOP\n")
+
+	def save(self):
+		print "[CrossEPG_Wrapper] -> SAVE"
+		self.__callCallbacks(self.EVENT_ACTION, _("Saving data"))
+		self.__callCallbacks(self.EVENT_STATUS, "")
+		if self.oldapi:
+			self.cmd.write("SAVE\n", 5)
+		else:
+			self.cmd.write("SAVE\n")
+
+	def wait(self):
+		print "[CrossEPG_Wrapper] -> WAIT"
+		if self.oldapi:
+			self.cmd.write("WAIT\n", 5)
+		else:
+			self.cmd.write("WAIT\n")
+
+	def quit(self):
+		print "[CrossEPG_Wrapper] -> QUIT"
+		if self.oldapi:
+			self.cmd.write("QUIT\n", 5)
+		else:
+			self.cmd.write("QUIT\n")
+
+	def open(self):
+		print "[CrossEPG_Wrapper] -> OPEN"
+		if self.oldapi:
+			self.cmd.write("OPEN\n", 5)
+		else:
+			self.cmd.write("OPEN\n")
+
+	def close(self):
+		print "[CrossEPG_Wrapper] -> CLOSE"
+		if self.oldapi:
+			self.cmd.write("CLOSE\n", 6)
+		else:
+			self.cmd.write("CLOSE\n")
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/plugin.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/plugin.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/plugin.py	(revision 6774)
@@ -0,0 +1,47 @@
+from crossepglib import CrossEPG_Config
+from crossepg_main import crossepg_main
+from crossepg_locale import _
+from Plugins.Plugin import PluginDescriptor
+
+def setup(menuid, **kwargs):
+	if menuid == "setup":
+		return [("CrossEPG", crossepg_main.setup, "crossepg", None)]
+	else:
+		return []
+
+def Plugins(**kwargs):
+	config = CrossEPG_Config()
+	config.load()
+	plugins = list()
+	if config.show_plugin == 1 and config.show_extension == 1:
+		plugins.append(PluginDescriptor(name="CrossEPG Downloader",
+										description=_("An EPG downloader"),
+										where = [ PluginDescriptor.WHERE_EXTENSIONSMENU, PluginDescriptor.WHERE_PLUGINMENU ],
+										fnc = crossepg_main.downloader))
+	elif config.show_extension == 1:
+		plugins.append(PluginDescriptor(name="CrossEPG Downloader",
+										description=_("An EPG downloader"),
+										where = PluginDescriptor.WHERE_EXTENSIONSMENU,
+										fnc = crossepg_main.downloader))
+	elif config.show_plugin == 1:
+		plugins.append(PluginDescriptor(name="CrossEPG Downloader",
+										description=_("An EPG downloader"),
+										where = PluginDescriptor.WHERE_PLUGINMENU,
+										fnc = crossepg_main.downloader))
+	
+	if config.isQBOXHD():
+		plugins.append(PluginDescriptor(name="CrossEPG",
+										description=_("CrossEPG setup panel"),
+										where = PluginDescriptor.WHERE_PLUGINMENU,
+										fnc = crossepg_main.setup))
+	else:
+		plugins.append(PluginDescriptor(name="CrossEPG",
+										description=_("CrossEPG setup panel"),
+										where = PluginDescriptor.WHERE_MENU,
+										fnc = setup))
+										
+	plugins.append(PluginDescriptor(name="CrossEPG Auto",
+									description = _("CrossEPG automatic actions"),
+									where = PluginDescriptor.WHERE_SESSIONSTART,
+									fnc = crossepg_main.autostart))
+	return plugins;
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/about_hd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/about_hd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/about_hd.xml	(revision 6774)
@@ -0,0 +1,15 @@
+<screen position="360,150" size="560,400" title="CrossEPG - About">
+	<widget name="about" position="10,10" size="460,360" font="Regular;15" />
+	<widget name="rytec_pix" position="480,200" size="70,70" />
+	<widget name="krkadoni_pix" position="480,290" size="70,22" />
+
+	<widget name="key_red" position="0,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_green" position="140,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_yellow" position="280,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_blue" position="420,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	
+	<ePixmap name="red" pixmap="skin_default/buttons/red.png" position="0,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="green" pixmap="skin_default/buttons/green.png" position="140,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="yellow" pixmap="skin_default/buttons/yellow.png" position="280,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="blue" pixmap="skin_default/buttons/blue.png" position="420,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/about_sd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/about_sd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/about_sd.xml	(revision 6774)
@@ -0,0 +1,15 @@
+<screen position="80,100" size="560,400" title="CrossEPG - About">
+	<widget name="about" position="10,10" size="460,360" font="Regular;15" />
+	<widget name="rytec_pix" position="480,200" size="70,70" />
+	<widget name="krkadoni_pix" position="480,290" size="70,22" />
+
+	<widget name="key_red" position="0,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_green" position="140,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_yellow" position="280,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_blue" position="420,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	
+	<ePixmap name="red" pixmap="skin_default/buttons/red.png" position="0,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="green" pixmap="skin_default/buttons/green.png" position="140,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="yellow" pixmap="skin_default/buttons/yellow.png" position="280,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="blue" pixmap="skin_default/buttons/blue.png" position="420,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/downloader_hd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/downloader_hd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/downloader_hd.xml	(revision 6774)
@@ -0,0 +1,6 @@
+<screen position="530,590" size="600,70" title="CrossEPG" flags="wfNoBorder">
+	<widget name="background" position="0,0" size="600,80" zPosition="-1" />
+	<widget name="action" halign="center" valign="center" position="65,10" size="520,20" font="Regular;16" />
+	<widget name="status" halign="center" valign="center" position="65,30" size="520,20" font="Regular;16" />
+	<widget name="progress" position="65,55" size="520,5" borderWidth="1" />
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/downloader_sd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/downloader_sd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/downloader_sd.xml	(revision 6774)
@@ -0,0 +1,6 @@
+<screen position="330,450" size="350,70" title="CrossEPG" flags="wfNoBorder">
+	<widget name="background" position="0,0" size="350,80" zPosition="-1" />
+	<widget name="action" halign="center" valign="center" position="65,10" size="270,20" font="Regular;15" />
+	<widget name="status" halign="center" valign="center" position="65,30" size="270,20" font="Regular;15" />
+	<widget name="progress" position="65,55" size="270,5" borderWidth="1" />
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/info_hd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/info_hd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/info_hd.xml	(revision 6774)
@@ -0,0 +1,23 @@
+<screen position="360,150" size="560,400" title="CrossEPG - DB Info">
+	<widget name="version" position="10,10" size="540,25" font="Regular;20" />
+	<widget name="create" position="10,40" size="540,25" font="Regular;20" />
+	<widget name="last_update" position="10,70" size="540,25" font="Regular;20" />
+	<widget name="headersdb_size" position="10,100" size="540,25" font="Regular;20" />
+	<widget name="descriptorsdb_size" position="10,130" size="540,25" font="Regular;20" />
+	<widget name="indexesdb_size" position="10,160" size="540,25" font="Regular;20" />
+	<widget name="aliasesdb_size" position="10,190" size="540,25" font="Regular;20" />
+	<widget name="total_size" position="10,220" size="540,25" font="Regular;20" />
+	<widget name="channels_count" position="10,250" size="540,25" font="Regular;20" />
+	<widget name="events_count" position="10,280" size="540,25" font="Regular;20" />
+	<widget name="hashes_count" position="10,310" size="540,25" font="Regular;20" />
+
+	<widget name="key_red" position="0,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_green" position="140,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_yellow" position="280,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_blue" position="420,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	
+	<ePixmap name="red" pixmap="skin_default/buttons/red.png" position="0,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="green" pixmap="skin_default/buttons/green.png" position="140,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="yellow" pixmap="skin_default/buttons/yellow.png" position="280,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="blue" pixmap="skin_default/buttons/blue.png" position="420,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/info_sd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/info_sd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/info_sd.xml	(revision 6774)
@@ -0,0 +1,23 @@
+<screen position="80,100" size="560,400" title="CrossEPG - DB Info">
+	<widget name="version" position="10,10" size="540,25" font="Regular;20" />
+	<widget name="create" position="10,40" size="540,25" font="Regular;20" />
+	<widget name="last_update" position="10,70" size="540,25" font="Regular;20" />
+	<widget name="headersdb_size" position="10,100" size="540,25" font="Regular;20" />
+	<widget name="descriptorsdb_size" position="10,130" size="540,25" font="Regular;20" />
+	<widget name="indexesdb_size" position="10,160" size="540,25" font="Regular;20" />
+	<widget name="aliasesdb_size" position="10,190" size="540,25" font="Regular;20" />
+	<widget name="total_size" position="10,220" size="540,25" font="Regular;20" />
+	<widget name="channels_count" position="10,250" size="540,25" font="Regular;20" />
+	<widget name="events_count" position="10,280" size="540,25" font="Regular;20" />
+	<widget name="hashes_count" position="10,310" size="540,25" font="Regular;20" />
+
+	<widget name="key_red" position="0,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_green" position="140,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_yellow" position="280,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_blue" position="420,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	
+	<ePixmap name="red" pixmap="skin_default/buttons/red.png" position="0,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="green" pixmap="skin_default/buttons/green.png" position="140,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="yellow" pixmap="skin_default/buttons/yellow.png" position="280,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="blue" pixmap="skin_default/buttons/blue.png" position="420,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/menu_hd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/menu_hd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/menu_hd.xml	(revision 6774)
@@ -0,0 +1,13 @@
+<screen position="360,170" size="560,360" title="CrossEPG">
+	<widget source="list" render="Listbox" position="0,0" size="560,360" scrollbarMode="showOnDemand">
+		<convert type="TemplatedMultiContent">
+			{"template": [
+				MultiContentEntryPixmapAlphaTest(pos = (12, 4), size = (32, 32), png = 0),
+				MultiContentEntryText(pos = (58, 5), size = (440, 38), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_TOP, text = 1),
+				],
+				"fonts": [gFont("Regular", 22)],
+				"itemHeight": 40
+			}
+		</convert>
+	</widget>	
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/menu_sd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/menu_sd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/menu_sd.xml	(revision 6774)
@@ -0,0 +1,13 @@
+<screen position="80,120" size="560,360" title="CrossEPG">
+	<widget source="list" render="Listbox" position="0,0" size="560,360" scrollbarMode="showOnDemand">
+		<convert type="TemplatedMultiContent">
+			{"template": [
+				MultiContentEntryPixmapAlphaTest(pos = (12, 4), size = (32, 32), png = 0),
+				MultiContentEntryText(pos = (58, 5), size = (440, 38), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_TOP, text = 1),
+				],
+				"fonts": [gFont("Regular", 22)],
+				"itemHeight": 40
+			}
+		</convert>
+	</widget>	
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/providers_hd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/providers_hd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/providers_hd.xml	(revision 6774)
@@ -0,0 +1,23 @@
+<screen position="360,150" size="560,400" title="CrossEPG - Providers">
+	<widget source="list" render="Listbox" position="0,0" size="560,360" scrollbarMode="showOnDemand">
+		<convert type="TemplatedMultiContent">
+			{"template": [
+				MultiContentEntryText(pos = (12, 1), size = (440, 32), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_TOP, text = 0),
+				MultiContentEntryPixmapAlphaTest(pos = (480, 0), size = (40, 40), png = 1),
+				],
+				"fonts": [gFont("Regular", 18)],
+				"itemHeight": 30
+			}
+		</convert>
+	</widget>
+
+	<widget name="key_red" position="0,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_green" position="140,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_yellow" position="280,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_blue" position="420,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	
+	<ePixmap name="red" pixmap="skin_default/buttons/red.png" position="0,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="green" pixmap="skin_default/buttons/green.png" position="140,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="yellow" pixmap="skin_default/buttons/yellow.png" position="280,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="blue" pixmap="skin_default/buttons/blue.png" position="420,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/providers_sd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/providers_sd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/providers_sd.xml	(revision 6774)
@@ -0,0 +1,23 @@
+<screen position="80,100" size="560,400" title="CrossEPG - Providers">
+	<widget source="list" render="Listbox" position="0,0" size="560,360" scrollbarMode="showOnDemand">
+		<convert type="TemplatedMultiContent">
+			{"template": [
+				MultiContentEntryText(pos = (12, 1), size = (440, 32), font=0, flags = RT_HALIGN_LEFT|RT_VALIGN_TOP, text = 0),
+				MultiContentEntryPixmapAlphaTest(pos = (480, 0), size = (40, 40), png = 1),
+				],
+				"fonts": [gFont("Regular", 18)],
+				"itemHeight": 30
+			}
+		</convert>
+	</widget>
+
+	<widget name="key_red" position="0,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_green" position="140,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_yellow" position="280,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_blue" position="420,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	
+	<ePixmap name="red" pixmap="skin_default/buttons/red.png" position="0,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="green" pixmap="skin_default/buttons/green.png" position="140,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="yellow" pixmap="skin_default/buttons/yellow.png" position="280,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="blue" pixmap="skin_default/buttons/blue.png" position="420,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/setup_hd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/setup_hd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/setup_hd.xml	(revision 6774)
@@ -0,0 +1,14 @@
+<screen position="360,150" size="560,400" title="CrossEPG - Configuration">
+	<widget name="config" position="5,5" size="550,250" scrollbarMode="showOnDemand" zPosition="1"/>
+	<widget name="information" position="5,250" size="550,100" halign="center" valign="center" font="Regular;18" />
+
+	<widget name="key_red" position="0,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_green" position="140,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_yellow" position="280,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_blue" position="420,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	
+	<ePixmap name="red" pixmap="skin_default/buttons/red.png" position="0,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="green" pixmap="skin_default/buttons/green.png" position="140,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="yellow" pixmap="skin_default/buttons/yellow.png" position="280,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="blue" pixmap="skin_default/buttons/blue.png" position="420,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/setup_sd.xml
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/setup_sd.xml	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/skins/setup_sd.xml	(revision 6774)
@@ -0,0 +1,14 @@
+<screen position="80,100" size="560,400" title="CrossEPG - Configuration">
+	<widget name="config" position="5,5" size="550,250" scrollbarMode="showOnDemand" zPosition="1"/>
+	<widget name="information" position="5,250" size="550,100" halign="center" valign="center" font="Regular;18" />
+	
+	<widget name="key_red" position="0,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_green" position="140,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_yellow" position="280,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	<widget name="key_blue" position="420,360" size="140,40" valign="center" halign="center" zPosition="5" transparent="1" foregroundColor="white" font="Regular;18"/>
+	
+	<ePixmap name="red" pixmap="skin_default/buttons/red.png" position="0,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="green" pixmap="skin_default/buttons/green.png" position="140,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="yellow" pixmap="skin_default/buttons/yellow.png" position="280,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+	<ePixmap name="blue" pixmap="skin_default/buttons/blue.png" position="420,360" size="140,40" zPosition="4" transparent="1" alphatest="on"/>
+</screen>
Index: ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/version.py
===================================================================
--- ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/version.py	(revision 6774)
+++ ipk/source/swapepg_crossepg_0_61/var/swap/extensions/CrossEPG/version.py	(revision 6774)
@@ -0,0 +1,1 @@
+version = "0.6.1 (svn 241)"
