diff --git a/README.txt b/README.txt
index e17b039..13d6018 100644
--- a/README.txt
+++ b/README.txt
@@ -1,7 +1,7 @@
 
 # KML Module
 
-The KML module provides a Views plugin that can format nodes, users, or 
+The KML module provides Views plugins that can format nodes, users, or
 any other data source in Drupal as a KML feed, accessible by Google Earth 
 or web maps like OpenLayers and Google Maps.
 
@@ -23,8 +23,8 @@ http://drupal.org/project/kml
 1. Add a Feed display to a View that handles nodes (or other data) that include
    locative infomation.
 2. Add fields for the Name, Description, Latitude and Longitude for each point.
-3. Set the display's Style to KML Feed.
-4. Configure the KML Feed's Style Options, choosing the appropriate fields and
+3. Set the display's Style and Row to KML Feed.
+4. Configure the KML Feed's Row Options, choosing the appropriate fields and
    optionally choosing a Filename for the downloadble file.
 5. Optionally attach the feed display to another display.
 
diff --git a/kml.info b/kml.info
index a62b8f8..6f75b37 100644
--- a/kml.info
+++ b/kml.info
@@ -1,4 +1,4 @@
 name = "KML"
-description = "Provides views plugin for KML/Google Earth output"
+description = "Provides views plugins for KML/Google Earth output"
 dependencies[] = views
-core = "6.x"
\ No newline at end of file
+core = "6.x"
diff --git a/kml.module b/kml.module
index b982f00..391dc5f 100644
--- a/kml.module
+++ b/kml.module
@@ -21,12 +21,6 @@ function kml_views_api() {
 function kml_theme() {
   $path = drupal_get_path('module', 'kml');
   return array(
-    'kml_placemark' => array(
-      'arguments' => array('point' => array(), 'points' => array()),
-      'file' => 'kml_views.theme.inc',
-      'template' => 'kml-placemark',
-      'path' => $path . "/views",
-    ),
     'kml_feed_icon' => array(
       'arguments' => array(),
       'file' => 'kml_views.theme.inc',
diff --git a/views/kml.views.inc b/views/kml.views.inc
index 3804a53..5d85768 100644
--- a/views/kml.views.inc
+++ b/views/kml.views.inc
@@ -20,12 +20,26 @@ function kml_views_plugins() {
         'theme file' => 'kml_views.theme.inc',
         'theme path' => drupal_get_path('module', 'kml') .'/views',
         'path' => drupal_get_path('module', 'kml') .'/views',
-        'uses row plugin' => FALSE,
+        'uses row plugin' => TRUE,
         'uses fields' => TRUE,
-        'uses options' => TRUE,
+        'uses options' => FALSE,
         'uses grouping' => FALSE,
         'type' => 'feed',
       ),
     ),
+    'row' => array(
+      'kml_wkt' => array(
+        'title' => t('KML Feed'),
+        'help' => t('Output a KML feed row'),
+        'handler' => 'views_plugin_row_kml',
+        'theme' => 'kml_placemark_wkt',
+        'theme file' => 'kml_views.theme.inc',
+        'theme path' => drupal_get_path('module', 'kml') .'/views',
+        'path' => drupal_get_path('module', 'kml') .'/views',
+        'uses options' => TRUE,
+        'uses fields' => TRUE,
+        'type' => 'feed',
+      ),
+    ),
   );
 }
diff --git a/views/kml_views.theme.inc b/views/kml_views.theme.inc
index 0ff8486..51897f6 100644
--- a/views/kml_views.theme.inc
+++ b/views/kml_views.theme.inc
@@ -5,25 +5,19 @@
  * Theming functions for KML module views output.
  */
 
+/**
+ * Preprocess for theme('views_view_kml').
+ */
 function template_preprocess_views_view_kml(&$vars) {
   $view = $vars['view'];
-  
-  $points = $view->style_plugin->map_rows($vars['rows']);
-
-  $style = theme('kml_style', $points);
 
-  foreach ($points as $point) {
-    $rows .= theme('kml_placemark', $point, $points);
-  }
-     
-  $vars['rows'] = $rows;
-  $vars['style'] = $style;
+  $vars['style'] = theme('kml_style', $points);
   $vars['viewtitle'] = $view->get_title();
     
   // Checks if filename is manually specified in view style options otherwise
   // it sets it as the name of the view.
-  if (!empty($view->style_options['filename'])) {
-    $filename = $view->style_options['filename'] . '.kml';
+  if (!empty($view->row_options['filename'])) {
+    $filename = $view->row_options['filename'] . '.kml';
   }
   else {
     $filename = $vars['viewtitle'] . '.kml';
@@ -37,15 +31,15 @@ function template_preprocess_views_view_kml(&$vars) {
  * Preprocess for theme('kml_placemark').
  */
 function template_preprocess_kml_placemark(&$vars) {  
-  $vars['name'] = filter_xss_admin($vars['point']['name']);
-  $vars['description'] = filter_xss_admin($vars['point']['description']);
-  $vars['coords'] = check_plain($vars['point']['point']);
-  $vars['styleUrl'] = check_plain($vars['point']['styleUrl']);
+  $vars['name'] = filter_xss_admin($vars['row']['name']);
+  $vars['description'] = filter_xss_admin($vars['row']['description']);
+  $vars['coords'] = check_plain($vars['row']['coords']);
+  $vars['styleUrl'] = check_plain($vars['row']['styleUrl']);
 
   // Create a variable for every field that is unassigned, (is not Name, Desc,
   // Lat, or Lon.) These can be used in custom kml-placemark.tpl.php theme
   // implementations, each as $content['VARNAME'].
-  foreach($vars['point']['content'] as $key => $value) {
+  foreach($vars['row']['content'] as $key => $value) {
     $vars['content'][$key] = filter_xss_admin($value);
   }
 }
@@ -56,4 +50,4 @@ function template_preprocess_kml_placemark(&$vars) {
 function theme_kml_feed_icon() {
   $icon = drupal_get_path('module', 'kml').'/images/kml.png';
   return theme('image', $icon, t('KML icon'), t('Download KML Feed'));
-}
\ No newline at end of file
+}
diff --git a/views/views_plugin_style_kml.inc b/views/views_plugin_row_kml.inc
similarity index 60%
copy from views/views_plugin_style_kml.inc
copy to views/views_plugin_row_kml.inc
index 7a10856..e92ca10 100644
--- a/views/views_plugin_style_kml.inc
+++ b/views/views_plugin_row_kml.inc
@@ -2,9 +2,9 @@
 
 /**
  * @file
- * Extending the view_plugin_style class to provide a kml view style.
+ * Extending the view_plugin_row class to provide a kml view style.
  */
-class views_plugin_style_kml extends views_plugin_style {
+class views_plugin_row_kml extends views_plugin_row {
 
   /**
    * Initialize plugin.
@@ -13,39 +13,20 @@ class views_plugin_style_kml extends views_plugin_style {
     parent::init($view, $display, $options = NULL);
   }
 
-  /**
-   * Attach this view to another display as a feed.
-   *
-   * Provide basic functionality for all export style views like attaching a
-   * feed icon link.
-   */
-  function attach_to($display_id, $path, $title) {
-    $url_options = array('html' => TRUE);
-
-    // Include exposed filters
-    $query = $this->view->get_exposed_input();
-    if ($query) {
-      $url_options['query'] = $query;
-    }
-
-    $image = theme('kml_feed_icon');
-    $this->view->feed_icon .= l($image, $path, $url_options);
-  }
-
   function option_definition() {
     $options = parent::option_definition();
-    
+
     $field_options = array(
       'name' => t('Name'),
       'description' => t('Description'),
       'longitude' => t('Longitude'),
       'latitude' => t('Latitude'),
     );
-    
+
     foreach ($field_options as $k => $v) {
       $fields[$k] = array('default' => '');
     }
-    
+
     $options['fields'] = array(
       'contains' => $fields,
     );
@@ -53,8 +34,7 @@ class views_plugin_style_kml extends views_plugin_style {
       'default' => $this->filename,
       'translatable' => FALSE,
     );
-    
-    
+
     return $options;
   }
 
@@ -65,14 +45,14 @@ class views_plugin_style_kml extends views_plugin_style {
    * @param array $form
    * @param array $form_state
    */
-  function options_form(&$form, &$form_state) { 
-    parent::options_form($form, $form_state);                  
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
     $options = parent::option_definition();
 
     $handlers = $this->display->handler->get_handlers('field');
     if (empty($handlers)) {
       $form['error_markup'] = array(
-        '#value' => t('You need at least one field before you can 
+        '#value' => t('You need at least one field before you can
         configure your field settings'),
         '#prefix' => '<div class="error form-item description">',
         '#suffix' => '</div>',
@@ -121,50 +101,49 @@ class views_plugin_style_kml extends views_plugin_style {
     }
   }
 
-  function map_rows($rows) {
-    // Fields must be rendered in order as of Views 2.3, 
-    // so we will pre-render everything.
+  /**
+   * Render a row object.
+   */
+  function render($row) {
+    $row = $this->map_row($row);
+    return theme($this->theme_functions(), $this->view, $this->options, $row, $this->field_alias);
+  }
+
+  /**
+   * Translate a row object to an array for rendering.
+   */
+  function map_row($row) {
+
     $renders = array();
     $keys = array_keys($this->view->field);
 
-    foreach ($rows as $count => $row) {
-      foreach ($keys as $id) {
-        $renders[$count][$id] = $this->view->field[$id]->theme($row);
-      }
-    }  
+    foreach ($keys as $id) {
+      $renders[$id] = $this->view->field[$id]->theme($row);
+    }
 
-    $points = array();
+    $point = array();
     foreach ($renders as $id => $row) {
-      $point = array();
-      foreach ($this->view->field as $key => $field) {
-        if ($key == $this->options['fields']['name']) {
-          $point['name'] = $row[$key];
-        }
-        elseif ($key == $this->options['fields']['description']) {
-          $point['description'] = $row[$key];
-        }
-        elseif ($key == $this->options['fields']['longitude']) {
-          $point['lon'] = $row[$key];
-        }
-        elseif ($key == $this->options['fields']['latitude']) {
-          $point['lat'] = $row[$key];
-        }
-        else{
-          $point['content'][$key] = $row[$key];
-        }
+      if ($id == $this->options['fields']['name']) {
+        $point['name'] = $row;
       }
-
-      $point['point'] = $point['lon'] . ',' . $point['lat'] . ',0';
-      unset($point['lat']);
-      unset($point['lon']);
-
-      if ($this->options['linestring']['enable']) {
-        $points[$point['group']][] = $point;
+      elseif ($id == $this->options['fields']['description']) {
+        $point['description'] = $row;
+      }
+      elseif ($id == $this->options['fields']['longitude']) {
+        $point['lon'] = $row;
+      }
+      elseif ($id == $this->options['fields']['latitude']) {
+        $point['lat'] = $row;
       }
       else {
-        $points[] = $point;
+        $point['content'][$id] = $row;
       }
     }
-    return $points;
+
+    $point['coords'] = $point['lon'] . ',' . $point['lat'] . ',0';
+    unset($point['lat']);
+    unset($point['lon']);
+
+    return $point;
   }
-}
\ No newline at end of file
+}
diff --git a/views/views_plugin_style_kml.inc b/views/views_plugin_style_kml.inc
index 7a10856..a75be98 100644
--- a/views/views_plugin_style_kml.inc
+++ b/views/views_plugin_style_kml.inc
@@ -32,139 +32,25 @@ class views_plugin_style_kml extends views_plugin_style {
     $this->view->feed_icon .= l($image, $path, $url_options);
   }
 
-  function option_definition() {
-    $options = parent::option_definition();
-    
-    $field_options = array(
-      'name' => t('Name'),
-      'description' => t('Description'),
-      'longitude' => t('Longitude'),
-      'latitude' => t('Latitude'),
-    );
-    
-    foreach ($field_options as $k => $v) {
-      $fields[$k] = array('default' => '');
-    }
-    
-    $options['fields'] = array(
-      'contains' => $fields,
-    );
-    $options['filename'] = array(
-      'default' => $this->filename,
-      'translatable' => FALSE,
-    );
-    
-    
-    return $options;
-  }
-
-
   /**
-   * Provide a form for setting options.
-   *
-   * @param array $form
-   * @param array $form_state
+   * Render the display in this style.
    */
-  function options_form(&$form, &$form_state) { 
-    parent::options_form($form, $form_state);                  
-    $options = parent::option_definition();
-
-    $handlers = $this->display->handler->get_handlers('field');
-    if (empty($handlers)) {
-      $form['error_markup'] = array(
-        '#value' => t('You need at least one field before you can 
-        configure your field settings'),
-        '#prefix' => '<div class="error form-item description">',
-        '#suffix' => '</div>',
-      );
+  function render() {
+    if ($this->uses_row_plugin() && empty($this->row_plugin)) {
+      vpr('views_plugin_style_default: Missing row plugin');
+      return;
     }
-    else {
-      foreach ($handlers as $field => $handler) {
-        if ($label = $handler->label()) {
-          $field_names[$field] = $label;
-        }
-        else {
-          $field_names[$field] = $handler->ui_name();
-        }
-      }
-      $field_options = array(
-        'name' => t('Name'),
-        'description' => t('Description'),
-        'longitude' => t('Longitude'),
-        'latitude' => t('Latitude'),
-      );
-      $form['filename'] = array(
-        '#type' => 'textfield',
-        '#title' => t('Filename'),
-        '#default_value' => $this->options['filename'],
-        '#description' => t('The filename that will be suggested to the browser
-        for downloading purposes. Leave empty to use the view title. ".kml"
-        will be automatically appended.'),
-      );
-      $form['fields'] = array(
-        '#type' => 'fieldset',
-        '#title' => 'Field usage',
-        '#description' => t('Select the fields that contain the latitude,
-        longitude and title of each point. Remaining fields will be available
-        as <em>$content[\'VARNAME\']</em> in <em>kml-placemark.tpl.php</em>.'),
-        '#weight' => -10,
-      );
-      foreach ($field_options as $k => $v) {
-        $form['fields'][$k] = array(
-          '#type' => 'select',
-          '#title' => $v,
-          '#options' => $field_names,
-          '#default_value' => $this->options['fields'][$k],
-          '#required' => ($k == 'class' ? FALSE : TRUE),
-        );
-      }
-    }
-  }
-
-  function map_rows($rows) {
-    // Fields must be rendered in order as of Views 2.3, 
-    // so we will pre-render everything.
-    $renders = array();
-    $keys = array_keys($this->view->field);
 
-    foreach ($rows as $count => $row) {
-      foreach ($keys as $id) {
-        $renders[$count][$id] = $this->view->field[$id]->theme($row);
-      }
-    }  
-
-    $points = array();
-    foreach ($renders as $id => $row) {
-      $point = array();
-      foreach ($this->view->field as $key => $field) {
-        if ($key == $this->options['fields']['name']) {
-          $point['name'] = $row[$key];
-        }
-        elseif ($key == $this->options['fields']['description']) {
-          $point['description'] = $row[$key];
-        }
-        elseif ($key == $this->options['fields']['longitude']) {
-          $point['lon'] = $row[$key];
-        }
-        elseif ($key == $this->options['fields']['latitude']) {
-          $point['lat'] = $row[$key];
-        }
-        else{
-          $point['content'][$key] = $row[$key];
-        }
-      }
+    $output = '';
+    $rows = '';
+    foreach ($this->view->result as $row_index => $row) {
+      $this->view->row_index = $row_index;
+      $rows .= $this->row_plugin->render($row);
+    }
 
-      $point['point'] = $point['lon'] . ',' . $point['lat'] . ',0';
-      unset($point['lat']);
-      unset($point['lon']);
+    $output .= theme($this->theme_functions(), $this->view, $this->options, $rows);
 
-      if ($this->options['linestring']['enable']) {
-        $points[$point['group']][] = $point;
-      }
-      else {
-        $points[] = $point;
-      }
-    }
-    return $points;
+    unset($this->view->row_index);
+    return $output;
   }
-}
\ No newline at end of file
+}
