diff --git a/README.txt b/README.txt
index d06778f..3b2d64c 100644
--- a/README.txt
+++ b/README.txt
@@ -68,6 +68,23 @@ list.
 See admin/help/jcarousel for demonstrations of how to utilize jCarousel in your
 own code.
 
+Using jCarousel0.3
+------------------
+Note the following update to the options array structure for jCarousel 0.3 when 
+using jcarousel_add. This example would include the 'control' and 'pagination' function
+
+  $options = array(
+    'plugins' => array('control', 'pagination),
+    'callbacks' => array(
+      'somecallbacktrigger' => 'somecallbackfunction',
+    )
+  ),
+  
+Views integration is not currently supported for jCarousel 0.3
+
+See https://github.com/jsor/jcarousel for details on updated plugins, settings and callbacks
+
+
 Example
 -------
 The following would add a vertical jCarousel to the page:
diff --git a/jcarousel.module b/jcarousel.module
old mode 100644
new mode 100755
index 0164dbf..e85772f
--- a/jcarousel.module
+++ b/jcarousel.module
@@ -56,27 +56,67 @@ function jcarousel_help($path, $arg) {
       // Provide the horizontal carousel demonstration.
       $output .= '<h3>' . t('Horizontal carousel') . '</h3>';
       $output .= '<p>' . t('This example uses <code>jcarousel_add()</code> directly with no options to create the default horizontal carousel.') . '</p>';
-      $list_html = '<ul class="horizontalcarousel jcarousel-skin-default">' . $list . '</ul>';
+      $list_html = '<div class="jcarousel-skin-horizontal"><div class="jcarousel jcarousel-horizontal" ><ul>' . $list . '</ul></div></div></div>';
 
+      $options = array(
+        'plugins' => array(
+          'autoscroll' => array(
+            'autostart' => FALSE,
+            'interval' => '5000',
+            'scroll' => '1'
+          ),
+          'control' => array(
+            'scroll' => 3,
+            'event' => 'click',
+            'buttonNextHTML' => 'Next',
+            'buttonPrevHTML' => 'Prev'
+          ), 
+          'pagination' => array('perpage' => 1),
+          'swipe' => array(),
+          'wrap' => TRUE,
+          'skin' => TRUE,
+        )
+      );
+      
       $sample = $fieldset;
-      $sample['#children'] = '<code><pre>' . check_plain($list_html) . '</pre></code>' . highlight_string("<?php jcarousel_add('horizontalcarousel'); ?>", TRUE);
+      $highlight_options = "\$options = array(
+         'plugins' => array(
+          'autoscroll' => array(
+            'autostart' => FALSE,
+            'interval' => '5000',
+            'scroll' => '1'
+          ),
+          'control' => array(
+            'scroll' => 3,
+            'event' => 'click',
+            'buttonNextHTML' => 'Next',
+            'buttonPrevHTML' => 'Prev'
+          ), 
+          'pagination' => array('perpage' => 1),
+          'swipe' => array(),
+          'wrap' => TRUE,
+          'skin' => TRUE,
+        )
+      )";
+
+      $sample['#children'] = '<code><pre>' . check_plain($list_html) . '</pre></code>' . highlight_string("<?php $highlight_options  jcarousel_add('jcarousel-horizontal', \$options); ?>", TRUE);
       $output .= drupal_render($sample);
-
       $output .= $list_html;
-      jcarousel_add('horizontalcarousel');
+      
+      jcarousel_add('jcarousel-horizontal', $options);
 
 
       // Provide the vertical carousel demonstration.
       $output .= '<h3>' . t('Vertical carousel') . '</h3>';
       $output .= '<p>' . t('jCarousel can accept a variety of <a href="http://sorgalla.com/projects/jcarousel/#Configuration">configuration options</a> via the second argument to <code>jcarousel_add()</code>. In this example, we created a vertical carousel.') . '</p>';
-      $list_html = '<ul class="verticalcarousel jcarousel-skin-default">' . $list . '</ul>';
-
+      $list_html = '<div class="jcarousel-skin-vertical"><div class="jcarousel jcarousel-vertical" ><ul>' . $list . '</ul></div></div></div>';
+      
       $sample = $fieldset;
-      $sample['#children'] = '<code><pre>' . check_plain($list_html) . '</pre></code>' . highlight_string("<?php jcarousel_add('verticalcarousel', array('vertical' => TRUE)); ?>", TRUE);
+      $sample['#children'] = '<code><pre>' . check_plain($list_html) . '</pre></code>' . highlight_string("<?php $highlight_options  jcarousel_add('jcarousel-vertical', \$options); ?>", TRUE);
       $output .= drupal_render($sample);
-
       $output .= $list_html;
-      jcarousel_add('verticalcarousel', array('vertical' => TRUE));
+      
+      jcarousel_add('jcarousel-vertical', $options);
 
       // Provide the different skins carousel demonstration.
       $output .= '<h3>' . t('Different skins') . '</h3>';
@@ -88,7 +128,7 @@ function jcarousel_help($path, $arg) {
       $output .= drupal_render($sample);
 
       $output .= $list_html;
-      jcarousel_add('differentskin', array('skin' => 'tango'));
+      //jcarousel_add('differentskin', array('skin' => 'tango'));
 
       // Another thing you can do is use the theme('jcarousel') function.
       $output .= '<h3>' . t('Theme function') . '</h3>';
@@ -114,7 +154,7 @@ function jcarousel_help($path, $arg) {
       $sample = $fieldset;
       $sample['#children'] = highlight_string("<?php\n\$items = " . var_export($items, TRUE) . ";\n\$options = " . var_export($options, TRUE) . ";\nprint theme('jcarousel', array('items' => \$items, 'options' => \$options));\n?>", TRUE);
       $output .= drupal_render($sample);
-      $output .= theme('jcarousel', array('items' => $items, 'options' => $options));
+      //$output .= theme('jcarousel', array('items' => $items, 'options' => $options));
 
       // Provide a circular wrap element.
       $output .= '<h3>' . t('Circular wrap') . '</h3>';
@@ -126,7 +166,7 @@ function jcarousel_help($path, $arg) {
       $sample = $fieldset;
       $sample['#children'] = highlight_string("<?php\n\$items = " . var_export($items, TRUE) . ";\n\$options = " . var_export($options, TRUE) . ";\nprint theme('jcarousel', array('items' => \$items, 'options' => \$options));\n?>", TRUE);
       $output .= drupal_render($sample);
-      $output .= theme('jcarousel', array('items' => $items, 'options' => $options));
+      //$output .= theme('jcarousel', array('items' => $items, 'options' => $options));
 
       return $output;
   }
@@ -208,13 +248,24 @@ function jcarousel_jcarousel_skin_info() {
 function jcarousel_add($class_name = NULL, $options = array(), $add = TRUE) {
   static $library_added;
 
+  $jcarousel_path = drupal_get_path('module', 'jcarousel');
+  
+  $default =  array(
+    $jcarousel_path . '/js/jcarousel/src/jquery.jcarousel.js' => array('weight' => 10),
+    drupal_get_path('module', 'jcarousel') . '/js/jcarousel.js' => array('weight' => 12)
+  );
+
+  // Add plugins for jCarousel 0.3
+  if (isset($options['plugins'])) {
+    foreach ($options['plugins'] as $key => $plugin) {
+      $default[$jcarousel_path . '/js/jcarousel/plugins/' . $key . '/src/jquery.jcarousel.' . $key . '.js'] = array('weight' => 11);
+    }
+  }
+  
   // Add the jCarousel library and any global settings.
   $attachments = array(
     // TODO: Change this to 'library' in Drupal 7.
-    'js' => array(
-      drupal_get_path('module', 'jcarousel') . '/js/jquery.jcarousel.min.js',
-      drupal_get_path('module', 'jcarousel') . '/js/jcarousel.js',
-    ),
+    'js' => $default
   );
 
   if (isset($class_name)) {
@@ -227,6 +278,7 @@ function jcarousel_add($class_name = NULL, $options = array(), $add = TRUE) {
     // Allow other modules to modify these settings.
     drupal_alter('jcarousel_options', $options, $class_name);
 
+   
     // Add settings for this individual carousel.
     if (!isset($library_added[$class_name]) || !$add) {
       $library_added[$class_name] = TRUE;
@@ -265,9 +317,12 @@ function jcarousel_add($class_name = NULL, $options = array(), $add = TRUE) {
   if ($add) {
     foreach ($attachments as $type => $type_list) {
       $drupal_add_type = 'drupal_add_' . $type;
-      foreach ($type_list as $attachment) {
-        if (is_array($attachment)) {
-          $drupal_add_type($attachment['data'], $attachment['type']);
+      foreach ($type_list as $file => $attachment) {
+        if (is_array($attachment) && isset($attachment['data']) && isset($attachment['type'])) {
+        	$drupal_add_type($attachment['data'], $attachment['type']);
+        }
+        elseif (is_array($attachment)) {
+        	$drupal_add_type($file, $attachment);
         }
         else {
           $drupal_add_type($attachment);
@@ -340,15 +395,16 @@ function theme_jcarousel($variables) {
 
   $classes = 'jcarousel ' . $identifier;
   if (!empty($options['skin'])) {
-    $classes .= ' jcarousel-skin-' . $options['skin'];
+    $skin .= ' jcarousel-skin-' . $options['skin'];
   }
 
-  $output = '<ul class="' . $classes . '">';
+  $output = '<div class="' . $skin . '"><ul class="' . $classes . '">';
+  $output .= '<div id="' . $identifier . '" class="jcarousel">';
   if (is_array($items)) {
     foreach ($items as $item) {
       $output .= '<li>' . $item . '</li>';
     }
   }
-  $output .= '</ul>';
+  $output .= '</ul></div></div>';
   return $output;
 }
diff --git a/js/jcarousel.js b/js/jcarousel.js
index ac1a5b8..cbffa3d 100644
--- a/js/jcarousel.js
+++ b/js/jcarousel.js
@@ -17,35 +17,50 @@ Drupal.behaviors.jcarousel.attach = function(context, settings) {
   $.each(settings.jcarousel.carousels, function(key, options) {
     var $carousel = $(options.selector + ':not(.jcarousel-processed)', context);
 
+    
     // If this carousel has already been processed or doesn't exist, move on.
     if (!$carousel.length) {
       return;
     }
-
+ /*
     // Callbacks need to be converted from a string to an actual function.
-    $.each(options, function(optionKey) {
-      if (optionKey.match(/Callback$/) && typeof options[optionKey] == 'string') {
+    $.each(options.callbacks, function(optionKey, a) {
+ 
         var callbackFunction = window;
-        var callbackParents = options[optionKey].split('.');
+        var callbackParents = options.callbacks[optionKey].split('.');
         $.each(callbackParents, function(objectParent) {
           callbackFunction = callbackFunction[callbackParents[objectParent]];
         });
-        options[optionKey] = callbackFunction;
-      }
-    });
 
+        options[optionKey] = callbackFunction;
+        window[optionKey]=callbackFunction;
+
+        if (typeof window[optionKey] == 'function') {
+          // Bind callbacks to items in the carousel
+          if (optionKey.match(/jcarouselitem/) ) {
+            $carousel.find('li').bind('jcarouselitemfirstin', function(carousel, e) {window[optionKey]($carousel, this)});
+          }
+          // Bind callbacks to the carousel
+          else 
+          {
+            $($carousel).bind(optionKey, function($carousel, options) {window[optionKey]($carousel, options)});
+          }
+        }
+        
+    }); */
+    
     // Add standard options required for AJAX functionality.
     if (options.ajax && !options.itemLoadCallback) {
       options.itemLoadCallback = Drupal.jcarousel.ajaxLoadCallback;
     }
-
+    
     // If auto-scrolling, pause animation when hoving over the carousel.
     if (options.auto && options.autoPause && !options.initCallback) {
       options.initCallback = function(carousel, state) {
         Drupal.jcarousel.autoPauseCallback(carousel, state);
       };
     }
-
+    
     // Add navigation to the carousel if enabled.
     if (!options.setupCallback) {
       options.setupCallback = function(carousel) {
@@ -61,13 +76,48 @@ Drupal.behaviors.jcarousel.attach = function(context, settings) {
       }
     }
 
-    if (!options.hasOwnProperty('buttonNextHTML') && !options.hasOwnProperty('buttonPrevHTML')) {
-      options.buttonNextHTML = Drupal.theme('jCarouselButton', 'next');
-      options.buttonPrevHTML = Drupal.theme('jCarouselButton', 'previous');
-    }
-
-    // Initialize the jcarousel.
     $carousel.addClass('jcarousel-processed').jcarousel(options);
+    
+    //@TODO - use other jCarousel plugins too such as pagination (doesn't appear to work as expected so have left it out)
+    
+    // Initialise plugins functions
+    if (options.plugins) {
+      $.each(options.plugins, function(plugin, pluginsettings) {
+
+        switch(plugin) {
+        
+        case  'autoscroll':
+          $($carousel).jcarouselAutoscroll(pluginsettings);
+        break;
+        
+        case 'control':
+
+          // Add the control buttons
+          $(Drupal.theme('jCarouselButton', 'previous', pluginsettings.buttonPrevHTML)).insertBefore($carousel).jcarouselControl({scroll: '-=' + pluginsettings.scroll});
+          $(Drupal.theme('jCarouselButton', 'next', pluginsettings.buttonNextHTML)).insertAfter($carousel).jcarouselControl({scroll: '+=' + pluginsettings.scroll});
+        break;
+        
+        case 'pagination':
+ 
+        	$(Drupal.theme('jCarouselPagination', key)).insertAfter($carousel.parent()).jcarouselPagination({perpage: pluginsettings.perpage}, $carousel);
+        break;
+        
+        case 'swipe':
+          $carousel.jcarouselSwipe();
+        break;
+        
+        
+        default:
+        break;
+        }
+      
+      });
+    };
+    
+
+ 
+
+    
   });
 };
 
@@ -285,13 +335,18 @@ Drupal.jcarousel.ajaxErrorCallback = function (xhr, path) {
   alert(Drupal.t("An error occurred at @path.\n\nError Description: @error", {'@path': path, '@error': error_text}));
 };
 
-Drupal.theme.prototype.jCarouselButton = function(type) {
+Drupal.theme.prototype.jCarouselButton = function(type, buttonHTML) {
   // Use links for buttons for accessibility.
-  return '<a href="javascript:void(0)"></a>';
+  return '<a href="javascript:void(0)" class="jcarousel-control jcarousel-control-button-' + type + '">' + buttonHTML+ '</a>';
 };
 
 Drupal.theme.prototype.jCarouselPageLink = function(pageNumber) {
   return '<a href="javascript:void(0)"><span>' + (pageNumber) + '</span></a>';
 };
 
+Drupal.theme.prototype.jCarouselPagination = function(key) {
+	  return '<div class="pagination" id="pagination-' + key + '"></div>';
+	}; 
+
+
 })(jQuery);
diff --git a/skins/default/jcarousel-default.css b/skins/default/jcarousel-default.css
index bfb8cbd..76773b5 100644
--- a/skins/default/jcarousel-default.css
+++ b/skins/default/jcarousel-default.css
@@ -1,152 +1,82 @@
-
-/**
- * A simple sample carousel skin.
- *
- * This skin includes a sample arrows.svg file that may be edited with the free
- * illustration application InkScape (http://inkscape.org).
- *
- * CSS and icons by Nathan Haug.
- */
-
-.jcarousel-skin-default {
-  text-align: center;
-}
-
-.jcarousel-skin-default .jcarousel-container-horizontal {
-  width: 440px;
-  height: 102px;
-  padding: 20px 40px;
-  margin: auto;
-}
-
-.jcarousel-skin-default .jcarousel-container-vertical {
-  width: 102px;
-  height: 440px;
-  padding: 40px 20px;
-  margin: auto;
-}
-
-.jcarousel-skin-default .jcarousel-clip-horizontal {
-  width: 440px;
-  overflow: hidden;
-}
-
-.jcarousel-skin-default .jcarousel-clip-vertical {
-  height: 440px;
-  overflow: hidden;
+.jcarousel-skin-horizontal a.jcarousel-control,
+.jcarousel-skin-horizontal .jcarousel-processed {
+  float: left;
 }
 
-.jcarousel-skin-default .jcarousel-item {
-  padding: 0;
-  width: 100px;
-  height: 100px;
-  overflow: hidden;
-  border: 1px solid #CCC;
-  list-style: none;
-  background: #fff none;
+.page-admin-help-jcarousel .pagination {
+  clear: both;
+  padding: 15px;
 }
 
-.jcarousel-skin-default .jcarousel-item-horizontal {
-  margin: 0 4px;
+.jcarousel-skin-horizontal a.jcarousel-control {
+  margin: 15px; 
+  vertical-align: middle;
 }
 
-.jcarousel-skin-default .jcarousel-item-vertical {
-  margin: 4px 0;
+.jcarousel-skin-horizontal .jcarousel {
+    position: relative;
+    overflow: hidden;
+    width: 245px;
+    height: 75px;
+    border: 1px solid #000;
 }
 
-.jcarousel-skin-default .jcarousel-item-placeholder {
-  background: #fff url(throbber.gif) no-repeat center center;
-  color: #000;
+.jcarousel-skin-horizontal .jcarousel ul {
+    width: 20000px;
+    position: absolute;
+    list-style: none outside none;
+    margin: 0;
+    padding: 0;
 }
 
-/**
- * Buttons
- */
-.jcarousel-skin-default .jcarousel-next,
-.jcarousel-skin-default .jcarousel-prev {
-  display: block;
-  width: 32px;
-  height: 32px;
-  background-image: url(arrows.png);
+.jcarousel-skin-horizontal li {
+    float: left;
+    margin: 0 10px 0 0;
+    list-style: none outside none;
+    padding: 0;
 }
 
-.jcarousel-skin-default .jcarousel-next-disabled,
-.jcarousel-skin-default .jcarousel-prev-disabled {
-  display: none;
+*[dir=rtl] .jcarousel-skin-horizontal li {
+    float: right;
+    margin: 0 0 0 10px;
 }
 
-/**
- * Horizontal Buttons
- */
-.jcarousel-skin-default .jcarousel-prev-horizontal {
-  position: absolute;
-  top: 55px;
-  left: 10px;
-  background-position: 0 0;
-}
-.jcarousel-skin-default .jcarousel-prev-horizontal:hover {
-  background-position: -32px 0;
-}
-.jcarousel-skin-default .jcarousel-prev-horizontal:active {
-  background-position: -64px 0;
-}
+/** Custom **/
 
-.jcarousel-skin-default .jcarousel-next-horizontal {
-  position: absolute;
-  top: 55px;
-  right: 10px;
-  background-position: 0 -32px;
-}
-.jcarousel-skin-default .jcarousel-next-horizontal:hover {
-  background-position: -32px -32px;
-}
-.jcarousel-skin-default .jcarousel-next-horizontal:active {
-  background-position: -64px -32px;
+.jcarousel-skin-horizontal li img {
+    border: 0;
 }
 
-/**
- * Vertical Buttons
- */
-.jcarousel-skin-default .jcarousel-prev-vertical {
-  position: absolute;
-  top: 10px;
-  left: 55px;
-  background-position: 0 -64px;
-}
-.jcarousel-skin-default .jcarousel-prev-vertical:hover {
-  background-position: -32px -64px;
-}
-.jcarousel-skin-default .jcarousel-prev-vertical:active {
-  background-position: -64px -64px;
+.jcarousel-skin-vertical .jcarousel-vertical,
+.jcarousel-skin-vertical .ver-ti-cal {
+    position: relative;
+    overflow: hidden;
+    width: 50%;
+    width: 75px;
+    height: 245px;
+    border: 1px solid #000;
 }
 
-.jcarousel-skin-default .jcarousel-next-vertical {
-  position: absolute;
-  bottom: 10px;
-  left: 55px;
-  background-position: 0 -96px;
-}
-.jcarousel-skin-default .jcarousel-next-vertical:hover {
-  background-position: -32px -96px;
-}
-.jcarousel-skin-default .jcarousel-next-vertical:active {
-  background-position: -64px -96px;
+.jcarousel-skin-vertical .jcarousel-vertical ul,
+.jcarousel-skin-vertical .ver-ti-cal ul {
+    height: 20000px;
+    width: 75px;
+    position: absolute;
+    list-style: none;
+    margin: 0;
+    padding: 0;
 }
 
-.jcarousel-skin-default .jcarousel-navigation {
-  margin: 0;
-  padding: 0;
+.jcarousel-skin-vertical .jcarousel-vertical li,
+.jcarousel-skin-vertical .ver-ti-cal li {
+    height: 75px;
+    margin: 0 0 10px 0;
+    padding: 0;
 }
 
-.jcarousel-skin-default .jcarousel-navigation li {
-  display: inline;
-  margin: 0 2px 0 0;
-  padding: 0;
-  background: none;
-}
+/** Custom **/
 
-.jcarousel-skin-default .jcarousel-navigation li.active a {
-  font-weight: bold;
-  text-decoration: none;
+.jcarousel-skin-vertical li img {
+    border: 0;
 }
 
