diff --git a/fullcalendar.info b/fullcalendar.info
index 7dfbc7e..16deec2 100644
--- a/fullcalendar.info
+++ b/fullcalendar.info
@@ -5,6 +5,7 @@ package = "Views"
 configure = admin/config/calendar/fullcalendar
 dependencies[] = views
 dependencies[] = date
+dependencies[] = date_views
 
 files[] = includes/views/handlers/fullcalendar_handler_area_empty.inc
 files[] = includes/views/handlers/fullcalendar_handler_field_date.inc
diff --git a/fullcalendar.module b/fullcalendar.module
index e10954f..8dcaad4 100644
--- a/fullcalendar.module
+++ b/fullcalendar.module
@@ -110,6 +110,13 @@ function fullcalendar_menu() {
     'access arguments' => array(4),
     'type' => MENU_CALLBACK,
   );
+  $items['fullcalendar/ajax/results'] = array(
+    'title' => 'Events',
+    'description' => 'Get events from views with arguments',
+    'page callback' => 'fullcalendar_results',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK,
+  );
 
   return $items;
 }
@@ -168,6 +175,12 @@ function fullcalendar_fullcalendar_classes($entity) {
 }
 
 function fullcalendar_get_settings($view) {
+
+  // Bail out if we're getting results from ajax callback.
+  if (isset($view->fullcalendar_ajax)) {
+    return;
+  }
+
   global $language;
 
   $options = $view->style_plugin->options;
@@ -211,6 +224,8 @@ function fullcalendar_get_settings($view) {
       'todayString' => t('Today'),
       'isRTL' => $language->direction,
       'gcal' => $options['gcal'],
+      'view_name' => $view->name,
+      'view_display' => $view->current_display,
     ),
   );
 
@@ -231,6 +246,22 @@ function fullcalendar_get_settings($view) {
     $settings[$dom_id]['day'] = $day;
   }
 
+  // Arguments always win. The annoying thing is that arguments with year
+  // and month can be glued together, so we need to test on the '-'.
+  if (!empty($view->args)) {
+    $settings[$dom_id]['separator'] = '';
+    if (strpos($view->args[0], '-') === FALSE) {
+      $year = substr($view->args[0], 0, 4);
+      $month = substr($view->args[0], 4, 2);
+    }
+    else {
+      $settings[$dom_id]['separator'] = '-';
+      list($year, $month) = explode('-', $view->args[0]);
+    }
+    $settings[$dom_id]['month'] = $month - 1;
+    $settings[$dom_id]['year'] = $year;
+  }
+
   drupal_add_library('fullcalendar', 'fullcalendar');
   drupal_add_js(array('fullcalendar' => $settings), 'setting');
   ctools_add_css('fullcalendar.theme', 'fullcalendar');
@@ -242,6 +273,54 @@ function fullcalendar_get_settings($view) {
 }
 
 /**
+ * Returns events for fullcalendar.
+ */
+function fullcalendar_results($view_name = NULL, $view_display = NULL, $args = NULL) {
+  $content = $status = NULL;
+
+  // Bail out if no view_name or view_display is passed.
+  if (empty($view_name) && empty($view_display)) {
+    return;
+  }
+
+  // Get the view and check access.
+  $view = views_get_view($view_name);
+  if ($view && $view->access($view_display)) {
+
+    // Add arguments.
+    if (!empty($args)) {
+      $view->set_arguments(array($args));
+    }
+
+    // Execute the display and render results
+    // if available into $content variable.
+    $view->execute($view_display);
+    if (!empty($view->result)) {
+      $status = TRUE;
+      $view->fullcalendar_ajax = TRUE;
+      $sets = $view->style_plugin->render_grouping($view->result, NULL);
+      foreach ($sets as $title => $records) {
+        foreach ($records as $index => $row) {
+          $view->row_index = $index;
+          $content .= '<div class="fullcalendar-event">' . $view->style_plugin->row_plugin->render($row) . '</div>';
+        }
+      }
+    }
+  }
+
+  drupal_add_http_header('Content-Type', 'text/javascript; charset=utf-8');
+  print drupal_json_encode(array(
+    'status' => $status,
+    'content' => $content,
+  ));
+
+  // Let's call drupal_page_footer(), so even page cache can work.
+  drupal_page_footer();
+
+  exit();
+}
+
+/**
  * Translates times to the right display times.
  *
  * This is done by passing times through date modules date_formatter_process
diff --git a/includes/views/fullcalendar.views_default.inc b/includes/views/fullcalendar.views_default.inc
index 997d7e7..05329d9 100644
--- a/includes/views/fullcalendar.views_default.inc
+++ b/includes/views/fullcalendar.views_default.inc
@@ -47,6 +47,16 @@ function fullcalendar_views_default_views() {
   $handler->display->display_options['filters']['status']['field'] = 'status';
   $handler->display->display_options['filters']['status']['value'] = '1';
 
+  /* Contextual filter: Content: Updated year + month */
+  $handler->display->display_options['arguments']['changed_year_month']['id'] = 'changed_year_month';
+  $handler->display->display_options['arguments']['changed_year_month']['table'] = 'node';
+  $handler->display->display_options['arguments']['changed_year_month']['field'] = 'changed_year_month';
+  $handler->display->display_options['arguments']['changed_year_month']['default_action'] = 'default';
+  $handler->display->display_options['arguments']['changed_year_month']['default_argument_skip_url'] = 0;
+  $handler->display->display_options['arguments']['changed_year_month']['summary']['number_of_records'] = '0';
+  $handler->display->display_options['arguments']['changed_year_month']['summary']['format'] = 'default_summary';
+  $handler->display->display_options['arguments']['changed_year_month']['summary_options']['items_per_page'] = '25';
+
   /* Display: FullCalendar */
   $handler = $view->new_display('page', 'Page', 'page_1');
   $handler->display->display_options['path'] = 'fullcalendar';
diff --git a/js/fullcalendar.views.js b/js/fullcalendar.views.js
index f412c54..b0bb504 100644
--- a/js/fullcalendar.views.js
+++ b/js/fullcalendar.views.js
@@ -5,45 +5,23 @@
  */
 
 (function ($) {
-
+  
+Drupal.fullCalendar = Drupal.fullCalendar || {};
+Drupal.fullCalendar.navigate = false;
+  
 Drupal.behaviors.fullCalendar = {
   attach: function(context) {
     // Process each view and its settings.
     $.each(Drupal.settings.fullcalendar, function(index, settings) {
-      // Hide the failover display.
-      $(index).find('.fullcalendar-content').hide();
 
-       // Add events from Drupal.
-       var eventSourcesArray = [
-         function(start, end, callback) {
-           var events = [];
-           $(index).find('.fullcalendar-event-details').each(function() {
-            events.push({
-              field: $(this).attr('field'),
-              index: $(this).attr('index'),
-              eid: $(this).attr('eid'),
-              entity_type: $(this).attr('entity_type'),
-              title: $(this).attr('title'),
-              start: $(this).attr('start'),
-              end: $(this).attr('end'),
-              url: $(this).attr('href'),
-              allDay: ($(this).attr('allDay') === '1'),
-              className: $(this).attr('cn'),
-              editable: $(this).attr('editable'),
-              dom_id: index
-            });
-          });
-          callback(events);
-        }
-      ];
-
-       // Add events from Google Calendar feeds.
-       $.each(settings.gcal, function(i, gcalEntry) {
-         eventSourcesArray.push($.fullCalendar.gcalFeed(gcalEntry[0], gcalEntry[1]));
-      });
+      // Create an object of this calendar.
+      var calendar = $(index);
+      
+      // Hide the failover display.
+      $('.fullcalendar-content', calendar).hide();
 
       // Use .once() to protect against extra AJAX calls from Colorbox.
-      $(index).find('.fullcalendar').once().fullCalendar({
+      $('.fullcalendar', calendar).once().fullCalendar({                
         defaultView: settings.defaultView,
         theme: settings.theme,
         header: {
@@ -79,7 +57,7 @@ Drupal.behaviors.fullCalendar = {
           return false;
         },
         year: (settings.year) ? settings.year : undefined,
-        month: (settings.month) ? settings.month - 1 : undefined,
+        month: (settings.month) ? settings.month : undefined,
         date: (settings.day) ? settings.day : undefined,
         timeFormat: {
           agenda: (settings.clock) ? 'HH:mm{ - HH:mm}' : settings.agenda,
@@ -99,7 +77,47 @@ Drupal.behaviors.fullCalendar = {
           week: settings.weekString,
           month: settings.monthString
         },
-        eventSources: eventSourcesArray,
+        events: function(start, end, callback) {
+
+          // Fetch new items from Views.
+          if (Drupal.fullCalendar.navigate) {
+
+            date = $('.fullcalendar', calendar).fullCalendar('getDate');
+            month = $.fullCalendar.formatDate(date, 'MM');
+            year = $.fullCalendar.formatDate(date, 'yyyy');
+            date_argument = year + settings.separator + month;
+            fetch_url = Drupal.settings.basePath + 'fullcalendar/ajax/results/' + settings.view_name + '/' + settings.view_display + '/' + date_argument;
+
+            $.ajax({
+              type: 'GET',
+              url: fetch_url,
+              dataType: 'json',
+              success: function (data) {
+                if (data.status) {
+                  // Replace content.
+                  $('.' + index + ' .fullcalendar-content').html(data.content);
+                  Drupal.fullCalendar.ParseEvents(index, calendar, callback);
+                }
+              },
+              error: function (xmlhttp) {
+                alert(Drupal.t('An HTTP error @status occurred.', {'@status': xmlhttp.status}));
+              }
+            });
+          }
+          else {
+            Drupal.fullCalendar.ParseEvents(index, calendar, callback);
+          }
+
+          // Add events from Google Calendar feeds.
+          // @todo completely untested might need to move to ParseEvents to.
+          $.each(settings.gcal, function(i, gcalEntry) {
+            this.gcalFeed(gcalEntry[0], gcalEntry[1]);
+          });
+
+          // Set navigate to true which means we'll start asking for
+          // results from the views with ajax.
+          Drupal.fullCalendar.navigate = true;
+        },
         eventDrop: function(event, dayDelta, minuteDelta, allDay, revertFunc) {
           $.post(Drupal.settings.basePath + 'fullcalendar/ajax/update/drop/'+ event.eid,
             'field=' + event.field + '&entity_type=' + event.entity_type + '&index=' + event.index + '&day_delta=' + dayDelta + '&minute_delta=' + minuteDelta + '&all_day=' + allDay + '&dom_id=' + event.dom_id,
@@ -136,4 +154,30 @@ Drupal.behaviors.fullCalendar = {
   }
 };
 
+/**
+ * Parse Drupal events from the DOM.
+ */
+Drupal.fullCalendar.ParseEvents = function(index, calendar, callback) {
+  var events = [];          
+  // Drupal events.
+  $('.fullcalendar-event-details', calendar).each(function() {
+    var event = $(this);
+    events.push({
+      field: event.attr('field'),
+      index: event.attr('index'),
+      eid: event.attr('eid'),
+      entity_type: event.attr('entity_type'),
+      title: event.attr('title'),
+      start: event.attr('start'),
+      end: event.attr('end'),
+      url: event.attr('href'),
+      allDay: (event.attr('allDay') === '1'),
+      className: event.attr('cn'),
+      editable: event.attr('editable'),
+      dom_id: index
+    });
+  });
+  callback(events);  
+};
+
 })(jQuery);
