diff --git a/js/views_slideshow_jcarousel.js b/js/views_slideshow_jcarousel.js
new file mode 100644
index 0000000..bfe7e53
--- /dev/null
+++ b/js/views_slideshow_jcarousel.js
@@ -0,0 +1,103 @@
+(function ($) {
+  /**
+   * Views Slideshow jCarousel Pager
+   */
+
+  // Add views slieshow api calls for views slideshow jCarousel pager.
+  Drupal.behaviors.viewsSlideshowJcarouselPager = function (context) {
+    // Process pause on hover.
+    $('.views_slideshow_jcarousel_pager:not(.views-slideshow-jcarousel-pager-processed)', context).addClass('views-slideshow-jcarousel-pager-processed').each(function() {
+      // Parse out the unique id from the full id.
+      var pagerInfo = $(this).attr('id').split('_');
+      var location = pagerInfo[2];
+      pagerInfo.splice(0, 3);
+      var uniqueID = pagerInfo.join('_');
+
+      $(this).jcarousel({
+        vertical: parseInt(Drupal.settings.viewsSlideshowJCarouselPager[uniqueID][location].orientation),
+        scroll: parseInt(Drupal.settings.viewsSlideshowJCarouselPager[uniqueID][location].scroll),
+        visible: parseInt(Drupal.settings.viewsSlideshowJCarouselPager[uniqueID][location].visible),
+        wrap: Drupal.settings.viewsSlideshowJCarouselPager[uniqueID][location].wrap,
+        animation: (isNaN(Drupal.settings.viewsSlideshowJCarouselPager[uniqueID][location].animation)) ? Drupal.settings.viewsSlideshowJCarouselPager[uniqueID][location].animation : parseInt(Drupal.settings.viewsSlideshowJCarouselPager[uniqueID][location].animation),
+        initCallback: function(carousel) {
+          Drupal.settings.viewsSlideshowJCarouselPager[uniqueID][location]['carouselObj'] = carousel;
+        }
+      });
+
+      $(this).find('.views_slideshow_jcarousel_pager_item').each(function(index, pagerItem) {
+        $(pagerItem).click(function() {
+          Drupal.viewsSlideshow.action({ "action": 'goToSlide', "slideshowID": uniqueID, "slideNum": index });
+        });
+      });
+    });
+  };
+
+  Drupal.viewsSlideshowJcarouselPager = Drupal.viewsSlideshowJcarouselPager || {};
+
+  /**
+   * Implement the transitionBegin hook for pager jcarousel pager.
+   */
+  Drupal.viewsSlideshowJcarouselPager.transitionBegin = function (options) {
+    for(pagerLocation in Drupal.settings.viewsSlideshowPager[options.slideshowID]) {
+      if (Drupal.settings.viewsSlideshowJCarouselPager[options.slideshowID][pagerLocation].moveOnChange) {
+        Drupal.settings.viewsSlideshowJCarouselPager[options.slideshowID][pagerLocation]['carouselObj'].scroll(options.slideNum);
+      }
+    }
+  };
+
+  /**
+   * Implement the goToSlide hook for pager jcarousel pager.
+   */
+  Drupal.viewsSlideshowJcarouselPager.goToSlide = function (options) {
+    for(pagerLocation in Drupal.settings.viewsSlideshowPager[options.slideshowID]) {
+      if (Drupal.settings.viewsSlideshowJCarouselPager[options.slideshowID][pagerLocation].moveOnChange) {
+        Drupal.settings.viewsSlideshowJCarouselPager[options.slideshowID][pagerLocation].scroll(options.slideNum);
+      }
+    }
+  };
+
+  /**
+   * Implement the previousSlide hook for pager jCarousel pager.
+   */
+  Drupal.viewsSlideshowJcarouselPager.previousSlide = function (options) {
+    for(pagerLocation in Drupal.settings.viewsSlideshowPager[options.slideshowID]) {
+      // Get the current active pager.
+      var pagerNum = $('[id^="views_slideshow_jcarousel_pager_item_' + pagerLocation + '_'  + options.slideshowID + '"].active').attr('id').replace('views_slideshow_pager_field_item_' + pagerLocation + '_'  + options.slideshowID + '_', '');
+
+      // If we are on the first pager then activate the last pager.
+      // Otherwise activate the previous pager.
+      if (pagerNum == 0) {
+        pagerNum = $('[id^="views_slideshow_jcarousel_pager_item_' + pagerLocation + '_'  + options.slideshowID + '"]').length() - 1;
+      }
+      else {
+        pagerNum--;
+      }
+
+      if (Drupal.settings.viewsSlideshowJCarouselPager[options.slideshowID][pagerLocation].moveOnChange) {
+        Drupal.settings.viewsSlideshowJCarouselPager[options.slideshowID][pagerLocation].scroll(pagerNum);
+      }
+    }
+  };
+
+  /**
+   * Implement the nextSlide hook for pager jcarousel pager.
+   */
+  Drupal.viewsSlideshowJcarouselPager.nextSlide = function (options) {
+    for(pagerLocation in Drupal.settings.viewsSlideshowPager[options.slideshowID]) {
+      // Get the current active pager.
+      var pagerNum = $('[id^="views_slideshow_jcarousel_pager_item_' + pagerLocation + '_'  + options.slideshowID + '"].active').attr('id').replace('views_slideshow_jcarousel_pager_item_' + pagerLocation + '_'  + options.slideshowID + '_', '');
+      var totalPagers = $('[id^="views_slideshow_jcarousel_pager_item_' + pagerLocation + '_'  + options.slideshowID + '"]').length();
+
+      // If we are on the last pager then activate the first pager.
+      // Otherwise activate the next pager.
+      pagerNum++;
+      if (pagerNum == totalPagers) {
+        pagerNum = 0;
+      }
+
+      if (Drupal.settings.viewsSlideshowJCarouselPager[options.slideshowID][pagerLocation].moveOnChange) {
+        Drupal.settings.viewsSlideshowJCarouselPager[options.slideshowID][pagerLocation].scroll(pagerNum);
+      }
+    }
+  };
+})(jQuery);
diff --git a/theme/views-slideshow-jcarousel-field.tpl.php b/theme/views-slideshow-jcarousel-field.tpl.php
new file mode 100644
index 0000000..31de233
--- /dev/null
+++ b/theme/views-slideshow-jcarousel-field.tpl.php
@@ -0,0 +1,10 @@
+<div class="views-field-<?php print views_css_safe($view->field[$field]->field); ?>">
+  <?php if ($view->field[$field]->label()) { ?>
+    <label class="view-label-<?php print views_css_safe($view->field[$field]->field); ?>">
+      <?php print $view->field[$field]->label(); ?>:
+    </label>
+  <?php } ?>
+  <div class="views-content-<?php print views_css_safe($view->field[$field]->field); ?>">
+    <?php print $view->style_plugin->rendered_fields[$count][$field]; ?>
+  </div>
+</div>
diff --git a/theme/views-slideshow-jcarousel-item.tpl.php b/theme/views-slideshow-jcarousel-item.tpl.php
new file mode 100644
index 0000000..5a0140b
--- /dev/null
+++ b/theme/views-slideshow-jcarousel-item.tpl.php
@@ -0,0 +1,3 @@
+<li<?php print drupal_attributes($attributes); ?>>
+  <?php print $item; ?>
+</li>
diff --git a/theme/views-slideshow-jcarousel.tpl.php b/theme/views-slideshow-jcarousel.tpl.php
new file mode 100644
index 0000000..64f9d27
--- /dev/null
+++ b/theme/views-slideshow-jcarousel.tpl.php
@@ -0,0 +1,5 @@
+<div<?php print drupal_attributes($attributes); ?>>
+  <ul>
+    <?php print $rendered_field_items; ?>
+  </ul>
+</div>
diff --git a/theme/views_slideshow_jcarousel.theme.inc b/theme/views_slideshow_jcarousel.theme.inc
new file mode 100644
index 0000000..b5ce85f
--- /dev/null
+++ b/theme/views_slideshow_jcarousel.theme.inc
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Theme pager fields
+ */
+function _views_slideshow_jcarousel_pager_preprocess_pager(&$vars) {
+  // Build our javascript settings.
+  $js_vars = array(
+    'viewsSlideshowJCarouselPager' => array(
+      $vars['vss_id'] => array(
+        $vars['location'] => array(
+          'carouselObj' => '',
+          'moveOnChange' => $vars['settings']['views_slideshow_jcarousel_pager_move_on_change'],
+          'orientation' => $vars['settings']['views_slideshow_jcarousel_pager_orientation'],
+          'scroll' => $vars['settings']['views_slideshow_jcarousel_pager_scroll'],
+          'visible' => $vars['settings']['views_slideshow_jcarousel_pager_visible'],
+          'wrap' => $vars['settings']['views_slideshow_jcarousel_pager_wrap'],
+          'animation' => $vars['settings']['views_slideshow_jcarousel_pager_animation'],
+        ),
+      ),
+    ),
+  );
+
+  // Add the settings to the page.
+  drupal_add_js($js_vars, 'setting');
+
+  // Add our class to the wrapper.
+  $vars['attributes']['class'] = (isset($vars['attributes']['class'])) ? $vars['attributes']['class'] . ' views_slideshow_jcarousel_pager jcarousel-skin-' . $vars['settings']['views_slideshow_jcarousel_pager_skin'] : 'views_slideshow_jcarousel_pager jcarousel-skin-' . $vars['settings']['views_slideshow_jcarousel_pager_skin'];
+
+  // Render all the fields unless there is only 1 slide and the user specified
+  // to hide them when there is only one slide.
+  $vars['rendered_field_items'] = '';
+  if (empty($vars['settings']['hide_on_single_slide']) || count($vars['view']->result) > 1) {
+    foreach ($vars['view']->result as $count => $node) {
+      $rendered_fields = '';
+      foreach ($vars['settings']['views_slideshow_jcarousel_pager_fields'] as $field => $use) {
+        if ($use !== 0 && is_object($vars['view']->field[$field])) {
+          $rendered_fields .= theme('views_slideshow_jcarousel_pager_field', $vars['view'], $field, $count);
+        }
+      }
+      $vars['rendered_field_items'] .= theme('views_slideshow_jcarousel_pager_item', $vars['vss_id'], $rendered_fields, $count, $vars['location']);
+    }
+
+    if (module_exists('libraries')) {
+      // Load jCarousel
+      if ($jcarousel_path = _views_slideshow_jcarousel_library_path()) {
+        drupal_add_js($jcarousel_path);
+      }
+
+      $jcarousel_path = libraries_get_path('jcarousel');
+      drupal_add_css($jcarousel_path . '/skins/' . $vars['settings']['views_slideshow_jcarousel_pager_skin'] . '/skin.css');
+      // Load our jcarousel pager js
+      $module_path = drupal_get_path('module', 'views_slideshow_jcarousel');
+      drupal_add_js($module_path . '/js/views_slideshow_jcarousel.js');
+    }
+  }
+}
+
+/**
+ * Views Slideshow jCarousel: pager item.
+ *
+ * @ingroup themeable
+ */
+function _views_slideshow_jcarousel_preprocess_pager_item(&$vars) {
+  $current = $vars['count'] + 1;
+  $classes = array(
+    'views_slideshow_jcarousel_pager_item',
+  );
+  if (!$vars['count']) {
+    $classes[] = 'views_slideshow_active_pager_field_item';
+  }
+  $classes[] = ($vars['count'] % 2) ? 'views-row-even' : 'views-row-odd';
+
+  $vars['attributes']['class'] = implode(' ', $classes);
+  $vars['attributes']['id'] = 'views_slideshow_jcarousel_pager_item_' . $vars['location'] . '_' . $vars['vss_id'] . '_' . $vars['count'];
+}
diff --git a/views_slideshow_jcarousel.info b/views_slideshow_jcarousel.info
index 1288b96..ac6f59c 100644
--- a/views_slideshow_jcarousel.info
+++ b/views_slideshow_jcarousel.info
@@ -1 +1,5 @@
-name = Views Slideshow JCarousel
+name = Views Slideshow: JCarousel
+description = Adds a jCarousel option to views slideshow
+dependencies[] = views_slideshow
+package = Views
+core = 6.x
diff --git a/views_slideshow_jcarousel.module b/views_slideshow_jcarousel.module
new file mode 100644
index 0000000..78040e9
--- /dev/null
+++ b/views_slideshow_jcarousel.module
@@ -0,0 +1,286 @@
+<?php
+/**
+ * Implement hook_theme().
+ */
+function views_slideshow_jcarousel_theme($existing, $type, $theme, $path) {
+  return array(
+    'views_slideshow_jcarousel_pager' => array(
+      'arguments' => array('vss_id' => NULL, 'view' => NULL, 'settings' => array(), 'location' => NULL, 'attributes' => array()),
+      'template' => 'theme/views-slideshow-jcarousel-pager',
+    ),
+    'views_slideshow_jcarousel_pager_field' => array(
+      'arguments' => array('view' => NULL, 'field' => NULL, 'count' => NULL),
+      'template' => 'theme/views-slideshow-jcarousel-pager-field',
+      'file' => 'theme/views_slideshow_jcarousel.theme.inc',
+    ),
+    'views_slideshow_jcarousel_pager_item' => array(
+      'arguments' => array('vss_id' => NULL, 'item' => NULL, 'count' => NULL, 'location' => NULL),
+      'template' => 'theme/views-slideshow-jcarousel-pager-item',
+    ),
+  );
+}
+
+/**
+ * Gets the path to the jCarousel library.
+ *
+ * @return
+ *   The path to the jCarousel library js file, or FALSE if not found.
+ */
+function _views_slideshow_jcarousel_library_path() {
+  $jcarousel_path = libraries_get_path('jcarousel');
+
+  if (!empty($jcarousel_path)) {
+    // Attempt to use minified version of jCarousel plugin.
+    if (file_exists($jcarousel_path . '/lib/jquery.jcarousel.min.js')) {
+      $jcarousel_path .= '/lib/jquery.jcarousel.min.js';
+    }
+    // Otherwise use non-minified version if available.
+    elseif (file_exists($jcarousel_path . '/lib/jquery.jcarousel.js')) {
+      $jcarousel_path .= '/lib/jquery.jcarousel.js';
+    }
+    else {
+      $jcarousel_path = FALSE;
+    }
+  }
+  else {
+    $jcarousel_path = FALSE;
+  }
+
+  return $jcarousel_path;
+}
+
+function views_slideshow_jcarousel_views_slideshow_js_method_register() {
+  return array(
+    'viewsSlideshowJcarouselPager',
+  );
+}
+
+/**
+ * Implementation of hook_views_slideshow_info
+ */
+function views_slideshow_jcarousel_views_slideshow_widget_pager_info($view) {
+  $settings = array();
+  // Settings for fields.
+  // First verfiy that the view is using fields.
+  if ($view->row_plugin->uses_fields()) {
+    $settings = array(
+      'views_slideshow_jcarousel_pager' => array(
+        'name' => t('jCarousel Pager'),
+      ),
+    );
+  }
+
+  return $settings;
+}
+
+/**
+ * Implements hook_views_slideshow_option_definition.
+ */
+function views_slideshow_jcarousel_views_slideshow_option_definition() {
+  $locations = array('top', 'bottom');
+  // Defaults for the pager widget.
+  foreach ($locations as $location) {
+    $options['widgets']['contains'][$location]['contains']['views_slideshow_pager']['contains']['views_slideshow_jcarousel_pager_fields'] = array('default' => array());
+    $options['widgets']['contains'][$location]['contains']['views_slideshow_pager']['contains']['views_slideshow_jcarousel_pager_move_on_change'] = array('default' => 0);
+    $options['widgets']['contains'][$location]['contains']['views_slideshow_pager']['contains']['views_slideshow_jcarousel_pager_skin'] = array('default' => 'tango');
+    $options['widgets']['contains'][$location]['contains']['views_slideshow_pager']['contains']['views_slideshow_jcarousel_pager_orientation'] = array('default' => FALSE);
+    $options['widgets']['contains'][$location]['contains']['views_slideshow_pager']['contains']['views_slideshow_jcarousel_pager_scroll'] = array('default' => 3);
+    $options['widgets']['contains'][$location]['contains']['views_slideshow_pager']['contains']['views_slideshow_jcarousel_pager_visible'] = array('default' => 3);
+    $options['widgets']['contains'][$location]['contains']['views_slideshow_pager']['contains']['views_slideshow_jcarousel_pager_wrap'] = array('default' => NULL);
+    $options['widgets']['contains'][$location]['contains']['views_slideshow_pager']['contains']['views_slideshow_jcarousel_pager_animation'] = array('default' => 'fast');
+  }
+
+  return $options;
+}
+
+/**
+ * Implementation [widget-type]_views_slideshow_pager_form_options
+ */
+function views_slideshow_jcarousel_pager_views_slideshow_widget_pager_form_options(&$form, &$form_state, &$view, $defaults, $dependency) {
+  // Settings for fields pager.
+  $options = array();
+  // Get each field and it's name.
+  foreach ($view->display->handler->get_handlers('field') as $field => $handler) {
+    $options[$field] = $handler->ui_name();
+  }
+
+  // Add ability to choose which fields to show in the pager.
+  $form['views_slideshow_jcarousel_pager_fields'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Pager fields'),
+    '#options' => $options,
+    '#default_value' => $defaults['views_slideshow_jcarousel_pager_fields'],
+    '#description' => t("Choose the fields that will appear in the pager."),
+    '#prefix' => '<div id="' . $dependency . '-views-slideshow-jcarousel-pager-fields-wrapper">',
+    '#suffix' => '</div>',
+    '#process' => array(
+      'expand_checkboxes',
+      'views_process_dependency',
+    ),
+    '#dependency_count' => 2,
+    '#dependency' => array(
+      $dependency . '-enable' => array(1),
+      $dependency . '-type' => array('views_slideshow_jcarousel_pager'),
+    )
+  );
+
+  // Add field to see if they would like the carousel to activate the pager item
+  // on slide change.
+  $form['views_slideshow_jcarousel_pager_move_on_change'] = array(
+    '#type' => 'checkbox',
+    '#title' => t('Move To Active Pager Item On Slide Change'),
+    '#default_value' => $defaults['views_slideshow_jcarousel_pager_move_on_change'],
+    '#description' => t('When the slide changes move the carousel to the active pager item.'),
+    '#prefix' => '<div id="' . $dependency . '-views-slideshow-jcarousel-pager-move-on-change">',
+    '#suffix' => '</div>',
+    '#process' => array(
+      'views_process_dependency',
+    ),
+    '#dependency_count' => 2,
+    '#dependency' => array(
+      $dependency . '-enable' => array(1),
+      $dependency . '-type' => array('views_slideshow_jcarousel_pager'),
+    ),
+  );
+
+  $skin_directory = libraries_get_path('jcarousel') . '/skins';
+  $skins = array();
+  foreach (scandir($skin_directory) as $dir) {
+    if ($dir !== '.' && $dir !== '..' && is_dir($skin_directory . '/' . $dir)) {
+      $skins[$dir] = $dir;
+    }
+  }
+
+  // Set the skin.
+  $form['views_slideshow_jcarousel_pager_skin'] = array(
+    '#type' => 'select',
+    '#title' => t('jCarousel Skin'),
+    '#options' => $skins,
+    '#default_value' => $defaults['views_slideshow_jcarousel_pager_skin'],
+    '#description' => t('Choose the skin for your carousel.  You can add more by placing your skin in the jcarousel library directory.'),
+    '#prefix' => '<div id="' . $dependency . '-views-slideshow-jcarousel-pager-skin">',
+    '#suffix' => '</div>',
+    '#process' => array(
+      'views_process_dependency',
+    ),
+    '#dependency_count' => 2,
+    '#dependency' => array(
+      $dependency . '-enable' => array(1),
+      $dependency . '-type' => array('views_slideshow_jcarousel_pager'),
+    ),
+  );
+
+  // Set orientation of the pager.
+  $form['views_slideshow_jcarousel_pager_orientation'] = array(
+    '#type' => 'select',
+    '#title' => t('Orientation of the Pager'),
+    '#options' => array(FALSE => 'Horizontal', TRUE => 'Vertical'),
+    '#default_value' => $defaults['views_slideshow_jcarousel_pager_orientation'],
+    '#description' => t('Should the pager be horizontal or vertical.'),
+    '#prefix' => '<div id="' . $dependency . '-views-slideshow-jcarousel-pager-orientation">',
+    '#suffix' => '</div>',
+    '#process' => array(
+      'views_process_dependency',
+    ),
+    '#dependency_count' => 2,
+    '#dependency' => array(
+      $dependency . '-enable' => array(1),
+      $dependency . '-type' => array('views_slideshow_jcarousel_pager'),
+    ),
+  );
+
+  // Set the number of visible items.
+  $form['views_slideshow_jcarousel_pager_visible'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Number of Visiable Pager Items'),
+    '#default_value' => $defaults['views_slideshow_jcarousel_pager_visible'],
+    '#description' => t('Set the number of pager items that are visible at a single time.'),
+    '#size' => 10,
+    '#prefix' => '<div id="' . $dependency . '-views-slideshow-jcarousel-pager-visible">',
+    '#suffix' => '</div>',
+    '#process' => array(
+      'views_process_dependency',
+    ),
+    '#dependency_count' => 2,
+    '#dependency' => array(
+      $dependency . '-enable' => array(1),
+      $dependency . '-type' => array('views_slideshow_jcarousel_pager'),
+    ),
+  );
+
+  // Set the number of items to scroll by.
+  $form['views_slideshow_jcarousel_pager_scroll'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Scroll'),
+    '#default_value' => $defaults['views_slideshow_jcarousel_pager_scroll'],
+    '#description' => t('The number of items to scroll by.'),
+    '#size' => 10,
+    '#prefix' => '<div id="' . $dependency . '-views-slideshow-jcarousel-pager-scroll">',
+    '#suffix' => '</div>',
+    '#process' => array(
+      'views_process_dependency',
+    ),
+    '#dependency_count' => 2,
+    '#dependency' => array(
+      $dependency . '-enable' => array(1),
+      $dependency . '-type' => array('views_slideshow_jcarousel_pager'),
+    ),
+  );
+
+  // animation speed
+  $form['views_slideshow_jcarousel_pager_animation'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Speed of the transition'),
+    '#default_value' => $defaults['views_slideshow_jcarousel_pager_animation'],
+    '#description' => t('Options are fast, slow or a number in milliseconds.'),
+    '#size' => '10',
+    '#prefix' => '<div id="' . $dependency . '-views-slideshow-jcarousel-pager-animation">',
+    '#suffix' => '</div>',
+    '#process' => array(
+      'views_process_dependency',
+    ),
+    '#dependency_count' => 2,
+    '#dependency' => array(
+      $dependency . '-enable' => array(1),
+      $dependency . '-type' => array('views_slideshow_jcarousel_pager'),
+    ),
+  );
+
+  // Wrap the carousel
+  $form['views_slideshow_jcarousel_pager_wrap'] = array(
+    '#type' => 'select',
+    '#title' => t('Wrapping'),
+    '#options' => array(NULL => 'Disabled', 'circular' => 'Circular', 'first' => 'First', 'last' => 'Last', 'both' => 'Both'),
+    '#default_value' => $defaults['views_slideshow_jcarousel_pager_wrap'],
+    '#description' => t('Wrap the carousel.'),
+    '#prefix' => '<div id="' . $dependency . '-views-slideshow-jcarousel-pager-wrap">',
+    '#suffix' => '</div>',
+    '#process' => array(
+      'views_process_dependency',
+    ),
+    '#dependency_count' => 2,
+    '#dependency' => array(
+      $dependency . '-enable' => array(1),
+      $dependency . '-type' => array('views_slideshow_jcarousel_pager'),
+    ),
+  );
+}
+
+/**
+ * Need to have preprocess functions here because drupal doesn't cache them
+ * correctly in the theme.inc file.
+ *
+ * If you would like to override the preprocess functions make sure to look at
+ * the associated function in theme.inc.
+ */
+
+// Trying to make sure the theme.inc get's loaded.
+include_once('theme/views_slideshow_jcarousel.theme.inc');
+
+function template_preprocess_views_slideshow_jcarousel_pager(&$vars) {
+  _views_slideshow_jcarousel_pager_preprocess_pager($vars);
+}
+
+function template_preprocess_views_slideshow_jcarousel_pager_item(&$vars) {
+  _views_slideshow_jcarousel_pager_preprocess_pager_item($vars);
+}
