diff --git a/src/main/java/de/tobias/playwall/controller/PluginController.java b/src/main/java/de/tobias/playwall/controller/PluginController.java
index fa39bc74baef6fdc4b8a5010708dc626c6389b4d..24f4d671ed48a19616d8be3435a02994df30be95 100644
--- a/src/main/java/de/tobias/playwall/controller/PluginController.java
+++ b/src/main/java/de/tobias/playwall/controller/PluginController.java
@@ -1,14 +1,17 @@
 package de.tobias.playwall.controller;
 
 import de.tobias.playwall.model.Plugin;
+import de.tobias.playwall.service.ArtifactoryClient;
 import de.tobias.playwall.service.PluginService;
 import lombok.AllArgsConstructor;
+import org.springframework.core.io.Resource;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.server.ResponseStatusException;
+import reactor.core.publisher.Mono;
 
 import java.util.List;
 
@@ -18,6 +21,7 @@ import java.util.List;
 public class PluginController
 {
 	private final PluginService service;
+	private final ArtifactoryClient artifactoryClient;
 
 	@GetMapping
 	List<Plugin> getAllPlugins()
@@ -30,4 +34,11 @@ public class PluginController
 	{
 		return service.getPlugin(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
 	}
+
+	@GetMapping("/raw/{id}")
+	Mono<byte[]> getPluginExecutable(@PathVariable Integer id)
+	{
+		final Plugin plugin = service.getPlugin(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
+		return artifactoryClient.downloadArtifact(plugin);
+	}
 }
diff --git a/src/main/java/de/tobias/playwall/service/ArtifactoryClient.java b/src/main/java/de/tobias/playwall/service/ArtifactoryClient.java
index 0680ed3b3eb4477e39ecadb205a37c6086062d66..3fd498347d8d5c651999bfdcbb735ca07c674584 100644
--- a/src/main/java/de/tobias/playwall/service/ArtifactoryClient.java
+++ b/src/main/java/de/tobias/playwall/service/ArtifactoryClient.java
@@ -3,6 +3,7 @@ package de.tobias.playwall.service;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
 import de.tobias.playwall.infrastructure.ArtifactoryConfigurationProperties;
+import de.tobias.playwall.model.Plugin;
 import de.tobias.playwall.model.PluginDescription;
 import de.tobias.playwall.model.PluginManifest;
 import de.tobias.playwall.model.artifactory.Folder;
@@ -13,6 +14,7 @@ import lombok.SneakyThrows;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.web.reactive.function.client.WebClient;
+import reactor.core.publisher.Mono;
 
 import java.util.Comparator;
 import java.util.List;
@@ -89,4 +91,19 @@ public class ArtifactoryClient
 		}
 		return mapper.readValue(response.getBody().source(), PluginManifest.class);
 	}
+
+	public Mono<byte[]> downloadArtifact(Plugin plugin)
+	{
+		return webClient.get()
+				.uri("/artifactory/%s/%s/%s/%s/%s-%s.jar".formatted(
+						configurationProperties.getRepository(),
+						configurationProperties.getGroupId().replace(".", "/"),
+						plugin.getName(),
+						plugin.getVersion(),
+						plugin.getName(),
+						plugin.getVersion()
+				))
+				.retrieve()
+				.bodyToMono(byte[].class);
+	}
 }