diff --git a/src/Mage/Command/BuiltIn/DeployCommand.php b/src/Mage/Command/BuiltIn/DeployCommand.php
index 42ba900..33dfe27 100644
--- a/src/Mage/Command/BuiltIn/DeployCommand.php
+++ b/src/Mage/Command/BuiltIn/DeployCommand.php
@@ -10,14 +10,12 @@
 
 namespace Mage\Command\BuiltIn;
 
-use Mage\Runtime\Exception\DeploymentException;
-use Mage\Runtime\Exception\InvalidEnvironmentException;
 use Mage\Runtime\Exception\RuntimeException;
 use Mage\Runtime\Runtime;
-use Mage\Task\ErrorException;
 use Mage\Task\ExecuteOnRollbackInterface;
 use Mage\Task\AbstractTask;
-use Mage\Task\SkipException;
+use Mage\Task\Exception\ErrorException;
+use Mage\Task\Exception\SkipException;
 use Mage\Task\TaskFactory;
 use Mage\Utils;
 use Symfony\Component\Console\Input\InputInterface;
@@ -70,37 +68,38 @@ class DeployCommand extends AbstractCommand
 
         try {
             $this->runtime->setEnvironment($input->getArgument('environment'));
-        } catch (InvalidEnvironmentException $exception) {
-            $output->writeln(sprintf('%s', $exception->getMessage()));
-            return $exception->getCode();
-        }
 
-        $output->writeln(sprintf('    Environment: %s>', $this->runtime->getEnvironment()));
-        $this->log(sprintf('Environment: %s', $this->runtime->getEnvironment()));
+            $output->writeln(sprintf('    Environment: %s>', $this->runtime->getEnvironment()));
+            $this->log(sprintf('Environment: %s', $this->runtime->getEnvironment()));
 
-        if ($this->runtime->getEnvironmentConfig('releases', false)) {
-            $this->runtime->generateReleaseId();
-            $output->writeln(sprintf('    Release ID: %s>', $this->runtime->getReleaseId()));
-            $this->log(sprintf('Release ID: %s', $this->runtime->getReleaseId()));
-        }
+            if ($this->runtime->getEnvironmentConfig('releases', false)) {
+                $this->runtime->generateReleaseId();
+                $output->writeln(sprintf('    Release ID: %s>', $this->runtime->getReleaseId()));
+                $this->log(sprintf('Release ID: %s', $this->runtime->getReleaseId()));
+            }
 
-        if ($this->runtime->getConfigOptions('log_file', false)) {
-            $output->writeln(sprintf('    Logfile: %s>', $this->runtime->getConfigOptions('log_file')));
-        }
+            if ($this->runtime->getConfigOptions('log_file', false)) {
+                $output->writeln(sprintf('    Logfile: %s>', $this->runtime->getConfigOptions('log_file')));
+            }
 
-        $output->writeln('');
-
-        try {
-            // Check if Branch is forced
             if ($input->getOption('branch') !== false) {
                 $this->runtime->setEnvironmentConfig('branch', $input->getOption('branch'));
             }
 
+            if ($this->runtime->getEnvironmentConfig('branch', false)) {
+                $output->writeln(sprintf('    Branch: %s>', $this->runtime->getEnvironmentConfig('branch')));
+            }
+
+            $output->writeln('');
+
             $this->taskFactory = new TaskFactory($this->runtime);
             $this->runDeployment($output);
-        } catch (DeploymentException $exception) {
+
+        } catch (RuntimeException $exception) {
+            $output->writeln('');
             $output->writeln(sprintf('%s', $exception->getMessage()));
-            return $exception->getCode();
+            $output->writeln('');
+            $this->statusCode = 7;
         }
 
         $output->writeln('Finished Magallanes>');
@@ -112,11 +111,11 @@ class DeployCommand extends AbstractCommand
      * Run the Deployment Process
      *
      * @param OutputInterface $output
-     * @throws DeploymentException
+     * @throws RuntimeException
      */
     protected function runDeployment(OutputInterface $output)
     {
-        // Run Pre Deploy Tasks
+        // Run "Pre Deploy" Tasks
         $this->runtime->setStage(Runtime::PRE_DEPLOY);
         $preDeployTasks = $this->runtime->getTasks();
 
@@ -133,10 +132,10 @@ class DeployCommand extends AbstractCommand
         }
 
         if (!$this->runTasks($output, $preDeployTasks)) {
-            throw new DeploymentException(sprintf('    Tasks failed on %s stage, halting deployment', $this->getStageName()), 50);
+            throw new RuntimeException(sprintf('Stage "%s" did not finished successfully, halting command.', $this->getStageName()), 50);
         }
 
-        // Run On Deploy Tasks
+        // Run "On Deploy" Tasks
         $hosts = $this->runtime->getEnvironmentConfig('hosts');
         if (count($hosts) == 0) {
             $output->writeln('    No hosts defined, skipping On Deploy tasks');
@@ -165,13 +164,14 @@ class DeployCommand extends AbstractCommand
             foreach ($hosts as $host) {
                 $this->runtime->setWorkingHost($host);
                 if (!$this->runTasks($output, $onDeployTasks)) {
-                    throw new DeploymentException(sprintf('    Tasks failed on %s> stage, halting deployment', $this->getStageName()), 50);
+                    $this->runtime->setWorkingHost(null);
+                    throw new RuntimeException(sprintf('Stage "%s" did not finished successfully, halting command.', $this->getStageName()), 50);
                 }
                 $this->runtime->setWorkingHost(null);
             }
         }
 
-        // Run On Release Tasks
+        // Run "On Release" Tasks
         $hosts = $this->runtime->getEnvironmentConfig('hosts');
         if (count($hosts) == 0) {
             $output->writeln('    No hosts defined, skipping On Release tasks');
@@ -189,13 +189,14 @@ class DeployCommand extends AbstractCommand
             foreach ($hosts as $host) {
                 $this->runtime->setWorkingHost($host);
                 if (!$this->runTasks($output, $onReleaseTasks)) {
-                    throw new DeploymentException(sprintf('    Tasks failed on %s> stage, halting deployment', $this->getStageName()), 50);
+                    $this->runtime->setWorkingHost(null);
+                    throw new RuntimeException(sprintf('Stage "%s" did not finished successfully, halting command.', $this->getStageName()), 50);
                 }
                 $this->runtime->setWorkingHost(null);
             }
         }
 
-        // Run Post Release Tasks
+        // Run "Post Release" Tasks
         $hosts = $this->runtime->getEnvironmentConfig('hosts');
         if (count($hosts) == 0) {
             $output->writeln('    No hosts defined, skipping Post Release tasks');
@@ -213,13 +214,14 @@ class DeployCommand extends AbstractCommand
             foreach ($hosts as $host) {
                 $this->runtime->setWorkingHost($host);
                 if (!$this->runTasks($output, $postReleaseTasks)) {
-                    throw new DeploymentException(sprintf('    Tasks failed on %s> stage, halting deployment', $this->getStageName()), 50);
+                    $this->runtime->setWorkingHost(null);
+                    throw new RuntimeException(sprintf('Stage "%s" did not finished successfully, halting command.', $this->getStageName()), 50);
                 }
                 $this->runtime->setWorkingHost(null);
             }
         }
 
-        // Run Post Deploy Tasks
+        // Run "Post Deploy" Tasks
         $this->runtime->setStage(Runtime::POST_DEPLOY);
         $postDeployTasks = $this->runtime->getTasks();
         if ($this->runtime->getEnvironmentConfig('releases', false) && !$this->runtime->inRollback()) {
@@ -235,7 +237,7 @@ class DeployCommand extends AbstractCommand
         }
 
         if (!$this->runTasks($output, $postDeployTasks)) {
-            throw new DeploymentException(sprintf('    Tasks failed on %s> stage, halting deployment', $this->getStageName()), 50);
+            throw new RuntimeException(sprintf('Stage "%s" did not finished successfully, halting command.', $this->getStageName()), 50);
         }
     }
 
@@ -282,19 +284,25 @@ class DeployCommand extends AbstractCommand
                         $this->log(sprintf('Task %s (%s) finished with OK', $task->getDescription(), $task->getName()));
                     } else {
                         $output->writeln('FAIL>');
-                        $this->statusCode = 500;
+                        $this->statusCode = 180;
                         $this->log(sprintf('Task %s (%s) finished with FAIL', $task->getDescription(), $task->getName()));
                     }
+
                 } catch (SkipException $exception) {
                     $succeededTasks++;
                     $output->writeln('SKIPPED>');
                     $this->log(sprintf('Task %s (%s) finished with SKIPPED, thrown SkipException', $task->getDescription(), $task->getName()));
+
                 } catch (ErrorException $exception) {
                     $output->writeln(sprintf('ERROR> [%s]', $exception->getTrimmedMessage()));
                     $this->log(sprintf('Task %s (%s) finished with FAIL, with Error "%s"', $task->getDescription(), $task->getName(), $exception->getMessage()));
-                    $this->statusCode = $exception->getCode();
+                    $this->statusCode = 190;
                 }
             }
+
+            if ($this->statusCode !== 0) {
+                break;
+            }
         }
 
         if ($succeededTasks != $totalTasks) {
@@ -303,7 +311,7 @@ class DeployCommand extends AbstractCommand
             $alertColor = 'green';
         }
 
-        $output->writeln(sprintf('    Finished %s> tasks: %d/%d> done.', $this->getStageName(), $alertColor, $succeededTasks, $totalTasks));
+        $output->writeln(sprintf('    Finished %d/%d> tasks for %s>.', $alertColor, $succeededTasks, $totalTasks, $this->getStageName()));
         $output->writeln('');
 
         return ($succeededTasks == $totalTasks);
diff --git a/src/Mage/Command/BuiltIn/Releases/ListCommand.php b/src/Mage/Command/BuiltIn/Releases/ListCommand.php
index 83d73cc..605b421 100644
--- a/src/Mage/Command/BuiltIn/Releases/ListCommand.php
+++ b/src/Mage/Command/BuiltIn/Releases/ListCommand.php
@@ -11,8 +11,6 @@
 namespace Mage\Command\BuiltIn\Releases;
 
 use Mage\Utils;
-use Mage\Runtime\Exception\InvalidEnvironmentException;
-use Mage\Runtime\Exception\DeploymentException;
 use Mage\Runtime\Exception\RuntimeException;
 use Symfony\Component\Process\Process;
 use Symfony\Component\Console\Input\InputInterface;
@@ -27,6 +25,11 @@ use Mage\Command\AbstractCommand;
  */
 class ListCommand extends AbstractCommand
 {
+    /**
+     * @var int
+     */
+    protected $statusCode = 0;
+
     /**
      * Configure the Command
      */
@@ -45,8 +48,6 @@ class ListCommand extends AbstractCommand
      * @param InputInterface $input
      * @param OutputInterface $output
      * @return int|mixed
-     * @throws DeploymentException
-     * @throws RuntimeException
      */
     protected function execute(InputInterface $input, OutputInterface $output)
     {
@@ -55,91 +56,92 @@ class ListCommand extends AbstractCommand
 
         try {
             $this->runtime->setEnvironment($input->getArgument('environment'));
-        } catch (InvalidEnvironmentException $exception) {
-            $output->writeln(sprintf('%s', $exception->getMessage()));
-            return $exception->getCode();
-        }
 
-        if (!$this->runtime->getEnvironmentConfig('releases', false)) {
-            throw new DeploymentException('Releases are not enabled', 70);
-        }
+            if (!$this->runtime->getEnvironmentConfig('releases', false)) {
+                throw new RuntimeException('Releases are not enabled', 70);
+            }
 
-        $output->writeln(sprintf('    Environment: %s>', $this->runtime->getEnvironment()));
-        $this->log(sprintf('Environment: %s', $this->runtime->getEnvironment()));
+            $output->writeln(sprintf('    Environment: %s>', $this->runtime->getEnvironment()));
+            $this->log(sprintf('Environment: %s', $this->runtime->getEnvironment()));
 
-        if ($this->runtime->getConfigOptions('log_file', false)) {
-            $output->writeln(sprintf('    Logfile: %s>', $this->runtime->getConfigOptions('log_file')));
-        }
+            if ($this->runtime->getConfigOptions('log_file', false)) {
+                $output->writeln(sprintf('    Logfile: %s>', $this->runtime->getConfigOptions('log_file')));
+            }
 
-        $output->writeln('');
-
-        $hosts = $this->runtime->getEnvironmentConfig('hosts');
-        if (count($hosts) == 0) {
-            $output->writeln('No hosts defined');
             $output->writeln('');
-        } else {
-            $hostPath = rtrim($this->runtime->getEnvironmentConfig('host_path'), '/');
 
-            foreach ($hosts as $host) {
-                $this->runtime->setWorkingHost($host);
+            $hosts = $this->runtime->getEnvironmentConfig('hosts');
+            if (count($hosts) == 0) {
+                $output->writeln('No hosts defined');
+                $output->writeln('');
+            } else {
+                $hostPath = rtrim($this->runtime->getEnvironmentConfig('host_path'), '/');
 
-                // Get List of Releases
-                $cmdListReleases = sprintf('ls -1 %s/releases', $hostPath);
+                foreach ($hosts as $host) {
+                    $this->runtime->setWorkingHost($host);
 
-                /** @var Process $process */
-                $process = $this->runtime->runRemoteCommand($cmdListReleases, false);
-                if (!$process->isSuccessful()) {
-                    throw new RuntimeException(sprintf('Unable to retrieve releases from host "%s"', $host), 80);
-                }
-
-                if (trim($process->getOutput()) != '') {
-                    $releases = explode(PHP_EOL, trim($process->getOutput()));
-                    rsort($releases);
-                } else {
-                    $releases = [];
-                }
-
-                if (count($releases) == 0) {
-                    $output->writeln(sprintf('    No releases available on host %s>:', $host));
-                } else {
-                    // Get Current Release
-                    $cmdCurrentRelease = sprintf('readlink -f %s/current', $hostPath);
+                    // Get List of Releases
+                    $cmdListReleases = sprintf('ls -1 %s/releases', $hostPath);
 
                     /** @var Process $process */
-                    $process = $this->runtime->runRemoteCommand($cmdCurrentRelease, false);
+                    $process = $this->runtime->runRemoteCommand($cmdListReleases, false);
                     if (!$process->isSuccessful()) {
-                        throw new RuntimeException(sprintf('Unable to retrieve current release from host "%s"', $host), 85);
+                        throw new RuntimeException(sprintf('Unable to retrieve releases from host "%s"', $host), 80);
                     }
 
-                    $currentReleaseId = explode('/', trim($process->getOutput()));
-                    $currentReleaseId = $currentReleaseId[count($currentReleaseId) - 1];
+                    if (trim($process->getOutput()) != '') {
+                        $releases = explode(PHP_EOL, trim($process->getOutput()));
+                        rsort($releases);
+                    } else {
+                        $releases = [];
+                    }
 
-                    $output->writeln(sprintf('    Releases on host %s>:', $host));
+                    if (count($releases) == 0) {
+                        $output->writeln(sprintf('    No releases available on host %s>:', $host));
+                    } else {
+                        // Get Current Release
+                        $cmdCurrentRelease = sprintf('readlink -f %s/current', $hostPath);
 
-                    foreach ($releases as $releaseId) {
-                        $releaseDate = Utils::getReleaseDate($releaseId);
+                        /** @var Process $process */
+                        $process = $this->runtime->runRemoteCommand($cmdCurrentRelease, false);
+                        if (!$process->isSuccessful()) {
+                            throw new RuntimeException(sprintf('Unable to retrieve current release from host "%s"', $host), 85);
+                        }
 
-                        $output->write(sprintf('        Release ID: %s> - Date: %s> [%s]',
-                            $releaseId,
-                            $releaseDate->format('Y-m-d H:i:s'),
-                            Utils::getTimeDiff($releaseDate)
-                        ));
+                        $currentReleaseId = explode('/', trim($process->getOutput()));
+                        $currentReleaseId = $currentReleaseId[count($currentReleaseId) - 1];
 
-                        if ($releaseId == $currentReleaseId) {
-                            $output->writeln(' [current]>');
-                        } else {
-                            $output->writeln('');
+                        $output->writeln(sprintf('    Releases on host %s>:', $host));
+
+                        foreach ($releases as $releaseId) {
+                            $releaseDate = Utils::getReleaseDate($releaseId);
+
+                            $output->write(sprintf('        Release ID: %s> - Date: %s> [%s]',
+                                $releaseId,
+                                $releaseDate->format('Y-m-d H:i:s'),
+                                Utils::getTimeDiff($releaseDate)
+                            ));
+
+                            if ($releaseId == $currentReleaseId) {
+                                $output->writeln(' [current]>');
+                            } else {
+                                $output->writeln('');
+                            }
                         }
                     }
-                }
 
-                $this->runtime->setWorkingHost(null);
-                $output->writeln('');
+                    $this->runtime->setWorkingHost(null);
+                    $output->writeln('');
+                }
             }
+
+        } catch (RuntimeException $exception) {
+            $output->writeln(sprintf('%s', $exception->getMessage()));
+            $this->statusCode = $exception->getCode();
         }
 
         $output->writeln('Finished Magallanes>');
 
-        return 0;
+        return $this->statusCode;
     }
 }
diff --git a/src/Mage/Command/BuiltIn/Releases/RollbackCommand.php b/src/Mage/Command/BuiltIn/Releases/RollbackCommand.php
index d92eac8..80768df 100644
--- a/src/Mage/Command/BuiltIn/Releases/RollbackCommand.php
+++ b/src/Mage/Command/BuiltIn/Releases/RollbackCommand.php
@@ -11,8 +11,7 @@
 namespace Mage\Command\BuiltIn\Releases;
 
 use Mage\Task\TaskFactory;
-use Mage\Runtime\Exception\InvalidEnvironmentException;
-use Mage\Runtime\Exception\DeploymentException;
+use Mage\Runtime\Exception\RuntimeException;
 use Symfony\Component\Process\Process;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputArgument;
@@ -26,6 +25,11 @@ use Mage\Command\BuiltIn\DeployCommand;
  */
 class RollbackCommand extends DeployCommand
 {
+    /**
+     * @var int
+     */
+    protected $statusCode = 0;
+
     /**
      * Configure the Command
      */
@@ -45,7 +49,6 @@ class RollbackCommand extends DeployCommand
      * @param InputInterface $input
      * @param OutputInterface $output
      * @return int|mixed
-     * @throws DeploymentException
      */
     protected function execute(InputInterface $input, OutputInterface $output)
     {
@@ -54,24 +57,22 @@ class RollbackCommand extends DeployCommand
 
         try {
             $this->runtime->setEnvironment($input->getArgument('environment'));
-        } catch (InvalidEnvironmentException $exception) {
-            $output->writeln(sprintf('%s', $exception->getMessage()));
-            return $exception->getCode();
-        }
 
-        if (!$this->runtime->getEnvironmentConfig('releases', false)) {
-            throw new DeploymentException('Releases are not enabled', 70);
-        }
+            if (!$this->runtime->getEnvironmentConfig('releases', false)) {
+                throw new RuntimeException('Releases are not enabled', 70);
+            }
+
+            $releaseToRollback = $input->getArgument('release');
+            if (($releaseId = $this->checkReleaseAvailability($releaseToRollback)) === false) {
+                throw new RuntimeException(sprintf('Release "%s" is not available on all hosts', $releaseToRollback), 72);
+            }
 
-        // Check if the Release exists in all hosts
-        $releaseToRollback = $input->getArgument('release');
-        if ($releaseId = $this->checkReleaseAvailability($releaseToRollback)) {
             $this->runtime->setReleaseId($releaseId)->setRollback(true);
 
             $output->writeln(sprintf('    Environment: %s>', $this->runtime->getEnvironment()));
             $this->log(sprintf('Environment: %s', $this->runtime->getEnvironment()));
 
-            $output->writeln(sprintf('    Rollback to Release ID: %s>', $this->runtime->getReleaseId()));
+            $output->writeln(sprintf('    Rollback to Release Id: %s>', $this->runtime->getReleaseId()));
             $this->log(sprintf('Release ID: %s', $this->runtime->getReleaseId()));
 
             if ($this->runtime->getConfigOptions('log_file', false)) {
@@ -80,22 +81,17 @@ class RollbackCommand extends DeployCommand
 
             $output->writeln('');
 
-            // Get the Task Factory
             $this->taskFactory = new TaskFactory($this->runtime);
+            $this->runDeployment($output);
 
-            try {
-                $this->runDeployment($output);
-            } catch (DeploymentException $exception) {
-                $output->writeln(sprintf('%s', $exception->getMessage()));
-                return $exception->getCode();
-            }
-        } else {
-            throw new DeploymentException(sprintf('Release "%s" is not available on all hosts', $releaseToRollback), 72);
+        } catch (RuntimeException $exception) {
+            $output->writeln(sprintf('%s', $exception->getMessage()));
+            $this->statusCode = $exception->getCode();
         }
 
         $output->writeln('Finished Magallanes>');
 
-        return 0;
+        return $this->statusCode;
     }
 
     /**
diff --git a/src/Mage/Runtime/Exception/DeploymentException.php b/src/Mage/Runtime/Exception/DeploymentException.php
deleted file mode 100644
index 5b2d37f..0000000
--- a/src/Mage/Runtime/Exception/DeploymentException.php
+++ /dev/null
@@ -1,20 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Mage\Runtime\Exception;
-
-/**
- * An Error occurred while Deploying
- *
- * @author Andrés Montañez 
- */
-class DeploymentException extends RuntimeException
-{
-}
diff --git a/src/Mage/Runtime/Exception/InvalidEnvironmentException.php b/src/Mage/Runtime/Exception/InvalidEnvironmentException.php
deleted file mode 100644
index 10f4359..0000000
--- a/src/Mage/Runtime/Exception/InvalidEnvironmentException.php
+++ /dev/null
@@ -1,20 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Mage\Runtime\Exception;
-
-/**
- * The provided Environment is invalid
- *
- * @author Andrés Montañez 
- */
-class InvalidEnvironmentException extends RuntimeException
-{
-}
diff --git a/src/Mage/Runtime/Runtime.php b/src/Mage/Runtime/Runtime.php
index f93ffed..f9094da 100644
--- a/src/Mage/Runtime/Runtime.php
+++ b/src/Mage/Runtime/Runtime.php
@@ -13,7 +13,7 @@ namespace Mage\Runtime;
 use Psr\Log\LoggerInterface;
 use Psr\Log\LogLevel;
 use Symfony\Component\Process\Process;
-use Mage\Runtime\Exception\InvalidEnvironmentException;
+use Mage\Runtime\Exception\RuntimeException;
 
 /**
  * Runtime is a container of all run in time configuration, stages of progress, hosts being deployed, etc.
@@ -210,7 +210,6 @@ class Runtime
      * @param mixed $key Section name
      * @param mixed $default Default value
      * @return mixed
-     * @throws InvalidEnvironmentException
      */
     public function getEnvironmentConfig($key = null, $default = null)
     {
@@ -257,7 +256,7 @@ class Runtime
      *
      * @param string $environment Environment name
      * @return Runtime
-     * @throws InvalidEnvironmentException
+     * @throws RuntimeException
      */
     public function setEnvironment($environment)
     {
@@ -266,7 +265,7 @@ class Runtime
             return $this;
         }
 
-        throw new InvalidEnvironmentException(sprintf('The environment "%s" does not exists.', $environment), 100);
+        throw new RuntimeException(sprintf('The environment "%s" does not exists.', $environment), 100);
     }
 
     /**
@@ -305,7 +304,6 @@ class Runtime
      * Retrieve the defined Tasks for the current Environment and Stage
      *
      * @return array
-     * @throws InvalidEnvironmentException
      */
     public function getTasks()
     {
@@ -405,7 +403,6 @@ class Runtime
      * @param bool $jail Jail the command
      * @param int $timeout Seconds to wait
      * @return Process
-     * @throws InvalidEnvironmentException
      */
     public function runRemoteCommand($cmd, $jail = true, $timeout = 120)
     {
diff --git a/src/Mage/Task/BuiltIn/Deploy/ReleaseTask.php b/src/Mage/Task/BuiltIn/Deploy/ReleaseTask.php
index 25779e2..8eecf3d 100644
--- a/src/Mage/Task/BuiltIn/Deploy/ReleaseTask.php
+++ b/src/Mage/Task/BuiltIn/Deploy/ReleaseTask.php
@@ -10,6 +10,7 @@
 
 namespace Mage\Task\BuiltIn\Deploy;
 
+use Mage\Task\Exception\ErrorException;
 use Mage\Task\ExecuteOnRollbackInterface;
 use Symfony\Component\Process\Process;
 use Mage\Task\AbstractTask;
@@ -33,6 +34,10 @@ class ReleaseTask extends AbstractTask implements ExecuteOnRollbackInterface
 
     public function execute()
     {
+        if (!$this->runtime->getEnvironmentConfig('releases', false)) {
+            throw new ErrorException('This task is only available with releases enabled', 40);
+        }
+
         $hostPath = rtrim($this->runtime->getEnvironmentConfig('host_path'), '/');
         $releaseId = $this->runtime->getReleaseId();
 
diff --git a/src/Mage/Task/BuiltIn/Deploy/RsyncTask.php b/src/Mage/Task/BuiltIn/Deploy/RsyncTask.php
index 5ae69ae..539981f 100644
--- a/src/Mage/Task/BuiltIn/Deploy/RsyncTask.php
+++ b/src/Mage/Task/BuiltIn/Deploy/RsyncTask.php
@@ -10,7 +10,7 @@
 
 namespace Mage\Task\BuiltIn\Deploy;
 
-use Mage\Task\ErrorException;
+use Mage\Task\Exception\ErrorException;
 use Symfony\Component\Process\Process;
 use Mage\Task\AbstractTask;
 
diff --git a/src/Mage/Task/BuiltIn/Deploy/TarGz/CleanupTask.php b/src/Mage/Task/BuiltIn/Deploy/TarGz/CleanupTask.php
index 19e64bd..10bd387 100644
--- a/src/Mage/Task/BuiltIn/Deploy/TarGz/CleanupTask.php
+++ b/src/Mage/Task/BuiltIn/Deploy/TarGz/CleanupTask.php
@@ -10,7 +10,7 @@
 
 namespace Mage\Task\BuiltIn\Deploy\TarGz;
 
-use Mage\Task\ErrorException;
+use Mage\Task\Exception\ErrorException;
 use Symfony\Component\Process\Process;
 use Mage\Task\AbstractTask;
 
diff --git a/src/Mage/Task/BuiltIn/Deploy/TarGz/CopyTask.php b/src/Mage/Task/BuiltIn/Deploy/TarGz/CopyTask.php
index 6ca3bff..a25d348 100644
--- a/src/Mage/Task/BuiltIn/Deploy/TarGz/CopyTask.php
+++ b/src/Mage/Task/BuiltIn/Deploy/TarGz/CopyTask.php
@@ -10,7 +10,7 @@
 
 namespace Mage\Task\BuiltIn\Deploy\TarGz;
 
-use Mage\Task\ErrorException;
+use Mage\Task\Exception\ErrorException;
 use Symfony\Component\Process\Process;
 use Mage\Task\AbstractTask;
 
diff --git a/src/Mage/Task/BuiltIn/Deploy/TarGz/PrepareTask.php b/src/Mage/Task/BuiltIn/Deploy/TarGz/PrepareTask.php
index 440a26b..dad36d3 100644
--- a/src/Mage/Task/BuiltIn/Deploy/TarGz/PrepareTask.php
+++ b/src/Mage/Task/BuiltIn/Deploy/TarGz/PrepareTask.php
@@ -10,7 +10,7 @@
 
 namespace Mage\Task\BuiltIn\Deploy\TarGz;
 
-use Mage\Task\ErrorException;
+use Mage\Task\Exception\ErrorException;
 use Symfony\Component\Process\Process;
 use Mage\Task\AbstractTask;
 
diff --git a/src/Mage/Task/BuiltIn/FS/AbstractFileTask.php b/src/Mage/Task/BuiltIn/FS/AbstractFileTask.php
index 1367106..4e799a6 100644
--- a/src/Mage/Task/BuiltIn/FS/AbstractFileTask.php
+++ b/src/Mage/Task/BuiltIn/FS/AbstractFileTask.php
@@ -10,7 +10,7 @@
 
 namespace Mage\Task\BuiltIn\FS;
 
-use Mage\Runtime\Exception\RuntimeException;
+use Mage\Task\Exception\ErrorException;
 use Mage\Task\AbstractTask;
 
 /**
@@ -26,7 +26,7 @@ abstract class AbstractFileTask extends AbstractTask
 
         foreach ($mandatory as $parameter) {
             if (!array_key_exists($parameter, $this->options)) {
-                throw new RuntimeException(sprintf('Parameter "%s" is not defined', $parameter));
+                throw new ErrorException(sprintf('Parameter "%s" is not defined', $parameter));
             }
         }
 
diff --git a/src/Mage/Task/BuiltIn/FS/CopyTask.php b/src/Mage/Task/BuiltIn/FS/CopyTask.php
index 3238a33..4dc7bae 100644
--- a/src/Mage/Task/BuiltIn/FS/CopyTask.php
+++ b/src/Mage/Task/BuiltIn/FS/CopyTask.php
@@ -11,6 +11,7 @@
 namespace Mage\Task\BuiltIn\FS;
 
 use Symfony\Component\Process\Process;
+use Exception;
 
 /**
  * File System Task - Copy a File
@@ -26,7 +27,12 @@ class CopyTask extends AbstractFileTask
 
     public function getDescription()
     {
-        return sprintf('[FS] Copy "%s" to "%s"', $this->getFile('from'), $this->getFile('to'));
+        try {
+            return sprintf('[FS] Copy "%s" to "%s"', $this->getFile('from'), $this->getFile('to'));
+
+        } catch (Exception $exception) {
+            return '[FS] Copy [missing parameters]';
+        }
     }
 
     public function execute()
diff --git a/src/Mage/Task/BuiltIn/FS/LinkTask.php b/src/Mage/Task/BuiltIn/FS/LinkTask.php
index 06b90fb..1ed5987 100644
--- a/src/Mage/Task/BuiltIn/FS/LinkTask.php
+++ b/src/Mage/Task/BuiltIn/FS/LinkTask.php
@@ -11,6 +11,7 @@
 namespace Mage\Task\BuiltIn\FS;
 
 use Symfony\Component\Process\Process;
+use Exception;
 
 /**
  * File System Task - Symlink a File
@@ -26,7 +27,12 @@ class LinkTask extends AbstractFileTask
 
     public function getDescription()
     {
-        return sprintf('[FS] Link "%s" to "%s"', $this->getFile('from'), $this->getFile('to'));
+        try {
+            return sprintf('[FS] Link "%s" to "%s"', $this->getFile('from'), $this->getFile('to'));
+
+        } catch (Exception $exception) {
+            return '[FS] Link [missing parameters]';
+        }
     }
 
     public function execute()
diff --git a/src/Mage/Task/BuiltIn/FS/MoveTask.php b/src/Mage/Task/BuiltIn/FS/MoveTask.php
index 4da9b94..48b44f5 100644
--- a/src/Mage/Task/BuiltIn/FS/MoveTask.php
+++ b/src/Mage/Task/BuiltIn/FS/MoveTask.php
@@ -11,6 +11,7 @@
 namespace Mage\Task\BuiltIn\FS;
 
 use Symfony\Component\Process\Process;
+use Exception;
 
 /**
  * File System Task - Move a File
@@ -26,7 +27,12 @@ class MoveTask extends AbstractFileTask
 
     public function getDescription()
     {
-        return sprintf('[FS] Move "%s" to "%s"', $this->getFile('from'), $this->getFile('to'));
+        try {
+            return sprintf('[FS] Move "%s" to "%s"', $this->getFile('from'), $this->getFile('to'));
+
+        } catch (Exception $exception) {
+            return '[FS] Move [missing parameters]';
+        }
     }
 
     public function execute()
diff --git a/src/Mage/Task/BuiltIn/FS/RemoveTask.php b/src/Mage/Task/BuiltIn/FS/RemoveTask.php
index 01726fc..443c536 100644
--- a/src/Mage/Task/BuiltIn/FS/RemoveTask.php
+++ b/src/Mage/Task/BuiltIn/FS/RemoveTask.php
@@ -11,6 +11,7 @@
 namespace Mage\Task\BuiltIn\FS;
 
 use Symfony\Component\Process\Process;
+use Exception;
 
 /**
  * File System Task - Remove a File
@@ -26,7 +27,12 @@ class RemoveTask extends AbstractFileTask
 
     public function getDescription()
     {
-        return sprintf('[FS] Remove "%s"', $this->getFile('file'));
+        try {
+            return sprintf('[FS] Remove "%s"', $this->getFile('file'));
+
+        } catch (Exception $exception) {
+            return '[FS] Remove [missing parameters]';
+        }
     }
 
     public function execute()
diff --git a/src/Mage/Task/BuiltIn/Git/ChangeBranchTask.php b/src/Mage/Task/BuiltIn/Git/ChangeBranchTask.php
index 7ad9eaa..ae1d81e 100644
--- a/src/Mage/Task/BuiltIn/Git/ChangeBranchTask.php
+++ b/src/Mage/Task/BuiltIn/Git/ChangeBranchTask.php
@@ -10,7 +10,7 @@
 
 namespace Mage\Task\BuiltIn\Git;
 
-use Mage\Task\SkipException;
+use Mage\Task\Exception\SkipException;
 use Symfony\Component\Process\Process;
 use Mage\Task\AbstractTask;
 
diff --git a/src/Mage/Task/ErrorException.php b/src/Mage/Task/Exception/ErrorException.php
similarity index 95%
rename from src/Mage/Task/ErrorException.php
rename to src/Mage/Task/Exception/ErrorException.php
index ffd565f..56b4751 100644
--- a/src/Mage/Task/ErrorException.php
+++ b/src/Mage/Task/Exception/ErrorException.php
@@ -8,7 +8,7 @@
  * file that was distributed with this source code.
  */
 
-namespace Mage\Task;
+namespace Mage\Task\Exception;
 
 use Exception;
 
diff --git a/src/Mage/Task/SkipException.php b/src/Mage/Task/Exception/SkipException.php
similarity index 92%
rename from src/Mage/Task/SkipException.php
rename to src/Mage/Task/Exception/SkipException.php
index c4f8eb8..4d23bb2 100644
--- a/src/Mage/Task/SkipException.php
+++ b/src/Mage/Task/Exception/SkipException.php
@@ -8,7 +8,7 @@
  * file that was distributed with this source code.
  */
 
-namespace Mage\Task;
+namespace Mage\Task\Exception;
 
 use Exception;
 
diff --git a/src/Mage/Tests/Command/BuiltIn/DeployCommandMiscTasksTest.php b/src/Mage/Tests/Command/BuiltIn/DeployCommandMiscTasksTest.php
index af57eb4..a7fb063 100644
--- a/src/Mage/Tests/Command/BuiltIn/DeployCommandMiscTasksTest.php
+++ b/src/Mage/Tests/Command/BuiltIn/DeployCommandMiscTasksTest.php
@@ -13,8 +13,6 @@ namespace Mage\Tests\Command\BuiltIn;
 use Mage\Command\BuiltIn\DeployCommand;
 use Mage\Tests\MageApplicationMockup;
 use Mage\Command\AbstractCommand;
-use Mage\Runtime\Exception\RuntimeException;
-use Exception;
 use Symfony\Component\Console\Tester\CommandTester;
 use PHPUnit_Framework_TestCase as TestCase;
 
@@ -95,12 +93,8 @@ class DeployCommandMiscTasksTest extends TestCase
 
         $tester = new CommandTester($command);
 
-        try {
-            $tester->execute(['command' => $command->getName(), 'environment' => 'test']);
-            $this->assertTrue(false, 'Command did not failed');
-        } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof RuntimeException);
-            $this->assertEquals('Invalid task name "invalid/task"', $exception->getMessage());
-        }
+        $tester->execute(['command' => $command->getName(), 'environment' => 'test']);
+        $this->assertEquals(7, $tester->getStatusCode());
+        $this->assertContains('Invalid task name "invalid/task"', $tester->getDisplay());
     }
 }
diff --git a/src/Mage/Tests/Command/BuiltIn/DeployCommandMiscTest.php b/src/Mage/Tests/Command/BuiltIn/DeployCommandMiscTest.php
index 940ca3d..d747d11 100644
--- a/src/Mage/Tests/Command/BuiltIn/DeployCommandMiscTest.php
+++ b/src/Mage/Tests/Command/BuiltIn/DeployCommandMiscTest.php
@@ -192,7 +192,6 @@ class DeployCommandMiscTest extends TestCase
             3 => 'composer install --optimize-autoloader',
             4 => 'composer dump-autoload --optimize',
             5 => 'rsync -e "ssh -p 22 -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" -avz --exclude=.git --exclude=./var/cache/* --exclude=./var/log/* --exclude=./web/app_dev.php ./ tester@testhost:/var/www/test',
-            6 => 'git checkout master',
         );
 
         // Check total of Executed Commands
diff --git a/src/Mage/Tests/Command/BuiltIn/Releases/ListCommandTest.php b/src/Mage/Tests/Command/BuiltIn/Releases/ListCommandTest.php
index ae92c71..d5600a3 100644
--- a/src/Mage/Tests/Command/BuiltIn/Releases/ListCommandTest.php
+++ b/src/Mage/Tests/Command/BuiltIn/Releases/ListCommandTest.php
@@ -76,13 +76,9 @@ class ListCommandTest extends TestCase
 
         $tester = new CommandTester($command);
 
-        try {
-            $tester->execute(['command' => $command->getName(), 'environment' => 'test']);
-            $this->assertTrue(false, 'Command did not failed');
-        } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof DeploymentException);
-            $this->assertEquals('Releases are not enabled', $exception->getMessage());
-        }
+        $tester->execute(['command' => $command->getName(), 'environment' => 'test']);
+        $this->assertNotEquals(0, $tester->getStatusCode());
+        $this->assertContains('Releases are not enabled', $tester->getDisplay());
     }
 
     public function testFailToGetCurrentRelease()
@@ -96,13 +92,9 @@ class ListCommandTest extends TestCase
 
         $tester = new CommandTester($command);
 
-        try {
-            $tester->execute(['command' => $command->getName(), 'environment' => 'test']);
-            $this->assertTrue(false, 'Command did not failed');
-        } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof RuntimeException);
-            $this->assertEquals('Unable to retrieve current release from host "host1"', $exception->getMessage());
-        }
+        $tester->execute(['command' => $command->getName(), 'environment' => 'test']);
+        $this->assertNotEquals(0, $tester->getStatusCode());
+        $this->assertContains('Unable to retrieve current release from host "host1"', $tester->getDisplay());
     }
 
     public function testNoReleasesAvailable()
@@ -131,13 +123,9 @@ class ListCommandTest extends TestCase
 
         $tester = new CommandTester($command);
 
-        try {
-            $tester->execute(['command' => $command->getName(), 'environment' => 'test']);
-            $this->assertTrue(false, 'Command did not failed');
-        } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof RuntimeException);
-            $this->assertEquals('Unable to retrieve releases from host "host3"', $exception->getMessage());
-        }
+        $tester->execute(['command' => $command->getName(), 'environment' => 'test']);
+        $this->assertNotEquals(0, $tester->getStatusCode());
+        $this->assertContains('Unable to retrieve releases from host "host3"', $tester->getDisplay());
     }
 
     public function testNoHosts()
diff --git a/src/Mage/Tests/Command/BuiltIn/Releases/RollbackCommandTest.php b/src/Mage/Tests/Command/BuiltIn/Releases/RollbackCommandTest.php
index 4bb61df..f198063 100644
--- a/src/Mage/Tests/Command/BuiltIn/Releases/RollbackCommandTest.php
+++ b/src/Mage/Tests/Command/BuiltIn/Releases/RollbackCommandTest.php
@@ -75,13 +75,9 @@ class RollbackCommandTest extends TestCase
 
         $tester = new CommandTester($command);
 
-        try {
-            $tester->execute(['command' => $command->getName(), 'environment' => 'test', 'release' => '20170101015115']);
-            $this->assertTrue(false, 'Command did not failed');
-        } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof DeploymentException);
-            $this->assertEquals('Releases are not enabled', $exception->getMessage());
-        }
+        $tester->execute(['command' => $command->getName(), 'environment' => 'test', 'release' => '20170101015115']);
+        $this->assertNotEquals(0, $tester->getStatusCode());
+        $this->assertContains('Releases are not enabled', $tester->getDisplay());
     }
 
     public function testRollbackReleaseNotAvailable()
@@ -95,12 +91,8 @@ class RollbackCommandTest extends TestCase
 
         $tester = new CommandTester($command);
 
-        try {
-            $tester->execute(['command' => $command->getName(), 'environment' => 'test', 'release' => '20170101015115']);
-            $this->assertTrue(false, 'Command did not failed');
-        } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof DeploymentException);
-            $this->assertEquals('Release "20170101015115" is not available on all hosts', $exception->getMessage());
-        }
+        $tester->execute(['command' => $command->getName(), 'environment' => 'test', 'release' => '20170101015115']);
+        $this->assertNotEquals(0, $tester->getStatusCode());
+        $this->assertContains('Release "20170101015115" is not available on all hosts', $tester->getDisplay());
     }
 }
diff --git a/src/Mage/Tests/Runtime/RuntimeTest.php b/src/Mage/Tests/Runtime/RuntimeTest.php
index 3dcc997..bdb0ca1 100644
--- a/src/Mage/Tests/Runtime/RuntimeTest.php
+++ b/src/Mage/Tests/Runtime/RuntimeTest.php
@@ -10,8 +10,8 @@
 
 namespace Mage\Tests\Runtime;
 
+use Mage\Runtime\Exception\RuntimeException;
 use Mage\Runtime\Runtime;
-use Mage\Runtime\Exception\InvalidEnvironmentException;
 use Exception;
 use Monolog\Logger;
 use Monolog\Handler\TestHandler;
@@ -66,7 +66,7 @@ class RuntimeTest extends TestCase
             $runtime = new Runtime();
             $runtime->setEnvironment('invalid');
         } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof InvalidEnvironmentException);
+            $this->assertTrue($exception instanceof RuntimeException);
         }
 
         try {
@@ -74,7 +74,7 @@ class RuntimeTest extends TestCase
             $runtime->setConfiguration(['environments' => ['valid' => []]]);
             $runtime->setEnvironment('invalid');
         } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof InvalidEnvironmentException);
+            $this->assertTrue($exception instanceof RuntimeException);
         }
     }
 
diff --git a/src/Mage/Tests/Task/AbstractTaskTest.php b/src/Mage/Tests/Task/AbstractTaskTest.php
index 215c760..e18da77 100644
--- a/src/Mage/Tests/Task/AbstractTaskTest.php
+++ b/src/Mage/Tests/Task/AbstractTaskTest.php
@@ -10,7 +10,7 @@
 
 namespace Mage\Tests\Task;
 
-use Mage\Task\ErrorException;
+use Mage\Task\Exception\ErrorException;
 use Exception;
 use PHPUnit_Framework_TestCase as TestCase;
 
diff --git a/src/Mage/Tests/Task/BuiltIn/FileSystemTaskTest.php b/src/Mage/Tests/Task/BuiltIn/FileSystemTaskTest.php
index b3e561d..c28c3d5 100644
--- a/src/Mage/Tests/Task/BuiltIn/FileSystemTaskTest.php
+++ b/src/Mage/Tests/Task/BuiltIn/FileSystemTaskTest.php
@@ -10,7 +10,7 @@
 
 namespace Mage\Tests\Task\BuiltIn;
 
-use Mage\Runtime\Exception\RuntimeException;
+use Mage\Task\Exception\ErrorException;
 use Mage\Task\BuiltIn\FS\CopyTask;
 use Mage\Task\BuiltIn\FS\LinkTask;
 use Mage\Task\BuiltIn\FS\MoveTask;
@@ -121,10 +121,11 @@ class FileSystemTaskTest extends TestCase
         $task->setRuntime($runtime);
 
         try {
+            $this->assertContains('[missing parameters]', $task->getDescription());
             $task->execute();
             $this->assertTrue(false, 'Task did not failed');
         } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof RuntimeException);
+            $this->assertTrue($exception instanceof ErrorException);
             $this->assertEquals('Parameter "from" is not defined', $exception->getMessage());
         }
     }
@@ -198,10 +199,11 @@ class FileSystemTaskTest extends TestCase
         $task->setRuntime($runtime);
 
         try {
+            $this->assertContains('[missing parameters]', $task->getDescription());
             $task->execute();
             $this->assertTrue(false, 'Task did not failed');
         } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof RuntimeException);
+            $this->assertTrue($exception instanceof ErrorException);
             $this->assertEquals('Parameter "from" is not defined', $exception->getMessage());
         }
     }
@@ -273,10 +275,11 @@ class FileSystemTaskTest extends TestCase
         $task->setRuntime($runtime);
 
         try {
+            $this->assertContains('[missing parameters]', $task->getDescription());
             $task->execute();
             $this->assertTrue(false, 'Task did not failed');
         } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof RuntimeException);
+            $this->assertTrue($exception instanceof ErrorException);
             $this->assertEquals('Parameter "file" is not defined', $exception->getMessage());
         }
     }
@@ -350,10 +353,11 @@ class FileSystemTaskTest extends TestCase
         $task->setRuntime($runtime);
 
         try {
+            $this->assertContains('[missing parameters]', $task->getDescription());
             $task->execute();
             $this->assertTrue(false, 'Task did not failed');
         } catch (Exception $exception) {
-            $this->assertTrue($exception instanceof RuntimeException);
+            $this->assertTrue($exception instanceof ErrorException);
             $this->assertEquals('Parameter "from" is not defined', $exception->getMessage());
         }
     }
diff --git a/src/Mage/Tests/Task/TestCaseFailTask.php b/src/Mage/Tests/Task/TestCaseFailTask.php
index b206e3a..41101e5 100644
--- a/src/Mage/Tests/Task/TestCaseFailTask.php
+++ b/src/Mage/Tests/Task/TestCaseFailTask.php
@@ -10,7 +10,7 @@
 
 namespace Mage\Tests\Task;
 
-use Mage\Task\ErrorException;
+use Mage\Task\Exception\ErrorException;
 use Mage\Task\AbstractTask;
 
 class TestCaseFailTask extends AbstractTask
diff --git a/src/Mage/Tests/UtilsTest.php b/src/Mage/Tests/UtilsTest.php
index f2c1207..307394c 100644
--- a/src/Mage/Tests/UtilsTest.php
+++ b/src/Mage/Tests/UtilsTest.php
@@ -19,9 +19,9 @@ class UtilsTest extends TestCase
 {
     public function testStageNames()
     {
-        $this->assertEquals('Pre Deployment', Utils::getStageName(Runtime::PRE_DEPLOY));
-        $this->assertEquals('On Deployment', Utils::getStageName(Runtime::ON_DEPLOY));
-        $this->assertEquals('Post Deployment', Utils::getStageName(Runtime::POST_DEPLOY));
+        $this->assertEquals('Pre Deploy', Utils::getStageName(Runtime::PRE_DEPLOY));
+        $this->assertEquals('On Deploy', Utils::getStageName(Runtime::ON_DEPLOY));
+        $this->assertEquals('Post Deploy', Utils::getStageName(Runtime::POST_DEPLOY));
         $this->assertEquals('On Release', Utils::getStageName(Runtime::ON_RELEASE));
         $this->assertEquals('Post Release', Utils::getStageName(Runtime::POST_RELEASE));
         $this->assertEquals('invalid-stage', Utils::getStageName('invalid-stage'));
diff --git a/src/Mage/Utils.php b/src/Mage/Utils.php
index eb6b866..ca5b649 100644
--- a/src/Mage/Utils.php
+++ b/src/Mage/Utils.php
@@ -30,15 +30,15 @@ class Utils
     {
         switch ($stage) {
             case Runtime::PRE_DEPLOY:
-                return 'Pre Deployment';
+                return 'Pre Deploy';
                 break;
 
             case Runtime::ON_DEPLOY:
-                return 'On Deployment';
+                return 'On Deploy';
                 break;
 
             case Runtime::POST_DEPLOY:
-                return 'Post Deployment';
+                return 'Post Deploy';
                 break;
 
             case Runtime::ON_RELEASE: