diff --git a/mysql-test/r/insert.result b/mysql-test/r/insert.result
index a722ab8d97f30d8558d6f61a8b2c95f3f1395a98..82f3977e231a5d6a0e91c360567d170c2b24cb3c 100644
--- a/mysql-test/r/insert.result
+++ b/mysql-test/r/insert.result
@@ -697,3 +697,23 @@ ERROR 42000: Column 'a' specified twice
 INSERT IGNORE t1 (a, a) SELECT 1,1 UNION SELECT 2,2;
 ERROR 42000: Column 'a' specified twice
 DROP TABLE t1;
+#
+# MDEV-5168: Ensure that we can disable duplicate key warnings
+# from INSERT IGNORE
+#
+create table t1 (f1 int unique, f2 int unique);
+insert into t1 values (1,12);
+insert into t1 values (2,13);
+insert into t1 values (1,12);
+ERROR 23000: Duplicate entry '1' for key 'f1'
+insert ignore into t1 values (1,12);
+Warnings:
+Warning	1062	Duplicate entry '1' for key 'f1'
+set @@old_mode="NO_DUP_KEY_WARNINGS_WITH_IGNORE";
+insert ignore into t1 values (1,12);
+insert ignore into t1 values (1,12) on duplicate key update f2=13;
+set @@old_mode="";
+insert ignore into t1 values (1,12);
+Warnings:
+Warning	1062	Duplicate entry '1' for key 'f1'
+DROP TABLE t1;
diff --git a/mysql-test/r/mysqld--help.result b/mysql-test/r/mysqld--help.result
index c36cc96bb1a24edcb67212e1417a3a9129d72406..16da8eae7f94efe43f2e2184bad622f9dd822b87 100644
--- a/mysql-test/r/mysqld--help.result
+++ b/mysql-test/r/mysqld--help.result
@@ -454,8 +454,12 @@ The following options may be given as the first argument:
  --net-write-timeout=# 
  Number of seconds to wait for a block to be written to a
  connection before aborting the write
- --old               Use compatible behavior
+ --old               Use compatible behavior from previous MariaDB version.
+ See also --old-mode
  --old-alter-table   Use old, non-optimized alter table
+ --old-mode=name     Used to emulate old behavior from earlier MariaDB or
+ MySQL versions. Syntax: old_mode=mode[,mode[,mode...]].
+ See the manual for the complete list of valid old modes
  --old-passwords     Use old password encryption method (needed for 4.0 and
  older clients)
  --old-style-user-limits 
@@ -997,6 +1001,7 @@ net-retry-count 10
 net-write-timeout 60
 old FALSE
 old-alter-table FALSE
+old-mode 
 old-passwords FALSE
 old-style-user-limits FALSE
 optimizer-prune-level 1
diff --git a/mysql-test/suite/sys_vars/r/old_mode_basic.result b/mysql-test/suite/sys_vars/r/old_mode_basic.result
new file mode 100644
index 0000000000000000000000000000000000000000..c9a650e7b1524745fc20b3c70f4bfe5136fc53be
--- /dev/null
+++ b/mysql-test/suite/sys_vars/r/old_mode_basic.result
@@ -0,0 +1,174 @@
+SET @global_start_value = @@global.old_mode;
+SELECT @global_start_value;
+@global_start_value
+
+SET @session_start_value = @@session.old_mode;
+SELECT @session_start_value;
+@session_start_value
+
+'#--------------------FN_DYNVARS_152_01------------------------#'
+SET @@global.old_mode = "NO_PROGRESS_INFO";
+SET @@global.old_mode = DEFAULT;
+SELECT @@global.old_mode;
+@@global.old_mode
+
+SET @@session.old_mode = "NO_PROGRESS_INFO";
+SET @@session.old_mode = DEFAULT;
+SELECT @@session.old_mode;
+@@session.old_mode
+
+'#---------------------FN_DYNVARS_152_02-------------------------#'
+SET @@global.old_mode = NULL;
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'NULL'
+SET @@global.old_mode = '';
+SELECT @@global.old_mode;
+@@global.old_mode
+
+SET @@global.old_mode = ' ';
+SELECT @@global.old_mode;
+@@global.old_mode
+
+SET @@session.old_mode = NULL;
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'NULL'
+SET @@session.old_mode = '';
+SELECT @@session.old_mode;
+@@session.old_mode
+
+SET @@session.old_mode = ' ';
+SELECT @@session.old_mode;
+@@session.old_mode
+
+'#--------------------FN_DYNVARS_152_03------------------------#'
+SET @@global.old_mode = NO_PROGRESS_INFO;
+SELECT @@global.old_mode;
+@@global.old_mode
+NO_PROGRESS_INFO
+SET @@global.old_mode = NO_DUP_KEY_WARNINGS_WITH_IGNORE;
+SELECT @@global.old_mode;
+@@global.old_mode
+NO_DUP_KEY_WARNINGS_WITH_IGNORE
+SET @@global.old_mode = OFF;
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'OFF'
+SET @@session.old_mode = NO_PROGRESS_INFO;
+SELECT @@session.old_mode;
+@@session.old_mode
+NO_PROGRESS_INFO
+SET @@session.old_mode = NO_DUP_KEY_WARNINGS_WITH_IGNORE;
+SELECT @@session.old_mode;
+@@session.old_mode
+NO_DUP_KEY_WARNINGS_WITH_IGNORE
+SET @@session.old_mode = OFF;
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'OFF'
+SET @@global.old_mode = '?';
+ERROR 42000: Variable 'old_mode' can't be set to the value of '?'
+SELECT @@global.old_mode;
+@@global.old_mode
+NO_DUP_KEY_WARNINGS_WITH_IGNORE
+'#--------------------FN_DYNVARS_152_04-------------------------#'
+SET @@global.old_mode = -1;
+ERROR 42000: Variable 'old_mode' can't be set to the value of '-1'
+SET @@global.old_mode = ASCII;
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'ASCII'
+SET @@global.old_mode = NON_TRADITIONAL;
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'NON_TRADITIONAL'
+SET @@global.old_mode = 'OF';
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'OF'
+SET @@global.old_mode = NONE;
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'NONE'
+SET @@session.old_mode = -1;
+ERROR 42000: Variable 'old_mode' can't be set to the value of '-1'
+SET @@session.old_mode = ANSI_SINGLE_QUOTES;
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'ANSI_SINGLE_QUOTES'
+SET @@session.old_mode = 'ON';
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'ON'
+SET @@session.old_mode = 'OF';
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'OF'
+SET @@session.old_mode = DISABLE;
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'DISABLE'
+'#-------------------FN_DYNVARS_152_05----------------------------#'
+SELECT @@session.old_mode = VARIABLE_VALUE 
+FROM INFORMATION_SCHEMA.SESSION_VARIABLES 
+WHERE VARIABLE_NAME='old_mode';
+@@session.old_mode = VARIABLE_VALUE
+1
+'#----------------------FN_DYNVARS_152_06------------------------#'
+SELECT @@global.old_mode = VARIABLE_VALUE 
+FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES 
+WHERE VARIABLE_NAME='old_mode';
+@@global.old_mode = VARIABLE_VALUE
+1
+'#---------------------FN_DYNVARS_152_07-------------------------#'
+SET @@global.old_mode = 0;
+SELECT @@global.old_mode;
+@@global.old_mode
+
+SET @@global.old_mode = 1;
+SELECT @@global.old_mode;
+@@global.old_mode
+NO_DUP_KEY_WARNINGS_WITH_IGNORE
+SET @@global.old_mode = 2;
+SELECT @@global.old_mode;
+@@global.old_mode
+NO_PROGRESS_INFO
+SET @@global.old_mode = 4;
+ERROR 42000: Variable 'old_mode' can't be set to the value of '4'
+SELECT @@global.old_mode;
+@@global.old_mode
+NO_PROGRESS_INFO
+SET @@global.old_mode = 0.4;
+ERROR 42000: Incorrect argument type to variable 'old_mode'
+'#---------------------FN_DYNVARS_152_08----------------------#'
+SET @@global.old_mode = TRUE;
+SELECT @@global.old_mode;
+@@global.old_mode
+NO_DUP_KEY_WARNINGS_WITH_IGNORE
+SET @@global.old_mode = FALSE;
+SELECT @@global.old_mode;
+@@global.old_mode
+
+'#---------------------FN_DYNVARS_152_09----------------------#'
+SET old_mode = 'NO_PROGRESS_INFO';
+SET session.old_mode = 'ANSI';
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'old_mode = 'ANSI'' at line 1
+SET global.old_mode = 'ANSI';
+ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'old_mode = 'ANSI'' at line 1
+SET session old_mode = 1;
+SELECT @@old_mode;
+@@old_mode
+NO_DUP_KEY_WARNINGS_WITH_IGNORE
+SET global old_mode = 0;
+SELECT @@global.old_mode;
+@@global.old_mode
+
+'#---------------------FN_DYNVARS_152_10----------------------#'
+SET @@session.old_mode = 'NO_PROGRESS_INFO,NO_DUP_KEY_WARNINGS_WITH_IGNORE';
+SELECT @@session.old_mode;
+@@session.old_mode
+NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO
+SET @@global.old_mode = 'NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO';
+SELECT @@global.old_mode;
+@@global.old_mode
+NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO
+SET @@session.old_mode = 'NO_PROGRESS_INFO,NO_SUCH_MODE';
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'NO_SUCH_MODE'
+SET @@old_mode=',';
+SELECT @@old_mode;
+@@old_mode
+
+SET @@old_mode=',,,,NO_PROGRESS_INFO,,,';
+SELECT @@old_mode;
+@@old_mode
+NO_PROGRESS_INFO
+SET @@old_mode=',,,,FOOBAR,,,,,';
+ERROR 42000: Variable 'old_mode' can't be set to the value of 'FOOBAR'
+SELECT @@old_mode;
+@@old_mode
+NO_PROGRESS_INFO
+SET @@global.old_mode = @global_start_value;
+SELECT @@global.old_mode;
+@@global.old_mode
+
+SET @@session.old_mode = @session_start_value;
+SELECT @@session.old_mode;
+@@session.old_mode
+
diff --git a/mysql-test/suite/sys_vars/t/old_mode_basic.test b/mysql-test/suite/sys_vars/t/old_mode_basic.test
new file mode 100644
index 0000000000000000000000000000000000000000..6770219887d235a70b39626a3a865def46607eee
--- /dev/null
+++ b/mysql-test/suite/sys_vars/t/old_mode_basic.test
@@ -0,0 +1,244 @@
+#################### mysql-test\t\sql_mode_basic.test #########################
+#                                                                             #
+# Variable Name: old_mode                                                     #
+# Scope: GLOBAL | SESSION                                                     #
+# Access Type: Dynamic                                                        #
+# Data Type: enumeration                                                      #
+# Default Value: YES                                                          #
+# Valid Values : NO_DUP_KEY_WARNINGS_WITH_IGNORE, NO_PROGRESS_INFO            #
+#                                                                             #
+#                                                                             #
+# Description: Test Cases of Dynamic System Variable old_mode                 #
+#              that checks the behavior of this variable in the following ways#
+#              * Default Value                                                #
+#              * Valid & Invalid values                                       #
+#              * Scope & Access method                                        #
+#              * Data Integrity                                               #
+#                                                                             #
+#                                                                             #
+###############################################################################
+
+--source include/load_sysvars.inc
+
+################################################################
+#                    START OF sql_mode TESTS                   #
+################################################################
+
+
+###################################################################
+#     Saving initial value of sql_mode in a temporary variable    #
+###################################################################
+
+SET @global_start_value = @@global.old_mode;
+SELECT @global_start_value;
+
+SET @session_start_value = @@session.old_mode;
+SELECT @session_start_value;
+
+--echo '#--------------------FN_DYNVARS_152_01------------------------#'
+################################################################
+#                    Display the DEFAULT value of old_mode     #
+################################################################
+
+SET @@global.old_mode = "NO_PROGRESS_INFO";
+SET @@global.old_mode = DEFAULT;
+SELECT @@global.old_mode;
+
+SET @@session.old_mode = "NO_PROGRESS_INFO";
+SET @@session.old_mode = DEFAULT;
+SELECT @@session.old_mode;
+
+--echo '#---------------------FN_DYNVARS_152_02-------------------------#'
+######################################################### 
+#      Check if NULL or empty value is accepeted        #
+######################################################### 
+
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@global.old_mode = NULL;
+
+# resets sql mode to nothing
+SET @@global.old_mode = '';
+SELECT @@global.old_mode;
+
+SET @@global.old_mode = ' ';
+SELECT @@global.old_mode;
+
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@session.old_mode = NULL;
+
+SET @@session.old_mode = '';
+SELECT @@session.old_mode;
+
+SET @@session.old_mode = ' ';
+SELECT @@session.old_mode;
+
+
+--echo '#--------------------FN_DYNVARS_152_03------------------------#'
+######################################################################## 
+#              Change the value of old_mode to a valid value           #
+######################################################################## 
+
+# sql modes ref: http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html
+
+# check valid values for global
+
+SET @@global.old_mode = NO_PROGRESS_INFO;
+SELECT @@global.old_mode;
+SET @@global.old_mode = NO_DUP_KEY_WARNINGS_WITH_IGNORE;
+SELECT @@global.old_mode;
+
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@global.old_mode = OFF;
+
+#check valid values for session
+SET @@session.old_mode = NO_PROGRESS_INFO;
+SELECT @@session.old_mode;
+SET @@session.old_mode = NO_DUP_KEY_WARNINGS_WITH_IGNORE;
+SELECT @@session.old_mode;
+
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@session.old_mode = OFF;
+
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@global.old_mode = '?';
+SELECT @@global.old_mode;
+
+--echo '#--------------------FN_DYNVARS_152_04-------------------------#'
+########################################################################### 
+#               Change the value of old_mode to invalid value             #
+###########################################################################
+
+# invalid values for global
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@global.old_mode = -1;
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@global.old_mode = ASCII;
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@global.old_mode = NON_TRADITIONAL;
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@global.old_mode = 'OF';
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@global.old_mode = NONE;
+
+#invalid values for session
+
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@session.old_mode = -1;
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@session.old_mode = ANSI_SINGLE_QUOTES;
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@session.old_mode = 'ON';
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@session.old_mode = 'OF';
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@session.old_mode = DISABLE;
+
+
+--echo '#-------------------FN_DYNVARS_152_05----------------------------#'
+######################################################################### 
+#     Check if the value in session Table matches value in variable     #
+#########################################################################
+
+SELECT @@session.old_mode = VARIABLE_VALUE 
+FROM INFORMATION_SCHEMA.SESSION_VARIABLES 
+WHERE VARIABLE_NAME='old_mode';
+
+--echo '#----------------------FN_DYNVARS_152_06------------------------#'
+######################################################################### 
+#     Check if the value in GLOBAL Table matches value in variable      #
+#########################################################################
+
+SELECT @@global.old_mode = VARIABLE_VALUE 
+FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES 
+WHERE VARIABLE_NAME='old_mode';
+
+
+--echo '#---------------------FN_DYNVARS_152_07-------------------------#'
+################################################################### 
+#        Check if numbers can be used on variable                 #
+################################################################### 
+
+# test if variable accepts 0,1,2
+SET @@global.old_mode = 0;
+SELECT @@global.old_mode;
+
+SET @@global.old_mode = 1;
+SELECT @@global.old_mode;
+
+SET @@global.old_mode = 2;
+SELECT @@global.old_mode;
+
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@global.old_mode = 4;
+SELECT @@global.old_mode;
+
+# use of decimal values
+
+--Error ER_WRONG_TYPE_FOR_VAR
+SET @@global.old_mode = 0.4;
+
+--echo '#---------------------FN_DYNVARS_152_08----------------------#'
+################################################################### 
+#      Check if TRUE and FALSE values can be used on variable     #
+################################################################### 
+
+SET @@global.old_mode = TRUE;
+SELECT @@global.old_mode;
+SET @@global.old_mode = FALSE;
+SELECT @@global.old_mode;
+
+--echo '#---------------------FN_DYNVARS_152_09----------------------#'
+#########################################################################  
+# Check if old_mode can be accessed with and without @@ sign            #
+#########################################################################
+
+SET old_mode = 'NO_PROGRESS_INFO';
+
+--Error ER_PARSE_ERROR
+SET session.old_mode = 'ANSI';
+--Error ER_PARSE_ERROR
+SET global.old_mode = 'ANSI';
+
+SET session old_mode = 1;
+SELECT @@old_mode;
+
+SET global old_mode = 0;
+SELECT @@global.old_mode;
+
+--echo '#---------------------FN_DYNVARS_152_10----------------------#'
+#######################################################################
+#    Check if old_mode values can be combined as specified            #
+#######################################################################
+
+SET @@session.old_mode = 'NO_PROGRESS_INFO,NO_DUP_KEY_WARNINGS_WITH_IGNORE';
+SELECT @@session.old_mode;
+
+SET @@global.old_mode = 'NO_DUP_KEY_WARNINGS_WITH_IGNORE,NO_PROGRESS_INFO';
+SELECT @@global.old_mode;
+
+#try combining invalid mode with correct mode
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@session.old_mode = 'NO_PROGRESS_INFO,NO_SUCH_MODE';
+
+#zero-length values are ok
+SET @@old_mode=',';
+SELECT @@old_mode;
+SET @@old_mode=',,,,NO_PROGRESS_INFO,,,';
+SELECT @@old_mode;
+--Error ER_WRONG_VALUE_FOR_VAR
+SET @@old_mode=',,,,FOOBAR,,,,,';
+SELECT @@old_mode;
+
+##############################
+#   Restore initial value    #
+##############################
+
+SET @@global.old_mode = @global_start_value;
+SELECT @@global.old_mode;
+
+SET @@session.old_mode = @session_start_value;
+SELECT @@session.old_mode;
+
+################################################################
+#                    END OF old_mode TESTS                     #
+################################################################
diff --git a/mysql-test/t/insert.test b/mysql-test/t/insert.test
index f9b9fcf266d0659f30027ff91516d9b4e0b305ac..ff8396fd7fdc5ceecdb5e999836800043e6ac4b9 100644
--- a/mysql-test/t/insert.test
+++ b/mysql-test/t/insert.test
@@ -555,3 +555,21 @@ INSERT IGNORE t1 (a, a) SELECT 1,1;
 INSERT IGNORE t1 (a, a) SELECT 1,1 UNION SELECT 2,2;
 
 DROP TABLE t1;
+
+--echo #
+--echo # MDEV-5168: Ensure that we can disable duplicate key warnings
+--echo # from INSERT IGNORE
+--echo #
+
+create table t1 (f1 int unique, f2 int unique);
+insert into t1 values (1,12);
+insert into t1 values (2,13);
+--error ER_DUP_ENTRY
+insert into t1 values (1,12);
+insert ignore into t1 values (1,12);
+set @@old_mode="NO_DUP_KEY_WARNINGS_WITH_IGNORE";
+insert ignore into t1 values (1,12);
+insert ignore into t1 values (1,12) on duplicate key update f2=13;
+set @@old_mode="";
+insert ignore into t1 values (1,12);
+DROP TABLE t1;
diff --git a/sql/sql_class.h b/sql/sql_class.h
index a21917a081425cf48e8c49d55eaa60f30b2ca4de..c25a5f82eaca49482d8c7445d761cc1521a7942f 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -108,6 +108,10 @@ enum enum_filetype { FILETYPE_CSV, FILETYPE_XML };
 #define MODE_NO_ENGINE_SUBSTITUTION     (MODE_HIGH_NOT_PRECEDENCE*2)
 #define MODE_PAD_CHAR_TO_FULL_LENGTH    (ULL(1) << 31)
 
+/* Bits for different old style modes */
+#define OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE	1
+#define OLD_MODE_NO_PROGRESS_INFO			2
+
 extern char internal_table_name[2];
 extern char empty_c_string[1];
 extern MYSQL_PLUGIN_IMPORT const char **errmesg;
@@ -473,6 +477,7 @@ typedef struct system_variables
   ulonglong long_query_time;
   ulonglong optimizer_switch;
   ulonglong sql_mode; ///< which non-standard SQL behaviour should be enabled
+  ulonglong old_behavior; ///< which old SQL behaviour should be enabled
   ulonglong option_bits; ///< OPTION_xxx constants, e.g. OPTION_PROFILING
   ulonglong join_buff_space_limit;
   ulonglong log_slow_filter; 
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 10e943458bddb58348684e5b88118807dc09183a..0bc1453ddefb465233ab6f8db92586d461aa6186 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -1714,7 +1714,9 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
             if (info->ignore &&
                 !table->file->is_fatal_error(error, HA_CHECK_DUP_KEY))
             {
-              table->file->print_error(error, MYF(ME_JUST_WARNING));
+              if (!(thd->variables.old_behavior &
+                    OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE))
+                table->file->print_error(error, MYF(ME_JUST_WARNING));
               goto ok_or_after_trg_err;
             }
             goto err;
@@ -1844,7 +1846,9 @@ int write_record(THD *thd, TABLE *table,COPY_INFO *info)
     if (!info->ignore ||
         table->file->is_fatal_error(error, HA_CHECK_DUP))
       goto err;
-    table->file->print_error(error, MYF(ME_JUST_WARNING));
+    if (!(thd->variables.old_behavior &
+          OLD_MODE_NO_DUP_KEY_WARNINGS_WITH_IGNORE))
+      table->file->print_error(error, MYF(ME_JUST_WARNING));
     table->file->restore_auto_increment(prev_insert_id);
     goto ok_or_after_trg_err;
   }
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 5104eb7bb3ff6a7631d1750ef5328deda01afbf9..20b2b9cc7b8fc5b870c0ae6c4a3a8e762e037bba 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -2174,7 +2174,8 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
   field->maybe_null=1;
   field_list.push_back(field=new Item_empty_string("Info",max_query_length));
   field->maybe_null=1;
-  if (!thd->variables.old_mode)
+  if (!thd->variables.old_mode &&
+      !(thd->variables.old_behavior & OLD_MODE_NO_PROGRESS_INFO))
   {
     field_list.push_back(field= new Item_float("Progress", 0.0, 3, 7));
     field->maybe_null= 0;
@@ -2280,7 +2281,8 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
     protocol->store(thd_info->state_info, system_charset_info);
     protocol->store(thd_info->query_string.str(),
                     thd_info->query_string.charset());
-    if (!thd->variables.old_mode)
+    if (!thd->variables.old_mode &&
+        !(thd->variables.old_behavior & OLD_MODE_NO_PROGRESS_INFO))
       protocol->store(thd_info->progress, 3, &store_buffer);
     if (protocol->write())
       break; /* purecov: inspected */
diff --git a/sql/sys_vars.cc b/sql/sys_vars.cc
index 5b4d4fdb4eb19c66ab0f99ebf0ddf95d6559c8fe..49b90006000badfc4c1d44ef6333d8dbd2858091 100644
--- a/sql/sys_vars.cc
+++ b/sql/sys_vars.cc
@@ -1390,7 +1390,7 @@ static Sys_var_ulong Sys_net_retry_count(
        ON_UPDATE(fix_net_retry_count));
 
 static Sys_var_mybool Sys_old_mode(
-       "old", "Use compatible behavior",
+       "old", "Use compatible behavior from previous MariaDB version. See also --old-mode",
        SESSION_VAR(old_mode), CMD_LINE(OPT_ARG), DEFAULT(FALSE));
 
 static Sys_var_mybool Sys_old_alter_table(
@@ -2211,6 +2211,30 @@ static Sys_var_set Sys_sql_mode(
        sql_mode_names, DEFAULT(0), NO_MUTEX_GUARD, NOT_IN_BINLOG,
        ON_CHECK(check_sql_mode), ON_UPDATE(fix_sql_mode));
 
+static const char *old_mode_names[]=
+{
+  "NO_DUP_KEY_WARNINGS_WITH_IGNORE", "NO_PROGRESS_INFO",
+  0
+};
+
+export bool old_mode_string_representation(THD *thd, ulonglong sql_mode,
+                                           LEX_STRING *ls)
+{
+  set_to_string(thd, ls, sql_mode, old_mode_names);
+  return ls->str == 0;
+}
+/*
+  sql_mode should *not* be IN_BINLOG as the slave can't remember this
+  anyway on restart.
+*/
+static Sys_var_set Sys_old_behavior(
+       "old_mode",
+       "Used to emulate old behavior from earlier MariaDB or MySQL versions. "
+       "Syntax: old_mode=mode[,mode[,mode...]]. "
+       "See the manual for the complete list of valid old modes",
+       SESSION_VAR(old_behavior), CMD_LINE(REQUIRED_ARG),
+       old_mode_names, DEFAULT(0), NO_MUTEX_GUARD, NOT_IN_BINLOG);
+
 #if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
 #define SSL_OPT(X) CMD_LINE(REQUIRED_ARG,X)
 #else