diff --git a/includes/jcarousel_style_plugin.inc b/includes/jcarousel_style_plugin.inc
index 23fe069..25d8aad 100644
--- a/includes/jcarousel_style_plugin.inc
+++ b/includes/jcarousel_style_plugin.inc
@@ -67,6 +67,12 @@ class jcarousel_style_plugin extends views_plugin_style {
       '#options' => $skins,
       '#description' => t('Skins may be provided by other modules. Set to "None" if your theme includes carousel theming directly in style.css or another stylesheet. "None" does not include any built-in navigation, arrows, or positioning at all.'),
     );
+    $form['responsive'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Responsive'),
+      '#default_value' => $this->options['responsive'],
+      '#description' => t('Select this option to have the carousel automatically adjust the number of visible items and the number of items to scroll at a time based on the available width.') . ' <strong>' . t('Changing this option will override the "Visible" and "Scroll" options and set carousel orientation to "horizontal".') . '</strong>',
+    );
     $form['visible'] = array(
       '#type' => 'select',
       '#title' => t('Number of visible items'),
diff --git a/js/jcarousel.js b/js/jcarousel.js
index ac1a5b8..e985044 100644
--- a/js/jcarousel.js
+++ b/js/jcarousel.js
@@ -46,6 +46,13 @@ Drupal.behaviors.jcarousel.attach = function(context, settings) {
       };
     }
 
+    // Add responsive behavior.
+    if (options.responsive  && !options.reloadCallback) {
+      options.vertical = false;
+      options.visible = null;
+      options.reloadCallback = Drupal.jcarousel.reloadCallback;
+    }
+
     // Add navigation to the carousel if enabled.
     if (!options.setupCallback) {
       options.setupCallback = function(carousel) {
@@ -53,6 +60,9 @@ Drupal.behaviors.jcarousel.attach = function(context, settings) {
         if (options.navigation) {
           Drupal.jcarousel.addNavigation(carousel, options.navigation);
         }
+        if (options.responsive) {
+          carousel.reload();
+        }
       };
       if (options.navigation && !options.itemVisibleInCallback) {
         options.itemLastInCallback = {
@@ -72,6 +82,25 @@ Drupal.behaviors.jcarousel.attach = function(context, settings) {
 };
 
 Drupal.jcarousel = {};
+Drupal.jcarousel.reloadCallback = function(carousel) {
+  // Set the clip and container to auto width so that they will fill
+  // the available space.
+  carousel.container.css('width', 'auto');
+  carousel.clip.css('width', 'auto');
+  var clipWidth = carousel.clip.width();
+  var containerWidth = carousel.container.width();
+  // Determine the width of an item.
+  var $item = carousel.list.find('.jcarousel-item').first();
+  var itemWidth = $item.outerWidth(true);
+  var numItems = Math.floor(carousel.clip.width() / itemWidth) || 1;
+  // Set the new scroll number.
+  carousel.options.scroll = numItems;
+  var newClipWidth = numItems * itemWidth;
+  var newContainerWidth = newClipWidth + (containerWidth - clipWidth);
+  // Resize the clip and container.
+  carousel.clip.width(newClipWidth);
+  carousel.container.width(newContainerWidth);
+};
 Drupal.jcarousel.ajaxLoadCallback = function(jcarousel, state) {
   // Check if the requested items already exist.
   if (state == 'init' || jcarousel.has(jcarousel.first, jcarousel.last)) {
