diff --git a/bits/endian.h b/bits/endian.h
deleted file mode 100644
index 45afd4ae47..0000000000
diff --git a/bits/endianness.h b/bits/endianness.h
new file mode 100644
index 0000000000..b83040ddec
--- /dev/null
+++ b/bits/endianness.h
@@ -0,0 +1,17 @@
+/* This file must be overridden for each supported CPU architecture.
+   It should define __BYTE_ORDER to one of the constants defined in
+   string/bits/endian.h, as appropriate for the machine in
+   question.  If floating-point quantities are not stored in the
+   same byte order as integer quantities, it should also define
+   __FLOAT_WORD_ORDER as appropriate.  */
+
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+#error "Machine byte order unknown."
+
+#endif /* bits/endianness.h */
diff --git a/ctype/ctype.h b/ctype/ctype.h
index 78a455e227..3d070d71bf 100644
--- a/ctype/ctype.h
+++ b/ctype/ctype.h
@@ -36,7 +36,7 @@ __BEGIN_DECLS
    endian).  We define the bit value interpretations here dependent on the
    machine's byte order.  */
 
-# include <endian.h>
+# include <bits/endian.h>
 # if __BYTE_ORDER == __BIG_ENDIAN
 #  define _ISbit(bit)	(1 << (bit))
 # else /* __BYTE_ORDER == __LITTLE_ENDIAN */
diff --git a/include/bits/endian.h b/include/bits/endian.h
new file mode 100644
index 0000000000..ad614f1c1a
--- /dev/null
+++ b/include/bits/endian.h
@@ -0,0 +1 @@
+#include <string/bits/endian.h>
diff --git a/inet/netinet/in.h b/inet/netinet/in.h
index 24caf3c77d..b411ba939c 100644
--- a/inet/netinet/in.h
+++ b/inet/netinet/in.h
@@ -380,9 +380,9 @@ extern uint32_t htonl (uint32_t __hostlong)
 extern uint16_t htons (uint16_t __hostshort)
      __THROW __attribute__ ((__const__));
 
-#include <endian.h>
 
 /* Get machine dependent optimized versions of byte swapping functions.  */
+#include <bits/endian.h>
 #include <bits/byteswap.h>
 #include <bits/uintn-identity.h>
 
diff --git a/resolv/arpa/nameser_compat.h b/resolv/arpa/nameser_compat.h
index f1c390f3b9..37c178b524 100644
--- a/resolv/arpa/nameser_compat.h
+++ b/resolv/arpa/nameser_compat.h
@@ -29,7 +29,7 @@
 #ifndef _ARPA_NAMESER_COMPAT_
 #define	_ARPA_NAMESER_COMPAT_
 
-#include <endian.h>
+#include <bits/endian.h>
 
 /*%
  * Structure for query header.  The order of the fields is machine- and
diff --git a/scripts/check-obsolete-constructs.py b/scripts/check-obsolete-constructs.py
index e383a304db..4ef5775932 100755
--- a/scripts/check-obsolete-constructs.py
+++ b/scripts/check-obsolete-constructs.py
@@ -511,7 +511,6 @@ HEADER_ALLOWED_INCLUDES = {
     # mandated: inttypes.h -> stdint.h
     #           tgmath.h   -> complex.h, math.h
     #           threads.h  -> time.h
-    "ctype.h":                     [ "endian.h" ],
     "inttypes.h":                  [ "stdint.h" ],
     "signal.h":                    [ "sys/ucontext.h" ],
     "stdlib.h":                    [ "alloca.h", "sys/types.h" ],
@@ -557,7 +556,7 @@ HEADER_ALLOWED_INCLUDES = {
     "netdb.h":                     [ "netinet/in.h", "rpc/netdb.h" ],
     "arpa/inet.h":                 [ "netinet/in.h" ],
     "net/if.h":                    [ "sys/socket.h", "sys/types.h" ],
-    "netinet/in.h":                [ "endian.h", "sys/socket.h" ],
+    "netinet/in.h":                [ "sys/socket.h" ],
     "netinet/tcp.h":               [ "stdint.h", "sys/socket.h",
                                      "sys/types.h" ],
 
@@ -570,7 +569,7 @@ HEADER_ALLOWED_INCLUDES = {
     "envz.h":                      [ "argz.h", "errno.h" ],
     "fts.h":                       [ "sys/types.h" ],
     "gshadow.h":                   [ "paths.h" ],
-    "ieee754.h":                   [ "endian.h", "float.h" ],
+    "ieee754.h":                   [ "float.h" ],
     "lastlog.h":                   [ "utmp.h" ],
     "libintl.h":                   [ "locale.h" ],
     "link.h":                      [ "dlfcn.h", "elf.h", "sys/types.h" ],
@@ -651,7 +650,6 @@ HEADER_ALLOWED_INCLUDES = {
 
     "arpa/nameser.h":              [ "arpa/nameser_compat.h", "stdint.h",
                                      "sys/param.h", "sys/types.h" ],
-    "arpa/nameser_compat.h":       [ "endian.h" ],
     "net/ethernet.h":              [ "stdint.h", "sys/types.h",
                                      "net/if_ether.h" ],
     "net/if_arp.h":                [ "stdint.h", "sys/socket.h",
@@ -693,15 +691,11 @@ HEADER_ALLOWED_INCLUDES = {
     "bits/fcntl.h":                [ "sys/types.h" ],
     "bits/ipc.h":                  [ "sys/types.h" ],
     "bits/procfs.h":               [ "signal.h", "sys/ucontext.h" ],
-    "bits/pthreadtypes-arch.h":    [ "endian.h" ],
     "bits/sem.h":                  [ "sys/types.h" ],
     "bits/socket.h":               [ "sys/types.h" ],
-    "bits/stat.h":                 [ "endian.h" ],
-    "bits/statfs.h":               [ "endian.h" ],
     "bits/types/res_state.h":      [ "netinet/in.h", "sys/types.h" ],
     "bits/utmp.h":                 [ "paths.h", "sys/time.h", "sys/types.h" ],
     "bits/utmpx.h":                [ "paths.h", "sys/time.h" ],
-    "bits/wctype-wchar.h":         [ "endian.h" ],
 }
 
 # As above, but each group of whitelist entries is only used for
diff --git a/string/Makefile b/string/Makefile
index 38b26a0f8e..3e5721e0f4 100644
--- a/string/Makefile
+++ b/string/Makefile
@@ -25,7 +25,8 @@ include ../Makeconfig
 headers		:= string.h bits/string_fortified.h			\
 		   strings.h bits/strings_fortified.h			\
 		   byteswap.h bits/byteswap.h				\
-		   endian.h bits/endian.h bits/uintn-identity.h		\
+		   endian.h bits/endian.h bits/endianness.h		\
+		   bits/uintn-identity.h				\
 		   memory.h argz.h envz.h
 
 routines	:= strcat strchr strcmp strcoll strcpy strcspn		\
diff --git a/string/bits/endian.h b/string/bits/endian.h
new file mode 100644
index 0000000000..ed2ee578c3
--- /dev/null
+++ b/string/bits/endian.h
@@ -0,0 +1,48 @@
+/* Copyright (C) 1992-2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _BITS_ENDIAN_H
+#define _BITS_ENDIAN_H 1
+
+/* Definitions for byte order, according to significance of bytes,
+   from low addresses to high addresses.  The value is what you get by
+   putting '4' in the most significant byte, '3' in the second most
+   significant byte, '2' in the second least significant byte, and '1'
+   in the least significant byte, and then writing down one digit for
+   each byte, starting with the byte at the lowest address at the left,
+   and proceeding to the byte with the highest address at the right.  */
+
+#define	__LITTLE_ENDIAN	1234
+#define	__BIG_ENDIAN	4321
+#define	__PDP_ENDIAN	3412
+
+/* This file defines `__BYTE_ORDER' for the particular machine.  */
+#include <bits/endianness.h>
+
+/* Some machines may need to use a different endianness for floating point
+   values.  */
+#ifndef __FLOAT_WORD_ORDER
+# define __FLOAT_WORD_ORDER __BYTE_ORDER
+#endif
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+# define __LONG_LONG_PAIR(HI, LO) LO, HI
+#elif __BYTE_ORDER == __BIG_ENDIAN
+# define __LONG_LONG_PAIR(HI, LO) HI, LO
+#endif
+
+#endif /* bits/endian.h */
diff --git a/string/endian.h b/string/endian.h
index e62b735625..9d6b10ce62 100644
--- a/string/endian.h
+++ b/string/endian.h
@@ -20,42 +20,15 @@
 
 #include <features.h>
 
-/* Definitions for byte order, according to significance of bytes,
-   from low addresses to high addresses.  The value is what you get by
-   putting '4' in the most significant byte, '3' in the second most
-   significant byte, '2' in the second least significant byte, and '1'
-   in the least significant byte, and then writing down one digit for
-   each byte, starting with the byte at the lowest address at the left,
-   and proceeding to the byte with the highest address at the right.  */
-
-#define	__LITTLE_ENDIAN	1234
-#define	__BIG_ENDIAN	4321
-#define	__PDP_ENDIAN	3412
-
-/* This file defines `__BYTE_ORDER' for the particular machine.  */
+/* Get the definitions of __*_ENDIAN, __BYTE_ORDER, and __FLOAT_WORD_ORDER.  */
 #include <bits/endian.h>
 
-/* Some machines may need to use a different endianness for floating point
-   values.  */
-#ifndef __FLOAT_WORD_ORDER
-# define __FLOAT_WORD_ORDER __BYTE_ORDER
-#endif
+#define LITTLE_ENDIAN	__LITTLE_ENDIAN
+#define BIG_ENDIAN	__BIG_ENDIAN
+#define PDP_ENDIAN	__PDP_ENDIAN
+#define BYTE_ORDER	__BYTE_ORDER
 
-#ifdef	__USE_MISC
-# define LITTLE_ENDIAN	__LITTLE_ENDIAN
-# define BIG_ENDIAN	__BIG_ENDIAN
-# define PDP_ENDIAN	__PDP_ENDIAN
-# define BYTE_ORDER	__BYTE_ORDER
-#endif
-
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-# define __LONG_LONG_PAIR(HI, LO) LO, HI
-#elif __BYTE_ORDER == __BIG_ENDIAN
-# define __LONG_LONG_PAIR(HI, LO) HI, LO
-#endif
-
-
-#if defined __USE_MISC && !defined __ASSEMBLER__
+#ifndef __ASSEMBLER__
 /* Conversion interfaces.  */
 # include <bits/byteswap.h>
 # include <bits/uintn-identity.h>
diff --git a/sysdeps/aarch64/bits/endian.h b/sysdeps/aarch64/bits/endian.h
deleted file mode 100644
index c0a40e082a..0000000000
diff --git a/sysdeps/aarch64/bits/endianness.h b/sysdeps/aarch64/bits/endianness.h
new file mode 100644
index 0000000000..300ebc8f9c
--- /dev/null
+++ b/sysdeps/aarch64/bits/endianness.h
@@ -0,0 +1,15 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* AArch64 has selectable endianness.  */
+#ifdef __AARCH64EB__
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h
index 8a2a5155db..5b05111be0 100644
--- a/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/aarch64/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #ifdef __ILP32__
 # define __SIZEOF_PTHREAD_ATTR_T        32
diff --git a/sysdeps/alpha/bits/endian.h b/sysdeps/alpha/bits/endian.h
deleted file mode 100644
index 8a16e14e24..0000000000
diff --git a/sysdeps/alpha/bits/endianness.h b/sysdeps/alpha/bits/endianness.h
new file mode 100644
index 0000000000..69f9a147f6
--- /dev/null
+++ b/sysdeps/alpha/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* Alpha is little-endian.  */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/arm/bits/endian.h b/sysdeps/arm/bits/endian.h
deleted file mode 100644
index f49f6ab1c9..0000000000
diff --git a/sysdeps/arm/bits/endianness.h b/sysdeps/arm/bits/endianness.h
new file mode 100644
index 0000000000..2d671fff66
--- /dev/null
+++ b/sysdeps/arm/bits/endianness.h
@@ -0,0 +1,15 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* ARM has selectable endianness.  */
+#ifdef __ARMEB__
+#define __BYTE_ORDER __BIG_ENDIAN
+#else
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h
index 332b288067..734828a0bb 100644
--- a/sysdeps/arm/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/arm/nptl/bits/pthreadtypes-arch.h
@@ -18,7 +18,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #define __SIZEOF_PTHREAD_ATTR_T 36
 #define __SIZEOF_PTHREAD_MUTEX_T 24
diff --git a/sysdeps/csky/bits/endian.h b/sysdeps/csky/bits/endian.h
deleted file mode 100644
index 51df38d8f9..0000000000
diff --git a/sysdeps/csky/bits/endianness.h b/sysdeps/csky/bits/endianness.h
new file mode 100644
index 0000000000..14652f5b37
--- /dev/null
+++ b/sysdeps/csky/bits/endianness.h
@@ -0,0 +1,15 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* C-SKY has selectable endianness.  */
+#ifdef __CSKYBE__
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/csky/nptl/bits/pthreadtypes-arch.h b/sysdeps/csky/nptl/bits/pthreadtypes-arch.h
index 5a49114eac..0f737a1654 100644
--- a/sysdeps/csky/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/csky/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #define __SIZEOF_PTHREAD_ATTR_T			36
 #define __SIZEOF_PTHREAD_MUTEX_T		24
diff --git a/sysdeps/hppa/bits/endian.h b/sysdeps/hppa/bits/endian.h
deleted file mode 100644
index 585db0c0fa..0000000000
diff --git a/sysdeps/hppa/bits/endianness.h b/sysdeps/hppa/bits/endianness.h
new file mode 100644
index 0000000000..96fd5ae5ef
--- /dev/null
+++ b/sysdeps/hppa/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* HP-PA is big-endian.  */
+#define __BYTE_ORDER __BIG_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/ia64/bits/endianness.h b/sysdeps/ia64/bits/endianness.h
new file mode 100644
index 0000000000..70c211e569
--- /dev/null
+++ b/sysdeps/ia64/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* IA64 is little-endian.  */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/ia64/ieee754.h b/sysdeps/ia64/ieee754.h
index 3c533812c5..f9ff748528 100644
--- a/sysdeps/ia64/ieee754.h
+++ b/sysdeps/ia64/ieee754.h
@@ -16,11 +16,11 @@
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/ieee754/ieee754.h b/sysdeps/ieee754/ieee754.h
index a88cbb6943..b457a10b41 100644
--- a/sysdeps/ieee754/ieee754.h
+++ b/sysdeps/ieee754/ieee754.h
@@ -16,11 +16,11 @@
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/ieee754/ldbl-128/ieee754.h b/sysdeps/ieee754/ldbl-128/ieee754.h
index 0f206db928..bda95aca4d 100644
--- a/sysdeps/ieee754/ldbl-128/ieee754.h
+++ b/sysdeps/ieee754/ldbl-128/ieee754.h
@@ -16,11 +16,11 @@
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/ieee754/ldbl-128ibm/ieee754.h b/sysdeps/ieee754/ldbl-128ibm/ieee754.h
index d0438c1bd5..eeb9d37e0c 100644
--- a/sysdeps/ieee754/ldbl-128ibm/ieee754.h
+++ b/sysdeps/ieee754/ldbl-128ibm/ieee754.h
@@ -16,11 +16,11 @@
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/m68k/bits/endian.h b/sysdeps/m68k/bits/endian.h
deleted file mode 100644
index bf4ecb60a4..0000000000
diff --git a/sysdeps/m68k/bits/endianness.h b/sysdeps/m68k/bits/endianness.h
new file mode 100644
index 0000000000..7e5f0d2969
--- /dev/null
+++ b/sysdeps/m68k/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* m68k is big-endian.  */
+#define __BYTE_ORDER __BIG_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h
index 731cdec69a..a8497d6816 100644
--- a/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/m68k/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #define __SIZEOF_PTHREAD_ATTR_T 36
 #define __SIZEOF_PTHREAD_MUTEX_T 24
diff --git a/sysdeps/microblaze/bits/endian.h b/sysdeps/microblaze/bits/endian.h
deleted file mode 100644
index 3650f3d564..0000000000
diff --git a/sysdeps/microblaze/bits/endianness.h b/sysdeps/microblaze/bits/endianness.h
new file mode 100644
index 0000000000..c4bb7e5f2e
--- /dev/null
+++ b/sysdeps/microblaze/bits/endianness.h
@@ -0,0 +1,15 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* MicroBlaze has selectable endianness.  */
+#ifdef _BIG_ENDIAN
+# define __BYTE_ORDER __BIG_ENDIAN
+#else
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h
index 838e71f4e1..77b4e6c3d2 100644
--- a/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/microblaze/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 # define _BITS_PTHREADTYPES_ARCH_H	1
 
-# include <endian.h>
+# include <bits/endian.h>
 
 # define __SIZEOF_PTHREAD_ATTR_T         36
 # define __SIZEOF_PTHREAD_MUTEX_T        24
diff --git a/sysdeps/mips/bits/endian.h b/sysdeps/mips/bits/endian.h
deleted file mode 100644
index 126059799d..0000000000
diff --git a/sysdeps/mips/bits/endianness.h b/sysdeps/mips/bits/endianness.h
new file mode 100644
index 0000000000..09e138b89b
--- /dev/null
+++ b/sysdeps/mips/bits/endianness.h
@@ -0,0 +1,16 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* MIPS has selectable endianness.  */
+#ifdef __MIPSEB
+# define __BYTE_ORDER __BIG_ENDIAN
+#endif
+#ifdef __MIPSEL
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/mips/ieee754/ieee754.h b/sysdeps/mips/ieee754/ieee754.h
index d5fb9fce47..e36ef0f5b8 100644
--- a/sysdeps/mips/ieee754/ieee754.h
+++ b/sysdeps/mips/ieee754/ieee754.h
@@ -16,13 +16,16 @@
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
-#include <float.h>
+#ifndef __LDBL_MANT_DIG__
+# include <float.h>
+# define __LDBL_MANT_DIG__ LDBL_MANT_DIG
+#endif
 
 __BEGIN_DECLS
 
@@ -127,7 +130,7 @@ union ieee754_double
 
 #define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
 
-#if LDBL_MANT_DIG == 113
+#if __LDBL_MANT_DIG__ == 113
 
 union ieee854_long_double
   {
@@ -184,7 +187,7 @@ union ieee854_long_double
 
 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent.  */
 
-#elif LDBL_MANT_DIG == 64
+#elif __LDBL_MANT_DIG__ == 64
 
 union ieee854_long_double
   {
@@ -253,7 +256,7 @@ union ieee854_long_double
 
 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff
 
-#elif LDBL_MANT_DIG == 53
+#elif __LDBL_MANT_DIG__ == 53
 
 union ieee854_long_double
   {
@@ -316,7 +319,7 @@ union ieee854_long_double
 
 #define IEEE854_LONG_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
 
-#endif /* LDBL_MANT_DIG == 53 */
+#endif /* __LDBL_MANT_DIG__ == 53 */
 
 __END_DECLS
 
diff --git a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h
index bebee00258..bf69766897 100644
--- a/sysdeps/mips/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/mips/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #if _MIPS_SIM == _ABI64
 # define __SIZEOF_PTHREAD_ATTR_T 56
diff --git a/sysdeps/nios2/bits/endian.h b/sysdeps/nios2/bits/endian.h
deleted file mode 100644
index 164f9e4d78..0000000000
diff --git a/sysdeps/nios2/bits/endianness.h b/sysdeps/nios2/bits/endianness.h
new file mode 100644
index 0000000000..87e66ebd71
--- /dev/null
+++ b/sysdeps/nios2/bits/endianness.h
@@ -0,0 +1,16 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* Nios II has selectable endianness.  */
+#ifdef __nios2_big_endian__
+# define __BYTE_ORDER __BIG_ENDIAN
+#endif
+#ifdef __nios2_little_endian__
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h
index 1091e63eac..459c8bcee0 100644
--- a/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/nios2/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #define __SIZEOF_PTHREAD_ATTR_T 36
 #define __SIZEOF_PTHREAD_MUTEX_T 24
diff --git a/sysdeps/nptl/pthread.h b/sysdeps/nptl/pthread.h
index 704a3c48d6..e5a7efcb1d 100644
--- a/sysdeps/nptl/pthread.h
+++ b/sysdeps/nptl/pthread.h
@@ -19,10 +19,10 @@
 #define _PTHREAD_H	1
 
 #include <features.h>
-#include <endian.h>
 #include <sched.h>
 #include <time.h>
 
+#include <bits/endian.h>
 #include <bits/pthreadtypes.h>
 #include <bits/setjmp.h>
 #include <bits/wordsize.h>
diff --git a/sysdeps/powerpc/bits/endian.h b/sysdeps/powerpc/bits/endian.h
deleted file mode 100644
index cd8ae4fc50..0000000000
diff --git a/sysdeps/powerpc/bits/endianness.h b/sysdeps/powerpc/bits/endianness.h
new file mode 100644
index 0000000000..3e7735237e
--- /dev/null
+++ b/sysdeps/powerpc/bits/endianness.h
@@ -0,0 +1,16 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* PowerPC has selectable endianness.  */
+#if defined __BIG_ENDIAN__ || defined _BIG_ENDIAN
+# define __BYTE_ORDER __BIG_ENDIAN
+#endif
+#if defined __LITTLE_ENDIAN__ || defined _LITTLE_ENDIAN
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/riscv/bits/endian.h b/sysdeps/riscv/bits/endian.h
deleted file mode 100644
index 4aaf559d4f..0000000000
diff --git a/sysdeps/riscv/bits/endianness.h b/sysdeps/riscv/bits/endianness.h
new file mode 100644
index 0000000000..952d08595a
--- /dev/null
+++ b/sysdeps/riscv/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* RISC-V is little-endian.  */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/riscv/nptl/bits/pthreadtypes-arch.h b/sysdeps/riscv/nptl/bits/pthreadtypes-arch.h
index e3fecc3208..22dc949158 100644
--- a/sysdeps/riscv/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/riscv/nptl/bits/pthreadtypes-arch.h
@@ -19,7 +19,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #if __riscv_xlen == 64
 # define __SIZEOF_PTHREAD_ATTR_T 		56
diff --git a/sysdeps/s390/bits/endian.h b/sysdeps/s390/bits/endian.h
deleted file mode 100644
index ac27f0119a..0000000000
diff --git a/sysdeps/s390/bits/endianness.h b/sysdeps/s390/bits/endianness.h
new file mode 100644
index 0000000000..c2d34e1c3e
--- /dev/null
+++ b/sysdeps/s390/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* S/390 is big-endian.  */
+#define __BYTE_ORDER __BIG_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/sh/bits/endian.h b/sysdeps/sh/bits/endian.h
deleted file mode 100644
index 1fef1ff938..0000000000
diff --git a/sysdeps/sh/bits/endianness.h b/sysdeps/sh/bits/endianness.h
new file mode 100644
index 0000000000..45c7c83a63
--- /dev/null
+++ b/sysdeps/sh/bits/endianness.h
@@ -0,0 +1,15 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* SH has selectable endianness.  */
+#ifdef __LITTLE_ENDIAN__
+#define __BYTE_ORDER __LITTLE_ENDIAN
+#else
+#define __BYTE_ORDER __BIG_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h
index 64d9d43b3a..3e2d826b56 100644
--- a/sysdeps/sh/nptl/bits/pthreadtypes-arch.h
+++ b/sysdeps/sh/nptl/bits/pthreadtypes-arch.h
@@ -18,7 +18,7 @@
 #ifndef _BITS_PTHREADTYPES_ARCH_H
 #define _BITS_PTHREADTYPES_ARCH_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 
 #define __SIZEOF_PTHREAD_ATTR_T 36
 #define __SIZEOF_PTHREAD_MUTEX_T 24
diff --git a/sysdeps/sparc/bits/endian.h b/sysdeps/sparc/bits/endian.h
deleted file mode 100644
index 8acfdf5df6..0000000000
diff --git a/sysdeps/sparc/bits/endianness.h b/sysdeps/sparc/bits/endianness.h
new file mode 100644
index 0000000000..0b6f5bf8b2
--- /dev/null
+++ b/sysdeps/sparc/bits/endianness.h
@@ -0,0 +1,16 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* Sparc is big-endian, but v9 supports endian conversion on loads/stores
+   and GCC supports such a mode.  Be prepared.  */
+#ifdef __LITTLE_ENDIAN__
+# define __BYTE_ORDER __LITTLE_ENDIAN
+#else
+# define __BYTE_ORDER __BIG_ENDIAN
+#endif
+
+#endif /* bits/endianness.h */
diff --git a/sysdeps/sparc/sparc32/ieee754.h b/sysdeps/sparc/sparc32/ieee754.h
index 0f206db928..bda95aca4d 100644
--- a/sysdeps/sparc/sparc32/ieee754.h
+++ b/sysdeps/sparc/sparc32/ieee754.h
@@ -16,11 +16,11 @@
    <http://www.gnu.org/licenses/>.  */
 
 #ifndef _IEEE754_H
-
 #define _IEEE754_H 1
+
 #include <features.h>
 
-#include <endian.h>
+#include <bits/endian.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/unix/sysv/linux/generic/bits/stat.h b/sysdeps/unix/sysv/linux/generic/bits/stat.h
index e5c2650104..2570c8374a 100644
--- a/sysdeps/unix/sysv/linux/generic/bits/stat.h
+++ b/sysdeps/unix/sysv/linux/generic/bits/stat.h
@@ -23,7 +23,7 @@
 #ifndef _BITS_STAT_H
 #define _BITS_STAT_H	1
 
-#include <endian.h>
+#include <bits/endian.h>
 #include <bits/wordsize.h>
 
 /* 64-bit libc uses the kernel's 'struct stat', accessed via the
diff --git a/sysdeps/unix/sysv/linux/generic/bits/statfs.h b/sysdeps/unix/sysv/linux/generic/bits/statfs.h
index 77de4d2fd0..c85187a1de 100644
--- a/sysdeps/unix/sysv/linux/generic/bits/statfs.h
+++ b/sysdeps/unix/sysv/linux/generic/bits/statfs.h
@@ -20,7 +20,7 @@
 # error "Never include <bits/statfs.h> directly; use <sys/statfs.h> instead."
 #endif
 
-#include <endian.h>
+#include <bits/endian.h>
 #include <bits/types.h>
 #include <bits/wordsize.h>
 
diff --git a/sysdeps/unix/sysv/linux/hppa/pthread.h b/sysdeps/unix/sysv/linux/hppa/pthread.h
index 45e706c037..78dad4faca 100644
--- a/sysdeps/unix/sysv/linux/hppa/pthread.h
+++ b/sysdeps/unix/sysv/linux/hppa/pthread.h
@@ -19,7 +19,6 @@
 #define _PTHREAD_H	1
 
 #include <features.h>
-#include <endian.h>
 #include <sched.h>
 #include <time.h>
 
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/endian.h b/sysdeps/unix/sysv/linux/ia64/bits/endian.h
deleted file mode 100644
index 98a5e23991..0000000000
diff --git a/sysdeps/unix/sysv/linux/powerpc/htm.h b/sysdeps/unix/sysv/linux/powerpc/htm.h
index 93b6d403b1..f17c979ff0 100644
--- a/sysdeps/unix/sysv/linux/powerpc/htm.h
+++ b/sysdeps/unix/sysv/linux/powerpc/htm.h
@@ -50,7 +50,7 @@
 
 #else
 
-#include <endian.h>
+#include <bits/endian.h>
 
 /* Official HTM intrinsics interface matching GCC, but works
    on older GCC compatible compilers and binutils.
diff --git a/sysdeps/unix/sysv/linux/sys/acct.h b/sysdeps/unix/sysv/linux/sys/acct.h
index 619824fe4b..4c119dafd2 100644
--- a/sysdeps/unix/sysv/linux/sys/acct.h
+++ b/sysdeps/unix/sysv/linux/sys/acct.h
@@ -20,7 +20,7 @@
 
 #include <sys/types.h>
 #include <stdint.h>
-#include <endian.h>
+#include <bits/endian.h>
 #include <bits/types/time_t.h>
 
 __BEGIN_DECLS
diff --git a/sysdeps/x86/bits/endian.h b/sysdeps/x86/bits/endian.h
deleted file mode 100644
index 5a56c726f7..0000000000
diff --git a/sysdeps/x86/bits/endianness.h b/sysdeps/x86/bits/endianness.h
new file mode 100644
index 0000000000..962a9ae4d6
--- /dev/null
+++ b/sysdeps/x86/bits/endianness.h
@@ -0,0 +1,11 @@
+#ifndef _BITS_ENDIANNESS_H
+#define _BITS_ENDIANNESS_H 1
+
+#ifndef _BITS_ENDIAN_H
+# error "Never use <bits/endianness.h> directly; include <endian.h> instead."
+#endif
+
+/* i386/x86_64 are little-endian.  */
+#define __BYTE_ORDER __LITTLE_ENDIAN
+
+#endif /* bits/endianness.h */
diff --git a/wctype/bits/wctype-wchar.h b/wctype/bits/wctype-wchar.h
index 22ae0abdeb..f3851a7830 100644
--- a/wctype/bits/wctype-wchar.h
+++ b/wctype/bits/wctype-wchar.h
@@ -42,7 +42,7 @@ typedef unsigned long int wctype_t;
    endian).  We define the bit value interpretations here dependent on the
    machine's byte order.  */
 
-#  include <endian.h>
+#  include <bits/endian.h>
 #  if __BYTE_ORDER == __BIG_ENDIAN
 #   define _ISwbit(bit)	(1 << (bit))
 #  else /* __BYTE_ORDER == __LITTLE_ENDIAN */
