diff --git a/advancedqueue.module b/advancedqueue.module
index 16c9450..f127869 100644
--- a/advancedqueue.module
+++ b/advancedqueue.module
@@ -26,13 +26,20 @@ define('ADVANCEDQUEUE_STATUS_SUCCESS', 1);
 define('ADVANCEDQUEUE_STATUS_FAILURE', 2);
 
 /**
- * Implements hook_views_api().
+ * Implements hook_menu().
  */
-function advancedqueue_views_api() {
-  return array(
-    'api' => 2,
-    'path' => drupal_get_path('module', 'advancedqueue') . '/views',
+function advancedqueue_menu() {
+  $items = array();
+  $items['admin/config/system/advanced-queue'] = array(
+    'file' => 'includes/advancedqueue.admin.inc',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('advancedqueue_admin_settings'),
+    'access arguments' => array('administer site configuration'),
+    'title' => 'Advanced queue',
+    'description' => 'Manage Advanced queue settings.'
   );
+
+  return $items;
 }
 
 /**
@@ -50,3 +57,138 @@ function advancedqueue_entity_info() {
   );
   return $entity_info;
 }
+
+/**
+ * Implements hook_cron().
+ */
+function advancedqueue_cron() {
+  if (!$queue_names = variable_get('advancedqueue_queue_names', array())) {
+    return;
+  }
+
+  if (!$queues = advancedqueue_get_queues_info($queue_names)) {
+    return;
+  }
+
+  // @todo: Add variable to set interval?
+  $end = time() + 60;
+  foreach ($queues as $queue_name => $queue_info) {
+    $queue = DrupalQueue::get($queue_name);
+
+    while ($item = $queue->claimItem()) {
+      if (time() > $end) {
+        // We've reached max execution time.
+        return;
+      }
+      advancedqueue_process_item($queue, $queue_name, $queue_info, $item, $end);
+    }
+  }
+}
+
+/**
+ * Return queue(s) info.
+ *
+ * @params $queue_names
+ *   Optional; Array with the queue names. If empty, return all the queues.
+ */
+function advancedqueue_get_queues_info($queue_names = array()) {
+  $queues_info = &drupal_static(__FUNCTION__, array());
+
+  if (empty($queues_info)) {
+    $queues_info = module_invoke_all('advanced_queue_info');
+
+    // Add default values.
+    foreach ($queues_info as &$queue_info) {
+      $queue_info += array(
+        'delete when completed' => TRUE,
+      );
+    }
+    drupal_alter('advanced_queue_info', $queues_info);
+    uasort($queues_info, 'drupal_sort_weight');
+  }
+
+  if ($queue_names) {
+    return array_intersect_key($queues_info, $queue_names);
+  }
+
+  return $queues_info;
+}
+
+
+/**
+ * Process a queue item.
+ *
+ * @param $queue
+ *   The queue object.
+ * @param $queue_name
+ *   The queue name.
+ * @param $queue_info
+ *   The queue info.
+ * @param $item
+ *   The item to process.
+ * @param $end_time
+ *   (Optional) The time the process should end.
+ */
+function advancedqueue_process_item($queue, $queue_name, $queue_info, $item, $end_time = FALSE) {
+  $function = $queue_info['worker callback'];
+  $params =  array(
+    '@queue' => $queue_name,
+    '@id' => $item->item_id,
+    '@title' => !empty($item->title) ? $item->title : 'untitled',
+  );
+
+  advancedqueue_log_message(format_string('[@queue:@id] Starting processing item @title.', $params));
+
+  try {
+    // Pass the claimed item itself and end date along to the worker
+    // callback.
+    $output = $function($item, $end_time);
+    if (is_array($output)) {
+      $item->status = $output['status'];
+      $item->result = $output['result'];
+    }
+    else {
+      $item->status = $output ? ADVANCEDQUEUE_STATUS_SUCCESS : ADVANCEDQUEUE_STATUS_FAILURE;
+    }
+  }
+  catch (Exception $e) {
+    $item->status = ADVANCEDQUEUE_STATUS_FAILURE;
+    $params['!message'] = (string) $e;
+    advancedqueue_log_message(format_string('[!queue:!id] failed processing: !message', $params));
+  }
+
+  $params['@status'] = $item->status;
+  advancedqueue_log_message(format_string('[@queue:@id] Processing ended with result @status.', $params));
+
+  if ($queue_info['delete when completed']) {
+    // Item was processed, so we can "delete" it. This is not removing the
+    // item from the database, but rather updates it with the status.
+    $queue->deleteItem($item);
+  }
+}
+
+/**
+ * Helper function to log message. In CLI we use Drush Log, otherwise watchdog.
+ *
+ * @param $message
+ *   The message to log.
+ */
+function advancedqueue_log_message($message) {
+  if (drupal_is_cli()) {
+    drush_log($message);
+  }
+  else {
+    watchdog('advancedqueue', $message);
+  }
+}
+
+/**
+ * Implements hook_views_api().
+ */
+function advancedqueue_views_api() {
+  return array(
+    'api' => 2,
+    'path' => drupal_get_path('module', 'advancedqueue') . '/views',
+  );
+}
+
diff --git a/advancedqueue_example/advancedqueue_example.module b/advancedqueue_example/advancedqueue_example.module
index 3a29798..e99b8cd 100644
--- a/advancedqueue_example/advancedqueue_example.module
+++ b/advancedqueue_example/advancedqueue_example.module
@@ -10,6 +10,7 @@
  */
 function advancedqueue_example_advanced_queue_info() {
   $items['example_queue'] = array(
+    'label' => t('Example queue'),
     'worker callback' => 'advancedqueue_example_worker',
   );
   return $items;
@@ -34,7 +35,7 @@ function advancedqueue_example_worker($item, $end_time = FALSE) {
     '@uid' => $data['uid'],
     '@time' => date('r', $data['timestamp']),
   );
-  drush_print(dt('The "worker" is now processing a example task number @id for user ID @uid created at @time.', $params));
+  advancedqueue_log_message(format_string('The "worker" is now processing a example task number @id for user ID @uid created at @time.', $params));
 
   // For example purposes we will return an array with detailed message
   // for odd item IDs, and boolean for even ones.
diff --git a/drush/advancedqueue.drush.inc b/drush/advancedqueue.drush.inc
index d7413ee..07b0ce0 100644
--- a/drush/advancedqueue.drush.inc
+++ b/drush/advancedqueue.drush.inc
@@ -26,9 +26,9 @@ function advancedqueue_drush_command() {
 
 function drush_advancedqueue_process_queue($queue = NULL) {
   // Load information about the registred queues, and sort them by weight.
-  $all_queue_info = module_invoke_all('advanced_queue_info');
-  drupal_alter('advanced_queue_info', $all_queue_info);
-  uasort($all_queue_info, 'drupal_sort_weight');
+  if (!$queues_info = advancedqueue_get_queues_info()) {
+    return drush_set_error(dt('No queues exist.'));
+  }
 
   $all_option = drush_get_option('all');
   if (!$all_option && empty($queue)) {
@@ -36,20 +36,15 @@ function drush_advancedqueue_process_queue($queue = NULL) {
   }
 
   if ($all_option) {
-    $queues = $all_queue_info;
+    $queues = $queues_info;
   }
   else {
     // Validate queues.
     $queues = drupal_map_assoc(explode(',', $queue));
-    $invalid_queues = array_diff_key($queues, $all_queue_info);
-    if ($invalid_queues) {
+    if ($invalid_queues = array_diff_key($queues, $queues_info)) {
       return drush_set_error(dt('The following queues are invalid: !queues. Aborting.', array('!queues' => implode(', ', $invalid_queues))));
     }
-    $queues = array_intersect_key($all_queue_info, $queues);
-  }
-
-  if (!$queues) {
-    return drush_set_error(dt('No queues exist.'));
+    $queues = array_intersect_key($queues_info, $queues);
   }
 
   // Run the worker for a certain period of time before killing it.
@@ -68,7 +63,7 @@ function drush_advancedqueue_process_queue($queue = NULL) {
       $queue = DrupalQueue::get($queue_name);
 
       if ($item = $queue->claimItem()) {
-        drush_advancedqueue_process_item($queue, $queue_name, $queue_info, $item, $end);
+        advancedqueue_process_item($queue, $queue_name, $queue_info, $item, $end);
         continue 2;
       }
     }
@@ -79,54 +74,3 @@ function drush_advancedqueue_process_queue($queue = NULL) {
 
   drush_log(dt('Timeout: exiting processing loop.'));
 }
-
-/**
- * Process a queue item.
- *
- * @param $queue
- *   The queue object.
- * @param $queue_name
- *   The queue name.
- * @param $queue_info
- *   The queue info.
- * @param $item
- *   The item to process.
- * @param $end_time
- *   (Optional) The time the process should end.
- */
-function drush_advancedqueue_process_item($queue, $queue_name, $queue_info, $item, $end_time = FALSE) {
-  $function = $queue_info['worker callback'];
-  $params =  array(
-    '@queue' => $queue_name,
-    '@id' => $item->item_id,
-    '@title' => !empty($item->title) ? $item->title : dt('untitled'),
-  );
-  drush_log(dt('[@queue:@id] Starting processing item @title.', $params));
-
-  try {
-    // Pass the claimed item itself and end date along to the worker
-    // callback.
-    $output = $function($item, $end_time);
-    if (is_array($output)) {
-      $item->status = $output['status'];
-      $item->result = $output['result'];
-    }
-    else {
-      $item->status = $output ? ADVANCEDQUEUE_STATUS_SUCCESS : ADVANCEDQUEUE_STATUS_FAILURE;
-    }
-  }
-  catch (Exception $e) {
-    $item->status = ADVANCEDQUEUE_STATUS_FAILURE;
-    $params['!message'] = (string) $e;
-    drush_log(dt('[!queue:!id] failed processing: !message', $params));
-  }
-
-  $params['@status'] = $item->status;
-  drush_log(dt('[@queue:@id] Processing ended with result @status.', $params));
-
-  if ($queue_info['delete when completed']) {
-    // Item was processed, so we can "delete" it. This is not removing the
-    // item from the database, but rather updates it with the status.
-    $queue->deleteItem($item);
-  }
-}
diff --git a/includes/advancedqueue.admin.inc b/includes/advancedqueue.admin.inc
new file mode 100644
index 0000000..c64de17
--- /dev/null
+++ b/includes/advancedqueue.admin.inc
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Admin settings for Advanced-Queue module.
+ */
+
+/**
+ * Menu callback; Admin settings form.
+ */
+function advancedqueue_admin_settings($form_state) {
+  $form = array();
+
+  $options = array();
+  foreach (advancedqueue_get_queues_info() as $queue_name => $queue_info) {
+    $label = !empty($queue_info['label']) ? $queue_info['label'] . ' (' . $queue_name . ')'  : $queue_name;
+    $options[$queue_name] = check_plain($label);
+  }
+
+  $form['advancedqueue_queue_names'] = array(
+    '#type' => 'select',
+    '#title' => t('Queues via Cron'),
+    '#multiple' => TRUE,
+    '#description' => t('Select the queues that need to be processed using Cron. This is a "poor man\'s" option that allows processing the queue, as the better solution would be to execute the Drush command vit the command line.'),
+    '#default_value' => variable_get('advancedqueue_queue_names', array()),
+    '#options' => $options,
+  );
+
+  return system_settings_form($form);
+}
