diff --git a/feeds.install b/feeds.install
index 8f351e1..8cde246 100644
--- a/feeds.install
+++ b/feeds.install
@@ -248,6 +248,76 @@ function feeds_schema() {
       'timestamp' => array('timestamp'),
     ),
   );
+  $schema['feeds_log'] = array(
+    'description' => 'Table that contains logs of feeds events.',
+    'fields' => array(
+      'flid' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique feeds event ID.',
+      ),
+      'id' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The id of the importer that logged the event.',
+      ),
+      'feed_nid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'Node id of the source, if available.',
+      ),
+      'log_time' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Unix timestamp of when event occurred.',
+      ),
+      'request_time' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Unix timestamp of the request when the event occurred.',
+      ),
+      'type' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Type of log message, for example "feeds_import"."',
+      ),
+      'message' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'Text of log message to be passed into the t() function.',
+      ),
+      'variables' => array(
+        'type' => 'blob',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'Serialized array of variables that match the message string and that is passed into the t() function.',
+      ),
+      'severity' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'The severity level of the event; ranges from 0 (Emergency) to 7 (Debug)',
+      ),
+    ),
+    'primary key' => array('flid'),
+    'indexes' => array(
+      'id' => array('id'),
+      'id_feed_nid' => array('id', 'feed_nid'),
+      'request_time' => array('request_time'),
+      'log_time' => array('log_time'),
+      'type' => array('type'),
+    ),
+  );
   return $schema;
 }
 
@@ -621,3 +691,81 @@ function feeds_update_6014() {
 
   return $ret;
 }
+
+/**
+ * Add feeds_log table.
+ */
+function feeds_update_6015() {
+  $schema = array(
+    'description' => 'Table that contains logs of feeds events.',
+    'fields' => array(
+      'flid' => array(
+        'type' => 'serial',
+        'not null' => TRUE,
+        'description' => 'Primary Key: Unique feeds event ID.',
+      ),
+      'id' => array(
+        'type' => 'varchar',
+        'length' => 128,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'The id of the importer that logged the event.',
+      ),
+      'feed_nid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'Node id of the source, if available.',
+      ),
+      'log_time' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Unix timestamp of when event occurred.',
+      ),
+      'request_time' => array(
+        'type' => 'int',
+        'not null' => TRUE,
+        'default' => 0,
+        'description' => 'Unix timestamp of the request when the event occurred.',
+      ),
+      'type' => array(
+        'type' => 'varchar',
+        'length' => 64,
+        'not null' => TRUE,
+        'default' => '',
+        'description' => 'Type of log message, for example "feeds_import"."',
+      ),
+      'message' => array(
+        'type' => 'text',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'Text of log message to be passed into the t() function.',
+      ),
+      'variables' => array(
+        'type' => 'blob',
+        'not null' => TRUE,
+        'size' => 'big',
+        'description' => 'Serialized array of variables that match the message string and that is passed into the t() function.',
+      ),
+      'severity' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+        'size' => 'tiny',
+        'description' => 'The severity level of the event; ranges from 0 (Emergency) to 7 (Debug)',
+      ),
+    ),
+    'primary key' => array('flid'),
+    'indexes' => array(
+      'id' => array('id'),
+      'id_feed_nid' => array('id', 'feed_nid'),
+      'request_time' => array('request_time'),
+      'log_time' => array('log_time'),
+      'type' => array('type'),
+    ),
+  );
+  db_create_table($ret, 'feeds_log', $schema);
+  return array();
+}
\ No newline at end of file
diff --git a/feeds.module b/feeds.module
index 3b3255f..86a91d5 100644
--- a/feeds.module
+++ b/feeds.module
@@ -37,6 +37,7 @@ function feeds_cron() {
     feeds_reschedule(FALSE);
     return;
   }
+  db_query('DELETE FROM {feeds_log} WHERE request_time < %d', $_SERVER['REQUEST_TIME'] - 604800);
 }
 
 /**
@@ -69,7 +70,7 @@ function feeds_source_import($job) {
     // Do nothing.
   }
   catch (Exception $e) {
-    watchdog('feeds_source_import()', $e->getMessage(), array(), WATCHDOG_ERROR);
+    $source->log('import', $e->getMessage(), array(), WATCHDOG_ERROR);
   }
   $source->schedule();
 }
@@ -154,65 +155,69 @@ function feeds_forms() {
  * Implementation of hook_menu().
  */
 function feeds_menu() {
-  // Register a callback for all feed configurations that are not attached to a content type.
   $items = array();
+  $items['import'] = array(
+    'title' => 'Import',
+    'page callback' => 'feeds_page',
+    'access callback' => 'feeds_page_access',
+    'file' => 'feeds.pages.inc',
+  );
+  $items['import/%'] = array(
+    'title callback' => 'feeds_importer_title',
+    'title arguments' => array(1),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('feeds_import_form', 1),
+    'access callback' => 'feeds_access',
+    'access arguments' => array('import', 1),
+    'file' => 'feeds.pages.inc',
+  );
+  $items['import/%/import'] = array(
+    'title' => 'Import',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+  );
+  $items['import/%/delete-items'] = array(
+    'title' => 'Delete items',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('feeds_delete_tab_form', 1),
+    'access callback' => 'feeds_access',
+    'access arguments' => array('clear', 1),
+    'file' => 'feeds.pages.inc',
+    'type' => MENU_LOCAL_TASK,
+  );
+  $items['import/%/template'] = array(
+    'page callback' => 'feeds_importer_template',
+    'page arguments' => array(1),
+    'access callback' => 'feeds_access',
+    'access arguments' => array('import', 1),
+    'file' => 'feeds.pages.inc',
+    'type' => MENU_CALLBACK,
+  );
+  $items['node/%node/import'] = array(
+    'title' => 'Import',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('feeds_import_tab_form', 1),
+    'access callback' => 'feeds_access',
+    'access arguments' => array('import', 1),
+    'file' => 'feeds.pages.inc',
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 10,
+  );
+  $items['node/%node/delete-items'] = array(
+    'title' => 'Delete items',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('feeds_delete_tab_form', NULL, 1),
+    'access callback' => 'feeds_access',
+    'access arguments' => array('clear', 1),
+    'file' => 'feeds.pages.inc',
+    'type' => MENU_LOCAL_TASK,
+    'weight' => 11,
+  );
+  // @todo Eliminate this step and thus eliminate clearing menu cache when
+  // manipulating importers.
   foreach (feeds_importer_load_all() as $importer) {
-    if (empty($importer->config['content_type'])) {
-      $items['import/'. $importer->id] = array(
-        'title' => $importer->config['name'],
-        'page callback' => 'drupal_get_form',
-        'page arguments' => array('feeds_import_form', 1),
-        'access callback' => 'feeds_access',
-        'access arguments' => array('import', $importer->id),
-        'file' => 'feeds.pages.inc',
-      );
-      $items['import/'. $importer->id .'/import'] = array(
-        'title' => 'Import',
-        'type' => MENU_DEFAULT_LOCAL_TASK,
-        'weight' => -10,
-      );
-      $items['import/'. $importer->id .'/delete-items'] = array(
-        'title' => 'Delete items',
-        'page callback' => 'drupal_get_form',
-        'page arguments' => array('feeds_delete_tab_form', 1),
-        'access callback' => 'feeds_access',
-        'access arguments' => array('clear', $importer->id),
-        'file' => 'feeds.pages.inc',
-        'type' => MENU_LOCAL_TASK,
-      );
-    }
-    else {
-      $items['node/%node/import'] = array(
-        'title' => 'Import',
-        'page callback' => 'drupal_get_form',
-        'page arguments' => array('feeds_import_tab_form', 1),
-        'access callback' => 'feeds_access',
-        'access arguments' => array('import', 1),
-        'file' => 'feeds.pages.inc',
-        'type' => MENU_LOCAL_TASK,
-        'weight' => 10,
-      );
-      $items['node/%node/delete-items'] = array(
-        'title' => 'Delete items',
-        'page callback' => 'drupal_get_form',
-        'page arguments' => array('feeds_delete_tab_form', NULL, 1),
-        'access callback' => 'feeds_access',
-        'access arguments' => array('clear', 1),
-        'file' => 'feeds.pages.inc',
-        'type' => MENU_LOCAL_TASK,
-        'weight' => 11,
-      );
-    }
     $items += $importer->fetcher->menuItem();
   }
-  if (count($items)) {
-    $items['import'] = array(
-      'title' => 'Import',
-      'page callback' => 'feeds_page',
-      'access callback' => 'feeds_page_access',
-      'file' => 'feeds.pages.inc',
-    );
-  }
   return $items;
 }
 
@@ -224,6 +229,14 @@ function feeds_importer_load($id) {
 }
 
 /**
+ * Title callback.
+ */
+function feeds_importer_title($id) {
+  $importer = feeds_importer($id);
+  return $importer->config['name'];
+}
+
+/**
  * Implementation of hook_theme().
  */
 function feeds_theme() {
@@ -282,6 +295,15 @@ function feeds_page_access() {
 }
 
 /**
+ * Implements hook_exit().
+ */
+function feeds_exit() {
+  if (ctools_static('feeds_log_error', FALSE)) {
+    watchdog('feeds', 'Feeds reported errors, visit the Feeds log for details.', array(), WATCHDOG_ERROR, 'admin/reports/dblog/feeds');
+  }
+}
+
+/**
  * Implementation of hook_views_api().
  */
 function feeds_views_api() {
@@ -395,15 +417,31 @@ function feeds_nodeapi(&$node, $op, $form) {
         $node_feeds = NULL;
         break;
       case 'delete':
-        $source = feeds_source($importer_id, $node->nid);
-        if (!empty($source->importer->processor->config['delete_with_source'])) {
-          feeds_batch_set(t('Deleting'), 'clear', $importer_id, $node->nid);
-        }
-        // Remove attached source.
-        $source->delete();
+
         break;
     }
   }
+  
+  if($op == 'delete') {
+    // Make sure we don't leave any orphans behind: If feeds_get_importer_id
+    // didn't find the id check manually in case the importer was deleted.
+    if (!$importer_id) {
+      $query = db_query('SELECT id FROM {feeds_source} WHERE feed_nid = %d', $node->nid);
+      $importer_id = db_result($query);
+    }
+  
+    if ($importer_id) {
+      $source = feeds_source($importer_id, $node->nid);
+      if (!empty($source->importer->processor->config['delete_with_source'])) {
+        feeds_batch_set(t('Deleting'), 'clear', $importer_id, $node->nid);
+      }
+      // Remove attached source.
+      $source->delete();
+    }
+    
+  }
+  
+  
 }
 
 /**
@@ -556,6 +594,30 @@ function feeds_batch($method, $importer_id, $feed_nid = 0, &$context) {
 }
 
 /**
+ * Writes to feeds log.
+ */
+function feeds_log($importer_id, $feed_nid, $type, $message, $variables = array(), $severity = WATCHDOG_NOTICE) {
+  if ($severity < WATCHDOG_NOTICE) {
+    $error = &ctools_static('feeds_log_error', FALSE);
+    $error = TRUE;
+  }
+  db_query(
+    "INSERT INTO {feeds_log}
+    (id, feed_nid, log_time, request_time, type, message, variables, severity)
+    VALUES
+    ('%s', %d, %d, %d, '%s', '%s', '%s', %d)",
+    $importer_id,
+    $feed_nid,
+    time(),
+    $_SERVER['REQUEST_TIME'],
+    $type,
+    $message,
+    serialize($variables),
+    $severity
+  );
+}
+
+/**
  * @}
  */
 
diff --git a/includes/FeedsSource.inc b/includes/FeedsSource.inc
index 09ccf66..95eeef9 100644
--- a/includes/FeedsSource.inc
+++ b/includes/FeedsSource.inc
@@ -357,4 +357,11 @@ class FeedsSource extends FeedsConfigurable {
       }
     }
   }
+
+  /**
+   * Writes to feeds log.
+   */
+  public function log($type, $message, $variables = array(), $severity = WATCHDOG_NOTICE) {
+    feeds_log($this->id, $this->feed_nid, $type, $message, $variables, $severity);
+  }
 }
diff --git a/plugins/FeedsNodeProcessor.inc b/plugins/FeedsNodeProcessor.inc
index bea7921..5c81f47 100644
--- a/plugins/FeedsNodeProcessor.inc
+++ b/plugins/FeedsNodeProcessor.inc
@@ -68,7 +68,12 @@ class FeedsNodeProcessor extends FeedsProcessor {
         }
         catch (Exception $e) {
           drupal_set_message($e->getMessage(), 'warning');
-          watchdog('feeds', $e->getMessage(), array(), WATCHDOG_WARNING);
+          $message = $e->getMessage();
+          $message .= '<h3>Original item</h3>';
+          $message .= '<pre>' . var_export($item, TRUE) . '</pre>';
+          $message .= '<h3>Node</h3>';
+          $message .= '<pre>' . var_export($node, TRUE) . '</pre>';
+          $source->log('import', $message, array(), WATCHDOG_ERROR);
         }
       }
 
diff --git a/views/feeds.views.inc b/views/feeds.views.inc
index 9f5523d..bec78f2 100644
--- a/views/feeds.views.inc
+++ b/views/feeds.views.inc
@@ -170,6 +170,142 @@ function feeds_views_data() {
       'help' => t('Argument on a Feeds Item\'s import date field.'),
     ),
   );
+  /**
+   * Expose feeds_log table to views.
+   */
+  $data['feeds_log']['table'] = array(
+    'group' => 'Feeds log',
+    'base' => array(
+      'field' => 'flid',
+      'title' => 'Feeds log',
+      'help' => 'Logs events during importing, clearing, expiry.',
+    ),
+  );
+  $data['feeds_log']['id'] = array(
+    'title' => 'Importer id',
+    'help' => 'The id of an importer.',
+    'field' => array(
+      'handler' => 'feeds_views_handler_field',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_string',
+      'allow empty' => TRUE,
+      'help' => 'Filter on an importer id.',
+    ),
+    'argument' => array(
+      'handler' => 'feeds_views_handler_argument_importer_id',
+      'help' => 'Filter on an importer id.',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+      'help' => 'Sort by importer id.',
+    ),
+    'relationship' => array(
+      'title' => t('Importer'),
+      'help' => t('Relate a log entry to its importer if available.'),
+      'label' => t('Importer'),
+      'base' => 'feeds_importer',
+      'base field' => 'id',
+    ),
+  );
+  $data['feeds_log']['importer_name'] = array(
+    'real field' => 'id',
+    'title' => 'Importer name',
+    'help' => 'The human readable name of an importer.',
+    'field' => array(
+      'handler' => 'feeds_views_handler_field_importer_name',
+    ),
+  );
+  $data['feeds_log']['feed_nid'] = array(
+    'title' => 'Feed node id',
+    'help' => 'Contains the node id of a feed node if the feed\'s configuration is attached to a content type, otherwise contains 0.',
+    'field' => array(
+      'handler' => 'feeds_views_handler_field_numeric',
+      'click sortable' => TRUE,
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_numeric',
+      'allow empty' => TRUE,
+      'help' => 'Filter on a Feeds Source\'s feed_nid field.',
+    ),
+    'argument' => array(
+      'handler' => 'views_handler_argument_numeric',
+      'numeric' => TRUE,
+      'validate type' => 'nid',
+      'help' => 'Argument on a Feeds Source\'s feed_nid field.',
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort',
+      'help' => 'Sort Feeds Source\'s feed_nid field.',
+    ),
+    'relationship' => array(
+      'title' => t('Feed node'),
+      'help' => t('Relate a log entry to its feed node if available.'),
+      'label' => t('Feed node'),
+      'base' => 'node',
+      'base field' => 'nid',
+    ),
+  );
+  $data['feeds_log']['log_time'] = array(
+    'title' => t('Log time'),
+    'help' => t('The time of the event.'),
+    'field' => array(
+      'handler' => 'views_handler_field_date',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort_date',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_date',
+    ),
+  );
+  $data['feeds_log']['request_time'] = array(
+    'title' => t('Request time'),
+    'help' => t('The time of the page request of an event.'),
+    'field' => array(
+      'handler' => 'views_handler_field_date',
+      'click sortable' => TRUE,
+    ),
+    'sort' => array(
+      'handler' => 'views_handler_sort_date',
+    ),
+    'filter' => array(
+      'handler' => 'views_handler_filter_date',
+    ),
+  );
+  $data['feeds_log']['message'] = array(
+    'title' => 'Log message',
+    'help' => 'The message logged by the event.',
+    'field' => array(
+      'handler' => 'feeds_views_handler_field_log_message',
+      'click sortable' => FALSE,
+      'additional fields' => array(
+        'variables',
+      ),
+    ),
+  );
+  $data['feeds_log']['severity'] = array(
+    'title' => 'Severity',
+    'help' => 'The severity of the event logged.',
+    'field' => array(
+      'handler' => 'feeds_views_handler_field_severity',
+      'click sortable' => FALSE,
+    ),
+    'filter' => array(
+      'handler' => 'feeds_views_handler_filter_severity',
+      'allow empty' => TRUE,
+      'help' => 'Filter on the severity of a log message.',
+    ),
+  );
+  $data['feeds_log']['table']['join'] = array(
+    'node' => array(
+      'left_field' => 'nid',
+      'field' => 'feed_nid',
+      'type' => 'LEFT',
+    ),
+  );
   return $data;
 }
 
@@ -183,9 +319,27 @@ function feeds_views_handlers() {
     ),
     'handlers' => array(
       // field handlers
+      'feeds_views_handler_argument_importer_id' => array(
+        'parent' => 'views_handler_argument_string',
+      ),
+      'feeds_views_handler_field_importer_name' => array(
+        'parent' => 'views_handler_field',
+      ),
+      'feeds_views_handler_field_log_message' => array(
+        'parent' => 'views_handler_field',
+      ),
+      'feeds_views_handler_field_severity' => array(
+        'parent' => 'views_handler_field',
+      ),
       'feeds_views_handler_field_source' => array(
         'parent' => 'views_handler_field',
       ),
+      'feeds_views_handler_field_severity' => array(
+        'parent' => 'views_handler_field',
+      ),
+      'feeds_views_handler_filter_severity' => array(
+        'parent' => 'views_handler_filter_in_operator',
+      ),
     ),
   );
 }
diff --git a/views/feeds.views_default.inc b/views/feeds.views_default.inc
new file mode 100644
index 0000000..53a4e88
--- /dev/null
+++ b/views/feeds.views_default.inc
@@ -0,0 +1,424 @@
+<?php
+
+/**
+ * @file
+ * Default view definitions for Feeds.
+ */
+
+/**
+ * Implementation of hook_views_default_views().
+ */
+function feeds_views_default_views() {
+  $views = array();
+
+  $view = new view;
+  $view->name = 'feeds_log';
+  $view->description = 'Feeds log displays for overview, standalone importers and feed nodes.';
+  $view->tag = 'Feeds';
+  $view->view_php = '';
+  $view->base_table = 'feeds_log';
+  $view->is_cacheable = FALSE;
+  $view->api_version = 2;
+  $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+  $handler = $view->new_display('default', 'Defaults', 'default');
+  $handler->override_option('fields', array(
+    'log_time' => array(
+      'id' => 'log_time',
+      'table' => 'feeds_log',
+      'field' => 'log_time',
+      'alter' => array(
+        'alter_text' => 0,
+        'make_link' => 0,
+        'absolute' => 0,
+        'trim' => 0,
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'strip_tags' => 0,
+        'html' => 0,
+      ),
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'date_format' => 'custom',
+      'custom_date_format' => 'Y-m-d H:i:s',
+    ),
+    'request_time' => array(
+      'id' => 'request_time',
+      'table' => 'feeds_log',
+      'field' => 'request_time',
+      'alter' => array(
+        'alter_text' => 0,
+        'make_link' => 0,
+        'absolute' => 0,
+        'trim' => 0,
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'strip_tags' => 0,
+        'html' => 0,
+      ),
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'date_format' => 'custom',
+      'custom_date_format' => 'Y-m-d H:i:s',
+    ),
+    'message' => array(
+      'id' => 'message',
+      'table' => 'feeds_log',
+      'field' => 'message',
+      'label' => 'Message',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+    ),
+    'severity' => array(
+      'id' => 'severity',
+      'table' => 'feeds_log',
+      'field' => 'severity',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+    ),
+  ));
+  $handler->override_option('sorts', array(
+    'log_time' => array(
+      'order' => 'DESC',
+      'granularity' => 'second',
+      'id' => 'log_time',
+      'table' => 'feeds_log',
+      'field' => 'log_time',
+      'relationship' => 'none',
+    ),
+  ));
+  $handler->override_option('arguments', array(
+    'id' => array(
+      'default_action' => 'empty',
+      'style_plugin' => 'default_summary',
+      'style_options' => array(),
+      'wildcard' => 'all',
+      'wildcard_substitution' => 'All',
+      'title' => '',
+      'breadcrumb' => '',
+      'default_argument_type' => 'fixed',
+      'default_argument' => '',
+      'validate_type' => 'none',
+      'validate_fail' => 'empty',
+      'glossary' => 0,
+      'limit' => '0',
+      'case' => 'none',
+      'path_case' => 'none',
+      'transform_dash' => 0,
+      'id' => 'id',
+      'table' => 'feeds_log',
+      'field' => 'id',
+      'validate_user_argument_type' => 'uid',
+      'validate_user_roles' => array(
+        '2' => 0,
+        '6' => 0,
+        '5' => 0,
+        '3' => 0,
+        '4' => 0,
+        '7' => 0,
+      ),
+      'relationship' => 'none',
+      'default_options_div_prefix' => '',
+      'default_argument_fixed' => '',
+      'default_argument_user' => 0,
+      'default_argument_php' => '',
+      'validate_argument_node_type' => array(
+        'billing' => 0,
+        'client_info' => 0,
+        'dr' => 0,
+        'npdn_info' => 0,
+        'page' => 0,
+        'story' => 0,
+        'webform' => 0,
+      ),
+      'validate_argument_node_access' => 0,
+      'validate_argument_nid_type' => 'nid',
+      'validate_argument_vocabulary' => array(
+        '1' => 0,
+        '2' => 0,
+        '3' => 0,
+        '4' => 0,
+        '5' => 0,
+        '6' => 0,
+        '7' => 0,
+        '8' => 0,
+        '9' => 0,
+        '10' => 0,
+        '11' => 0,
+        '12' => 0,
+      ),
+      'validate_argument_type' => 'tid',
+      'validate_argument_transform' => 0,
+      'validate_user_restrict_roles' => 0,
+      'validate_argument_php' => '',
+    ),
+  ));
+  $handler->override_option('filters', array(
+    'feed_nid' => array(
+      'id' => 'feed_nid',
+      'table' => 'feeds_log',
+      'field' => 'feed_nid',
+      'value' => array(
+        'value' => '0',
+      ),
+    ),
+    'severity' => array(
+      'operator' => 'in',
+      'value' => array(),
+      'group' => '0',
+      'exposed' => TRUE,
+      'expose' => array(
+        'use_operator' => 0,
+        'operator' => 'severity_op',
+        'identifier' => 'severity',
+        'label' => 'Severity',
+        'optional' => 0,
+        'single' => 0,
+        'remember' => 0,
+        'reduce' => 0,
+      ),
+      'id' => 'severity',
+      'table' => 'feeds_log',
+      'field' => 'severity',
+      'relationship' => 'none',
+    ),
+  ));
+  $handler->override_option('access', array(
+    'type' => 'perm',
+    'perm' => 'administer feeds',
+  ));
+  $handler->override_option('cache', array(
+    'type' => 'none',
+  ));
+  $handler->override_option('empty', 'There are no log messages.');
+  $handler->override_option('empty_format', '1');
+  $handler->override_option('items_per_page', 50);
+  $handler->override_option('use_pager', '1');
+  $handler->override_option('style_plugin', 'table');
+  $handler->override_option('style_options', array(
+    'grouping' => '',
+    'override' => 1,
+    'sticky' => 0,
+    'order' => 'asc',
+    'columns' => array(
+      'log_time' => 'log_time',
+      'request_time' => 'request_time',
+      'message' => 'message',
+      'severity' => 'severity',
+    ),
+    'info' => array(
+      'log_time' => array(
+        'sortable' => 0,
+        'separator' => '',
+      ),
+      'request_time' => array(
+        'sortable' => 0,
+        'separator' => '',
+      ),
+      'message' => array(
+        'separator' => '',
+      ),
+      'severity' => array(
+        'separator' => '',
+      ),
+    ),
+    'default' => '-1',
+  ));
+  $handler = $view->new_display('page', 'Standalone importer page', 'page_1');
+  $handler->override_option('path', 'import/%/log');
+  $handler->override_option('menu', array(
+    'type' => 'tab',
+    'title' => 'Log',
+    'description' => '',
+    'weight' => '0',
+    'name' => 'navigation',
+  ));
+  $handler->override_option('tab_options', array(
+    'type' => 'none',
+    'title' => '',
+    'description' => '',
+    'weight' => 0,
+    'name' => 'navigation',
+  ));
+  $handler = $view->new_display('page', 'Feed node page', 'page_2');
+  $handler->override_option('arguments', array(
+    'feed_nid' => array(
+      'id' => 'feed_nid',
+      'table' => 'feeds_log',
+      'field' => 'feed_nid',
+      'default_action' => 'not found',
+      'style_plugin' => 'default_summary',
+      'default_argument_type' => 'fixed',
+      'break_phrase' => 0,
+      'not' => 0,
+    ),
+  ));
+  $handler->override_option('filters', array(
+    'severity' => array(
+      'operator' => 'in',
+      'value' => array(),
+      'group' => '0',
+      'exposed' => TRUE,
+      'expose' => array(
+        'use_operator' => 0,
+        'operator' => 'severity_op',
+        'identifier' => 'severity',
+        'label' => 'Severity',
+        'optional' => 0,
+        'single' => 0,
+        'remember' => 0,
+        'reduce' => 0,
+      ),
+      'id' => 'severity',
+      'table' => 'feeds_log',
+      'field' => 'severity',
+      'override' => array(
+        'button' => 'Use default',
+      ),
+      'relationship' => 'none',
+    ),
+  ));
+  $handler->override_option('path', 'node/%/log');
+  $handler->override_option('menu', array(
+    'type' => 'tab',
+    'title' => 'Log',
+    'description' => '',
+    'weight' => '12',
+    'name' => 'navigation',
+  ));
+  $handler->override_option('tab_options', array(
+    'type' => 'none',
+    'title' => '',
+    'description' => '',
+    'weight' => 0,
+    'name' => 'navigation',
+  ));
+  $handler = $view->new_display('page', 'All entries', 'page_3');
+  $handler->override_option('relationships', array(
+    'feed_nid' => array(
+      'id' => 'feed_nid',
+      'table' => 'feeds_log',
+      'field' => 'feed_nid',
+    ),
+  ));
+  $handler->override_option('fields', array(
+    'log_time' => array(
+      'id' => 'log_time',
+      'table' => 'feeds_log',
+      'field' => 'log_time',
+      'alter' => array(
+        'alter_text' => 0,
+        'make_link' => 0,
+        'absolute' => 0,
+        'trim' => 0,
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'strip_tags' => 0,
+        'html' => 0,
+      ),
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'date_format' => 'custom',
+      'custom_date_format' => 'Y-m-d H:i:s',
+    ),
+    'request_time' => array(
+      'id' => 'request_time',
+      'table' => 'feeds_log',
+      'field' => 'request_time',
+      'alter' => array(
+        'alter_text' => 0,
+        'make_link' => 0,
+        'absolute' => 0,
+        'trim' => 0,
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'strip_tags' => 0,
+        'html' => 0,
+      ),
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'date_format' => 'custom',
+      'custom_date_format' => 'Y-m-d H:i:s',
+    ),
+    'message' => array(
+      'id' => 'message',
+      'table' => 'feeds_log',
+      'field' => 'message',
+      'label' => 'Message',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+    ),
+    'severity' => array(
+      'id' => 'severity',
+      'table' => 'feeds_log',
+      'field' => 'severity',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+    ),
+    'importer_name' => array(
+      'id' => 'importer_name',
+      'table' => 'feeds_log',
+      'field' => 'importer_name',
+      'label' => 'Importer',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'link' => '2',
+    ),
+    'title' => array(
+      'id' => 'title',
+      'table' => 'node',
+      'field' => 'title',
+      'relationship' => 'feed_nid',
+      'label' => 'Feed node',
+      'alter' => array(
+        'alter_text' => 0,
+        'make_link' => 0,
+        'absolute' => 0,
+        'trim' => 1,
+        'max_length' => '40',
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'strip_tags' => 0,
+        'html' => 0,
+      ),
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'link_to_node' => 1,
+    ),
+  ));
+  $handler->override_option('arguments', array());
+  $handler->override_option('filters', array(
+    'severity' => array(
+      'id' => 'severity',
+      'table' => 'feeds_log',
+      'field' => 'severity',
+      'exposed' => TRUE,
+      'expose' => array(
+        'operator' => 'severity_op',
+        'label' => 'Severity',
+        'use_operator' => FALSE,
+        'identifier' => 'severity',
+        'reduce' => 0,
+      ),
+    ),
+  ));
+  $handler->override_option('title', 'Feeds log');
+  $handler->override_option('path', 'admin/reports/feeds');
+  $handler->override_option('menu', array(
+    'type' => 'normal',
+    'title' => 'Feeds log',
+    'description' => 'Review log messages of imports and subscriptions to feeds.',
+    'weight' => '0',
+    'name' => 'management',
+  ));
+  $handler->override_option('tab_options', array(
+    'type' => 'none',
+    'title' => '',
+    'description' => '',
+    'weight' => 0,
+    'name' => 'navigation',
+  ));
+
+  $views[$view->name] = $view;
+
+  return $views;
+}
diff --git a/views/feeds_views_handler_argument_importer_id.inc b/views/feeds_views_handler_argument_importer_id.inc
new file mode 100644
index 0000000..9415812
--- /dev/null
+++ b/views/feeds_views_handler_argument_importer_id.inc
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * @file
+ * Argument handler for importer ids.
+ */
+class feeds_views_handler_argument_importer_id extends views_handler_argument_string {
+
+  /**
+   * Argument must be a valid importer id.
+   */
+  function validate_arg($arg) {
+    // By using % in URLs, arguments could be validated twice; this eases
+    // that pain.
+    if (isset($this->argument_validated)) {
+      return $this->argument_validated;
+    }
+    $this->argument_validated = FALSE;
+    if (in_array($arg, feeds_enabled_importers())) {
+      $this->argument_validated = TRUE;
+    }
+    return $this->argument_validated;
+  }
+}
diff --git a/views/feeds_views_handler_field_importer_name.inc b/views/feeds_views_handler_field_importer_name.inc
new file mode 100644
index 0000000..9b16cdf
--- /dev/null
+++ b/views/feeds_views_handler_field_importer_name.inc
@@ -0,0 +1,63 @@
+<?php
+
+/**
+ * @file
+ * Render an importer name.
+ */
+
+class feeds_views_handler_field_importer_name extends views_handler_field {
+
+  /**
+   * Overrides parent::option_definition().
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['link'] = array('default' => 0);
+    return $options;
+  }
+
+  /**
+   * Overrides parent::options_form().
+   */
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $options = array(
+      0 => t('Do not link'),
+      1 => t('Link to configuration form'),
+      2 => t('Link to standalone form'),
+    );
+    $form['link'] = array(
+      '#type' => 'radios',
+      '#title' => t('Link importer name'),
+      '#description' => t('If "Link to standalone form" is used, only importers that use a standalone form will be linked.'),
+      '#default_value' => isset($this->options['link']) ? $this->options['link'] : FALSE,
+      '#options' => $options,
+    );
+  }
+
+  /**
+   * Overrides parent::render().
+   */
+  function render($values) {
+    try {
+      $importer = feeds_importer($values->{$this->field_alias})->existing();
+      if ($this->options['link'] == 1) {
+        return l($importer->config['name'], 'admin/structure/feeds/' . $importer->id);
+      }
+      elseif ($this->options['link'] == 2 && empty($importer->config['content_type'])) {
+        return l($importer->config['name'], 'import/' . $importer->id);
+      }
+      return check_plain($importer->config['name']);
+    }
+    catch (Exception $e) {
+      return t('Missing importer');
+    }
+  }
+
+  /**
+   * Disallows advanced rendering.
+   */
+  function allow_advanced_render() {
+    return FALSE;
+  }
+}
diff --git a/views/feeds_views_handler_field_log_message.inc b/views/feeds_views_handler_field_log_message.inc
new file mode 100644
index 0000000..6fcdeea
--- /dev/null
+++ b/views/feeds_views_handler_field_log_message.inc
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Views handler for displaying a log message.
+ */
+
+class feeds_views_handler_field_log_message extends views_handler_field {
+
+  /**
+   * Override parent::render().
+   */
+  function render($values) {
+    $message = $values->{$this->field_alias};
+    $variables = unserialize($values->{$this->aliases['variables']});
+    return t($message, $variables);
+  }
+
+  /**
+   * Disallow advanced rendering.
+   */
+  function allow_advanced_render() {
+    return FALSE;
+  }
+}
diff --git a/views/feeds_views_handler_field_severity.inc b/views/feeds_views_handler_field_severity.inc
new file mode 100644
index 0000000..c4bdf07
--- /dev/null
+++ b/views/feeds_views_handler_field_severity.inc
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Views handler for displaying the logs severity field.
+ */
+
+class feeds_views_handler_field_severity extends views_handler_field {
+
+  /**
+   * Override parent::render().
+   */
+  function render($values) {
+    $value = $values->{$this->field_alias};
+    $levels = watchdog_severity_levels();
+    return $levels[$value];
+  }
+
+  /**
+   * Disallow advanced rendering.
+   */
+  function allow_advanced_render() {
+    return FALSE;
+  }
+}
diff --git a/views/feeds_views_handler_filter_severity.inc b/views/feeds_views_handler_filter_severity.inc
new file mode 100644
index 0000000..4d9b949
--- /dev/null
+++ b/views/feeds_views_handler_filter_severity.inc
@@ -0,0 +1,13 @@
+<?php
+
+/**
+ * @file
+ * Filter by severity.
+ */
+
+class feeds_views_handler_filter_severity extends views_handler_filter_in_operator {
+  function get_value_options() {
+    $this->value_title = t('Severity');
+    $this->value_options = watchdog_severity_levels();
+  }
+}
