diff --git a/beanslide.info b/beanslide.info
index 9e7c63e..3be3e4d 100644
--- a/beanslide.info
+++ b/beanslide.info
@@ -8,5 +8,10 @@ dependencies[] = "link"
 dependencies[] = "media"
 description = "Provides a slideshow enabled block"
 files[] = "plugins/bean/slideshow.inc"
+files[] = "plugins/beanslide/interface.inc"
+files[] = "plugins/beanslide/jquery.cycle.inc"
+files[] = "plugins/beanslide/flexslider.inc"
+files[] = "plugins/beanslide/responsiveslides.inc"
+files[] = "plugins/beanslide/vegas.inc"
 name = "Bean Slide"
 php = "5.2.4"
diff --git a/beanslide.module b/beanslide.module
index 91e84be..df787b5 100644
--- a/beanslide.module
+++ b/beanslide.module
@@ -281,15 +281,15 @@ function theme_beanslide_collection($variables) {
     else {
       $images[] = image_style_url($item['field_slide_image'][0]['#image_style'], $item['field_slide_image'][0]['#item']['uri']);
     }
+  }
 
-    // Vegas displays all the images as "background" via CSS, so hang on to
-    // all the image urls, but don't render any image tags.
-    if ($bean->data['slideshow_plugin'] === 'jquery.vegas') {
-      unset($items[$item_key]['data']['entity']['field_collection_item'][$key]['field_slide_image']);
-    }
+  // Vegas displays all the images as "background" via CSS, so hang on to
+  // all the image urls, but don't render any image tags.
+  if ($bean->data['slideshow_plugin'] === 'jquery.vegas') {
+    unset($items[$item_key]['data']['entity']['field_collection_item'][$key]['field_slide_image']);
   }
 
-  drupal_alter('beanslide_slides', $items, $bean);
+  drupal_alter('beanslide_slideshow', $items, $slides, $bean);
   foreach ($items as $key => $data) {
     $items[$key] = drupal_render($data);
   }
@@ -304,6 +304,7 @@ function theme_beanslide_collection($variables) {
   $data = $bean->data;
   $data['id'] = $id;
   $data['images'] = $images;
+
   if ($data['slideshow_plugin'] === 'jquery.vegas') {
     $data['vegas_overlay'] = base_path() . libraries_get_path('jquery.vegas') . '/overlays/' . $data['vegas_overlay'];
   }
@@ -345,3 +346,89 @@ function beanslide_image_default_styles() {
   );
   return $styles;
 }
+
+/**
+ * Returns the plugin object for the given plugin type.
+ */
+function beanslide_get_plugin($type) {
+  if (empty($type)) {
+    $type = 'beanslide:null';
+  }
+
+  $plugins = &drupal_static(__FUNCTION__, array());
+  if (!isset($plugins[$type])) {
+    $plugin_info = beanslide_get_plugin_info($type);
+    try {
+      $plugins[$type] = new $plugin_info['class']();
+    }
+    catch (Exception $e) {
+      watchdog('beanslide', 'Bad beanslide plugin type: @type', array('@type' => $type));
+      throw $e;
+    }
+  }
+  return $plugins[$type];
+}
+
+/**
+ * Returns plugin info array for the given plugin type.
+ */
+function beanslide_get_plugin_info($type) {
+  if ($type === 'beanslide:null') {
+    return array(
+      'name' => t('Missing plugin'),
+      'description' => t('Plugin not selected, or missing.'),
+      'class' => 'BeanSlideNullPlugin',
+    );
+  }
+  $plugin_info = beanslide_get_plugin_info_all();
+  return isset($plugin_info[$type]) ? $plugin_info[$type] : FALSE;
+}
+
+/**
+ * Returns plugin info array for all plugin types.
+ */
+function beanslide_get_plugin_info_all() {
+  $plugin_info = &drupal_static(__FUNCTION__, array());
+  if (empty($plugin_info)) {
+    $plugin_info = module_invoke_all('beanslide_plugin_info');
+    drupal_alter('beanslide_plugin_info', $plugin_info);
+  }
+  dpm($plugin_info);
+  return $plugin_info;
+}
+
+/**
+ * Implements hook_beanslide_plugin_info().
+ */
+function beanslide_beanslide_plugin_info() {
+  return array(
+    'beanslide:jquery.cycle' => array(
+      'name' => t('BeanSlide: jQuery Cycle'),
+      'description' => t('The old standard; a slideshow plugin that supports many different types of transition effects.'),
+      'url' => 'http://jquery.malsup.com/cycle/',
+      'class' => 'BeanSlideCyclePlugin',
+      'responsive' => FALSE,
+    ),
+    'beanslide:flexslider' => array(
+      'name' => t('BeanSlide: FlexSlider'),
+      'description' => t('FlexSlider: An awesome, fully responsive jQuery slider plugin.'),
+      'url' => 'http://www.woothemes.com/flexslider/',
+      'class' => 'BeanSlideFlexSliderPlugin',
+      'responsive' => TRUE,
+    ),
+    'beanslide:responsiveslides' => array(
+      'name' => t('BeanSlide: ResponsiveSlides'),
+      'description' => t('Simple & lightweight responsive slider plugin (in 1kb)'),
+      'url' => 'http://responsive-slides.viljamis.com/',
+      'class' => 'BeanSlideResponsiveSlidesPlugin',
+      'responsive' => TRUE,
+    ),
+    'beanslide:vegas' => array(
+      'name' => t('BeanSlide: jQuery Vegas'),
+      'description' => t('Vegas Background Slideshow'),
+      'url' => 'http://vegas.jaysalvat.com/',
+      'class' => 'BeanSlideVegasPlugin',
+      'responsive' => FALSE,
+    ),
+  );
+}
diff --git a/plugins/bean/slideshow.inc b/plugins/bean/slideshow.inc
index b24c954..3a6ab3c 100644
--- a/plugins/bean/slideshow.inc
+++ b/plugins/bean/slideshow.inc
@@ -33,20 +33,32 @@ class BeanslideBean extends BeanPlugin {
    * Implements BeanPlugin::form().
    */
   public function form($bean, $form, &$form_state) {
-    $form = array();
+    $plugin_info_all = beanslide_get_plugin_info_all();
 
     $form['slideshow_plugin'] = array(
       '#type' => 'select',
       '#title' => t('Slideshow plugin'),
-      '#options' => array(
-        'jquery.cycle' => t('jQuery Cycle'),
-        'flexslider'   => t('FlexSlider'),
-        'jquery.vegas' => t('jQuery Vegas'),
-        'responsiveslides' => t('responsiveSlides'),
-      ),
+      '#options' => array(),
       '#default_value' => $bean->slideshow_plugin,
     );
 
+    $form['plugin_settings'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Plugin settings'),
+    );
+
+    foreach ($plugin_info_all as $plugin_type => $plugin_info) {
+      $form['slideshow_plugin']['#options'][$plugin_type] = $plugin_info['name'];
+      $plugin = beanslide_get_plugin($plugin_type);
+      $form['plugin_settings'][$plugin_type] = $plugin->form($form_state);
+      $form['plugin_settings'][$plugin_type]['#states'] = array(
+        'visible' => array(
+          'select[name="slideshow_plugin"]' => array('value' => $plugin_type),
+        ),
+      );
+    }
+    dpm($form);
+
     $form['cycle_effect'] = array(
       '#type' => 'select',
       '#title' => t('Transition effect'),
@@ -58,16 +70,6 @@ class BeanslideBean extends BeanPlugin {
         ),
       ),
     );
-    $form['responsive_maxwidth'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Maximum slideshow width (pixels)'),
-      '#default_value' => 960,
-      '#states' => array(
-        'visible' => array(
-          'select[name="slideshow_plugin"]' => array('value' => 'responsiveslides'),
-        ),
-      ),
-    );
 
     $vegas_overlay_options = array('<none>' => '- None -');
     foreach (range(1, 15) as $index) {
@@ -100,7 +102,7 @@ class BeanslideBean extends BeanPlugin {
     $form['transition_duration'] = array(
       '#type' => 'textfield',
       '#title' => t('Transition duration'),
-      '#description' => t('The time it takes for each transition (such as fade), in milliseconds.'),
+      '#description' => t('The time it takes for each slide transition, in milliseconds.'),
       '#default_value' => $bean->transition_duration,
     );
 
@@ -143,19 +145,6 @@ class BeanslideBean extends BeanPlugin {
         ),
       ),
     );
-    // Alert for responsiveSlides library
-    $form['pager']['responsive_pager'] = array(
-      '#type' => 'item',
-      '#title' => t('ALERT'),
-      '#markup' => '<label>' . t('The responsiveSlides library always appends the pager to the slideshow UL. TODO: incorporate an "append" selector') . '</label>',
-      '#states' => array(
-        'visible' => array(
-          'select[name="slideshow_plugin"]' => array('value' => 'responsiveslides'),
-          'select[name="pager[position]"]' => array('value' => 'before'),
-        ),
-      ),
-    );
-
     $form['navigation'] = array(
       '#type' => 'fieldset',
       '#title' => t('Navigation controls'),
diff --git a/plugins/beanslide/flexslider.inc b/plugins/beanslide/flexslider.inc
new file mode 100644
index 0000000..b0d39d6
--- /dev/null
+++ b/plugins/beanslide/flexslider.inc
@@ -0,0 +1,27 @@
+<?php
+/**
+ * @file
+ * BeanSlide plugin for Flexslider.
+ */
+
+class BeanSlideFlexSliderPlugin implements BeanSlidePluginInterface {
+
+  /**
+   * Implements BeanSlidePluginInterface::attachments().
+   */
+  public function attachments() {}
+
+  /**
+   * Implements BeanSlidePluginInterface::form().
+   */
+  public function form($bean, &$form_state) {
+    return array();
+  }
+
+  /**
+   * Implements BeanSlidePluginInterface::values().
+   */
+  public function values() {
+    return array();
+  }
+}
diff --git a/plugins/beanslide/interface.inc b/plugins/beanslide/interface.inc
new file mode 100644
index 0000000..cd2add1
--- /dev/null
+++ b/plugins/beanslide/interface.inc
@@ -0,0 +1,45 @@
+<?php
+/**
+ * @file
+ * Interface for BeanSlide plugins.
+ */
+
+interface BeanSlidePluginInterface {
+
+  /**
+   *
+   */
+  public function attachments();
+
+  /**
+   *
+   */
+  public function form($bean, &$form_state);
+
+  /**
+   *
+   */
+  public function values();
+}
+
+class BeanSlideNullPlugin {
+
+  /**
+   * Implements BeanSlidePluginInterface::attachments().
+   */
+  public function attachments() {}
+
+  /**
+   * Implements BeanSlidePluginInterface::form().
+   */
+  public function form($bean, &$form_state) {
+    return array();
+  }
+
+  /**
+   * Implements BeanSlidePluginInterface::values().
+   */
+  public function values() {
+    return array();
+  }
+}
diff --git a/plugins/beanslide/jquery.cycle.inc b/plugins/beanslide/jquery.cycle.inc
new file mode 100644
index 0000000..c594929
--- /dev/null
+++ b/plugins/beanslide/jquery.cycle.inc
@@ -0,0 +1,27 @@
+<?php
+/**
+ * @file
+ * BeanSlide plugin for jQuery.cycle.
+ */
+
+class BeanSlideCyclePlugin implements BeanSlidePluginInterface {
+
+  /**
+   * Implements BeanSlidePluginInterface::attachments().
+   */
+  public function attachments() {}
+
+  /**
+   * Implements BeanSlidePluginInterface::form().
+   */
+  public function form($bean, &$form_state) {
+    return array();
+  }
+
+  /**
+   * Implements BeanSlidePluginInterface::values().
+   */
+  public function values() {
+    return array();
+  }
+}
diff --git a/plugins/beanslide/responsiveslides.inc b/plugins/beanslide/responsiveslides.inc
new file mode 100644
index 0000000..09ec712
--- /dev/null
+++ b/plugins/beanslide/responsiveslides.inc
@@ -0,0 +1,48 @@
+<?php
+/**
+ * @file
+ * BeanSlide plugin for ResponsiveSlides.
+ */
+
+class BeanSlideResponsiveSlidesPlugin implements BeanSlidePluginInterface {
+
+  /**
+   *
+   */
+  public function attachments() {
+  }
+
+  /**
+   *
+   */
+  public function form($bean, &$form_state) {
+    $form = array();
+    $form['max_width'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Maximum slideshow width (pixels)'),
+      '#default_value' => 960,
+    );
+    // Alert for responsiveSlides library.
+    $form['pager_warning'] = array(
+      '#type' => 'item',
+      '#title' => t('ALERT'),
+      '#markup' => '<label>' . t('The responsiveSlides library always appends the pager to the slideshow UL. TODO: incorporate an "append" selector') . '</label>',
+      '#states' => array(
+        'visible' => array(
+          'select[name="pager[position]"]' => array('value' => 'before'),
+        ),
+      ),
+    );
+    return $form;
+  }
+
+  /**
+   *
+   */
+  public function values() {
+    return array(
+      'max_width' => 960,
+    );
+  }
+
+}
diff --git a/plugins/beanslide/vegas.inc b/plugins/beanslide/vegas.inc
new file mode 100644
index 0000000..1ea86bd
--- /dev/null
+++ b/plugins/beanslide/vegas.inc
@@ -0,0 +1,27 @@
+<?php
+/**
+ * @file
+ * BeanSlide plugin for Vegas.
+ */
+
+class BeanSlideVegasPlugin implements BeanSlidePluginInterface {
+
+  /**
+   * Implements BeanSlidePluginInterface::attachments().
+   */
+  public function attachments() {}
+
+  /**
+   * Implements BeanSlidePluginInterface::form().
+   */
+  public function form($bean, &$form_state) {
+    return array();
+  }
+
+  /**
+   * Implements BeanSlidePluginInterface::values().
+   */
+  public function values() {
+    return array();
+  }
+}
