diff --git a/pandalib-bungee/pom.xml b/pandalib-bungee/pom.xml
index f6f8ae1..a090412 100644
--- a/pandalib-bungee/pom.xml
+++ b/pandalib-bungee/pom.xml
@@ -27,6 +27,12 @@
             ${bungeecord.version}
             provided
         
+
+        
+            fr.pandacube.lib
+            pandalib-core
+            ${project.version}
+        
     
 
 
\ No newline at end of file
diff --git a/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/backup/BungeeBackupConfig.java b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/backup/BungeeBackupConfig.java
new file mode 100644
index 0000000..ef108e0
--- /dev/null
+++ b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/backup/BungeeBackupConfig.java
@@ -0,0 +1,16 @@
+package fr.pandacube.lib.bungee.backup;
+
+import fr.pandacube.lib.core.backup.BackupCleaner;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+public class BungeeBackupConfig {
+    public boolean workdirBackupEnabled = true;
+    public boolean logsBackupEnabled = true;
+    public String scheduling = "0 2 * * *"; // cron format, here is everyday at 2am
+    public File backupDirectory = null;
+    public BackupCleaner workdirBackupCleaner = BackupCleaner.KEEPING_1_EVERY_N_MONTH(3).merge(BackupCleaner.KEEPING_N_LAST(5));
+    public List workdirIgnoreList = new ArrayList<>();
+}
diff --git a/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/backup/BungeeBackupManager.java b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/backup/BungeeBackupManager.java
new file mode 100644
index 0000000..2108764
--- /dev/null
+++ b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/backup/BungeeBackupManager.java
@@ -0,0 +1,46 @@
+package fr.pandacube.lib.bungee.backup;
+
+import fr.pandacube.lib.core.backup.BackupManager;
+import fr.pandacube.lib.core.backup.BackupProcess;
+import fr.pandacube.lib.core.backup.RotatedLogsBackupProcess;
+
+import java.io.File;
+
+public class BungeeBackupManager extends BackupManager {
+
+	BungeeBackupConfig config;
+	
+	public BungeeBackupManager(BungeeBackupConfig config) {
+		super(config.backupDirectory);
+		setConfig(config);
+
+		addProcess(new BungeeWorkdirProcess(this));
+		addProcess(new RotatedLogsBackupProcess(this, false, new File("logs"), "[0-9]{4}-[0-9]{2}-[0-9]{2}(-[0-9]+)?\\.log\\.gz"));
+	}
+
+	@Override
+	protected void addProcess(BackupProcess process) {
+		updateProcessConfig(process);
+		super.addProcess(process);
+	}
+
+	public void setConfig(BungeeBackupConfig config) {
+		this.config = config;
+		backupQueue.forEach(this::updateProcessConfig);
+	}
+
+
+	public void updateProcessConfig(BackupProcess process) {
+		if (process instanceof BungeeWorkdirProcess) {
+			process.setEnabled(config.workdirBackupEnabled);
+			process.setBackupCleaner(config.workdirBackupCleaner);
+			process.setScheduling(config.scheduling);
+			process.setIgnoreList(config.workdirIgnoreList);
+		}
+		else if (process instanceof RotatedLogsBackupProcess) {
+			process.setEnabled(config.logsBackupEnabled);
+		}
+	}
+
+
+}
diff --git a/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/backup/BungeeWorkdirProcess.java b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/backup/BungeeWorkdirProcess.java
new file mode 100644
index 0000000..9ea648c
--- /dev/null
+++ b/pandalib-bungee/src/main/java/fr/pandacube/lib/bungee/backup/BungeeWorkdirProcess.java
@@ -0,0 +1,69 @@
+package fr.pandacube.lib.bungee.backup;
+
+import fr.pandacube.lib.core.backup.BackupProcess;
+import fr.pandacube.lib.util.Log;
+import net.md_5.bungee.api.ChatColor;
+
+import java.io.File;
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.function.BiPredicate;
+
+public class BungeeWorkdirProcess extends BackupProcess {
+	
+	protected BungeeWorkdirProcess(BungeeBackupManager bm) {
+		super(bm, "workdir");
+	}
+
+	@Override
+	public BungeeBackupManager getBackupManager() {
+		return (BungeeBackupManager) super.getBackupManager();
+	}
+	
+	
+	public BiPredicate getFilenameFilter() {
+		return new BiPredicate() {
+			@Override
+			public boolean test(File file, String path) {
+				if (new File(getSourceDir(), "logs").equals(file))
+					return false;
+				if (file.isFile() && file.getName().endsWith(".lck"))
+					return false;
+				return BungeeWorkdirProcess.super.getFilenameFilter().test(file, path);
+			}
+		};
+	}
+	
+
+	
+	@Override
+	public File getSourceDir() {
+		return new File(".");
+	}
+
+	@Override
+	protected void onBackupStart() { }
+	
+	@Override
+	protected void onBackupEnd(boolean success) {
+		if (success)
+			setDirtySinceNow();
+	}
+
+	@Override
+	protected File getTargetDir() {
+		return new File(getBackupManager().getBackupDirectory(), "workdir");
+	}
+
+	@Override
+	protected String getDisplayName() {
+		return "workdir";
+	}
+
+
+
+	public void displayNextSchedule() {
+		Log.info("[Backup] " + ChatColor.GRAY + getDisplayName() + ChatColor.RESET + " next backup on "
+				+ DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG).format(new Date(getNext())));
+	}
+}
diff --git a/pandalib-core/src/main/java/fr/pandacube/lib/core/backup/BackupProcess.java b/pandalib-core/src/main/java/fr/pandacube/lib/core/backup/BackupProcess.java
index b1bb865..c56ea5e 100644
--- a/pandalib-core/src/main/java/fr/pandacube/lib/core/backup/BackupProcess.java
+++ b/pandalib-core/src/main/java/fr/pandacube/lib/core/backup/BackupProcess.java
@@ -59,7 +59,22 @@ public abstract class BackupProcess implements Comparable, Runnab
 
 
 
-    public abstract BiPredicate getFilenameFilter();
+    public BiPredicate getFilenameFilter() {
+        return (file, path) -> {
+            for (String exclude : ignoreList) {
+                if (exclude.startsWith("/")) { // relative to source of workdir
+                    if (path.matches(exclude.substring(1)))
+                        return false;
+                }
+                else {
+                    String name = path.substring(path.lastIndexOf("/") + 1);
+                    if (name.matches(exclude))
+                        return false;
+                }
+            }
+            return true;
+        };
+    }
 
     public abstract File getSourceDir();
 
@@ -98,6 +113,13 @@ public abstract class BackupProcess implements Comparable, Runnab
         this.backupCleaner = backupCleaner;
     }
 
+    public List getIgnoreList() {
+        return ignoreList;
+    }
+
+    public void setIgnoreList(List ignoreList) {
+        this.ignoreList = ignoreList;
+    }
 
 
 
diff --git a/pandalib-core/src/main/java/fr/pandacube/lib/core/backup/RotatedLogsBackupProcess.java b/pandalib-core/src/main/java/fr/pandacube/lib/core/backup/RotatedLogsBackupProcess.java
index c4d4ac0..a2989db 100644
--- a/pandalib-core/src/main/java/fr/pandacube/lib/core/backup/RotatedLogsBackupProcess.java
+++ b/pandalib-core/src/main/java/fr/pandacube/lib/core/backup/RotatedLogsBackupProcess.java
@@ -27,7 +27,7 @@ public class RotatedLogsBackupProcess extends BackupProcess {
 
     @Override
     public void run() {
-        // do not call super. We override the zip archive process, we just want to copy log files, here
+        // do not call super. We override the zip archive process, we just want to copy already-zipped log files.
         if (inNewThread) {
             new Thread(this::actuallyRun, "Backup Thread " + identifier).start();
         }
@@ -40,6 +40,9 @@ public class RotatedLogsBackupProcess extends BackupProcess {
 
     private void actuallyRun() {
 
+        if (!getSourceDir().isDirectory())
+            return;
+
         Log.info("[Backup] Starting for " + ChatColor.GRAY + getDisplayName() + ChatColor.RESET + " ...");
 
         try {
diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/BackupConfig.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperBackupConfig.java
similarity index 95%
rename from pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/BackupConfig.java
rename to pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperBackupConfig.java
index c24bc46..5912444 100644
--- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/BackupConfig.java
+++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperBackupConfig.java
@@ -6,7 +6,7 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
-public class BackupConfig {
+public class PaperBackupConfig {
     public boolean worldBackupEnabled = true;
     public boolean workdirBackupEnabled = true;
     public boolean logsBackupEnabled = true;
diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperBackupManager.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperBackupManager.java
index a2c6c97..354bc62 100644
--- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperBackupManager.java
+++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperBackupManager.java
@@ -26,41 +26,48 @@ public class PaperBackupManager extends BackupManager implements Listener {
 
 	private final Map compressWorlds = new HashMap<>();
 
-	BackupConfig config;
+	PaperBackupConfig config;
 	
-	public PaperBackupManager(BackupConfig config) {
+	public PaperBackupManager(PaperBackupConfig config) {
 		super(config.backupDirectory);
 		setConfig(config);
 
-		
+
 		for (final World world : Bukkit.getWorlds()) {
 			initWorldProcess(world.getName());
 		}
-		
-		initWorkdirProcess();
-
+		addProcess(new PaperWorkdirProcess(this));
 		addProcess(new RotatedLogsBackupProcess(this, true, new File("logs"), "[0-9]{4}-[0-9]{2}-[0-9]{2}(-[0-9]+)?\\.log\\.gz"));
 
 		Bukkit.getServer().getPluginManager().registerEvents(this, PandaLibPaper.getPlugin());
-		
 	}
 
-	public void setConfig(BackupConfig config) {
+	@Override
+	protected void addProcess(BackupProcess process) {
+		updateProcessConfig(process);
+		super.addProcess(process);
+	}
+
+	public void setConfig(PaperBackupConfig config) {
 		this.config = config;
-		for (BackupProcess process : backupQueue) {
-			if (process instanceof PaperWorkdirProcess) {
-				process.setEnabled(config.workdirBackupEnabled);
-				process.setBackupCleaner(config.workdirBackupCleaner);
-				process.setScheduling(config.scheduling);
-			}
-			else if (process instanceof PaperWorldProcess) {
-				process.setEnabled(config.worldBackupEnabled);
-				process.setBackupCleaner(config.worldBackupCleaner);
-				process.setScheduling(config.scheduling);
-			}
-			else if (process instanceof RotatedLogsBackupProcess) {
-				process.setEnabled(config.logsBackupEnabled);
-			}
+		backupQueue.forEach(this::updateProcessConfig);
+	}
+
+
+	public void updateProcessConfig(BackupProcess process) {
+		if (process instanceof PaperWorkdirProcess) {
+			process.setEnabled(config.workdirBackupEnabled);
+			process.setBackupCleaner(config.workdirBackupCleaner);
+			process.setScheduling(config.scheduling);
+			process.setIgnoreList(config.workdirIgnoreList);
+		}
+		else if (process instanceof PaperWorldProcess) {
+			process.setEnabled(config.worldBackupEnabled);
+			process.setBackupCleaner(config.worldBackupCleaner);
+			process.setScheduling(config.scheduling);
+		}
+		else if (process instanceof RotatedLogsBackupProcess) {
+			process.setEnabled(config.logsBackupEnabled);
 		}
 	}
 
@@ -90,20 +97,10 @@ public class PaperBackupManager extends BackupManager implements Listener {
 		if (compressWorlds.containsKey(worldName))
 			return;
 		PaperWorldProcess process = new PaperWorldProcess(this, worldName);
-		process.setEnabled(config.worldBackupEnabled);
-		process.setBackupCleaner(config.worldBackupCleaner);
-		process.setScheduling(config.scheduling);
 		addProcess(process);
 		compressWorlds.put(worldName, process);
 	}
 
-	private void initWorkdirProcess() {
-		PaperWorkdirProcess process = new PaperWorkdirProcess(this);
-		process.setEnabled(config.workdirBackupEnabled);
-		process.setBackupCleaner(config.workdirBackupCleaner);
-		process.setScheduling(config.scheduling);
-		addProcess(process);
-	}
 
 
 
diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperWorkdirProcess.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperWorkdirProcess.java
index 4454cb8..5fe07c8 100644
--- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperWorkdirProcess.java
+++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperWorkdirProcess.java
@@ -12,37 +12,19 @@ public class PaperWorkdirProcess extends PaperBackupProcess {
 	protected PaperWorkdirProcess(PaperBackupManager bm) {
 		super(bm, "workdir");
 	}
-	
-	
+
+
 	public BiPredicate getFilenameFilter() {
 		return new BiPredicate() {
-
 			@Override
 			public boolean test(File file, String path) {
-				if (globalExcluded(file, path))
-					return false;
-				for (String exclude : getBackupManager().config.workdirIgnoreList) {
-					if (exclude.startsWith("/")) { // relative to source of workdir
-						if (path.matches(exclude.substring(1)))
-							return false;
-					}
-					else {
-						String name = path.substring(path.lastIndexOf("/") + 1);
-						if (name.matches(exclude))
-							return false;
-					}
-				}
-				return true;
-			}
-
-			public boolean globalExcluded(File file, String path) {
 				if (file.isDirectory() && new File(file, "level.dat").exists())
-					return true;
+					return false;
 				if (new File(getSourceDir(), "logs").equals(file))
-					return true;
+					return false;
 				if (file.isFile() && file.getName().endsWith(".lck"))
-					return true;
-				return false;
+					return false;
+				return PaperWorkdirProcess.super.getFilenameFilter().test(file, path);
 			}
 		};
 	}
diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperWorldProcess.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperWorldProcess.java
index e4d3a2d..724f59c 100644
--- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperWorldProcess.java
+++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/backup/PaperWorldProcess.java
@@ -27,11 +27,6 @@ public class PaperWorldProcess extends PaperBackupProcess {
 	}
 	
 	
-	public BiPredicate getFilenameFilter() {
-		return (f, s) -> true;
-	}
-	
-	
 	@Override
 	public File getSourceDir() {
 		return WorldUtil.worldDir(worldName);