diff --git a/composer.json b/composer.json
index d94ede2..5fbc58c 100644
--- a/composer.json
+++ b/composer.json
@@ -7,6 +7,7 @@
     "php": ">=5.4.2",
     "sdboyer/gliph": "0.1.*",
     "symfony/class-loader": "2.4.*",
+    "symfony/console": "*",
     "symfony/dependency-injection": "2.4.*",
     "symfony/event-dispatcher": "2.4.*",
     "symfony/http-foundation": "2.4.*",
@@ -28,6 +29,7 @@
   "autoload": {
     "psr-0": {
       "Drupal\\Core": "core/lib/",
+      "Drupal\\Command": "core/lib/",
       "Drupal\\Component": "core/lib/",
       "Drupal\\Driver": "drivers/lib/"
     },
diff --git a/core/console b/core/console
new file mode 100755
index 0000000..31d8011
--- /dev/null
+++ b/core/console
@@ -0,0 +1,20 @@
+#!/usr/bin/env php
+<?php
+
+/**
+ * @file
+ * Drupal's console.
+ */
+
+require_once __DIR__ . '/vendor/autoload.php';
+
+use Drupal\Command\InstallCommand;
+use Drupal\Command\UninstallCommand;
+use Drupal\Command\CacheClearCommand;
+use Symfony\Component\Console\Application;
+
+$application = new Application();
+$application->add(new InstallCommand());
+$application->add(new UninstallCommand());
+$application->add(new CacheClearCommand());
+$application->run();
diff --git a/core/lib/Drupal/Command/CacheClearCommand.php b/core/lib/Drupal/Command/CacheClearCommand.php
new file mode 100644
index 0000000..3bcb08e
--- /dev/null
+++ b/core/lib/Drupal/Command/CacheClearCommand.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Command file for EnableCommand.
+ */
+
+namespace Drupal\Command;
+
+use Drupal\Command\CommandBootstrapBase;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class CacheClearCommand extends CommandBootstrapBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function configure() {
+    $this
+      ->setName('cache:clear')
+      ->setDescription('Clear all caches.');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function execute(InputInterface $input, OutputInterface $output) {
+    if ($this->bootstrap($output)) {
+      $output->writeln('<info>Clearing all caches...</info>');
+      \drupal_flush_all_caches();
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Command/CommandBootstrapBase.php b/core/lib/Drupal/Command/CommandBootstrapBase.php
new file mode 100644
index 0000000..72e4e8c
--- /dev/null
+++ b/core/lib/Drupal/Command/CommandBootstrapBase.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Contains ComandBoostrap
+ */
+
+namespace Drupal\Command;
+
+use Drupal\Core\DrupalKernel;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Bootstrap Drupal so we can run a console command.
+ *
+ * Subclass this so you can write a command.
+ */
+abstract class CommandBootstrapBase extends Command {
+  
+  /**
+   * Bootstrap Drupal enough that we can run commands.
+   */
+  protected function bootstrap(OutputInterface $output) {
+    // Yes, we have to require_once.
+    require_once __DIR__ . '/../../../includes/bootstrap.inc';
+    try {
+      drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
+
+      $kernel = new DrupalKernel('prod', \drupal_classloader(), TRUE);
+      $kernel->boot();
+
+      // Create a request object. We shouldn't really need this but Drupal
+      // complains if it's not present.
+      $request = Request::createFromGlobals();
+      $container = \Drupal::getContainer();
+      $container->set('request', $request);
+      $container->get('request_stack')->push($request);
+
+      drupal_bootstrap(DRUPAL_BOOTSTRAP_CODE);
+      return TRUE;
+    }
+    catch (\Exception $e) {
+      $formatter = $this->getHelperSet()->get('formatter');
+      $errorMessages = array(
+        'Insufficient Drupal to proceed.',
+        'This command requires a bootable Drupal installation.',
+      );
+      $formattedBlock = $formatter->formatBlock($errorMessages, 'error', TRUE);
+      $output->writeln($formattedBlock);
+    }
+    return FALSE;
+  }
+}
diff --git a/core/lib/Drupal/Command/InstallCommand.php b/core/lib/Drupal/Command/InstallCommand.php
new file mode 100644
index 0000000..46f04e2
--- /dev/null
+++ b/core/lib/Drupal/Command/InstallCommand.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @file
+ * Command file for EnableCommand.
+ */
+
+namespace Drupal\Command;
+
+use Drupal\Command\CommandBootstrapBase;
+use Drupal\Core\DrupalKernel;
+use Symfony\Component\HttpFoundation\Request;
+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 InstallCommand extends CommandBootstrapBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function configure() {
+    $this
+      ->setName('module:install')
+      ->setDescription('Install a module.')
+      ->addArgument(
+        'name', InputArgument::REQUIRED | InputArgument::IS_ARRAY, 'Machine name for the module.'
+      )
+      ->addOption(
+         'install-dependencies',
+         'd',
+         InputOption::VALUE_NONE,
+         'If set, try to install all dependencies.'
+      );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function execute(InputInterface $input, OutputInterface $output) {
+    $install_these_modules = $input->getArgument('name');
+    $install_dependencies = $input->getOption('install-dependencies');
+
+    $output->writeln('<comment>Trying to install:</comment> ' . implode(', ', $install_these_modules));
+
+    if ($this->bootstrap($output)) {
+      $module_handler = \Drupal::moduleHandler();
+
+      $previously_installed = array();
+      $not_installed = array();
+      $installed = array_keys($module_handler->getModuleList());
+      foreach ($install_these_modules as $module) {
+        if (in_array($module, $installed)) {
+          $previously_installed[] = $module;
+        }
+        else {
+          $not_installed[] = $module;
+        }
+      }
+      if (count($previously_installed)) {
+        $output->writeln('<info>Already installed:</info> ' . implode(', ', $previously_installed));
+      }
+      if (count($previously_installed) == count($install_these_modules)) {
+        $output->writeln('<info>All modules already installed.</info>');
+        return;
+      }
+      
+      if ($module_handler->install($not_installed, $install_dependencies)) {
+        $output->writeln('<info>Installed:</info> ' . implode(', ', $not_installed));
+      }
+      else {
+        $output->writeln('<error>Unable to install:</error> ' . implode(', ', $not_installed));
+      }
+      return;
+    }
+    $output->writeln('<error>Unable to install modules.</error>');
+  }
+
+}
diff --git a/core/lib/Drupal/Command/UninstallCommand.php b/core/lib/Drupal/Command/UninstallCommand.php
new file mode 100644
index 0000000..5838c8a
--- /dev/null
+++ b/core/lib/Drupal/Command/UninstallCommand.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @file
+ * Command file for EnableCommand.
+ */
+
+namespace Drupal\Command;
+
+use Drupal\Command\CommandBootstrapBase;
+use Drupal\Core\DrupalKernel;
+use Symfony\Component\HttpFoundation\Request;
+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 UninstallCommand extends CommandBootstrapBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function configure() {
+    $this
+      ->setName('module:uninstall')
+      ->setDescription('Uninstall a module.')
+      ->addArgument(
+        'name', InputArgument::REQUIRED | InputArgument::IS_ARRAY, 'Machine name for the module.'
+      )
+      ->addOption(
+         'uninstall-dependencies',
+         'd',
+         InputOption::VALUE_NONE,
+         'If set, try to remove unused dependencies.'
+      );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function execute(InputInterface $input, OutputInterface $output) {
+    $uninstall_these_modules = $input->getArgument('name');
+    $uninstall_dependencies = $input->getOption('uninstall-dependencies');
+
+    $output->writeln('<comment>Trying to uninstall:</comment> ' . implode(', ', $uninstall_these_modules));
+
+    if ($this->bootstrap($output)) {
+      $module_handler = \Drupal::moduleHandler();
+
+      $previously_installed = array();
+      $not_installed = array();
+      $installed = array_keys($module_handler->getModuleList());
+      foreach ($uninstall_these_modules as $module) {
+        if (in_array($module, $installed)) {
+          $previously_installed[] = $module;
+        }
+        else {
+          $not_installed[] = $module;
+        }
+      }
+      if (count($not_installed)) {
+        $output->writeln('<info>Not installed:</info> ' . implode(', ', $not_installed));
+      }
+      if (count($not_installed) == count($uninstall_these_modules)) {
+        $output->writeln('<info>None of the modules are installed.</info>');
+        return;
+      }
+
+      if ($module_handler->uninstall($previously_installed, $uninstall_dependencies)) {
+        $output->writeln('<info>Uninstalled:</info> ' . implode(', ', $previously_installed));
+      }
+      else {
+        $output->writeln('<error>Unable to uninstall:</error> ' . implode(', ', $previously_installed));
+      }
+      return;
+    }
+    $output->writeln('<error>Unable to uninstall modules.</error>');
+  }
+
+}
