diff --git a/potx-cli.php b/potx-cli.php
deleted file mode 100755
index 0239e48..0000000
--- a/potx-cli.php
+++ /dev/null
@@ -1,137 +0,0 @@
-#!/usr/bin/php
-<?php
-
-/**
- * @file
- *   Translation template generator for Drupal (command line version).
- *
- *   Extracts translatable strings from t(), t(,array()), format_plural()
- *   and other function calls, plus adds some file specific strings. Only
- *   literal strings with no embedded variables can be extracted. Generates
- *   POT files, errors are printed on STDERR.
- */
-
-if (isset($_SERVER['REQUEST_METHOD'])) {
-  // Try to prevent running this script from the web. It is not designed so.
-  print 'The potx-cli.php script is designed to be used from the command line. Please use the Drupal module web interface to extract strings through the web, instead of this script, if you prefer a web interface.';
-}
-
-// Functions shared with web based interface
-include dirname(__FILE__) .'/potx.inc';
-
-// We need a lot of resources probably, so try to set memory
-// limit higher and set unlimited time for our work.
-$memory_limit = @ini_get('memory_limit');
-if ($memory_limit != '' && $memory_limit != -1 && (int)$memory_limit < 16) {
-  // ini_get returns the original set value, such as "32M",
-  // so we check for the int version. Before PHP 5.2, this
-  // limit was less then 16M.
-  @ini_set('memory_limit', 16777216);
-}
-@set_time_limit(0);
-
-if (!defined("STDERR")) {
-  define('STDERR', fopen('php://stderr', 'w'));
-}
-
-$files = array();
-$build_mode = POTX_BUILD_SINGLE;
-$argv = $GLOBALS['argv'];
-array_shift ($argv);
-if (count($argv)) {
-  switch ($argv[0]) {
-    case '--help' :
-      print <<<END
-Drupal command line translation template generator
-Usage: potx-cli.php [OPTION]
-
-Possible options:
- --auto
-     Autodiscovers files in current folder (default).
- --files
-     Specify a list of files to generate templates for.
- --mode=core
-     Core extraction mode, .info files folded into general.pot.
- --mode=multiple
-     Multiple file output mode, .info files folded into module pot files.
- --mode=single
-     Single file output mode, every file folded into the single outpout file (default).
- --debug
-     Only perform a 'self test'.
- --help
-     Display this message.
-
-END;
-      return 1;
-      break;
-    case '--files' :
-      array_shift($argv);
-      $files = $argv;
-      break;
-    case '--mode=core' :
-      $build_mode = POTX_BUILD_CORE;
-      break;
-    case '--mode=multiple' :
-      $build_mode = POTX_BUILD_MULTIPLE;
-      break;
-    case '--mode=single' :
-      $build_mode = POTX_BUILD_SINGLE;
-      break;
-    case '--debug' :
-      $files = array(__FILE__);
-      break;
-    case '--auto' :
-      $files = _potx_explore_dir('', '*', POTX_API_CURRENT, TRUE);
-      break;
-  }
-}
-
-// Fall back to --auto, if --files are not specified
-if (empty($files)) {
-  $files = _potx_explore_dir('', '*', POTX_API_CURRENT, TRUE);
-}
-
-foreach ($files as $file) {
-  potx_status('status', "Processing $file...\n");
-  _potx_process_file($file);
-}
-
-_potx_build_files(POTX_STRING_RUNTIME, $build_mode);
-_potx_build_files(POTX_STRING_INSTALLER, POTX_BUILD_SINGLE, 'installer');
-_potx_write_files();
-potx_status('status', "\nDone.\n");
-
-return;
-
-// These are never executed, you can run potx-cli.php on itself to test it
-// -----------------------------------------------------------------------------
-
-$a = t("Double quoted test string" );
-$b = t("Test string with %variable", array('%variable' => t('variable replacement')));
-$c = t('Single qouted test string');
-$d = t("Special\ncharacters");
-$e = t('Special\ncharacters');
-$f = t("Embedded $variable");
-$g = t('Embedded $variable');
-$h = t("more \$special characters");
-$i = t('even more \$special characters');
-$j = t("Mixed 'quote' \"marks\"");
-$k = t('Mixed "quote" \'marks\'');
-$l = t('Some repeating text');
-$m = t("Some repeating text");
-$n = t(embedded_function_call(3));
-$o = format_plural($days, 'one day', '@count days');
-$p = format_plural(embedded_function_call($count), 'one day', '@count days');
-$q = t('Concatenated' . 'string.' . 'You should never do this.');
-$r = t("Test string with @complex %variables !smile", array('@complex' => time(), '%variable' => t('variables'), '!smile' => ':)'));
-
-function embedded_function_call($dummy) { return 12; }
-
-function potxcli_perm() {
-  return array("access potx data", 'administer potx data');
-}
-
-function potxcli_help($section = 'default') {
-  watchdog('help', t('Help called'));
-  return t('This is some help');
-}
diff --git a/potx.drush.inc b/potx.drush.inc
new file mode 100644
index 0000000..3da9193
--- /dev/null
+++ b/potx.drush.inc
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * @file
+ *   Translation template extractor module drush integration.
+ */
+
+/**
+ * Implements hook_drush_command().
+ *
+ * @see drush_parse_command() for a list of recognized keys.
+ *
+ * @return
+ *   An associative array describing our command.
+ */
+function potx_drush_command() {
+  $items['potx'] = array(
+    'callback' => 'potx_drush_extract',
+    'description' => 'Extract translatable strings from Drupal source code.',
+    'arguments' => array(
+      'mode' => 'potx output mode e.g. single multiple core',
+    ),
+    'options' => array(
+      'modules' => 'Comma delimited list of modules to extract translatable strings from.',
+      'files' => 'Comma delimited list of files to extract translatable strings from.',
+    ),
+    'examples' => array(
+      'potx single' => 'Extract translatable strings from applicable files in current directory and write to single output file',
+      'potx multiple --modules=example' => 'Extract translatable strings from applicable files of example module and write to module-specific output file.',
+      'potx --files=sites/all/modules/example/example.module' => 'Extract translatable strings from example.module and write to single output file.'
+    ),
+  );
+  return $items;
+}
+
+/**
+ * Implementation of hook_drush_help().
+ *
+ * This function is called whenever a drush user calls
+ * 'drush help potx'.
+ *
+ * @param
+ *   A string with the help section (prepended with 'drush:').
+ *
+ * @return
+ *   A string with the help text for our command.
+ */
+function potx_drush_help($section) {
+  if ($section == 'drush:potx') {
+    $help = dt('Generates translation templates from the given Drupal source code in the current working directory.');
+    $help .= "\n\n". dt('Possible potx modes are:');
+    $help .= "\n". dt(' single    Single file output mode, every file folded into the single output file (default).');
+    $help .= "\n". dt(' multiple  Multiple file output mode, .info files folded into module .pot files.');
+    $help .= "\n". dt(' core      Drupal core output mode, .info files folded into general.pot.');
+    $help .= "\n\n". dt('If no files are specified, potx will autodiscover files from the current working directory. You can specify concrete files to look at to limit the scope of the operation.');
+    return $help;
+  }
+}
+
+/**
+ * Drush command callback.
+ */
+function potx_drush_extract($mode = NULL) {
+  // Include library.
+  include_once drupal_get_path('module', 'potx') . '/potx.inc';
+
+  $files = array();
+  $build_mode = POTX_BUILD_SINGLE;
+
+  if (!is_null($mode) && in_array($mode, array('core', 'multiple', 'single'))) {
+    // First argument could be any of the mode names.
+    $build_mode = constant('POTX_BUILD_'. strtoupper($args[0]));
+  }
+
+  $modules_option = drush_get_option('modules');
+  $files_option = drush_get_option('files');
+
+  if (!empty($modules_option)) {
+    $modules = explode(',', $modules_option);
+    foreach ($modules as $module) {
+      $files = array_merge($files, _potx_explore_dir(drupal_get_path('module', $module), '*', POTX_API_CURRENT, TRUE));
+    }
+  }
+  elseif (!empty($files_option)) {
+    $files = explode(',', $files_option);
+  }
+  else {
+    // No file list provided so autodiscover files in current directory.
+    $files = _potx_explore_dir(drush_cwd(), '*', POTX_API_CURRENT, TRUE);
+  }
+
+  foreach ($files as $file) {
+    drush_print("Processing $file...");
+    _potx_process_file($file);
+  }
+
+  _potx_build_files(POTX_STRING_RUNTIME, $build_mode);
+  _potx_build_files(POTX_STRING_INSTALLER, POTX_BUILD_SINGLE, 'installer');
+  _potx_write_files();
+  drush_print("Done.");
+}
