diff --git a/3rdparty b/3rdparty
index dc87ea630287f27502eba825fbb19fcc33c34c86..98fdc3a4e2f56f7d231470418222162dbf95f46a 160000
--- a/3rdparty
+++ b/3rdparty
@@ -1 +1 @@
-Subproject commit dc87ea630287f27502eba825fbb19fcc33c34c86
+Subproject commit 98fdc3a4e2f56f7d231470418222162dbf95f46a
diff --git a/apps/files/command/scan.php b/apps/files/command/scan.php
new file mode 100644
index 0000000000000000000000000000000000000000..fce4f6875d7525c4e7cec06507f9eaf66e1893f9
--- /dev/null
+++ b/apps/files/command/scan.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace OCA\Files\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Scan extends Command
+{
+	protected function configure()
+	{
+		$this
+			->setName('files:scan')
+			->setDescription('rescan filesystem')
+			->addArgument(
+					'user_id',
+					InputArgument::OPTIONAL | InputArgument::IS_ARRAY,
+					'will rescan all files of the given user(s)'
+				     )
+			->addOption(
+					'all',
+					null,
+					InputOption::VALUE_NONE,
+					'will rescan all files of all known users'
+				   )
+		;
+	}
+
+	protected function scanFiles($user, OutputInterface $output) {
+		$scanner = new \OC\Files\Utils\Scanner($user);
+		$scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function($path) use ($output) {
+			$output->writeln("Scanning <info>$path</info>");
+		});
+		$scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function($path) use ($output) {
+			$output->writeln("Scanning <info>$path</info>");
+		});
+		$scanner->scan('');
+	}
+
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		if ($input->getOption('all')) {
+			$users = \OC_User::getUsers();
+		} else {
+			$users = $input->getArgument('user_id');
+		}
+
+		foreach ($users as $user) {
+			$this->scanFiles($user, $output);
+		}
+	}
+}
diff --git a/apps/files/console/scan.php b/apps/files/console/scan.php
deleted file mode 100644
index 70183fc888af90e21b912de1b85927afe866f031..0000000000000000000000000000000000000000
--- a/apps/files/console/scan.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-if (count($argv) !== 2) {
-	echo "Usage:" . PHP_EOL;
-	echo " files:scan <user_id>" . PHP_EOL;
-	echo "  will rescan all files of the given user" . PHP_EOL;
-	echo " files:scan --all" . PHP_EOL;
-	echo "  will rescan all files of all known users" . PHP_EOL;
-	return;
-}
-
-function scanFiles($user) {
-	$scanner = new \OC\Files\Utils\Scanner($user);
-	$scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function($path) {
-		echo "Scanning $path" . PHP_EOL;
-	});
-	$scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function($path) {
-		echo "Scanning $path" . PHP_EOL;
-	});
-	$scanner->scan('');
-}
-
-if ($argv[1] === '--all') {
-	$users = OC_User::getUsers();
-} else {
-	$users = array($argv[1]);
-}
-
-foreach ($users as $user) {
-	scanFiles($user);
-}
diff --git a/console.php b/console.php
index fbe09d9bb689078424aca6e323e00c52fcc8917b..9639f60b7acc922043fcfb54531ecde0d4f5cfe6 100644
--- a/console.php
+++ b/console.php
@@ -7,6 +7,9 @@
  * See the COPYING-README file.
  */
 
+use OC\Core\Command\GreetCommand;
+use Symfony\Component\Console\Application;
+
 $RUNTIME_NOAPPS = true;
 require_once 'lib/base.php';
 
@@ -21,32 +24,8 @@ if (!OC::$CLI) {
 	exit(0);
 }
 
-$self = basename($argv[0]);
-if ($argc <= 1) {
-	$argv[1] = "help";
-}
-
-$command = $argv[1];
-array_shift($argv);
-
-switch ($command) {
-	case 'files:scan':
-		require_once 'apps/files/console/scan.php';
-		break;
-	case 'status':
-		require_once 'status.php';
-		break;
-	case 'help':
-		echo "Usage:" . PHP_EOL;
-		echo " " . $self . " <command>" . PHP_EOL;
-		echo PHP_EOL;
-		echo "Available commands:" . PHP_EOL;
-		echo " files:scan -> rescan filesystem" .PHP_EOL;
-		echo " status -> show some status information" .PHP_EOL;
-		echo " help -> show this help screen" .PHP_EOL;
-		break;
-	default:
-		echo "Unknown command '$command'" . PHP_EOL;
-		echo "For available commands type ". $self . " help" . PHP_EOL;
-		break;
-}
+$defaults = new OC_Defaults;
+$application = new Application($defaults->getName(), \OC_Util::getVersionString());
+$application->add(new OC\Core\Command\Status);
+$application->add(new OCA\Files\Command\Scan);
+$application->run();
diff --git a/core/command/status.php b/core/command/status.php
new file mode 100644
index 0000000000000000000000000000000000000000..601780257e4846372417125b43400d33265af219
--- /dev/null
+++ b/core/command/status.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace OC\Core\Command;
+
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class Status extends Command
+{
+	protected function configure()
+	{
+		$this
+			->setName('status')
+			->setDescription('show some status information')
+		;
+	}
+
+	protected function execute(InputInterface $input, OutputInterface $output)
+	{
+		$values = array(
+			'installed' => \OC_Config::getValue('installed') ? 'true' : 'false',
+			'version' => implode('.', \OC_Util::getVersion()),
+			'versionstring' => \OC_Util::getVersionString(),
+			'edition' => \OC_Util::getEditionString());
+		print_r($values);
+	}
+}
diff --git a/lib/base.php b/lib/base.php
index b5c12a683ffde21e39359ac313015630b8a7a09d..dfd7cb662fb359b35fe12789f2bb9d5e23a87160 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -358,6 +358,7 @@ class OC {
 		self::$loader->registerPrefix('Doctrine\\Common', 'doctrine/common/lib');
 		self::$loader->registerPrefix('Doctrine\\DBAL', 'doctrine/dbal/lib');
 		self::$loader->registerPrefix('Symfony\\Component\\Routing', 'symfony/routing');
+		self::$loader->registerPrefix('Symfony\\Component\\Console', 'symfony/console');
 		self::$loader->registerPrefix('Sabre\\VObject', '3rdparty');
 		self::$loader->registerPrefix('Sabre_', '3rdparty');
 		self::$loader->registerPrefix('Patchwork', '3rdparty');