diff --git a/supercron-main.inc b/supercron-main.inc
index 95a58ee..7c79ee2 100644
--- a/supercron-main.inc
+++ b/supercron-main.inc
@@ -2,7 +2,6 @@
 
 include_once(drupal_get_path('module', 'supercron') . '/supercron.inc');
 
-
 /**
  * Implement hook_help().
  */
@@ -213,15 +212,14 @@ function supercron_exit() {
     if ($execute) _supercron_parallel_call(url(supercron_autocron_url(), array('absolute'=>TRUE)));
 }
 
-
 function supercron_base_path() {
   global $base_path;
-
-  return str_replace('/index.php', '', $_SERVER['SCRIPT_FILENAME']) . $base_path;
+  return $base_path . drupal_get_path('module', 'supercron') . '/' . SUPERCRON_SCRIPT_NAME ;
 }
 
 function supercron_standard_path() {
-  return supercron_base_path() . SUPERCRON_SCRIPT_NAME;
+  global $base_path;
+  return $base_path . SUPERCRON_SCRIPT_NAME ;
 }
 
 function supercron_get_script_URL() {
@@ -246,7 +244,7 @@ function supercron_get_script_path() {
     return supercron_standard_path();
   }
   elseif ($script_path == SUPERCRON_SCRIPT_PATH_MODULE_ROOT) {
-    return str_replace('supercron.module', '', realpath(__FILE__)) . SUPERCRON_SCRIPT_NAME;
+    return supercron_base_path();
   }
   else {
     return '';
diff --git a/supercron.admin.inc b/supercron.admin.inc
index e7656ae..e3e282c 100644
--- a/supercron.admin.inc
+++ b/supercron.admin.inc
@@ -8,22 +8,27 @@
 
 include_once(drupal_get_path('module', 'supercron') . '/supercron-main.inc');
 
+function _supercron_show_script_warning() {
+  drupal_set_message(
+    t(
+      'The !script file should copied from the !here directory to the !path directory.  ' .
+      'Until that is done, your tasks will not execute as scheduled.',
+      array(
+        '!script' => SUPERCRON_SCRIPT_NAME,
+        '!here'   => realpath(dirname(__FILE__)),
+        '!path'   => realpath('./'),
+      )
+    ),
+    'warning'
+  );
+}
+
 function _supercron_check_requirements() {
+  global $base_path;
   $supercron_script_path = variable_get('supercron_script_path', SUPERCRON_SCRIPT_PATH_MODULE_ROOT);
-
-  if ($superccron_script_path == SUPERCRON_SCRIPT_PATH_DRUPAL_ROOT) {
-    if (!file_exists(supercron_get_script_path())) {
-      $message = t(
-        'The !script file should copied from the !here directory to !path; until'
-          . ' that is done, your tasks will not execute when scheduled to.',
-        array(
-          '!script' => SUPERCRON_SCRIPT_NAME,
-          '!here'   => supercron_base_path() . drupal_get_path('module', 'supercron'),
-          '!path'   => supercron_base_path()
-        )
-      );
-
-      drupal_set_message($message, 'error');
+  if ($supercron_script_path == SUPERCRON_SCRIPT_PATH_DRUPAL_ROOT) {
+    if (!file_exists(SUPERCRON_SCRIPT_NAME)) {
+      _supercron_show_script_warning();
     }
   }
 }
@@ -137,7 +142,8 @@ function supercron_get_formatted_stats() {
 /**
  * SuperCron settings form.
  */
-function supercron_settings(&$form_state) {
+function supercron_settings($form_state) {
+  global $base_path;
   // Check requirements
   _supercron_check_requirements();
 
@@ -156,17 +162,8 @@ function supercron_settings(&$form_state) {
 
       drupal_set_message($message, 'warning');
     }
-    elseif (!file_exists($script_path)) {
-      $message = 'The !script file should be copied from the !here directory to';
-      $message .= ' !path; until that is done, your cron-driven tasks will not execute when';
-      $message .= ' scheduled to.';
-      $message = t($message, array(
-        '!script' => SUPERCRON_SCRIPT_NAME,
-        '!here'   => supercron_base_path() . drupal_get_path('module', 'supercron'),
-        '!path'   => supercron_base_path()
-      ));
-
-      drupal_set_message($message, 'warning');
+    elseif (!file_exists(SUPERCRON_SCRIPT_NAME)) {
+      _supercron_show_script_warning();
     }
     if (module_exists('elysia_cron'))
       drupal_set_message(t('You are running Elysia Cron simultaneously with SuperCron; please disable one or the other to avoid cron task conflicts.'), 'warning');
@@ -351,7 +348,7 @@ function _supercron_theme_make_span($id, $content, $extras = '') {
   return $value . '>' . htmlentities($content) . '</span>';
 }
 
-function theme_supercron_settings(&$form) {
+function theme_supercron_settings($form) {
   if (user_access(SUPERCRON_EXCEPTION_FEED_PERMISSION)) {
     drupal_add_feed(url(supercron_rss_url()), t('SuperCron Exceptions'));
   }
@@ -445,8 +442,8 @@ function supercron_settings_submit($form, &$form_state) {
     drupal_write_record('supercron_enabled_mods', $record, 'id');
   }
 
-    variable_set(SUPERCRON_THROTTLE_SUPPORT_VARIABLE, $form_state['values']['throttle']);
-    variable_get(SUPERCRON_AUTOCRON_AUTOENABLED, $form_state['values']['crashsafety']);
+  variable_set(SUPERCRON_THROTTLE_SUPPORT_VARIABLE, $form_state['values']['throttle']);
+  variable_set(SUPERCRON_AUTOCRON_AUTOENABLED, $form_state['values']['crashsafety']);
 
   if ($form_state['values'][SUPERCRON_SCRIPT_PATH] == SUPERCRON_SCRIPT_PATH_CUSTOM) {
     variable_set(SUPERCRON_SCRIPT_PATH, $form_state['values'][SUPERCRON_SCRIPT_PATH . '_text']);
diff --git a/supercron.admin.rule.inc b/supercron.admin.rule.inc
index b6d4d71..bcd4a65 100644
--- a/supercron.admin.rule.inc
+++ b/supercron.admin.rule.inc
@@ -6,6 +6,7 @@
  * Contains administrative configuration details for complex cron scheduling
  */
 
+include_once(drupal_get_path('module', 'supercron') . '/supercron-main.inc');
 
 function supercron_settings_rule_toolbox() {
   $module_path = drupal_get_path('module', 'supercron');
diff --git a/supercron.classes.inc b/supercron.classes.inc
index a4bae65..e7d72e7 100644
--- a/supercron.classes.inc
+++ b/supercron.classes.inc
@@ -439,6 +439,7 @@ class supercron_module {
 
         if ($this->multithread OR $forced_multithreading) {
             $url = str_replace('%', $this->module_name, supercron_registry()->get_external_invocation_url());
+            $url = url($url,array(absolute => TRUE));
             _supercron_parallel_call($url);
         }
         else {
diff --git a/supercron.crontab-admin.inc b/supercron.crontab-admin.inc
index 5611323..4505c2a 100644
--- a/supercron.crontab-admin.inc
+++ b/supercron.crontab-admin.inc
@@ -6,8 +6,10 @@
  * Contains administrative configuration helper for Cron tasks
  */
 
+include_once(drupal_get_path('module', 'supercron') . '/supercron-main.inc');
 
-function supercron_invocation_form(&$form_state) {
+function supercron_invocation_form($form_state) {
+  global $base_path;
   $module_path = drupal_get_path('module', 'supercron');
   drupal_add_js("{$module_path}/js/ZeroClipboard.js");
   drupal_add_js("{$module_path}/js/supercron.crontab.js");
@@ -36,7 +38,7 @@ function supercron_invocation_form(&$form_state) {
     : $supercron_script_path,
     '#options'   => array(
       SUPERCRON_SCRIPT_PATH_DRUPAL_ROOT => t('Drupal root (@path)', array('@path' => supercron_standard_path())),
-      SUPERCRON_SCRIPT_PATH_MODULE_ROOT => t('Module root (@path)', array('@path' => supercron_base_path() . drupal_get_path('module', 'supercron') . '/supercron.php')),
+      SUPERCRON_SCRIPT_PATH_MODULE_ROOT => t('Module root (@path)', array('@path' => supercron_base_path())),
       SUPERCRON_SCRIPT_PATH_CUSTOM      => t('Other place')
     ),
   );
@@ -100,8 +102,6 @@ function supercron_invocation_form(&$form_state) {
 }
 
 function supercron_invocation_form_submit($form, &$form_state) {
-  variable_set(SUPERCRON_THROTTLE_SUPPORT_VARIABLE, $form_state['values']['throttle']);
-
   if ($form_state['values'][SUPERCRON_SCRIPT_PATH] == SUPERCRON_SCRIPT_PATH_CUSTOM) {
     variable_set(SUPERCRON_SCRIPT_PATH, $form_state['values'][SUPERCRON_SCRIPT_PATH . '_text']);
   }
diff --git a/supercron.drush.inc b/supercron.drush.inc
new file mode 100644
index 0000000..fd630d3
--- /dev/null
+++ b/supercron.drush.inc
@@ -0,0 +1,75 @@
+<?php
+// $Id:$
+
+/**
+ * @file
+ *   Drush support for supercron.
+ */
+
+/**
+ * Implementation of hook_drush_command().
+ */
+function supercron_drush_command() {
+  $items = array();
+  $items['supercron'] = array(
+    'description' => "Invoke cron jobs for specific modules.",
+    'arguments' => array(
+      'modules' => 'A list of modules to invoke their cron jobs.',
+    ),
+    'examples' => array(
+      'drush supercron system node filter' =>
+        'Invoke cron jobs for system, node and filter modules.',
+    ),
+  );
+  return $items;
+}
+
+/**
+ * Implementation of hook_drush_help().
+ */
+function supercron_drush_help($section) {
+  switch ($section) {
+    case 'drush:supercron':
+      return dt("Invoke cron jobs for modules. Usage: 'drush supercron all'.");
+  }
+}
+
+/**
+ * Drush command callback.
+ */
+function drush_supercron() {
+  $commands = func_get_args();
+  $invoke_modules = supercron_list_handled_modules();
+
+  // If the argument 'all' is specified run the hook_cron() impelementations of
+  // all modules enabled in supercron's settings.
+  if(in_array('all', $commands)) {
+    $modules = $invoke_modules;
+    drush_print(dt('The cron jobs of the following modules will be invoked: !projects', array('!projects' => implode(', ', $modules))));
+    if(drush_confirm(dt('Do you really want to continue?'))) {
+      supercron_module_invoke_all_cron();
+      drush_log(dt('Running cron hooks for all modules'), 'ok');
+    }
+  }
+  // Run only the hook_cron() impelmentations of the specified modules.
+  else if (count($commands) > 0) {
+    $modules = array_intersect($commands, $invoke_modules);
+    drush_print(dt('The cron jobs of the following modules will be invoked: !projects', array('!projects' => implode(', ', $modules))));
+    if(drush_confirm(dt('Do you really want to continue?'))) {
+      foreach($modules as $module) {
+        supercron_invoke_one($module);
+        drush_log(dt('Running @module_cron', array('@module_cron' => $module . '_cron()')), 'ok');
+      }
+    }
+  }
+  // If no argument is specified prompt the user to choose an option.
+  else {
+    array_unshift($invoke_modules, 'all');
+    $choices = array_flip($invoke_modules);
+    $choice = drush_choice($choices, "Enter a number to choose which module's cron hook to run.", '!key');
+    if ($choice !== FALSE) {
+      supercron_invoke_one($choice);
+      drush_log(dt('Running @module_cron', array('@module_cron' => $choice . '_cron()')), 'ok');
+    }
+  }
+}
diff --git a/supercron.info b/supercron.info
index cf32b4d..77547e3 100644
--- a/supercron.info
+++ b/supercron.info
@@ -4,3 +4,4 @@ description = Get absolute control over Cron tasks
 core = 6.x
 version = 6.x-1.4-alpha
 php = 5.0
+depends[] = dblog
