diff --git a/cmake/plugin.cmake b/cmake/plugin.cmake
index 2978fb1a13c3806af74e8350933c8dfb419c31d7..f016d8eab4fca923355af06adc48a3a75027f752 100644
--- a/cmake/plugin.cmake
+++ b/cmake/plugin.cmake
@@ -171,12 +171,12 @@ MACRO(MYSQL_ADD_PLUGIN)
 
     IF(ARG_MANDATORY)
       SET (mysql_mandatory_plugins  
-        "${mysql_mandatory_plugins} builtin_maria_${target}_plugin," 
-      PARENT_SCOPE)
+        "${mysql_mandatory_plugins} builtin_maria_${target}_plugin,")
+      SET (mysql_mandatory_plugins ${mysql_mandatory_plugins} PARENT_SCOPE)
     ELSE()
       SET (mysql_optional_plugins  
-        "${mysql_optional_plugins} builtin_maria_${target}_plugin,"
-      PARENT_SCOPE)
+        "${mysql_optional_plugins} builtin_maria_${target}_plugin,")
+      SET (mysql_optional_plugins ${mysql_optional_plugins} PARENT_SCOPE)
     ENDIF()
   ELSEIF(NOT WITHOUT_${plugin} AND NOT ARG_STATIC_ONLY  AND NOT WITHOUT_DYNAMIC_PLUGINS)
   
diff --git a/mysql-test/include/have_semisync.inc b/mysql-test/include/have_semisync.inc
new file mode 100644
index 0000000000000000000000000000000000000000..243fad83717922ddec274149fa4d8875d5c902f1
--- /dev/null
+++ b/mysql-test/include/have_semisync.inc
@@ -0,0 +1,4 @@
+if (`select count(*) < 2 from information_schema.plugins where plugin_name like 'rpl_semi_sync_%'`)
+{
+  --skip Test requires semisync plugins
+}
diff --git a/mysql-test/include/have_semisync.opt b/mysql-test/include/have_semisync.opt
new file mode 100644
index 0000000000000000000000000000000000000000..2888844cdcd257182e97c303b83a305885efde41
--- /dev/null
+++ b/mysql-test/include/have_semisync.opt
@@ -0,0 +1,4 @@
+--plugin-load=$SEMISYNC_MASTER_SO
+--plugin-load=$SEMISYNC_SLAVE_SO
+--loose-rpl-semi-sync-master
+--loose-rpl-semi-sync-slave
diff --git a/mysql-test/include/have_semisync_plugin.inc b/mysql-test/include/have_semisync_plugin.inc
deleted file mode 100644
index 8a1679de63675a867050556ec073a0be3b614f1f..0000000000000000000000000000000000000000
--- a/mysql-test/include/have_semisync_plugin.inc
+++ /dev/null
@@ -1,15 +0,0 @@
-#
-# Check if server has support for loading plugins
-#
-if (`SELECT @@have_dynamic_loading != 'YES'`) {
-  --skip Requires dynamic loading
-}
-
-#
-# Check if the variable SEMISYNC_MASTER_SO is set
-#
-if (!$SEMISYNC_MASTER_SO)
-{
-  skip Need semisync plugins;
-}
-
diff --git a/mysql-test/suite/rpl/r/rpl_mdev359.result b/mysql-test/suite/rpl/r/rpl_mdev359.result
index f4382f672e44f9edc2379a9a41d02a0359109f98..c0c7bac1175b75109dfb360738ef0ff869284a01 100644
--- a/mysql-test/suite/rpl/r/rpl_mdev359.result
+++ b/mysql-test/suite/rpl/r/rpl_mdev359.result
@@ -1,7 +1,6 @@
 include/master-slave.inc
 [connection master]
 CREATE TABLE t1 (a INT) ENGINE=MyISAM;
-INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master';
 SET GLOBAL rpl_semi_sync_master_enabled = ON;
 SET DEBUG_SYNC = "rpl_semisync_master_commit_trx_before_lock SIGNAL m1_ready WAIT_FOR m1_cont";
 INSERT INTO t1 SELECT * FROM t1;
@@ -9,5 +8,4 @@ SET DEBUG_SYNC= "now WAIT_FOR m1_ready";
 SET GLOBAL rpl_semi_sync_master_enabled = OFF;
 SET DEBUG_SYNC= "now SIGNAL m1_cont";
 DROP TABLE t1;
-UNINSTALL PLUGIN rpl_semi_sync_master;
 include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_semi_sync.result b/mysql-test/suite/rpl/r/rpl_semi_sync.result
index 51859b5b49b00e5ba234096e4702934a17bfc70f..06eb56a40c5a7aee4be66053d3acb9d340ff4c73 100644
--- a/mysql-test/suite/rpl/r/rpl_semi_sync.result
+++ b/mysql-test/suite/rpl/r/rpl_semi_sync.result
@@ -1,13 +1,26 @@
 include/master-slave.inc
 [connection master]
+call mtr.add_suppression("Timeout waiting for reply of binlog");
+call mtr.add_suppression("Read semi-sync reply");
+call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.");
+call mtr.add_suppression("Master server does not support semi-sync");
+call mtr.add_suppression("Semi-sync slave .* reply");
+call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group");
 #
 # Uninstall semi-sync plugins on master and slave
 #
 include/stop_slave.inc
+reset slave;
+set global rpl_semi_sync_master_enabled= 0;
+set global rpl_semi_sync_slave_enabled= 0;
+reset master;
+set global rpl_semi_sync_master_enabled= 0;
+set global rpl_semi_sync_slave_enabled= 0;
 #
 # Main test of semi-sync replication start here
 #
 [ on master ]
+set global rpl_semi_sync_master_timeout= 60000;
 [ default state of semi-sync on master should be OFF ]
 show variables like 'rpl_semi_sync_master_enabled';
 Variable_name	Value
@@ -41,9 +54,7 @@ Rpl_semi_sync_master_status	OFF
 show status like 'Rpl_semi_sync_master_yes_tx';
 Variable_name	Value
 Rpl_semi_sync_master_yes_tx	0
-#
-# INSTALL PLUGIN semi-sync on slave
-#
+reset master;
 [ on slave ]
 [ default state of semi-sync on slave should be OFF ]
 show variables like 'rpl_semi_sync_slave_enabled';
@@ -84,6 +95,16 @@ select CONNECTIONS_NORMAL_SLAVE - CONNECTIONS_NORMAL_SLAVE as 'Should be 0';
 Should be 0
 0
 [ insert records to table ]
+insert t1 values (10);
+insert t1 values (9);
+insert t1 values (8);
+insert t1 values (7);
+insert t1 values (6);
+insert t1 values (5);
+insert t1 values (4);
+insert t1 values (3);
+insert t1 values (2);
+insert t1 values (1);
 [ master status after inserts ]
 show status like 'Rpl_semi_sync_master_status';
 Variable_name	Value
@@ -159,6 +180,16 @@ Rpl_semi_sync_master_no_tx	1
 show status like 'Rpl_semi_sync_master_yes_tx';
 Variable_name	Value
 Rpl_semi_sync_master_yes_tx	14
+delete from t1 where a=10;
+delete from t1 where a=9;
+delete from t1 where a=8;
+delete from t1 where a=7;
+delete from t1 where a=6;
+delete from t1 where a=5;
+delete from t1 where a=4;
+delete from t1 where a=3;
+delete from t1 where a=2;
+delete from t1 where a=1;
 insert into t1 values (100);
 [ master status should be OFF ]
 show status like 'Rpl_semi_sync_master_status';
@@ -278,6 +309,7 @@ Rpl_semi_sync_master_yes_tx	0
 [ on slave ]
 include/stop_slave.inc
 reset slave;
+kill query _tid;
 include/start_slave.inc
 [ on master ]
 create table t1 (a int) engine = ENGINE_TYPE;
@@ -307,6 +339,7 @@ include/stop_slave.inc
 reset slave;
 [ on master ]
 reset master;
+kill query _tid;
 set sql_log_bin=0;
 grant replication slave on *.* to rpl@127.0.0.1 identified by 'rpl_password';
 flush privileges;
@@ -357,6 +390,7 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
 Variable_name	Value
 Rpl_semi_sync_slave_status	OFF
 [ on master ]
+kill query _tid;
 [ Semi-sync status on master should be ON ]
 show status like 'Rpl_semi_sync_master_clients';
 Variable_name	Value
@@ -385,11 +419,7 @@ Variable_name	Value
 Rpl_semi_sync_slave_status	ON
 include/stop_slave.inc
 [ on master ]
-set sql_log_bin=0;
-UNINSTALL PLUGIN rpl_semi_sync_master;
-set sql_log_bin=1;
-SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled';
-Variable_name	Value
+set global rpl_semi_sync_master_enabled= 0;
 [ on slave ]
 SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
 Variable_name	Value
@@ -397,18 +427,10 @@ rpl_semi_sync_slave_enabled	ON
 include/start_slave.inc
 [ on master ]
 insert into t1 values (10);
-[ on slave ]
-SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
-Variable_name	Value
-Rpl_semi_sync_slave_status	OFF
 #
 # Test non-semi-sync slave connect to semi-sync master
 #
-set sql_log_bin=0;
-INSTALL PLUGIN rpl_semi_sync_master SONAME 'SEMISYNC_MASTER_SO';
 set global rpl_semi_sync_master_timeout= 5000;
-/* 5s */
-set sql_log_bin=1;
 set global rpl_semi_sync_master_enabled= 1;
 [ on slave ]
 include/stop_slave.inc
@@ -416,16 +438,8 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
 Variable_name	Value
 Rpl_semi_sync_slave_status	OFF
 [ uninstall semi-sync slave plugin ]
-UNINSTALL PLUGIN rpl_semi_sync_slave;
-SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
-Variable_name	Value
-include/start_slave.inc
-SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
-Variable_name	Value
-include/stop_slave.inc
-[ reinstall semi-sync slave plugin and disable semi-sync ]
-INSTALL PLUGIN rpl_semi_sync_slave SONAME 'SEMISYNC_SLAVE_SO';
 set global rpl_semi_sync_slave_enabled= 0;
+[ reinstall semi-sync slave plugin and disable semi-sync ]
 SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
 Variable_name	Value
 rpl_semi_sync_slave_enabled	OFF
@@ -440,11 +454,12 @@ Rpl_semi_sync_slave_status	OFF
 # Clean up
 #
 include/stop_slave.inc
-UNINSTALL PLUGIN rpl_semi_sync_slave;
-UNINSTALL PLUGIN rpl_semi_sync_master;
+set global rpl_semi_sync_slave_enabled= 0;
+set global rpl_semi_sync_master_enabled= 0;
 change master to master_user='root',master_password='';
 include/start_slave.inc
 drop table t1;
 drop user rpl@127.0.0.1;
 flush privileges;
+set global rpl_semi_sync_master_timeout= default;
 include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/r/rpl_semi_sync_event.result b/mysql-test/suite/rpl/r/rpl_semi_sync_event.result
index 1c6d73fe681d7b9b8c40f48bdfa1313aff6ccc26..456c0c4475af7d34f9173180ae0f39254f5b4f95 100644
--- a/mysql-test/suite/rpl/r/rpl_semi_sync_event.result
+++ b/mysql-test/suite/rpl/r/rpl_semi_sync_event.result
@@ -1,6 +1,15 @@
 include/master-slave.inc
 [connection master]
+call mtr.add_suppression("Timeout waiting for reply of binlog");
+call mtr.add_suppression("Semi-sync master .* waiting for slave reply");
+call mtr.add_suppression("Read semi-sync reply");
+call mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT.");
+call mtr.add_suppression("Master server does not support semi-sync");
+call mtr.add_suppression("Semi-sync slave .* reply");
+call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group");
+set global rpl_semi_sync_master_enabled = 1;
 include/stop_slave.inc
+set global rpl_semi_sync_slave_enabled = 1;
 include/start_slave.inc
 SET GLOBAL event_scheduler = ON;
 CREATE TABLE t1 (i INT NOT NULL AUTO_INCREMENT PRIMARY KEY, f varchar(8)) ENGINE=ENGINE_TYPE;
@@ -34,8 +43,8 @@ UPDATE t1 SET f = CONCAT('up_',CONNECTION_ID()) WHERE i = 2;
 UPDATE t1 SET f = CONCAT('up_',CONNECTION_ID()) WHERE i = 1;
 SET GLOBAL event_scheduler = OFF;
 include/stop_slave.inc
-UNINSTALL PLUGIN rpl_semi_sync_slave;
-UNINSTALL PLUGIN rpl_semi_sync_master;
+set global rpl_semi_sync_slave_enabled = 0;
+set global rpl_semi_sync_master_enabled = 0;
 include/start_slave.inc
 DROP EVENT ev1;
 DROP EVENT ev2;
diff --git a/mysql-test/suite/rpl/r/semisync_memleak_4066.result b/mysql-test/suite/rpl/r/semisync_memleak_4066.result
index c0dd9f0c99348cf7a376fd120b2e7df0bbed6805..c599f1426d3e223473eb53d01771dbc4094e1057 100644
--- a/mysql-test/suite/rpl/r/semisync_memleak_4066.result
+++ b/mysql-test/suite/rpl/r/semisync_memleak_4066.result
@@ -1,6 +1,4 @@
 include/master-slave.inc
 [connection master]
-INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
 CREATE TEMPORARY TABLE tmp (i INT);
 include/rpl_end.inc
-uninstall plugin rpl_semi_sync_master;
diff --git a/mysql-test/suite/rpl/t/rpl_mdev359.test b/mysql-test/suite/rpl/t/rpl_mdev359.test
index ef4e41f5291f4a53aaced5bca414482933927bba..96c7ac859d98dbf8d4a67b165627ef04df4fa89e 100644
--- a/mysql-test/suite/rpl/t/rpl_mdev359.test
+++ b/mysql-test/suite/rpl/t/rpl_mdev359.test
@@ -1,4 +1,4 @@
---source include/have_semisync_plugin.inc
+--source include/have_semisync.inc
 --source include/not_embedded.inc
 --source include/have_debug_sync.inc
 --source include/have_binlog_format_mixed_or_statement.inc
@@ -13,7 +13,6 @@
 # the code, disable the semisync, and then continue the paused thread.
 
 CREATE TABLE t1 (a INT) ENGINE=MyISAM;
-INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master';
 SET GLOBAL rpl_semi_sync_master_enabled = ON;
 --connection master1
 SET DEBUG_SYNC = "rpl_semisync_master_commit_trx_before_lock SIGNAL m1_ready WAIT_FOR m1_cont";
@@ -29,8 +28,4 @@ SET DEBUG_SYNC= "now SIGNAL m1_cont";
 connection master;
 DROP TABLE t1;
 
-disable_warnings;
-UNINSTALL PLUGIN rpl_semi_sync_master;
-enable_warnings;
-
 --source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_semi_sync.test b/mysql-test/suite/rpl/t/rpl_semi_sync.test
index ac5511e28a3a28078b5bc1cc9963740d87aa44f0..aa36d70d4b7e27ce92ba0189b51b01daee12a7b0 100644
--- a/mysql-test/suite/rpl/t/rpl_semi_sync.test
+++ b/mysql-test/suite/rpl/t/rpl_semi_sync.test
@@ -1,4 +1,4 @@
-source include/have_semisync_plugin.inc;
+source include/have_semisync.inc;
 source include/not_embedded.inc;
 source include/have_innodb.inc;
 source include/master-slave.inc;
@@ -7,7 +7,6 @@ let $engine_type= InnoDB;
 #let $engine_type= MyISAM;
 
 # Suppress warnings that might be generated during the test
-disable_query_log;
 connection master;
 call mtr.add_suppression("Timeout waiting for reply of binlog");
 call mtr.add_suppression("Read semi-sync reply");
@@ -16,7 +15,6 @@ connection slave;
 call mtr.add_suppression("Master server does not support semi-sync");
 call mtr.add_suppression("Semi-sync slave .* reply");
 call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group");
-enable_query_log;
 connection master;
 
 # wait for dying connections (if any) to disappear
@@ -32,27 +30,15 @@ let $_connections_normal_slave= query_get_value(SHOW STATUS LIKE 'Threads_connec
 --echo # Uninstall semi-sync plugins on master and slave
 --echo #
 connection slave;
-disable_query_log;
 source include/stop_slave.inc;
 reset slave;
-disable_warnings;
-error 0,1305;
-UNINSTALL PLUGIN rpl_semi_sync_slave;
-error 0,1305;
-UNINSTALL PLUGIN rpl_semi_sync_master;
-enable_warnings;
+set global rpl_semi_sync_master_enabled= 0;
+set global rpl_semi_sync_slave_enabled= 0;
 
 connection master;
 reset master;
-set sql_log_bin=0;
-disable_warnings;
-error 0,1305;
-UNINSTALL PLUGIN rpl_semi_sync_slave;
-error 0,1305;
-UNINSTALL PLUGIN rpl_semi_sync_master;
-enable_warnings;
-set sql_log_bin=1;
-enable_query_log;
+set global rpl_semi_sync_master_enabled= 0;
+set global rpl_semi_sync_slave_enabled= 0;
 
 --echo #
 --echo # Main test of semi-sync replication start here
@@ -61,16 +47,7 @@ enable_query_log;
 connection master;
 echo [ on master ];
 
-disable_query_log;
-let $value = query_get_value(show variables like 'rpl_semi_sync_master_enabled', Value, 1);
-if ($value == No such row)
-{
-    set sql_log_bin=0;
-    eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_SO';
-    set global rpl_semi_sync_master_timeout= 60000; /* 60s */
-    set sql_log_bin=1;
-}
-enable_query_log;
+set global rpl_semi_sync_master_timeout= 60000; # 60s
 
 echo [ default state of semi-sync on master should be OFF ];
 show variables like 'rpl_semi_sync_master_enabled';
@@ -116,28 +93,12 @@ show status like 'Rpl_semi_sync_master_status';
 --replace_result 305 304
 show status like 'Rpl_semi_sync_master_yes_tx';
 
-disable_query_log;
 # reset master to make sure the following test will start with a clean environment
 reset master;
-enable_query_log;
-
---echo #
---echo # INSTALL PLUGIN semi-sync on slave
---echo #
 
 connection slave;
 echo [ on slave ];
 
-disable_query_log;
-let $value= query_get_value(show variables like 'rpl_semi_sync_slave_enabled', Value, 1);
-if ($value == No such row)
-{
-    set sql_log_bin=0;
-    eval INSTALL PLUGIN rpl_semi_sync_slave SONAME '$SEMISYNC_SLAVE_SO';
-    set sql_log_bin=1;
-}
-enable_query_log;
-
 echo [ default state of semi-sync on slave should be OFF ];
 show variables like 'rpl_semi_sync_slave_enabled';
 
@@ -177,15 +138,17 @@ let $_connections_semisync_slave= query_get_value(SHOW STATUS LIKE 'Threads_conn
 replace_result $_connections_normal_slave CONNECTIONS_NORMAL_SLAVE $_connections_semisync_slave CONNECTIONS_SEMISYNC_SLAVE;
 eval select $_connections_semisync_slave - $_connections_normal_slave as 'Should be 0';
 
-let $i=10;
 echo [ insert records to table ];
-disable_query_log;
-while ($i)
-{
-  eval insert into t1 values ($i);
-  dec $i;
-}
-enable_query_log;
+insert t1 values (10);
+insert t1 values (9);
+insert t1 values (8);
+insert t1 values (7);
+insert t1 values (6);
+insert t1 values (5);
+insert t1 values (4);
+insert t1 values (3);
+insert t1 values (2);
+insert t1 values (1);
 
 echo [ master status after inserts ];
 show status like 'Rpl_semi_sync_master_status';
@@ -271,14 +234,16 @@ show status like 'Rpl_semi_sync_master_yes_tx';
 
 # Semi-sync status on master is now OFF, so all these transactions
 # will be replicated asynchronously.
-let $i=10;
-disable_query_log;
-while ($i)
-{
-  eval delete from t1 where a=$i;
-  dec $i;
-}
-enable_query_log;
+delete from t1 where a=10;
+delete from t1 where a=9;
+delete from t1 where a=8;
+delete from t1 where a=7;
+delete from t1 where a=6;
+delete from t1 where a=5;
+delete from t1 where a=4;
+delete from t1 where a=3;
+delete from t1 where a=2;
+delete from t1 where a=1;
 
 insert into t1 values (100);
 
@@ -408,9 +373,8 @@ connection master;
 let $_tid= `select id from information_schema.processlist where command = 'Binlog Dump' limit 1`;
 if ($_tid)
 {
-  disable_query_log;
+  --replace_result $_tid _tid
   eval kill query $_tid;
-  enable_query_log;
 
   # After dump thread exit, Rpl_semi_sync_master_clients will be 0
   let $status_var= Rpl_semi_sync_master_clients;
@@ -463,9 +427,8 @@ reset master;
 let $_tid= `select id from information_schema.processlist where command = 'Binlog Dump' limit 1`;
 if ($_tid)
 {
-  disable_query_log;
+  --replace_result $_tid _tid
   eval kill query $_tid;
-  enable_query_log;
 
   # After dump thread exit, Rpl_semi_sync_master_clients will be 0
   let $status_var= Rpl_semi_sync_master_clients;
@@ -525,9 +488,8 @@ echo [ on master ];
 let $_tid= `select id from information_schema.processlist where command = 'Binlog Dump' limit 1`;
 if ($_tid)
 {
-  disable_query_log;
+  --replace_result $_tid _tid
   eval kill query $_tid;
-  enable_query_log;
 
   # After dump thread exit, Rpl_semi_sync_master_clients will be 0
   let $status_var= Rpl_semi_sync_master_clients;
@@ -562,11 +524,7 @@ connection slave;
 source include/stop_slave.inc;
 connection master;
 echo [ on master ];
-set sql_log_bin=0;
-UNINSTALL PLUGIN rpl_semi_sync_master;
-set sql_log_bin=1;
-enable_query_log;
-SHOW VARIABLES LIKE 'rpl_semi_sync_master_enabled';
+set global rpl_semi_sync_master_enabled= 0;
 
 connection slave;
 echo [ on slave ];
@@ -577,19 +535,13 @@ connection master;
 echo [ on master ];
 insert into t1 values (10);
 sync_slave_with_master;
-echo [ on slave ];
-SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
 
 --echo #
 --echo # Test non-semi-sync slave connect to semi-sync master
 --echo #
 
 connection master;
-set sql_log_bin=0;
-replace_result $SEMISYNC_MASTER_SO SEMISYNC_MASTER_SO;
-eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_SO';
-set global rpl_semi_sync_master_timeout= 5000; /* 5s */
-set sql_log_bin=1;
+set global rpl_semi_sync_master_timeout= 5000; # 5s
 set global rpl_semi_sync_master_enabled= 1;
 
 connection slave;
@@ -598,16 +550,9 @@ source include/stop_slave.inc;
 SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
 
 echo [ uninstall semi-sync slave plugin ];
-UNINSTALL PLUGIN rpl_semi_sync_slave;
-SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
-source include/start_slave.inc;
-SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
-source include/stop_slave.inc;
+set global rpl_semi_sync_slave_enabled= 0;
 
 echo [ reinstall semi-sync slave plugin and disable semi-sync ];
-replace_result $SEMISYNC_SLAVE_SO SEMISYNC_SLAVE_SO;
-eval INSTALL PLUGIN rpl_semi_sync_slave SONAME '$SEMISYNC_SLAVE_SO';
-set global rpl_semi_sync_slave_enabled= 0;
 SHOW VARIABLES LIKE 'rpl_semi_sync_slave_enabled';
 SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
 source include/start_slave.inc;
@@ -619,14 +564,10 @@ SHOW STATUS LIKE 'Rpl_semi_sync_slave_status';
 
 connection slave;
 source include/stop_slave.inc;
-UNINSTALL PLUGIN rpl_semi_sync_slave;
+set global rpl_semi_sync_slave_enabled= 0;
 
 connection master;
-# The dump thread may still be running on the master, and so the following
-# UNINSTALL could generate a warning about the plugin is busy.
-disable_warnings;
-UNINSTALL PLUGIN rpl_semi_sync_master;
-enable_warnings;
+set global rpl_semi_sync_master_enabled= 0;
 
 connection slave;
 change master to master_user='root',master_password='';
@@ -639,4 +580,5 @@ sync_slave_with_master;
 connection master;
 drop user rpl@127.0.0.1;
 flush privileges;
+set global rpl_semi_sync_master_timeout= default;
 --source include/rpl_end.inc
diff --git a/mysql-test/suite/rpl/t/rpl_semi_sync_event.test b/mysql-test/suite/rpl/t/rpl_semi_sync_event.test
index b4a9a9e6e59701982fed0beed4b11a8c3f161d54..b8f3c8130bed2ed817eca7141ee56c60abc42628 100644
--- a/mysql-test/suite/rpl/t/rpl_semi_sync_event.test
+++ b/mysql-test/suite/rpl/t/rpl_semi_sync_event.test
@@ -1,12 +1,11 @@
-source include/have_semisync_plugin.inc;
+source include/have_semisync.inc;
 source include/not_embedded.inc;
-source include/master-slave.inc;
 source include/have_innodb.inc;
+source include/master-slave.inc;
 
 let $engine_type= InnoDB;
 
 # Suppress warnings that might be generated during the test
-disable_query_log;
 connection master;
 call mtr.add_suppression("Timeout waiting for reply of binlog");
 call mtr.add_suppression("Semi-sync master .* waiting for slave reply");
@@ -16,33 +15,13 @@ connection slave;
 call mtr.add_suppression("Master server does not support semi-sync");
 call mtr.add_suppression("Semi-sync slave .* reply");
 call mtr.add_suppression("Slave SQL.*Request to stop slave SQL Thread received while applying a group that has non-transactional changes; waiting for completion of the group");
-enable_query_log;
 
 connection master;
-disable_query_log;
-let $value = query_get_value(show variables like 'rpl_semi_sync_master_enabled', Value, 1);
-if ($value == No such row)
-{
-    set sql_log_bin=0;
-    eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_SO';
-    SET GLOBAL rpl_semi_sync_master_enabled = 1;
-    set sql_log_bin=1;
-}
-enable_query_log;
+set global rpl_semi_sync_master_enabled = 1;
 
 connection slave;
 source include/stop_slave.inc;
-
-disable_query_log;
-let $value= query_get_value(show variables like 'rpl_semi_sync_slave_enabled', Value, 1);
-if ($value == No such row)
-{
-    set sql_log_bin=0;
-    eval INSTALL PLUGIN rpl_semi_sync_slave SONAME '$SEMISYNC_SLAVE_SO';
-    SET GLOBAL rpl_semi_sync_slave_enabled = 1;
-    set sql_log_bin=1;
-}
-enable_query_log;
+set global rpl_semi_sync_slave_enabled = 1;
 
 source include/start_slave.inc;
 
@@ -93,18 +72,16 @@ while ($run)
 #
 connection slave;
 source include/stop_slave.inc;
-
-disable_warnings;
-UNINSTALL PLUGIN rpl_semi_sync_slave;
+set global rpl_semi_sync_slave_enabled = 0;
 
 connection master;
-UNINSTALL PLUGIN rpl_semi_sync_master;
-enable_warnings;
+set global rpl_semi_sync_master_enabled = 0;
 
 connection slave;
 source include/start_slave.inc;
 
 connection master;
+
 DROP EVENT ev1;
 DROP EVENT ev2;
 DROP TABLE t1;
diff --git a/mysql-test/suite/rpl/t/semisync_memleak_4066.test b/mysql-test/suite/rpl/t/semisync_memleak_4066.test
index 687af883936c2ae0345736932dc1c71522c4c9c1..f888f764b4345606756b40d5f90e09705c751aec 100644
--- a/mysql-test/suite/rpl/t/semisync_memleak_4066.test
+++ b/mysql-test/suite/rpl/t/semisync_memleak_4066.test
@@ -1,19 +1,15 @@
 # 
 # MDEV-4066 semisync_master + temporary tables causes memory leaks
 #
-source include/have_semisync_plugin.inc;
+source include/have_semisync.inc;
 source include/have_binlog_format_row.inc;
 source include/master-slave.inc;
 
 connection master;
 
---replace_result .dll .so
-eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_SO';
-
 --connect (con1,localhost,root,,)
 CREATE TEMPORARY TABLE tmp (i INT);
 --disconnect con1 
 
 source include/rpl_end.inc;
-uninstall plugin rpl_semi_sync_master;
 
diff --git a/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_enabled_basic.result b/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_enabled_basic.result
index 3e444519441524a7ec813e70c0e0605746098246..7454f0b0089e72f8d7d464514788100b3f3aa949 100644
--- a/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_enabled_basic.result
+++ b/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_enabled_basic.result
@@ -1,4 +1,3 @@
-INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
 select @@global.rpl_semi_sync_master_enabled;
 @@global.rpl_semi_sync_master_enabled
 0
@@ -70,4 +69,3 @@ SET @@global.rpl_semi_sync_master_enabled = @start_global_value;
 select @@global.rpl_semi_sync_master_enabled;
 @@global.rpl_semi_sync_master_enabled
 0
-UNINSTALL PLUGIN rpl_semi_sync_master;
diff --git a/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_timeout_basic.result b/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_timeout_basic.result
index e77bcc1c12a8495dc44aa1e43e92bab8e127ece8..78fee2a91dceb74ac437f5108525a3a825f0edaa 100644
--- a/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_timeout_basic.result
+++ b/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_timeout_basic.result
@@ -1,4 +1,3 @@
-INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
 select @@global.rpl_semi_sync_master_timeout;
 @@global.rpl_semi_sync_master_timeout
 10000
@@ -51,4 +50,3 @@ SET @@global.rpl_semi_sync_master_timeout = @start_global_value;
 select @@global.rpl_semi_sync_master_timeout;
 @@global.rpl_semi_sync_master_timeout
 10000
-UNINSTALL PLUGIN rpl_semi_sync_master;
diff --git a/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_trace_level_basic.result b/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_trace_level_basic.result
index 55df5f57d9ebc04e2fb528246a81ba3a621c6f09..1096fa995e77e0db25e304d7f287f5269cc69635 100644
--- a/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_trace_level_basic.result
+++ b/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_trace_level_basic.result
@@ -1,4 +1,3 @@
-INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
 select @@global.rpl_semi_sync_master_trace_level;
 @@global.rpl_semi_sync_master_trace_level
 32
@@ -69,4 +68,3 @@ SET @@global.rpl_semi_sync_master_trace_level = @start_global_value;
 select @@global.rpl_semi_sync_master_trace_level;
 @@global.rpl_semi_sync_master_trace_level
 32
-UNINSTALL PLUGIN rpl_semi_sync_master;
diff --git a/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_wait_no_slave_basic.result b/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_wait_no_slave_basic.result
index 3d951b499ed52c07d701e1f17939294af12ce701..535f777eff7d7650fe97e22c9bb612eb80cc9c5b 100644
--- a/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_wait_no_slave_basic.result
+++ b/mysql-test/suite/sys_vars/r/rpl_semi_sync_master_wait_no_slave_basic.result
@@ -1,4 +1,3 @@
-INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
 select @@global.rpl_semi_sync_master_wait_no_slave;
 @@global.rpl_semi_sync_master_wait_no_slave
 1
@@ -70,4 +69,3 @@ SET @@global.rpl_semi_sync_master_wait_no_slave = @start_global_value;
 select @@global.rpl_semi_sync_master_wait_no_slave;
 @@global.rpl_semi_sync_master_wait_no_slave
 1
-UNINSTALL PLUGIN rpl_semi_sync_master;
diff --git a/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_enabled_basic.result b/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_enabled_basic.result
index a23b160e6f2d6b4dacbcaf94293d57d28f334353..f52e8e80127e0a07c7201992bd90e8fe0973fba0 100644
--- a/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_enabled_basic.result
+++ b/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_enabled_basic.result
@@ -1,4 +1,3 @@
-INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
 select @@global.rpl_semi_sync_slave_enabled;
 @@global.rpl_semi_sync_slave_enabled
 0
@@ -70,4 +69,3 @@ SET @@global.rpl_semi_sync_slave_enabled = @start_global_value;
 select @@global.rpl_semi_sync_slave_enabled;
 @@global.rpl_semi_sync_slave_enabled
 0
-UNINSTALL PLUGIN rpl_semi_sync_slave;
diff --git a/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_trace_level_basic.result b/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_trace_level_basic.result
index f7796309aeae7e7de8df51d1798dfb1b7d04868d..9917ec6fce511ae241888120195d65c69e21da3f 100644
--- a/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_trace_level_basic.result
+++ b/mysql-test/suite/sys_vars/r/rpl_semi_sync_slave_trace_level_basic.result
@@ -1,4 +1,3 @@
-INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
 select @@global.rpl_semi_sync_slave_trace_level;
 @@global.rpl_semi_sync_slave_trace_level
 32
@@ -69,4 +68,3 @@ SET @@global.rpl_semi_sync_slave_trace_level = @start_global_value;
 select @@global.rpl_semi_sync_slave_trace_level;
 @@global.rpl_semi_sync_slave_trace_level
 32
-UNINSTALL PLUGIN rpl_semi_sync_slave;
diff --git a/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_enabled_basic.test b/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_enabled_basic.test
index ded489f36ff165df70358e3548da3d8703fd5d71..2ff03a53c420b3e3959679c390d4230d8a14be41 100644
--- a/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_enabled_basic.test
+++ b/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_enabled_basic.test
@@ -6,10 +6,7 @@
 #
 #
 source include/not_embedded.inc;
-source include/have_semisync_plugin.inc;
-# The following is to prevent a mis-match on windows that has the name of of the lib ending with 'dll' 
---replace_regex /\.dll/.so/
-eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_SO';
+source include/have_semisync.inc;
 select @@global.rpl_semi_sync_master_enabled;
 SET @start_global_value = @@global.rpl_semi_sync_master_enabled;
 
@@ -61,5 +58,3 @@ set global rpl_semi_sync_master_enabled="some text";
 #
 SET @@global.rpl_semi_sync_master_enabled = @start_global_value;
 select @@global.rpl_semi_sync_master_enabled;
-UNINSTALL PLUGIN rpl_semi_sync_master;
-
diff --git a/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_timeout_basic.test b/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_timeout_basic.test
index 5258894150d94a308c1766af1613f309ac492cf3..74d3c41150b20f6b28e268fed524fad134bcd433 100644
--- a/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_timeout_basic.test
+++ b/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_timeout_basic.test
@@ -5,10 +5,7 @@
 # 2010-01-21 OBN - Added 
 #
 source include/not_embedded.inc;
-source include/have_semisync_plugin.inc;
-# The following is to prevent a mis-match on windows that has the name of of the lib ending with 'dll' 
---replace_regex /\.dll/.so/
-eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_SO';
+source include/have_semisync.inc;
 select @@global.rpl_semi_sync_master_timeout;
 SET @start_global_value = @@global.rpl_semi_sync_master_timeout;
 
@@ -51,5 +48,3 @@ set global rpl_semi_sync_master_timeout="some text";
 #
 SET @@global.rpl_semi_sync_master_timeout = @start_global_value;
 select @@global.rpl_semi_sync_master_timeout;
-UNINSTALL PLUGIN rpl_semi_sync_master;
-
diff --git a/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_trace_level_basic.test b/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_trace_level_basic.test
index d9b1d860b35ef209daaa1d6cf798944fcfcf484b..c41b53fe5e698b6da111b7cf3f2d10d51724a115 100644
--- a/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_trace_level_basic.test
+++ b/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_trace_level_basic.test
@@ -5,10 +5,7 @@
 # 2010-01-21 OBN - Added 
 #
 source include/not_embedded.inc;
-source include/have_semisync_plugin.inc;
-# The following is to prevent a mis-match on windows that has the name of of the lib ending with 'dll' 
---replace_regex /\.dll/.so/
-eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_SO';
+source include/have_semisync.inc;
 select @@global.rpl_semi_sync_master_trace_level;
 SET @start_global_value = @@global.rpl_semi_sync_master_trace_level;
 
@@ -59,5 +56,3 @@ set global rpl_semi_sync_master_trace_level="some text";
 #
 SET @@global.rpl_semi_sync_master_trace_level = @start_global_value;
 select @@global.rpl_semi_sync_master_trace_level;
-UNINSTALL PLUGIN rpl_semi_sync_master;
-
diff --git a/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_wait_no_slave_basic.test b/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_wait_no_slave_basic.test
index 896bd50d156df5f71f2e2bef6c27ecef7feb7de2..d4a46a08140d005179d27a781c9d7da6645ca622 100644
--- a/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_wait_no_slave_basic.test
+++ b/mysql-test/suite/sys_vars/t/rpl_semi_sync_master_wait_no_slave_basic.test
@@ -6,10 +6,7 @@
 #
 #
 source include/not_embedded.inc;
-source include/have_semisync_plugin.inc;
-# The following is to prevent a mis-match on windows that has the name of of the lib ending with 'dll' 
---replace_regex /\.dll/.so/
-eval INSTALL PLUGIN rpl_semi_sync_master SONAME '$SEMISYNC_MASTER_SO';
+source include/have_semisync.inc;
 select @@global.rpl_semi_sync_master_wait_no_slave;
 SET @start_global_value = @@global.rpl_semi_sync_master_wait_no_slave;
 
@@ -61,5 +58,4 @@ set global rpl_semi_sync_master_wait_no_slave="some text";
 #
 SET @@global.rpl_semi_sync_master_wait_no_slave = @start_global_value;
 select @@global.rpl_semi_sync_master_wait_no_slave;
-UNINSTALL PLUGIN rpl_semi_sync_master;
 
diff --git a/mysql-test/suite/sys_vars/t/rpl_semi_sync_slave_enabled_basic.test b/mysql-test/suite/sys_vars/t/rpl_semi_sync_slave_enabled_basic.test
index 030b0827a11643c2dfd37b32c533fb888bb24877..c7ce371970d9a2b6e2b1feb6f830c281f2829af9 100644
--- a/mysql-test/suite/sys_vars/t/rpl_semi_sync_slave_enabled_basic.test
+++ b/mysql-test/suite/sys_vars/t/rpl_semi_sync_slave_enabled_basic.test
@@ -6,10 +6,7 @@
 #
 #
 source include/not_embedded.inc;
-source include/have_semisync_plugin.inc;
-# The following is to prevent a mis-match on windows that has the name of of the lib ending with 'dll' 
---replace_regex /\.dll/.so/
-eval INSTALL PLUGIN rpl_semi_sync_slave SONAME '$SEMISYNC_SLAVE_SO';
+source include/have_semisync.inc;
 select @@global.rpl_semi_sync_slave_enabled;
 SET @start_global_value = @@global.rpl_semi_sync_slave_enabled;
 
@@ -62,5 +59,3 @@ set global rpl_semi_sync_slave_enabled="some text";
 #
 SET @@global.rpl_semi_sync_slave_enabled = @start_global_value;
 select @@global.rpl_semi_sync_slave_enabled;
-UNINSTALL PLUGIN rpl_semi_sync_slave;
-
diff --git a/mysql-test/suite/sys_vars/t/rpl_semi_sync_slave_trace_level_basic.test b/mysql-test/suite/sys_vars/t/rpl_semi_sync_slave_trace_level_basic.test
index 64c935ee957cf7415d9f23dc06450b22b57644f0..d7e001b73225169b25e811f4bad5d9c1e6f08f0f 100644
--- a/mysql-test/suite/sys_vars/t/rpl_semi_sync_slave_trace_level_basic.test
+++ b/mysql-test/suite/sys_vars/t/rpl_semi_sync_slave_trace_level_basic.test
@@ -5,10 +5,7 @@
 # 2010-01-21 OBN - Added 
 #
 source include/not_embedded.inc;
-source include/have_semisync_plugin.inc;
-# The following is to prevent a mis-match on windows that has the name of of the lib ending with 'dll' 
---replace_regex /\.dll/.so/
-eval INSTALL PLUGIN rpl_semi_sync_slave SONAME '$SEMISYNC_SLAVE_SO';
+source include/have_semisync.inc;
 select @@global.rpl_semi_sync_slave_trace_level;
 SET @start_global_value = @@global.rpl_semi_sync_slave_trace_level;
 
@@ -59,5 +56,3 @@ set global rpl_semi_sync_slave_trace_level="some text";
 #
 SET @@global.rpl_semi_sync_slave_trace_level = @start_global_value;
 select @@global.rpl_semi_sync_slave_trace_level;
-UNINSTALL PLUGIN rpl_semi_sync_slave;
-
diff --git a/mysql-test/t/mysqld--help.test b/mysql-test/t/mysqld--help.test
index 33bb50537ca24b4d99c5a3e5781d7042ccd3e803..d1b681922509d7b98236c1f63c23310e3a650b0e 100644
--- a/mysql-test/t/mysqld--help.test
+++ b/mysql-test/t/mysqld--help.test
@@ -27,7 +27,7 @@ perl;
               feedback debug temp-pool ssl des-key-file xtradb sequence
               thread-concurrency super-large-pages mutex-deadlock-detector
               null-audit aria pbxt oqgraph sphinx thread-handling
-              test-sql-discovery query-cache-info/;
+              test-sql-discovery rpl-semi-sync query-cache-info/;
 
   # And substitute the content some environment variables with their
   # names:
diff --git a/plugin/semisync/CMakeLists.txt b/plugin/semisync/CMakeLists.txt
index f1ada507f4fb910f4c14c137444aa110c4daa9ee..33c0895e5e1f0daa0b8b9c2eff270e4e2b2040ef 100644
--- a/plugin/semisync/CMakeLists.txt
+++ b/plugin/semisync/CMakeLists.txt
@@ -17,11 +17,10 @@ SET(SEMISYNC_MASTER_SOURCES
  semisync.cc semisync_master.cc semisync_master_plugin.cc
  semisync.h semisync_master.h)
 
-MYSQL_ADD_PLUGIN(semisync_master ${SEMISYNC_MASTER_SOURCES}  
-  MODULE_ONLY MODULE_OUTPUT_NAME "semisync_master")
+MYSQL_ADD_PLUGIN(semisync_master ${SEMISYNC_MASTER_SOURCES})
 
 SET(SEMISYNC_SLAVE_SOURCES  semisync.cc semisync_slave.cc 
   semisync_slave_plugin.cc semisync.h semisync_slave.h )
-MYSQL_ADD_PLUGIN(semisync_slave ${SEMISYNC_SLAVE_SOURCES} 
-  MODULE_ONLY MODULE_OUTPUT_NAME "semisync_slave")
+
+MYSQL_ADD_PLUGIN(semisync_slave ${SEMISYNC_SLAVE_SOURCES})
 
diff --git a/plugin/semisync/semisync_master.cc b/plugin/semisync/semisync_master.cc
index f8eb962b857d4a2130b81fbc8a3e0e7e6f9adc94..88ae34e2a2da0e30825379776577330d4d23b6fa 100644
--- a/plugin/semisync/semisync_master.cc
+++ b/plugin/semisync/semisync_master.cc
@@ -429,12 +429,13 @@ int ReplSemiSyncMaster::disableMaster()
   return 0;
 }
 
-ReplSemiSyncMaster::~ReplSemiSyncMaster()
+void ReplSemiSyncMaster::cleanup()
 {
   if (init_done_)
   {
     mysql_mutex_destroy(&LOCK_binlog_);
     mysql_cond_destroy(&COND_binlog_send_);
+    init_done_= 0;
   }
 
   delete active_tranxs_;
diff --git a/plugin/semisync/semisync_master.h b/plugin/semisync/semisync_master.h
index 841c24197fc095b4e983a834c312a98da637c859..9b266ca65657c4f226782d744fc2adff2df3b9e7 100644
--- a/plugin/semisync/semisync_master.h
+++ b/plugin/semisync/semisync_master.h
@@ -453,7 +453,9 @@ class ReplSemiSyncMaster
 
  public:
   ReplSemiSyncMaster();
-  ~ReplSemiSyncMaster();
+  ~ReplSemiSyncMaster() {}
+
+  void cleanup();
 
   bool getMasterEnabled() {
     return master_enabled_;
diff --git a/plugin/semisync/semisync_master_plugin.cc b/plugin/semisync/semisync_master_plugin.cc
index c811cb1cc9e2a50d84a71969f845e99260da864c..81ed9b55d99b49f55fd19f9d59f62d3920fed9d7 100644
--- a/plugin/semisync/semisync_master_plugin.cc
+++ b/plugin/semisync/semisync_master_plugin.cc
@@ -19,7 +19,7 @@
 #include "semisync_master.h"
 #include "sql_class.h"                          // THD
 
-ReplSemiSyncMaster repl_semisync;
+static ReplSemiSyncMaster repl_semisync;
 
 C_MODE_START
 
@@ -405,6 +405,7 @@ static int semi_sync_master_plugin_deinit(void *p)
     sql_print_error("unregister_binlog_transmit_observer failed");
     return 1;
   }
+  repl_semisync.cleanup();
   sql_print_information("unregister_replicator OK");
   return 0;
 }
@@ -416,7 +417,7 @@ struct Mysql_replication semi_sync_master_plugin= {
 /*
   Plugin library descriptor
 */
-mysql_declare_plugin(semi_sync_master)
+maria_declare_plugin(semisync_master)
 {
   MYSQL_REPLICATION_PLUGIN,
   &semi_sync_master_plugin,
@@ -429,7 +430,8 @@ mysql_declare_plugin(semi_sync_master)
   0x0100 /* 1.0 */,
   semi_sync_master_status_vars,	/* status variables */
   semi_sync_master_system_vars,	/* system variables */
-  NULL,                         /* config options */
-  0,                            /* flags */
+  "1.0",
+  MariaDB_PLUGIN_MATURITY_UNKNOWN
 }
-mysql_declare_plugin_end;
+maria_declare_plugin_end;
+
diff --git a/plugin/semisync/semisync_slave_plugin.cc b/plugin/semisync/semisync_slave_plugin.cc
index 5d373fa08621e7da93569508c512aa1cee598759..96e614b845e43373bff4e58ca0acf33a49fed494 100644
--- a/plugin/semisync/semisync_slave_plugin.cc
+++ b/plugin/semisync/semisync_slave_plugin.cc
@@ -18,7 +18,7 @@
 #include "semisync_slave.h"
 #include <mysql.h>
 
-ReplSemiSyncSlave repl_semisync;
+static ReplSemiSyncSlave repl_semisync;
 
 /*
   indicate whether or not the slave should send a reply to the master.
@@ -212,7 +212,7 @@ struct Mysql_replication semi_sync_slave_plugin= {
 /*
   Plugin library descriptor
 */
-mysql_declare_plugin(semi_sync_slave)
+maria_declare_plugin(semisync_slave)
 {
   MYSQL_REPLICATION_PLUGIN,
   &semi_sync_slave_plugin,
@@ -225,7 +225,8 @@ mysql_declare_plugin(semi_sync_slave)
   0x0100 /* 1.0 */,
   semi_sync_slave_status_vars,	/* status variables */
   semi_sync_slave_system_vars,	/* system variables */
-  NULL,                         /* config options */
-  0,                            /* flags */
+  "1.0",
+  MariaDB_PLUGIN_MATURITY_UNKNOWN
 }
-mysql_declare_plugin_end;
+maria_declare_plugin_end;
+
diff --git a/sql/rpl_handler.cc b/sql/rpl_handler.cc
index 258dae0edb261142756faa3ae87f54a37714ec93..1d21b3f944503b702c3754c8accbf5b26fcd1bab 100644
--- a/sql/rpl_handler.cc
+++ b/sql/rpl_handler.cc
@@ -555,4 +555,24 @@ int unregister_binlog_relay_io_observer(Binlog_relay_IO_observer *observer, void
 {
   return binlog_relay_io_delegate->remove_observer(observer, (st_plugin_int *)p);
 }
+#else
+int register_binlog_transmit_observer(Binlog_transmit_observer *observer, void *p)
+{
+  return 0;
+}
+
+int unregister_binlog_transmit_observer(Binlog_transmit_observer *observer, void *p)
+{
+  return 0;
+}
+
+int register_binlog_relay_io_observer(Binlog_relay_IO_observer *observer, void *p)
+{
+  return 0;
+}
+
+int unregister_binlog_relay_io_observer(Binlog_relay_IO_observer *observer, void *p)
+{
+  return 0;
+}
 #endif /* HAVE_REPLICATION */