diff --git a/datatables.install b/datatables.install
index eb21c41..57bd1c3 100644
--- a/datatables.install
+++ b/datatables.install
@@ -10,18 +10,31 @@
  */
 function datatables_requirements($phase) {
   $requirements = array();
-  $t = get_t();
 
-  $requirements['datatables']['title'] = 'DataTables';
-  if (file_exists(drupal_get_path('module', 'datatables') .'/dataTables/media/js/jquery.dataTables.js')) {
-    $requirements['datatables']['severity'] = REQUIREMENT_OK;
-  }
-  else {
-    // Required datatables library wasn't found. Abort installation.
-    $requirements['datatables']['value'] = $t('Not found');
-    // Provide a download link to the DataTables jQuery Plugin.
-    $requirements['datatables']['description'] = $t('The <a href="@datatables">DataTables</a> plugin is missing. <a href="@download">Download</a> and extract it to your <em>datatables</em> module directory. See <a href="@readme">README.txt</a> for more info.', array('@datatables' => 'http://plugins.jquery.com/project/DataTables', '@download' => 'http://plugins.jquery.com/files/dataTables-1.6.2.zip', '@readme' => url(drupal_get_path('module', 'datatables') . '/README.txt')));
-    $requirements['datatables']['severity'] = REQUIREMENT_ERROR;
+  if ($phase == 'runtime') {
+    $t = get_t();
+
+    $requirements['datatables']['title'] = 'DataTables';
+    if (file_exists(drupal_get_path('module', 'datatables') .'/dataTables/media/js/jquery.dataTables.js')) {
+      $requirements['datatables']['severity'] = REQUIREMENT_OK;
+    }
+    else {
+      // Required datatables library wasn't found. Abort installation.
+      $requirements['datatables']['value'] = $t('Not found');
+
+      // Provide a download link to the DataTables jQuery Plugin.
+      $description = 'The <a href="@datatables">DataTables</a> plugin is missing.';
+      $description .= ' <a href="@download">Download</a> and extract it to your';
+      $description .= ' <em>datatables</em> module directory. See';
+      $description .= ' <a href="@readme">README.txt</a> for more info.';
+      $options['@datatables'] = 'http://plugins.jquery.com/project/DataTables';
+      $options['@download'] = 'http://www.datatables.net/releases/DataTables-1.7.6.zip';
+      # $options['@download'] = 'http://plugins.jquery.com/files/dataTables-1.6.2.zip';
+      $options['@readme'] = url(drupal_get_path('module', 'datatables') . '/README.txt');
+      $description = $t($description, $options);
+      $requirements['datatables']['description'] = $description;
+      $requirements['datatables']['severity'] = REQUIREMENT_ERROR;
+    }
   }
 
   return $requirements;
diff --git a/datatables.module b/datatables.module
index 800a163..2591edf 100644
--- a/datatables.module
+++ b/datatables.module
@@ -10,8 +10,10 @@
  */
 function datatables_theme() {
   return array(
-    'datatable' => array(
-      'arguments' => array($header => NULL, $rows => NULL, $attributes => $caption),
+    'datatables' => array(
+      'arguments' => array(
+        'header' => NULL, 'rows' => NULL, 'attributes' => array()
+      ),
     ),
   );
 }
@@ -116,29 +118,53 @@ function datatables_views_api() {
  *   An HTML string representing the table.
  * @see theme_table
  */
-function theme_datatable($header, $rows, $attributes = array(), $caption = NULL) {
-  $datatable_options = $attributes['datatable_options'];
-  
+function theme_datatables($header, $rows, $attributes = array(), $caption = NULL) {
+  $options = array();
+  if (!empty($attributes['datatable_options'])) {
+    $options = $attributes['datatable_options'];
+  }
+
   // Column settings can either be set with the global options
   // or in each header definition.
-  if (!$datatable_options['aoColumns']) {
-    foreach ($header as $key => $cell) {
-      $datatable_options['aoColumns'][] = $cell['datatable_options'];
-      unset($header[$key]['datatable_options']);
+  if (empty($options['aoColumns'])) {
+    foreach (array_keys($header) as $i) {
+      if (!is_string($header[$i]) && isset($header[$i]['datatable_options'])) {
+        $options['aoColumns'][] = $header[$i]['datatable_options'];
+        unset($header[$i]['datatable_options']);
+      }
     }
   }
-  
+
   // Set unique id
-  if (!$attributes['id']) {
+  if (empty($attributes['id'])) {
     $attributes['id'] = _datatables_get_id();
   }
+  
+  // Path to the dataTables media directory
+  $base = drupal_get_path('module', 'datatables');
 
-  drupal_add_css(drupal_get_path('module', 'datatables') .'/dataTables/media/css/demo_table.css');
-  drupal_add_js(drupal_get_path('module', 'datatables') .'/dataTables/media/js/jquery.dataTables.js');
-  drupal_add_js(drupal_get_path('module', 'datatables') .'/js/datatables.js');
-  drupal_add_js(array('datatables' => array('#'. $attributes['id'] => $datatable_options)), 'setting');
+  drupal_add_css($base .'/dataTables/media/css/demo_table.css');
+  drupal_add_js($base .'/dataTables/media/js/jquery.dataTables.js');
+  drupal_add_js($base .'/js/datatables.js');
+
+  foreach (datatables_supported_plugins() as $plugin_name => $plugin_settings) {
+    if (!empty($attributes['datatable_options'][$plugin_name])) {
+      foreach ($plugin_settings as $plugin_type => $plugin_options) {
+        foreach ($plugin_options as $key => $plugin_options) {
+          $plugin_type === 'css' && drupal_add_css($plugin_options);
+          $plugin_type === 'js' && drupal_add_js($plugin_options);
+          $plugin_type === 'option' && ($options[$key] = $plugin_options);
+        }
+      }
+    }
+  }
+
+  drupal_add_js(array('datatables' => array('#'. $attributes['id'] => $options)), 'setting');
   unset($attributes['datatable_options']);
-  
+
+  // apply class datatables to the table.
+  $attributes['class'] = 'datatables';
+
   return theme('table', $header, $rows, $attributes, $caption);
 }
 
@@ -306,3 +332,55 @@ function _datatables_get_id() {
   return 'datatable-'. ++$datatable_id;
 }
 
+/**
+ * List supported datatables-plugins.
+ *
+ * @return array
+ */
+function datatables_supported_plugins() {
+  $module_path = drupal_get_path('module', 'datatables');
+  $base = $module_path . '/dataTables';
+
+  // TableTools plugin
+  $sSwfPath = base_path() . $base;
+  $sSwfPath = $sSwfPath . '/extras/TableTools/media/swf/copy_cvs_xls_pdf.swf';
+  $plugins['TableTools'] = array(
+    'css' => array($base . '/extras/TableTools/media/css/TableTools.css'),
+    'js'  => array(
+      $base . '/extras/TableTools/media/js/ZeroClipboard.js',
+      $base . '/extras/TableTools/media/js/TableTools.js',
+    ),
+    'option' => array(
+      'sDom' => 'T<"clear">lfrtip',
+      'oTableTools' => array('sSwfPath' => $sSwfPath),
+    ),
+  );
+
+  // Columns Reorder plugin
+  $plugins['ColReorder'] = array(
+    'css' => array($base . '/extras/ColReorder/media/css/ColReorder.css'),
+    'js' => array($base . '/extras/ColReorder/media/js/ColReorder.js'),
+    'option' => array('sDom' => 'Rlfrtip')
+  );
+
+  // Fixed Header plugin
+  // DataTables known issue: Poor, it's not yet support in scrolling mode
+  $plugins['FixedHeader'] = array(
+    'js' => array($base . '/extras/FixedHeader/js/FixedHeader.js'),
+  );
+
+  // Fixed Columns plugin
+  $plugins['FixedColumns'] = array(
+    'js' => array($base . '/extras/FixedColumns/media/js/FixedColumns.js'),
+    'option' => array('FixedColumns' => TRUE),
+  );
+
+  // ColVis plugin
+  $plugins['ColVis'] = array(
+    'css' => array($base . '/extras/ColVis/media/css/ColVis.css'),
+    'js' => array($base . '/extras/ColVis/media/js/ColVis.js'),
+    'option' => array('sDom' => 'C<"clear">lfrtip')
+  );
+
+  return $plugins;
+}
diff --git a/datatables_examples/datatables_examples.info b/datatables_examples/datatables_examples.info
new file mode 100644
index 0000000..494406d
--- /dev/null
+++ b/datatables_examples/datatables_examples.info
@@ -0,0 +1,6 @@
+name = Datatables Examples
+version = 6.x-0.1
+description = Examples for Datatables module
+dependencies[] = datatables
+dependencies[] = devel
+core = 6.x
\ No newline at end of file
diff --git a/datatables_examples/datatables_examples.module b/datatables_examples/datatables_examples.module
new file mode 100644
index 0000000..8f6502c
--- /dev/null
+++ b/datatables_examples/datatables_examples.module
@@ -0,0 +1,107 @@
+<?php
+
+/**
+ * @file
+ * Provide examples for datatables module.
+ */
+
+/**
+ * Implements hook_menu().
+ */
+function datatables_examples_menu() {
+  $items['datatables-examples'] = array(
+    'title' => 'Datatables Examples',
+    'page callback' => 'datatables_examples_index_callback',
+    'access arguments' => array('access content'),
+  );
+
+  return $items;
+}
+
+/**
+ * Page callback fro examples index.
+ */
+function datatables_examples_index_callback() {
+  # return datatables_examples_plugin_tabletools();
+  # return datatables_examples_plugin_colreorder();
+  # return datatables_examples_plugin_fixedheader();
+  # return datatables_examples_plugin_fixedcolumn();
+  return datatables_examples_plugin_colvis();
+}
+
+/**
+ * Example for plugin-tabletools uage.
+ * @return string
+ */
+function datatables_examples_plugin_tabletools() {
+  // Generate dummy table
+  list($header, $rows) = datatables_examples_dump_rows(4);
+
+  // Enable TableTools plugin
+  $attributes['datatable_options']['TableTools'] = TRUE;
+
+  return theme('datatables', $header, $rows, $attributes);
+}
+
+function datatables_examples_plugin_colreorder() {
+  // Generate dummy table
+  list($header, $rows) = datatables_examples_dump_rows(4);
+
+  // Enable TableTools plugin
+  $attributes['datatable_options']['ColReorder'] = TRUE;
+  $attributes['datatable_options']['FixedHeader'] = TRUE;
+
+  return theme('datatables', $header, $rows, $attributes);
+}
+
+function datatables_examples_plugin_fixedheader() {
+  // Generate dummy table
+  list($header, $rows) = datatables_examples_dump_rows(4, 100);
+
+  // Enable FixedHeader plugin
+  // Disable pagination so it's easier to see the fixed header is working
+  $attributes['datatable_options']['bPaginate'] = FALSE;
+  $attributes['datatable_options']['FixedHeader'] = TRUE;
+
+  return theme('datatables', $header, $rows, $attributes);
+}
+
+function datatables_examples_plugin_fixedcolumn() {
+  // Generate dummy table
+  list($header, $rows) = datatables_examples_dump_rows(10);
+
+  // Enable FixedColumn plugin
+  $attributes['datatable_options']['FixedColumns'] = TRUE;
+  $attributes['datatable_options']['sScrollX'] = '100%';
+  $attributes['datatable_options']['sScrollXInner'] = '150%';
+
+  return theme('datatables', $header, $rows, $attributes);
+}
+
+function datatables_examples_plugin_colvis() {
+  // Generate dummy table
+  list($header, $rows) = datatables_examples_dump_rows(4);
+
+  // Enable FixedColumn plugin
+  $attributes['datatable_options']['ColVis'] = TRUE;
+
+  return theme('datatables', $header, $rows, $attributes);
+}
+
+function datatables_examples_dump_rows($cols_numbers = 7, $rows_number = 20) {
+  // Need devel_create_greeking() function to generate dummu content
+  module_load_include('inc', 'devel', 'devel_generate');
+
+  for ($i = 0; $i < $cols_numbers; ++$i) {
+    $header[$i] = "Column {$i}";
+  }
+
+  // Generate random content for table rows.
+  for ($row = 0; $row < $rows_number; ++$row) {
+    for ($col = 0; $col < $cols_numbers; ++$col) {
+      $rows[$row][$col] =  devel_create_greeking(rand(1, 5));
+    }
+  }
+
+  return array($header, $rows);
+}
diff --git a/js/datatables.js b/js/datatables.js
index 1c2a44a..e12a8c9 100644
--- a/js/datatables.js
+++ b/js/datatables.js
@@ -1,3 +1,4 @@
+(function($){
 
 Drupal.behaviors.datatables = function (context) {
   $.each(Drupal.settings.datatables, function (selector) {
@@ -21,6 +22,11 @@ Drupal.behaviors.datatables = function (context) {
 
     var datatable = $(selector).dataTable(this);
 
+    // Support FixedColumns plugin
+    if (typeof this.FixedColumns != 'undefined') {
+      new FixedColumns( datatable );
+    }
+
     if (this.bExpandable) {
       var settings = datatable.fnSettings();
       // Add blank column header for show details column.
@@ -73,3 +79,5 @@ Drupal.theme.prototype.datatablesExpandableRow = function(datatable, row) {
   output += '</table>';
   return output;
 }
+
+})(jQuery);
