diff --git a/mysql-test/suite/innodb/r/innodb_encryption_drop_temp_tables.result b/mysql-test/suite/innodb/r/innodb_encryption_drop_temp_tables.result
new file mode 100644
index 0000000..2052b19
--- /dev/null
+++ b/mysql-test/suite/innodb/r/innodb_encryption_drop_temp_tables.result
@@ -0,0 +1,12 @@
+SET GLOBAL innodb_encrypt_tables = on;
+SET GLOBAL innodb_file_format='Barracuda';
+SET GLOBAL innodb_file_per_table=1;
+CREATE TEMPORARY TABLE `t` (
+`a` INT NOT NULL,
+PRIMARY KEY (`a`)
+) ENGINE=InnoDB
+;
+call mtr.add_suppression('table .* does not exist in the InnoDB internal');
+SET DEBUG_DBUG='+d,crash_commit_before';
+INSERT INTO t VALUES (42);
+ERROR HY000: Lost connection to MySQL server during query
diff --git a/mysql-test/suite/innodb/t/innodb_encryption_drop_temp_tables.test b/mysql-test/suite/innodb/t/innodb_encryption_drop_temp_tables.test
new file mode 100644
index 0000000..e889a83
--- /dev/null
+++ b/mysql-test/suite/innodb/t/innodb_encryption_drop_temp_tables.test
@@ -0,0 +1,27 @@
+#
+#
+#
+--source include/have_innodb.inc
+--source include/have_debug.inc
+
+# embedded does not support restart
+--source include/not_embedded.inc
+
+SET GLOBAL innodb_encrypt_tables = on;
+SET GLOBAL innodb_file_format='Barracuda';
+SET GLOBAL innodb_file_per_table=1;
+
+CREATE TEMPORARY TABLE `t` (
+  `a` INT NOT NULL,
+  PRIMARY KEY (`a`)
+) ENGINE=InnoDB
+;
+
+call mtr.add_suppression('table .* does not exist in the InnoDB internal');
+SET DEBUG_DBUG='+d,crash_commit_before';
+--exec echo "restart" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect
+--error 2013
+INSERT INTO t VALUES (42);
+
+--enable_reconnect
+--source include/wait_until_connected_again.inc
diff --git a/storage/innobase/fil/fil0crypt.cc b/storage/innobase/fil/fil0crypt.cc
index 5420d61..25ef9e3 100644
--- a/storage/innobase/fil/fil0crypt.cc
+++ b/storage/innobase/fil/fil0crypt.cc
@@ -195,8 +195,6 @@ fil_crypt_get_key(byte *dst, uint dstlen,
 		crypt_data->keys[i] = crypt_data->keys[i - 1];
 	}
 
-	// TODO(jonaso): Integrate with real key server
-
 	// Get new key from key server
 	unsigned char keybuf[CRYPT_SCHEME_1_IV_LEN];
 	unsigned keylen = sizeof(keybuf);
@@ -277,27 +275,34 @@ fil_space_create_crypt_data()
 }
 
 /******************************************************************
-Compare two crypt objects */
+Merge fil_space_crypt_t object */
 UNIV_INTERN
-int
-fil_space_crypt_compare(const fil_space_crypt_t* crypt_data1,
-			const fil_space_crypt_t* crypt_data2)
+void
+fil_space_merge_crypt_data(fil_space_crypt_t* dst,
+			   const fil_space_crypt_t* src)
 {
-	ut_a(crypt_data1->type == CRYPT_SCHEME_UNENCRYPTED ||
-	     crypt_data1->type == CRYPT_SCHEME_1);
-	ut_a(crypt_data2->type == CRYPT_SCHEME_UNENCRYPTED ||
-	     crypt_data2->type == CRYPT_SCHEME_1);
+	mutex_enter(&dst->mutex);
+
+	/* validate that they are mergeable */
+	ut_a(src->type == CRYPT_SCHEME_UNENCRYPTED ||
+	     src->type == CRYPT_SCHEME_1);
+	ut_a(src->iv_length == CRYPT_SCHEME_1_IV_LEN);
 
-	ut_a(crypt_data1->iv_length == CRYPT_SCHEME_1_IV_LEN);
-	ut_a(crypt_data2->iv_length == CRYPT_SCHEME_1_IV_LEN);
+	ut_a(dst->type == CRYPT_SCHEME_UNENCRYPTED ||
+	     dst->type == CRYPT_SCHEME_1);
+	ut_a(dst->iv_length == CRYPT_SCHEME_1_IV_LEN);
 
 	/* no support for changing iv (yet?) */
-	ut_a(memcmp(crypt_data1->iv, crypt_data2->iv,
-		    crypt_data1->iv_length) == 0);
+	ut_a(memcmp(src->iv, dst->iv, src->iv_length) == 0);
 
-	return 0;
+	dst->type = src->type;
+	dst->min_key_version = src->min_key_version;
+	dst->keyserver_requests += src->keyserver_requests;
+
+	mutex_exit(&dst->mutex);
 }
 
+
 /******************************************************************
 Read crypt data from a page (0) */
 UNIV_INTERN
@@ -845,8 +850,6 @@ Check if a key needs rotation given a key_state */
 static bool
 fil_crypt_needs_rotation(uint key_version, const key_state_t *key_state)
 {
-	// TODO(jonaso): Add support for rotating encrypted => unencrypted
-
 	if (key_version == 0 && key_state->key_version != 0) {
 		/* this is rotation unencrypted => encrypted
 		* ignore rotate_key_age */
@@ -2022,16 +2025,23 @@ fil_crypt_set_rotation_iops(uint val)
 }
 
 /*********************************************************************
-Init threads for key rotation */
+Init crypt globals */
 UNIV_INTERN
 void
-fil_crypt_threads_init()
+fil_crypt_init()
 {
 	fil_crypt_event = os_event_create();
 	fil_crypt_threads_event = os_event_create();
 	mutex_create(srv_fil_crypt_threads_mutex_key,
 		     &fil_crypt_threads_mutex, SYNC_NO_ORDER_CHECK);
+}
 
+/*********************************************************************
+Init threads for key rotation */
+UNIV_INTERN
+void
+fil_crypt_threads_init()
+{
 	uint cnt = srv_n_fil_crypt_threads;
 	srv_n_fil_crypt_threads = 0;
 	fil_crypt_set_thread_cnt(cnt);
diff --git a/storage/innobase/fil/fil0fil.cc b/storage/innobase/fil/fil0fil.cc
index 8b99b01..04e122a 100644
--- a/storage/innobase/fil/fil0fil.cc
+++ b/storage/innobase/fil/fil0fil.cc
@@ -6791,7 +6791,7 @@ fil_space_set_crypt_data(
 	fil_space_crypt_t* crypt_data) /*!< in: crypt data */
 {
 	fil_space_t*	space;
-	fil_space_crypt_t* old_crypt_data = NULL;
+	fil_space_crypt_t* free_crypt_data = NULL;
 
 	ut_ad(fil_system);
 
@@ -6801,24 +6801,24 @@ fil_space_set_crypt_data(
 	if (space != NULL) {
 
 		if (space->crypt_data != NULL) {
-			ut_a(!fil_space_crypt_compare(crypt_data,
-						      space->crypt_data));
-			old_crypt_data = space->crypt_data;
+			fil_space_merge_crypt_data(space->crypt_data,
+						   crypt_data);
+			free_crypt_data = crypt_data;
+		} else {
+			space->crypt_data = crypt_data;
 		}
-
-		space->crypt_data = crypt_data;
 	} else {
 		/* there is a small risk that tablespace has been deleted */
-		old_crypt_data = crypt_data;
+		free_crypt_data = crypt_data;
 	}
 
 	mutex_exit(&fil_system->mutex);
 
-	if (old_crypt_data != NULL) {
-		/* first assign space->crypt_data
-		* then destroy old_crypt_data when no new references to
-		* it can be created.
+	if (free_crypt_data != NULL) {
+		/* there was already crypt data present and the new crypt
+		* data provided as argument to this function has been merged
+		* into that => free new crypt data
 		*/
-		fil_space_destroy_crypt_data(&old_crypt_data);
+		fil_space_destroy_crypt_data(&free_crypt_data);
 	}
 }
diff --git a/storage/innobase/include/fil0fil.h b/storage/innobase/include/fil0fil.h
index baaf49a..e54f773 100644
--- a/storage/innobase/include/fil0fil.h
+++ b/storage/innobase/include/fil0fil.h
@@ -1081,12 +1081,12 @@ fil_space_set_crypt_data(
 	fil_space_crypt_t* crypt_data); /*!< in: crypt data */
 
 /*********************************************************************
-Compare crypt data*/
-int
-fil_space_crypt_compare(
+Merge crypt data */
+void
+fil_space_merge_crypt_data(
 /*======================*/
-	const fil_space_crypt_t* crypt_data1,  /*!< in: crypt data */
-	const fil_space_crypt_t* crypt_data2); /*!< in: crypt data */
+	fil_space_crypt_t* dst_crypt_data,  /*!< in: crypt_data */
+	const fil_space_crypt_t* src_crypt_data); /*!< in: crypt data */
 
 /*********************************************************************
 Read crypt data from buffer page */
@@ -1187,6 +1187,11 @@ fil_space_verify_crypt_checksum(
 	ulint zip_size);      /*!< in: size of data to encrypt */
 
 /*********************************************************************
+Init global variables for encryption */
+void
+fil_crypt_init();
+
+/*********************************************************************
 Init threads for key rotation */
 void
 fil_crypt_threads_init();
diff --git a/storage/innobase/srv/srv0start.cc b/storage/innobase/srv/srv0start.cc
index e8596ca..39346ef 100644
--- a/storage/innobase/srv/srv0start.cc
+++ b/storage/innobase/srv/srv0start.cc
@@ -2288,6 +2288,10 @@ files_checked:
 		log_scrub_event = os_event_create();
 	}
 
+
+	/* Create global variables for encryption */
+	fil_crypt_init();
+
 	trx_sys_file_format_init();
 
 	trx_sys_create();
