diff --git a/export/views-bonus-export-ics.tpl.php b/export/views-bonus-export-ics.tpl.php
new file mode 100644
index 0000000..f51cb11
--- /dev/null
+++ b/export/views-bonus-export-ics.tpl.php
@@ -0,0 +1,41 @@
+<?php
+// $Id$
+/**
+* @file views-view-table.tpl.php
+* Template to display a view as a table.
+*
+* - $title : The title of this group of rows.  May be empty.
+* - $rows: An array of row items. Each row is an array of content
+*   keyed by field ID.
+* - $header: an array of haeaders(labels) for fields.
+* - $themed_rows: a array of rows with themed fields.
+* @ingroup views_templates
+*/
+
+foreach ($themed_rows as $count => $row):
+$dtstart = strip_tags($row['field_event_date_time']);
+$dtend = strip_tags($row['field_event_date_time_value2']);
+?>
+BEGIN:VCALENDAR
+PRODID:-//Calendar//Calendar Event//EN
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+DTSTAMP:<?php print(strip_tags($row['field_event_date_time']) . "\n") ?>
+
+BEGIN:VEVENT
+DTSTART:<?php print($dtstart . "00\n") ?>
+<?php
+if ($dtend!=$dtstart) {?>
+DTEND:<?php print($dtend . "00\n") ?>
+<?php } ?>
+
+SUMMARY: <?php print(html_entity_decode($row['title']) . "\n") ?>
+DESCRIPTION: <?php print(html_entity_decode(strip_tags($row['body'])) . "\n") ?>
+UID:1
+LOCATION:<?php print($row['field_location_value'] . "\n") ?>
+SEQUENCE:0
+END:VEVENT
+END:VCALENDAR
+
+
+<?php endforeach; ?>
\ No newline at end of file
diff --git a/export/views_bonus_export.module b/export/views_bonus_export.module
index 6599248..189ae32 100644
--- a/export/views_bonus_export.module
+++ b/export/views_bonus_export.module
@@ -126,3 +126,13 @@ function _views_bonus_export_add_headers(&$view) {
     }
   }
 }
+
+/**
+* Preprocess ics output template.
+*/
+function template_preprocess_views_bonus_export_ics(&$vars) {
+  drupal_set_header('Content-Type: text/calendar; charset=utf-8;');
+  drupal_set_header('Content-Disposition: attachment; filename="add_event.ics"; ');
+
+  _views_bonus_export_shared_preprocess($vars);
+}
\ No newline at end of file
diff --git a/export/views_bonus_export.views.inc b/export/views_bonus_export.views.inc
index ca6b359..0ae6f55 100644
--- a/export/views_bonus_export.views.inc
+++ b/export/views_bonus_export.views.inc
@@ -95,6 +95,19 @@ function views_bonus_export_views_plugins() {
         'export headers' => array('Content-Type: text/xml'),
         'export feed type' => 'xml',
       ),
+      'views_ics' => array(
+        'title' => t('ICS file'),
+        'help' => t('Display the view as a ics file.'),
+        'path' => $path,
+        'handler' => 'views_bonus_plugin_style_export_ics',
+        'parent' => 'views_bonus_export',
+        'theme' => 'views_bonus_export_ics',
+        'theme file' => 'views_bonus_export.theme.inc',
+        'uses row plugin' => FALSE,
+        'uses fields' => TRUE,
+        'uses options' => TRUE,
+        'type' => 'feed',
+      ),
     ),
   );
 }
diff --git a/export/views_bonus_plugin_style_export_ics.inc b/export/views_bonus_plugin_style_export_ics.inc
new file mode 100644
index 0000000..8317aed
--- /dev/null
+++ b/export/views_bonus_plugin_style_export_ics.inc
@@ -0,0 +1,61 @@
+<?php
+// $Id$
+/**
+* @file
+* Plugin include file for export style plugin.
+*/
+
+/**
+* Generalized style plugin for export plugins.
+*
+* @ingroup views_style_plugins
+*/
+class views_bonus_plugin_style_export_ics extends views_bonus_plugin_style_export {
+  /**
+   * Initialize plugin.
+   *
+   * Set feed image for shared rendering later.
+   */
+  function init(&$view, &$display, $options = NULL) {
+    parent::init($view, $display, $options = NULL);
+    $this->feed_image = drupal_get_path('module', 'views_bonus_export') . '/images/ics.png';
+  }
+
+  /**
+   * Set options fields and default values.
+   *
+   * @return
+   * An array of options information.
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+
+    $options['filename'] = array(
+      'default' => 'view-%view.ics',
+      'translatable' => FALSE,
+    );
+
+    return $options;
+  }
+
+  /**
+   * Options form mini callback.
+   *
+   * @param $form
+   * Form array to add additional fields to.
+   * @param $form_state
+   * State of the form.
+   * @return
+   * None.
+   */
+  function options_form(&$form, &$form_state) {
+    $form['filename'] = array(
+      '#type' => 'textfield',
+      '#title' => t('ICS filename'),
+      '#default_value' => $this->options['filename'],
+      '#description' => t('The filename that will be suggested to the browser for downloading purposes. %view will be replaced with the view name.'),
+      '#process' => array('views_process_dependency'),
+      '#dependency' => array('edit-style-options-override' => array(FALSE)),
+    );
+  }
+}
\ No newline at end of file
