From 1fe795e8bfb9d9ed7181bfe075469a960f7bb0e4 Mon Sep 17 00:00:00 2001
From: Walter Purcaro <vuolter@gmail.com>
Date: Wed, 10 Dec 2014 18:42:46 +0100
Subject: Revert plugin directory structure

---
 pyload/plugins/Account.py                       | 305 +++++++++++++++++++++++
 pyload/plugins/Addon.py                         | 169 +++++++++++++
 pyload/plugins/Captcha.py                       |  51 ++++
 pyload/plugins/Container.py                     |  66 +++++
 pyload/plugins/Crypter.py                       | 107 ++++++++
 pyload/plugins/Hoster.py                        |  21 ++
 pyload/plugins/OCR.py                           | 315 ++++++++++++++++++++++++
 pyload/plugins/account/AlldebridCom.py          |   2 +-
 pyload/plugins/account/BayfilesCom.py           |   2 +-
 pyload/plugins/account/BitshareCom.py           |   2 +-
 pyload/plugins/account/CatShareNet.py           |   2 +-
 pyload/plugins/account/CzshareCom.py            |   2 +-
 pyload/plugins/account/DebridItaliaCom.py       |   2 +-
 pyload/plugins/account/DepositfilesCom.py       |   2 +-
 pyload/plugins/account/EuroshareEu.py           |   2 +-
 pyload/plugins/account/FastixRu.py              |   2 +-
 pyload/plugins/account/FastshareCz.py           |   2 +-
 pyload/plugins/account/FilecloudIo.py           |   2 +-
 pyload/plugins/account/FilefactoryCom.py        |   2 +-
 pyload/plugins/account/FilejungleCom.py         |   2 +-
 pyload/plugins/account/FilerNet.py              |   2 +-
 pyload/plugins/account/FilesMailRu.py           |   2 +-
 pyload/plugins/account/FileserveCom.py          |   2 +-
 pyload/plugins/account/FourSharedCom.py         |   2 +-
 pyload/plugins/account/FreakshareCom.py         |   2 +-
 pyload/plugins/account/FreeWayMe.py             |   2 +-
 pyload/plugins/account/FshareVn.py              |   2 +-
 pyload/plugins/account/Ftp.py                   |   2 +-
 pyload/plugins/account/HellshareCz.py           |   2 +-
 pyload/plugins/account/Http.py                  |   2 +-
 pyload/plugins/account/Keep2shareCc.py          |   2 +-
 pyload/plugins/account/LetitbitNet.py           |   2 +-
 pyload/plugins/account/LinksnappyCom.py         |   2 +-
 pyload/plugins/account/MegaDebridEu.py          |   2 +-
 pyload/plugins/account/MegaRapidCz.py           |   2 +-
 pyload/plugins/account/MegasharesCom.py         |   2 +-
 pyload/plugins/account/MultishareCz.py          |   2 +-
 pyload/plugins/account/MyfastfileCom.py         |   2 +-
 pyload/plugins/account/NetloadIn.py             |   2 +-
 pyload/plugins/account/NowVideoAt.py            |   2 +-
 pyload/plugins/account/OboomCom.py              |   2 +-
 pyload/plugins/account/OneFichierCom.py         |   2 +-
 pyload/plugins/account/OverLoadMe.py            |   2 +-
 pyload/plugins/account/PremiumTo.py             |   2 +-
 pyload/plugins/account/PremiumizeMe.py          |   2 +-
 pyload/plugins/account/QuickshareCz.py          |   2 +-
 pyload/plugins/account/RPNetBiz.py              |   2 +-
 pyload/plugins/account/RapidgatorNet.py         |   2 +-
 pyload/plugins/account/RapiduNet.py             |   2 +-
 pyload/plugins/account/RealdebridCom.py         |   2 +-
 pyload/plugins/account/RehostTo.py              |   2 +-
 pyload/plugins/account/ShareonlineBiz.py        |   2 +-
 pyload/plugins/account/SimplyPremiumCom.py      |   2 +-
 pyload/plugins/account/SimplydebridCom.py       |   2 +-
 pyload/plugins/account/StahnuTo.py              |   2 +-
 pyload/plugins/account/TurbobitNet.py           |   2 +-
 pyload/plugins/account/UlozTo.py                |   2 +-
 pyload/plugins/account/UnrestrictLi.py          |   2 +-
 pyload/plugins/account/UploadedTo.py            |   2 +-
 pyload/plugins/account/UploadheroCom.py         |   2 +-
 pyload/plugins/account/UploadingCom.py          |   2 +-
 pyload/plugins/account/YibaishiwuCom.py         |   2 +-
 pyload/plugins/account/ZeveraCom.py             |   2 +-
 pyload/plugins/addon/Checksum.py                |   2 +-
 pyload/plugins/addon/ClickAndLoad.py            |   2 +-
 pyload/plugins/addon/DeleteFinished.py          |   2 +-
 pyload/plugins/addon/DownloadScheduler.py       |   2 +-
 pyload/plugins/addon/ExternalScripts.py         |   2 +-
 pyload/plugins/addon/ExtractArchive.py          |   2 +-
 pyload/plugins/addon/HotFolder.py               |   2 +-
 pyload/plugins/addon/IRCInterface.py            |   2 +-
 pyload/plugins/addon/MergeFiles.py              |   4 +-
 pyload/plugins/addon/MultiHome.py               |   2 +-
 pyload/plugins/addon/RestartFailed.py           |   2 +-
 pyload/plugins/addon/RestartSlow.py             |   2 +-
 pyload/plugins/addon/SkipRev.py                 |   2 +-
 pyload/plugins/addon/UnSkipOnFail.py            |   2 +-
 pyload/plugins/addon/UpdateManager.py           |   2 +-
 pyload/plugins/addon/WindowsPhoneToastNotify.py |   2 +-
 pyload/plugins/captcha/AdYouLike.py             |   2 +-
 pyload/plugins/captcha/AdsCaptcha.py            |   2 +-
 pyload/plugins/captcha/ReCaptcha.py             |   2 +-
 pyload/plugins/captcha/SolveMedia.py            |   2 +-
 pyload/plugins/container/CCF.py                 |   2 +-
 pyload/plugins/container/LinkList.py            |   2 +-
 pyload/plugins/container/RSDF.py                |   2 +-
 pyload/plugins/crypter/ChipDe.py                |   2 +-
 pyload/plugins/crypter/CzshareCom.py            |   2 +-
 pyload/plugins/crypter/DDLMusicOrg.py           |   2 +-
 pyload/plugins/crypter/DailymotionBatch.py      |   2 +-
 pyload/plugins/crypter/Dereferer.py             |   2 +-
 pyload/plugins/crypter/DontKnowMe.py            |   2 +-
 pyload/plugins/crypter/DuckCryptInfo.py         |   2 +-
 pyload/plugins/crypter/EmbeduploadCom.py        |   2 +-
 pyload/plugins/crypter/FilecryptCc.py           |   2 +-
 pyload/plugins/crypter/FileserveCom.py          |   2 +-
 pyload/plugins/crypter/FourChanOrg.py           |   2 +-
 pyload/plugins/crypter/GooGl.py                 |   2 +-
 pyload/plugins/crypter/HoerbuchIn.py            |   2 +-
 pyload/plugins/crypter/LetitbitNet.py           |   2 +-
 pyload/plugins/crypter/LinkCryptWs.py           |   2 +-
 pyload/plugins/crypter/LinkdecrypterCom.py      |   2 +-
 pyload/plugins/crypter/LixIn.py                 |   2 +-
 pyload/plugins/crypter/MediafireCom.py          |   2 +-
 pyload/plugins/crypter/MultiloadCz.py           |   2 +-
 pyload/plugins/crypter/NCryptIn.py              |   2 +-
 pyload/plugins/crypter/OneKhDe.py               |   2 +-
 pyload/plugins/crypter/QuickshareCz.py          |   2 +-
 pyload/plugins/crypter/RelinkUs.py              |   2 +-
 pyload/plugins/crypter/SafelinkingNet.py        |   2 +-
 pyload/plugins/crypter/SexuriaCom.py            |   2 +-
 pyload/plugins/crypter/ShareLinksBiz.py         |   2 +-
 pyload/plugins/crypter/UlozTo.py                |   2 +-
 pyload/plugins/crypter/XupPl.py                 |   2 +-
 pyload/plugins/crypter/YoutubeBatch.py          |   2 +-
 pyload/plugins/hook/BypassCaptcha.py            |   4 +-
 pyload/plugins/hook/Captcha9kw.py               |   4 +-
 pyload/plugins/hook/CaptchaBrotherhood.py       |   4 +-
 pyload/plugins/hook/DeathByCaptcha.py           |   4 +-
 pyload/plugins/hook/ExpertDecoders.py           |   4 +-
 pyload/plugins/hook/ImageTyperz.py              |   4 +-
 pyload/plugins/hook/LinkdecrypterCom.py         |   4 +-
 pyload/plugins/hook/XFileSharingPro.py          |   4 +-
 pyload/plugins/hoster/AlldebridCom.py           |   2 +-
 pyload/plugins/hoster/DailymotionCom.py         |   2 +-
 pyload/plugins/hoster/DebridItaliaCom.py        |   2 +-
 pyload/plugins/hoster/FastixRu.py               |   2 +-
 pyload/plugins/hoster/FilesMailRu.py            |   2 +-
 pyload/plugins/hoster/FileserveCom.py           |   2 +-
 pyload/plugins/hoster/FreakshareCom.py          |   2 +-
 pyload/plugins/hoster/FreeWayMe.py              |   2 +-
 pyload/plugins/hoster/Ftp.py                    |   2 +-
 pyload/plugins/hoster/GamefrontCom.py           |   2 +-
 pyload/plugins/hoster/LinksnappyCom.py          |   2 +-
 pyload/plugins/hoster/MegaCoNz.py               |   2 +-
 pyload/plugins/hoster/MegaDebridEu.py           |   2 +-
 pyload/plugins/hoster/MyfastfileCom.py          |   2 +-
 pyload/plugins/hoster/MyvideoDe.py              |   2 +-
 pyload/plugins/hoster/NetloadIn.py              |   2 +-
 pyload/plugins/hoster/OboomCom.py               |   2 +-
 pyload/plugins/hoster/OverLoadMe.py             |   2 +-
 pyload/plugins/hoster/PornhostCom.py            |   2 +-
 pyload/plugins/hoster/PornhubCom.py             |   2 +-
 pyload/plugins/hoster/PremiumTo.py              |   2 +-
 pyload/plugins/hoster/PremiumizeMe.py           |   2 +-
 pyload/plugins/hoster/RPNetBiz.py               |   2 +-
 pyload/plugins/hoster/RealdebridCom.py          |   2 +-
 pyload/plugins/hoster/RedtubeCom.py             |   2 +-
 pyload/plugins/hoster/RehostTo.py               |   2 +-
 pyload/plugins/hoster/ShareplaceCom.py          |   2 +-
 pyload/plugins/hoster/SimplyPremiumCom.py       |   2 +-
 pyload/plugins/hoster/SimplydebridCom.py        |   2 +-
 pyload/plugins/hoster/SoundcloudCom.py          |   2 +-
 pyload/plugins/hoster/StreamCz.py               |   2 +-
 pyload/plugins/hoster/UnrestrictLi.py           |   2 +-
 pyload/plugins/hoster/UploadedTo.py             |   2 +-
 pyload/plugins/hoster/VeehdCom.py               |   2 +-
 pyload/plugins/hoster/XHamsterCom.py            |   2 +-
 pyload/plugins/hoster/XVideosCom.py             |   2 +-
 pyload/plugins/hoster/Xdcc.py                   |   2 +-
 pyload/plugins/hoster/YoupornCom.py             |   2 +-
 pyload/plugins/hoster/YourfilesTo.py            |   2 +-
 pyload/plugins/hoster/YoutubeCom.py             |   2 +-
 pyload/plugins/hoster/ZDF.py                    |   2 +-
 pyload/plugins/hoster/ZeveraCom.py              |   2 +-
 pyload/plugins/internal/Account.py              | 305 -----------------------
 pyload/plugins/internal/Addon.py                | 169 -------------
 pyload/plugins/internal/BasePlugin.py           |   4 +-
 pyload/plugins/internal/Captcha.py              |  51 ----
 pyload/plugins/internal/Container.py            |  66 -----
 pyload/plugins/internal/Crypter.py              | 107 --------
 pyload/plugins/internal/DeadCrypter.py          |   2 +-
 pyload/plugins/internal/DeadHoster.py           |   2 +-
 pyload/plugins/internal/Hoster.py               |  21 --
 pyload/plugins/internal/MultiHoster.py          |   2 +-
 pyload/plugins/internal/OCR.py                  | 315 ------------------------
 pyload/plugins/internal/SimpleCrypter.py        |   2 +-
 pyload/plugins/internal/SimpleHoster.py         |   2 +-
 pyload/plugins/internal/UpdateManager.py        |   2 +-
 pyload/plugins/internal/XFSAccount.py           |   2 +-
 pyload/plugins/ocr/GigasizeCom.py               |   2 +-
 pyload/plugins/ocr/LinksaveIn.py                |   2 +-
 pyload/plugins/ocr/NetloadIn.py                 |   2 +-
 pyload/plugins/ocr/ShareonlineBiz.py            |   2 +-
 184 files changed, 1214 insertions(+), 1214 deletions(-)
 create mode 100644 pyload/plugins/Account.py
 create mode 100644 pyload/plugins/Addon.py
 create mode 100644 pyload/plugins/Captcha.py
 create mode 100644 pyload/plugins/Container.py
 create mode 100644 pyload/plugins/Crypter.py
 create mode 100644 pyload/plugins/Hoster.py
 create mode 100644 pyload/plugins/OCR.py
 delete mode 100644 pyload/plugins/internal/Account.py
 delete mode 100644 pyload/plugins/internal/Addon.py
 delete mode 100644 pyload/plugins/internal/Captcha.py
 delete mode 100644 pyload/plugins/internal/Container.py
 delete mode 100644 pyload/plugins/internal/Crypter.py
 delete mode 100644 pyload/plugins/internal/Hoster.py
 delete mode 100644 pyload/plugins/internal/OCR.py

(limited to 'pyload/plugins')

diff --git a/pyload/plugins/Account.py b/pyload/plugins/Account.py
new file mode 100644
index 000000000..b5125d61c
--- /dev/null
+++ b/pyload/plugins/Account.py
@@ -0,0 +1,305 @@
+# -*- coding: utf-8 -*-
+
+from random import choice
+from time import time
+from traceback import print_exc
+from threading import RLock
+
+from pyload.plugins.Plugin import Base
+from pyload.utils import compare_time, parseFileSize, lock
+
+
+class WrongPassword(Exception):
+    pass
+
+
+class Account(Base):
+    """
+    Base class for every Account plugin.
+    Just overwrite `login` and cookies will be stored and account becomes accessible in\
+    associated hoster plugin. Plugin should also provide `loadAccountInfo`
+    """
+    __name__    = "Account"
+    __type__    = "account"
+    __version__ = "0.03"
+
+    __description__ = """Base account plugin"""
+    __license__     = "GPLv3"
+    __authors__     = [("mkaay", "mkaay@mkaay.de")]
+
+
+    #: after that time (in minutes) pyload will relogin the account
+    login_timeout  = 10 * 60
+    #: after that time (in minutes) account data will be reloaded
+    info_threshold = 10 * 60
+
+
+    def __init__(self, manager, accounts):
+        Base.__init__(self, manager.core)
+
+        self.manager = manager
+        self.accounts = {}
+        self.infos = {}  #: cache for account information
+        self.lock = RLock()
+        self.timestamps = {}
+
+        self.init()
+
+        self.setAccounts(accounts)
+
+
+    def init(self):
+        pass
+
+
+    def login(self, user, data, req):
+        """login into account, the cookies will be saved so user can be recognized
+
+        :param user: loginname
+        :param data: data dictionary
+        :param req: `Request` instance
+        """
+        pass
+
+
+    @lock
+    def _login(self, user, data):
+        # set timestamp for login
+        self.timestamps[user] = time()
+
+        req = self.getAccountRequest(user)
+        try:
+            self.login(user, data, req)
+        except WrongPassword:
+            self.logWarning(
+                _("Could not login with account %(user)s | %(msg)s") % {"user": user,
+                                                                        "msg": _("Wrong Password")})
+            success = data['valid'] = False
+        except Exception, e:
+            self.logWarning(
+                _("Could not login with account %(user)s | %(msg)s") % {"user": user,
+                                                                        "msg": e})
+            success = data['valid'] = False
+            if self.core.debug:
+                print_exc()
+        else:
+            success = True
+        finally:
+            if req:
+                req.close()
+            return success
+
+
+    def relogin(self, user):
+        req = self.getAccountRequest(user)
+        if req:
+            req.cj.clear()
+            req.close()
+        if user in self.infos:
+            del self.infos[user] #delete old information
+
+        return self._login(user, self.accounts[user])
+
+
+    def setAccounts(self, accounts):
+        self.accounts = accounts
+        for user, data in self.accounts.iteritems():
+            self._login(user, data)
+            self.infos[user] = {}
+
+
+    def updateAccounts(self, user, password=None, options={}):
+        """ updates account and return true if anything changed """
+
+        if user in self.accounts:
+            self.accounts[user]['valid'] = True #do not remove or accounts will not login
+            if password:
+                self.accounts[user]['password'] = password
+                self.relogin(user)
+                return True
+            if options:
+                before = self.accounts[user]['options']
+                self.accounts[user]['options'].update(options)
+                return self.accounts[user]['options'] != before
+        else:
+            self.accounts[user] = {"password": password, "options": options, "valid": True}
+            self._login(user, self.accounts[user])
+            return True
+
+
+    def removeAccount(self, user):
+        if user in self.accounts:
+            del self.accounts[user]
+        if user in self.infos:
+            del self.infos[user]
+        if user in self.timestamps:
+            del self.timestamps[user]
+
+
+    @lock
+    def getAccountInfo(self, name, force=False):
+        """retrieve account infos for an user, do **not** overwrite this method!\\
+        just use it to retrieve infos in hoster plugins. see `loadAccountInfo`
+
+        :param name: username
+        :param force: reloads cached account information
+        :return: dictionary with information
+        """
+        data = Account.loadAccountInfo(self, name)
+
+        if force or name not in self.infos:
+            self.logDebug("Get Account Info for %s" % name)
+            req = self.getAccountRequest(name)
+
+            try:
+                infos = self.loadAccountInfo(name, req)
+                if not type(infos) == dict:
+                    raise Exception("Wrong return format")
+            except Exception, e:
+                infos = {"error": str(e)}
+                print_exc()
+
+            if req:
+                req.close()
+
+            self.logDebug("Account Info: %s" % infos)
+
+            infos['timestamp'] = time()
+            self.infos[name] = infos
+        elif "timestamp" in self.infos[name] and self.infos[name][
+                                                       "timestamp"] + self.info_threshold * 60 < time():
+            self.logDebug("Reached timeout for account data")
+            self.scheduleRefresh(name)
+
+        data.update(self.infos[name])
+        return data
+
+
+    def isPremium(self, user):
+        info = self.getAccountInfo(user)
+        return info['premium']
+
+
+    def loadAccountInfo(self, name, req=None):
+        """this should be overwritten in account plugin,\
+        and retrieving account information for user
+
+        :param name:
+        :param req: `Request` instance
+        :return:
+        """
+        return {"validuntil": None,  #: -1 for unlimited
+                "login": name,
+                # "password": self.accounts[name]['password'],  #: commented due security reason
+                "options": self.accounts[name]['options'],
+                "valid": self.accounts[name]['valid'],
+                "trafficleft": None,  #: in kb, -1 for unlimited
+                "maxtraffic": None,
+                "premium": None,
+                "timestamp": 0,  #: time this info was retrieved
+                "type": self.__name__}
+
+
+    def getAllAccounts(self, force=False):
+        return [self.getAccountInfo(user, force) for user, data in self.accounts.iteritems()]
+
+
+    def getAccountRequest(self, user=None):
+        if not user:
+            user, data = self.selectAccount()
+        if not user:
+            return None
+
+        req = self.core.requestFactory.getRequest(self.__name__, user)
+        return req
+
+
+    def getAccountCookies(self, user=None):
+        if not user:
+            user, data = self.selectAccount()
+        if not user:
+            return None
+
+        cj = self.core.requestFactory.getCookieJar(self.__name__, user)
+        return cj
+
+
+    def getAccountData(self, user):
+        return self.accounts[user]
+
+
+    def selectAccount(self):
+        """ returns an valid account name and data"""
+        usable = []
+        for user, data in self.accounts.iteritems():
+            if not data['valid']: continue
+
+            if "time" in data['options'] and data['options']['time']:
+                time_data = ""
+                try:
+                    time_data = data['options']['time'][0]
+                    start, end = time_data.split("-")
+                    if not compare_time(start.split(":"), end.split(":")):
+                        continue
+                except Exception:
+                    self.logWarning(_("Your Time %s has wrong format, use: 1:22-3:44") % time_data)
+
+            if user in self.infos:
+                if "validuntil" in self.infos[user]:
+                    if self.infos[user]['validuntil'] > 0 and time() > self.infos[user]['validuntil']:
+                        continue
+                if "trafficleft" in self.infos[user]:
+                    if self.infos[user]['trafficleft'] == 0:
+                        continue
+
+            usable.append((user, data))
+
+        if not usable: return None, None
+        return choice(usable)
+
+
+    def canUse(self):
+        return False if self.selectAccount() == (None, None) else True
+
+
+    def parseTraffic(self, string): #returns kbyte
+        return parseFileSize(string)
+
+
+    def wrongPassword(self):
+        raise WrongPassword
+
+
+    def empty(self, user):
+        if user in self.infos:
+            self.logWarning(_("Account %s has not enough traffic, checking again in 30min") % user)
+
+            self.infos[user].update({"trafficleft": 0})
+            self.scheduleRefresh(user, 30 * 60)
+
+
+    def expired(self, user):
+        if user in self.infos:
+            self.logWarning(_("Account %s is expired, checking again in 1h") % user)
+
+            self.infos[user].update({"validuntil": time() - 1})
+            self.scheduleRefresh(user, 60 * 60)
+
+
+    def scheduleRefresh(self, user, time=0, force=True):
+        """ add task to refresh account info to sheduler """
+        self.logDebug("Scheduled Account refresh for %s in %s seconds." % (user, time))
+        self.core.scheduler.addJob(time, self.getAccountInfo, [user, force])
+
+
+    @lock
+    def checkLogin(self, user):
+        """ checks if user is still logged in """
+        if user in self.timestamps:
+            if self.login_timeout > 0 and self.timestamps[user] + self.login_timeout * 60 < time():
+                self.logDebug("Reached login timeout for %s" % user)
+                return self.relogin(user)
+            else:
+                return True
+        else:
+            return False
diff --git a/pyload/plugins/Addon.py b/pyload/plugins/Addon.py
new file mode 100644
index 000000000..ed5a72af8
--- /dev/null
+++ b/pyload/plugins/Addon.py
@@ -0,0 +1,169 @@
+# -*- coding: utf-8 -*-
+
+from traceback import print_exc
+
+from pyload.plugins.Plugin import Base
+
+
+class Expose(object):
+    """ used for decoration to declare rpc services """
+
+    def __new__(cls, f, *args, **kwargs):
+        addonManager.addRPC(f.__module__, f.func_name, f.func_doc)
+        return f
+
+
+def threaded(f):
+
+    def run(*args,**kwargs):
+        addonManager.startThread(f, *args, **kwargs)
+    return run
+
+
+class Addon(Base):
+    """
+    Base class for addon plugins.
+    """
+    __name__    = "Addon"
+    __type__    = "addon"
+    __version__ = "0.03"
+
+    __config__ = []  #: [("name", "type", "desc", "default")]
+
+    __description__ = """Base addon/hook plugin"""
+    __license__     = "GPLv3"
+    __authors__     = [("mkaay", "mkaay@mkaay.de"),
+                       ("RaNaN", "RaNaN@pyload.org")]
+
+
+    #: automatically register event listeners for functions, attribute will be deleted dont use it yourself
+    event_map = {}
+
+    # Alternative to event_map
+    #: List of events the plugin can handle, name the functions exactly like eventname.
+    event_list = []  #@NOTE: dont make duplicate entries in event_map
+
+
+    def __init__(self, core, manager):
+        Base.__init__(self, core)
+
+        #: Provide information in dict here, usable by API `getInfo`
+        self.info = {}
+
+        #: Callback of periodical job task, used by AddonManager
+        self.cb = None
+        self.interval = 60
+
+        #: `AddonManager`
+        self.manager = manager
+
+        #register events
+        if self.event_map:
+            for event, funcs in self.event_map.iteritems():
+                if type(funcs) in (list, tuple):
+                    for f in funcs:
+                        self.manager.addEvent(event, getattr(self,f))
+                else:
+                    self.manager.addEvent(event, getattr(self,funcs))
+
+            #delete for various reasons
+            self.event_map = None
+
+        if self.event_list:
+            for f in self.event_list:
+                self.manager.addEvent(f, getattr(self,f))
+
+            self.event_list = None
+
+        self.setup()
+
+        # self.initPeriodical()
+
+
+    def initPeriodical(self, delay=0, threaded=False):
+        self.cb = self.core.scheduler.addJob(delay, self._periodical, args=[threaded], threaded=threaded)
+
+
+    def _periodical(self, threaded):
+        if self.interval < 0:
+            self.cb = None
+            return
+
+        try:
+            self.periodical()
+
+        except Exception, e:
+            self.logError(_("Error executing addon: %s") % e)
+            if self.core.debug:
+                print_exc()
+
+        self.cb = self.core.scheduler.addJob(self.interval, self._periodical, threaded=threaded)
+
+
+    def __repr__(self):
+        return "<Addon %s>" % self.__name__
+
+
+    def setup(self):
+        """ more init stuff if needed """
+        pass
+
+
+    def unload(self):
+        """ called when addon was deactivated """
+        pass
+
+
+    def isActivated(self):
+        """ checks if addon is activated"""
+        return self.core.config.getPlugin(self.__name__, "activated")
+
+
+    #event methods - overwrite these if needed
+    def coreReady(self):
+        pass
+
+
+    def coreExiting(self):
+        pass
+
+
+    def downloadPreparing(self, pyfile):
+        pass
+
+
+    def downloadFinished(self, pyfile):
+        pass
+
+
+    def downloadFailed(self, pyfile):
+        pass
+
+
+    def packageFinished(self, pypack):
+        pass
+
+
+    def beforeReconnecting(self, ip):
+        pass
+
+
+    def afterReconnecting(self, ip):
+        pass
+
+
+    def periodical(self):
+        pass
+
+
+    def newCaptchaTask(self, task):
+        """ new captcha task for the plugin, it MUST set the handler and timeout or will be ignored """
+        pass
+
+
+    def captchaCorrect(self, task):
+        pass
+
+
+    def captchaInvalid(self, task):
+        pass
diff --git a/pyload/plugins/Captcha.py b/pyload/plugins/Captcha.py
new file mode 100644
index 000000000..7197c390e
--- /dev/null
+++ b/pyload/plugins/Captcha.py
@@ -0,0 +1,51 @@
+# -*- coding: utf-8 -*-
+
+import re
+
+from pyload.plugins.Plugin import Plugin
+
+
+class Captcha(Plugin):
+    __name__    = "Captcha"
+    __type__    = "captcha"
+    __version__ = "0.14"
+
+    __description__ = """Base captcha service plugin"""
+    __license__     = "GPLv3"
+    __authors__     = [("pyLoad Team", "admin@pyload.org")]
+
+
+    KEY_PATTERN = None
+
+    key = None  #: last key detected
+
+
+    def __init__(self, plugin):
+        self.plugin = plugin
+
+
+    def detect_key(self, html=None):
+        if not html:
+            if hasattr(self.plugin, "html") and self.plugin.html:
+                html = self.plugin.html
+            else:
+                errmsg = _("%s html not found") % self.__name__
+                self.plugin.error(errmsg)
+                raise TypeError(errmsg)
+
+        m = re.search(self.KEY_PATTERN, html)
+        if m:
+            self.key = m.group("KEY")
+            self.plugin.logDebug("%s key: %s" % (self.__name__, self.key))
+            return self.key
+        else:
+            self.plugin.logDebug("%s key not found" % self.__name__)
+            return None
+
+
+    def challenge(self, key=None):
+        raise NotImplementedError
+
+
+    def result(self, server, challenge):
+        raise NotImplementedError
diff --git a/pyload/plugins/Container.py b/pyload/plugins/Container.py
new file mode 100644
index 000000000..3320217ae
--- /dev/null
+++ b/pyload/plugins/Container.py
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import with_statement
+
+import re
+
+from os import remove
+from os.path import basename, exists
+
+from pyload.plugins.internal.Crypter import Crypter
+from pyload.utils import safe_join
+
+
+class Container(Crypter):
+    __name__    = "Container"
+    __type__    = "container"
+    __version__ = "0.01"
+
+    __pattern__ = r'^unmatchable$'
+    __config__  = []  #: [("name", "type", "desc", "default")]
+
+    __description__ = """Base container decrypter plugin"""
+    __license__     = "GPLv3"
+    __authors__     = [("mkaay", "mkaay@mkaay.de")]
+
+
+    def preprocessing(self, thread):
+        """prepare"""
+
+        self.setup()
+        self.thread = thread
+
+        self.loadToDisk()
+
+        self.decrypt(self.pyfile)
+        self.deleteTmp()
+
+        self.createPackages()
+
+
+    def loadToDisk(self):
+        """loads container to disk if its stored remotely and overwrite url,
+        or check existent on several places at disk"""
+
+        if self.pyfile.url.startswith("http"):
+            self.pyfile.name = re.findall("([^\/=]+)", self.pyfile.url)[-1]
+            content = self.load(self.pyfile.url)
+            self.pyfile.url = safe_join(self.core.config['general']['download_folder'], self.pyfile.name)
+            try:
+                with open(self.pyfile.url, "wb") as f:
+                    f.write(content)
+            except IOError, e:
+                self.fail(str(e))
+
+        else:
+            self.pyfile.name = basename(self.pyfile.url)
+            if not exists(self.pyfile.url):
+                if exists(safe_join(pypath, self.pyfile.url)):
+                    self.pyfile.url = safe_join(pypath, self.pyfile.url)
+                else:
+                    self.fail(_("File not exists"))
+
+
+    def deleteTmp(self):
+        if self.pyfile.name.startswith("tmp_"):
+            remove(self.pyfile.url)
diff --git a/pyload/plugins/Crypter.py b/pyload/plugins/Crypter.py
new file mode 100644
index 000000000..8580def61
--- /dev/null
+++ b/pyload/plugins/Crypter.py
@@ -0,0 +1,107 @@
+# -*- coding: utf-8 -*-
+
+from urlparse import urlparse
+
+from pyload.plugins.Plugin import Plugin
+from pyload.utils import decode, html_unescape, safe_filename
+
+
+class Crypter(Plugin):
+    __name__    = "Crypter"
+    __type__    = "crypter"
+    __version__ = "0.05"
+
+    __pattern__ = r'^unmatchable$'
+    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True),  #: Overrides core.config['general']['folder_per_package']
+                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)]
+
+    __description__ = """Base decrypter plugin"""
+    __license__     = "GPLv3"
+    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")]
+
+
+    html = None  #: last html loaded
+
+
+    def __init__(self, pyfile):
+        #: Put all packages here. It's a list of tuples like: ( name, [list of links], folder )
+        self.packages = []
+
+        #: List of urls, pyLoad will generate packagenames
+        self.urls = []
+
+        Plugin.__init__(self, pyfile)
+
+
+    def process(self, pyfile):
+        """ main method """
+
+        self.decrypt(pyfile)
+
+        if self.urls:
+            self.generatePackages()
+
+        elif not self.packages:
+            self.error(_("No link extracted"), "decrypt")
+
+        self.createPackages()
+
+
+    def decrypt(self, pyfile):
+        raise NotImplementedError
+
+
+    def generatePackages(self):
+        """ generate new packages from self.urls """
+
+        packages = map(lambda name, links: (name, links, None), self.core.api.generatePackages(self.urls).iteritems())
+        self.packages.extend(packages)
+
+
+    def createPackages(self):
+        """ create new packages from self.packages """
+
+        package_folder = self.pyfile.package().folder
+        package_password = self.pyfile.package().password
+        package_queue = self.pyfile.package().queue
+
+        folder_per_package = self.core.config['general']['folder_per_package']
+        try:
+            use_subfolder = self.getConfig('use_subfolder')
+        except Exception:
+            use_subfolder = folder_per_package
+        try:
+            subfolder_per_package = self.getConfig('subfolder_per_package')
+        except Exception:
+            subfolder_per_package = True
+
+        for pack in self.packages:
+            name, links, folder = pack
+
+            self.logDebug("Parsed package: %s" % name,
+                          "%d links" % len(links),
+                          "Saved to folder: %s" % folder if folder else "Saved to download folder")
+
+            links = map(decode, links)
+
+            pid = self.core.api.addPackage(name, links, package_queue)
+
+            if package_password:
+                self.core.api.setPackageData(pid, {"password": package_password})
+
+            setFolder = lambda x: self.core.api.setPackageData(pid, {"folder": x or ""})  #: Workaround to do not break API addPackage method
+
+            if use_subfolder:
+                if not subfolder_per_package:
+                    setFolder(package_folder)
+                    self.logDebug("Set package %(name)s folder to: %(folder)s" % {"name": name, "folder": folder})
+
+                elif not folder_per_package or name != folder:
+                    if not folder:
+                        folder = urlparse(html_unescape(name)).path.split("/")[-1]
+
+                    setFolder(folder)
+                    self.logDebug("Set package %(name)s folder to: %(folder)s" % {"name": name, "folder": folder})
+
+            elif folder_per_package:
+                setFolder(None)
diff --git a/pyload/plugins/Hoster.py b/pyload/plugins/Hoster.py
new file mode 100644
index 000000000..ea225262e
--- /dev/null
+++ b/pyload/plugins/Hoster.py
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+
+from pyload.plugins.Plugin import Plugin
+
+
+def getInfo(self):
+        #result = [ .. (name, size, status, url) .. ]
+        return
+
+
+class Hoster(Plugin):
+    __name__    = "Hoster"
+    __type__    = "hoster"
+    __version__ = "0.02"
+
+    __pattern__ = r'^unmatchable$'
+    __config__  = []  #: [("name", "type", "desc", "default")]
+
+    __description__ = """Base hoster plugin"""
+    __license__     = "GPLv3"
+    __authors__     = [("mkaay", "mkaay@mkaay.de")]
diff --git a/pyload/plugins/OCR.py b/pyload/plugins/OCR.py
new file mode 100644
index 000000000..8e60737b6
--- /dev/null
+++ b/pyload/plugins/OCR.py
@@ -0,0 +1,315 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import with_statement
+
+try:
+    from PIL import Image, GifImagePlugin, JpegImagePlugin, PngImagePlugin, TiffImagePlugin
+except ImportError:
+    import Image, GifImagePlugin, JpegImagePlugin, PngImagePlugin, TiffImagePlugin
+
+import logging
+import subprocess
+
+from os.path import abspath, join
+
+
+class OCR(object):
+    __name__    = "OCR"
+    __type__    = "ocr"
+    __version__ = "0.10"
+
+    __description__ = """Base OCR plugin"""
+    __license__     = "GPLv3"
+    __authors__     = [("pyLoad Team", "admin@pyload.org")]
+
+
+    def __init__(self):
+        self.logger = logging.getLogger("log")
+
+
+    def load_image(self, image):
+        self.image = Image.open(image)
+        self.pixels = self.image.load()
+        self.result_captcha = ''
+
+
+    def unload(self):
+        """delete all tmp images"""
+        pass
+
+
+    def threshold(self, value):
+        self.image = self.image.point(lambda a: a * value + 10)
+
+
+    def run(self, command):
+        """Run a command"""
+
+        popen = subprocess.Popen(command, bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        popen.wait()
+        output = popen.stdout.read() + " | " + popen.stderr.read()
+        popen.stdout.close()
+        popen.stderr.close()
+        self.logger.debug("Tesseract ReturnCode %s Output: %s" % (popen.returncode, output))
+
+
+    def run_tesser(self, subset=False, digits=True, lowercase=True, uppercase=True):
+        #tmpTif = tempfile.NamedTemporaryFile(suffix=".tif")
+        try:
+            tmpTif = open(join("tmp", "tmpTif_%s.tif" % self.__name__), "wb")
+            tmpTif.close()
+
+            #tmpTxt = tempfile.NamedTemporaryFile(suffix=".txt")
+            tmpTxt = open(join("tmp", "tmpTxt_%s.txt" % self.__name__), "wb")
+            tmpTxt.close()
+
+        except IOError, e:
+            self.logError(e)
+            return
+
+        self.logger.debug("save tiff")
+        self.image.save(tmpTif.name, 'TIFF')
+
+        if os.name == "nt":
+            tessparams = [join(pypath, "tesseract", "tesseract.exe")]
+        else:
+            tessparams = ['tesseract']
+
+        tessparams.extend([abspath(tmpTif.name), abspath(tmpTxt.name).replace(".txt", "")] )
+
+        if subset and (digits or lowercase or uppercase):
+            #tmpSub = tempfile.NamedTemporaryFile(suffix=".subset")
+            with open(join("tmp", "tmpSub_%s.subset" % self.__name__), "wb") as tmpSub:
+                tmpSub.write("tessedit_char_whitelist ")
+
+                if digits:
+                    tmpSub.write("0123456789")
+                if lowercase:
+                    tmpSub.write("abcdefghijklmnopqrstuvwxyz")
+                if uppercase:
+                    tmpSub.write("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
+
+                tmpSub.write("\n")
+                tessparams.append("nobatch")
+                tessparams.append(abspath(tmpSub.name))
+
+        self.logger.debug("run tesseract")
+        self.run(tessparams)
+        self.logger.debug("read txt")
+
+        try:
+            with open(tmpTxt.name, 'r') as f:
+                self.result_captcha = f.read().replace("\n", "")
+        except Exception:
+            self.result_captcha = ""
+
+        self.logger.debug(self.result_captcha)
+        try:
+            os.remove(tmpTif.name)
+            os.remove(tmpTxt.name)
+            if subset and (digits or lowercase or uppercase):
+                os.remove(tmpSub.name)
+        except Exception:
+            pass
+
+
+    def get_captcha(self, name):
+        raise NotImplementedError
+
+
+    def to_greyscale(self):
+        if self.image.mode != 'L':
+            self.image = self.image.convert('L')
+
+        self.pixels = self.image.load()
+
+
+    def eval_black_white(self, limit):
+        self.pixels = self.image.load()
+        w, h = self.image.size
+        for x in xrange(w):
+            for y in xrange(h):
+                if self.pixels[x, y] > limit:
+                    self.pixels[x, y] = 255
+                else:
+                    self.pixels[x, y] = 0
+
+
+    def clean(self, allowed):
+        pixels = self.pixels
+
+        w, h = self.image.size
+
+        for x in xrange(w):
+            for y in xrange(h):
+                if pixels[x, y] == 255:
+                    continue
+                # No point in processing white pixels since we only want to remove black pixel
+                count = 0
+
+                try:
+                    if pixels[x - 1, y - 1] != 255:
+                        count += 1
+                    if pixels[x - 1, y] != 255:
+                        count += 1
+                    if pixels[x - 1, y + 1] != 255:
+                        count += 1
+                    if pixels[x, y + 1] != 255:
+                        count += 1
+                    if pixels[x + 1, y + 1] != 255:
+                        count += 1
+                    if pixels[x + 1, y] != 255:
+                        count += 1
+                    if pixels[x + 1, y - 1] != 255:
+                        count += 1
+                    if pixels[x, y - 1] != 255:
+                        count += 1
+                except Exception:
+                    pass
+
+                # not enough neighbors are dark pixels so mark this pixel
+                # to be changed to white
+                if count < allowed:
+                    pixels[x, y] = 1
+
+        # second pass: this time set all 1's to 255 (white)
+        for x in xrange(w):
+            for y in xrange(h):
+                if pixels[x, y] == 1:
+                    pixels[x, y] = 255
+
+        self.pixels = pixels
+
+
+    def derotate_by_average(self):
+        """rotate by checking each angle and guess most suitable"""
+
+        w, h = self.image.size
+        pixels = self.pixels
+
+        for x in xrange(w):
+            for y in xrange(h):
+                if pixels[x, y] == 0:
+                    pixels[x, y] = 155
+
+        highest = {}
+        counts = {}
+
+        for angle in xrange(-45, 45):
+
+            tmpimage = self.image.rotate(angle)
+
+            pixels = tmpimage.load()
+
+            w, h = self.image.size
+
+            for x in xrange(w):
+                for y in xrange(h):
+                    if pixels[x, y] == 0:
+                        pixels[x, y] = 255
+
+            count = {}
+
+            for x in xrange(w):
+                count[x] = 0
+                for y in xrange(h):
+                    if pixels[x, y] == 155:
+                        count[x] += 1
+
+            sum = 0
+            cnt = 0
+
+            for x in count.values():
+                if x != 0:
+                    sum += x
+                    cnt += 1
+
+            avg = sum / cnt
+            counts[angle] = cnt
+            highest[angle] = 0
+            for x in count.values():
+                if x > highest[angle]:
+                    highest[angle] = x
+
+            highest[angle] = highest[angle] - avg
+
+        hkey = 0
+        hvalue = 0
+
+        for key, value in highest.iteritems():
+            if value > hvalue:
+                hkey = key
+                hvalue = value
+
+        self.image = self.image.rotate(hkey)
+        pixels = self.image.load()
+
+        for x in xrange(w):
+            for y in xrange(h):
+                if pixels[x, y] == 0:
+                    pixels[x, y] = 255
+
+                if pixels[x, y] == 155:
+                    pixels[x, y] = 0
+
+        self.pixels = pixels
+
+
+    def split_captcha_letters(self):
+        captcha = self.image
+        started = False
+        letters = []
+        width, height = captcha.size
+        bottomY, topY = 0, height
+        pixels = captcha.load()
+
+        for x in xrange(width):
+            black_pixel_in_col = False
+            for y in xrange(height):
+                if pixels[x, y] != 255:
+                    if not started:
+                        started = True
+                        firstX = x
+                        lastX = x
+
+                    if y > bottomY:
+                        bottomY = y
+                    if y < topY:
+                        topY = y
+                    if x > lastX:
+                        lastX = x
+
+                    black_pixel_in_col = True
+
+            if black_pixel_in_col is False and started is True:
+                rect = (firstX, topY, lastX, bottomY)
+                new_captcha = captcha.crop(rect)
+
+                w, h = new_captcha.size
+                if w > 5 and h > 5:
+                    letters.append(new_captcha)
+
+                started = False
+                bottomY, topY = 0, height
+
+        return letters
+
+
+    def correct(self, values, var=None):
+        if var:
+            result = var
+        else:
+            result = self.result_captcha
+
+        for key, item in values.iteritems():
+
+            if key.__class__ == str:
+                result = result.replace(key, item)
+            else:
+                for expr in key:
+                    result = result.replace(expr, item)
+
+        if var:
+            return result
+        else:
+            self.result_captcha = result
diff --git a/pyload/plugins/account/AlldebridCom.py b/pyload/plugins/account/AlldebridCom.py
index a3e8ad659..701e81fe1 100644
--- a/pyload/plugins/account/AlldebridCom.py
+++ b/pyload/plugins/account/AlldebridCom.py
@@ -8,7 +8,7 @@ from urllib import urlencode
 
 from BeautifulSoup import BeautifulSoup
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class AlldebridCom(Account):
diff --git a/pyload/plugins/account/BayfilesCom.py b/pyload/plugins/account/BayfilesCom.py
index 34163d0cc..30e8e66b3 100644
--- a/pyload/plugins/account/BayfilesCom.py
+++ b/pyload/plugins/account/BayfilesCom.py
@@ -2,7 +2,7 @@
 
 from time import time
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/BitshareCom.py b/pyload/plugins/account/BitshareCom.py
index 44b2818cf..cd28ec677 100644
--- a/pyload/plugins/account/BitshareCom.py
+++ b/pyload/plugins/account/BitshareCom.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class BitshareCom(Account):
diff --git a/pyload/plugins/account/CatShareNet.py b/pyload/plugins/account/CatShareNet.py
index e172d6aee..bb0cc9771 100644
--- a/pyload/plugins/account/CatShareNet.py
+++ b/pyload/plugins/account/CatShareNet.py
@@ -4,7 +4,7 @@ import re
 
 from time import mktime, strptime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class CatShareNet(Account):
diff --git a/pyload/plugins/account/CzshareCom.py b/pyload/plugins/account/CzshareCom.py
index 786832e8d..ad9644150 100644
--- a/pyload/plugins/account/CzshareCom.py
+++ b/pyload/plugins/account/CzshareCom.py
@@ -3,7 +3,7 @@
 from time import mktime, strptime
 import re
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class CzshareCom(Account):
diff --git a/pyload/plugins/account/DebridItaliaCom.py b/pyload/plugins/account/DebridItaliaCom.py
index 41f796327..faef46c6b 100644
--- a/pyload/plugins/account/DebridItaliaCom.py
+++ b/pyload/plugins/account/DebridItaliaCom.py
@@ -4,7 +4,7 @@ import re
 
 from time import mktime, strptime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class DebridItaliaCom(Account):
diff --git a/pyload/plugins/account/DepositfilesCom.py b/pyload/plugins/account/DepositfilesCom.py
index 688fcc505..264e55c5a 100644
--- a/pyload/plugins/account/DepositfilesCom.py
+++ b/pyload/plugins/account/DepositfilesCom.py
@@ -4,7 +4,7 @@ import re
 
 from time import strptime, mktime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class DepositfilesCom(Account):
diff --git a/pyload/plugins/account/EuroshareEu.py b/pyload/plugins/account/EuroshareEu.py
index 5ec543433..ccb213997 100644
--- a/pyload/plugins/account/EuroshareEu.py
+++ b/pyload/plugins/account/EuroshareEu.py
@@ -3,7 +3,7 @@
 from time import mktime, strptime
 import re
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class EuroshareEu(Account):
diff --git a/pyload/plugins/account/FastixRu.py b/pyload/plugins/account/FastixRu.py
index 829316ce3..a2d21d5fd 100644
--- a/pyload/plugins/account/FastixRu.py
+++ b/pyload/plugins/account/FastixRu.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/FastshareCz.py b/pyload/plugins/account/FastshareCz.py
index 32c897317..1c8f6fd48 100644
--- a/pyload/plugins/account/FastshareCz.py
+++ b/pyload/plugins/account/FastshareCz.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import parseFileSize
 
 
diff --git a/pyload/plugins/account/FilecloudIo.py b/pyload/plugins/account/FilecloudIo.py
index babef59a2..83faee226 100644
--- a/pyload/plugins/account/FilecloudIo.py
+++ b/pyload/plugins/account/FilecloudIo.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/FilefactoryCom.py b/pyload/plugins/account/FilefactoryCom.py
index 0d7c1ff0e..b157dc058 100644
--- a/pyload/plugins/account/FilefactoryCom.py
+++ b/pyload/plugins/account/FilefactoryCom.py
@@ -5,7 +5,7 @@ from time import mktime, strptime
 
 from pycurl import REFERER
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class FilefactoryCom(Account):
diff --git a/pyload/plugins/account/FilejungleCom.py b/pyload/plugins/account/FilejungleCom.py
index 8abb89788..8a7f843cd 100644
--- a/pyload/plugins/account/FilejungleCom.py
+++ b/pyload/plugins/account/FilejungleCom.py
@@ -3,7 +3,7 @@
 import re
 from time import mktime, strptime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class FilejungleCom(Account):
diff --git a/pyload/plugins/account/FilerNet.py b/pyload/plugins/account/FilerNet.py
index f9b5efdd3..9c70ff56a 100644
--- a/pyload/plugins/account/FilerNet.py
+++ b/pyload/plugins/account/FilerNet.py
@@ -3,7 +3,7 @@
 import re
 import time
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class FilerNet(Account):
diff --git a/pyload/plugins/account/FilesMailRu.py b/pyload/plugins/account/FilesMailRu.py
index b42a7c559..0635e185e 100644
--- a/pyload/plugins/account/FilesMailRu.py
+++ b/pyload/plugins/account/FilesMailRu.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class FilesMailRu(Account):
diff --git a/pyload/plugins/account/FileserveCom.py b/pyload/plugins/account/FileserveCom.py
index 8c570b575..0b234513d 100644
--- a/pyload/plugins/account/FileserveCom.py
+++ b/pyload/plugins/account/FileserveCom.py
@@ -2,7 +2,7 @@
 
 from time import mktime, strptime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/FourSharedCom.py b/pyload/plugins/account/FourSharedCom.py
index 20293fa5d..338e5ca4c 100644
--- a/pyload/plugins/account/FourSharedCom.py
+++ b/pyload/plugins/account/FourSharedCom.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/FreakshareCom.py b/pyload/plugins/account/FreakshareCom.py
index 12c5277a6..165d7a5cc 100644
--- a/pyload/plugins/account/FreakshareCom.py
+++ b/pyload/plugins/account/FreakshareCom.py
@@ -4,7 +4,7 @@ import re
 
 from time import strptime, mktime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class FreakshareCom(Account):
diff --git a/pyload/plugins/account/FreeWayMe.py b/pyload/plugins/account/FreeWayMe.py
index db879c052..4d1e68348 100644
--- a/pyload/plugins/account/FreeWayMe.py
+++ b/pyload/plugins/account/FreeWayMe.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/FshareVn.py b/pyload/plugins/account/FshareVn.py
index ee8aacaf9..547c2b500 100644
--- a/pyload/plugins/account/FshareVn.py
+++ b/pyload/plugins/account/FshareVn.py
@@ -4,7 +4,7 @@ from time import mktime, strptime
 from pycurl import REFERER
 import re
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class FshareVn(Account):
diff --git a/pyload/plugins/account/Ftp.py b/pyload/plugins/account/Ftp.py
index d439512ce..bdad58d2b 100644
--- a/pyload/plugins/account/Ftp.py
+++ b/pyload/plugins/account/Ftp.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class Ftp(Account):
diff --git a/pyload/plugins/account/HellshareCz.py b/pyload/plugins/account/HellshareCz.py
index 1b93cf77d..ede621b1d 100644
--- a/pyload/plugins/account/HellshareCz.py
+++ b/pyload/plugins/account/HellshareCz.py
@@ -3,7 +3,7 @@
 import re
 import time
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class HellshareCz(Account):
diff --git a/pyload/plugins/account/Http.py b/pyload/plugins/account/Http.py
index 8c0aeb2e4..97e8e9e7b 100644
--- a/pyload/plugins/account/Http.py
+++ b/pyload/plugins/account/Http.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class Http(Account):
diff --git a/pyload/plugins/account/Keep2shareCc.py b/pyload/plugins/account/Keep2shareCc.py
index 172cedfc2..9636c456f 100644
--- a/pyload/plugins/account/Keep2shareCc.py
+++ b/pyload/plugins/account/Keep2shareCc.py
@@ -4,7 +4,7 @@ import re
 
 from time import gmtime, mktime, strptime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class Keep2shareCc(Account):
diff --git a/pyload/plugins/account/LetitbitNet.py b/pyload/plugins/account/LetitbitNet.py
index 5bf6de00c..75b0a8264 100644
--- a/pyload/plugins/account/LetitbitNet.py
+++ b/pyload/plugins/account/LetitbitNet.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 # from pyload.utils import json_loads, json_dumps
 
 
diff --git a/pyload/plugins/account/LinksnappyCom.py b/pyload/plugins/account/LinksnappyCom.py
index 028465522..f1eba5646 100644
--- a/pyload/plugins/account/LinksnappyCom.py
+++ b/pyload/plugins/account/LinksnappyCom.py
@@ -2,7 +2,7 @@
 
 from hashlib import md5
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/MegaDebridEu.py b/pyload/plugins/account/MegaDebridEu.py
index 390cc232e..555481c74 100644
--- a/pyload/plugins/account/MegaDebridEu.py
+++ b/pyload/plugins/account/MegaDebridEu.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/MegaRapidCz.py b/pyload/plugins/account/MegaRapidCz.py
index a75e313ff..3fa687a6e 100644
--- a/pyload/plugins/account/MegaRapidCz.py
+++ b/pyload/plugins/account/MegaRapidCz.py
@@ -3,7 +3,7 @@
 import re
 
 from time import mktime, strptime
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class MegaRapidCz(Account):
diff --git a/pyload/plugins/account/MegasharesCom.py b/pyload/plugins/account/MegasharesCom.py
index b2f439b45..ca90e0354 100644
--- a/pyload/plugins/account/MegasharesCom.py
+++ b/pyload/plugins/account/MegasharesCom.py
@@ -3,7 +3,7 @@
 import re
 from time import mktime, strptime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class MegasharesCom(Account):
diff --git a/pyload/plugins/account/MultishareCz.py b/pyload/plugins/account/MultishareCz.py
index 9dc5b1ff0..69deef8f4 100644
--- a/pyload/plugins/account/MultishareCz.py
+++ b/pyload/plugins/account/MultishareCz.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class MultishareCz(Account):
diff --git a/pyload/plugins/account/MyfastfileCom.py b/pyload/plugins/account/MyfastfileCom.py
index acc09ad8b..a99522fa7 100644
--- a/pyload/plugins/account/MyfastfileCom.py
+++ b/pyload/plugins/account/MyfastfileCom.py
@@ -2,7 +2,7 @@
 
 from time import time
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/NetloadIn.py b/pyload/plugins/account/NetloadIn.py
index 341803670..3b5a65f92 100644
--- a/pyload/plugins/account/NetloadIn.py
+++ b/pyload/plugins/account/NetloadIn.py
@@ -3,7 +3,7 @@
 import re
 from time import time
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class NetloadIn(Account):
diff --git a/pyload/plugins/account/NowVideoAt.py b/pyload/plugins/account/NowVideoAt.py
index 7af8bc4bc..b18c28b62 100644
--- a/pyload/plugins/account/NowVideoAt.py
+++ b/pyload/plugins/account/NowVideoAt.py
@@ -4,7 +4,7 @@ import re
 
 from time import gmtime, mktime, strptime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class NowVideoAt(Account):
diff --git a/pyload/plugins/account/OboomCom.py b/pyload/plugins/account/OboomCom.py
index 5ee35f973..265424602 100644
--- a/pyload/plugins/account/OboomCom.py
+++ b/pyload/plugins/account/OboomCom.py
@@ -5,7 +5,7 @@ import time
 from beaker.crypto.pbkdf2 import PBKDF2
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class OboomCom(Account):
diff --git a/pyload/plugins/account/OneFichierCom.py b/pyload/plugins/account/OneFichierCom.py
index 7f1140e67..55583f3ad 100644
--- a/pyload/plugins/account/OneFichierCom.py
+++ b/pyload/plugins/account/OneFichierCom.py
@@ -6,7 +6,7 @@ from time import strptime, mktime
 
 from pycurl import REFERER
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class OneFichierCom(Account):
diff --git a/pyload/plugins/account/OverLoadMe.py b/pyload/plugins/account/OverLoadMe.py
index cda4bc82f..201598b26 100644
--- a/pyload/plugins/account/OverLoadMe.py
+++ b/pyload/plugins/account/OverLoadMe.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/PremiumTo.py b/pyload/plugins/account/PremiumTo.py
index e94eed6fb..96fdf859b 100644
--- a/pyload/plugins/account/PremiumTo.py
+++ b/pyload/plugins/account/PremiumTo.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class PremiumTo(Account):
diff --git a/pyload/plugins/account/PremiumizeMe.py b/pyload/plugins/account/PremiumizeMe.py
index c06baf21d..68c9a599b 100644
--- a/pyload/plugins/account/PremiumizeMe.py
+++ b/pyload/plugins/account/PremiumizeMe.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 from pyload.utils import json_loads
 
diff --git a/pyload/plugins/account/QuickshareCz.py b/pyload/plugins/account/QuickshareCz.py
index 40bf9d06d..21af09589 100644
--- a/pyload/plugins/account/QuickshareCz.py
+++ b/pyload/plugins/account/QuickshareCz.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class QuickshareCz(Account):
diff --git a/pyload/plugins/account/RPNetBiz.py b/pyload/plugins/account/RPNetBiz.py
index 70622ff45..2073452df 100644
--- a/pyload/plugins/account/RPNetBiz.py
+++ b/pyload/plugins/account/RPNetBiz.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/RapidgatorNet.py b/pyload/plugins/account/RapidgatorNet.py
index 72a46a928..fc0c50ca1 100644
--- a/pyload/plugins/account/RapidgatorNet.py
+++ b/pyload/plugins/account/RapidgatorNet.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/RapiduNet.py b/pyload/plugins/account/RapiduNet.py
index 6837f5c91..4bc418069 100644
--- a/pyload/plugins/account/RapiduNet.py
+++ b/pyload/plugins/account/RapiduNet.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/RealdebridCom.py b/pyload/plugins/account/RealdebridCom.py
index b7773d9a0..bee51de31 100644
--- a/pyload/plugins/account/RealdebridCom.py
+++ b/pyload/plugins/account/RealdebridCom.py
@@ -2,7 +2,7 @@
 
 import xml.dom.minidom as dom
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class RealdebridCom(Account):
diff --git a/pyload/plugins/account/RehostTo.py b/pyload/plugins/account/RehostTo.py
index 23c1eeda1..e613dec06 100644
--- a/pyload/plugins/account/RehostTo.py
+++ b/pyload/plugins/account/RehostTo.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class RehostTo(Account):
diff --git a/pyload/plugins/account/ShareonlineBiz.py b/pyload/plugins/account/ShareonlineBiz.py
index dbbe93869..42bced626 100644
--- a/pyload/plugins/account/ShareonlineBiz.py
+++ b/pyload/plugins/account/ShareonlineBiz.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class ShareonlineBiz(Account):
diff --git a/pyload/plugins/account/SimplyPremiumCom.py b/pyload/plugins/account/SimplyPremiumCom.py
index b3dad84d3..2dafb12d0 100644
--- a/pyload/plugins/account/SimplyPremiumCom.py
+++ b/pyload/plugins/account/SimplyPremiumCom.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class SimplyPremiumCom(Account):
diff --git a/pyload/plugins/account/SimplydebridCom.py b/pyload/plugins/account/SimplydebridCom.py
index 1942e178c..5cf148d4d 100644
--- a/pyload/plugins/account/SimplydebridCom.py
+++ b/pyload/plugins/account/SimplydebridCom.py
@@ -2,7 +2,7 @@
 
 from time import mktime, strptime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class SimplydebridCom(Account):
diff --git a/pyload/plugins/account/StahnuTo.py b/pyload/plugins/account/StahnuTo.py
index 70ef292e7..c08b26b49 100644
--- a/pyload/plugins/account/StahnuTo.py
+++ b/pyload/plugins/account/StahnuTo.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class StahnuTo(Account):
diff --git a/pyload/plugins/account/TurbobitNet.py b/pyload/plugins/account/TurbobitNet.py
index e2f56905c..7370f4f33 100644
--- a/pyload/plugins/account/TurbobitNet.py
+++ b/pyload/plugins/account/TurbobitNet.py
@@ -3,7 +3,7 @@
 import re
 from time import mktime, strptime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class TurbobitNet(Account):
diff --git a/pyload/plugins/account/UlozTo.py b/pyload/plugins/account/UlozTo.py
index 2cdab0167..1c27182b6 100644
--- a/pyload/plugins/account/UlozTo.py
+++ b/pyload/plugins/account/UlozTo.py
@@ -4,7 +4,7 @@ import re
 
 from urlparse import urljoin
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class UlozTo(Account):
diff --git a/pyload/plugins/account/UnrestrictLi.py b/pyload/plugins/account/UnrestrictLi.py
index 30144ca65..dae1b0779 100644
--- a/pyload/plugins/account/UnrestrictLi.py
+++ b/pyload/plugins/account/UnrestrictLi.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/account/UploadedTo.py b/pyload/plugins/account/UploadedTo.py
index f5c5d22b2..82b95694e 100644
--- a/pyload/plugins/account/UploadedTo.py
+++ b/pyload/plugins/account/UploadedTo.py
@@ -3,7 +3,7 @@
 import re
 from time import time
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class UploadedTo(Account):
diff --git a/pyload/plugins/account/UploadheroCom.py b/pyload/plugins/account/UploadheroCom.py
index 9406de38f..02863b736 100644
--- a/pyload/plugins/account/UploadheroCom.py
+++ b/pyload/plugins/account/UploadheroCom.py
@@ -4,7 +4,7 @@ import re
 import datetime
 import time
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class UploadheroCom(Account):
diff --git a/pyload/plugins/account/UploadingCom.py b/pyload/plugins/account/UploadingCom.py
index 8f308b0b6..979f73d21 100644
--- a/pyload/plugins/account/UploadingCom.py
+++ b/pyload/plugins/account/UploadingCom.py
@@ -4,7 +4,7 @@ import re
 
 from time import time, strptime, mktime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.plugins.internal.SimpleHoster import set_cookies
 
 
diff --git a/pyload/plugins/account/YibaishiwuCom.py b/pyload/plugins/account/YibaishiwuCom.py
index 06a606bc4..1bdb12886 100644
--- a/pyload/plugins/account/YibaishiwuCom.py
+++ b/pyload/plugins/account/YibaishiwuCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class YibaishiwuCom(Account):
diff --git a/pyload/plugins/account/ZeveraCom.py b/pyload/plugins/account/ZeveraCom.py
index dfd4f29f5..198434643 100644
--- a/pyload/plugins/account/ZeveraCom.py
+++ b/pyload/plugins/account/ZeveraCom.py
@@ -2,7 +2,7 @@
 
 from time import mktime, strptime
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 
 
 class ZeveraCom(Account):
diff --git a/pyload/plugins/addon/Checksum.py b/pyload/plugins/addon/Checksum.py
index ce50d1b28..d6b10d7e2 100644
--- a/pyload/plugins/addon/Checksum.py
+++ b/pyload/plugins/addon/Checksum.py
@@ -9,7 +9,7 @@ import zlib
 from os import remove
 from os.path import getsize, isfile, splitext
 
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 from pyload.utils import safe_join, fs_encode
 
 
diff --git a/pyload/plugins/addon/ClickAndLoad.py b/pyload/plugins/addon/ClickAndLoad.py
index 1f55b15dd..f4a6314be 100644
--- a/pyload/plugins/addon/ClickAndLoad.py
+++ b/pyload/plugins/addon/ClickAndLoad.py
@@ -3,7 +3,7 @@
 from socket import socket, error
 from threading import Thread
 
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 
 
 def forward(source, destination):
diff --git a/pyload/plugins/addon/DeleteFinished.py b/pyload/plugins/addon/DeleteFinished.py
index 43908b9a3..3a966dcd6 100644
--- a/pyload/plugins/addon/DeleteFinished.py
+++ b/pyload/plugins/addon/DeleteFinished.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 from pyload.database import style
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 
 
 class DeleteFinished(Addon):
diff --git a/pyload/plugins/addon/DownloadScheduler.py b/pyload/plugins/addon/DownloadScheduler.py
index c1f1fca11..ea58b3d01 100644
--- a/pyload/plugins/addon/DownloadScheduler.py
+++ b/pyload/plugins/addon/DownloadScheduler.py
@@ -4,7 +4,7 @@ import re
 
 from time import localtime
 
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 
 
 class DownloadScheduler(Addon):
diff --git a/pyload/plugins/addon/ExternalScripts.py b/pyload/plugins/addon/ExternalScripts.py
index af863abb0..531e2f275 100644
--- a/pyload/plugins/addon/ExternalScripts.py
+++ b/pyload/plugins/addon/ExternalScripts.py
@@ -6,7 +6,7 @@ from itertools import chain
 from os import listdir, access, X_OK, makedirs
 from os.path import join, exists, basename, abspath
 
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 from pyload.utils import safe_join
 
 
diff --git a/pyload/plugins/addon/ExtractArchive.py b/pyload/plugins/addon/ExtractArchive.py
index 60b66740c..1a416f901 100644
--- a/pyload/plugins/addon/ExtractArchive.py
+++ b/pyload/plugins/addon/ExtractArchive.py
@@ -51,7 +51,7 @@ if os.name != "nt":
     from os import chown
     from pwd import getpwnam
 
-from pyload.plugins.internal.Addon import Addon, threaded, Expose
+from pyload.plugins.Addon import Addon, threaded, Expose
 from pyload.plugins.internal.AbstractExtractor import ArchiveError, CRCError, WrongPassword
 from pyload.utils import safe_join, fs_encode
 
diff --git a/pyload/plugins/addon/HotFolder.py b/pyload/plugins/addon/HotFolder.py
index ff714d69e..801ed7bef 100644
--- a/pyload/plugins/addon/HotFolder.py
+++ b/pyload/plugins/addon/HotFolder.py
@@ -8,7 +8,7 @@ from os import listdir, makedirs
 from os.path import exists, isfile, join
 from shutil import move
 
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 from pyload.utils import fs_encode, safe_join
 
 
diff --git a/pyload/plugins/addon/IRCInterface.py b/pyload/plugins/addon/IRCInterface.py
index bba8f86d8..2e0919caa 100644
--- a/pyload/plugins/addon/IRCInterface.py
+++ b/pyload/plugins/addon/IRCInterface.py
@@ -13,7 +13,7 @@ from traceback import print_exc
 
 from pyload.api import PackageDoesNotExists, FileDoesNotExists
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 from pyload.utils import formatSize
 
 
diff --git a/pyload/plugins/addon/MergeFiles.py b/pyload/plugins/addon/MergeFiles.py
index 0c9b05283..8a2573409 100644
--- a/pyload/plugins/addon/MergeFiles.py
+++ b/pyload/plugins/addon/MergeFiles.py
@@ -7,7 +7,7 @@ import re
 
 from traceback import print_exc
 
-from pyload.plugins.internal.Addon import Addon, threaded
+from pyload.plugins.Addon import Addon, threaded
 from pyload.utils import safe_join, fs_encode
 
 
@@ -50,7 +50,7 @@ class MergeFiles(Addon):
         for name, file_list in files.iteritems():
             self.logInfo(_("Starting merging of"), name)
 
-            final_file = open(save_join(download_folder, name), "wb")
+            final_file = open(safe_join(download_folder, name), "wb")
                 for splitted_file in file_list:
                     self.logDebug("Merging part", splitted_file)
 
diff --git a/pyload/plugins/addon/MultiHome.py b/pyload/plugins/addon/MultiHome.py
index 3450cab27..0db1df1bf 100644
--- a/pyload/plugins/addon/MultiHome.py
+++ b/pyload/plugins/addon/MultiHome.py
@@ -2,7 +2,7 @@
 
 from time import time
 
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 
 
 class MultiHome(Addon):
diff --git a/pyload/plugins/addon/RestartFailed.py b/pyload/plugins/addon/RestartFailed.py
index f8d9da9cc..0fe0b4af6 100644
--- a/pyload/plugins/addon/RestartFailed.py
+++ b/pyload/plugins/addon/RestartFailed.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 
 
 class RestartFailed(Addon):
diff --git a/pyload/plugins/addon/RestartSlow.py b/pyload/plugins/addon/RestartSlow.py
index f3c98c461..acf2852cd 100644
--- a/pyload/plugins/addon/RestartSlow.py
+++ b/pyload/plugins/addon/RestartSlow.py
@@ -2,7 +2,7 @@
 
 import pycurl
 
-from module.plugins.Addon import Addon
+from pyload.plugins.Addon import Addon
 
 
 class RestartSlow(Addon):
diff --git a/pyload/plugins/addon/SkipRev.py b/pyload/plugins/addon/SkipRev.py
index cf716c509..4a69d8e09 100644
--- a/pyload/plugins/addon/SkipRev.py
+++ b/pyload/plugins/addon/SkipRev.py
@@ -3,7 +3,7 @@
 from urllib import unquote
 from urlparse import urlparse
 
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 from pyload.plugins.Plugin import SkipDownload
 
 
diff --git a/pyload/plugins/addon/UnSkipOnFail.py b/pyload/plugins/addon/UnSkipOnFail.py
index aade5a91e..a148f8f13 100644
--- a/pyload/plugins/addon/UnSkipOnFail.py
+++ b/pyload/plugins/addon/UnSkipOnFail.py
@@ -3,7 +3,7 @@
 from os.path import basename
 
 from pyload.datatype.PyFile import PyFile
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 from pyload.utils import fs_encode
 
 
diff --git a/pyload/plugins/addon/UpdateManager.py b/pyload/plugins/addon/UpdateManager.py
index 577345d69..b4818c943 100644
--- a/pyload/plugins/addon/UpdateManager.py
+++ b/pyload/plugins/addon/UpdateManager.py
@@ -9,7 +9,7 @@ from operator import itemgetter
 from os import path, remove, stat
 
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Addon import Expose, Addon, threaded
+from pyload.plugins.Addon import Expose, Addon, threaded
 from pyload.utils import safe_join
 
 
diff --git a/pyload/plugins/addon/WindowsPhoneToastNotify.py b/pyload/plugins/addon/WindowsPhoneToastNotify.py
index dc618d2d4..a6da7cd20 100644
--- a/pyload/plugins/addon/WindowsPhoneToastNotify.py
+++ b/pyload/plugins/addon/WindowsPhoneToastNotify.py
@@ -3,7 +3,7 @@
 import httplib
 import time
 
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 
 
 class WindowsPhoneToastNotify(Addon):
diff --git a/pyload/plugins/captcha/AdYouLike.py b/pyload/plugins/captcha/AdYouLike.py
index c129693da..fdfb18479 100644
--- a/pyload/plugins/captcha/AdYouLike.py
+++ b/pyload/plugins/captcha/AdYouLike.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Captcha import Captcha
+from pyload.plugins.Captcha import Captcha
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/captcha/AdsCaptcha.py b/pyload/plugins/captcha/AdsCaptcha.py
index 3f14ebdc0..cc9e54350 100644
--- a/pyload/plugins/captcha/AdsCaptcha.py
+++ b/pyload/plugins/captcha/AdsCaptcha.py
@@ -4,7 +4,7 @@ import re
 
 from random import random
 
-from pyload.plugins.internal.Captcha import Captcha
+from pyload.plugins.Captcha import Captcha
 
 
 class AdsCaptcha(Captcha):
diff --git a/pyload/plugins/captcha/ReCaptcha.py b/pyload/plugins/captcha/ReCaptcha.py
index cce8bbb84..d954ceeb0 100644
--- a/pyload/plugins/captcha/ReCaptcha.py
+++ b/pyload/plugins/captcha/ReCaptcha.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Captcha import Captcha
+from pyload.plugins.Captcha import Captcha
 
 
 class ReCaptcha(Captcha):
diff --git a/pyload/plugins/captcha/SolveMedia.py b/pyload/plugins/captcha/SolveMedia.py
index 843aa35e0..130b374b5 100644
--- a/pyload/plugins/captcha/SolveMedia.py
+++ b/pyload/plugins/captcha/SolveMedia.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Captcha import Captcha
+from pyload.plugins.Captcha import Captcha
 
 
 class SolveMedia(Captcha):
diff --git a/pyload/plugins/container/CCF.py b/pyload/plugins/container/CCF.py
index a558baa03..1c3991c44 100644
--- a/pyload/plugins/container/CCF.py
+++ b/pyload/plugins/container/CCF.py
@@ -10,7 +10,7 @@ from urllib2 import build_opener
 
 from MultipartPostHandler import MultipartPostHandler
 
-from pyload.plugins.internal.Container import Container
+from pyload.plugins.Container import Container
 from pyload.utils import safe_join
 
 
diff --git a/pyload/plugins/container/LinkList.py b/pyload/plugins/container/LinkList.py
index 9e6396cab..292920630 100644
--- a/pyload/plugins/container/LinkList.py
+++ b/pyload/plugins/container/LinkList.py
@@ -2,7 +2,7 @@
 
 import codecs
 
-from pyload.plugins.internal.Container import Container
+from pyload.plugins.Container import Container
 from pyload.utils import fs_encode
 
 
diff --git a/pyload/plugins/container/RSDF.py b/pyload/plugins/container/RSDF.py
index 41811469f..a9d0b72c9 100644
--- a/pyload/plugins/container/RSDF.py
+++ b/pyload/plugins/container/RSDF.py
@@ -6,7 +6,7 @@ import base64
 import binascii
 import re
 
-from pyload.plugins.internal.Container import Container
+from pyload.plugins.Container import Container
 from pyload.utils import fs_encode
 
 
diff --git a/pyload/plugins/crypter/ChipDe.py b/pyload/plugins/crypter/ChipDe.py
index 842fff292..41653bbe3 100644
--- a/pyload/plugins/crypter/ChipDe.py
+++ b/pyload/plugins/crypter/ChipDe.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import re
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class ChipDe(Crypter):
diff --git a/pyload/plugins/crypter/CzshareCom.py b/pyload/plugins/crypter/CzshareCom.py
index 61d943222..cd77f118d 100644
--- a/pyload/plugins/crypter/CzshareCom.py
+++ b/pyload/plugins/crypter/CzshareCom.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import re
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class CzshareCom(Crypter):
diff --git a/pyload/plugins/crypter/DDLMusicOrg.py b/pyload/plugins/crypter/DDLMusicOrg.py
index ec50a3265..0a07b5427 100644
--- a/pyload/plugins/crypter/DDLMusicOrg.py
+++ b/pyload/plugins/crypter/DDLMusicOrg.py
@@ -4,7 +4,7 @@ import re
 
 from time import sleep
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class DDLMusicOrg(Crypter):
diff --git a/pyload/plugins/crypter/DailymotionBatch.py b/pyload/plugins/crypter/DailymotionBatch.py
index 4ea26a830..d1233f58c 100644
--- a/pyload/plugins/crypter/DailymotionBatch.py
+++ b/pyload/plugins/crypter/DailymotionBatch.py
@@ -5,7 +5,7 @@ import re
 from urlparse import urljoin
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 from pyload.utils import safe_join
 
 
diff --git a/pyload/plugins/crypter/Dereferer.py b/pyload/plugins/crypter/Dereferer.py
index 94a3aa1e4..b4217217f 100644
--- a/pyload/plugins/crypter/Dereferer.py
+++ b/pyload/plugins/crypter/Dereferer.py
@@ -4,7 +4,7 @@ import re
 
 from urllib import unquote
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class Dereferer(Crypter):
diff --git a/pyload/plugins/crypter/DontKnowMe.py b/pyload/plugins/crypter/DontKnowMe.py
index e48f56561..6ef47dcee 100644
--- a/pyload/plugins/crypter/DontKnowMe.py
+++ b/pyload/plugins/crypter/DontKnowMe.py
@@ -4,7 +4,7 @@ import re
 
 from urllib import unquote
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class DontKnowMe(Crypter):
diff --git a/pyload/plugins/crypter/DuckCryptInfo.py b/pyload/plugins/crypter/DuckCryptInfo.py
index 054783f3c..fc6f95589 100644
--- a/pyload/plugins/crypter/DuckCryptInfo.py
+++ b/pyload/plugins/crypter/DuckCryptInfo.py
@@ -4,7 +4,7 @@ import re
 
 from BeautifulSoup import BeautifulSoup
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class DuckCryptInfo(Crypter):
diff --git a/pyload/plugins/crypter/EmbeduploadCom.py b/pyload/plugins/crypter/EmbeduploadCom.py
index c6649890f..6e298f8bb 100644
--- a/pyload/plugins/crypter/EmbeduploadCom.py
+++ b/pyload/plugins/crypter/EmbeduploadCom.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import re
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 from pyload.network.HTTPRequest import BadHeader
 
 
diff --git a/pyload/plugins/crypter/FilecryptCc.py b/pyload/plugins/crypter/FilecryptCc.py
index ee8b3a99f..6db43bb36 100644
--- a/pyload/plugins/crypter/FilecryptCc.py
+++ b/pyload/plugins/crypter/FilecryptCc.py
@@ -6,7 +6,7 @@ import re
 
 from Crypto.Cipher import AES
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class FilecryptCc(Crypter):
diff --git a/pyload/plugins/crypter/FileserveCom.py b/pyload/plugins/crypter/FileserveCom.py
index 5ccccfc16..822362c56 100644
--- a/pyload/plugins/crypter/FileserveCom.py
+++ b/pyload/plugins/crypter/FileserveCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class FileserveCom(Crypter):
diff --git a/pyload/plugins/crypter/FourChanOrg.py b/pyload/plugins/crypter/FourChanOrg.py
index 6ce037f22..8d24188cb 100644
--- a/pyload/plugins/crypter/FourChanOrg.py
+++ b/pyload/plugins/crypter/FourChanOrg.py
@@ -4,7 +4,7 @@
 
 import re
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class FourChanOrg(Crypter):
diff --git a/pyload/plugins/crypter/GooGl.py b/pyload/plugins/crypter/GooGl.py
index b5fb40f34..aa9793e2e 100644
--- a/pyload/plugins/crypter/GooGl.py
+++ b/pyload/plugins/crypter/GooGl.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/crypter/HoerbuchIn.py b/pyload/plugins/crypter/HoerbuchIn.py
index 0bc374e7a..a9d11575e 100644
--- a/pyload/plugins/crypter/HoerbuchIn.py
+++ b/pyload/plugins/crypter/HoerbuchIn.py
@@ -4,7 +4,7 @@ import re
 
 from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class HoerbuchIn(Crypter):
diff --git a/pyload/plugins/crypter/LetitbitNet.py b/pyload/plugins/crypter/LetitbitNet.py
index 5706465bf..58e9ff31c 100644
--- a/pyload/plugins/crypter/LetitbitNet.py
+++ b/pyload/plugins/crypter/LetitbitNet.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import re
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class LetitbitNet(Crypter):
diff --git a/pyload/plugins/crypter/LinkCryptWs.py b/pyload/plugins/crypter/LinkCryptWs.py
index 219d836dd..287e2d6a9 100644
--- a/pyload/plugins/crypter/LinkCryptWs.py
+++ b/pyload/plugins/crypter/LinkCryptWs.py
@@ -8,7 +8,7 @@ import pycurl
 
 from Crypto.Cipher import AES
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 from pyload.utils import html_unescape
 
 
diff --git a/pyload/plugins/crypter/LinkdecrypterCom.py b/pyload/plugins/crypter/LinkdecrypterCom.py
index 57045c9d0..61e02e9da 100644
--- a/pyload/plugins/crypter/LinkdecrypterCom.py
+++ b/pyload/plugins/crypter/LinkdecrypterCom.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import re
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class LinkdecrypterCom(Crypter):
diff --git a/pyload/plugins/crypter/LixIn.py b/pyload/plugins/crypter/LixIn.py
index 2394a17b8..82c23a558 100644
--- a/pyload/plugins/crypter/LixIn.py
+++ b/pyload/plugins/crypter/LixIn.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class LixIn(Crypter):
diff --git a/pyload/plugins/crypter/MediafireCom.py b/pyload/plugins/crypter/MediafireCom.py
index 28c4fa984..4cf3bb88e 100644
--- a/pyload/plugins/crypter/MediafireCom.py
+++ b/pyload/plugins/crypter/MediafireCom.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import re
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 from pyload.plugins.hoster.MediafireCom import checkHTMLHeader
 from pyload.utils import json_loads
 
diff --git a/pyload/plugins/crypter/MultiloadCz.py b/pyload/plugins/crypter/MultiloadCz.py
index 75f232929..df94a80f6 100644
--- a/pyload/plugins/crypter/MultiloadCz.py
+++ b/pyload/plugins/crypter/MultiloadCz.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import re
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class MultiloadCz(Crypter):
diff --git a/pyload/plugins/crypter/NCryptIn.py b/pyload/plugins/crypter/NCryptIn.py
index 852c75b54..6e4af461c 100644
--- a/pyload/plugins/crypter/NCryptIn.py
+++ b/pyload/plugins/crypter/NCryptIn.py
@@ -6,7 +6,7 @@ import re
 
 from Crypto.Cipher import AES
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 from pyload.plugins.internal.captcha import ReCaptcha
 
 
diff --git a/pyload/plugins/crypter/OneKhDe.py b/pyload/plugins/crypter/OneKhDe.py
index 14b48549e..48df7481b 100644
--- a/pyload/plugins/crypter/OneKhDe.py
+++ b/pyload/plugins/crypter/OneKhDe.py
@@ -3,7 +3,7 @@
 import re
 
 from pyload.utils import html_unescape
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class OneKhDe(Crypter):
diff --git a/pyload/plugins/crypter/QuickshareCz.py b/pyload/plugins/crypter/QuickshareCz.py
index c1064bd20..ac86daec7 100644
--- a/pyload/plugins/crypter/QuickshareCz.py
+++ b/pyload/plugins/crypter/QuickshareCz.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import re
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class QuickshareCz(Crypter):
diff --git a/pyload/plugins/crypter/RelinkUs.py b/pyload/plugins/crypter/RelinkUs.py
index 2eb72dd17..2cc7874ee 100644
--- a/pyload/plugins/crypter/RelinkUs.py
+++ b/pyload/plugins/crypter/RelinkUs.py
@@ -8,7 +8,7 @@ import re
 import os
 
 from Crypto.Cipher import AES
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class RelinkUs(Crypter):
diff --git a/pyload/plugins/crypter/SafelinkingNet.py b/pyload/plugins/crypter/SafelinkingNet.py
index 06243d069..324fd42a2 100644
--- a/pyload/plugins/crypter/SafelinkingNet.py
+++ b/pyload/plugins/crypter/SafelinkingNet.py
@@ -7,7 +7,7 @@ from pycurl import FOLLOWLOCATION
 from BeautifulSoup import BeautifulSoup
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 from pyload.plugins.internal.captcha import SolveMedia
 
 
diff --git a/pyload/plugins/crypter/SexuriaCom.py b/pyload/plugins/crypter/SexuriaCom.py
index dd9b01bcd..92428352d 100644
--- a/pyload/plugins/crypter/SexuriaCom.py
+++ b/pyload/plugins/crypter/SexuriaCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class SexuriaCom(Crypter):
diff --git a/pyload/plugins/crypter/ShareLinksBiz.py b/pyload/plugins/crypter/ShareLinksBiz.py
index 64b198100..7572cdadd 100644
--- a/pyload/plugins/crypter/ShareLinksBiz.py
+++ b/pyload/plugins/crypter/ShareLinksBiz.py
@@ -5,7 +5,7 @@ import binascii
 import re
 
 from Crypto.Cipher import AES
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class ShareLinksBiz(Crypter):
diff --git a/pyload/plugins/crypter/UlozTo.py b/pyload/plugins/crypter/UlozTo.py
index 53380b5da..e369f338a 100644
--- a/pyload/plugins/crypter/UlozTo.py
+++ b/pyload/plugins/crypter/UlozTo.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import re
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class UlozTo(Crypter):
diff --git a/pyload/plugins/crypter/XupPl.py b/pyload/plugins/crypter/XupPl.py
index bf285f96c..7742dc816 100644
--- a/pyload/plugins/crypter/XupPl.py
+++ b/pyload/plugins/crypter/XupPl.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 
 
 class XupPl(Crypter):
diff --git a/pyload/plugins/crypter/YoutubeBatch.py b/pyload/plugins/crypter/YoutubeBatch.py
index d25f991e8..365517e29 100644
--- a/pyload/plugins/crypter/YoutubeBatch.py
+++ b/pyload/plugins/crypter/YoutubeBatch.py
@@ -5,7 +5,7 @@ import re
 from urlparse import urljoin
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 from pyload.utils import safe_join
 
 
diff --git a/pyload/plugins/hook/BypassCaptcha.py b/pyload/plugins/hook/BypassCaptcha.py
index 728abf6ed..610cfac64 100644
--- a/pyload/plugins/hook/BypassCaptcha.py
+++ b/pyload/plugins/hook/BypassCaptcha.py
@@ -4,7 +4,7 @@ from pycurl import FORM_FILE, LOW_SPEED_TIME
 
 from pyload.network.HTTPRequest import BadHeader
 from pyload.network.RequestFactory import getURL, getRequest
-from pyload.plugins.internal.Addon import Hook
+from pyload.plugins.Addon import Addon
 
 
 class BypassCaptchaException(Exception):
@@ -25,7 +25,7 @@ class BypassCaptchaException(Exception):
         return "<BypassCaptchaException %s>" % self.err
 
 
-class BypassCaptcha(Hook):
+class BypassCaptcha(Addon):
     __name__    = "BypassCaptcha"
     __type__    = "hook"
     __version__ = "0.05"
diff --git a/pyload/plugins/hook/Captcha9kw.py b/pyload/plugins/hook/Captcha9kw.py
index 9f0f80c2d..f3f086adf 100644
--- a/pyload/plugins/hook/Captcha9kw.py
+++ b/pyload/plugins/hook/Captcha9kw.py
@@ -10,10 +10,10 @@ from time import sleep
 from pyload.network.HTTPRequest import BadHeader
 from pyload.network.RequestFactory import getURL
 
-from pyload.plugins.internal.Addon import Hook
+from pyload.plugins.Addon import Addon
 
 
-class Captcha9kw(Hook):
+class Captcha9kw(Addon):
     __name__    = "Captcha9kw"
     __type__    = "hook"
     __version__ = "0.26"
diff --git a/pyload/plugins/hook/CaptchaBrotherhood.py b/pyload/plugins/hook/CaptchaBrotherhood.py
index 355081630..333c0be85 100644
--- a/pyload/plugins/hook/CaptchaBrotherhood.py
+++ b/pyload/plugins/hook/CaptchaBrotherhood.py
@@ -14,7 +14,7 @@ from time import sleep
 from urllib import urlencode
 
 from pyload.network.RequestFactory import getURL, getRequest
-from pyload.plugins.internal.Addon import Hook
+from pyload.plugins.Addon import Addon
 
 
 class CaptchaBrotherhoodException(Exception):
@@ -35,7 +35,7 @@ class CaptchaBrotherhoodException(Exception):
         return "<CaptchaBrotherhoodException %s>" % self.err
 
 
-class CaptchaBrotherhood(Hook):
+class CaptchaBrotherhood(Addon):
     __name__    = "CaptchaBrotherhood"
     __type__    = "hook"
     __version__ = "0.06"
diff --git a/pyload/plugins/hook/DeathByCaptcha.py b/pyload/plugins/hook/DeathByCaptcha.py
index c076bdcee..f2ccb383b 100644
--- a/pyload/plugins/hook/DeathByCaptcha.py
+++ b/pyload/plugins/hook/DeathByCaptcha.py
@@ -11,7 +11,7 @@ from time import sleep
 from pyload.utils import json_loads
 from pyload.network.HTTPRequest import BadHeader
 from pyload.network.RequestFactory import getRequest
-from pyload.plugins.internal.Addon import Hook
+from pyload.plugins.Addon import Addon
 
 
 class DeathByCaptchaException(Exception):
@@ -48,7 +48,7 @@ class DeathByCaptchaException(Exception):
         return "<DeathByCaptchaException %s>" % self.err
 
 
-class DeathByCaptcha(Hook):
+class DeathByCaptcha(Addon):
     __name__    = "DeathByCaptcha"
     __type__    = "hook"
     __version__ = "0.04"
diff --git a/pyload/plugins/hook/ExpertDecoders.py b/pyload/plugins/hook/ExpertDecoders.py
index c9da38fe9..a9b9bdf2c 100644
--- a/pyload/plugins/hook/ExpertDecoders.py
+++ b/pyload/plugins/hook/ExpertDecoders.py
@@ -8,10 +8,10 @@ from uuid import uuid4
 
 from pyload.network.HTTPRequest import BadHeader
 from pyload.network.RequestFactory import getURL, getRequest
-from pyload.plugins.internal.Addon import Hook
+from pyload.plugins.Addon import Addon
 
 
-class ExpertDecoders(Hook):
+class ExpertDecoders(Addon):
     __name__    = "ExpertDecoders"
     __type__    = "hook"
     __version__ = "0.02"
diff --git a/pyload/plugins/hook/ImageTyperz.py b/pyload/plugins/hook/ImageTyperz.py
index 5e35a61e4..2432dce7d 100644
--- a/pyload/plugins/hook/ImageTyperz.py
+++ b/pyload/plugins/hook/ImageTyperz.py
@@ -8,7 +8,7 @@ from base64 import b64encode
 from pycurl import FORM_FILE, LOW_SPEED_TIME
 
 from pyload.network.RequestFactory import getURL, getRequest
-from pyload.plugins.internal.Addon import Hook
+from pyload.plugins.Addon import Addon
 
 
 class ImageTyperzException(Exception):
@@ -29,7 +29,7 @@ class ImageTyperzException(Exception):
         return "<ImageTyperzException %s>" % self.err
 
 
-class ImageTyperz(Hook):
+class ImageTyperz(Addon):
     __name__    = "ImageTyperz"
     __type__    = "hook"
     __version__ = "0.05"
diff --git a/pyload/plugins/hook/LinkdecrypterCom.py b/pyload/plugins/hook/LinkdecrypterCom.py
index e99d79b7f..0e8ec7554 100644
--- a/pyload/plugins/hook/LinkdecrypterCom.py
+++ b/pyload/plugins/hook/LinkdecrypterCom.py
@@ -3,11 +3,11 @@
 import re
 
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Addon import Hook
+from pyload.plugins.Addon import Addon
 from pyload.utils import remove_chars
 
 
-class LinkdecrypterCom(Hook):
+class LinkdecrypterCom(Addon):
     __name__    = "LinkdecrypterCom"
     __type__    = "hook"
     __version__ = "0.21"
diff --git a/pyload/plugins/hook/XFileSharingPro.py b/pyload/plugins/hook/XFileSharingPro.py
index 17baed8b2..cc4fc760d 100644
--- a/pyload/plugins/hook/XFileSharingPro.py
+++ b/pyload/plugins/hook/XFileSharingPro.py
@@ -2,10 +2,10 @@
 
 import re
 
-from pyload.plugins.internal.Addon import Hook
+from pyload.plugins.Addon import Addon
 
 
-class XFileSharingPro(Hook):
+class XFileSharingPro(Addon):
     __name__    = "XFileSharingPro"
     __type__    = "hook"
     __version__ = "0.26"
diff --git a/pyload/plugins/hoster/AlldebridCom.py b/pyload/plugins/hoster/AlldebridCom.py
index d575c305e..d2ce331d3 100644
--- a/pyload/plugins/hoster/AlldebridCom.py
+++ b/pyload/plugins/hoster/AlldebridCom.py
@@ -6,7 +6,7 @@ from random import randrange
 from urllib import unquote
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.utils import parseFileSize
 
 
diff --git a/pyload/plugins/hoster/DailymotionCom.py b/pyload/plugins/hoster/DailymotionCom.py
index 201897719..f8489552f 100644
--- a/pyload/plugins/hoster/DailymotionCom.py
+++ b/pyload/plugins/hoster/DailymotionCom.py
@@ -5,7 +5,7 @@ import re
 from pyload.datatype.PyFile import statusMap
 from pyload.utils import json_loads
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 def getInfo(urls):
diff --git a/pyload/plugins/hoster/DebridItaliaCom.py b/pyload/plugins/hoster/DebridItaliaCom.py
index a629b06a9..cc33b9f46 100644
--- a/pyload/plugins/hoster/DebridItaliaCom.py
+++ b/pyload/plugins/hoster/DebridItaliaCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.plugins.internal.SimpleHoster import replace_patterns
 
 
diff --git a/pyload/plugins/hoster/FastixRu.py b/pyload/plugins/hoster/FastixRu.py
index 42be856ed..eead00f28 100644
--- a/pyload/plugins/hoster/FastixRu.py
+++ b/pyload/plugins/hoster/FastixRu.py
@@ -6,7 +6,7 @@ from random import randrange
 from urllib import unquote
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class FastixRu(Hoster):
diff --git a/pyload/plugins/hoster/FilesMailRu.py b/pyload/plugins/hoster/FilesMailRu.py
index 4a5118fda..23f03f5c9 100644
--- a/pyload/plugins/hoster/FilesMailRu.py
+++ b/pyload/plugins/hoster/FilesMailRu.py
@@ -3,7 +3,7 @@
 import re
 
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.plugins.Plugin import chunks
 
 
diff --git a/pyload/plugins/hoster/FileserveCom.py b/pyload/plugins/hoster/FileserveCom.py
index d98de9e6b..5c94d42fa 100644
--- a/pyload/plugins/hoster/FileserveCom.py
+++ b/pyload/plugins/hoster/FileserveCom.py
@@ -4,7 +4,7 @@ import re
 
 from pyload.utils import json_loads
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.plugins.Plugin import chunks
 from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight
 from pyload.plugins.internal.captcha import ReCaptcha
diff --git a/pyload/plugins/hoster/FreakshareCom.py b/pyload/plugins/hoster/FreakshareCom.py
index ba4b7ddb0..c2e45e857 100644
--- a/pyload/plugins/hoster/FreakshareCom.py
+++ b/pyload/plugins/hoster/FreakshareCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight
 from pyload.plugins.internal.captcha import ReCaptcha
 
diff --git a/pyload/plugins/hoster/FreeWayMe.py b/pyload/plugins/hoster/FreeWayMe.py
index 153b41b32..c940fe094 100644
--- a/pyload/plugins/hoster/FreeWayMe.py
+++ b/pyload/plugins/hoster/FreeWayMe.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class FreeWayMe(Hoster):
diff --git a/pyload/plugins/hoster/Ftp.py b/pyload/plugins/hoster/Ftp.py
index c130cc395..c7fb856eb 100644
--- a/pyload/plugins/hoster/Ftp.py
+++ b/pyload/plugins/hoster/Ftp.py
@@ -6,7 +6,7 @@ import re
 from urllib import quote, unquote
 from urlparse import urlparse
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class Ftp(Hoster):
diff --git a/pyload/plugins/hoster/GamefrontCom.py b/pyload/plugins/hoster/GamefrontCom.py
index 50a5be554..91c63fc62 100644
--- a/pyload/plugins/hoster/GamefrontCom.py
+++ b/pyload/plugins/hoster/GamefrontCom.py
@@ -3,7 +3,7 @@
 import re
 
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.utils import parseFileSize
 
 
diff --git a/pyload/plugins/hoster/LinksnappyCom.py b/pyload/plugins/hoster/LinksnappyCom.py
index d7991ff3c..392aa78ca 100644
--- a/pyload/plugins/hoster/LinksnappyCom.py
+++ b/pyload/plugins/hoster/LinksnappyCom.py
@@ -5,7 +5,7 @@ import re
 from urlparse import urlsplit
 
 from pyload.utils import json_loads, json_dumps
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class LinksnappyCom(Hoster):
diff --git a/pyload/plugins/hoster/MegaCoNz.py b/pyload/plugins/hoster/MegaCoNz.py
index 182c0c9b9..f17760abb 100644
--- a/pyload/plugins/hoster/MegaCoNz.py
+++ b/pyload/plugins/hoster/MegaCoNz.py
@@ -12,7 +12,7 @@ from Crypto.Util import Counter
 from pycurl import SSL_CIPHER_LIST
 
 from pyload.utils import json_loads, json_dumps
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 ############################ General errors ###################################
 # EINTERNAL            (-1): An internal error has occurred. Please submit a bug report, detailing the exact circumstances in which this error occurred
diff --git a/pyload/plugins/hoster/MegaDebridEu.py b/pyload/plugins/hoster/MegaDebridEu.py
index 66b12b164..848651d1f 100644
--- a/pyload/plugins/hoster/MegaDebridEu.py
+++ b/pyload/plugins/hoster/MegaDebridEu.py
@@ -5,7 +5,7 @@ import re
 from urllib import unquote_plus
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class MegaDebridEu(Hoster):
diff --git a/pyload/plugins/hoster/MyfastfileCom.py b/pyload/plugins/hoster/MyfastfileCom.py
index cb1148389..6bdc9a108 100644
--- a/pyload/plugins/hoster/MyfastfileCom.py
+++ b/pyload/plugins/hoster/MyfastfileCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/hoster/MyvideoDe.py b/pyload/plugins/hoster/MyvideoDe.py
index e23856f0b..84841b1a4 100644
--- a/pyload/plugins/hoster/MyvideoDe.py
+++ b/pyload/plugins/hoster/MyvideoDe.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.utils import html_unescape
 
 
diff --git a/pyload/plugins/hoster/NetloadIn.py b/pyload/plugins/hoster/NetloadIn.py
index 0aabc8f57..785d2f465 100644
--- a/pyload/plugins/hoster/NetloadIn.py
+++ b/pyload/plugins/hoster/NetloadIn.py
@@ -6,7 +6,7 @@ from urlparse import urljoin
 from time import sleep, time
 
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.plugins.Plugin import chunks
 from pyload.plugins.captcha import ReCaptcha
 
diff --git a/pyload/plugins/hoster/OboomCom.py b/pyload/plugins/hoster/OboomCom.py
index 2f50f5f87..f78e98b91 100644
--- a/pyload/plugins/hoster/OboomCom.py
+++ b/pyload/plugins/hoster/OboomCom.py
@@ -6,7 +6,7 @@
 import re
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.plugins.internal.captcha import ReCaptcha
 
 
diff --git a/pyload/plugins/hoster/OverLoadMe.py b/pyload/plugins/hoster/OverLoadMe.py
index 3d07db489..eda3e1848 100644
--- a/pyload/plugins/hoster/OverLoadMe.py
+++ b/pyload/plugins/hoster/OverLoadMe.py
@@ -6,7 +6,7 @@ from random import randrange
 from urllib import unquote
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.utils import parseFileSize
 
 
diff --git a/pyload/plugins/hoster/PornhostCom.py b/pyload/plugins/hoster/PornhostCom.py
index 3f1650bf0..00d316ef1 100644
--- a/pyload/plugins/hoster/PornhostCom.py
+++ b/pyload/plugins/hoster/PornhostCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class PornhostCom(Hoster):
diff --git a/pyload/plugins/hoster/PornhubCom.py b/pyload/plugins/hoster/PornhubCom.py
index 7cbcabf16..df070b618 100644
--- a/pyload/plugins/hoster/PornhubCom.py
+++ b/pyload/plugins/hoster/PornhubCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class PornhubCom(Hoster):
diff --git a/pyload/plugins/hoster/PremiumTo.py b/pyload/plugins/hoster/PremiumTo.py
index 04e00849a..b4b05126b 100644
--- a/pyload/plugins/hoster/PremiumTo.py
+++ b/pyload/plugins/hoster/PremiumTo.py
@@ -6,7 +6,7 @@ from os import remove
 from os.path import exists
 from urllib import quote
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.utils import fs_encode
 
 
diff --git a/pyload/plugins/hoster/PremiumizeMe.py b/pyload/plugins/hoster/PremiumizeMe.py
index ff56adf79..641f587f1 100644
--- a/pyload/plugins/hoster/PremiumizeMe.py
+++ b/pyload/plugins/hoster/PremiumizeMe.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class PremiumizeMe(Hoster):
diff --git a/pyload/plugins/hoster/RPNetBiz.py b/pyload/plugins/hoster/RPNetBiz.py
index 9b2ff8d8c..6ab7b7066 100644
--- a/pyload/plugins/hoster/RPNetBiz.py
+++ b/pyload/plugins/hoster/RPNetBiz.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.utils import json_loads
 
 
diff --git a/pyload/plugins/hoster/RealdebridCom.py b/pyload/plugins/hoster/RealdebridCom.py
index cc4731e3f..b5ce0e44f 100644
--- a/pyload/plugins/hoster/RealdebridCom.py
+++ b/pyload/plugins/hoster/RealdebridCom.py
@@ -7,7 +7,7 @@ from urllib import quote, unquote
 from time import time
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.utils import parseFileSize
 
 
diff --git a/pyload/plugins/hoster/RedtubeCom.py b/pyload/plugins/hoster/RedtubeCom.py
index ed143d987..86264d9de 100644
--- a/pyload/plugins/hoster/RedtubeCom.py
+++ b/pyload/plugins/hoster/RedtubeCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.utils import html_unescape
 
 
diff --git a/pyload/plugins/hoster/RehostTo.py b/pyload/plugins/hoster/RehostTo.py
index 99d44b1aa..88da33c23 100644
--- a/pyload/plugins/hoster/RehostTo.py
+++ b/pyload/plugins/hoster/RehostTo.py
@@ -2,7 +2,7 @@
 
 from urllib import quote, unquote
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class RehostTo(Hoster):
diff --git a/pyload/plugins/hoster/ShareplaceCom.py b/pyload/plugins/hoster/ShareplaceCom.py
index 6e11de05c..ae3f60a0b 100644
--- a/pyload/plugins/hoster/ShareplaceCom.py
+++ b/pyload/plugins/hoster/ShareplaceCom.py
@@ -4,7 +4,7 @@ import re
 
 from urllib import unquote
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class ShareplaceCom(Hoster):
diff --git a/pyload/plugins/hoster/SimplyPremiumCom.py b/pyload/plugins/hoster/SimplyPremiumCom.py
index b0ea9f90f..271d05849 100644
--- a/pyload/plugins/hoster/SimplyPremiumCom.py
+++ b/pyload/plugins/hoster/SimplyPremiumCom.py
@@ -4,7 +4,7 @@ import re
 
 from datetime import datetime, timedelta
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.plugins.hoster.UnrestrictLi import secondsToMidnight
 
 
diff --git a/pyload/plugins/hoster/SimplydebridCom.py b/pyload/plugins/hoster/SimplydebridCom.py
index f9063d737..4e187ee0d 100644
--- a/pyload/plugins/hoster/SimplydebridCom.py
+++ b/pyload/plugins/hoster/SimplydebridCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class SimplydebridCom(Hoster):
diff --git a/pyload/plugins/hoster/SoundcloudCom.py b/pyload/plugins/hoster/SoundcloudCom.py
index cc6ef83f3..faed23439 100644
--- a/pyload/plugins/hoster/SoundcloudCom.py
+++ b/pyload/plugins/hoster/SoundcloudCom.py
@@ -3,7 +3,7 @@
 import pycurl
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class SoundcloudCom(Hoster):
diff --git a/pyload/plugins/hoster/StreamCz.py b/pyload/plugins/hoster/StreamCz.py
index e999e4c25..d8b5d9efd 100644
--- a/pyload/plugins/hoster/StreamCz.py
+++ b/pyload/plugins/hoster/StreamCz.py
@@ -3,7 +3,7 @@
 import re
 
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 def getInfo(urls):
diff --git a/pyload/plugins/hoster/UnrestrictLi.py b/pyload/plugins/hoster/UnrestrictLi.py
index 998c097fd..b6cead4bb 100644
--- a/pyload/plugins/hoster/UnrestrictLi.py
+++ b/pyload/plugins/hoster/UnrestrictLi.py
@@ -5,7 +5,7 @@ import re
 from datetime import datetime, timedelta
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 def secondsToMidnight(gmt=0):
diff --git a/pyload/plugins/hoster/UploadedTo.py b/pyload/plugins/hoster/UploadedTo.py
index e8dea32c2..1bf4dc899 100644
--- a/pyload/plugins/hoster/UploadedTo.py
+++ b/pyload/plugins/hoster/UploadedTo.py
@@ -9,7 +9,7 @@ import re
 from time import sleep
 
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.plugins.Plugin import chunks
 from pyload.plugins.internal.captcha import ReCaptcha
 from pyload.utils import html_unescape, parseFileSize
diff --git a/pyload/plugins/hoster/VeehdCom.py b/pyload/plugins/hoster/VeehdCom.py
index 326d0a18e..03ad789de 100644
--- a/pyload/plugins/hoster/VeehdCom.py
+++ b/pyload/plugins/hoster/VeehdCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class VeehdCom(Hoster):
diff --git a/pyload/plugins/hoster/XHamsterCom.py b/pyload/plugins/hoster/XHamsterCom.py
index 503022ec9..9d2bc59ef 100644
--- a/pyload/plugins/hoster/XHamsterCom.py
+++ b/pyload/plugins/hoster/XHamsterCom.py
@@ -5,7 +5,7 @@ import re
 from urllib import unquote
 
 from pyload.utils import json_loads
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 def clean_json(json_expr):
diff --git a/pyload/plugins/hoster/XVideosCom.py b/pyload/plugins/hoster/XVideosCom.py
index 530858bbf..c072d7edb 100644
--- a/pyload/plugins/hoster/XVideosCom.py
+++ b/pyload/plugins/hoster/XVideosCom.py
@@ -4,7 +4,7 @@ import re
 
 from urllib import unquote
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class XVideosCom(Hoster):
diff --git a/pyload/plugins/hoster/Xdcc.py b/pyload/plugins/hoster/Xdcc.py
index de750ee58..15131bf60 100644
--- a/pyload/plugins/hoster/Xdcc.py
+++ b/pyload/plugins/hoster/Xdcc.py
@@ -10,7 +10,7 @@ from os import makedirs
 from os.path import exists, join
 from select import select
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.utils import safe_join
 
 
diff --git a/pyload/plugins/hoster/YoupornCom.py b/pyload/plugins/hoster/YoupornCom.py
index b214d820c..1c14fce00 100644
--- a/pyload/plugins/hoster/YoupornCom.py
+++ b/pyload/plugins/hoster/YoupornCom.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class YoupornCom(Hoster):
diff --git a/pyload/plugins/hoster/YourfilesTo.py b/pyload/plugins/hoster/YourfilesTo.py
index 7cb94a2df..95c4e27f5 100644
--- a/pyload/plugins/hoster/YourfilesTo.py
+++ b/pyload/plugins/hoster/YourfilesTo.py
@@ -4,7 +4,7 @@ import re
 
 from urllib import unquote
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class YourfilesTo(Hoster):
diff --git a/pyload/plugins/hoster/YoutubeCom.py b/pyload/plugins/hoster/YoutubeCom.py
index 7570ddc1d..37370c6be 100644
--- a/pyload/plugins/hoster/YoutubeCom.py
+++ b/pyload/plugins/hoster/YoutubeCom.py
@@ -6,7 +6,7 @@ import subprocess
 
 from urllib import unquote
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.plugins.internal.SimpleHoster import replace_patterns
 from pyload.utils import html_unescape
 
diff --git a/pyload/plugins/hoster/ZDF.py b/pyload/plugins/hoster/ZDF.py
index 9917955ec..2e63036b3 100644
--- a/pyload/plugins/hoster/ZDF.py
+++ b/pyload/plugins/hoster/ZDF.py
@@ -4,7 +4,7 @@ import re
 
 from xml.etree.ElementTree import fromstring
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 # Based on zdfm by Roland Beermann (http://github.com/enkore/zdfm/)
diff --git a/pyload/plugins/hoster/ZeveraCom.py b/pyload/plugins/hoster/ZeveraCom.py
index d298d42f0..aa574b405 100644
--- a/pyload/plugins/hoster/ZeveraCom.py
+++ b/pyload/plugins/hoster/ZeveraCom.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class ZeveraCom(Hoster):
diff --git a/pyload/plugins/internal/Account.py b/pyload/plugins/internal/Account.py
deleted file mode 100644
index b5125d61c..000000000
--- a/pyload/plugins/internal/Account.py
+++ /dev/null
@@ -1,305 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from random import choice
-from time import time
-from traceback import print_exc
-from threading import RLock
-
-from pyload.plugins.Plugin import Base
-from pyload.utils import compare_time, parseFileSize, lock
-
-
-class WrongPassword(Exception):
-    pass
-
-
-class Account(Base):
-    """
-    Base class for every Account plugin.
-    Just overwrite `login` and cookies will be stored and account becomes accessible in\
-    associated hoster plugin. Plugin should also provide `loadAccountInfo`
-    """
-    __name__    = "Account"
-    __type__    = "account"
-    __version__ = "0.03"
-
-    __description__ = """Base account plugin"""
-    __license__     = "GPLv3"
-    __authors__     = [("mkaay", "mkaay@mkaay.de")]
-
-
-    #: after that time (in minutes) pyload will relogin the account
-    login_timeout  = 10 * 60
-    #: after that time (in minutes) account data will be reloaded
-    info_threshold = 10 * 60
-
-
-    def __init__(self, manager, accounts):
-        Base.__init__(self, manager.core)
-
-        self.manager = manager
-        self.accounts = {}
-        self.infos = {}  #: cache for account information
-        self.lock = RLock()
-        self.timestamps = {}
-
-        self.init()
-
-        self.setAccounts(accounts)
-
-
-    def init(self):
-        pass
-
-
-    def login(self, user, data, req):
-        """login into account, the cookies will be saved so user can be recognized
-
-        :param user: loginname
-        :param data: data dictionary
-        :param req: `Request` instance
-        """
-        pass
-
-
-    @lock
-    def _login(self, user, data):
-        # set timestamp for login
-        self.timestamps[user] = time()
-
-        req = self.getAccountRequest(user)
-        try:
-            self.login(user, data, req)
-        except WrongPassword:
-            self.logWarning(
-                _("Could not login with account %(user)s | %(msg)s") % {"user": user,
-                                                                        "msg": _("Wrong Password")})
-            success = data['valid'] = False
-        except Exception, e:
-            self.logWarning(
-                _("Could not login with account %(user)s | %(msg)s") % {"user": user,
-                                                                        "msg": e})
-            success = data['valid'] = False
-            if self.core.debug:
-                print_exc()
-        else:
-            success = True
-        finally:
-            if req:
-                req.close()
-            return success
-
-
-    def relogin(self, user):
-        req = self.getAccountRequest(user)
-        if req:
-            req.cj.clear()
-            req.close()
-        if user in self.infos:
-            del self.infos[user] #delete old information
-
-        return self._login(user, self.accounts[user])
-
-
-    def setAccounts(self, accounts):
-        self.accounts = accounts
-        for user, data in self.accounts.iteritems():
-            self._login(user, data)
-            self.infos[user] = {}
-
-
-    def updateAccounts(self, user, password=None, options={}):
-        """ updates account and return true if anything changed """
-
-        if user in self.accounts:
-            self.accounts[user]['valid'] = True #do not remove or accounts will not login
-            if password:
-                self.accounts[user]['password'] = password
-                self.relogin(user)
-                return True
-            if options:
-                before = self.accounts[user]['options']
-                self.accounts[user]['options'].update(options)
-                return self.accounts[user]['options'] != before
-        else:
-            self.accounts[user] = {"password": password, "options": options, "valid": True}
-            self._login(user, self.accounts[user])
-            return True
-
-
-    def removeAccount(self, user):
-        if user in self.accounts:
-            del self.accounts[user]
-        if user in self.infos:
-            del self.infos[user]
-        if user in self.timestamps:
-            del self.timestamps[user]
-
-
-    @lock
-    def getAccountInfo(self, name, force=False):
-        """retrieve account infos for an user, do **not** overwrite this method!\\
-        just use it to retrieve infos in hoster plugins. see `loadAccountInfo`
-
-        :param name: username
-        :param force: reloads cached account information
-        :return: dictionary with information
-        """
-        data = Account.loadAccountInfo(self, name)
-
-        if force or name not in self.infos:
-            self.logDebug("Get Account Info for %s" % name)
-            req = self.getAccountRequest(name)
-
-            try:
-                infos = self.loadAccountInfo(name, req)
-                if not type(infos) == dict:
-                    raise Exception("Wrong return format")
-            except Exception, e:
-                infos = {"error": str(e)}
-                print_exc()
-
-            if req:
-                req.close()
-
-            self.logDebug("Account Info: %s" % infos)
-
-            infos['timestamp'] = time()
-            self.infos[name] = infos
-        elif "timestamp" in self.infos[name] and self.infos[name][
-                                                       "timestamp"] + self.info_threshold * 60 < time():
-            self.logDebug("Reached timeout for account data")
-            self.scheduleRefresh(name)
-
-        data.update(self.infos[name])
-        return data
-
-
-    def isPremium(self, user):
-        info = self.getAccountInfo(user)
-        return info['premium']
-
-
-    def loadAccountInfo(self, name, req=None):
-        """this should be overwritten in account plugin,\
-        and retrieving account information for user
-
-        :param name:
-        :param req: `Request` instance
-        :return:
-        """
-        return {"validuntil": None,  #: -1 for unlimited
-                "login": name,
-                # "password": self.accounts[name]['password'],  #: commented due security reason
-                "options": self.accounts[name]['options'],
-                "valid": self.accounts[name]['valid'],
-                "trafficleft": None,  #: in kb, -1 for unlimited
-                "maxtraffic": None,
-                "premium": None,
-                "timestamp": 0,  #: time this info was retrieved
-                "type": self.__name__}
-
-
-    def getAllAccounts(self, force=False):
-        return [self.getAccountInfo(user, force) for user, data in self.accounts.iteritems()]
-
-
-    def getAccountRequest(self, user=None):
-        if not user:
-            user, data = self.selectAccount()
-        if not user:
-            return None
-
-        req = self.core.requestFactory.getRequest(self.__name__, user)
-        return req
-
-
-    def getAccountCookies(self, user=None):
-        if not user:
-            user, data = self.selectAccount()
-        if not user:
-            return None
-
-        cj = self.core.requestFactory.getCookieJar(self.__name__, user)
-        return cj
-
-
-    def getAccountData(self, user):
-        return self.accounts[user]
-
-
-    def selectAccount(self):
-        """ returns an valid account name and data"""
-        usable = []
-        for user, data in self.accounts.iteritems():
-            if not data['valid']: continue
-
-            if "time" in data['options'] and data['options']['time']:
-                time_data = ""
-                try:
-                    time_data = data['options']['time'][0]
-                    start, end = time_data.split("-")
-                    if not compare_time(start.split(":"), end.split(":")):
-                        continue
-                except Exception:
-                    self.logWarning(_("Your Time %s has wrong format, use: 1:22-3:44") % time_data)
-
-            if user in self.infos:
-                if "validuntil" in self.infos[user]:
-                    if self.infos[user]['validuntil'] > 0 and time() > self.infos[user]['validuntil']:
-                        continue
-                if "trafficleft" in self.infos[user]:
-                    if self.infos[user]['trafficleft'] == 0:
-                        continue
-
-            usable.append((user, data))
-
-        if not usable: return None, None
-        return choice(usable)
-
-
-    def canUse(self):
-        return False if self.selectAccount() == (None, None) else True
-
-
-    def parseTraffic(self, string): #returns kbyte
-        return parseFileSize(string)
-
-
-    def wrongPassword(self):
-        raise WrongPassword
-
-
-    def empty(self, user):
-        if user in self.infos:
-            self.logWarning(_("Account %s has not enough traffic, checking again in 30min") % user)
-
-            self.infos[user].update({"trafficleft": 0})
-            self.scheduleRefresh(user, 30 * 60)
-
-
-    def expired(self, user):
-        if user in self.infos:
-            self.logWarning(_("Account %s is expired, checking again in 1h") % user)
-
-            self.infos[user].update({"validuntil": time() - 1})
-            self.scheduleRefresh(user, 60 * 60)
-
-
-    def scheduleRefresh(self, user, time=0, force=True):
-        """ add task to refresh account info to sheduler """
-        self.logDebug("Scheduled Account refresh for %s in %s seconds." % (user, time))
-        self.core.scheduler.addJob(time, self.getAccountInfo, [user, force])
-
-
-    @lock
-    def checkLogin(self, user):
-        """ checks if user is still logged in """
-        if user in self.timestamps:
-            if self.login_timeout > 0 and self.timestamps[user] + self.login_timeout * 60 < time():
-                self.logDebug("Reached login timeout for %s" % user)
-                return self.relogin(user)
-            else:
-                return True
-        else:
-            return False
diff --git a/pyload/plugins/internal/Addon.py b/pyload/plugins/internal/Addon.py
deleted file mode 100644
index ed5a72af8..000000000
--- a/pyload/plugins/internal/Addon.py
+++ /dev/null
@@ -1,169 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from traceback import print_exc
-
-from pyload.plugins.Plugin import Base
-
-
-class Expose(object):
-    """ used for decoration to declare rpc services """
-
-    def __new__(cls, f, *args, **kwargs):
-        addonManager.addRPC(f.__module__, f.func_name, f.func_doc)
-        return f
-
-
-def threaded(f):
-
-    def run(*args,**kwargs):
-        addonManager.startThread(f, *args, **kwargs)
-    return run
-
-
-class Addon(Base):
-    """
-    Base class for addon plugins.
-    """
-    __name__    = "Addon"
-    __type__    = "addon"
-    __version__ = "0.03"
-
-    __config__ = []  #: [("name", "type", "desc", "default")]
-
-    __description__ = """Base addon/hook plugin"""
-    __license__     = "GPLv3"
-    __authors__     = [("mkaay", "mkaay@mkaay.de"),
-                       ("RaNaN", "RaNaN@pyload.org")]
-
-
-    #: automatically register event listeners for functions, attribute will be deleted dont use it yourself
-    event_map = {}
-
-    # Alternative to event_map
-    #: List of events the plugin can handle, name the functions exactly like eventname.
-    event_list = []  #@NOTE: dont make duplicate entries in event_map
-
-
-    def __init__(self, core, manager):
-        Base.__init__(self, core)
-
-        #: Provide information in dict here, usable by API `getInfo`
-        self.info = {}
-
-        #: Callback of periodical job task, used by AddonManager
-        self.cb = None
-        self.interval = 60
-
-        #: `AddonManager`
-        self.manager = manager
-
-        #register events
-        if self.event_map:
-            for event, funcs in self.event_map.iteritems():
-                if type(funcs) in (list, tuple):
-                    for f in funcs:
-                        self.manager.addEvent(event, getattr(self,f))
-                else:
-                    self.manager.addEvent(event, getattr(self,funcs))
-
-            #delete for various reasons
-            self.event_map = None
-
-        if self.event_list:
-            for f in self.event_list:
-                self.manager.addEvent(f, getattr(self,f))
-
-            self.event_list = None
-
-        self.setup()
-
-        # self.initPeriodical()
-
-
-    def initPeriodical(self, delay=0, threaded=False):
-        self.cb = self.core.scheduler.addJob(delay, self._periodical, args=[threaded], threaded=threaded)
-
-
-    def _periodical(self, threaded):
-        if self.interval < 0:
-            self.cb = None
-            return
-
-        try:
-            self.periodical()
-
-        except Exception, e:
-            self.logError(_("Error executing addon: %s") % e)
-            if self.core.debug:
-                print_exc()
-
-        self.cb = self.core.scheduler.addJob(self.interval, self._periodical, threaded=threaded)
-
-
-    def __repr__(self):
-        return "<Addon %s>" % self.__name__
-
-
-    def setup(self):
-        """ more init stuff if needed """
-        pass
-
-
-    def unload(self):
-        """ called when addon was deactivated """
-        pass
-
-
-    def isActivated(self):
-        """ checks if addon is activated"""
-        return self.core.config.getPlugin(self.__name__, "activated")
-
-
-    #event methods - overwrite these if needed
-    def coreReady(self):
-        pass
-
-
-    def coreExiting(self):
-        pass
-
-
-    def downloadPreparing(self, pyfile):
-        pass
-
-
-    def downloadFinished(self, pyfile):
-        pass
-
-
-    def downloadFailed(self, pyfile):
-        pass
-
-
-    def packageFinished(self, pypack):
-        pass
-
-
-    def beforeReconnecting(self, ip):
-        pass
-
-
-    def afterReconnecting(self, ip):
-        pass
-
-
-    def periodical(self):
-        pass
-
-
-    def newCaptchaTask(self, task):
-        """ new captcha task for the plugin, it MUST set the handler and timeout or will be ignored """
-        pass
-
-
-    def captchaCorrect(self, task):
-        pass
-
-
-    def captchaInvalid(self, task):
-        pass
diff --git a/pyload/plugins/internal/BasePlugin.py b/pyload/plugins/internal/BasePlugin.py
index a9d81d079..a3f22b344 100644
--- a/pyload/plugins/internal/BasePlugin.py
+++ b/pyload/plugins/internal/BasePlugin.py
@@ -7,7 +7,7 @@ from urlparse import urljoin, urlparse
 
 from pyload.network.HTTPRequest import BadHeader
 from pyload.plugins.internal.SimpleHoster import create_getInfo
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 
 
 class BasePlugin(Hoster):
@@ -17,7 +17,7 @@ class BasePlugin(Hoster):
 
     __pattern__ = r'^unmatchable$'
 
-    __description__ = """Base Plugin when any other didnt fit"""
+    __description__ = """Base plugin when any other didnt fit"""
     __license__     = "GPLv3"
     __authors__     = [("RaNaN", "RaNaN@pyload.org"),
                        ("Walter Purcaro", "vuolter@gmail.com")]
diff --git a/pyload/plugins/internal/Captcha.py b/pyload/plugins/internal/Captcha.py
deleted file mode 100644
index 7197c390e..000000000
--- a/pyload/plugins/internal/Captcha.py
+++ /dev/null
@@ -1,51 +0,0 @@
-# -*- coding: utf-8 -*-
-
-import re
-
-from pyload.plugins.Plugin import Plugin
-
-
-class Captcha(Plugin):
-    __name__    = "Captcha"
-    __type__    = "captcha"
-    __version__ = "0.14"
-
-    __description__ = """Base captcha service plugin"""
-    __license__     = "GPLv3"
-    __authors__     = [("pyLoad Team", "admin@pyload.org")]
-
-
-    KEY_PATTERN = None
-
-    key = None  #: last key detected
-
-
-    def __init__(self, plugin):
-        self.plugin = plugin
-
-
-    def detect_key(self, html=None):
-        if not html:
-            if hasattr(self.plugin, "html") and self.plugin.html:
-                html = self.plugin.html
-            else:
-                errmsg = _("%s html not found") % self.__name__
-                self.plugin.error(errmsg)
-                raise TypeError(errmsg)
-
-        m = re.search(self.KEY_PATTERN, html)
-        if m:
-            self.key = m.group("KEY")
-            self.plugin.logDebug("%s key: %s" % (self.__name__, self.key))
-            return self.key
-        else:
-            self.plugin.logDebug("%s key not found" % self.__name__)
-            return None
-
-
-    def challenge(self, key=None):
-        raise NotImplementedError
-
-
-    def result(self, server, challenge):
-        raise NotImplementedError
diff --git a/pyload/plugins/internal/Container.py b/pyload/plugins/internal/Container.py
deleted file mode 100644
index 3320217ae..000000000
--- a/pyload/plugins/internal/Container.py
+++ /dev/null
@@ -1,66 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from __future__ import with_statement
-
-import re
-
-from os import remove
-from os.path import basename, exists
-
-from pyload.plugins.internal.Crypter import Crypter
-from pyload.utils import safe_join
-
-
-class Container(Crypter):
-    __name__    = "Container"
-    __type__    = "container"
-    __version__ = "0.01"
-
-    __pattern__ = r'^unmatchable$'
-    __config__  = []  #: [("name", "type", "desc", "default")]
-
-    __description__ = """Base container decrypter plugin"""
-    __license__     = "GPLv3"
-    __authors__     = [("mkaay", "mkaay@mkaay.de")]
-
-
-    def preprocessing(self, thread):
-        """prepare"""
-
-        self.setup()
-        self.thread = thread
-
-        self.loadToDisk()
-
-        self.decrypt(self.pyfile)
-        self.deleteTmp()
-
-        self.createPackages()
-
-
-    def loadToDisk(self):
-        """loads container to disk if its stored remotely and overwrite url,
-        or check existent on several places at disk"""
-
-        if self.pyfile.url.startswith("http"):
-            self.pyfile.name = re.findall("([^\/=]+)", self.pyfile.url)[-1]
-            content = self.load(self.pyfile.url)
-            self.pyfile.url = safe_join(self.core.config['general']['download_folder'], self.pyfile.name)
-            try:
-                with open(self.pyfile.url, "wb") as f:
-                    f.write(content)
-            except IOError, e:
-                self.fail(str(e))
-
-        else:
-            self.pyfile.name = basename(self.pyfile.url)
-            if not exists(self.pyfile.url):
-                if exists(safe_join(pypath, self.pyfile.url)):
-                    self.pyfile.url = safe_join(pypath, self.pyfile.url)
-                else:
-                    self.fail(_("File not exists"))
-
-
-    def deleteTmp(self):
-        if self.pyfile.name.startswith("tmp_"):
-            remove(self.pyfile.url)
diff --git a/pyload/plugins/internal/Crypter.py b/pyload/plugins/internal/Crypter.py
deleted file mode 100644
index 8580def61..000000000
--- a/pyload/plugins/internal/Crypter.py
+++ /dev/null
@@ -1,107 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from urlparse import urlparse
-
-from pyload.plugins.Plugin import Plugin
-from pyload.utils import decode, html_unescape, safe_filename
-
-
-class Crypter(Plugin):
-    __name__    = "Crypter"
-    __type__    = "crypter"
-    __version__ = "0.05"
-
-    __pattern__ = r'^unmatchable$'
-    __config__  = [("use_subfolder", "bool", "Save package to subfolder", True),  #: Overrides core.config['general']['folder_per_package']
-                   ("subfolder_per_package", "bool", "Create a subfolder for each package", True)]
-
-    __description__ = """Base decrypter plugin"""
-    __license__     = "GPLv3"
-    __authors__     = [("Walter Purcaro", "vuolter@gmail.com")]
-
-
-    html = None  #: last html loaded
-
-
-    def __init__(self, pyfile):
-        #: Put all packages here. It's a list of tuples like: ( name, [list of links], folder )
-        self.packages = []
-
-        #: List of urls, pyLoad will generate packagenames
-        self.urls = []
-
-        Plugin.__init__(self, pyfile)
-
-
-    def process(self, pyfile):
-        """ main method """
-
-        self.decrypt(pyfile)
-
-        if self.urls:
-            self.generatePackages()
-
-        elif not self.packages:
-            self.error(_("No link extracted"), "decrypt")
-
-        self.createPackages()
-
-
-    def decrypt(self, pyfile):
-        raise NotImplementedError
-
-
-    def generatePackages(self):
-        """ generate new packages from self.urls """
-
-        packages = map(lambda name, links: (name, links, None), self.core.api.generatePackages(self.urls).iteritems())
-        self.packages.extend(packages)
-
-
-    def createPackages(self):
-        """ create new packages from self.packages """
-
-        package_folder = self.pyfile.package().folder
-        package_password = self.pyfile.package().password
-        package_queue = self.pyfile.package().queue
-
-        folder_per_package = self.core.config['general']['folder_per_package']
-        try:
-            use_subfolder = self.getConfig('use_subfolder')
-        except Exception:
-            use_subfolder = folder_per_package
-        try:
-            subfolder_per_package = self.getConfig('subfolder_per_package')
-        except Exception:
-            subfolder_per_package = True
-
-        for pack in self.packages:
-            name, links, folder = pack
-
-            self.logDebug("Parsed package: %s" % name,
-                          "%d links" % len(links),
-                          "Saved to folder: %s" % folder if folder else "Saved to download folder")
-
-            links = map(decode, links)
-
-            pid = self.core.api.addPackage(name, links, package_queue)
-
-            if package_password:
-                self.core.api.setPackageData(pid, {"password": package_password})
-
-            setFolder = lambda x: self.core.api.setPackageData(pid, {"folder": x or ""})  #: Workaround to do not break API addPackage method
-
-            if use_subfolder:
-                if not subfolder_per_package:
-                    setFolder(package_folder)
-                    self.logDebug("Set package %(name)s folder to: %(folder)s" % {"name": name, "folder": folder})
-
-                elif not folder_per_package or name != folder:
-                    if not folder:
-                        folder = urlparse(html_unescape(name)).path.split("/")[-1]
-
-                    setFolder(folder)
-                    self.logDebug("Set package %(name)s folder to: %(folder)s" % {"name": name, "folder": folder})
-
-            elif folder_per_package:
-                setFolder(None)
diff --git a/pyload/plugins/internal/DeadCrypter.py b/pyload/plugins/internal/DeadCrypter.py
index 81b68e00a..427996e51 100644
--- a/pyload/plugins/internal/DeadCrypter.py
+++ b/pyload/plugins/internal/DeadCrypter.py
@@ -3,7 +3,7 @@
 from urllib import unquote
 from urlparse import urlparse
 
-from pyload.plugins.internal.Crypter import Crypter as _Crypter
+from pyload.plugins.Crypter import Crypter as _Crypter
 from pyload.plugins.internal.SimpleCrypter import create_getInfo
 
 
diff --git a/pyload/plugins/internal/DeadHoster.py b/pyload/plugins/internal/DeadHoster.py
index f066883c6..3930908d3 100644
--- a/pyload/plugins/internal/DeadHoster.py
+++ b/pyload/plugins/internal/DeadHoster.py
@@ -3,7 +3,7 @@
 from urllib import unquote
 from urlparse import urlparse
 
-from pyload.plugins.internal.Hoster import Hoster as _Hoster
+from pyload.plugins.Hoster import Hoster as _Hoster
 from pyload.plugins.internal.SimpleHoster import create_getInfo
 
 
diff --git a/pyload/plugins/internal/Hoster.py b/pyload/plugins/internal/Hoster.py
deleted file mode 100644
index ea225262e..000000000
--- a/pyload/plugins/internal/Hoster.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from pyload.plugins.Plugin import Plugin
-
-
-def getInfo(self):
-        #result = [ .. (name, size, status, url) .. ]
-        return
-
-
-class Hoster(Plugin):
-    __name__    = "Hoster"
-    __type__    = "hoster"
-    __version__ = "0.02"
-
-    __pattern__ = r'^unmatchable$'
-    __config__  = []  #: [("name", "type", "desc", "default")]
-
-    __description__ = """Base hoster plugin"""
-    __license__     = "GPLv3"
-    __authors__     = [("mkaay", "mkaay@mkaay.de")]
diff --git a/pyload/plugins/internal/MultiHoster.py b/pyload/plugins/internal/MultiHoster.py
index 44b2da565..e4783395d 100644
--- a/pyload/plugins/internal/MultiHoster.py
+++ b/pyload/plugins/internal/MultiHoster.py
@@ -2,7 +2,7 @@
 
 import re
 
-from pyload.plugins.internal.Addon import Addon
+from pyload.plugins.Addon import Addon
 from pyload.utils import remove_chars
 
 
diff --git a/pyload/plugins/internal/OCR.py b/pyload/plugins/internal/OCR.py
deleted file mode 100644
index 8e60737b6..000000000
--- a/pyload/plugins/internal/OCR.py
+++ /dev/null
@@ -1,315 +0,0 @@
-# -*- coding: utf-8 -*-
-
-from __future__ import with_statement
-
-try:
-    from PIL import Image, GifImagePlugin, JpegImagePlugin, PngImagePlugin, TiffImagePlugin
-except ImportError:
-    import Image, GifImagePlugin, JpegImagePlugin, PngImagePlugin, TiffImagePlugin
-
-import logging
-import subprocess
-
-from os.path import abspath, join
-
-
-class OCR(object):
-    __name__    = "OCR"
-    __type__    = "ocr"
-    __version__ = "0.10"
-
-    __description__ = """Base OCR plugin"""
-    __license__     = "GPLv3"
-    __authors__     = [("pyLoad Team", "admin@pyload.org")]
-
-
-    def __init__(self):
-        self.logger = logging.getLogger("log")
-
-
-    def load_image(self, image):
-        self.image = Image.open(image)
-        self.pixels = self.image.load()
-        self.result_captcha = ''
-
-
-    def unload(self):
-        """delete all tmp images"""
-        pass
-
-
-    def threshold(self, value):
-        self.image = self.image.point(lambda a: a * value + 10)
-
-
-    def run(self, command):
-        """Run a command"""
-
-        popen = subprocess.Popen(command, bufsize=-1, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-        popen.wait()
-        output = popen.stdout.read() + " | " + popen.stderr.read()
-        popen.stdout.close()
-        popen.stderr.close()
-        self.logger.debug("Tesseract ReturnCode %s Output: %s" % (popen.returncode, output))
-
-
-    def run_tesser(self, subset=False, digits=True, lowercase=True, uppercase=True):
-        #tmpTif = tempfile.NamedTemporaryFile(suffix=".tif")
-        try:
-            tmpTif = open(join("tmp", "tmpTif_%s.tif" % self.__name__), "wb")
-            tmpTif.close()
-
-            #tmpTxt = tempfile.NamedTemporaryFile(suffix=".txt")
-            tmpTxt = open(join("tmp", "tmpTxt_%s.txt" % self.__name__), "wb")
-            tmpTxt.close()
-
-        except IOError, e:
-            self.logError(e)
-            return
-
-        self.logger.debug("save tiff")
-        self.image.save(tmpTif.name, 'TIFF')
-
-        if os.name == "nt":
-            tessparams = [join(pypath, "tesseract", "tesseract.exe")]
-        else:
-            tessparams = ['tesseract']
-
-        tessparams.extend([abspath(tmpTif.name), abspath(tmpTxt.name).replace(".txt", "")] )
-
-        if subset and (digits or lowercase or uppercase):
-            #tmpSub = tempfile.NamedTemporaryFile(suffix=".subset")
-            with open(join("tmp", "tmpSub_%s.subset" % self.__name__), "wb") as tmpSub:
-                tmpSub.write("tessedit_char_whitelist ")
-
-                if digits:
-                    tmpSub.write("0123456789")
-                if lowercase:
-                    tmpSub.write("abcdefghijklmnopqrstuvwxyz")
-                if uppercase:
-                    tmpSub.write("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
-
-                tmpSub.write("\n")
-                tessparams.append("nobatch")
-                tessparams.append(abspath(tmpSub.name))
-
-        self.logger.debug("run tesseract")
-        self.run(tessparams)
-        self.logger.debug("read txt")
-
-        try:
-            with open(tmpTxt.name, 'r') as f:
-                self.result_captcha = f.read().replace("\n", "")
-        except Exception:
-            self.result_captcha = ""
-
-        self.logger.debug(self.result_captcha)
-        try:
-            os.remove(tmpTif.name)
-            os.remove(tmpTxt.name)
-            if subset and (digits or lowercase or uppercase):
-                os.remove(tmpSub.name)
-        except Exception:
-            pass
-
-
-    def get_captcha(self, name):
-        raise NotImplementedError
-
-
-    def to_greyscale(self):
-        if self.image.mode != 'L':
-            self.image = self.image.convert('L')
-
-        self.pixels = self.image.load()
-
-
-    def eval_black_white(self, limit):
-        self.pixels = self.image.load()
-        w, h = self.image.size
-        for x in xrange(w):
-            for y in xrange(h):
-                if self.pixels[x, y] > limit:
-                    self.pixels[x, y] = 255
-                else:
-                    self.pixels[x, y] = 0
-
-
-    def clean(self, allowed):
-        pixels = self.pixels
-
-        w, h = self.image.size
-
-        for x in xrange(w):
-            for y in xrange(h):
-                if pixels[x, y] == 255:
-                    continue
-                # No point in processing white pixels since we only want to remove black pixel
-                count = 0
-
-                try:
-                    if pixels[x - 1, y - 1] != 255:
-                        count += 1
-                    if pixels[x - 1, y] != 255:
-                        count += 1
-                    if pixels[x - 1, y + 1] != 255:
-                        count += 1
-                    if pixels[x, y + 1] != 255:
-                        count += 1
-                    if pixels[x + 1, y + 1] != 255:
-                        count += 1
-                    if pixels[x + 1, y] != 255:
-                        count += 1
-                    if pixels[x + 1, y - 1] != 255:
-                        count += 1
-                    if pixels[x, y - 1] != 255:
-                        count += 1
-                except Exception:
-                    pass
-
-                # not enough neighbors are dark pixels so mark this pixel
-                # to be changed to white
-                if count < allowed:
-                    pixels[x, y] = 1
-
-        # second pass: this time set all 1's to 255 (white)
-        for x in xrange(w):
-            for y in xrange(h):
-                if pixels[x, y] == 1:
-                    pixels[x, y] = 255
-
-        self.pixels = pixels
-
-
-    def derotate_by_average(self):
-        """rotate by checking each angle and guess most suitable"""
-
-        w, h = self.image.size
-        pixels = self.pixels
-
-        for x in xrange(w):
-            for y in xrange(h):
-                if pixels[x, y] == 0:
-                    pixels[x, y] = 155
-
-        highest = {}
-        counts = {}
-
-        for angle in xrange(-45, 45):
-
-            tmpimage = self.image.rotate(angle)
-
-            pixels = tmpimage.load()
-
-            w, h = self.image.size
-
-            for x in xrange(w):
-                for y in xrange(h):
-                    if pixels[x, y] == 0:
-                        pixels[x, y] = 255
-
-            count = {}
-
-            for x in xrange(w):
-                count[x] = 0
-                for y in xrange(h):
-                    if pixels[x, y] == 155:
-                        count[x] += 1
-
-            sum = 0
-            cnt = 0
-
-            for x in count.values():
-                if x != 0:
-                    sum += x
-                    cnt += 1
-
-            avg = sum / cnt
-            counts[angle] = cnt
-            highest[angle] = 0
-            for x in count.values():
-                if x > highest[angle]:
-                    highest[angle] = x
-
-            highest[angle] = highest[angle] - avg
-
-        hkey = 0
-        hvalue = 0
-
-        for key, value in highest.iteritems():
-            if value > hvalue:
-                hkey = key
-                hvalue = value
-
-        self.image = self.image.rotate(hkey)
-        pixels = self.image.load()
-
-        for x in xrange(w):
-            for y in xrange(h):
-                if pixels[x, y] == 0:
-                    pixels[x, y] = 255
-
-                if pixels[x, y] == 155:
-                    pixels[x, y] = 0
-
-        self.pixels = pixels
-
-
-    def split_captcha_letters(self):
-        captcha = self.image
-        started = False
-        letters = []
-        width, height = captcha.size
-        bottomY, topY = 0, height
-        pixels = captcha.load()
-
-        for x in xrange(width):
-            black_pixel_in_col = False
-            for y in xrange(height):
-                if pixels[x, y] != 255:
-                    if not started:
-                        started = True
-                        firstX = x
-                        lastX = x
-
-                    if y > bottomY:
-                        bottomY = y
-                    if y < topY:
-                        topY = y
-                    if x > lastX:
-                        lastX = x
-
-                    black_pixel_in_col = True
-
-            if black_pixel_in_col is False and started is True:
-                rect = (firstX, topY, lastX, bottomY)
-                new_captcha = captcha.crop(rect)
-
-                w, h = new_captcha.size
-                if w > 5 and h > 5:
-                    letters.append(new_captcha)
-
-                started = False
-                bottomY, topY = 0, height
-
-        return letters
-
-
-    def correct(self, values, var=None):
-        if var:
-            result = var
-        else:
-            result = self.result_captcha
-
-        for key, item in values.iteritems():
-
-            if key.__class__ == str:
-                result = result.replace(key, item)
-            else:
-                for expr in key:
-                    result = result.replace(expr, item)
-
-        if var:
-            return result
-        else:
-            self.result_captcha = result
diff --git a/pyload/plugins/internal/SimpleCrypter.py b/pyload/plugins/internal/SimpleCrypter.py
index 4287c4d74..405aff9c5 100644
--- a/pyload/plugins/internal/SimpleCrypter.py
+++ b/pyload/plugins/internal/SimpleCrypter.py
@@ -4,7 +4,7 @@ import re
 
 from urlparse import urlparse
 
-from pyload.plugins.internal.Crypter import Crypter
+from pyload.plugins.Crypter import Crypter
 from pyload.plugins.internal.SimpleHoster import SimpleHoster, create_getInfo, replace_patterns, set_cookies
 from pyload.utils import fixup
 
diff --git a/pyload/plugins/internal/SimpleHoster.py b/pyload/plugins/internal/SimpleHoster.py
index ce1ddd2b6..aafbdc8bd 100644
--- a/pyload/plugins/internal/SimpleHoster.py
+++ b/pyload/plugins/internal/SimpleHoster.py
@@ -9,7 +9,7 @@ from urlparse import urljoin, urlparse
 from pyload.datatype.PyFile import statusMap as _statusMap
 from pyload.network.CookieJar import CookieJar
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Hoster import Hoster
+from pyload.plugins.Hoster import Hoster
 from pyload.utils import fixup, parseFileSize
 
 
diff --git a/pyload/plugins/internal/UpdateManager.py b/pyload/plugins/internal/UpdateManager.py
index 622374136..ee45cf7a2 100644
--- a/pyload/plugins/internal/UpdateManager.py
+++ b/pyload/plugins/internal/UpdateManager.py
@@ -7,7 +7,7 @@ from operator import itemgetter
 from os import path, remove, stat
 
 from pyload.network.RequestFactory import getURL
-from pyload.plugins.internal.Addon import Expose, Addon, threaded
+from pyload.plugins.Addon import Expose, Addon, threaded
 from pyload.utils import safe_join
 
 
diff --git a/pyload/plugins/internal/XFSAccount.py b/pyload/plugins/internal/XFSAccount.py
index a330d2ff4..7da060c4b 100644
--- a/pyload/plugins/internal/XFSAccount.py
+++ b/pyload/plugins/internal/XFSAccount.py
@@ -5,7 +5,7 @@ import re
 from time import gmtime, mktime, strptime
 from urlparse import urljoin
 
-from pyload.plugins.internal.Account import Account
+from pyload.plugins.Account import Account
 from pyload.plugins.internal.SimpleHoster import parseHtmlForm, set_cookies
 
 
diff --git a/pyload/plugins/ocr/GigasizeCom.py b/pyload/plugins/ocr/GigasizeCom.py
index c8525d000..f83ac4e14 100644
--- a/pyload/plugins/ocr/GigasizeCom.py
+++ b/pyload/plugins/ocr/GigasizeCom.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.OCR import OCR
+from pyload.plugins.OCR import OCR
 
 
 class GigasizeCom(OCR):
diff --git a/pyload/plugins/ocr/LinksaveIn.py b/pyload/plugins/ocr/LinksaveIn.py
index d597efc36..d3e85c5c3 100644
--- a/pyload/plugins/ocr/LinksaveIn.py
+++ b/pyload/plugins/ocr/LinksaveIn.py
@@ -9,7 +9,7 @@ from glob import glob
 from os import sep
 from os.path import abspath, dirname
 
-from pyload.plugins.internal.OCR import OCR
+from pyload.plugins.OCR import OCR
 
 
 class LinksaveIn(OCR):
diff --git a/pyload/plugins/ocr/NetloadIn.py b/pyload/plugins/ocr/NetloadIn.py
index 2fce55d34..a692b1df8 100644
--- a/pyload/plugins/ocr/NetloadIn.py
+++ b/pyload/plugins/ocr/NetloadIn.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.OCR import OCR
+from pyload.plugins.OCR import OCR
 
 
 class NetloadIn(OCR):
diff --git a/pyload/plugins/ocr/ShareonlineBiz.py b/pyload/plugins/ocr/ShareonlineBiz.py
index 64753cf78..d7b910240 100644
--- a/pyload/plugins/ocr/ShareonlineBiz.py
+++ b/pyload/plugins/ocr/ShareonlineBiz.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-from pyload.plugins.internal.OCR import OCR
+from pyload.plugins.OCR import OCR
 
 
 class ShareonlineBiz(OCR):
-- 
cgit v1.2.3