diff --git a/src/de/mas/wiiu/jnus/WUDLoader.java b/src/de/mas/wiiu/jnus/WUDLoader.java
new file mode 100644
index 0000000..b51c75c
--- /dev/null
+++ b/src/de/mas/wiiu/jnus/WUDLoader.java
@@ -0,0 +1,118 @@
+/****************************************************************************
+ * Copyright (C) 2016-2019 Maschell
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ ****************************************************************************/
+package de.mas.wiiu.jnus;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+
+import de.mas.wiiu.jnus.implementations.FSTDataProviderNUSTitle;
+import de.mas.wiiu.jnus.implementations.FSTDataProviderWUDDataPartition;
+import de.mas.wiiu.jnus.implementations.NUSDataProviderWUD;
+import de.mas.wiiu.jnus.implementations.wud.WUDImage;
+import de.mas.wiiu.jnus.implementations.wud.parser.WUDGamePartition;
+import de.mas.wiiu.jnus.implementations.wud.parser.WUDInfo;
+import de.mas.wiiu.jnus.implementations.wud.parser.WUDInfoParser;
+import de.mas.wiiu.jnus.implementations.wud.reader.WUDDiscReader;
+import de.mas.wiiu.jnus.interfaces.FSTDataProvider;
+import lombok.NonNull;
+import lombok.val;
+
+public final class WUDLoader {
+
+ private WUDLoader() {
+ super();
+ }
+
+ public static WUDInfo load(String WUDPath) throws IOException, ParseException {
+ return load(WUDPath, (byte[]) null);
+ }
+
+ public static WUDInfo load(String WUDPath, File key) throws IOException, ParseException {
+ byte[] data = Files.readAllBytes(key.toPath());
+ return load(WUDPath, data);
+ }
+
+ public static WUDInfo loadDev(String WUDPath) throws IOException, ParseException {
+ return load(WUDPath, null, true);
+ }
+
+ public static WUDInfo load(String WUDPath, byte[] titleKey) throws IOException, ParseException {
+ return load(WUDPath, titleKey, false);
+ }
+
+ public static WUDInfo load(String WUDPath, byte[] titleKey, boolean forceNoKey) throws IOException, ParseException {
+ byte[] usedTitleKey = titleKey;
+ File wudFile = new File(WUDPath);
+ if (!wudFile.exists()) {
+ throw new FileNotFoundException(wudFile.getAbsolutePath() + " was not found");
+ }
+
+ WUDImage image = new WUDImage(wudFile);
+ if (usedTitleKey == null && !forceNoKey) {
+ File keyFile = new File(wudFile.getParentFile().getPath() + File.separator + Settings.WUD_KEY_FILENAME);
+ if (!keyFile.exists()) {
+ throw new FileNotFoundException(keyFile.getAbsolutePath() + " does not exist and no title key was provided.");
+ }
+ usedTitleKey = Files.readAllBytes(keyFile.toPath());
+ }
+
+ WUDInfo wudInfo = WUDInfoParser.createAndLoad(image.getWUDDiscReader(), usedTitleKey);
+
+ return wudInfo;
+ }
+
+ public static List getGamePartionsAsNUSTitles(@NonNull WUDInfo wudInfo, byte[] commonKey) throws IOException, ParseException {
+ List result = new ArrayList<>();
+
+ for (val gamePartition : wudInfo.getGamePartitions()) {
+ result.add(convertGamePartitionToNUSTitle(gamePartition, wudInfo.getWUDDiscReader(), commonKey));
+ }
+
+ return result;
+ }
+
+ public static NUSTitle convertGamePartitionToNUSTitle(WUDGamePartition gamePartition, WUDDiscReader discReader, byte[] commonKey)
+ throws IOException, ParseException {
+ final NUSTitleConfig config = new NUSTitleConfig();
+ config.setCommonKey(commonKey);
+ gamePartition.getTmd();
+ return NUSTitleLoader.loadNusTitle(config, () -> new NUSDataProviderWUD(gamePartition, discReader));
+ }
+
+ public static List getPartitonsAsFSTDataProvider(@NonNull WUDInfo wudInfo, byte[] commonKey) throws IOException, ParseException {
+ List result = new ArrayList<>();
+ for (val gamePartition : wudInfo.getGamePartitions()) {
+ NUSTitle t = convertGamePartitionToNUSTitle(gamePartition, wudInfo.getWUDDiscReader(), commonKey);
+ FSTDataProviderNUSTitle res = new FSTDataProviderNUSTitle(t);
+ res.setName(gamePartition.getPartitionName());
+ result.add(res);
+ }
+
+ for (val partition : wudInfo.getDataPartitions()) {
+ result.add(new FSTDataProviderWUDDataPartition(partition, wudInfo.getWUDDiscReader(), wudInfo.getTitleKey()));
+ }
+
+ return result;
+
+ }
+
+}