diff --git a/mysql-test/r/trigger.result b/mysql-test/r/trigger.result
index 4a85097cfcea400b181a761d0059c13e7613d27d..cf0e0e8f56453d4600d63ac4b33bb2279157e417 100644
--- a/mysql-test/r/trigger.result
+++ b/mysql-test/r/trigger.result
@@ -1,5 +1,6 @@
 drop table if exists t1, t2;
 drop view if exists v1;
+drop database if exists mysqltest;
 create table t1 (i int);
 create trigger trg before insert on t1 for each row set @a:=1;
 set @a:=0;
@@ -190,3 +191,18 @@ select @del_before, @del_after;
 drop trigger t1.trg1;
 drop trigger t1.trg2;
 drop table t1;
+create table t1 (a int);
+create trigger trg1 before insert on t1 for each row set new.a= 10;
+drop table t1;
+create table t1 (a int);
+insert into t1 values ();
+select * from t1;
+a
+NULL
+drop table t1;
+create database mysqltest;
+use mysqltest;
+create table t1 (i int);
+create trigger trg1 before insert on t1 for each row set @a:= 1;
+drop database mysqltest;
+use test;
diff --git a/mysql-test/t/trigger.test b/mysql-test/t/trigger.test
index bf75f09d55333c5be1863b76f4e6727eb6736773..53144cf35919812b0cd62c2ec6a165fd44a38a7a 100644
--- a/mysql-test/t/trigger.test
+++ b/mysql-test/t/trigger.test
@@ -5,6 +5,7 @@
 --disable_warnings
 drop table if exists t1, t2;
 drop view if exists v1;
+drop database if exists mysqltest;
 --enable_warnings
 
 create table t1 (i int);
@@ -229,3 +230,22 @@ select @del_before, @del_after;
 drop trigger t1.trg1;
 drop trigger t1.trg2;
 drop table t1;
+
+# Test for bug #5859 "DROP TABLE does not drop triggers". Trigger should not
+# magically reappear when we recreate dropped table.
+create table t1 (a int);
+create trigger trg1 before insert on t1 for each row set new.a= 10;
+drop table t1;
+create table t1 (a int);
+insert into t1 values ();
+select * from t1;
+drop table t1;
+
+# Test for bug #6559 "DROP DATABASE forgets to drop triggers". 
+create database mysqltest;
+use mysqltest;
+create table t1 (i int);
+create trigger trg1 before insert on t1 for each row set @a:= 1;
+# This should succeed
+drop database mysqltest;
+use test;
diff --git a/sql/handler.cc b/sql/handler.cc
index 143e56fdc7cceaccdc0c7c6233b0be800579e399..330ea83566cb09307ae1a97344aea1d0da5c1894 100644
--- a/sql/handler.cc
+++ b/sql/handler.cc
@@ -2367,6 +2367,7 @@ TYPELIB *ha_known_exts(void)
 
     known_extensions_id= mysys_usage_id;
     found_exts.push_back((char*) ".db");
+    found_exts.push_back((char*) triggers_file_ext);
     for (types= sys_table_types; types->type; types++)
     {      
       if (*types->value == SHOW_OPTION_YES)
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 7e4c6675e45a7f7a563a42940c21e4343327cb42..2685da9780be118c76580cb8b15714c120274e1d 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -1044,6 +1044,7 @@ extern const char *first_keyword, *my_localhost, *delayed_user, *binary_keyword;
 extern const char **errmesg;			/* Error messages */
 extern const char *myisam_recover_options_str;
 extern const char *in_left_expr_name, *in_additional_cond;
+extern const char * const triggers_file_ext;
 extern Eq_creator eq_creator;
 extern Ne_creator ne_creator;
 extern Gt_creator gt_creator;
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index e2dcd71afb40adf76e4d9fd81b24a23687c07649..4105d63330a2191a3ddc00ecd9686d42033a4fe7 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -257,7 +257,19 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
 	/* Delete the table definition file */
 	strmov(end,reg_ext);
 	if (!(new_error=my_delete(path,MYF(MY_WME))))
+        {
 	  some_tables_deleted=1;
+          /*
+            Destroy triggers for this table if there are any.
+
+            We won't need this as soon as we will have new .FRM format,
+            in which we will store trigger definitions in the same .FRM
+            files as table descriptions.
+          */
+          strmov(end, triggers_file_ext);
+          if (!access(path, F_OK))
+            new_error= my_delete(path, MYF(MY_WME));
+        }
         error|= new_error;
       }
     }
diff --git a/sql/sql_trigger.cc b/sql/sql_trigger.cc
index 110841e8fd428d82b54f4b1c72434b4764d741e2..5b6f12eab52c7d2b15505480a2f46e7d3602d0d1 100644
--- a/sql/sql_trigger.cc
+++ b/sql/sql_trigger.cc
@@ -4,7 +4,8 @@
 #include "parse_file.h"
 
 static const LEX_STRING triggers_file_type= {(char *)"TRIGGERS", 8};
-static const char * const triggers_file_ext= ".TRG";
+
+const char * const triggers_file_ext= ".TRG";
 
 /*
   Table of .TRG file field descriptors.