diff --git a/debian/aegir3-provision.postinst b/debian/aegir3-provision.postinst
index d73cd4ff..bdab4d1f 100644
--- a/debian/aegir3-provision.postinst
+++ b/debian/aegir3-provision.postinst
@@ -51,6 +51,10 @@ case "$1" in
         # fix permissions on installed directories
         chown aegir:aegir "$VARLIB"
 
+        # Warn about missing composer, requiring it would break Jessie since it has no such package.
+        command -v composer >/dev/null 2>&1 || { echo "WARNING: System is missing PHP composer, please install a Debian package or see https://getcomposer.org/" >&2; }
+
+
         db_get "aegir/drush_version"
         DRUSH_VERSION="$RET"
 
@@ -88,17 +92,9 @@ case "$1" in
 
           else  # Drush versions prior to 8 aren't available as .phar's.
 
-              # Install composer.
-              COMPOSER_HOME="$HOME/.composer"
-              curl -sS https://getcomposer.org/installer | php
-              mv composer.phar /usr/local/bin/composer
-
               # Install Drush.
               su -c "composer global require drush/drush:$DRUSH_VERSION" aegir
 
-              # Add composer's bin dir to the $PATH.
-              echo "export PATH=\"\$HOME/.composer/vendor/bin:\$PATH\"" >>  ~aegir/.bashrc
-
               # Rename an old drush executable.
               if [ -f /usr/local/bin/drush ]; then
                 mv /usr/local/bin/drush /usr/local/bin/drush-old-$(date +'%Y-%m-%d')
@@ -107,6 +103,9 @@ case "$1" in
               # Symlink Drush for other users to use.
               ln -s ~aegir/.composer/vendor/bin/drush /usr/local/bin
 
+              # Add composer's bin dir to the $PATH.
+              # TODO: This should be made idempotent.
+              echo "export PATH=\"\$HOME/.composer/vendor/bin:\$PATH\"" >>  ~aegir/.bashrc
           fi
         fi
 
diff --git a/debian/control b/debian/control
index 1e86f42e..054db4ec 100644
--- a/debian/control
+++ b/debian/control
@@ -12,7 +12,7 @@ Vcs-browser: http://drupalcode.org/project/provision.git
 Package: aegir3-provision
 Architecture: all
 Depends: ${misc:Depends}, php5-cli (>= 5.3) | php7.0-cli | php7.1-cli, php5 | php7.0-xml | php7.1-xml, php5-mysql | php7.0-mysql | php7.1-mysql, mysql-client | mariadb-client, sudo, postfix | mail-transport-agent, apache2 | nginx, adduser, ucf, curl
-Recommends: mysql-server | mariadb-server, rsync
+Recommends: mysql-server | mariadb-server, rsync, composer
 Conflicts: aegir-provision, aegir-provision2, aegir2-provision
 Replaces: aegir-provision, aegir-provision2, aegir2-provision
 Description: mass Drupal hosting system - backend
diff --git a/platform/verify.provision.inc b/platform/verify.provision.inc
index f0938990..d8b43589 100644
--- a/platform/verify.provision.inc
+++ b/platform/verify.provision.inc
@@ -80,6 +80,58 @@ function drush_provision_drupal_pre_provision_verify() {
       }
     }
 
+    // Composer Install Support
+    // Step 0: if drush variable allows composer install on platforms, and check for composer executable fails, show warning.
+    if (drush_get_option('provision_composer_install_platforms', TRUE) && !shell_exec('composer')) {
+      drush_log(dt('The composer executable was not found. Install composer using instructions located at https://getcomposer.org/doc/00-intro.md#globally or, if you wish to disable composer install, set "provision_composer_install_platforms" to FALSE in the ~/.drush/drushrc.php file.'), 'warning');
+    }
+    // If drush variable allows composer install on platforms (and composer exec passed)...
+    elseif (drush_get_option('provision_composer_install_platforms', TRUE)) {
+      // Detect composer-based platform and run composer install if it has not been run yet.
+      // Step 1: Look for composer directory. Could be Drupal root. Could be the git repo_root.
+      if (provision_file()->exists(d()->root . DIRECTORY_SEPARATOR . 'composer.json')->status()) {
+        $composer_directory = d()->root;
+      }
+      elseif (d()->repo_path && provision_file()->exists(d()->repo_path . DIRECTORY_SEPARATOR . 'composer.json')->status()) {
+        $composer_directory = d()->repo_path;
+      }
+
+      // Step 2: Run composer install if composer.json is present.
+      // If drush option provision_composer_install_platforms_verify_always is set to
+      // false, only run `composer-install` if ./vendor directory is missing.
+      if (isset($composer_directory) && (!file_exists($composer_directory . DIRECTORY_SEPARATOR . 'vendor') || drush_get_option('provision_composer_install_platforms_verify_always', TRUE))) {
+
+        // Composer Install command: Do not interact, do not show download progress.
+        // Customizable by setting drush option 'provision_composer_install_command'
+        $composer_command = drush_get_option('provision_composer_install_command', 'composer install --no-interaction --no-progress --no-dev');
+        drush_log(dt("Running command @command", array(
+          '@command' => $composer_command
+        )), 'ok');
+        $start = time();
+
+        // @TODO: Implement Symfony Process component for line-by-line output logging.
+        if (drush_shell_cd_and_exec($composer_directory, $composer_command)) {
+          $stop = time();
+
+          $output = implode("\n", drush_shell_exec_output());
+          $log_status = strpos($output, 'Warning:') === FALSE? 'success': 'warning';
+
+          drush_log($output, $log_status);
+          drush_log(dt(strpos($output, 'Warning:') . "Command ran successfully in @times: @command", array(
+            '@command' => $composer_command,
+            '@time' => $stop - $start,
+          )), $log_status);
+        }
+        else {
+          drush_log(implode("\n", drush_shell_exec_output()), 'error');
+          drush_set_error('DRUSH_COMPOSER_ERROR', dt('The composer command failed in @dir: @command', array(
+            '@dir' => $composer_directory,
+            '@command' => $composer_command,
+          )));
+        }
+      }
+    }
+
     // Re-set the ROOT PATH for Drush.
     // In cases where we just build the platform Drush would have cleared this value.
     // See Drush commit 3b74d40b1228f022464b92243c16127eb613c2df
diff --git a/provision.api.php b/provision.api.php
index f527b60b..2ba2bc42 100644
--- a/provision.api.php
+++ b/provision.api.php
@@ -34,6 +34,24 @@
  *   avoid having restores error out during operations such as cloning, migrating, and restoring from
  *   backup.  Default is FALSE.
  *
+ * provision_composer_install_platforms
+ *   Set to FALSE to prevent provision from ever running `composer install`.
+ *   Default is TRUE.
+ *
+ * provision_composer_install_platforms_verify_always
+ *   By default, provision will run `composer install` every time a platform
+ *   is verified.
+ *
+ *   Set to FALSE to only run `composer install` once. If composer.json
+ *   changes, you will have to run `composer install` manually.
+ *
+ *   Default is TRUE.
+ *
+ * provision_composer_install_command
+ *
+ *   The full command to run during platform verify.
+ *   Default is 'composer install --no-interaction --no-progress --no-dev'
+ *
  */
 
 /**
