diff --git a/sysdeps/generic/sys/ucontext.h b/bits/ucontext.h
similarity index 95%
rename from sysdeps/generic/sys/ucontext.h
rename to bits/ucontext.h
index b09bdf6743..5d8ec3469a 100644
--- a/sysdeps/generic/sys/ucontext.h
+++ b/bits/ucontext.h
@@ -21,8 +21,8 @@
    use of struct sigcontext does not conform to POSIX namespace
    requirements.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -51,4 +51,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/include/sys/ucontext.h b/include/sys/ucontext.h
new file mode 100644
index 0000000000..1450bae8f3
--- /dev/null
+++ b/include/sys/ucontext.h
@@ -0,0 +1 @@
+#include <stdlib/sys/ucontext.h>
diff --git a/scripts/check-obsolete-constructs.py b/scripts/check-obsolete-constructs.py
index 95360158b5..997b73bc36 100755
--- a/scripts/check-obsolete-constructs.py
+++ b/scripts/check-obsolete-constructs.py
@@ -504,24 +504,25 @@ HEADER_ALLOWED_INCLUDES = {
     #           tgmath.h   -> complex.h, math.h
     #           threads.h  -> time.h
     "inttypes.h":                  [ "stdint.h" ],
-    "signal.h":                    [ "sys/ucontext.h" ],
-    "stdlib.h":                    [ "alloca.h", "sys/types.h" ],
     "tgmath.h":                    [ "complex.h", "math.h" ],
     "threads.h":                   [ "time.h" ],
+    # necessary for backward compatibility with old GNU extensions
+    "stdlib.h":                    [ "alloca.h", "sys/types.h" ],
 
     # POSIX top-level headers
     # mandated: pthread.h -> sched.h, time.h
+    "pthread.h":                   [ "sched.h", "time.h" ],
     # allowed:  ftw.h -> sys/stat.h
     #           mqueue.h -> fcntl.h
     #           sched.h -> time.h
     #           spawn.h -> sched.h
     "ftw.h":                       [ "sys/stat.h" ],
-    "langinfo.h":                  [ "nl_types.h" ],
     "mqueue.h":                    [ "fcntl.h" ],
-    "pthread.h":                   [ "sched.h", "time.h" ],
-    "regex.h":                     [ "limits.h", "sys/types.h" ],
     "sched.h":                     [ "time.h" ],
     "spawn.h":                     [ "sched.h" ],
+    # not yet analyzed
+    "langinfo.h":                  [ "nl_types.h" ],
+    "regex.h":                     [ "limits.h", "sys/types.h" ],
     "termios.h":                   [ "sys/ttydefaults.h" ],
     "utmpx.h":                     [ "paths.h" ],
 
@@ -562,7 +563,6 @@ HEADER_ALLOWED_INCLUDES = {
     "shadow.h":                    [ "paths.h" ],
     "stdio_ext.h":                 [ "stdio.h" ],
     "thread_db.h":                 [ "pthread.h", "stdint.h", "sys/procfs.h" ],
-    "ucontext.h":                  [ "sys/ucontext.h" ],
     "utmp.h":                      [ "paths.h" ],
     "values.h":                    [ "float.h", "limits.h" ],
 
@@ -574,12 +574,10 @@ HEADER_ALLOWED_INCLUDES = {
     "sys/mount.h":                 [ "sys/ioctl.h" ],
     "sys/mtio.h":                  [ "sys/ioctl.h" ],
     "sys/param.h":                 [ "endian.h", "limits.h", "sys/types.h" ],
-    "sys/procfs.h":                [ "sys/ucontext.h", "sys/user.h" ],
-    "sys/ptrace.h":                [ "sys/ucontext.h" ],
+    "sys/procfs.h":                [ "sys/user.h" ],
     "sys/raw.h":                   [ "sys/ioctl.h" ],
     "sys/timerfd.h":               [ "time.h" ],
     "sys/ttychars.h":              [ "sys/ttydefaults.h" ],
-    "sys/ucontext.h":              [ "sys/procfs.h" ],
     "sys/vfs.h":                   [ "sys/statfs.h" ],
 
     # Nonstandardized headers that do nothing but include some other
@@ -597,6 +595,7 @@ HEADER_ALLOWED_INCLUDES = {
     "sys/socketvar.h":             [ "sys/socket.h" ],
     "sys/syslog.h":                [ "syslog.h" ],
     "sys/termios.h":               [ "termios.h" ],
+    "sys/ucontext.h":              [ "ucontext.h" ],
     "sys/unistd.h":                [ "unistd.h" ],
     "syscall.h":                   [ "sys/syscall.h" ],
     "termio.h":                    [ "sys/ioctl.h", "termios.h" ],
@@ -623,8 +622,6 @@ HEADER_ALLOWED_INCLUDES = {
     "features.h":                  [ "gnu/stubs.h", "stdc-predef.h",
                                      "sys/cdefs.h" ],
 
-    "bits/procfs.h":               [ "signal.h", "sys/ucontext.h" ],
-
     "bits/types/__va_list.h":      [ "stdarg.h" ],
     "bits/types/ptrdiff_t.h":      [ "stddef.h" ],
     "bits/types/size_t.h":         [ "stddef.h" ],
@@ -670,8 +667,8 @@ SYSDEP_ALLOWED_INCLUDES = {
         "bits/ioctls.h":           [ "asm/ioctls.h", "linux/sockios.h" ],
         "bits/local_lim.h":        [ "linux/limits.h" ],
         "bits/param.h":            [ "linux/limits.h", "linux/param.h" ],
-        "bits/procfs.h":           [ "asm/elf.h", "asm/ptrace.h" ],
-        "bits/procfs-prregset.h":  [ "sys/ucontext.h" ],
+        "bits/procfs.h":           [ "asm/elf.h", "asm/ptrace.h",
+                                     "sys/user.h" ],
         "bits/sigcontext.h":       [ "asm/sigcontext.h" ],
         "bits/socket.h":           [ "asm/socket.h" ],
     },
@@ -689,7 +686,6 @@ SYSDEP_ALLOWED_INCLUDES = {
         "sys/fpregdef.h":          [ "sgidefs.h" ],
         "sys/regdef.h":            [ "sgidefs.h" ],
         "sys/tas.h":               [ "sgidefs.h" ],
-        "sys/ucontext.h":          [ "sgidefs.h" ],
         "sys/user.h":              [ "sgidefs.h" ],
 
         "bits/fcntl.h":            [ "sgidefs.h" ],
@@ -699,6 +695,7 @@ SYSDEP_ALLOWED_INCLUDES = {
         "bits/setjmp.h":           [ "sgidefs.h" ],
         "bits/sigcontext.h":       [ "sgidefs.h" ],
         "bits/stat.h":             [ "sgidefs.h" ],
+        "bits/ucontext.h":         [ "sgidefs.h" ],
         "bits/wordsize.h":         [ "sgidefs.h" ],
     },
 }
diff --git a/signal/signal.h b/signal/signal.h
index 2c52466791..3ddd7ab9f4 100644
--- a/signal/signal.h
+++ b/signal/signal.h
@@ -293,7 +293,7 @@ extern int sigreturn (struct sigcontext *__scp) __THROW;
 # include <bits/types/stack_t.h>
 # if defined __USE_XOPEN || defined __USE_XOPEN2K8
 /* This will define `ucontext_t' and `mcontext_t'.  */
-#  include <sys/ucontext.h>
+#  include <bits/ucontext.h>
 # endif
 #endif /* Use POSIX.1-2008 or X/Open Unix.  */
 
diff --git a/stdlib/Makefile b/stdlib/Makefile
index fbf1b84a4b..41609a965a 100644
--- a/stdlib/Makefile
+++ b/stdlib/Makefile
@@ -26,7 +26,7 @@ headers	:= stdlib.h bits/stdlib.h bits/stdlib-ldbl.h bits/stdlib-float.h      \
 	   monetary.h bits/monetary-ldbl.h				      \
 	   inttypes.h stdint.h bits/wordsize.h bits/timesize.h		      \
 	   errno.h sys/errno.h bits/errno.h bits/types/error_t.h	      \
-	   ucontext.h sys/ucontext.h bits/indirect-return.h		      \
+	   ucontext.h sys/ucontext.h bits/ucontext.h bits/indirect-return.h   \
 	   alloca.h fmtmsg.h						      \
 	   bits/stdlib-bsearch.h sys/random.h bits/stdint-intn.h	      \
 	   bits/stdint-uintn.h bits/time64.h bits/NULL.h		      \
diff --git a/stdlib/sys/ucontext.h b/stdlib/sys/ucontext.h
new file mode 100644
index 0000000000..5fdbd63dbb
--- /dev/null
+++ b/stdlib/sys/ucontext.h
@@ -0,0 +1 @@
+#include <ucontext.h>
diff --git a/stdlib/ucontext.h b/stdlib/ucontext.h
index ab97224e1a..f12587a66e 100644
--- a/stdlib/ucontext.h
+++ b/stdlib/ucontext.h
@@ -26,7 +26,7 @@
 #include <bits/indirect-return.h>
 
 /* Get machine dependent definition of data structures.  */
-#include <sys/ucontext.h>
+#include <bits/ucontext.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/arm/sys/ucontext.h b/sysdeps/arm/bits/ucontext.h
similarity index 96%
rename from sysdeps/arm/sys/ucontext.h
rename to sysdeps/arm/bits/ucontext.h
index bf210f0cc5..0436adb478 100644
--- a/sysdeps/arm/sys/ucontext.h
+++ b/sysdeps/arm/bits/ucontext.h
@@ -17,8 +17,8 @@
 
 /* System V/ARM ABI compliant context switching support.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -107,4 +107,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/i386/sys/ucontext.h b/sysdeps/i386/bits/ucontext.h
similarity index 97%
rename from sysdeps/i386/sys/ucontext.h
rename to sysdeps/i386/bits/ucontext.h
index b1a5ab9156..74fd0e02d3 100644
--- a/sysdeps/i386/sys/ucontext.h
+++ b/sysdeps/i386/bits/ucontext.h
@@ -17,8 +17,8 @@
 
 /* System V/i386 ABI compliant context switching support.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -135,4 +135,4 @@ typedef struct ucontext_t
 #undef __ctx
 #undef __ctxt
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/m68k/sys/ucontext.h b/sysdeps/m68k/bits/ucontext.h
similarity index 96%
rename from sysdeps/m68k/sys/ucontext.h
rename to sysdeps/m68k/bits/ucontext.h
index 2204cae370..9e50996b68 100644
--- a/sysdeps/m68k/sys/ucontext.h
+++ b/sysdeps/m68k/bits/ucontext.h
@@ -17,8 +17,8 @@
 
 /* System V/m68k ABI compliant context switching support.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -122,4 +122,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/mips/sys/ucontext.h b/sysdeps/mips/bits/ucontext.h
similarity index 97%
rename from sysdeps/mips/sys/ucontext.h
rename to sysdeps/mips/bits/ucontext.h
index e5bbb46670..411f8419c3 100644
--- a/sysdeps/mips/sys/ucontext.h
+++ b/sysdeps/mips/bits/ucontext.h
@@ -17,8 +17,8 @@
 
 /* System V/mips ABI compliant context switching support.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -173,4 +173,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/aarch64/bits/procfs.h b/sysdeps/unix/sysv/linux/aarch64/bits/procfs.h
index fec2f6a266..9603b025c7 100644
--- a/sysdeps/unix/sysv/linux/aarch64/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/aarch64/bits/procfs.h
@@ -20,11 +20,12 @@
 #ifndef _BITS_PROCFS_H
 #define _BITS_PROCFS_H 1
 
-#ifndef _SYS_PROCFS_H
+#if !defined _SYS_PROCFS_H && !defined _BITS_UCONTEXT_H
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
 #include <bits/types.h>
+#include <sys/user.h>
 
 /* Type for a general-purpose register.  */
 typedef __uint64_t elf_greg_t;
diff --git a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h b/sysdeps/unix/sysv/linux/aarch64/bits/ucontext.h
similarity index 95%
rename from sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/aarch64/bits/ucontext.h
index 140d4b3fc8..7be5302038 100644
--- a/sysdeps/unix/sysv/linux/aarch64/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/aarch64/bits/ucontext.h
@@ -18,8 +18,8 @@
 
 /* System V/AArch64 ABI compliant context switching support.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -33,7 +33,7 @@
 #endif
 
 #ifdef __USE_MISC
-# include <sys/procfs.h>
+# include <bits/procfs.h>
 
 
 typedef elf_greg_t greg_t;
@@ -75,4 +75,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h b/sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h
index a0b0002c3d..fa0483f5f9 100644
--- a/sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/aarch64/sigcontextinfo.h
@@ -17,7 +17,7 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <stdint.h>
-#include <sys/ucontext.h>
+#include <signal.h>
 
 #define SIGCONTEXT siginfo_t *_si, ucontext_t *
 #define GET_PC(ctx) ((void *) (uintptr_t) (ctx)->uc_mcontext.pc)
diff --git a/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym b/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym
index ab3930c173..7d5c4a1117 100644
--- a/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/aarch64/ucontext_i.sym
@@ -1,8 +1,5 @@
-#include <inttypes.h>
-#include <signal.h>
 #include <stddef.h>
-#include <sys/ucontext.h>
-#include <asm/sigcontext.h>
+#include <signal.h>
 
 #include "kernel_rt_sigframe.h"
 
diff --git a/sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h b/sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h
index 58b015fbc6..33bc086b89 100644
--- a/sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h
+++ b/sysdeps/unix/sysv/linux/alpha/bits/procfs-prregset.h
@@ -25,8 +25,8 @@
 #endif
 
 /* For gregset_t and fpregset_t.  FIXME: sys/procfs.h should not
-   expose all of sys/ucontext.h.  */
-#include <sys/ucontext.h>
+   expose all of bits/ucontext.h.  */
+#include <bits/ucontext.h>
 
 typedef gregset_t __prgregset_t;
 typedef fpregset_t __prfpregset_t;
diff --git a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h b/sysdeps/unix/sysv/linux/alpha/bits/ucontext.h
similarity index 96%
rename from sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/alpha/bits/ucontext.h
index d2f93da8a7..284911797e 100644
--- a/sysdeps/unix/sysv/linux/alpha/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/alpha/bits/ucontext.h
@@ -15,8 +15,8 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -91,4 +91,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym b/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym
index 9e86f8a7ca..f57c779f5b 100644
--- a/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym
+++ b/sysdeps/unix/sysv/linux/alpha/ucontext-offsets.sym
@@ -1,5 +1,5 @@
 #include <stddef.h>
-#include <sys/ucontext.h>
+#include <signal.h>
 
 --
 UC_LINK		offsetof (ucontext_t, uc_link)
diff --git a/sysdeps/unix/sysv/linux/arm/sys/ucontext.h b/sysdeps/unix/sysv/linux/arm/bits/ucontext.h
similarity index 97%
rename from sysdeps/unix/sysv/linux/arm/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/arm/bits/ucontext.h
index 76ea4dc343..60c72891c9 100644
--- a/sysdeps/unix/sysv/linux/arm/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/arm/bits/ucontext.h
@@ -17,8 +17,8 @@
 
 /* System V/ARM ABI compliant context switching support.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -141,4 +141,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/arm/register-dump.h b/sysdeps/unix/sysv/linux/arm/register-dump.h
index 44c69a2552..f702c591fa 100644
--- a/sysdeps/unix/sysv/linux/arm/register-dump.h
+++ b/sysdeps/unix/sysv/linux/arm/register-dump.h
@@ -19,7 +19,7 @@
 
 #include <sys/uio.h>
 #include <_itoa.h>
-#include <sys/ucontext.h>
+#include <ucontext.h>
 
 /* We will print the register dump in this format:
 
diff --git a/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h b/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h
index 0bf3beaa0f..37049938b2 100644
--- a/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/arm/sigcontextinfo.h
@@ -16,7 +16,7 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <sys/ucontext.h>
+#include <signal.h>
 
 #define SIGCONTEXT siginfo_t *_si, ucontext_t *
 
diff --git a/sysdeps/unix/sysv/linux/arm/ucontext_i.sym b/sysdeps/unix/sysv/linux/arm/ucontext_i.sym
index 306292f1f8..ccf555d2ab 100644
--- a/sysdeps/unix/sysv/linux/arm/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/arm/ucontext_i.sym
@@ -1,7 +1,5 @@
-#include <inttypes.h>
-#include <signal.h>
 #include <stddef.h>
-#include <sys/ucontext.h>
+#include <signal.h>
 
 SIG_BLOCK
 SIG_SETMASK
diff --git a/sysdeps/unix/sysv/linux/csky/abiv2/ucontext_i.sym b/sysdeps/unix/sysv/linux/csky/abiv2/ucontext_i.sym
index 4581b65e49..0ee6dd0584 100644
--- a/sysdeps/unix/sysv/linux/csky/abiv2/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/csky/abiv2/ucontext_i.sym
@@ -1,7 +1,5 @@
-#include <inttypes.h>
-#include <signal.h>
 #include <stddef.h>
-#include <sys/ucontext.h>
+#include <signal.h>
 
 SIG_BLOCK
 SIG_SETMASK
diff --git a/sysdeps/unix/sysv/linux/csky/sys/ucontext.h b/sysdeps/unix/sysv/linux/csky/bits/ucontext.h
similarity index 96%
rename from sysdeps/unix/sysv/linux/csky/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/csky/bits/ucontext.h
index 5eac9e6494..90ee71bfd3 100644
--- a/sysdeps/unix/sysv/linux/csky/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/csky/bits/ucontext.h
@@ -16,8 +16,8 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -86,4 +86,4 @@ typedef struct ucontext_t
 #undef __ctx
 
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/csky/register-dump.h b/sysdeps/unix/sysv/linux/csky/register-dump.h
index 949618911e..47b273ba80 100644
--- a/sysdeps/unix/sysv/linux/csky/register-dump.h
+++ b/sysdeps/unix/sysv/linux/csky/register-dump.h
@@ -19,7 +19,7 @@
 #include <sys/uio.h>
 #include <_itoa.h>
 #include <bits/sigcontext.h>
-#include <sys/ucontext.h>
+#include <ucontext.h>
 
 /* abiv1 register dump in this format:
 
diff --git a/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h b/sysdeps/unix/sysv/linux/hppa/bits/ucontext.h
similarity index 96%
rename from sysdeps/unix/sysv/linux/hppa/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/hppa/bits/ucontext.h
index 9a55d93a06..fe8a82fddc 100644
--- a/sysdeps/unix/sysv/linux/hppa/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/hppa/bits/ucontext.h
@@ -17,8 +17,8 @@
 
 /* Don't rely on this, the interface is currently messed up and may need to
    be broken to be fixed.  */
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -79,4 +79,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/hppa/ucontext_i.sym b/sysdeps/unix/sysv/linux/hppa/ucontext_i.sym
index ee33029a07..1ec474c759 100644
--- a/sysdeps/unix/sysv/linux/hppa/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/hppa/ucontext_i.sym
@@ -1,6 +1,5 @@
 #include <stddef.h>
 #include <signal.h>
-#include <sys/ucontext.h>
 
 --
 
diff --git a/sysdeps/unix/sysv/linux/i386/ucontext_i.sym b/sysdeps/unix/sysv/linux/i386/ucontext_i.sym
index b11a5509cd..79d95709f2 100644
--- a/sysdeps/unix/sysv/linux/i386/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/i386/ucontext_i.sym
@@ -1,6 +1,5 @@
 #include <stddef.h>
 #include <signal.h>
-#include <sys/ucontext.h>
 
 --
 
diff --git a/sysdeps/unix/sysv/linux/ia64/Makefile b/sysdeps/unix/sysv/linux/ia64/Makefile
index 97fc7df0b1..36240a6057 100644
--- a/sysdeps/unix/sysv/linux/ia64/Makefile
+++ b/sysdeps/unix/sysv/linux/ia64/Makefile
@@ -1,5 +1,5 @@
-ifeq ($(subdir),misc)
-sysdep_headers += sys/rse.h
+ifeq ($(subdir),signal)
+sysdep_headers += bits/types/__ia64_fpreg.h
 endif
 
 ifeq ($(subdir),stdlib)
@@ -8,7 +8,7 @@ gen-as-const-headers += sigcontext-offsets.sym
 endif
 
 ifeq ($(subdir),misc)
-sysdep_headers += sys/io.h
+sysdep_headers += sys/io.h sys/rse.h
 sysdep_routines += ioperm clone2
 gen-as-const-headers += sigaltstack-offsets.sym
 endif
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/procfs.h b/sysdeps/unix/sysv/linux/ia64/bits/procfs.h
index 754e9690c9..def7e5b87f 100644
--- a/sysdeps/unix/sysv/linux/ia64/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/ia64/bits/procfs.h
@@ -23,10 +23,7 @@
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
-/* For struct __ia64_fpreg.  FIXME: sys/procfs.h should not expose all
-   of sys/ucontext.h.  */
-#include <sys/ucontext.h>
-#include <bits/sigcontext.h>
+#include <bits/types/__ia64_fpreg.h>
 
 /* We really need just 72 but let's leave some headroom...  */
 #define ELF_NGREG	128
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/sigcontext.h b/sysdeps/unix/sysv/linux/ia64/bits/sigcontext.h
index b1b45ee5de..54047467a9 100644
--- a/sysdeps/unix/sysv/linux/ia64/bits/sigcontext.h
+++ b/sysdeps/unix/sysv/linux/ia64/bits/sigcontext.h
@@ -26,17 +26,10 @@
 #include <bits/types/size_t.h>
 #include <bits/types/struct_sigstack.h>
 #include <bits/types/stack_t.h>
+#include <bits/types/__ia64_fpreg.h>
 #include <bits/sigstack.h>
 #include <bits/ss_flags.h>
 
-struct __ia64_fpreg
-  {
-    union
-      {
-	unsigned long bits[2];
-      } u;
-  } __attribute__ ((__aligned__ (16)));
-
 struct sigcontext
 {
   unsigned long int sc_flags;	/* see manifest constants below */
diff --git a/sysdeps/unix/sysv/linux/ia64/bits/types/__ia64_fpreg.h b/sysdeps/unix/sysv/linux/ia64/bits/types/__ia64_fpreg.h
new file mode 100644
index 0000000000..6d69586ab4
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/ia64/bits/types/__ia64_fpreg.h
@@ -0,0 +1,22 @@
+#ifndef ____ia64_fpreg_defined
+#define ____ia64_fpreg_defined
+
+#include <features.h>
+
+#ifdef __USE_MISC
+# define __ctx(fld) fld
+#else
+# define __ctx(fld) __ ## fld
+#endif
+
+struct __ia64_fpreg
+  {
+    union
+      {
+	unsigned long __ctx(bits)[2];
+      } __ctx(u);
+  } __attribute__ ((__aligned__ (16)));
+
+#undef __ctx
+
+#endif /* __ia64_fpreg */
diff --git a/sysdeps/unix/sysv/linux/ia64/sys/ucontext.h b/sysdeps/unix/sysv/linux/ia64/bits/ucontext.h
similarity index 91%
rename from sysdeps/unix/sysv/linux/ia64/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/ia64/bits/ucontext.h
index 2aeac65346..219526c54b 100644
--- a/sysdeps/unix/sysv/linux/ia64/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/ia64/bits/ucontext.h
@@ -15,14 +15,14 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
 #include <bits/types/sigset_t.h>
 #include <bits/types/stack_t.h>
-
+#include <bits/types/__ia64_fpreg.h>
 
 #ifdef __USE_MISC
 # define __ctx(fld) fld
@@ -36,14 +36,6 @@
  * "ucontext_t" as all the necessary info is inside the former.
  */
 
-struct __ia64_fpreg_mcontext
-  {
-    union
-      {
-	unsigned long __ctx(bits)[2];
-      } __ctx(u);
-  } __attribute__ ((__aligned__ (16)));
-
 typedef struct
   {
     unsigned long int __ctx(sc_flags);
@@ -63,7 +55,7 @@ typedef struct
     unsigned long int __ctx(sc_pr);
     unsigned long int __ctx(sc_br)[8];
     unsigned long int __ctx(sc_gr)[32];
-    struct __ia64_fpreg_mcontext __ctx(sc_fr)[128];
+    struct __ia64_fpreg __ctx(sc_fr)[128];
     unsigned long int __ctx(sc_rbs_base);
     unsigned long int __ctx(sc_loadrs);
     unsigned long int __ctx(sc_ar25);
@@ -103,4 +95,4 @@ ucontext_t;
 #define uc_stack	_u._mc.__ctx(sc_stack)
 #define uc_link		_u._uc._link
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym b/sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym
index ac3e3c8dea..46459f7ad0 100644
--- a/sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym
+++ b/sysdeps/unix/sysv/linux/ia64/sigcontext-offsets.sym
@@ -1,5 +1,5 @@
 #include <stddef.h>
-#include <sys/ucontext.h>
+#include <signal.h>
 
 --
 SC_NAT		offsetof (mcontext_t, sc_nat)
diff --git a/sysdeps/unix/sysv/linux/ia64/sys/ptrace.h b/sysdeps/unix/sysv/linux/ia64/sys/ptrace.h
index 4578ffb50f..9f12f59a71 100644
--- a/sysdeps/unix/sysv/linux/ia64/sys/ptrace.h
+++ b/sysdeps/unix/sysv/linux/ia64/sys/ptrace.h
@@ -20,9 +20,8 @@
 #define _SYS_PTRACE_H	1
 
 #include <features.h>
-#include <sys/ucontext.h>
-#include <bits/sigcontext.h>
 #include <bits/types.h>
+#include <bits/ucontext.h>
 
 __BEGIN_DECLS
 
diff --git a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h b/sysdeps/unix/sysv/linux/m68k/bits/ucontext.h
similarity index 97%
rename from sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/m68k/bits/ucontext.h
index 8a3b69d60e..11752ce3da 100644
--- a/sysdeps/unix/sysv/linux/m68k/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/m68k/bits/ucontext.h
@@ -17,8 +17,8 @@
 
 /* System V/m68k ABI compliant context switching support.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -127,4 +127,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/ucontext_i.sym b/sysdeps/unix/sysv/linux/m68k/m680x0/ucontext_i.sym
index 46bd4bf15f..400c57b7f3 100644
--- a/sysdeps/unix/sysv/linux/m68k/m680x0/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/m68k/m680x0/ucontext_i.sym
@@ -1,6 +1,5 @@
 #include <stddef.h>
 #include <signal.h>
-#include <sys/ucontext.h>
 
 --
 
diff --git a/sysdeps/unix/sysv/linux/microblaze/sys/ucontext.h b/sysdeps/unix/sysv/linux/microblaze/bits/ucontext.h
similarity index 96%
rename from sysdeps/unix/sysv/linux/microblaze/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/microblaze/bits/ucontext.h
index cbdc677f90..1f168ea0bf 100644
--- a/sysdeps/unix/sysv/linux/microblaze/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/microblaze/bits/ucontext.h
@@ -16,8 +16,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -89,4 +89,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h b/sysdeps/unix/sysv/linux/mips/bits/ucontext.h
similarity index 97%
rename from sysdeps/unix/sysv/linux/mips/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/mips/bits/ucontext.h
index 39fe23cb13..0b2c02c7de 100644
--- a/sysdeps/unix/sysv/linux/mips/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/mips/bits/ucontext.h
@@ -16,8 +16,8 @@
 
 /* Don't rely on this, the interface is currently messed up and may need to
    be broken to be fixed.  */
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -121,4 +121,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/mips/ucontext_i.sym b/sysdeps/unix/sysv/linux/mips/ucontext_i.sym
index f14b886407..d9692adcba 100644
--- a/sysdeps/unix/sysv/linux/mips/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/mips/ucontext_i.sym
@@ -1,7 +1,5 @@
-#include <inttypes.h>
 #include <signal.h>
 #include <stddef.h>
-#include <sys/ucontext.h>
 
 #include <kernel_rt_sigframe.h>
 
diff --git a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h b/sysdeps/unix/sysv/linux/nios2/bits/ucontext.h
similarity index 95%
rename from sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/nios2/bits/ucontext.h
index e3773ce90c..8549117f32 100644
--- a/sysdeps/unix/sysv/linux/nios2/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/nios2/bits/ucontext.h
@@ -18,8 +18,8 @@
 
 /* System V/Nios II ABI compliant context switching support.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -58,4 +58,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h b/sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h
index dbbb47b50d..9a4e5111ee 100644
--- a/sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/nios2/sigcontextinfo.h
@@ -16,8 +16,7 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <sys/ucontext.h>
-#include "kernel-features.h"
+#include <signal.h>
 
 #define SIGCONTEXT siginfo_t *_si, ucontext_t *
 #define GET_PC(ctx) ((void *) (ctx)->uc_mcontext.regs[27])
diff --git a/sysdeps/unix/sysv/linux/nios2/ucontext_i.sym b/sysdeps/unix/sysv/linux/nios2/ucontext_i.sym
index a844c96796..5455cdb681 100644
--- a/sysdeps/unix/sysv/linux/nios2/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/nios2/ucontext_i.sym
@@ -1,7 +1,5 @@
-#include <inttypes.h>
 #include <signal.h>
 #include <stddef.h>
-#include <sys/ucontext.h>
 
 #include "kernel_rt_sigframe.h"
 
diff --git a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h b/sysdeps/unix/sysv/linux/powerpc/bits/ucontext.h
similarity index 98%
rename from sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/powerpc/bits/ucontext.h
index 640381a5c7..324ec3ce19 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/ucontext.h
@@ -15,8 +15,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -197,4 +197,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.sym b/sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.sym
index 293761f260..e1b22b844e 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/ucontext_i.sym
@@ -1,6 +1,5 @@
 #include <stddef.h>
 #include <signal.h>
-#include <sys/ucontext.h>
 
 --
 
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.sym b/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.sym
index 8364e4614f..b2d420e15e 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/ucontext_i.sym
@@ -1,6 +1,5 @@
 #include <stddef.h>
 #include <signal.h>
-#include <sys/ucontext.h>
 
 --
 
diff --git a/sysdeps/unix/sysv/linux/riscv/bits/procfs.h b/sysdeps/unix/sysv/linux/riscv/bits/procfs.h
index 6ab26013a6..4e2dae40dc 100644
--- a/sysdeps/unix/sysv/linux/riscv/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/riscv/bits/procfs.h
@@ -23,10 +23,10 @@
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
-/* FIXME: sys/ucontext.h does not define NGREG or NFPREG unless
+/* FIXME: bits/ucontext.h does not define NGREG or NFPREG unless
    __USE_MISC is active, and sys/procfs.h should not expose all of
-   sys/ucontext.h.  */
-#include <sys/ucontext.h>
+   bits/ucontext.h.  */
+#include <bits/ucontext.h>
 
 /* ELF register definitions */
 #define ELF_NGREG	NGREG
diff --git a/sysdeps/unix/sysv/linux/riscv/sys/ucontext.h b/sysdeps/unix/sysv/linux/riscv/bits/ucontext.h
similarity index 97%
rename from sysdeps/unix/sysv/linux/riscv/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/riscv/bits/ucontext.h
index 6f62eb3d08..48ff2cd5af 100644
--- a/sysdeps/unix/sysv/linux/riscv/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/riscv/bits/ucontext.h
@@ -18,8 +18,8 @@
 
 /* Don't rely on this, the interface is currently messed up and may need to
    be broken to be fixed.  */
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -107,4 +107,4 @@ typedef struct ucontext_t
     mcontext_t uc_mcontext;
   } ucontext_t;
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/riscv/makecontext.c b/sysdeps/unix/sysv/linux/riscv/makecontext.c
index 671f20203d..8a929bf54a 100644
--- a/sysdeps/unix/sysv/linux/riscv/makecontext.c
+++ b/sysdeps/unix/sysv/linux/riscv/makecontext.c
@@ -18,14 +18,12 @@
 
 #include <sysdep.h>
 #include <sys/asm.h>
-#include <sys/ucontext.h>
+#include <ucontext.h>
 #include <stdarg.h>
 #include <assert.h>
 
 void
-__makecontext (ucontext_t *ucp, void (*func) (void), int argc,
-	       long int a0, long int a1, long int a2, long int a3, long int a4,
-	       ...)
+__makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...)
 {
   extern void __start_context (void) attribute_hidden;
   long int i, sp;
@@ -47,19 +45,13 @@ __makecontext (ucontext_t *ucp, void (*func) (void), int argc,
   ucp->uc_mcontext.__gregs[REG_PC] = (long int) &__start_context;
 
   /* Put args in a0-a7, then put any remaining args on the stack.  */
-  ucp->uc_mcontext.__gregs[REG_A0 + 0] = a0;
-  ucp->uc_mcontext.__gregs[REG_A0 + 1] = a1;
-  ucp->uc_mcontext.__gregs[REG_A0 + 2] = a2;
-  ucp->uc_mcontext.__gregs[REG_A0 + 3] = a3;
-  ucp->uc_mcontext.__gregs[REG_A0 + 4] = a4;
-
-  if (__glibc_unlikely (argc > 5))
+  if (argc > 0)
     {
       va_list vl;
-      va_start (vl, a4);
+      va_start (vl, argc);
 
       long reg_args = argc < REG_NARGS ? argc : REG_NARGS;
-      for (i = 5; i < reg_args; i++)
+      for (i = 0; i < reg_args; i++)
         ucp->uc_mcontext.__gregs[REG_A0 + i] = va_arg (vl, long);
 
       long int stack_args = argc - reg_args;
diff --git a/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h b/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h
index 27ed9bdb87..5f7ba368ed 100644
--- a/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h
+++ b/sysdeps/unix/sysv/linux/riscv/sigcontextinfo.h
@@ -16,7 +16,7 @@
    License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <sys/ucontext.h>
+#include <signal.h>
 
 #define SIGCONTEXT siginfo_t *_si, ucontext_t *
 #define GET_PC(ctx)	((void *) ctx->uc_mcontext.__gregs[REG_PC])
diff --git a/sysdeps/unix/sysv/linux/riscv/ucontext_i.sym b/sysdeps/unix/sysv/linux/riscv/ucontext_i.sym
index be55b26310..105b538684 100644
--- a/sysdeps/unix/sysv/linux/riscv/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/riscv/ucontext_i.sym
@@ -1,7 +1,5 @@
-#include <inttypes.h>
-#include <signal.h>
 #include <stddef.h>
-#include <sys/ucontext.h>
+#include <signal.h>
 
 -- Constants used by the rt_sigprocmask call.
 
diff --git a/sysdeps/unix/sysv/linux/s390/bits/procfs.h b/sysdeps/unix/sysv/linux/s390/bits/procfs.h
index 597ccdb754..c2a4b54cb1 100644
--- a/sysdeps/unix/sysv/linux/s390/bits/procfs.h
+++ b/sysdeps/unix/sysv/linux/s390/bits/procfs.h
@@ -23,9 +23,9 @@
 # error "Never include <bits/procfs.h> directly; use <sys/procfs.h> instead."
 #endif
 
-/* FIXME: sys/ucontext.h does not define NGREG unless __USE_MISC is
-   active, and sys/procfs.h should not expose all of sys/ucontext.h.  */
-#include <sys/ucontext.h>
+/* FIXME: bits/ucontext.h does not define NGREG unless __USE_MISC is
+   active, and sys/procfs.h should not expose all of bits/ucontext.h.  */
+#include <bits/ucontext.h>
 
 typedef greg_t elf_greg_t;
 #define ELF_NGREG NGREG
diff --git a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h b/sysdeps/unix/sysv/linux/s390/bits/ucontext.h
similarity index 96%
rename from sysdeps/unix/sysv/linux/s390/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/s390/bits/ucontext.h
index c1770ca6d4..4ce1ee8717 100644
--- a/sysdeps/unix/sysv/linux/s390/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/s390/bits/ucontext.h
@@ -16,8 +16,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -92,4 +92,4 @@ typedef struct ucontext_t
 #undef __ctx
 
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c b/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c
index e7d36d2d75..1c2aed9ddb 100644
--- a/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c
+++ b/sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c
@@ -16,19 +16,19 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
+#include <elf.h>
+#include <errno.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
-#include <sys/wait.h>
 #include <sys/types.h>
 #include <sys/uio.h>
-#include <elf.h>
-#include <support/xunistd.h>
+#include <sys/wait.h>
+
 #include <support/check.h>
-#include <string.h>
-#include <errno.h>
+#include <support/xunistd.h>
 
 /* Ensure that we use the PTRACE_SINGLEBLOCK definition from glibc ptrace.h
    in tracer_func.  We need the kernel ptrace.h for structs ptrace_area
diff --git a/sysdeps/unix/sysv/linux/s390/ucontext_i.sym b/sysdeps/unix/sysv/linux/s390/ucontext_i.sym
index 6cc9f19624..5b98555049 100644
--- a/sysdeps/unix/sysv/linux/s390/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/s390/ucontext_i.sym
@@ -1,6 +1,5 @@
 #include <stddef.h>
 #include <signal.h>
-#include <sys/ucontext.h>
 
 --
 
diff --git a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h b/sysdeps/unix/sysv/linux/sh/bits/ucontext.h
similarity index 97%
rename from sysdeps/unix/sysv/linux/sh/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/sh/bits/ucontext.h
index 9092103a7d..65b66cea37 100644
--- a/sysdeps/unix/sysv/linux/sh/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/sh/bits/ucontext.h
@@ -17,8 +17,8 @@
 
 /* Where is System V/SH ABI?  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -123,4 +123,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/sh/sh3/ucontext_i.sym b/sysdeps/unix/sysv/linux/sh/sh3/ucontext_i.sym
index 25f914a93b..4cd312ac5d 100644
--- a/sysdeps/unix/sysv/linux/sh/sh3/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/sh/sh3/ucontext_i.sym
@@ -1,6 +1,5 @@
 #include <stddef.h>
 #include <signal.h>
-#include <sys/ucontext.h>
 
 --
 
diff --git a/sysdeps/unix/sysv/linux/sh/sh4/ucontext_i.sym b/sysdeps/unix/sysv/linux/sh/sh4/ucontext_i.sym
index 130f60cd96..530a06f6d0 100644
--- a/sysdeps/unix/sysv/linux/sh/sh4/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/sh/sh4/ucontext_i.sym
@@ -1,6 +1,5 @@
 #include <stddef.h>
 #include <signal.h>
-#include <sys/ucontext.h>
 
 --
 
diff --git a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h b/sysdeps/unix/sysv/linux/sparc/bits/ucontext.h
similarity index 99%
rename from sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/sparc/bits/ucontext.h
index a125084c78..9c3f4e3f55 100644
--- a/sysdeps/unix/sysv/linux/sparc/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/ucontext.h
@@ -15,8 +15,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -301,4 +301,4 @@ typedef struct ucontext_t
   } ucontext_t;
 
 #endif /* __WORDSIZE == 32 */
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym b/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
index 8a7cb5ab84..0fe920d35a 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/ucontext_i.sym
@@ -1,6 +1,5 @@
 #include <stddef.h>
 #include <signal.h>
-#include <sys/ucontext.h>
 
 --
 
diff --git a/sysdeps/unix/sysv/linux/x86/sys/ucontext.h b/sysdeps/unix/sysv/linux/x86/bits/ucontext.h
similarity index 98%
rename from sysdeps/unix/sysv/linux/x86/sys/ucontext.h
rename to sysdeps/unix/sysv/linux/x86/bits/ucontext.h
index 3d883c2bf1..e78658394f 100644
--- a/sysdeps/unix/sysv/linux/x86/sys/ucontext.h
+++ b/sysdeps/unix/sysv/linux/x86/bits/ucontext.h
@@ -15,8 +15,8 @@
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#ifndef _SYS_UCONTEXT_H
-#define _SYS_UCONTEXT_H	1
+#ifndef _BITS_UCONTEXT_H
+#define _BITS_UCONTEXT_H	1
 
 #include <features.h>
 
@@ -259,4 +259,4 @@ typedef struct ucontext_t
 
 #undef __ctx
 
-#endif /* sys/ucontext.h */
+#endif /* bits/ucontext.h */
diff --git a/sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym b/sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym
index c08b3b8b47..4bffe048a0 100644
--- a/sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym
+++ b/sysdeps/unix/sysv/linux/x86_64/ucontext_i.sym
@@ -1,6 +1,5 @@
 #include <stddef.h>
 #include <signal.h>
-#include <sys/ucontext.h>
 
 --
 
