diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ServiceManager.java b/apps/routerconsole/java/src/net/i2p/router/web/ServiceManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..493bf453fc66ea61e6433e83edd019f63ac3a801
--- /dev/null
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ServiceManager.java
@@ -0,0 +1,65 @@
+/*
+ * I2P - An anonymous, secure, and fully-distributed communication network.
+ * 
+ * ServiceManager.java
+ * 2004 The I2P Project
+ * http://www.i2p.net
+ * This code is public domain.
+ */
+
+package net.i2p.router.web;
+
+//import java.io.InputStream;
+
+import net.i2p.util.ShellCommand;
+
+/**
+ * Handles installation and uninstallation of I2P as a service.
+ * 
+ * @author hypercubus
+ */
+public class ServiceManager {
+
+    private static final boolean IS_WINDOWS = System.getProperty("os.name").startsWith("Windows") ? true : false;
+
+    private ShellCommand _shellCommand = new ShellCommand();
+
+    /**
+     * Invokes the service wrapper installation script via a shell process.
+     * 
+     * @return <code>null</code> if the installation was successful, otherwise
+     *         a <code>String</code> containing the shell output including error
+     *         messages is returned.
+     */
+    public String installService() {
+        return exec("install_i2p_service_" + (IS_WINDOWS ? "winnt.bat" : "unix"));
+    }
+
+    /**
+     * Invokes the service wrapper uninstallation script via a shell process.
+     * 
+     * @return <code>null</code> if the uninstallation was successful, otherwise
+     *         a <code>String</code> containing the shell output including error
+     *         messages is returned.
+     */
+    public String uninstallService() {
+        return exec("uninstall_i2p_service_" + (IS_WINDOWS ? "winnt.bat" : "unix"));
+    }
+
+    private String exec(String command) {
+
+//        InputStream  StdoutStream = _shellCommand.getInputStream();
+//        InputStream  StderrStream = _shellCommand.getErrorStream();
+        StringBuffer result       = null;
+
+        if (_shellCommand.executeAndWait(command))
+            return null;
+
+        else
+            if (result.toString().equals(""))
+                return null;
+
+            else
+                return result.toString();
+    }
+}