diff --git a/views/plugins/views_plugin_style_bibtex.inc b/views/plugins/views_plugin_style_bibtex.inc
new file mode 100644
index 0000000..745f314
--- /dev/null
+++ b/views/plugins/views_plugin_style_bibtex.inc
@@ -0,0 +1,122 @@
+<?php
+/**
+ * @file
+ * Implements views_plugin_style for views_bibtex
+ */
+
+/**
+ * Implements views_plugin_style
+ */
+class views_plugin_style_bibtex extends views_plugin_style {
+  /**
+   * Implements views_plugin_style::option_definition
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+    // Always 'nodes'
+    $options['root_object'] = array('default' => 'nodes', 'translatable' => FALSE);
+    // Always 'node'
+    $options['top_child_object'] = array('default' => 'node', 'translatable' => FALSE);
+    $options['entry_type_label'] = array('default' => 'Entry type', 'translatable' => FALSE);
+    $options['display_entry_type_field'] = array('default' => FALSE, 'translatable' => FALSE);
+    $options['generate_key'] = array('default' => TRUE, 'translatable' => FALSE);
+    // Always 'normal'
+    $options['field_output'] = array('default' => 'normal', 'translatable' => FALSE);
+    $options['plaintext_output'] = array('default' => TRUE, 'translatable' => FALSE);
+    $options['remove_newlines'] = array('default' => NULL, 'translatable' => FALSE);
+    // There's only one format for now
+    $options['format'] = array('default' => 'simple', 'translatable' => FALSE);
+    $options['content_type'] = array('default' => 'default', 'translatable' => FALSE);
+    $options['using_views_api_mode'] = array('default' => FALSE, 'translatable' => FALSE);
+    return $options;
+  }
+
+  /**
+   * Provide a form for setting options.
+   */
+  function options_form(&$form, &$form_state) {
+    $form['entry_type_label'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Entry type label'),
+      '#description' => t('The label for the content field that indicates the entry type (Article, InProceedings, Book)'),
+      '#default_value' => $this->options['entry_type_label'],
+    );
+    $form['display_entry_type_field'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Display entry type field'),
+      '#description' => t('If check, the entry type field will be displayed in the BibTeX'),
+      '#default_value' => $this->options['display_entry_type_field'],
+    );
+    $form['generate_key'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Auto generate citation key'),
+      '#description' => t('If checked, the citation key will be auto-generated. For example, article1, article2 ...'),
+      '#default_value' => $this->options['generate_key'],
+    );
+    $form['plaintext_output'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Plaintext output'),
+      '#default_value' => $this->options['plaintext_output'],
+      '#description' => t('For each row in the view, strip all markup from the field output.'),
+    );
+    $form['remove_newlines'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Remove newlines'),
+      '#default_value' => $this->options['remove_newlines'],
+      '#description' => t('Strip newline characters from the field output.'),
+    );
+    $form['content_type'] = array(
+      '#type' => 'radios',
+      '#title' => t('Content-Type'),
+      '#options' => array(
+        'default' => t('Default: text/plain'),
+        'application/txt' => t('application/txt'),
+      ),
+      '#default_value' => $this->options['content_type'],
+      '#description' => t('The Content-Type header that will be sent with the BibTeX output.')
+    );
+    $form['using_views_api_mode'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Views API mode'),
+      '#default_value' => $this->options['using_views_api_mode'],
+      '#description' => t('Not using View API mode means the BibTeX gets output directly and the server ceases normal page processing.  Using it means the server does not cease processing after outputting the BibTeX.  This allows the Views API to be used with the view without having to prematurely terminate page processing.'),
+    );
+  }
+
+  /**
+   * Implementation of view_style_plugin::theme_functions(). Returns an array of theme functions to use
+   * for the current style plugin
+   * @return array
+   */
+  function theme_functions() {
+    $format = $this->options['format'];
+    $hook = 'views_views_bibtex_style_' . $format;
+    return views_theme_functions($hook, $this->view, $this->display);
+  }
+
+  /**
+   * Implementation of views_style_plugin::additional_theme_functions(). Returns empty array.
+   * @return array
+   */
+  function additional_theme_functions() {
+    return array();
+  }
+
+  /**
+   * Implementation of view_style_plugin::render()
+   */
+  function render() {
+    $view = $this->view;
+    $options = $this->options;
+    $field = $view->field;
+
+    $rows = array();
+    foreach ($view->result as $count => $row) {
+      $view->row_index = $count;
+      $rows[] = _views_bibtex_render_fields($view, $row);
+    }
+    unset($view->row_index);
+
+    return theme($this->theme_functions(), array('view' => $view, 'options' => $options, 'rows' => $rows));
+  }
+}
diff --git a/views/theme/views-views-bibtex-style-simple.tpl.php b/views/theme/views-views-bibtex-style-simple.tpl.php
new file mode 100644
index 0000000..d87add4
--- /dev/null
+++ b/views/theme/views-views-bibtex-style-simple.tpl.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * @file views-views-bibtex-style-simple.tpl.php
+ * Default template for the Views BibTeX style plugin using the simple format
+ *
+ * Variables:
+ * - $view: The View object.
+ * - $rows: Hierachial array of key=>value pairs to convert to BibTeX
+ * - $options: Array of options for this style
+ *
+ * @ingroup views_templates
+ */
+
+if ($view->override_path) {
+  // We're inside a live preview where the BibTeX is pretty-printed.
+  $bibtex = _views_bibtex_formatted($rows, $options, $html = TRUE);
+  print "<code>$bibtex</code>";
+}
+else {
+  $bibtex = _views_bibtex_formatted($rows, $options, $html = FALSE);
+  if ($options['remove_newlines']) {
+    $bibtex = preg_replace(array("/\n/"), '', $bibtex);
+  }
+  if ($options['using_views_api_mode']) {
+    // We're in Views API mode.
+    print $bibtex;
+  }
+  else {
+    // We want to send the BibTeX as a server response so switch the content
+    // type and stop further processing of the page.
+    $content_type = ($options['content_type'] == 'default') ? 'text/plain' : $options['content_type'];
+    drupal_add_http_header("Content-Type", "$content_type; charset=utf-8");
+    print $bibtex;
+    //Don't think this is needed in .tpl.php files: module_invoke_all('exit');
+    exit;
+  }
+}
diff --git a/views/theme/views-views-bibtex-style.tpl.php b/views/theme/views-views-bibtex-style.tpl.php
new file mode 100644
index 0000000..d0f7afb
--- /dev/null
+++ b/views/theme/views-views-bibtex-style.tpl.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * @file views-views-bibtex-style.tpl.php
+ * This template file is never used. The switch for choosing among the different
+ * views_views_bibtex_* themes based on format is done in
+ * views_plugin_style_bibtex->theme_functions()
+ *
+ * - $view: The View object.
+ * - $rows: Array of row objects as rendered by _views_bibtex_render_fields
+ *   $options: Array of plugin style options
+ *
+ * @ingroup views_templates
+ * @see views_plugin_style_bibtex.inc
+ * @see views_views_bibtex_style.theme.inc
+ */
diff --git a/views/theme/views_views_bibtex_style.theme.inc b/views/theme/views_views_bibtex_style.theme.inc
new file mode 100644
index 0000000..3e49107
--- /dev/null
+++ b/views/theme/views_views_bibtex_style.theme.inc
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ * Views theme to render view fields as BibTeX.
+ *
+ * - $view: The view in use.
+ * - $rows: Array of row objects as rendered by _views_bibtex_render_fields
+ * - $attachment: Not used currently
+ * - $options: The options for the style passed in from the UI.
+ *
+ * @ingroup views_templates
+ * @see views_bibtex.views.inc
+ */
+function template_preprocess_views_views_bibtex_style_simple(&$vars) {
+  $view = $vars["view"];
+  $rows = $vars["rows"];
+  $options = $vars["options"];
+  $base = $view->base_table;
+  $root_object = $options["root_object"];
+  $top_child_object = $options["top_child_object"];
+  $plaintext_output = $options["plaintext_output"];
+  $objects = array();
+
+  foreach ($rows as $row) {
+    $object = array();
+    /* Convert the $rows into a hierachial key=>value array */
+    foreach ($row as $field) {
+      if ($options["field_output"] == "normal") {
+        if ($field->label)
+          $label = $plaintext_output ? strip_tags($field->label) : $field->label;
+        else {
+          $label = $plaintext_output ? strip_tags($field->id) : $field->id;
+        }
+        if (!$field->is_multiple) {
+          $content = $plaintext_output ? strip_tags($field->content) : $field->content;
+        }
+        else {
+          $content = array();
+          foreach ($field->content as $n => $oc) $content[$n] = ($plaintext_output ? strip_tags($oc) : $oc);
+        }
+      }
+      elseif ($options["field_output"] == "raw") {
+        $label = $plaintext_output ? strip_tags($field->id) : $field->id;
+        if (!$field->is_multiple) {
+          $content = $plaintext_output ? strip_tags($field->raw) : $field->raw;
+        }
+        else {
+          $content = array();
+          foreach ($field->raw as $n => $oc) $content[$n] = $plaintext_output ? strip_tags($oc) : $oc;
+        }
+      }
+
+      // check if user wants nested arrays
+      if (strlen($top_child_object) != 0) {
+        $object[$top_child_object][$label] = $content;
+      }
+      else {
+        $object[$label] = $content;
+      }
+    }
+    $objects[] = $object;
+  }
+
+  // check if user wants nested arrays
+  $vars["rows"] = strlen($root_object) != 0 ? array($root_object => $objects) : $objects;
+}
diff --git a/views/views_bibtex.views.inc b/views/views_bibtex.views.inc
new file mode 100644
index 0000000..4f69bfc
--- /dev/null
+++ b/views/views_bibtex.views.inc
@@ -0,0 +1,36 @@
+<?php
+/**
+ * @file
+ * Views style plugin to render nodes in the BibTeX data format.
+ *
+ * @see views_plugin_style_bibtex.inc
+ * @ingroup views_plugins
+ */
+
+/**
+ * Implements hook_views_plugins().
+ */
+function views_bibtex_views_plugins() {
+  $path = drupal_get_path('module', 'views_bibtex') . '/views';
+  return array(
+    'module' => 'views_bibtex',
+    'style' => array(
+      'views_bibtex' => array(
+        'title'           => t('BibTeX'),
+        'path'            => $path . '/plugins',
+        'help'            => t('Displays nodes in the BibTeX bibliography format.'),
+        'handler'         => 'views_plugin_style_bibtex',
+        'theme'           => 'views_views_bibtex_style',
+        'theme file'      => 'views_views_bibtex_style.theme.inc',
+        'theme path'      => $path . '/theme',
+        'additional themes' => array ('views_views_bibtex_style_simple' => 'style'),
+        'uses row plugin' => FALSE,
+        'uses fields'     => TRUE,
+        'uses options'    => TRUE,
+        'type'            => 'normal',
+        'help_topic'      => 'style-bibtex',
+        'even empty'      => TRUE,
+      ),
+    ),
+  );
+}
diff --git a/views_bibtex.info b/views_bibtex.info
new file mode 100644
index 0000000..eef9b97
--- /dev/null
+++ b/views_bibtex.info
@@ -0,0 +1,7 @@
+name = Views BibTeX
+description = Views style plugin to render node content as BibTeX.
+package = Views
+core = 7.x
+dependencies[] = views
+
+files[] = views/plugins/views_plugin_style_bibtex.inc
diff --git a/views_bibtex.module b/views_bibtex.module
new file mode 100644
index 0000000..a6d9ee8
--- /dev/null
+++ b/views_bibtex.module
@@ -0,0 +1,337 @@
+<?php
+
+/**
+ * @file
+ * Module definition for views_bibtex
+ *
+ * @see views_bibtex.views.inc
+ */
+
+function views_bibtex_init() {
+  if (isset($_GET['sort_order'])) {
+    $_GET['sort_order'] = strtoupper($_GET['sort_order']);
+  }
+}
+
+/**
+ * Implements hook_views_api().
+ */
+function views_bibtex_views_api() {
+  return array(
+    'api' => '2.0',
+    'path' => drupal_get_path('module', 'views_bibtex') . '/views',
+  );
+}
+
+/**
+ * Implements hook_views_pre_render().
+ */
+function views_bibtex_views_pre_render(&$view) {
+  if(isset($view->plugin_name) && $view->plugin_name == 'views_bibtex') {
+    // Support for Video field.
+    if(!empty($view->result)) {
+      // Process each View result.
+      foreach($view->result as $row => $result) {
+        // Only process the entity fields defined by the View.
+        foreach($view->field as $field_name => $field) {
+          if($field instanceof views_handler_field_field) {
+            if($field->field_info['type'] == 'video') {
+
+              // Get the Video URL.
+              $video = $field->get_value($view->result[$row]);
+              $url = file_create_url($video[0]['uri']);
+              $render_array = array(
+                '#type' => 'markup',
+                '#markup' => filter_xss($url),
+              );
+              // Substitute embed code with URL. @todo Add support for escaped embed codes.
+              $view->result[$row]->{'field_'. $field_name}[0]['rendered'] = $render_array;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+/**
+ * We almost duplicate the content_handler_field_multiple::render function
+ * to get the multiple rendered field values in an array
+ * @param $field
+ * @param $values
+ * @return unknown_type
+ */
+function _views_bibtex_render_multiple_field($field, $values) {
+  $options = $field->options;
+  // If this is not a grouped field, use content_handler_field::render().
+  if (!$field->defer_query) {
+    return $field->render($values);
+  }
+  // We're down to a single node here, so we can retrieve the actual field
+  // definition for the node type being considered.
+  $content_field = content_fields($field->content_field['field_name'], $values->{$field->aliases['type']});
+  $vid = $values->{$field->field_alias};
+  if (isset($field->field_values[$vid])) {
+    // Gather items, respecting the 'Display n values starting from m' settings.
+    $count_skipped = 0;
+    $items = array();
+    foreach ($field->field_values[$vid] as $item) {
+      if (empty($options['multiple']['multiple_from']) || ($count_skipped >= $options['multiple']['multiple_from'])) {
+        if (empty($options['multiple']['multiple_number']) || (count($items) < $options['multiple']['multiple_number'])) {
+          // Grab the nid - needed for render_link().
+          $nid = $item['_nid'];
+          unset($item['_nid']);
+          $items[] = $item;
+        }
+        else {
+          break;
+        }
+      }
+      $count_skipped++;
+    }
+
+    // Build a pseudo-node from the retrieved values.
+    $node = drupal_clone($values);
+    // content_format and formatters will need a 'type'.
+    $node->type = $values->{$field->aliases['type']};
+    $node->nid = $values->{$field->aliases['nid']};
+    $node->vid = $values->{$field->aliases['vid']};
+
+    // Some formatters need to behave differently depending on the build_mode
+    // (for instance: preview), so we provide one.
+    $node->build_mode = NODE_BUILD_NORMAL;
+
+    // Render items.
+    $formatter_name = $options['format'];
+    if ($items && ($formatter = _content_get_formatter($formatter_name, $content_field['type']))) {
+      $rendered = array();
+      if (content_handle('formatter', 'multiple values', $formatter) == CONTENT_HANDLE_CORE) {
+        // Single-value formatter.
+        $n = 0;
+        foreach ($items as $item) {
+          $output = content_format($content_field, $item, $formatter_name, $node);
+          if (!empty($output)) {
+            $rendered[++$n] = $field->render_link($output, (object) array('nid' => $nid));
+          }
+        }
+      }
+      else {
+        // Multiple values formatter.
+        $output = content_format($content_field, $items, $formatter_name, $values);
+        if (!empty($output)) {
+          $rendered[++$n] = $field->render_link($output, (object) array('nid' => $nid));
+        }
+      }
+      if (count($rendered) > 1) {
+        // TODO: could we use generic field display ?
+        //return theme('content_view_multiple_field', $rendered, $content_field, $values);
+        return $rendered;
+      }
+      elseif ($rendered) {
+        return $rendered[1];
+      }
+    }
+  }
+
+  return '';
+}
+
+/**
+ * Takes each field from a row object and renders the field as determined by the field's theme
+ *
+ * @param $view
+ *   View the row belongs to
+ * @param $row
+ *   Row object
+ * @return array
+ *   Object containing all the raw and rendered fields
+ */
+function _views_bibtex_render_fields($view, $row) {
+  $field_ids = array_keys($view->field);
+  $rendered_fields = array();
+  foreach ($field_ids as $id) {
+    $field = $view->field[$id];
+    $field_is_multiple = FALSE;
+    $field_raw = array();
+    if ((isset($field->options['multiple']['group']))&& isset($field->field_values)) {
+      $field_output = _views_bibtex_render_multiple_field($field, $row);
+      $n = 0;
+      if (is_array($field_output)) {
+        foreach ($field->field_values[$row->{$field->field_alias}] as $item) {
+          $field_raw[++$n] = $item["value"];
+        }
+        $field_is_multiple = TRUE;
+      }
+      else $field_raw = $view->field[$field->options['id']]->advanced_render($row);
+    }
+    else {
+      $field_output = $view->field[$field->options['id']]->advanced_render($row);
+      $field_raw = (isset($view->field[$id]->field_alias) && isset($row->{$view->field[$id]->field_alias})) ? $row->{$view->field[$id]->field_alias} : NULL;
+    }
+
+    $img_match = array();
+    $src_match = array();
+    if (is_array($field_output)) {
+      foreach ($field_output as $i => $f) {
+        if (preg_match("/<img[^>]+>/i", $f, $img_match)) {
+          if (preg_match('/(src)="([^"]*)"/i', $img_match[0], $src_match))
+          $field_output[$i] = ($src_match[2]);
+        }
+      }
+    }
+    else {
+      if (preg_match("/<img[^>]+>/i", $field_output, $img_match)) {
+        if (preg_match('/(src)="([^"]*)"/i', $img_match[0], $src_match))
+          $field_output = ($src_match[2]);
+      }
+    }
+
+    if(empty($field->options['exclude'])) {
+      if (empty($field->options['exclude']) && !($field->options['hide_empty'] && (empty($field_output)))) {
+        $object = new stdClass();
+        $object->id = $id;
+        // Respect the 'empty' value if empty and "No results text" is given.
+        if (empty($field_output) && $field->options['empty']) {
+          $object->content = $field->options['empty'];
+        } else {
+          $object->content = $field_output;
+        }
+        $object->raw = $field_raw;
+        $object->class = drupal_clean_css_identifier(strtolower($id));//views_css_safe($id);
+        $object->label = check_plain($view->field[$id]->label());
+        $object->is_multiple = $field_is_multiple;
+        $rendered_fields[$id] = $object;
+      }
+    }
+  }
+  return $rendered_fields;
+}
+
+/**
+ * Strips illegal characters for an identifier from a BibTeX string.
+ *
+ * @param $input
+ *   Identifier string to process.
+ * @return
+ *   Identifier string with illegal characters stripped away.
+ */
+function _views_bibtex_check_label($input) {
+  $output = str_replace(array('{', '}', '[', ']', ':', ',', '"', "'", chr(47), chr(92)), '', $input);
+  $output = preg_replace(
+              '/[\x{80}-\x{A0}' .      // Non-printable ISO-8859-1 + NBSP
+              '\x{01}-\x{1F}' .        // Non-printable ASCII characters
+              '\x{0}]/u',             // NULL byte
+            '', $output);
+
+  return check_plain(strip_tags($output));
+}
+
+/**
+ * Format BibTeX
+ *
+ * @param $v
+ * @param $options
+ *   Array of options
+ * @param $html
+ *   Boolean, TRUE to format BibTeX in HTML, FALSE to format BibTeX as plain text
+ *
+ * @return
+ *   The formatted BibTeX data
+ */
+function _views_bibtex_formatted($v, $options, $html) {
+  $entry_type_label = $options['entry_type_label'];
+  $display_entry_type_field = $options['display_entry_type_field'];
+  $generate_key = $options['generate_key'];
+
+  if ($html) {
+    $base_indent  = '&nbsp;&nbsp;';
+    $eol          = '<br />';
+    $eos          = $eol; // End of section
+  }
+  else {
+    $base_indent  = '  ';
+    $eol          = "\n";
+    $eos          = $eol . $eol;
+  }
+
+  // This is based on the drupal_to_js() function.
+  switch (gettype($v)) {
+    case 'boolean':
+      // Lowercase is necessary!
+      return $v ? 'true' : 'false';
+
+    case 'integer':
+    case 'double':
+      return $v;
+
+    case 'resource':
+    case 'string':
+      $search   = array('"', chr(92), chr(8), chr(12), chr(13) . chr(10), chr(10), chr(13), chr(9));
+      $replace  = array('\"', '\\', '\b', '\f', '\n', '\n', '\r', '\t');
+      $output   = str_replace($search, $replace, $v);
+      return check_plain($output);
+
+    case 'array':
+      if (empty($v) || array_keys($v) === range(0, sizeof($v) - 1)) {
+        $output = array();
+        foreach ($v as $val) {
+          $output[] = _views_bibtex_formatted($val, $options, $html, $id);
+          $id += 1;
+        }
+        return (!empty($output) ? implode($eos, $output) : '');
+      }
+
+    case 'object':
+      $output = '';
+      $close = '';
+      foreach ($v as $key => $val) {
+        if (!$display_entry_type_field) {
+          if ($key == $entry_type_label)
+            continue;
+        }
+
+        // Entry field closing
+        if ($key != 'nodes') $close = "},$eol";
+
+        // Author field
+        if ($key == 'author' && is_array($val)) $val = implode(' and ', $val);
+
+        // Entry
+        if ($key == 'node') {
+          // Citation key
+          // @todo: make sure the name is last name.
+          // Right now we just take the first word in the author string
+          if ($generate_key) {
+            $first_author = (is_array($val['author'])) ? reset($val['author']) : $val['author'];
+            $strs = explode(' ', $first_author);
+            $last_name = trim($strs[0], ',');
+            $cite_key = $last_name . $val['year'] . ',';
+          }
+          else $cite_key = '';
+
+          $entry_type = $val[$entry_type_label];
+          $key = "@$entry_type{" . $cite_key . $eol;
+          $close = "}$eol";
+        }
+
+        // Field opening
+        else if ($key != 'nodes') $key = $base_indent . _views_bibtex_formatted(strval($key), $options, $html) . ' = {';
+
+        // If the $key is 'nodes', or 'node', ignore
+        else $key = '';
+
+        $output .= $key . _views_bibtex_formatted($val, $options, $html) . $close;
+      }
+      return $output;
+
+    default:
+      return '';
+  }
+}
+
+function _views_bibtex_debug_stop($var, $location) {
+  print("Location:$location\n");
+  var_dump($var);
+  module_Invoke_all('exit');
+  exit;
+}
