@Override
	public Class<?> loadClass(final String file){
		Class<?> c = null;
		
		//Replace packages to a proper folderstructure
		final String fileStub = file.replace( '.', '/' );

		final String javaFilenamePath = this.pluginRootDirectory.getAbsolutePath() + fileStub + ".java";
		final String classFilenamePath = this.pluginRootDirectory.getAbsolutePath() + fileStub + ".class";
		
		File javaFile = new File(javaFilenamePath);
		File classFile = new File(classFilenamePath);
		
		javaFile = Helper.findFileInSubfolder(javaFile, fileStub ,".java", getURLs());
		classFile = Helper.findFileInSubfolder(classFile, fileStub ,".class", getURLs());
	
		//Only compile if necessary
		if (javaFile.exists() && (!classFile.exists() || javaFile.lastModified() > classFile.lastModified())) {
			try {
				Log.getLogger().log(Level.INFO, ".class is outdated/nonexistent, compilation needed...");

				if(compile(javaFile)){
					Log.getLogger().log(Level.INFO, "Compilation succesfull!");
				} else {
					Log.getLogger().log(Level.SEVERE, "Compilation failed!");
				}
			} catch (IOException e) {
				Log.getLogger().log(Level.SEVERE, "IOException", e);
			}
		}

		//Try to...Return it if we already have loaded it
		//faster then trying to load it again.
		c = (Class<?>)this.loadedClasses.get(file);
		if (c != null) {
			return c;
		}

		//Try to...Find it via loadclass
		try {
			c = super.loadClass(file, true);
			this.loadedClasses.put(file, c);
		} catch (ClassNotFoundException e) {
			Log.getLogger().log(Level.SEVERE, "ClassNotFoundException: " + file + " not loaded!", e);
		}

		return c;
	}