diff --git js/calendar_ajax.js js/calendar_ajax.js
new file mode 100644
index 0000000..0d30f1f
--- /dev/null
+++ js/calendar_ajax.js
@@ -0,0 +1,136 @@
+/**
+ * Ensure Calendar namespace is established.
+ */
+Drupal.Calendar = Drupal.Calendar || {};
+
+Drupal.behaviors.calendarAjax = function(context) {
+  // check only with the views that has the ajax option set on
+  // this function only exists if there is some calendar with ajax on
+  $.each(Drupal.settings.views.ajaxViews, function(i,settings) {
+      // check if the calendar theme has added the views name and then add the ajax feature
+      if ( typeof( Drupal.settings.calendar_ajax[settings.view_name] ) != "undefined"){
+        Drupal.Calendar.makeCalendarAjaxy(i);
+      }
+  });
+};
+
+Drupal.Calendar.makeCalendarAjaxy = function(i) {
+  if(Drupal.settings.views.ajaxViews[i]) {
+
+    //--- BASIC SETTINGS ----------------------------------------
+    var settings        = Drupal.settings.views.ajaxViews[i];
+    var view_name       = settings.view_name;
+    var view_display_id = settings.view_display_id;
+    var view_dom_id     = settings.view_dom_id;
+    var ajax_path = ((Drupal.settings.views.ajax_path instanceof Array) ? Drupal.settings.views.ajax_path[i]:Drupal.settings.views.ajax_path);
+
+    var view_scope = '.view-id-' + view_name + '.view-display-id-' + view_display_id + '.view-dom-id-' + view_dom_id ;
+
+    //--- GET THE NEXT/PREV ARGUMENTS ----------------------------
+    var prev_date = new Date();
+    var next_date = new Date();
+    var view_args_next = '';
+    var view_args_prev = '';
+    var args = settings.view_args.split('-');
+    args[0] = parseInt(args[0]);
+    //not a calendar?
+    if (isNaN(args[0])) return;
+
+    switch(args.length) {
+      case 1:
+        //year view
+        prev_date.setFullYear(args[0]-1,1,1);
+        view_args_prev = '' + (prev_date.getFullYear());
+        next_date.setFullYear(args[0]+1,1,1);
+        view_args_next = '' + (next_date.getFullYear()); 
+        break;
+      case 2:
+        if (args[1].charAt(0)=='W') {
+          //week view
+          //we cheat here
+          var href = $(view_scope + ' .calendar-calendar .date-prev a').attr('href').split('/');
+          view_args_prev = href[href.length-1];
+          href = $(view_scope + ' .calendar-calendar .date-next a').attr('href').split('/');
+          view_args_next = href[href.length-1];
+        }
+        else {
+          //month view
+          args[1] = parseInt(args[1],10);
+          prev_date.setFullYear(args[0],args[1]-2,1);
+          view_args_prev = '' + (prev_date.getFullYear()) + '-' + (prev_date.getMonth()+1);
+          next_date.setFullYear(args[0],args[1],1);
+          view_args_next = '' + (next_date.getFullYear()) + '-' + (next_date.getMonth()+1);
+        }
+        break;
+      case 3:
+        //day view
+        args[1] = parseInt(args[1],10);
+        args[2] = parseInt(args[2],10);
+        prev_date.setFullYear(args[0],args[1]-1,args[2]-1);
+        view_args_prev = '' + (prev_date.getFullYear()) + '-' + (prev_date.getMonth()+1) + '-' + (prev_date.getDate());
+        next_date.setFullYear(args[0],args[1]-1,args[2]+1);
+        view_args_next = '' + (next_date.getFullYear()) + '-' + (next_date.getMonth()+1) + '-' + (next_date.getDate());
+        break;
+      default:
+        //not calendar?
+        return;
+    }
+
+    //--- CHANGE THE NEXT/PREV LINKS -----------------------------
+
+    //--- attach ajax calls on the prev buttons -------------
+    $(view_scope + ' .calendar-calendar .date-prev a:not(.calendar-ajax-processed)').click( function() {
+      $(this).addClass('views-throbbing')
+      $.ajax({
+        url: ajax_path,
+        data: {
+          'js': 1,
+          'view_name': view_name,
+          'view_display_id': view_display_id,
+          'view_dom_id': view_dom_id,
+          'view_args': view_args_prev
+        },
+        dataType: 'json',
+        success: function (data, status, request) {
+          //--- some basic update -----------------
+          Drupal.settings.views.ajaxViews[i].view_args = view_args_prev;
+          Drupal.settings.views.ajaxViews[i].view_path = settings.view_base_path+'/'+view_args_prev;
+          //--- upload the new view ---------------
+          Drupal.Views.Ajax.ajaxViewResponse(view_scope,data);
+          $('a.views-throbbing').removeClass('views-throbbing');
+        },
+        error: function() { $(this).removeClass('views-throbbing');}
+      });
+      return false;
+    });
+    $(view_scope + ' .calendar-calendar .date-prev a').addClass('calendar-ajax-processed');
+
+    //--- attach ajax calls on the next buttons -------------
+    $(view_scope + ' .calendar-calendar .date-next a:not(.calendar-ajax-processed)').click( function() {
+      $(this).addClass('views-throbbing')
+      $.ajax({
+        url: ajax_path,
+        data: {
+          'js': 1,
+          'view_name': view_name,
+          'view_display_id': view_display_id,
+          'view_dom_id': view_dom_id,
+          'view_args': view_args_next
+        },
+        dataType: 'json',
+        success: function (data, status, request) {
+          //--- some basic update -----------------
+          Drupal.settings.views.ajaxViews[i].view_args = view_args_next;
+          Drupal.settings.views.ajaxViews[i].view_path = settings.view_base_path+'/'+view_args_next;
+          //--- upload the new view ---------------
+          Drupal.Views.Ajax.ajaxViewResponse(view_scope,data);
+          $('a.views-throbbing').removeClass('views-throbbing');
+        },
+        error: function() { $(this).removeClass('views-throbbing');}
+      });
+      return false;
+    });
+    $(view_scope + ' .calendar-calendar .date-next a').addClass('calendar-ajax-processed');
+
+  }
+}
diff --git theme/theme.inc theme/theme.inc
index 19e01a3..3860855 100644
--- theme/theme.inc
+++ theme/theme.inc
@@ -31,16 +31,16 @@ function template_preprocess_calendar_main(&$vars) {
   $calendar_links = array();
   $base = array('attributes' => array('rel' => 'nofollow'));
   if (!empty($displays['year'])) {
-    $calendar_links[] = $base + array('title' => date_t('Year', 'datetime'), 'href' => date_real_url($view, 'year'));
+    $calendar_links[] = $base + array('title' => date_t('Year', 'datetime'), 'href' => date_real_url($view, 'year',NULL,TRUE));
   }
   if (!empty($displays['month'])) {
-    $calendar_links[] = $base + array('title' => date_t('Month', 'datetime'), 'href' => date_real_url($view, 'month'));
+    $calendar_links[] = $base + array('title' => date_t('Month', 'datetime'), 'href' => date_real_url($view, 'month',NULL,TRUE));
   }
   if (!empty($displays['week'])) {
-    $calendar_links[] = $base + array('title' => date_t('Week', 'datetime'), 'href' => date_real_url($view, 'week'));
+    $calendar_links[] = $base + array('title' => date_t('Week', 'datetime'), 'href' => date_real_url($view, 'week',NULL,TRUE));
   }
   if (!empty($displays['day'])) {
-    $calendar_links[] = $base + array('title' => date_t('Day', 'datetime'), 'href' => date_real_url($view, 'day'));
+    $calendar_links[] = $base + array('title' => date_t('Day', 'datetime'), 'href' => date_real_url($view, 'day',NULL,TRUE));
   }
   $vars['calendar_links'] = $calendar_links;
     
@@ -152,6 +152,12 @@ function template_preprocess_calendar(&$vars) {
   $vars['view'] = $view;  
   $vars['mini'] = !empty($view->date_info->mini);
   $vars['block'] = !empty($view->date_info->block);
+
+  // AJAX calendars add calendar_ajax.js and views name
+  if ($view->style_plugin->view->use_ajax) {
+    drupal_add_js(drupal_get_path('module', 'calendar') .'/js/calendar_ajax.js');
+    drupal_add_js(array('calendar_ajax' => array( $view->style_plugin->view->name => 'ajax_calendar')), 'setting');
+  }
 }
 
 /**
@@ -249,7 +255,7 @@ function template_preprocess_calendar_year(&$vars) {
     $view->date_info->mini = TRUE;
     $view->date_info->hide_nav = TRUE;
     $view->date_info->show_title = TRUE;
-    $view->date_info->url = date_real_url($view, NULL, date_pad($year, 4) .'-'. date_pad($month));
+    $view->date_info->url = date_real_url($view, NULL, date_pad($year, 4) .'-'. date_pad($month),TRUE);
     $view->date_info->min_date = date_make_date($view->date_info->year .'-'. date_pad($month) .'-01 00:00:00', date_default_timezone_name());
     $view->date_info->max_date = drupal_clone($view->date_info->min_date);
     date_modify($view->date_info->max_date, '+1 month');
@@ -509,7 +515,8 @@ function template_preprocess_calendar_datebox(&$vars) {
   $view = $vars['view'];
   
   $vars['day'] = intval(substr($date, 8, 2));
-  $force_view_url = !empty($view->date_info->block) ? TRUE : FALSE;
+  //$force_view_url = !empty($view->date_info->block) ? TRUE : FALSE;
+  $force_view_url = TRUE;
   $vars['url'] = date_real_url($view, NULL, $date, $force_view_url);
   $vars['link'] = l($vars['day'], $vars['url']);
   $vars['granularity'] = $view->date_info->granularity;
