diff --git a/includes/destinations.db.inc b/includes/destinations.db.inc
index 56e0bf0..1910165 100644
--- a/includes/destinations.db.inc
+++ b/includes/destinations.db.inc
@@ -99,16 +99,17 @@ class backup_migrate_destination_db extends backup_migrate_destination_remote {
    * Get the form for the backup settings for this destination.
    */
   function backup_settings_form($settings) {
-    $tables  = $this->get_table_names();
+    $objects  = $this->get_object_names();
     $form['#description'] = t("You may omit specific tables, or specific table data from the backup file. Only omit data that you know you will not need such as cache data, or tables from other applications. Excluding tables can break your Drupal install, so <strong>do not change these settings unless you know what you're doing</strong>.");
     $form['exclude_tables'] = array(
       "#type" => "select",
       "#multiple" => TRUE,
       "#title" => t("Exclude the following tables altogether"),
-      "#options" => $tables,
+      "#options" => $objects,
       "#default_value" => $settings['exclude_tables'],
       "#description" => t("The selected tables will not be added to the backup file."),
     );
+    $tables  = $this->get_table_names();
     $form['nodata_tables'] = array(
       "#type" => "select",
       "#multiple" => TRUE,
@@ -192,6 +193,21 @@ class backup_migrate_destination_db extends backup_migrate_destination_remote {
   }
 
   /**
+   * Get a list of objects in the database.
+   */
+  function get_object_names() {
+    // Switch to a different db if specified.
+    $this->switch_db();
+    // Must be overridden.
+    $out = $this->_get_table_names();
+    if (method_exists($this, '_get_view_names')) {
+      $out += $this->_get_view_names();
+    }
+    $this->switch_db(TRUE);
+    return $out;
+  }
+
+  /**
    * Get a list of tables in the database.
    */
   function get_table_names() {
diff --git a/includes/destinations.db.mysql.inc b/includes/destinations.db.mysql.inc
index d158bc8..5bc1d12 100644
--- a/includes/destinations.db.mysql.inc
+++ b/includes/destinations.db.mysql.inc
@@ -89,6 +89,7 @@ class backup_migrate_destination_db_mysql extends backup_migrate_destination_db
     if ($file->open(TRUE)) {
       $file->write($this->_get_sql_file_header());
       $alltables = $this->_get_tables();
+      $allviews = $this->_get_views();
       foreach ($alltables as $table) {
         if (_backup_migrate_check_timeout()) {
           return FALSE;
@@ -101,6 +102,14 @@ class backup_migrate_destination_db_mysql extends backup_migrate_destination_db
           }
         }
       }
+      foreach ($allviews as $view) {
+        if (_backup_migrate_check_timeout()) {
+          return FALSE;
+        }
+        if ($view['Name'] && !isset($exclude[$view['Name']])) {
+          $file->write($this->_get_view_create_sql($view));
+        }
+      }
       $file->write($this->_get_sql_file_footer());
       $file->close();
       return $lines;
@@ -151,6 +160,17 @@ class backup_migrate_destination_db_mysql extends backup_migrate_destination_db
   }
 
   /**
+   * Get a list of views in the database.
+   */
+  function _get_view_names() {
+    $out = array();
+    foreach ($this->_get_views() as $view) {
+      $out[$view['Name']] = $view['Name'];
+    }
+    return $out;
+  }
+
+  /**
    * Lock the list of given tables in the database.
    */
   function _lock_tables($tables) {
@@ -178,7 +198,24 @@ class backup_migrate_destination_db_mysql extends backup_migrate_destination_db
     // get auto_increment values and names of all tables
     $tables = db_query("show table status");
     while ($table = db_fetch_array($tables)) {
-      $out[$table['Name']] = $table;
+      if (!empty($table['Engine'])) {
+        $out[$table['Name']] = $table;
+      }
+    }
+    return $out;
+  }
+
+  /**
+   * Get a list of views in the db.
+   */
+  function _get_views() {
+    $out = array();
+    // get auto_increment values and names of all tables
+    $tables = db_query("show table status");
+    while ($table = db_fetch_array($tables)) {
+      if (empty($table['Engine'])) {
+        $out[$table['Name']] = $table;
+      }
     }
     return $out;
   }
@@ -201,6 +238,25 @@ class backup_migrate_destination_db_mysql extends backup_migrate_destination_db
   }
   
   /**
+   * Get the sql for the structure of the given table.
+   */
+  function _get_view_create_sql($view) {
+    $out = "";
+    // Switch SQL mode to get rid of "CREATE ALGORITHM..." what requires more permissions + troubles with the DEFINER user
+    $sql_mode = db_result(db_query("SELECT @@SESSION.sql_mode"));
+    db_query("SET sql_mode = 'ANSI'");
+    $result = db_query("SHOW CREATE VIEW `". $view['Name'] ."`");
+    db_query("SET SQL_mode = '%s'", $sql_mode);
+    if ($create = db_fetch_array($result)) {
+      $out .= "DROP VIEW IF EXISTS `". $view['Name'] ."`;\n";
+      $out .= "SET sql_mode = 'ANSI';\n";
+      $out .= strtr($create['Create View'], "\n", " ") . ";\n";
+      $out .= "SET sql_mode = '$sql_mode';\n";
+    }
+    return $out;
+  }
+
+  /**
    *  Get the sql to insert the data for a given table
    */
   function _dump_table_data_sql_to_file($file, $table) {
