diff --git a/setup/cli/modules/deploy.php b/setup/cli/modules/deploy.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e9285479c12fa2091bf71313626a27407b3afa4
--- /dev/null
+++ b/setup/cli/modules/deploy.php
@@ -0,0 +1,57 @@
+<?php
+require_once dirname(__file__) . "/class.module.php";
+require_once dirname(__file__) . "/unpack.php";
+
+class Deployment extends Unpacker {
+    var $prologue = "Deploys osTicket into target install path";
+
+    var $epilog =
+        "Deployment is used from the continuous development model. If you
+        are following the upstream git repo, then you can use the deploy
+        script to deploy changes made by you or upstream development to your
+        installation target";
+
+    function find_root_folder() {
+        # Hop up to the root folder of this repo
+        $start = dirname(__file__);
+        for (;;) {
+            if (is_file($start . '/main.inc.php')) break;
+            $start .= '/..';
+        }
+        return realpath($start);
+    }
+
+    function run($args, $options) {
+        $this->destination = $args['install-path'];
+        if (!is_dir($this->destination))
+            if (!@mkdir($this->destination, 0751, true))
+                die("Destination path does not exist and cannot be created");
+        $this->destination = realpath($this->destination).'/';
+
+        # Determine if this is an upgrade, and if so, where the include/
+        # folder is currently located
+        $upgrade = file_exists("{$this->destination}/main.inc.php");
+
+        # Get the current value of the INCLUDE_DIR before overwriting
+        # main.inc.php
+        $include = ($upgrade) ? $this->get_include_dir()
+            : ($options['include'] ? $options['include']
+                : "{$this->destination}/include");
+        if (substr($include, -1) !== '/')
+            $include .= '/';
+
+        # Locate the upload folder
+        $root = $this->find_root_folder();
+
+        # Unpack everything but the include/ folder
+        $this->unpackage("$root/*", $this->destination, -1,
+            array("$root/setup", "$root/include", "*.md", "*.txt"));
+        # Unpack the include folder
+        $this->unpackage("$root/include/*", $include, -1);
+        if (!$upgrade && $include != "{$this->destination}/include")
+            $this->change_include_dir($include);
+    }
+}
+
+Module::register('deploy', 'Deployment');
+?>