diff --git a/feeds_fast_news/feeds_fast_news.defaults.inc b/feeds_fast_news/feeds_fast_news.defaults.inc
new file mode 100644
index 0000000..2469c97
--- /dev/null
+++ b/feeds_fast_news/feeds_fast_news.defaults.inc
@@ -0,0 +1,212 @@
+<?php
+
+/**
+ * Helper to implementation of hook_ctools_plugin_api().
+ */
+function _feeds_fast_news_ctools_plugin_api() {
+  $args = func_get_args();
+  $module = array_shift($args);
+  $api = array_shift($args);
+  if ($module == "data" && $api == "data_default") {
+    return array("version" => 1);
+  }
+  else if ($module == "feeds" && $api == "feeds_importer_default") {
+    return array("version" => 1);
+  }
+}
+
+/**
+ * Helper to implementation of hook_data_default().
+ */
+function _feeds_fast_news_data_default() {
+  $export = array();
+  $data_table = new stdClass;
+  $data_table->disabled = FALSE; /* Edit this to true to make a default data_table disabled initially */
+  $data_table->api_version = 1;
+  $data_table->title = 'Fast feed';
+  $data_table->name = 'feeds_data_feed_fast';
+  $data_table->table_schema = array(
+    'fields' => array(
+      'feed_nid' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'id' => array(
+        'type' => 'serial',
+        'size' => 'normal',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'timestamp' => array(
+        'description' => 'The Unix timestamp for the data.',
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => FALSE,
+      ),
+      'title' => array(
+        'type' => 'varchar',
+        'length' => 255,
+        'not null' => FALSE,
+      ),
+      'description' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+      ),
+      'url' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+      ),
+      'guid' => array(
+        'type' => 'text',
+        'not null' => FALSE,
+      ),
+    ),
+    'indexes' => array(
+      'feed_nid' => array(
+        '0' => 'feed_nid',
+      ),
+      'id' => array(
+        '0' => 'id',
+      ),
+      'timestamp' => array(
+        '0' => 'timestamp',
+      ),
+      'url' => array(
+        '0' => array(
+          '0' => 'url',
+          '1' => 255,
+        ),
+      ),
+      'guid' => array(
+        '0' => array(
+          '0' => 'guid',
+          '1' => 255,
+        ),
+      ),
+    ),
+    'primary key' => array(
+      '0' => 'id',
+    ),
+  );
+  $data_table->meta = array(
+    'fields' => array(
+      'feed_nid' => array(
+        'label' => '',
+        'views_field_handler' => 'views_handler_field_numeric',
+        'views_filter_handler' => 'views_handler_filter_numeric',
+        'views_argument_handler' => 'views_handler_argument_numeric',
+        'views_sort_handler' => 'views_handler_sort',
+      ),
+      'id' => array(
+        'label' => '',
+        'views_field_handler' => 'views_handler_field_numeric',
+        'views_filter_handler' => 'views_handler_filter_numeric',
+        'views_argument_handler' => 'views_handler_argument_numeric',
+        'views_sort_handler' => 'views_handler_sort',
+      ),
+      'timestamp' => array(
+        'label' => '',
+        'views_field_handler' => 'views_handler_field_date',
+        'views_filter_handler' => 'views_handler_filter_date',
+        'views_argument_handler' => 'views_handler_argument_date',
+        'views_sort_handler' => 'views_handler_sort_date',
+      ),
+      'title' => array(
+        'label' => '',
+        'views_field_handler' => 'views_handler_field',
+        'views_filter_handler' => 'views_handler_filter_string',
+        'views_argument_handler' => 'views_handler_argument_string',
+        'views_sort_handler' => 'views_handler_sort',
+      ),
+      'description' => array(
+        'label' => '',
+        'views_field_handler' => 'views_handler_field',
+        'views_filter_handler' => 'views_handler_filter_string',
+        'views_argument_handler' => 'views_handler_argument',
+        'views_sort_handler' => 'views_handler_sort',
+      ),
+      'url' => array(
+        'label' => '',
+        'views_field_handler' => 'views_handler_field_url',
+        'views_filter_handler' => 'views_handler_filter_string',
+        'views_argument_handler' => 'views_handler_argument',
+        'views_sort_handler' => 'views_handler_sort',
+      ),
+      'guid' => array(
+        'label' => '',
+        'views_field_handler' => 'views_handler_field',
+        'views_filter_handler' => 'views_handler_filter_string',
+        'views_argument_handler' => 'views_handler_argument',
+        'views_sort_handler' => 'views_handler_sort',
+      ),
+    ),
+  );
+
+  $export['feeds_data_feed_fast'] = $data_table;
+  return $export;
+}
+
+/**
+ * Helper to implementation of hook_feeds_importer_default().
+ */
+function _feeds_fast_news_feeds_importer_default() {
+  $export = array();
+  $feeds_importer = new stdClass;
+  $feeds_importer->disabled = FALSE; /* Edit this to true to make a default feeds_importer disabled initially */
+  $feeds_importer->api_version = 1;
+  $feeds_importer->id = 'feed_fast';
+  $feeds_importer->config = array(
+    'name' => 'Fast feed',
+    'description' => 'Create light weight database records from feed items. Faster than aggregating nodes.',
+    'fetcher' => array(
+      'plugin_key' => 'FeedsHTTPFetcher',
+      'config' => array(
+        'auto_detect_feeds' => FALSE,
+        'use_pubsubhubbub' => FALSE,
+        'designated_hub' => '',
+      ),
+    ),
+    'parser' => array(
+      'plugin_key' => 'FeedsSyndicationParser',
+      'config' => array(),
+    ),
+    'processor' => array(
+      'plugin_key' => 'FeedsDataProcessor',
+      'config' => array(
+        'update_existing' => 0,
+        'expire' => '7257600',
+        'mappings' => array(
+          '0' => array(
+            'source' => 'title',
+            'target' => 'title',
+            'unique' => 0,
+          ),
+          '1' => array(
+            'source' => 'description',
+            'target' => 'description',
+            'unique' => 0,
+          ),
+          '2' => array(
+            'source' => 'url',
+            'target' => 'url',
+            'unique' => 1,
+          ),
+          '3' => array(
+            'source' => 'guid',
+            'target' => 'guid',
+            'unique' => 1,
+          ),
+        ),
+      ),
+    ),
+    'content_type' => 'feed_fast',
+    'update' => 0,
+    'import_period' => '1800',
+    'expire_period' => 3600,
+    'import_on_create' => 1,
+  );
+
+  $export['feed_fast'] = $feeds_importer;
+  return $export;
+}
diff --git a/feeds_fast_news/feeds_fast_news.features.inc b/feeds_fast_news/feeds_fast_news.features.inc
new file mode 100644
index 0000000..6361c0d
--- /dev/null
+++ b/feeds_fast_news/feeds_fast_news.features.inc
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Implementation of hook_ctools_plugin_api().
+ */
+function feeds_fast_news_ctools_plugin_api() {
+  module_load_include('inc', 'feeds_fast_news', 'feeds_fast_news.defaults');
+  $args = func_get_args();
+  return call_user_func_array('_feeds_fast_news_ctools_plugin_api', $args);
+}
+
+/**
+ * Implementation of hook_data_default().
+ */
+function feeds_fast_news_data_default() {
+  module_load_include('inc', 'feeds_fast_news', 'feeds_fast_news.defaults');
+  $args = func_get_args();
+  return call_user_func_array('_feeds_fast_news_data_default', $args);
+}
+
+/**
+ * Implementation of hook_feeds_importer_default().
+ */
+function feeds_fast_news_feeds_importer_default() {
+  module_load_include('inc', 'feeds_fast_news', 'feeds_fast_news.defaults');
+  $args = func_get_args();
+  return call_user_func_array('_feeds_fast_news_feeds_importer_default', $args);
+}
+
+/**
+ * Implementation of hook_node_info().
+ */
+function feeds_fast_news_node_info() {
+  module_load_include('inc', 'feeds_fast_news', 'feeds_fast_news.features.node');
+  $args = func_get_args();
+  return call_user_func_array('_feeds_fast_news_node_info', $args);
+}
diff --git a/feeds_fast_news/feeds_fast_news.features.node.inc b/feeds_fast_news/feeds_fast_news.features.node.inc
new file mode 100644
index 0000000..8afa901
--- /dev/null
+++ b/feeds_fast_news/feeds_fast_news.features.node.inc
@@ -0,0 +1,21 @@
+<?php
+
+/**
+ * Helper to implementation of hook_node_info().
+ */
+function _feeds_fast_news_node_info() {
+  $items = array(
+    'feed_fast' => array(
+      'name' => t('Fast feed'),
+      'module' => 'features',
+      'description' => t('Subscribe to RSS or Atom feeds. Create light weight database records from feed content.'),
+      'has_title' => '1',
+      'title_label' => t('Title'),
+      'has_body' => '1',
+      'body_label' => t('Body'),
+      'min_word_count' => '0',
+      'help' => '',
+    ),
+  );
+  return $items;
+}
diff --git a/feeds_fast_news/feeds_fast_news.info b/feeds_fast_news/feeds_fast_news.info
new file mode 100644
index 0000000..3e1381f
--- /dev/null
+++ b/feeds_fast_news/feeds_fast_news.info
@@ -0,0 +1,10 @@
+core = "6.x"
+dependencies[] = "feeds"
+dependencies[] = "features"
+features[ctools][] = "feeds:feeds_importer_default:1"
+features[feeds_importer][] = "feed_fast"
+features[node][] = "feed_fast"
+name = "Feeds fast news"
+description = "A fast news aggregator built with feeds, creates flat database records from imported feed items."
+package = "Feeds - examples"
+project = "Feeds"
diff --git a/feeds_fast_news/feeds_fast_news.install b/feeds_fast_news/feeds_fast_news.install
new file mode 100644
index 0000000..2df40de
--- /dev/null
+++ b/feeds_fast_news/feeds_fast_news.install
@@ -0,0 +1,35 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Install hooks.
+ */
+
+/**
+ * Implementation of hook_schema().
+ */
+function feeds_fast_news_schema() {
+  // Install data tables.
+  include_once('feeds_fast_news.features.inc');
+  $tables = feeds_fast_news_data_default();
+  $schema = array();
+  foreach ($tables as $name => $table) {
+    $schema[$name] = $table->table_schema;
+  }
+  return $schema;
+}
+
+/**
+ * Implementation of hook_install().
+ */
+function feeds_fast_news_install() {
+  drupal_install_schema('feeds_fast_news');
+}
+
+/**
+ * Implementation of hook_uninstall();
+ */
+function feeds_defaults_uninstall() {
+  drupal_uninstall_schema('feeds_fast_news');
+}
diff --git a/feeds_fast_news/feeds_fast_news.module b/feeds_fast_news/feeds_fast_news.module
new file mode 100644
index 0000000..ead9b39
--- /dev/null
+++ b/feeds_fast_news/feeds_fast_news.module
@@ -0,0 +1,3 @@
+<?php
+
+include_once('feeds_fast_news.features.inc');
diff --git a/feeds_fast_news/feeds_fast_news.test b/feeds_fast_news/feeds_fast_news.test
new file mode 100644
index 0000000..92b1602
--- /dev/null
+++ b/feeds_fast_news/feeds_fast_news.test
@@ -0,0 +1,86 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Tests for feeds_fast_news feature.
+ */
+
+// Require FeedsWebTestCase class definition.
+require_once(dirname(__FILE__) .'/../tests/feeds.test.inc');
+
+/**
+ * Test Feed fast configuration.
+ */
+class FeedsExamplesFastFeedTestCase extends FeedsWebTestCase {
+
+  /**
+   * Set up test.
+   */
+  public function setUp() {
+    parent::setUp('feeds', 'feeds_ui', 'ctools', 'features', 'feeds_fast_news', 'data', 'data_ui', 'views', 'views_ui');
+
+    $this->drupalLogin(
+      $this->drupalCreateUser(
+        array(
+          'administer feeds', 'administer nodes', 'administer data tables',
+        )
+      )
+    );
+  }
+
+  /**
+   * Describe this test.
+   */
+  public function getInfo() {
+    return array(
+      'name' => t('Example features: Fast feed'),
+      'description' => t('Test "Fast feed" default configuration <strong>Requires Data, Features and Views.</strong>'),
+      'group' => t('Feeds'),
+    );
+  }
+
+  /**
+   * Run tests.
+   */
+  public function test() {
+
+    // Enable configuration and assert status.
+    $this->drupalGet('admin/build/data');
+    $this->assertText('feeds_data_feed_fast');
+    $this->drupalGet('admin/content/data/view/feeds_data_feed_fast');
+    $this->assertText('Fast feed');
+    $this->assertText('There is no data in this table.');
+
+    // Create feed node.
+    $nid = $this->createFeedNode('feed_fast', NULL, '', 'feed_fast');
+    $this->assertText('Created 10 items.');
+
+    // Verify presence of aggregated items.
+    $this->drupalGet('admin/content/data/view/feeds_data_feed_fast');
+    $this->assertText('Open Atrium Translation Workflow: Two Way Translation Updates');
+    $this->assertText('n a word, nothing. There has been a major improvement on this front. Now your translation');
+    $this->assertLink('http://developmentseed.org/blog/2009/oct/06/open-atrium-translation-workflow-two-way-updating');
+
+    // Delete and re import.
+    $this->drupalPost('node/'. $nid .'/delete-items', array(), 'Delete');
+    $this->assertText('Deleted 10 items.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_data_feed_fast}"));
+    $this->assertEqual($count, 0, 'Found correct number of items.');
+
+    $this->drupalPost('node/'. $nid .'/delete-items', array(), 'Delete');
+    $this->assertText('Deleted 0 items.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_data_feed_fast}"));
+    $this->assertEqual($count, 0, 'Found correct number of items.');
+
+    $this->drupalPost('node/'. $nid .'/import', array(), 'Import');
+    $this->assertText('Created 10 items.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_data_feed_fast}"));
+    $this->assertEqual($count, 10, 'Found correct number of items.');
+
+    $this->drupalPost('node/'. $nid .'/import', array(), 'Import');
+    $this->assertText('There are no new items.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_data_feed_fast}"));
+    $this->assertEqual($count, 10, 'Found correct number of items.');
+  }
+}
diff --git a/feeds_import/feeds_import.defaults.inc b/feeds_import/feeds_import.defaults.inc
new file mode 100644
index 0000000..a351d9e
--- /dev/null
+++ b/feeds_import/feeds_import.defaults.inc
@@ -0,0 +1,176 @@
+<?php
+
+/**
+ * Helper to implementation of hook_ctools_plugin_api().
+ */
+function _feeds_import_ctools_plugin_api() {
+  $args = func_get_args();
+  $module = array_shift($args);
+  $api = array_shift($args);
+  if ($module == "feeds" && $api == "feeds_importer_default") {
+    return array("version" => 1);
+  }
+}
+
+/**
+ * Helper to implementation of hook_feeds_importer_default().
+ */
+function _feeds_import_feeds_importer_default() {
+  $export = array();
+  $feeds_importer = new stdClass;
+  $feeds_importer->disabled = FALSE; /* Edit this to true to make a default feeds_importer disabled initially */
+  $feeds_importer->api_version = 1;
+  $feeds_importer->id = 'node';
+  $feeds_importer->config = array(
+    'name' => 'Node import',
+    'description' => 'Import nodes from CSV file.',
+    'fetcher' => array(
+      'plugin_key' => 'FeedsFileFetcher',
+      'config' => array(
+        'direct' => FALSE,
+      ),
+    ),
+    'parser' => array(
+      'plugin_key' => 'FeedsCSVParser',
+      'config' => array(
+        'delimiter' => ',',
+      ),
+    ),
+    'processor' => array(
+      'plugin_key' => 'FeedsNodeProcessor',
+      'config' => array(
+        'content_type' => 'story',
+        'update_existing' => 1,
+        'expire' => '-1',
+        'mappings' => array(
+          '0' => array(
+            'source' => 'title',
+            'target' => 'title',
+            'unique' => FALSE,
+          ),
+          '1' => array(
+            'source' => 'body',
+            'target' => 'body',
+            'unique' => FALSE,
+          ),
+          '2' => array(
+            'source' => 'published',
+            'target' => 'created',
+            'unique' => FALSE,
+          ),
+          '3' => array(
+            'source' => 'guid',
+            'target' => 'guid',
+            'unique' => 1,
+          ),
+        ),
+        'input_format' => 0,
+        'author' => 0,
+      ),
+    ),
+    'content_type' => '',
+    'update' => 0,
+    'import_period' => '-1',
+    'expire_period' => 3600,
+    'import_on_create' => 1,
+  );
+
+  $export['node'] = $feeds_importer;
+  $feeds_importer = new stdClass;
+  $feeds_importer->disabled = FALSE; /* Edit this to true to make a default feeds_importer disabled initially */
+  $feeds_importer->api_version = 1;
+  $feeds_importer->id = 'opml';
+  $feeds_importer->config = array(
+    'name' => 'OPML import',
+    'description' => 'Import subscriptions from OPML files. Use together with "Feed" configuration.',
+    'fetcher' => array(
+      'plugin_key' => 'FeedsFileFetcher',
+      'config' => array(
+        'direct' => FALSE,
+      ),
+    ),
+    'parser' => array(
+      'plugin_key' => 'FeedsOPMLParser',
+      'config' => array(),
+    ),
+    'processor' => array(
+      'plugin_key' => 'FeedsFeedNodeProcessor',
+      'config' => array(
+        'content_type' => 'feed',
+        'update_existing' => 0,
+        'mappings' => array(
+          '0' => array(
+            'source' => 'title',
+            'target' => 'title',
+            'unique' => FALSE,
+          ),
+          '1' => array(
+            'source' => 'xmlurl',
+            'target' => 'source',
+            'unique' => 1,
+          ),
+        ),
+      ),
+    ),
+    'content_type' => '',
+    'update' => 0,
+    'import_period' => '-1',
+    'expire_period' => 3600,
+    'import_on_create' => 1,
+  );
+
+  $export['opml'] = $feeds_importer;
+  $feeds_importer = new stdClass;
+  $feeds_importer->disabled = FALSE; /* Edit this to true to make a default feeds_importer disabled initially */
+  $feeds_importer->api_version = 1;
+  $feeds_importer->id = 'user';
+  $feeds_importer->config = array(
+    'name' => 'User import',
+    'description' => 'Import users from CSV file.',
+    'fetcher' => array(
+      'plugin_key' => 'FeedsFileFetcher',
+      'config' => array(
+        'direct' => FALSE,
+      ),
+    ),
+    'parser' => array(
+      'plugin_key' => 'FeedsCSVParser',
+      'config' => array(
+        'delimiter' => ',',
+      ),
+    ),
+    'processor' => array(
+      'plugin_key' => 'FeedsUserProcessor',
+      'config' => array(
+        'roles' => array(),
+        'update_existing' => FALSE,
+        'status' => 1,
+        'mappings' => array(
+          '0' => array(
+            'source' => 'name',
+            'target' => 'name',
+            'unique' => 0,
+          ),
+          '1' => array(
+            'source' => 'mail',
+            'target' => 'mail',
+            'unique' => 1,
+          ),
+          '2' => array(
+            'source' => 'created',
+            'target' => 'created',
+            'unique' => FALSE,
+          ),
+        ),
+      ),
+    ),
+    'content_type' => '',
+    'update' => 0,
+    'import_period' => '-1',
+    'expire_period' => 3600,
+    'import_on_create' => 1,
+  );
+
+  $export['user'] = $feeds_importer;
+  return $export;
+}
diff --git a/feeds_import/feeds_import.features.inc b/feeds_import/feeds_import.features.inc
new file mode 100644
index 0000000..808e533
--- /dev/null
+++ b/feeds_import/feeds_import.features.inc
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * Implementation of hook_ctools_plugin_api().
+ */
+function feeds_import_ctools_plugin_api() {
+  module_load_include('inc', 'feeds_import', 'feeds_import.defaults');
+  $args = func_get_args();
+  return call_user_func_array('_feeds_import_ctools_plugin_api', $args);
+}
+
+/**
+ * Implementation of hook_feeds_importer_default().
+ */
+function feeds_import_feeds_importer_default() {
+  module_load_include('inc', 'feeds_import', 'feeds_import.defaults');
+  $args = func_get_args();
+  return call_user_func_array('_feeds_import_feeds_importer_default', $args);
+}
diff --git a/feeds_import/feeds_import.info b/feeds_import/feeds_import.info
new file mode 100644
index 0000000..b3141a6
--- /dev/null
+++ b/feeds_import/feeds_import.info
@@ -0,0 +1,9 @@
+core = "6.x"
+dependencies[] = "feeds"
+features[ctools][] = "feeds:feeds_importer_default:1"
+features[feeds_importer][] = "node"
+features[feeds_importer][] = "user"
+name = "Feeds import"
+description = "An example of a node importer and a user importer."
+package = "Feeds - examples"
+project = "Feeds"
diff --git a/feeds_import/feeds_import.module b/feeds_import/feeds_import.module
new file mode 100644
index 0000000..a7b4753
--- /dev/null
+++ b/feeds_import/feeds_import.module
@@ -0,0 +1,3 @@
+<?php
+
+include_once('feeds_import.features.inc');
diff --git a/feeds_import/feeds_import.test b/feeds_import/feeds_import.test
new file mode 100644
index 0000000..7e579e8
--- /dev/null
+++ b/feeds_import/feeds_import.test
@@ -0,0 +1,175 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Tests for feeds_import feature.
+ */
+
+// Require FeedsWebTestCase class definition.
+require_once(dirname(__FILE__) .'/../tests/feeds.test.inc');
+
+/**
+ * Test Node import configuration.
+ */
+class FeedsExamplesNodeTestCase extends FeedsWebTestCase {
+
+  /**
+   * Set up test.
+   */
+  public function setUp() {
+    parent::setUp('feeds', 'feeds_ui', 'ctools', 'feeds_import');
+
+    $this->drupalLogin(
+      $this->drupalCreateUser(
+        array(
+          'administer feeds', 'administer nodes',
+        )
+      )
+    );
+  }
+
+  /**
+   * Describe this test.
+   */
+  public function getInfo() {
+    return array(
+      'name' => t('Example features: Node import'),
+      'description' => t('Test "Node import" default configuration.'),
+      'group' => t('Feeds'),
+    );
+  }
+
+  /**
+   * Run tests.
+   */
+  public function test() {
+    // Import file.
+    $this->importFile('node', $this->absolutePath() .'/tests/feeds/nodes.csv');
+
+    // Assert returning page.
+    $this->assertText('Created 8 Story nodes.');
+    $this->assertText('Import CSV files with one or more of these columns: title, body, published, guid.');
+    $this->assertText('Column guid is mandatory and considered unique: only one item per guid value will be created.');
+    $this->assertRaw('feeds/nodes.csv');
+
+    // Assert created nodes.
+    $this->drupalGet('node');
+    $this->assertText('Typi non habent');
+    $this->assertText('Eodem modo typi');
+    $this->assertText('Eodem modo typi, qui nunc nobis videntur parum clari, fiant sollemnes in futurum.');
+    $this->assertText('Lorem ipsum');
+    $this->assertText('Ut wisi enim ad minim veniam');
+    $this->assertText('1976');
+    // Nam liber tempor has the same GUID as Lorem ipsum.
+    $this->assertNoText('Nam liber tempor');
+
+    // Click through to one node.
+    $this->clickLink('Lorem ipsum');
+    $this->assertText('Lorem ipsum');
+    $this->assertText('Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.');
+    $this->assertText('Anonymous');
+
+    // Assert DB status as is and again after an additional import.
+    for ($i = 0; $i < 2; $i++) {
+      $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_node_item}"));
+      $this->assertEqual($count, 8, 'Found correct number of items.');
+      $count = db_result(db_query("SELECT COUNT(*) FROM {node} WHERE type = 'story' AND status = 1 AND uid = 0"));
+      $this->assertEqual($count, 8, 'Found correct number of items.');
+      // Do not filter on type intentionally. There shouldn't be more than 8 nodes total.
+      $count = db_result(db_query("SELECT COUNT(*) FROM {node_revisions}"));
+      $this->assertEqual($count, 8, 'Found correct number of items.');
+
+      // Import again. Feeds only updates items that haven't changed. However,
+      // there are 2 different items with the same GUID in nodes.csv.
+      // Therefore, feeds will show updates to 2 nodes.
+      $this->drupalPost('import/node/import', array(), 'Import');
+      $this->assertText('Updated 2 Story nodes.');
+    }
+
+    // Remove all nodes.
+    $this->drupalPost('import/node/delete-items', array(), 'Delete');
+    $this->assertText('Deleted 8 nodes.');
+
+    // Import once again.
+    $this->drupalPost('import/node/import', array(), 'Import');
+    $this->assertText('Created 8 Story nodes.');
+
+    // Import a similar file with changes in 4 records. Feeds should report 6
+    // Updated story nodes (4 changed records, 2 records sharing a GUID
+    // subsequently being updated).
+    $this->importFile('node', $this->absolutePath() .'/tests/feeds/nodes_changes.csv');
+    $this->assertText('Updated 6 Story nodes.');
+
+    // Import a larger file with more records.
+    $this->importFile('node', $this->absolutePath() .'/tests/feeds/many_nodes.csv');
+    $this->assertText('Created 71 Story nodes.');
+
+    // Remove all nodes.
+    $this->drupalPost('import/node/delete-items', array(), 'Delete');
+    $this->assertText('Deleted 79 nodes.');
+
+    // Import once again.
+    $this->drupalPost('import/node/import', array(), 'Import');
+    $this->assertText('Created 79 Story nodes.');
+
+    // Import a tab separated file.
+    $this->drupalPost('import/node/delete-items', array(), 'Delete');
+    $edit = array(
+      'files[feeds]' => $this->absolutePath() .'/tests/feeds/nodes.tsv',
+      'feeds[FeedsCSVParser][delimiter]' => "TAB",
+    );
+    $this->drupalPost('import/node', $edit, 'Import');
+    $this->assertText('Created 8 Story nodes.');
+  }
+}
+
+/**
+ * Test User import configuration.
+ */
+class FeedsExamplesUserTestCase extends FeedsWebTestCase {
+
+  /**
+   * Set up test.
+   */
+  public function setUp() {
+    parent::setUp('feeds', 'feeds_ui', 'ctools', 'feeds_import');
+
+    $this->drupalLogin(
+      $this->drupalCreateUser(
+        array(
+          'administer feeds', 'administer users',
+        )
+      )
+    );
+  }
+
+  /**
+   * Describe this test.
+   */
+  public function getInfo() {
+    return array(
+      'name' => t('Example features: User import'),
+      'description' => t('Test "User import" default configuration.'),
+      'group' => t('Feeds'),
+    );
+  }
+
+  /**
+   * Run tests.
+   */
+  public function test() {
+    // Import CSV file.
+    $this->importFile('user', $this->absolutePath() .'/tests/feeds/users.csv');
+
+    // Assert result.
+    $this->assertText('Created 4 users.');
+    // 1 user has an invalid email address.
+    $this->assertText('There was 1 user that could not be imported because either their name or their email was empty or not valid. Check import data and mapping settings on User processor.');
+    $this->drupalGet('admin/user/user');
+    $this->assertText('Morticia');
+    $this->assertText('Fester');
+    $this->assertText('Gomez');
+    $this->assertText('Pugsley');
+  }
+}
diff --git a/feeds_news/feeds_news.defaults.inc b/feeds_news/feeds_news.defaults.inc
new file mode 100644
index 0000000..358f597
--- /dev/null
+++ b/feeds_news/feeds_news.defaults.inc
@@ -0,0 +1,129 @@
+<?php
+
+/**
+ * Helper to implementation of hook_ctools_plugin_api().
+ */
+function _feeds_news_ctools_plugin_api() {
+  $args = func_get_args();
+  $module = array_shift($args);
+  $api = array_shift($args);
+  if ($module == "feeds" && $api == "feeds_importer_default") {
+    return array("version" => 1);
+  }
+}
+
+/**
+ * Helper to implementation of hook_feeds_importer_default().
+ */
+function _feeds_news_feeds_importer_default() {
+  $export = array();
+  $feeds_importer = new stdClass;
+  $feeds_importer->disabled = FALSE; /* Edit this to true to make a default feeds_importer disabled initially */
+  $feeds_importer->api_version = 1;
+  $feeds_importer->id = 'feed';
+  $feeds_importer->config = array(
+    'name' => 'Feed',
+    'description' => 'Import RSS or Atom feeds, create nodes from feed items.',
+    'fetcher' => array(
+      'plugin_key' => 'FeedsHTTPFetcher',
+      'config' => array(
+        'auto_detect_feeds' => FALSE,
+        'use_pubsubhubbub' => FALSE,
+        'designated_hub' => '',
+      ),
+    ),
+    'parser' => array(
+      'plugin_key' => 'FeedsSyndicationParser',
+      'config' => array(),
+    ),
+    'processor' => array(
+      'plugin_key' => 'FeedsNodeProcessor',
+      'config' => array(
+        'content_type' => 'feed_item',
+        'update_existing' => 0,
+        'expire' => '-1',
+        'mappings' => array(
+          '0' => array(
+            'source' => 'title',
+            'target' => 'title',
+            'unique' => FALSE,
+          ),
+          '1' => array(
+            'source' => 'description',
+            'target' => 'body',
+            'unique' => FALSE,
+          ),
+          '2' => array(
+            'source' => 'timestamp',
+            'target' => 'created',
+            'unique' => FALSE,
+          ),
+          '3' => array(
+            'source' => 'url',
+            'target' => 'url',
+            'unique' => TRUE,
+          ),
+          '4' => array(
+            'source' => 'guid',
+            'target' => 'guid',
+            'unique' => TRUE,
+          ),
+        ),
+        'input_format' => 0,
+        'author' => 0,
+      ),
+    ),
+    'content_type' => 'feed',
+    'update' => 0,
+    'import_period' => '1800',
+    'expire_period' => 3600,
+    'import_on_create' => 1,
+  );
+
+  $export['feed'] = $feeds_importer;
+  $feeds_importer = new stdClass;
+  $feeds_importer->disabled = FALSE; /* Edit this to true to make a default feeds_importer disabled initially */
+  $feeds_importer->api_version = 1;
+  $feeds_importer->id = 'opml';
+  $feeds_importer->config = array(
+    'name' => 'OPML import',
+    'description' => 'Import subscriptions from OPML files. Use together with "Feed" configuration.',
+    'fetcher' => array(
+      'plugin_key' => 'FeedsFileFetcher',
+      'config' => array(
+        'direct' => FALSE,
+      ),
+    ),
+    'parser' => array(
+      'plugin_key' => 'FeedsOPMLParser',
+      'config' => array(),
+    ),
+    'processor' => array(
+      'plugin_key' => 'FeedsFeedNodeProcessor',
+      'config' => array(
+        'content_type' => 'feed',
+        'update_existing' => 0,
+        'mappings' => array(
+          '0' => array(
+            'source' => 'title',
+            'target' => 'title',
+            'unique' => FALSE,
+          ),
+          '1' => array(
+            'source' => 'xmlurl',
+            'target' => 'source',
+            'unique' => 1,
+          ),
+        ),
+      ),
+    ),
+    'content_type' => '',
+    'update' => 0,
+    'import_period' => '-1',
+    'expire_period' => 3600,
+    'import_on_create' => 1,
+  );
+
+  $export['opml'] = $feeds_importer;
+  return $export;
+}
diff --git a/feeds_news/feeds_news.features.inc b/feeds_news/feeds_news.features.inc
new file mode 100644
index 0000000..f6aa7e9
--- /dev/null
+++ b/feeds_news/feeds_news.features.inc
@@ -0,0 +1,37 @@
+<?php
+
+/**
+ * Implementation of hook_ctools_plugin_api().
+ */
+function feeds_news_ctools_plugin_api() {
+  module_load_include('inc', 'feeds_news', 'feeds_news.defaults');
+  $args = func_get_args();
+  return call_user_func_array('_feeds_news_ctools_plugin_api', $args);
+}
+
+/**
+ * Implementation of hook_feeds_importer_default().
+ */
+function feeds_news_feeds_importer_default() {
+  module_load_include('inc', 'feeds_news', 'feeds_news.defaults');
+  $args = func_get_args();
+  return call_user_func_array('_feeds_news_feeds_importer_default', $args);
+}
+
+/**
+ * Implementation of hook_node_info().
+ */
+function feeds_news_node_info() {
+  module_load_include('inc', 'feeds_news', 'feeds_news.features.node');
+  $args = func_get_args();
+  return call_user_func_array('_feeds_news_node_info', $args);
+}
+
+/**
+ * Implementation of hook_views_default_views().
+ */
+function feeds_news_views_default_views() {
+  module_load_include('inc', 'feeds_news', 'feeds_news.features.views');
+  $args = func_get_args();
+  return call_user_func_array('_feeds_news_views_default_views', $args);
+}
diff --git a/feeds_news/feeds_news.features.node.inc b/feeds_news/feeds_news.features.node.inc
new file mode 100644
index 0000000..0ff5066
--- /dev/null
+++ b/feeds_news/feeds_news.features.node.inc
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * Helper to implementation of hook_node_info().
+ */
+function _feeds_news_node_info() {
+  $items = array(
+    'feed' => array(
+      'name' => t('Feed'),
+      'module' => 'features',
+      'description' => t('Subscribe to RSS or Atom feeds. Creates nodes of the content type "Feed item" from feed content.'),
+      'has_title' => '1',
+      'title_label' => t('Title'),
+      'has_body' => '1',
+      'body_label' => t('Body'),
+      'min_word_count' => '0',
+      'help' => '',
+    ),
+    'feed_item' => array(
+      'name' => t('Feed item'),
+      'module' => 'features',
+      'description' => t('This content type is being used for automatically aggregated content from feeds.'),
+      'has_title' => '1',
+      'title_label' => t('Title'),
+      'has_body' => '1',
+      'body_label' => t('Body'),
+      'min_word_count' => '0',
+      'help' => '',
+    ),
+  );
+  return $items;
+}
diff --git a/feeds_news/feeds_news.features.views.inc b/feeds_news/feeds_news.features.views.inc
new file mode 100644
index 0000000..a7c8c1a
--- /dev/null
+++ b/feeds_news/feeds_news.features.views.inc
@@ -0,0 +1,368 @@
+<?php
+
+/**
+ * Helper to implementation of hook_views_default_views().
+ */
+function _feeds_news_views_default_views() {
+  $views = array();
+
+  // Exported view: feeds_defaults_feed_items
+  $view = new view;
+  $view->name = 'feeds_defaults_feed_items';
+  $view->description = 'Show feed items for a feed node. Use together with default importer configuration "Feed".';
+  $view->tag = 'Feeds defaults';
+  $view->view_php = '';
+  $view->base_table = 'node';
+  $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('relationships', array(
+    'feed_nid' => array(
+      'label' => 'Owner feed',
+      'required' => 1,
+      'id' => 'feed_nid',
+      'table' => 'feeds_node_item',
+      'field' => 'feed_nid',
+      'override' => array(
+        'button' => 'Override',
+      ),
+      'relationship' => 'none',
+    ),
+  ));
+  $handler->override_option('fields', array(
+    'url' => array(
+      'label' => '',
+      'alter' => array(
+        'alter_text' => 0,
+        'text' => '',
+        'make_link' => 0,
+        'path' => '',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'target' => '',
+        'help' => '',
+        'trim' => 0,
+        'max_length' => '',
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'html' => 0,
+        'strip_tags' => 0,
+      ),
+      'empty' => '',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'display_as_link' => 1,
+      'exclude' => 1,
+      'id' => 'url',
+      'table' => 'feeds_node_item',
+      'field' => 'url',
+      'override' => array(
+        'button' => 'Override',
+      ),
+      'relationship' => 'none',
+    ),
+    'title' => array(
+      'label' => '',
+      'alter' => array(
+        'alter_text' => 0,
+        'text' => '',
+        'make_link' => 1,
+        'path' => '[url]',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '<h2>',
+        'suffix' => '</h2>',
+        'target' => '',
+        'help' => '',
+        'trim' => 0,
+        'max_length' => '',
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'html' => 0,
+        'strip_tags' => 0,
+      ),
+      'empty' => '',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'link_to_node' => 0,
+      'exclude' => 0,
+      'id' => 'title',
+      'table' => 'node',
+      'field' => 'title',
+      'override' => array(
+        'button' => 'Override',
+      ),
+      'relationship' => 'none',
+    ),
+    'title_1' => array(
+      'label' => '',
+      'alter' => array(
+        'alter_text' => 0,
+        'text' => '',
+        'make_link' => 0,
+        'path' => '',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'target' => '',
+        'help' => '',
+        'trim' => 0,
+        'max_length' => '',
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'html' => 0,
+        'strip_tags' => 0,
+      ),
+      'empty' => '',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'link_to_node' => 1,
+      'exclude' => 1,
+      'id' => 'title_1',
+      'table' => 'node',
+      'field' => 'title',
+      'override' => array(
+        'button' => 'Override',
+      ),
+      'relationship' => 'feed_nid',
+    ),
+    'nothing' => array(
+      'label' => '',
+      'alter' => array(
+        'text' => 'From [title_1]',
+        'make_link' => 0,
+        'path' => '',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'target' => '',
+        'help' => '',
+        'trim' => 0,
+        'max_length' => '',
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'html' => 0,
+        'strip_tags' => 0,
+      ),
+      'empty' => '',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'exclude' => 0,
+      'id' => 'nothing',
+      'table' => 'views',
+      'field' => 'nothing',
+      'override' => array(
+        'button' => 'Override',
+      ),
+      'relationship' => 'none',
+    ),
+    'body' => array(
+      'label' => '',
+      'alter' => array(
+        'alter_text' => 0,
+        'text' => '',
+        'make_link' => 0,
+        'path' => '',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'target' => '',
+        'help' => '',
+        'trim' => 0,
+        'max_length' => '',
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'html' => 0,
+        'strip_tags' => 0,
+      ),
+      'empty' => '',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'exclude' => 0,
+      'id' => 'body',
+      'table' => 'node_revisions',
+      'field' => 'body',
+      'override' => array(
+        'button' => 'Override',
+      ),
+      'relationship' => 'none',
+    ),
+    'edit_node' => array(
+      'label' => '',
+      'alter' => array(
+        'alter_text' => 0,
+        'text' => '',
+        'make_link' => 0,
+        'path' => '',
+        'link_class' => '',
+        'alt' => '',
+        'prefix' => '',
+        'suffix' => '',
+        'target' => '',
+        'help' => '',
+        'trim' => 0,
+        'max_length' => '',
+        'word_boundary' => 1,
+        'ellipsis' => 1,
+        'html' => 0,
+        'strip_tags' => 0,
+      ),
+      'empty' => '',
+      'hide_empty' => 0,
+      'empty_zero' => 0,
+      'text' => 'Edit',
+      'exclude' => 0,
+      'id' => 'edit_node',
+      'table' => 'node',
+      'field' => 'edit_node',
+      'override' => array(
+        'button' => 'Override',
+      ),
+      'relationship' => 'none',
+    ),
+  ));
+  $handler->override_option('arguments', array(
+    'nid' => array(
+      'default_action' => 'empty',
+      'style_plugin' => 'default_summary',
+      'style_options' => array(),
+      'wildcard' => 'all',
+      'wildcard_substitution' => 'All',
+      'title' => 'Articles from %1',
+      'breadcrumb' => '',
+      'default_argument_type' => 'fixed',
+      'default_argument' => '',
+      'validate_type' => 'none',
+      'validate_fail' => 'not found',
+      'break_phrase' => 0,
+      'not' => 0,
+      'id' => 'nid',
+      'table' => 'node',
+      'field' => 'nid',
+      'validate_user_argument_type' => 'uid',
+      'validate_user_roles' => array(
+        '2' => 0,
+      ),
+      'relationship' => 'feed_nid',
+      'default_options_div_prefix' => '',
+      'default_argument_fixed' => '',
+      'default_argument_user' => 0,
+      'default_argument_php' => '',
+      'validate_argument_node_type' => array(
+        'feed' => 0,
+        'feed_item' => 0,
+        'story' => 0,
+      ),
+      'validate_argument_node_access' => 0,
+      'validate_argument_nid_type' => 'nid',
+      'validate_argument_vocabulary' => array(),
+      'validate_argument_type' => 'tid',
+      'validate_argument_transform' => 0,
+      'validate_user_restrict_roles' => 0,
+      'validate_argument_php' => '',
+      'override' => array(
+        'button' => 'Override',
+      ),
+    ),
+  ));
+  $handler->override_option('filters', array(
+    'type' => array(
+      'operator' => 'in',
+      'value' => array(
+        'feed_item' => 'feed_item',
+      ),
+      'group' => '0',
+      'exposed' => FALSE,
+      'expose' => array(
+        'operator' => FALSE,
+        'label' => '',
+      ),
+      'id' => 'type',
+      'table' => 'node',
+      'field' => 'type',
+      'override' => array(
+        'button' => 'Override',
+      ),
+      'relationship' => 'none',
+    ),
+  ));
+  $handler->override_option('access', array(
+    'type' => 'perm',
+    'perm' => 'access content',
+  ));
+  $handler->override_option('cache', array(
+    'type' => 'none',
+  ));
+  $handler->override_option('empty', 'There are no items for this feed at the moment.');
+  $handler->override_option('empty_format', '1');
+  $handler = $view->new_display('page', 'Page', 'page_1');
+  $handler->override_option('arguments', array(
+    'nid' => array(
+      'default_action' => 'empty',
+      'style_plugin' => 'default_summary',
+      'style_options' => array(),
+      'wildcard' => 'all',
+      'wildcard_substitution' => 'All',
+      'title' => 'All items from %1',
+      'breadcrumb' => '',
+      'default_argument_type' => 'fixed',
+      'default_argument' => '',
+      'validate_type' => 'node',
+      'validate_fail' => 'not found',
+      'break_phrase' => 0,
+      'not' => 0,
+      'id' => 'nid',
+      'table' => 'node',
+      'field' => 'nid',
+      'validate_user_argument_type' => 'uid',
+      'validate_user_roles' => array(
+        '2' => 0,
+      ),
+      'relationship' => 'feed_nid',
+      'default_options_div_prefix' => '',
+      'default_argument_fixed' => '',
+      'default_argument_user' => 0,
+      'default_argument_php' => '',
+      'validate_argument_node_type' => array(
+        'feed' => 'feed',
+        'feed_item' => 0,
+        'story' => 0,
+      ),
+      'validate_argument_node_access' => 0,
+      'validate_argument_nid_type' => 'nid',
+      'validate_argument_vocabulary' => array(),
+      'validate_argument_type' => 'tid',
+      'validate_argument_transform' => 0,
+      'validate_user_restrict_roles' => 0,
+      'validate_argument_php' => '',
+      'override' => array(
+        'button' => 'Use default',
+      ),
+    ),
+  ));
+  $handler->override_option('path', 'node/%/feed-items');
+  $handler->override_option('menu', array(
+    'type' => 'tab',
+    'title' => 'View items',
+    'description' => '',
+    'weight' => '0',
+    'name' => 'navigation',
+  ));
+  $handler->override_option('tab_options', array(
+    'type' => 'none',
+    'title' => '',
+    'description' => '',
+    'weight' => 0,
+    'name' => 'navigation',
+  ));
+
+  $views[$view->name] = $view;
+
+  return $views;
+}
diff --git a/feeds_news/feeds_news.info b/feeds_news/feeds_news.info
new file mode 100644
index 0000000..3618bb0
--- /dev/null
+++ b/feeds_news/feeds_news.info
@@ -0,0 +1,14 @@
+core = "6.x"
+dependencies[] = "feeds"
+dependencies[] = "features"
+dependencies[] = "views"
+description = "A news aggregator built with feeds, creates nodes from imported feed items. With OPML import."
+features[ctools][] = "feeds:feeds_importer_default:1"
+features[feeds_importer][] = "feed"
+features[feeds_importer][] = "opml"
+features[node][] = "feed"
+features[node][] = "feed_item"
+features[views][] = "feeds_defaults_feed_items"
+name = "Feeds news"
+package = "Feeds - examples"
+project = "Feeds"
diff --git a/feeds_news/feeds_news.module b/feeds_news/feeds_news.module
new file mode 100644
index 0000000..5c4fce3
--- /dev/null
+++ b/feeds_news/feeds_news.module
@@ -0,0 +1,3 @@
+<?php
+
+include_once('feeds_news.features.inc');
diff --git a/feeds_news/feeds_news.test b/feeds_news/feeds_news.test
new file mode 100644
index 0000000..a2677f2
--- /dev/null
+++ b/feeds_news/feeds_news.test
@@ -0,0 +1,149 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Tests for feeds_news feature.
+ */
+
+// Require FeedsWebTestCase class definition.
+require_once(dirname(__FILE__) .'/../tests/feeds.test.inc');
+
+/**
+ * Test Feed configuration.
+ */
+class FeedsExamplesFeedTestCase extends FeedsWebTestCase {
+
+  /**
+   * Set up test.
+   */
+  public function setUp() {
+    parent::setUp('feeds', 'feeds_ui', 'ctools', 'features', 'feeds_news');
+
+    $this->drupalLogin(
+      $this->drupalCreateUser(
+        array(
+          'administer feeds', 'administer nodes',
+        )
+      )
+    );
+  }
+
+  /**
+   * Describe this test.
+   */
+  public function getInfo() {
+    return array(
+      'name' => t('Example features: Feed'),
+      'description' => t('Test "Feed" default configuration. <strong>Requires Features.</strong>'),
+      'group' => t('Feeds'),
+    );
+  }
+
+  /**
+   * Run tests.
+   */
+  public function test() {
+    $nid = $this->createFeedNode('feed', NULL, '', 'feed');
+
+    // Assert results.
+    $count = db_result(db_query("SELECT COUNT(*) FROM {node} WHERE type = 'feed_item'"));
+    $this->assertEqual($count, 10, 'Found the correct number of feed item nodes in database.');
+
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_node_item}"));
+    $this->assertEqual($count, 10, 'Found the correct number of records in feeds_node_item.');
+
+    $count = db_result(db_query("SELECT COUNT(*) FROM {node} WHERE title = 'Open Atrium Translation Workflow: Two Way Translation Updates'"));
+    $this->assertEqual($count, 1, 'Found title.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {node} WHERE title = 'Week in DC Tech: October 5th Edition'"));
+    $this->assertEqual($count, 1, 'Found title.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {node} WHERE title = 'Integrating the Siteminder Access System in an Open Atrium-based Intranet'"));
+    $this->assertEqual($count, 1, 'Found title.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {node} WHERE title = 'Scaling the Open Atrium UI'"));
+    $this->assertEqual($count, 1, 'Found title.');
+
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_node_item} WHERE url = 'http://developmentseed.org/blog/2009/oct/06/open-atrium-translation-workflow-two-way-updating'"));
+    $this->assertEqual($count, 1, 'Found feed_node_item record.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_node_item} WHERE url = 'http://developmentseed.org/blog/2009/oct/05/week-dc-tech-october-5th-edition'"));
+    $this->assertEqual($count, 1, 'Found feed_node_item record.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_node_item} WHERE guid = '974 at http://developmentseed.org'"));
+    $this->assertEqual($count, 1, 'Found feed_node_item record.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_node_item} WHERE guid = '970 at http://developmentseed.org'"));
+    $this->assertEqual($count, 1, 'Found feed_node_item record.');
+
+    // Remove all items
+    $this->drupalPost('node/'. $nid .'/delete-items', array(), 'Delete');
+    $this->assertText('Deleted 10 nodes.');
+
+    // Import again.
+    $this->drupalPost('node/'. $nid .'/import', array(), 'Import');
+    $this->assertText('Created 10 Feed item nodes.');
+
+    // Delete and assert all items gone.
+    $this->drupalPost('node/'. $nid .'/delete-items', array(), 'Delete');
+
+    $count = db_result(db_query("SELECT COUNT(*) FROM {node} WHERE type = 'feed_item'"));
+    $this->assertEqual($count, 0, 'Found the correct number of feed item nodes in database.');
+
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_node_item}"));
+    $this->assertEqual($count, 0, 'Found the correct number of records in feeds_node_item.');
+
+    // Create a batch of nodes.
+    $this->createFeedNodes('feed', 10, 'feed');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {node} WHERE type = 'feed_item'"));
+    $this->assertEqual($count, 100, 'Imported 100 nodes.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_node_item}"));
+    $this->assertEqual($count, 100, 'Found 100 records in feeds_node_item.');
+  }
+}
+
+/**
+ * Test OPML import configuration.
+ */
+class FeedsExamplesOPMLTestCase extends FeedsWebTestCase {
+
+  /**
+   * Set up test.
+   */
+  public function setUp() {
+    parent::setUp('feeds', 'feeds_ui', 'ctools', 'feeds_news');
+
+    $this->drupalLogin(
+      $this->drupalCreateUser(
+        array(
+          'administer feeds', 'administer nodes',
+        )
+      )
+    );
+  }
+
+  /**
+   * Describe this test.
+   */
+  public function getInfo() {
+    return array(
+      'name' => t('Example features: OPML import'),
+      'description' => t('Test "OPML import" default configuration.'),
+      'group' => t('Feeds'),
+    );
+  }
+
+  /**
+   * Run tests.
+   */
+  public function test() {
+
+    // Import OPML and assert.
+    $file = $this->generateOPML();
+    $this->importFile('opml', $file);
+    $this->assertText('Created 3 feed nodes.');
+    $count = db_result(db_query("SELECT COUNT(*) FROM {feeds_source}"));
+    $this->assertEqual($count, 4, 'Found correct number of items.');
+
+    // Import a feed and then delete all items from it.
+    $this->drupalPost('node/1/import', array(), 'Import');
+    $this->assertText('Created 10 Feed item nodes.');
+    $this->drupalPost('node/1/delete-items', array(), 'Delete');
+    $this->assertText('Deleted 10 nodes.');
+  }
+}
