diff --git a/fullcalendar.module b/fullcalendar.module
index ba83064..7e5dcd0 100644
--- a/fullcalendar.module
+++ b/fullcalendar.module
@@ -217,7 +217,7 @@ function fullcalendar_form_views_ui_edit_display_form_alter(&$form, &$form_state
 /**
  * Returns events for FullCalendar.
  */
-function fullcalendar_results($view_name = NULL, $view_display = NULL, $args = NULL) {
+function fullcalendar_results($view_name = NULL, $view_display = NULL, $args = NULL, $input = array()) {
   $content = NULL;
 
   // Bail out if no view_name or view_display is passed.
@@ -231,6 +231,11 @@ function fullcalendar_results($view_name = NULL, $view_display = NULL, $args = N
 
     $view->set_display($view_display);
 
+    if (!empty($input)) {
+      $view->exposed_input = drupal_json_decode($input);
+    }
+
+
     // Add arguments.
     if (!empty($args)) {
       $args = explode('|', $args);
@@ -239,7 +244,7 @@ function fullcalendar_results($view_name = NULL, $view_display = NULL, $args = N
 
     // Execute the display and render results
     // if available into $content variable.
-    $view->preview($view_display);
+    $view->preview($view_display, $view->exposed_input);
     if (!empty($view->result)) {
       $view->fullcalendar_ajax = TRUE;
       $content = theme('fullcalendar', array('view' => $view, 'rows' => $view->result, 'options' => $view->style_options));
diff --git a/includes/fullcalendar.fullcalendar.inc b/includes/fullcalendar.fullcalendar.inc
index c10bc7a..d4a64cf 100644
--- a/includes/fullcalendar.fullcalendar.inc
+++ b/includes/fullcalendar.fullcalendar.inc
@@ -733,6 +733,9 @@ function fullcalendar_check_arguments($view) {
     $position++;
   }
 
+  if (!empty($view->exposed_input)) {
+    $settings['input'] = drupal_json_encode(array_filter($view->exposed_input));
+  }
   if ($date_handler) {
     $date_range = explode('--', $date_handler->argument);
     $timestamp = strtotime($date_range[0] . " +1 month");
diff --git a/includes/views/fullcalendar.views.inc b/includes/views/fullcalendar.views.inc
index 047e49a..3f9ddaa 100644
--- a/includes/views/fullcalendar.views.inc
+++ b/includes/views/fullcalendar.views.inc
@@ -157,3 +157,11 @@ function fullcalendar_views_query_alter(&$view, &$query) {
     'type' => 'OR',
   );
 }
+
+function fullcalendar_views_ajax_data_alter(&$commands, &$view) {
+  if ($view->display_handler->get_option('style_plugin') != 'fullcalendar') {
+    return;
+  }
+
+  drupal_add_js(array('fullcalendar' => array('.view-dom-id-' . $view->dom_id => array('view_ajax' => TRUE))), 'setting');
+}
diff --git a/js/fullcalendar.fullcalendar.js b/js/fullcalendar.fullcalendar.js
index 9f67ce8..38af882 100644
--- a/js/fullcalendar.fullcalendar.js
+++ b/js/fullcalendar.fullcalendar.js
@@ -4,6 +4,12 @@ Drupal.behaviors.fullcalendar_fullcalendar = {
   attach: function(context, settings) {
     for (var dom_id in settings.fullcalendar) {
       if (settings.fullcalendar.hasOwnProperty(dom_id)) {
+        // Count how many times we go through this just to make sure we don't
+        // duplicate.
+        if (typeof settings.fullcalendar[dom_id].count === 'undefined') {
+          settings.fullcalendar[dom_id].count = 1;
+        }
+        settings.fullcalendar[dom_id].count++;
         Drupal.fullcalendar.registerOptions(
           'fullcalendar',
           Drupal.fullcalendar.processOptions(settings.fullcalendar[dom_id], dom_id),
@@ -45,15 +51,18 @@ Drupal.fullcalendar.processOptions = function(settings, dom_id) {
     events: function(start, end, callback) {
 
       // Fetch new items from Views if possible.
-      if (Drupal.fullcalendar.navigate && settings.ajax) {
+      if (Drupal.fullcalendar.navigate && settings.ajax && !settings.view_ajax) {
         var prev_date, next_date, date_argument, arguments, fetch_url;
-
         prev_date = $.fullCalendar.formatDate(start, 'yyyy-MM-dd');
         next_date = $.fullCalendar.formatDate(end, 'yyyy-MM-dd');
         date_argument = prev_date + '--' + next_date;
         arguments = settings.args.replace('fullcalendar_browse', date_argument);
         fetch_url = Drupal.settings.basePath + 'fullcalendar/ajax/results/' + settings.view_name + '/' + settings.view_display + '/' + arguments;
 
+        if (settings.input) {
+          fetch_url += '/' + settings.input;
+        }
+
         $.ajax({
           type: 'GET',
           url: fetch_url,
@@ -81,6 +90,14 @@ Drupal.fullcalendar.processOptions = function(settings, dom_id) {
         Drupal.fullcalendar.parseEvents(dom_id, calendar, callback);
       }
 
+      // If we are on our first loop and using ajax go to the view mode and date
+      if (settings.count == 1 && settings.ajax) {
+        $('.fullcalendar', calendar).fullCalendar('changeView', settings.previous_view);
+        $('.fullcalendar', calendar).fullCalendar('gotoDate', settings.previous_date.year, settings.previous_date.month, settings.previous_date.day);
+      }
+
+      settings.view_ajax = false;
+
       if (!Drupal.fullcalendar.navigate) {
         // Add events from Google Calendar feeds.
         for (var entry in settings.gcal) {
@@ -107,6 +124,20 @@ Drupal.fullcalendar.processOptions = function(settings, dom_id) {
         'field=' + event.field + '&entity_type=' + event.entity_type + '&index=' + event.index + '&day_delta=' + dayDelta + '&minute_delta=' + minuteDelta + '&dom_id=' + event.dom_id,
         Drupal.fullcalendar.update);
       return false;
+    },
+    viewDisplay: function(view) {
+      if (settings.count != 1) {
+        settings.count = 0;
+        current_date = $('.fullcalendar', calendar).fullCalendar('getDate');
+        if (typeof settings.previous_date === 'undefined') {
+          settings.previous_date = {};
+        }
+        settings.previous_date.year = parseInt($.fullCalendar.formatDate(current_date, 'yyyy'));
+        month = parseInt($.fullCalendar.formatDate(current_date, 'M'));
+        settings.previous_date.month = month - 1;
+        settings.previous_date.day = parseInt($.fullCalendar.formatDate(current_date, 'dd'));
+        settings.previous_view = view.name;
+      }
     }
   };
 
