diff --git README.txt README.txt
index 89129ad..7b3b691 100644
--- README.txt
+++ README.txt
@@ -1,7 +1,7 @@
-This version of FullCalendar requires specific versions of the following:
-  The 6.x-2.x branch of jQuery Update (http://drupal.org/project/jquery_update)
-  Version 1.7 of jQuery UI (http://drupal.org/project/jquery_ui)
-Instructions for installing each can be found in their respective README.txt files
+This module requires the 3rd party library for FullCalendar located at
+http://arshaw.com/fullcalendar. Download and unzip this library into the
+sites/all/libraries/fullcalendar directory, or use the Libraries API module for
+site specific libraries.
 
 To use the fullcalendar module:
   1) Install Views, Date, Date API, and Date Timezone modules
@@ -13,4 +13,4 @@
 KNOWN ISSUES:
 When displaying a repeating date field, each event might show up multiple times
 on each repeat instance. To solve this problem, change the 'Distinct' setting
-to yes in the Views display settings. This is a not a bug in FullCalendar.
+to yes in the Views display settings. This is not a bug in FullCalendar.
diff --git fullcalendar.custom.css fullcalendar.custom.css
new file mode 0
index 0000000..c869821 0
--- /dev/null
+++ fullcalendar.custom.css
@@ -0,0 +1,38 @@
+/* $Id$ */
+
+/* Undo Drupal default theme link colors */
+.fc-content a:link,
+.fc-content a:visited {
+  color: #fff;
+  text-decoration: none;
+}
+
+/* Reset FullCalendar generic style */
+.fc-event,
+.fc-agenda .fc-event-time,
+.fc-event a {
+  border-style: none;
+  background-color: transparent;
+  color: inherit;
+}
+
+/* Set FullCalendar default style */
+.fc-event-default,
+.fc-agenda .fc-event-default .fc-event-time,
+.fc-event-default a {
+  border-color: #36c;
+  border-style: solid;
+  background-color: #36c;
+  color: #fff;
+}
+
+/* Styling for updated message */
+#fullcalendar-status {
+  background: #ecf8f4;
+  border: 1px solid #fff;
+  color: #687;
+  display: none;
+  margin: 0 0 10px 0;
+  padding: 15px;
+  text-align: center;
+}
diff --git fullcalendar.drush.inc fullcalendar.drush.inc
new file mode 0
index 0000000..8656813 0
--- /dev/null
+++ fullcalendar.drush.inc
@@ -0,0 +1,98 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Drush integration for FullCalendar.
+ */
+
+/**
+ * The FullCalendar plugin URI.
+ */
+include_once('fullcalendar.module');
+define('FULLCALENDAR_DOWNLOAD_URI', 'http://arshaw.com/fullcalendar/downloads/fullcalendar-' . FULLCALENDAR_MIN_PLUGIN_VERSION . '.zip');
+
+/**
+ * Implements hook_drush_command().
+ */
+function fullcalendar_drush_command() {
+  $items = array();
+
+  // the key in the $items array is the name of the command.
+  $items['fullcalendar-plugin'] = array(
+    'description' => dt("Downloads the FullCalendar plugin."),
+    'arguments' => array(
+      'path' => dt('Optional. A path where to install the FullCalendar plugin. If omitted Drush will use the default location.'),
+    ),
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_drush_help().
+ */
+function fullcalendar_drush_help($section) {
+  switch ($section) {
+    case 'drush:fullcalendar-plugin':
+      return dt("Downloads the FullCalendar plugin from arshaw.com, default location is sites/all/libraries.");
+  }
+}
+
+/**
+ * Commands to download the FullCalendar plugin.
+ */
+function drush_fullcalendar_plugin($path = 'sites/all/libraries') {
+  if (!drush_shell_exec('type unzip')) {
+    return drush_set_error(dt('Missing dependency: unzip. Install it before using this command.'));
+  }
+
+  // Create the path if it does not exist.
+  if (!is_dir($path)) {
+    drush_op('mkdir', $path);
+    drush_log(dt('Directory @path was created', array('@path' => $path)), 'notice');
+  }
+
+  // Set the directory to the download location.
+  $olddir = getcwd();
+  chdir($path);
+
+  $filename = basename(FULLCALENDAR_DOWNLOAD_URI);
+  $dirname = basename(FULLCALENDAR_DOWNLOAD_URI, '.zip');
+
+  // Remove any existing FullCalendar plugin directory
+  if (is_dir($dirname)) {
+    drush_log(dt('A existing FullCalendar plugin was overwritten at @path', array('@path' => $path)), 'notice');
+  }
+  // Remove any existing FullCalendar plugin zip archive
+  if (is_file($filename)) {
+    drush_op('unlink', $filename);
+  }
+
+  // Download the zip archive
+  if (!drush_shell_exec('wget '. FULLCALENDAR_DOWNLOAD_URI)) {
+    drush_shell_exec('curl -O '. FULLCALENDAR_DOWNLOAD_URI);
+  }
+
+  if (is_file($filename)) {
+    // Decompress the zip archive
+    drush_shell_exec('unzip -qq -o '. $filename);
+    // Remove the zip archive
+    drush_op('unlink', $filename);
+    if (is_dir('fullcalendar')) {
+      drush_shell_exec('rm -rf fullcalendar');
+    }
+    drush_shell_exec('mv ' . $dirname . '/fullcalendar fullcalendar');
+    drush_shell_exec('rm -rf ' . $dirname);
+  }
+
+  // Set working directory back to the previous working directory.
+  chdir($olddir);
+
+  if (is_dir($path .'/fullcalendar')) {
+    drush_log(dt('FullCalendar plugin has been downloaded to @path', array('@path' => $path)), 'success');
+  }
+  else {
+    drush_log(dt('Drush was unable to download the FullCalendar plugin to @path', array('@path' => $path)), 'error');
+  }
+}
diff --git fullcalendar.install fullcalendar.install
new file mode 0
index 0000000..5203ee1 0
--- /dev/null
+++ fullcalendar.install
@@ -0,0 +1,36 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Install, update and uninstall functions for the fullcalendar module.
+ */
+
+/**
+ * Implements of hook_requirements().
+ */
+function fullcalendar_requirements($phase) {
+  $requirements = array();
+
+  if ($phase == 'runtime') {
+    $status = _fullcalendar_status();
+
+    if (!$status) {
+      $requirements = array(
+        'title' => t('FullCalendar plugin'),
+        'value' => t('At least @a', array('@a' => FULLCALENDAR_MIN_PLUGIN_VERSION)),
+        'severity' => REQUIREMENT_ERROR,
+        'description' => t('You need to download the !fullcalendar and extract the entire contents of the archive into the %path folder of your server.', array('!fullcalendar' => l(t('FullCalendar plugin'), 'http://arshaw.com/fullcalendar/download'), '%path' => 'sites/all/libraries')),
+      );
+    }
+    else {
+      $requirements = array(
+        'title' => t('FullCalendar plugin'),
+        'severity' => REQUIREMENT_OK,
+        'value' => fullcalendar_get_version(),
+      );
+    }
+  }
+
+  return $requirements;
+}
diff --git fullcalendar.module fullcalendar.module
index 8339399..92ffa2c 100644
--- fullcalendar.module
+++ fullcalendar.module
@@ -7,6 +7,16 @@
  */
 
 /**
+ * The default path to the FullCalender plugin.
+ */
+define('FULLCALENDAR_PATH', 'sites/all/libraries/fullcalendar');
+
+/**
+ * The minimal version of the FullCalender plugin.
+ */
+define('FULLCALENDAR_MIN_PLUGIN_VERSION', '1.4.9');
+
+/**
  * Implements hook_views_api().
  */
 function fullcalendar_views_api() {
@@ -20,10 +30,9 @@
  * Implements hook_init().
  */
 function fullcalendar_init() {
-  $path = drupal_get_path('module', 'fullcalendar');
 
-  drupal_add_css($path . '/fullcalendar.css');
-  drupal_add_js($path . '/fullcalendar.js');
+  drupal_add_css(FULLCALENDAR_PATH . '/fullcalendar.css');
+  drupal_add_js(FULLCALENDAR_PATH . '/fullcalendar.js');
 
   drupal_add_library('system', 'ui.draggable');
   drupal_add_library('system', 'ui.droppable');
@@ -48,7 +57,8 @@
 /**
  * Implements hook_menu().
  *
- * @return An array of menu items.
+ * @return 
+ *   An array of menu items.
  */
 function fullcalendar_menu() {
   $items = array();
@@ -67,11 +77,12 @@
 }
 
 /**
- * Save the updated fullcalendar event's datetime.
+ * Saves the updated fullcalendar event's datetime.
  *
- * @param string $action
+ * @param $action
  *   Value can be 'drop' or 'resize'.
- * @param object $node
+ * @param $node
+ *   ...
  */
 function fullcalendar_update($action, $node) {
   // Retrieve the post vars form the ajax call.
@@ -127,7 +138,7 @@
 }
 
 /**
- * Construct CSS classes for a node.
+ * Constructs CSS classes for a node.
  *
  * @param $node
  *   An object representing the node.
@@ -145,7 +156,7 @@
 }
 
 /**
- * Pass settings to JavaScript.
+ * Passes settings to JavaScript.
  */
 function template_preprocess_views_view_fullcalendar(&$vars) {
   $settings = array(
@@ -167,7 +178,12 @@
   drupal_add_js(drupal_get_path('module', 'fullcalendar') . '/fullcalendar.views.js');
 }
 
-//Prepare variables for template file invoked for node row type
+/*
+ * Prepares variables for template file invoked for node row type
+ *
+ * @param &$vars
+ *   ...
+ */
 function template_preprocess_views_view_node_fullcalendar(&$vars) {
   $entity_type = 'node';
   if (isset($vars['view']->empty_text)) {
@@ -233,13 +249,26 @@
 }
 
 /**
- * Pass times through date modules date_formatter_process function to
- * translate them to the right display times.
+ * Translates times to the right display times
+ *
+ * This is done by passing times through date modules date_formatter_process
+ * function.
+ *
+ * @param $entity_type
+ *   ...
+ * @param $entity
+ *   ...
+ * @param $field_name
+ *   ...
+ * @param $instance
+ *   ...
+ * @param $field
+ *   ...
+ * @param $item
+ *   ...
  *
- * @param object $node
- * @param string $field_name
- * @param integer $index
- * @param array $vars
+ * @return
+ *   ...
  */
 function _fullcalendar_set_display_times($entity_type, $entity, $field_name, $instance = NULL, $field = NULL, $item = NULL) {
   if (is_array($entity->$field_name)) {
@@ -251,6 +280,7 @@
     $date1 = new DateObject($entity->$field_name, date_default_timezone(), DATE_FORMAT_UNIX);
     $date2 = $date1;
   }
+
   return array(
     'field' => $field_name,
     'allDay' => date_field_all_day($field, $instance, $date1, $date2),
@@ -264,6 +294,9 @@
   );
 }
 
+/**
+ * 
+ */
 function theme_fullcalendar_link($variables) {
   $node = $variables['node'];
   $attributes = $variables['attributes'];
@@ -281,10 +314,12 @@
 }
 
 /**
- * Check if the user has access to update the given fullcalendar event.
+ * Checks if the user has access to update the given fullcalendar event.
+ *
+ * @param $node
+ *   ...
  *
- * @param object $node
- * @return bool
+ * @return
  */
 function _fullcalendar_update_access($node) {
   global $user;
@@ -300,11 +335,18 @@
 }
 
 /**
- * Find all date fields in this instance.
+ * Finds all date fields in this instance.
  *
  * Field type is not in the $field array we get from
  * field_info_instances(), we need to call
  * field_info_field() to find that.
+ *
+ * @param $entity
+ *   ...
+ * @param $entity_type
+ *   ...
+ *
+ * @return
  */
 function fullcalendar_date_fields($entity, $entity_type = 'node') {
   $bundle = '';
@@ -322,3 +364,55 @@
   }
   return $fields;
 }
+
+
+/**
+ * Checks the status of the FullCalendar plugin.
+ *
+ * @return
+ *   array with TRUE/FALSE for each dependency.
+ *
+ * @see fullcalendar_requirements()
+ */
+function _fullcalendar_status() {
+  $status = FALSE;
+
+  if (version_compare(fullcalendar_get_version(), FULLCALENDAR_MIN_PLUGIN_VERSION, '>=')) {
+    $status = TRUE;
+  }
+
+  return $status;
+}
+
+/**
+ * Returns the version of FullCalendar plugin that is installed.
+ *
+ * This can be used by other modules' hook_requirements() to ensure that the
+ * proper version of fullcalendar plugin is installed.
+ *
+ * @see version_compare
+ */
+function fullcalendar_get_version($fullcalendar_path = NULL) {
+  $version = 0;
+  $pattern = '#FullCalendar v([0-9\.a-z]+)#';
+
+  // No file is passed in so use the default location.
+  if (is_null($fullcalendar_path)) {
+    $fullcalendar_path = fullcalendar_get_js_path();
+  }
+
+  // Return the version of FullCalendar plugin.
+  $fullcalendar_plugin = file_get_contents($fullcalendar_path, NULL, NULL, 0, 40);
+  if (preg_match($pattern, $fullcalendar_plugin, $matches)) {
+    $version = $matches[1];
+  }
+
+  return $version;
+}
+
+/**
+ * Returns the path to the js file of the FullCalendar plugin.
+ */
+function fullcalendar_get_js_path() {
+  return FULLCALENDAR_PATH . '/fullcalendar.js';
+}
