diff --git a/dart.info b/dart.info
index b5d6653..e85ab68 100644
--- a/dart.info
+++ b/dart.info
@@ -15,4 +15,4 @@ files[] = contexts/dart_context_reaction_tags.inc
 files[] = export_ui/dart_ctools_export_ui.inc
 files[] = export_ui/dart_tag_ui.class.php
 files[] = tests/dart.test
-
+files[] = views/views_plugin_row_dart_node_view.inc
diff --git a/dart.module b/dart.module
index 77355f7..9280b6e 100644
--- a/dart.module
+++ b/dart.module
@@ -57,6 +57,11 @@ function dart_theme() {
       'variables' => array('tag' => NULL),
       'template' => 'theme/dart_tag',
     ),
+    'dart_tag_ajax' => array(
+      'variables' => array('tag' => NULL, 'name' => NULL),
+      'template' => 'theme/dart_tag_ajax',
+    ),
+
   );
 }
 
@@ -115,7 +120,7 @@ function dart_libraries_info() {
 }
 
 /**
- * Implements of hook_token_info().
+ * Implements hook_token_info().
  */
 function dart_token_info() {
   $type = array(
@@ -136,7 +141,7 @@ function dart_token_info() {
 }
 
 /**
- * Implements of hook_token().
+ * Implements hook_token().
  */
 function dart_tokens($type, $tokens, array $data = array(), array $options = array()) {
   $replacements = array();
@@ -292,6 +297,15 @@ function dart_dart_tag_alter(&$tag) {
 }
 
 /**
+ * Implements hook_views_api().
+ */
+function dart_views_api() {
+  return array(
+    'api' => '2',
+  );
+}
+
+/**
  * Wrapper function for outputting a themed dart tag.
  */
 function dart_tag($machinename) {
@@ -768,6 +782,26 @@ function _dart_term_formatter_full($term) {
 }
 
 /**
+ * Return the themed output for displaying an ad.
+ */
+function _dart_ads_tag($delta) {
+  $current_path = trim(request_uri(), '/');
+
+  // Ads within ajax.
+  if ($current_path == 'views/ajax' || preg_match('|admin/structure/views/.*/preview|', $current_path)) {
+    $machinename = str_replace('dart-tag-', '', $delta);
+    $tags = dart_tag_load($machinename);
+    return '<!-- AJAX AD: NOT YET SUPPORTED -->';
+    return theme('dart_tag_ajax', array('tag' => $tags, 'name' => $delta));
+  }
+  // Normal dart ad.
+  else {
+    $dart_tag_block = module_invoke('dart', 'block_view', $delta);
+    return $dart_tag_block['content'];
+  }
+}
+
+/**
  * Template preprocess function for dart tags.
  */
 function template_preprocess_dart_tag(&$variables) {
@@ -790,3 +824,16 @@ function template_preprocess_dart_tag(&$variables) {
   $variables['noscript_tag'] = $variables['show_noscript_tag'] ? '<noscript>' . $variables['static_tag'] . '</noscript>' : '';
   $variables['tag'] = $tag;
 }
+
+/**
+ * Template preprocess function for ads.
+ */
+function template_process_dart_tag_ajax(&$variables) {
+  $tag = $variables['tag'];
+
+  $variables['attributes'] = array('class' => 'dart-tag');
+  $variables['json_tag'] = drupal_json_encode($tag);
+  $variables['show_script_tag'] = !$tag->settings['options']['scriptless'];
+  $noscript_tag_image = l(theme('image', array('path' => $tag->noscript['src'])), $tag->noscript['href'], array('html' => TRUE));
+  $variables['noscript_tag'] = variable_get('dart_noscript', 1) ? '<noscript>' . $noscript_tag_image . '</noscript>' : '';
+}
diff --git a/dart.views.inc b/dart.views.inc
new file mode 100644
index 0000000..1586981
--- /dev/null
+++ b/dart.views.inc
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * Implementats hook_views_plugins
+ * Based off the same in views/modules/node.views.inc
+ */
+function dart_views_plugins() {
+
+  return array(
+    'module' => 'dart', // This just tells our themes are elsewhere.
+    'row' => array(
+      'dart_node' => array(
+	'title' => t('Content with DART Ads'),
+	'help' => t('Display the node with standard node view, but with a dash of DART.'),
+	'handler' => 'views_plugin_row_dart_node_view',
+	'path' => drupal_get_path('module', 'dart') . '/views',
+	'theme' => 'dart_views_view_row_node',
+	'base' => array('node'), // only works with 'node' as base.
+	'type' => 'normal',
+	'uses options' => TRUE,
+	'type' => 'normal',
+	'help topic' => 'style-node',
+      ),
+    ),
+  );
+}
diff --git a/theme/dart_tag_ajax.tpl.php b/theme/dart_tag_ajax.tpl.php
new file mode 100644
index 0000000..242a637
--- /dev/null
+++ b/theme/dart_tag_ajax.tpl.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @file
+ * Display the js call to display a AJAX DART ad tag.
+ *
+ * Variables available:
+ * - $tag: The full tag object or NULL. If it's NULL, all other vars listed
+ *     below will be NULL as well
+ * - $json_tag: a js version of $tag.
+ * - $attributes: any attributes that should be displayed on teh outer-most div.
+ * - $show_script_tag: boolean.
+ * - $show_noscript_tag: boolean.
+ * - $noscript: the <noscript> tag for this DART tag, or empty string.
+ *
+ * @see template_preprocess_petside_ads_ajax()
+ */
+?>
+
+<div <?php print drupal_attributes($attributes); ?>>
+
+  <div class="<?php print $name; ?>">&nbsp;</div>
+
+  <?php if ($show_script_tag): ?>
+    <script type="text/javascript">
+      if (typeof(dart_ajax) == 'undefined') {
+        var dart_ajax = [];
+      };
+      dart_ajax['<?php print $name;?>'] = <?php print $json_tag; ?>;
+    </script>
+  <?php endif; ?>
+
+  <?php print $noscript_tag; ?>
+</div>
diff --git a/views/dart-views-view-row-node.tpl.php b/views/dart-views-view-row-node.tpl.php
new file mode 100644
index 0000000..7b3798f
--- /dev/null
+++ b/views/dart-views-view-row-node.tpl.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * @file views-view-row-node.tpl.php
+ * Default simple view template to display a single node.
+ *
+ * Rather than doing anything with this particular template, it is more
+ * efficient to use a variant of the node.tpl.php based upon the view,
+ * which will be named node-view-VIEWNAME.tpl.php. This isn't actually
+ * a views template, which is why it's not used here, but is a template
+ * 'suggestion' given to the node template, and is used exactly
+ * the same as any other variant of the node template file, such as
+ * node-NODETYPE.tpl.php
+ *
+ * @ingroup views_templates
+ */
+?>
+<?php print $node; ?>
+<?php if ($comments): ?>
+  <?php print $comments; ?>
+<?php endif; ?>
diff --git a/views/views_plugin_row_dart_node_view.inc b/views/views_plugin_row_dart_node_view.inc
new file mode 100644
index 0000000..cf209e1
--- /dev/null
+++ b/views/views_plugin_row_dart_node_view.inc
@@ -0,0 +1,144 @@
+<?php
+/**
+ * @file
+ * Contains the node view row style plugin.
+ */
+
+module_load_include('inc', 'views', 'modules/node.views');
+module_load_include('inc', 'views', 'modules/node/views_plugin_row_node_view');
+
+/**
+ * Plugin which inserts ads into a node view.
+ */
+class views_plugin_row_dart_node_view extends views_plugin_row_node_view {
+
+  /**
+   * Define the available options in the options form.
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['ad_position'] = array('default' => array());
+
+    return $options;
+  }
+
+  /**
+   * Construct the options form.
+   */
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+
+    $default_values = $this->options['ad_position'];
+
+    $ad_position_options = array(0 => t('<None>'));
+    for ($i = 1; $i < 16; $i++) {
+      $ad_position_options[$i] = $i;
+    }
+
+    $ad_source_options = array('' => t('<None>'));
+    foreach (module_invoke('dart', 'block_info') as $block_id => $block_data) {
+      $ad_source_options[$block_id] = $block_data['info'];
+    }
+
+    $form['ad_position'] = array(
+      '#title' => t('DART Ad Placement'),
+      '#description' => t('The following settings will apply for each page of results.'),
+      '#type' => 'fieldset',
+      '#tree' => TRUE,
+    );
+
+    $form['ad_position'][0] = array(
+      '#title' => t('Ad 1'),
+      '#type' => 'fieldset',
+    );
+    $form['ad_position'][0]['position'] = array(
+      '#title' => t('Position'),
+      '#type' => 'select',
+      '#options' => $ad_position_options,
+      '#default_value' => $default_values[0]['position']
+    );
+    $form['ad_position'][0]['source'] = array(
+      '#title' => t('Source'),
+      '#type' => 'select',
+      '#options' => $ad_source_options,
+      '#default_value' => $default_values[0]['source']
+    );
+
+    $form['ad_position'][1] = array(
+      '#title' => t('Ad 2'),
+      '#type' => 'fieldset',
+    );
+    $form['ad_position'][1]['position'] = array(
+      '#title' => t('Position'),
+      '#type' => 'select',
+      '#options' => $ad_position_options,
+      '#default_value' => $default_values[1]['position']
+    );
+    $form['ad_position'][1]['source'] = array(
+      '#title' => t('Source'),
+      '#type' => 'select',
+      '#options' => $ad_source_options,
+      '#default_value' => $default_values[1]['source']
+    );
+
+    $form['ad_position'][2] = array(
+      '#title' => t('Ad 3'),
+      '#type' => 'fieldset',
+    );
+    $form['ad_position'][2]['position'] = array(
+      '#title' => t('Position'),
+      '#type' => 'select',
+      '#options' => $ad_position_options,
+      '#default_value' => $default_values[2]['position']
+    );
+    $form['ad_position'][2]['source'] = array(
+      '#title' => t('Source'),
+      '#type' => 'select',
+      '#options' => $ad_source_options,
+      '#default_value' => $default_values[2]['source']
+    );
+  }
+
+  /**
+   * Called before the view row is rendered.
+   */
+  function pre_render($values) {
+    parent::pre_render($values);
+
+    static $position_offset = 1;
+    foreach ($this->options['ad_position'] as $key => $ad_setting) {
+      if ($ad_setting['position'] && $ad_setting['source']) {
+        $this->ad_positions[ $ad_setting['position'] ] = $ad_setting['source'];
+      }
+    }
+
+    ksort($this->ad_positions);
+  }
+
+  /**
+   * Render the view row and return the HTML output.
+   */
+  function render($row) {
+    static $current_row_position = 0, $position_offset = 1;
+
+    $output = '';
+    $rendered_node = parent::render($row);
+
+    // This will add DART ads even if they are to be displayed right next to
+    // one another.
+    while (isset($this->ad_positions[ ($current_row_position + $position_offset) ])) {
+      $ad_source = $this->ad_positions[ ($current_row_position + $position_offset) ];
+
+      // Insert dart ad.
+      $output .= _dart_ads_tag($ad_source);
+
+      // Increment offset created by ad placement.
+      $position_offset++;
+    }
+
+    $output .= $rendered_node;
+    $current_row_position++;
+
+    return $output;
+  }
+}
