Index: sys/sys/ipc.h
===================================================================
--- sys/sys/ipc.h
+++ sys/sys/ipc.h
@@ -119,12 +119,14 @@
 #define	IPC_INFO	3	/* get info */
 #endif
 
-#ifdef _KERNEL
+#if defined(_KERNEL) || defined(_WANT_IPCID_MACROS)
 /* Macros to convert between ipc ids and array indices or sequence ids */
 #define	IPCID_TO_IX(id)		((id) & 0xffff)
 #define	IPCID_TO_SEQ(id)	(((id) >> 16) & 0xffff)
 #define	IXSEQ_TO_IPCID(ix,perm)	(((perm.seq) << 16) | (ix & 0xffff))
+#endif
 
+#ifdef _KERNEL
 struct thread;
 struct proc;
 struct vmspace;
Index: sys/sys/msg.h
===================================================================
--- sys/sys/msg.h
+++ sys/sys/msg.h
@@ -116,7 +116,6 @@
 #endif
 
 #ifdef _KERNEL
-
 struct msg {
 	struct	msg *msg_next;  /* next msg in the chain */
 	long	msg_type; 	/* type of this message */
@@ -126,7 +125,9 @@
 	short	msg_spot;	/* location of start of msg in buffer */
 	struct	label *label;	/* MAC Framework label */
 };
+#endif
 
+#if defined(_KERNEL) || defined(_WANT_MSGINFO)
 /*
  * Based on the configuration parameters described in an SVR2 (yes, two)
  * config(1m) man page.
@@ -145,8 +146,9 @@
 	int	msgssz;		/* size of a message segment (see note) */
 	int	msgseg;		/* number of message segments */
 };
-extern struct msginfo	msginfo;
+#endif
 
+#if defined(_KERNEL) || defined(_WANT_MSQID_KERNEL)
 /*
  * Kernel wrapper for the user-level structure.
  */
@@ -162,10 +164,11 @@
 	struct	label *label;	/* MAC label */
 	struct	ucred *cred;	/* creator's credentials */
 };
+#endif
 
-#endif /* _KERNEL */
-
-#if !defined(_KERNEL) || defined(_WANT_MSG_PROTOTYPES)
+#ifdef _KERNEL
+extern struct msginfo	msginfo;
+#else /* _KERNEL */
 __BEGIN_DECLS
 int msgctl(int, int, struct msqid_ds *);
 int msgget(key_t, int);
@@ -175,7 +178,6 @@
 int msgsys(int, ...);
 #endif
 __END_DECLS
-
-#endif /* !_KERNEL || _WANT_MSG_PROTOTYPES  */
+#endif /* !_KERNEL */
 
 #endif /* !_SYS_MSG_H_ */
Index: sys/sys/sem.h
===================================================================
--- sys/sys/sem.h
+++ sys/sys/sem.h
@@ -101,8 +101,7 @@
 #define SEM_A		IPC_W	/* alter permission */
 #define SEM_R		IPC_R	/* read permission */
 
-#ifdef _KERNEL
-
+#if defined(_KERNEL) || defined(_WANT_SEMINFO)
 /*
  * semaphore info struct
  */
@@ -117,8 +116,9 @@
 	int	semvmx;		/* semaphore maximum value */
 	int	semaem;		/* adjust on exit max value */
 };
-extern struct seminfo	seminfo;
+#endif
 
+#if defined(_KERNEL) || defined(_WANT_SEMID_KERNEL)
 /*
  * Kernel wrapper for the user-level structure
  */
@@ -127,19 +127,23 @@
 	struct	label *label;	/* MAC framework label */
 	struct	ucred *cred;	/* creator's credentials */
 };
+#endif
 
+#if defined(_KERNEL) || defined(_WANT_SEM_INTERNAL_MODES)
 /* internal "mode" bits */
 #define	SEM_ALLOC	01000	/* semaphore is allocated */
 #define	SEM_DEST	02000	/* semaphore will be destroyed on last detach */
+#endif
 
+#ifdef _KERNEL
+extern struct seminfo	seminfo;
 /*
  * Process sem_undo vectors at proc exit.
  */
 void	semexit(struct proc *p);
 
-#endif /* _KERNEL */
+#else /* !_KERNEL */
 
-#if !defined(_KERNEL) || defined(_WANT_SEM_PROTOTYPES)
 __BEGIN_DECLS
 #if __BSD_VISIBLE
 int semsys(int, ...);
@@ -149,6 +153,6 @@
 int semop(int, struct sembuf *, size_t);
 __END_DECLS
 
-#endif /* !_KERNEL || _WANT_SEM_PROTOTYPES */
+#endif /* !_KERNEL */
 
 #endif /* !_SYS_SEM_H_ */
Index: sys/sys/shm.h
===================================================================
--- sys/sys/shm.h
+++ sys/sys/shm.h
@@ -107,9 +107,7 @@
 	time_t          shm_ctime;	/* time of last change by shmctl() */
 };
 
-#ifdef _KERNEL
-#include <vm/vm.h>
-
+#if defined(_KERNEL) || defined(_WANT_SHMINFO)
 /*
  * System 5 style catch-all structure for shared memory constants that
  * might be of interest to user programs.  Do we really want/need this?
@@ -121,6 +119,15 @@
 	u_long	shmseg;		/* max shared memory segments per process */
 	u_long	shmall;		/* max amount of shared memory (pages) */
 };
+#endif
+
+#if defined(_KERNEL) || defined(_WANT_SHMID_KERNEL)
+#ifdef _KERNEL
+#include <vm/vm.h>
+#else
+struct vm_object;
+typedef struct vm_object *vm_object_t;
+#endif
 
 /* 
  * Add a kernel wrapper to the shmid_ds struct so that private info (like the
@@ -132,8 +139,7 @@
 	struct label *label;	/* MAC label */
 	struct ucred *cred;	/* creator's credendials */
 };
-
-extern struct shminfo	shminfo;
+#endif
 
 struct shm_info {
 	int used_ids;
@@ -144,15 +150,17 @@
 	unsigned long swap_successes;
 };
 
-struct thread;
+#ifdef _KERNEL
 struct proc;
 struct vmspace;
 
+extern struct shminfo	shminfo;
+
 void	shmexit(struct vmspace *);
 void	shmfork(struct proc *, struct proc *);
-#endif /* _KERNEL */
 
-#if !defined(_KERNEL) || defined(_WANT_SHM_PROTOTYPES)
+#else /* !_KERNEL */
+
 #include <sys/cdefs.h>
 
 #ifndef _SIZE_T_DECLARED
@@ -170,6 +178,6 @@
 int shmdt(const void *);
 __END_DECLS
 
-#endif /* _KERNEL || _WANT_SHM_PROTOTYPES */
+#endif /* _KERNEL */
 
 #endif /* !_SYS_SHM_H_ */
Index: usr.bin/ipcrm/ipcrm.c
===================================================================
--- usr.bin/ipcrm/ipcrm.c
+++ usr.bin/ipcrm/ipcrm.c
@@ -36,14 +36,18 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/param.h>
-#define _WANT_MSG_PROTOTYPES
-#define _WANT_SEM_PROTOTYPES
-#define _WANT_SHM_PROTOTYPES
-#define _KERNEL
+#define	_WANT_IPCID_MACROS
+#include <sys/ipc.h>
+#define	_WANT_MSGINFO
+#define	_WANT_MSQID_KERNEL
+#include <sys/msg.h>
+#define	_WANT_SEM_INTERNAL_MODES
+#define	_WANT_SEMINFO
+#define	_WANT_SEMID_KERNEL
 #include <sys/sem.h>
+#define	_WANT_SHMINFO
+#define	_WANT_SHMID_KERNEL
 #include <sys/shm.h>
-#include <sys/msg.h>
-#undef _KERNEL
 
 #include <ctype.h>
 #include <err.h>
Index: usr.bin/ipcs/ipc.h
===================================================================
--- usr.bin/ipcs/ipc.h
+++ usr.bin/ipcs/ipc.h
@@ -68,3 +68,6 @@
 extern struct semid_kernel	*sema;
 extern struct msqid_kernel	*msqids;
 extern struct shmid_kernel	*shmsegs;
+extern struct seminfo		 seminfo;
+extern struct msginfo		 msginfo;
+extern struct shminfo		 shminfo;