diff --git a/includes/admin.inc b/includes/admin.inc
index ff4a99f..e6e9de6 100644
--- a/includes/admin.inc
+++ b/includes/admin.inc
@@ -2220,7 +2220,8 @@ function views_ui_edit_form_get_bucket($type, $view, $display) {
       break;
     case 'field':
       // Fetch the style plugin info so we know whether to list fields or not.
-      $style_plugin = $display->handler->get_plugin();
+      $name = $display->handler->get_option('style_plugin');
+      $style_plugin = $display->handler->get_plugin('style', $name);
       $uses_fields = $style_plugin && $style_plugin->uses_fields();
       if (!$uses_fields) {
         $build['fields'][] = array(
diff --git a/includes/plugins.inc b/includes/plugins.inc
index bf09573..45fbd3d 100644
--- a/includes/plugins.inc
+++ b/includes/plugins.inc
@@ -183,6 +183,18 @@ function views_views_plugins() {
         'type' => 'feed',
         'help topic' => 'style-rss',
       ),
+      'mapping' => array(
+        'title' => t('Field mapping'),
+        'help' => t('Maps specific fields to specific purposes.'),
+        'handler' => 'views_plugin_style_mapping',
+        'theme' => 'views_view',
+        'uses row plugin' => FALSE,
+        'uses fields' => TRUE,
+        'uses options' => TRUE,
+        'uses grouping' => FALSE,
+        'type' => 'normal',
+        'no ui' => TRUE,
+      ),
     ),
     'row' => array(
       'fields' => array(
diff --git a/plugins/views_plugin_display.inc b/plugins/views_plugin_display.inc
index 6be3dcc..d9d6417 100644
--- a/plugins/views_plugin_display.inc
+++ b/plugins/views_plugin_display.inc
@@ -825,7 +825,8 @@ function get_option($option) {
    * Determine if the display's style uses fields.
    */
   function uses_fields() {
-    $plugin = $this->get_plugin();
+    $name = $this->get_option('style_plugin');
+    $plugin = $this->get_plugin('style', $name);
     if ($plugin) {
       return $plugin->uses_fields();
     }
@@ -1166,8 +1167,9 @@ function options_summary(&$categories, &$options) {
       'desc' => t('Change the title that this display will use.'),
     );
 
-    $style_plugin = views_fetch_plugin_data('style', $this->get_option('style_plugin'));
-    $style_plugin_instance = $this->get_plugin('style');
+    $name = $this->get_option('style_plugin');
+    $style_plugin = views_fetch_plugin_data('style', $name);
+    $style_plugin_instance = $this->get_plugin('style', $name);
     $style_summary = empty($style_plugin['title']) ? t('Missing style plugin') : $style_plugin_instance->summary_title();
     $style_title = empty($style_plugin['title']) ? t('Missing style plugin') : $style_plugin_instance->plugin_title();
 
@@ -1187,8 +1189,9 @@ function options_summary(&$categories, &$options) {
     }
 
     if (!empty($style_plugin['uses row plugin'])) {
-      $row_plugin = views_fetch_plugin_data('row', $this->get_option('row_plugin'));
-      $row_plugin_instance = $this->get_plugin('row');
+      $name = $this->get_option('row_plugin');
+      $row_plugin = views_fetch_plugin_data('row', $name);
+      $row_plugin_instance = $this->get_plugin('row', $name);
       $row_summary = empty($row_plugin['title']) ? t('Missing style plugin') : $row_plugin_instance->summary_title();
       $row_title = empty($row_plugin['title']) ? t('Missing style plugin') : $row_plugin_instance->plugin_title();
 
@@ -1895,7 +1898,8 @@ function options_form(&$form, &$form_state) {
           }
         }
 
-        $plugin = $this->get_plugin();
+        $name = $this->get_option('style_plugin');
+        $plugin = $this->get_plugin('style', $name);
         if ($plugin) {
           $funcs[] = $this->option_link(t('Style output'), 'analyze-theme-style') . ': ' . $this->format_themes($plugin->theme_functions(), $plugin->additional_theme_functions());
           $themes = $plugin->additional_theme_functions();
@@ -1906,7 +1910,8 @@ function options_form(&$form, &$form_state) {
           }
 
           if ($plugin->uses_row_plugin()) {
-            $row_plugin = $this->get_plugin('row');
+            $name = $this->get_option('row_plugin');
+            $row_plugin = $this->get_plugin('row', $name);
             if ($row_plugin) {
               $funcs[] = $this->option_link(t('Row style output'), 'analyze-theme-row') . ': ' . $this->format_themes($row_plugin->theme_functions());
               $themes = $row_plugin->additional_theme_functions();
@@ -2008,7 +2013,8 @@ function options_form(&$form, &$form_state) {
         $form['#title'] .= t('Theming information (style)');
         $output = '<p>' . t('Back to !info.', array('!info' => $this->option_link(t('theming information'), 'analyze-theme'))) . '</p>';
 
-        $plugin = $this->get_plugin();
+        $name = $this->get_option('style_plugin');
+        $plugin = $this->get_plugin('style', $name);
 
         if (empty($plugin->definition['theme'])) {
           $output .= t('This display has no style theming information');
@@ -2035,7 +2041,8 @@ function options_form(&$form, &$form_state) {
         $form['#title'] .= t('Theming information (row style)');
         $output = '<p>' . t('Back to !info.', array('!info' => $this->option_link(t('theming information'), 'analyze-theme'))) . '</p>';
 
-        $plugin = $this->get_plugin('row');
+        $name = $this->get_option('row_plugin');
+        $plugin = $this->get_plugin('row', $name);
 
         if (empty($plugin->definition['theme'])) {
           $output .= t('This display has no row style theming information');
@@ -2705,7 +2712,8 @@ function validate() {
     }
 
     // Validate style plugin
-    $style = $this->get_plugin();
+    $name = $this->display->handler->get_option('style_plugin');
+    $style = $this->get_plugin('style', $name);
     if (empty($style)) {
       $errors[] = t('Display "@display" has an invalid style plugin.', array('@display' => $this->display->display_title));
     }
@@ -2897,7 +2905,8 @@ function export_handler($indent, $prefix, $storage, $option, $definition, $paren
    */
   function export_style($indent, $prefix, $storage, $option, $definition, $parents) {
     $output = '';
-    $style_plugin = $this->get_plugin();
+    $name = $this->get_option('style_plugin');
+    $style_plugin = $this->get_plugin('style', $name);
     if ($option == 'style_plugin') {
       $type = 'style';
       $options_field = 'style_options';
@@ -2910,7 +2919,8 @@ function export_style($indent, $prefix, $storage, $option, $definition, $parents
 
       $type = 'row';
       $options_field = 'row_options';
-      $plugin = $this->get_plugin('row');
+      $name = $this->get_option('row_plugin');
+      $plugin = $this->get_plugin('row', $name);
       // If the style plugin doesn't use row plugins, don't even bother.
     }
 
@@ -2958,10 +2968,9 @@ function export_plugin($indent, $prefix, $storage, $option, $definition, $parent
 
   function unpack_style($indent, $prefix, $storage, $option, $definition, $parents) {
     $output = '';
-    $style_plugin = $this->get_plugin();
+    $name = $this->get_option('style_plugin');
+    $style_plugin = $this->get_plugin('style', $name);
     if ($option == 'style_plugin') {
-      $type = 'style';
-      $options_field = 'style_options';
       $plugin = $style_plugin;
     }
     else {
@@ -2969,9 +2978,8 @@ function unpack_style($indent, $prefix, $storage, $option, $definition, $parents
         return;
       }
 
-      $type = 'row';
-      $options_field = 'row_options';
-      $plugin = $this->get_plugin('row');
+      $name = $this->get_option('row_plugin');
+      $plugin = $this->get_plugin('row', $name);
       // If the style plugin doesn't use row plugins, don't even bother.
     }
 
diff --git a/plugins/views_plugin_display_feed.inc b/plugins/views_plugin_display_feed.inc
index bfd220c..64070c2 100644
--- a/plugins/views_plugin_display_feed.inc
+++ b/plugins/views_plugin_display_feed.inc
@@ -203,7 +203,8 @@ function attach_to($display_id) {
 
     // Defer to the feed style; it may put in meta information, and/or
     // attach a feed icon.
-    $plugin = $this->get_plugin();
+    $name = $this->get_option('style_plugin');
+    $plugin = $this->get_plugin('style', $name);
     if ($plugin) {
       $clone = $this->view->clone_view();
       $clone->set_display($this->display->id);
diff --git a/plugins/views_plugin_style.inc b/plugins/views_plugin_style.inc
index d355e1b..b30e101 100644
--- a/plugins/views_plugin_style.inc
+++ b/plugins/views_plugin_style.inc
@@ -571,7 +571,8 @@ function validate() {
     $errors = parent::validate();
 
     if ($this->uses_row_plugin()) {
-      $plugin = $this->display->handler->get_plugin('row');
+      $name = $this->display->handler->get_option('row_plugin');
+      $plugin = $this->display->handler->get_plugin('row', $name);
       if (empty($plugin)) {
         $errors[] = t('Style @style requires a row style but the row plugin is invalid.', array('@style' => $this->definition['title']));
       }
diff --git a/plugins/views_plugin_style_mapping.inc b/plugins/views_plugin_style_mapping.inc
new file mode 100644
index 0000000..7b2e2ef
--- /dev/null
+++ b/plugins/views_plugin_style_mapping.inc
@@ -0,0 +1,111 @@
+<?php
+
+/**
+ * @file
+ * Definition of views_plugin_style_mapping.
+ */
+
+/**
+ * Allows fields to be mapped to specific use cases.
+ */
+class views_plugin_style_mapping extends views_plugin_style {
+
+  /**
+   * Builds the list of field mappings.
+   *
+   * @return array
+   *   An associative array, keyed by the field name, containing the following
+   *   key-value pairs:
+   *   - #title: The human-readable label for this field.
+   *   - #default_value: The default value for this field. If not provided, an
+   *     empty string will be used.
+   *   - #description: A description of this field.
+   *   - #required: Whether this field is required.
+   *   - #filter: (optional) A method on the plugin to filter field options.
+   *   - #toggle: (optional) If this select should be toggled by a checkbox.
+   */
+  function define_mapping() {
+    return array();
+  }
+
+  /**
+   * Overrides views_plugin_style::option_definition().
+   */
+  function option_definition() {
+    $options = parent::option_definition();
+
+    // Parse the mapping and add a default for each.
+    foreach ($this->define_mapping() as $key => $value) {
+      $default = !empty($value['#multiple']) ? array() : '';
+      $options['views_mapping']['contains'][$key] = array(
+        'default' => isset($value['#default_value']) ? $value['#default_value'] : $default,
+      );
+      if (!empty($value['#toggle'])) {
+        $options['views_mapping']['contains']["toggle_$key"] = array(
+          'default' => FALSE,
+          'bool' => TRUE,
+        );
+      }
+    }
+
+    return $options;
+  }
+
+  /**
+   * Overrides views_plugin_style::options_form().
+   */
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+
+    // Get the mapping.
+    $mapping = $this->define_mapping();
+
+    // Restrict the list of defaults to the mapping, in case they have changed.
+    $options = array_intersect_key($this->options['views_mapping'], $mapping);
+
+    // Get the labels of the fields added to this display.
+    $field_labels = $this->display->handler->get_field_labels();
+
+    // Provide some default values.
+    $defaults = array(
+      '#type' => 'select',
+      '#required' => FALSE,
+      '#multiple' => FALSE,
+    );
+
+    // For each mapping, add a select element to the form.
+    foreach ($options as $key => $value) {
+      // If the field is optional, add a 'None' value to the top of the options.
+      $field_options = array();
+      $required = !empty($mapping[$key]['required']);
+      if (!$required) {
+        $field_options = array('' => t('- None -'));
+      }
+      $field_options += $field_labels;
+
+      // Optionally filter the available fields.
+      if (isset($mapping[$key]['#filter'])) {
+        $this::$mapping[$key]['#filter']($field_options);
+        unset($mapping[$key]['#filter']);
+      }
+
+      // These values must always be set.
+      $overrides = array(
+        '#options' => $field_options,
+        '#default_value' => $options[$key],
+      );
+
+      // Optionally allow the select to be toggleable.
+      if (!empty($mapping[$key]['#toggle'])) {
+        $form['views_mapping']["toggle_$key"] = array(
+          '#type' => 'checkbox',
+          '#title' => t('Use a custom %field_name', array('%field_name' => strtolower($mapping[$key]['#title']))),
+        );
+        $overrides['#states']['visible'][':input[name="style_options[views_mappings][' . "toggle_$key" . ']"]'] = array('checked' => TRUE);
+      }
+
+      $form['views_mapping'][$key] = $overrides + $mapping[$key] + $defaults;
+    }
+  }
+
+}
diff --git a/views.info b/views.info
index c0d8f14..29e7eaf 100644
--- a/views.info
+++ b/views.info
@@ -242,6 +242,7 @@ files[] = plugins/views_plugin_style_default.inc
 files[] = plugins/views_plugin_style_grid.inc
 files[] = plugins/views_plugin_style_list.inc
 files[] = plugins/views_plugin_style_jump_menu.inc
+files[] = plugins/views_plugin_style_mapping.inc
 files[] = plugins/views_plugin_style_rss.inc
 files[] = plugins/views_plugin_style_summary.inc
 files[] = plugins/views_plugin_style_summary_jump_menu.inc
