diff --git a/src/ImagemagickExecManager.php b/src/ImagemagickExecManager.php
index fcf71c3..ce1513d 100644
--- a/src/ImagemagickExecManager.php
+++ b/src/ImagemagickExecManager.php
@@ -8,7 +8,6 @@ use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Session\AccountProxyInterface;
 use Drupal\Core\StringTranslation\StringTranslationTrait;
 use Psr\Log\LoggerInterface;
-use Symfony\Component\Process\Process;
 
 /**
  * Manage execution of ImageMagick/GraphicsMagick commands.
@@ -31,13 +30,6 @@ class ImagemagickExecManager implements ImagemagickExecManagerInterface {
    */
   protected $appRoot;
 
-  /**
-   * The execution timeout.
-   *
-   * @var int
-   */
-  protected $timeout = 60;
-
   /**
    * The current user.
    *
@@ -134,23 +126,6 @@ class ImagemagickExecManager implements ImagemagickExecManagerInterface {
     return $this->moduleHandler;
   }
 
-  /**
-   * Sets the execution timeout (max. runtime).
-   *
-   * To disable the timeout, set this value to null.
-   *
-   * @param int|null $timeout
-   *   The timeout in seconds.
-   *
-   * @return $this
-   *
-   * @todo in 8.x-3.0, add this method to the interface.
-   */
-  public function setTimeout($timeout) {
-    $this->timeout = $timeout;
-    return $this;
-  }
-
   /**
    * {@inheritdoc}
    */
@@ -368,22 +343,45 @@ class ImagemagickExecManager implements ImagemagickExecManagerInterface {
    * {@inheritdoc}
    */
   public function runOsShell($command, $arguments, $id, &$output = NULL, &$error = NULL) {
+    if ($this->isWindows) {
+      // Use Window's start command with the /B flag to make the process run in
+      // the background and avoid a shell command line window from showing up.
+      // @see http://us3.php.net/manual/en/function.exec.php#56599
+      // Use /D to run the command from PHP's current working directory so the
+      // file paths don't have to be absolute.
+      $command = 'start "' . $id . '" /D ' . $this->escapeShellArg($this->appRoot) . ' /B ' . $this->escapeShellArg($command);
+    }
     $command_line = $command . ' ' . $arguments;
-    $output = '';
-    $error = '';
+
+    // Executes the command on the OS via proc_open().
+    $descriptors = [
+      // This is stdin.
+      0 => ['pipe', 'r'],
+      // This is stdout.
+      1 => ['pipe', 'w'],
+      // This is stderr.
+      2 => ['pipe', 'w'],
+    ];
 
     Timer::start('imagemagick:runOsShell');
-    $process = new Process($command_line, $this->appRoot);
-    $process->setTimeout($this->timeout);
-    try {
-      $process->run();
-      $output = utf8_encode($process->getOutput());
-      $error = utf8_encode($process->getErrorOutput());
-      $return_code = $process->getExitCode();
+    if ($h = proc_open($command_line, $descriptors, $pipes, $this->appRoot)) {
+      $output = '';
+      while (!feof($pipes[1])) {
+        $output .= fgets($pipes[1]);
+      }
+      $output = utf8_encode($output);
+      $error = '';
+      while (!feof($pipes[2])) {
+        $error .= fgets($pipes[2]);
+      }
+      $error = utf8_encode($error);
+      fclose($pipes[0]);
+      fclose($pipes[1]);
+      fclose($pipes[2]);
+      $return_code = proc_close($h);
     }
-    catch (\Exception $e) {
-      $error = $e->getMessage();
-      $return_code = $process->getExitCode() ? $process->getExitCode() : 1;
+    else {
+      $return_code = FALSE;
     }
     $execution_time = Timer::stop('imagemagick:runOsShell')['time'];
 
