diff --git a/Doc/library/faulthandler.rst b/Doc/library/faulthandler.rst
index c0b6625..0c00f8f 100644
--- a/Doc/library/faulthandler.rst
+++ b/Doc/library/faulthandler.rst
@@ -36,21 +36,22 @@
 Dump the traceback
 ------------------
 
-.. function:: dump_traceback(file=sys.stderr, all_threads=False)
+.. function:: dump_traceback(file=sys.stderr, all_threads=True)
 
-   Dump the traceback of the current thread, or of all threads if *all_threads*
-   is ``True``, into *file*.
+   Dump the traceback of all threads, or of the current thread if *all_threads*
+   is ``False``, into *file*.
 
 
 Fault handler state
 -------------------
 
-.. function:: enable(file=sys.stderr, all_threads=False)
+.. function:: enable(file=sys.stderr, all_threads=True)
 
    Enable the fault handler: install handlers for :const:`SIGSEGV`,
    :const:`SIGFPE`, :const:`SIGABRT`, :const:`SIGBUS` and :const:`SIGILL`
-   signals to dump the Python traceback. It dumps the traceback of the current
-   thread, or all threads if *all_threads* is ``True``, into *file*.
+   signals to dump the Python traceback. It dumps the traceback of the all
+   threads, or of the current thread if *all_threads* is ``False``, into
+   *file*.
 
 .. function:: disable()
 
@@ -86,11 +87,11 @@
 Dump the traceback on a user signal
 -----------------------------------
 
-.. function:: register(signum, file=sys.stderr, all_threads=False)
+.. function:: register(signum, file=sys.stderr, all_threads=True)
 
    Register a user signal: install a handler for the *signum* signal to dump
-   the traceback of the current thread, or of all threads if *all_threads* is
-   ``True``, into *file*.
+   the traceback of all threads, or of the current thread if *all_threads* is
+   ``False``, into *file*.
 
    Not available on Windows.
 
@@ -123,7 +124,7 @@
     >>> ctypes.string_at(0)
     Fatal Python error: Segmentation fault
 
-    Traceback (most recent call first):
+    Current thread 0x00007fb899f39700:
       File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
       File "<stdin>", line 1 in <module>
     Segmentation fault
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index d08347d..dbc1917 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -75,7 +75,7 @@
         return output.splitlines(), exitcode
 
     def check_fatal_error(self, code, line_number, name_regex,
-                          filename=None, all_threads=False, other_regex=None):
+                          filename=None, all_threads=True, other_regex=None):
         """
         Check that the fault handler for fatal errors is enabled and check the
         traceback from the child process output.
@@ -204,15 +204,15 @@
                 '(?:Segmentation fault|Bus error)',
                 filename=filename)
 
-    def test_enable_threads(self):
+    def test_enable_single_thread(self):
         self.check_fatal_error("""
 import faulthandler
-faulthandler.enable(all_threads=True)
+faulthandler.enable(all_threads=False)
 faulthandler._read_null()
 """.strip(),
             3,
             '(?:Segmentation fault|Bus error)',
-            all_threads=True)
+            all_threads=False)
 
     def test_disable(self):
         code = """
@@ -252,9 +252,9 @@
 def funcB():
     if {has_filename}:
         with open({filename}, "wb") as fp:
-            faulthandler.dump_traceback(fp)
+            faulthandler.dump_traceback(fp, all_threads=False)
     else:
-        faulthandler.dump_traceback()
+        faulthandler.dump_traceback(all_threads=False)
 
 def funcA():
     funcB()
diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c
index 8f83ab8..6041485 100644
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -186,7 +186,7 @@
 {
     static char *kwlist[] = {"file", "all_threads", NULL};
     PyObject *file = NULL;
-    int all_threads = 0;
+    int all_threads = 1;
     PyThreadState *tstate;
     const char *errmsg;
     int fd;
@@ -306,7 +306,7 @@
 {
     static char *kwlist[] = {"file", "all_threads", NULL};
     PyObject *file = NULL;
-    int all_threads = 0;
+    int all_threads = 1;
     unsigned int i;
     fault_handler_t *handler;
 #ifdef HAVE_SIGACTION
@@ -648,7 +648,7 @@
     static char *kwlist[] = {"signum", "file", "all_threads", NULL};
     int signum;
     PyObject *file = NULL;
-    int all_threads = 0;
+    int all_threads = 1;
     int fd;
     user_signal_t *user;
     _Py_sighandler_t previous;
@@ -916,7 +916,7 @@
 static PyMethodDef module_methods[] = {
     {"enable",
      (PyCFunction)faulthandler_enable, METH_VARARGS|METH_KEYWORDS,
-     PyDoc_STR("enable(file=sys.stderr, all_threads=False): "
+     PyDoc_STR("enable(file=sys.stderr, all_threads=True): "
                "enable the fault handler")},
     {"disable", (PyCFunction)faulthandler_disable_py, METH_NOARGS,
      PyDoc_STR("disable(): disable the fault handler")},
@@ -924,7 +924,7 @@
      PyDoc_STR("is_enabled()->bool: check if the handler is enabled")},
     {"dump_traceback",
      (PyCFunction)faulthandler_dump_traceback_py, METH_VARARGS|METH_KEYWORDS,
-     PyDoc_STR("dump_traceback(file=sys.stderr, all_threads=False): "
+     PyDoc_STR("dump_traceback(file=sys.stderr, all_threads=True): "
                "dump the traceback of the current thread, or of all threads "
                "if all_threads is True, into file")},
 #ifdef FAULTHANDLER_LATER
@@ -943,7 +943,7 @@
 #ifdef FAULTHANDLER_USER
     {"register",
      (PyCFunction)faulthandler_register, METH_VARARGS|METH_KEYWORDS,
-     PyDoc_STR("register(signum, file=sys.stderr, all_threads=False): "
+     PyDoc_STR("register(signum, file=sys.stderr, all_threads=True): "
                "register an handler for the signal 'signum': dump the "
                "traceback of the current thread, or of all threads if "
                "all_threads is True, into file")},
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index ebc4f1c..6ebc823 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -2144,7 +2144,7 @@
         if (tstate != NULL) {
             fputc('\n', stderr);
             fflush(stderr);
-            _Py_DumpTraceback(fd, tstate);
+            _Py_DumpTracebackThreads(fd, tstate->interp, tstate);
         }
         _PyFaulthandler_Fini();
     }
