diff --git a/gdb/NEWS b/gdb/NEWS
index dce79a2..5d59bc7 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -67,6 +67,11 @@ maint selftest
   including JIT compiling fast tracepoint's conditional expression
   bytecode into native code.
 
+* MI async record =record-started new includes the method and format used for
+  recording.  For example:
+
+    =record-started,thread-group="i1",method="btrace",format="bts"
+
 *** Changes in GDB 7.11
 
 * GDB now supports debugging kernel-based threads on FreeBSD.
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 7e89003..5739d05 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -26423,12 +26423,17 @@ breakpoint commands; @xref{GDB/MI Breakpoint Commands}.  The
 Note that if a breakpoint is emitted in the result record of a
 command, then it will not also be emitted in an async record.
 
-@item =record-started,thread-group="@var{id}"
+@item =record-started,thread-group="@var{id}",method="@var{method}"[,format="@var{format}"]
 @itemx =record-stopped,thread-group="@var{id}"
 Execution log recording was either started or stopped on an
 inferior.  The @var{id} is the @value{GDBN} identifier of the thread
 group corresponding to the affected inferior.
 
+The @var{method} field contains the method used to record execution.  If the
+method in use supports multiple recording formats, @var{format} will be present
+and contain the currently used format.  See @xref{Process Record and Replay}
+for existing method and format values.
+
 @item =cmd-param-changed,param=@var{param},value=@var{value}
 Reports that a parameter of the command @code{set @var{param}} is
 changed to @var{value}.  In the multi-word @code{set} command,
diff --git a/gdb/doc/observer.texi b/gdb/doc/observer.texi
index f4049ad..fc7aac4 100644
--- a/gdb/doc/observer.texi
+++ b/gdb/doc/observer.texi
@@ -141,11 +141,16 @@ at the entry-point instruction.  For @samp{attach} and @samp{core},
 inferior, and before any information on the inferior has been printed.
 @end deftypefun
 
-@deftypefun void record_changed (struct inferior *@var{inferior}, int @var{started})
+@deftypefun void record_changed (struct inferior *@var{inferior}, int @var{started}, const char *@var{method}, const char *@var{format})
 The status of process record for inferior @var{inferior} in
 @value{GDBN} has changed.  The process record is started if
 @var{started} is true, and the process record is stopped if
 @var{started} is false.
+
+When @var{started} is true, @var{method} indicates the short name of the method
+used for recording.  If the method supports multiple formats, @var{format}
+indicates which one is being used, otherwise it is NULL.  When @var{started} is
+false, they are both NULL.
 @end deftypefun
 
 @deftypefun void solib_loaded (struct so_list *@var{solib})
diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c
index 0fe19af..09de9fe 100644
--- a/gdb/mi/mi-interp.c
+++ b/gdb/mi/mi-interp.c
@@ -65,7 +65,8 @@ static void mi_on_no_history (void);
 
 static void mi_new_thread (struct thread_info *t);
 static void mi_thread_exit (struct thread_info *t, int silent);
-static void mi_record_changed (struct inferior*, int);
+static void mi_record_changed (struct inferior*, int, const char *,
+			       const char *);
 static void mi_inferior_added (struct inferior *inf);
 static void mi_inferior_appeared (struct inferior *inf);
 static void mi_inferior_exit (struct inferior *inf);
@@ -399,7 +400,8 @@ mi_thread_exit (struct thread_info *t, int silent)
 /* Emit notification on changing the state of record.  */
 
 static void
-mi_record_changed (struct inferior *inferior, int started)
+mi_record_changed (struct inferior *inferior, int started, const char *method,
+		   const char *format)
 {
   struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
   struct cleanup *old_chain;
@@ -407,8 +409,30 @@ mi_record_changed (struct inferior *inferior, int started)
   old_chain = make_cleanup_restore_target_terminal ();
   target_terminal_ours_for_output ();
 
-  fprintf_unfiltered (mi->event_channel,  "record-%s,thread-group=\"i%d\"",
-		      started ? "started" : "stopped", inferior->num);
+  if (started)
+    {
+      if (format != NULL)
+	{
+	  fprintf_unfiltered (
+	    mi->event_channel,
+	    "record-started,thread-group=\"i%d\",method=\"%s\",format=\"%s\"",
+	    inferior->num, method, format);
+	}
+      else
+	{
+
+	  fprintf_unfiltered (
+	    mi->event_channel,
+	    "record-started,thread-group=\"i%d\",method=\"%s\"",
+	    inferior->num, method);
+	}
+    }
+  else
+    {
+      fprintf_unfiltered (mi->event_channel,
+			  "record-stopped,thread-group=\"i%d\"", inferior->num);
+    }
+
 
   gdb_flush (mi->event_channel);
 
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 77b5180..a1df75a 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -206,6 +206,7 @@ record_btrace_open (const char *args, int from_tty)
 {
   struct cleanup *disable_chain;
   struct thread_info *tp;
+  const char *format;
 
   DEBUG ("open");
 
@@ -234,7 +235,8 @@ record_btrace_open (const char *args, int from_tty)
 				  NULL);
   record_btrace_generating_corefile = 0;
 
-  observer_notify_record_changed (current_inferior (),  1);
+  format = record_btrace_conf.format == BTRACE_FORMAT_PT ? "pt" : "bts";
+  observer_notify_record_changed (current_inferior (), 1, "btrace", format);
 
   discard_cleanups (disable_chain);
 }
diff --git a/gdb/record-full.c b/gdb/record-full.c
index f307b48..0f61bcb 100644
--- a/gdb/record-full.c
+++ b/gdb/record-full.c
@@ -869,7 +869,7 @@ record_full_open (const char *name, int from_tty)
 
   record_full_init_record_breakpoints ();
 
-  observer_notify_record_changed (current_inferior (),  1);
+  observer_notify_record_changed (current_inferior (),  1, "full", NULL);
 }
 
 /* "to_close" target method.  Close the process record target.  */
diff --git a/gdb/record.c b/gdb/record.c
index 6190794..1af134f 100644
--- a/gdb/record.c
+++ b/gdb/record.c
@@ -268,7 +268,7 @@ cmd_record_stop (char *args, int from_tty)
   printf_unfiltered (_("Process record is stopped and all execution "
 		       "logs are deleted.\n"));
 
-  observer_notify_record_changed (current_inferior (), 0);
+  observer_notify_record_changed (current_inferior (), 0, NULL, NULL);
 }
 
 /* The "set record" command.  */
diff --git a/gdb/testsuite/gdb.mi/mi-record-changed.exp b/gdb/testsuite/gdb.mi/mi-record-changed.exp
index 2b5fcd6..22cf076 100644
--- a/gdb/testsuite/gdb.mi/mi-record-changed.exp
+++ b/gdb/testsuite/gdb.mi/mi-record-changed.exp
@@ -31,14 +31,14 @@ if [mi_gdb_start] {
 }
 mi_run_to_main
 
-mi_gdb_test "record" ".*=record-started,thread-group=\"i${decimal}\".*\\^done" \
+mi_gdb_test "record" ".*=record-started,thread-group=\"i${decimal}\",method=\"full\".*\\^done" \
     "record"
 mi_gdb_test "record stop" \
     ".*=record-stopped,thread-group=\"i${decimal}\".*\\^done" \
     "record end"
 
 mi_gdb_test "target record" \
-    ".*=record-started,thread-group=\"i${decimal}\".*\\^done" \
+    ".*=record-started,thread-group=\"i${decimal}\",method=\"full\".*\\^done" \
     "target record"
 
 return 0
