diff --git a/check.t b/check.t
index 35a5d2f..2daae45 100644
--- a/check.t
+++ b/check.t
@@ -1,4 +1,4 @@
-# $MirOS: src/bin/mksh/check.t,v 1.58 2006/08/18 13:41:09 tg Exp $
+# $MirOS: src/bin/mksh/check.t,v 1.59 2006/08/22 22:49:33 tg Exp $
 # $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
 # $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
 # $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
@@ -3856,5 +3856,5 @@ category: pdksh
 stdin:
 	echo $KSH_VERSION
 expected-stdout:
-	@(#)MIRBSD KSH R28 2006/08/18
+	@(#)MIRBSD KSH R28 2006/08/22
 ---
diff --git a/compat.h b/compat.h
deleted file mode 100644
index 6c0c51c..0000000
--- a/compat.h
+++ /dev/null
@@ -1,70 +0,0 @@
-#define MKSH_COMPAT_H_ID "$MirOS: src/bin/mksh/compat.h,v 1.4 2006/08/22 22:16:04 tg Exp $"
-
-#ifdef NEED_COMPAT
-/* Part I: extra headers */
-
-#if defined(__sun__) || defined(__INTERIX)
-#include <sys/mkdev.h>
-#endif
-#if !defined(__OpenBSD__) && !defined(__CYGWIN__)
-#include <ulimit.h>
-#endif
-#if defined(__sun__) || defined(__gnu_linux__)
-#include <values.h>
-#endif
-
-
-/* Part II: extra macros */
-
-#ifndef timeradd
-#define	timeradd(tvp, uvp, vvp)						\
-	do {								\
-		(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;		\
-		(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec;	\
-		if ((vvp)->tv_usec >= 1000000) {			\
-			(vvp)->tv_sec++;				\
-			(vvp)->tv_usec -= 1000000;			\
-		}							\
-	} while (0)
-#endif
-#ifndef timersub
-#define	timersub(tvp, uvp, vvp)						\
-	do {								\
-		(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;		\
-		(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;	\
-		if ((vvp)->tv_usec < 0) {				\
-			(vvp)->tv_sec--;				\
-			(vvp)->tv_usec += 1000000;			\
-		}							\
-	} while (0)
-#endif
-
-#ifndef S_ISTXT
-#define S_ISTXT 0001000
-#endif
-
-
-/* Part III: OS-dependent additions */
-
-#if defined(__gnu_linux__)
-size_t strlcat(char *, const char *, size_t);
-size_t strlcpy(char *, const char *, size_t);
-#endif
-
-#if defined(__sun__)
-size_t confstr(int, char *, size_t);
-#endif
-
-#if defined(__gnu_linux__) || defined(__sun__) || defined(__CYGWIN__)
-#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
-mode_t getmode(const void *, mode_t);
-void *setmode(const char *);
-#endif
-
-#ifdef __INTERIX
-#define	makedev(x,y)	mkdev((x),(y))
-extern int __cdecl seteuid(uid_t);
-extern int __cdecl setegid(gid_t);
-#endif
-
-#endif
diff --git a/edit.c b/edit.c
index 296c488..28f12e8 100644
--- a/edit.c
+++ b/edit.c
@@ -5,7 +5,7 @@
 
 #include "sh.h"
 
-__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.36 2006/08/08 20:17:20 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/edit.c,v 1.37 2006/08/22 22:49:34 tg Exp $");
 
 /* tty driver characters we are interested in */
 typedef struct {
@@ -2674,7 +2674,7 @@ x_version(int c __attribute__((unused)))
 	char *o_xbuf = xbuf, *o_xend = xend;
 	char *o_xbp = xbp, *o_xep = xep, *o_xcp = xcp;
 	int lim = x_lastcp() - xbp;
-	char *v = strdup(MKSH_VERSION + 4);
+	char *v = strdup(KSH_VERSION);
 	int vlen;
 
 	xbuf = xbp = xcp = v;
@@ -3164,8 +3164,8 @@ vi_hook(int ch)
 					save_cbuf();
 					es->cursor = 0;
 					es->linelen = 0;
-					putbuf(MKSH_VERSION + 4,
-					    strlen(MKSH_VERSION + 4), 0);
+					putbuf(KSH_VERSION,
+					     strlen(KSH_VERSION), 0);
 					refresh(0);
 				}
 			}
diff --git a/main.c b/main.c
index f854302..a5e3813 100644
--- a/main.c
+++ b/main.c
@@ -3,22 +3,22 @@
 /*	$OpenBSD: io.c,v 1.22 2006/03/17 16:30:13 millert Exp $	*/
 /*	$OpenBSD: table.c,v 1.12 2005/12/11 20:31:21 otto Exp $	*/
 
-#define	EXTERN				/* define EXTERNs in sh.h */
+#define	EXTERN
 #include "sh.h"
 
-__RCSID("$MirOS: src/bin/mksh/main.c,v 1.46 2006/08/18 18:48:25 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/main.c,v 1.47 2006/08/22 22:49:35 tg Exp $");
 
 extern char **environ;
 
 static void reclaim(void);
-static void remove_temps(struct temp * tp);
+static void remove_temps(struct temp *);
 
 static const char initifs[] = "IFS= \t\n";
 
 static const char initsubs[] = "${PS2=> } ${PS3=#? } ${PS4=+ }";
 
 static const char *initcoms[] = {
-	"typeset", "-r", "KSH_VERSION", NULL,
+	"typeset", "-r", initvsn, NULL,
 	"typeset", "-x", "SHELL", "PATH", "HOME", NULL,
 	"typeset", "-i", "PPID", "OPTIND=1", NULL,
 	"eval", "typeset -i RANDOM SECONDS=\"${SECONDS-0}\" TMOUT=\"${TMOUT-0}\"", NULL,
@@ -191,8 +191,6 @@ main(int argc, char *argv[])
 	srand((*((long *)kshname)) ^ ((long)time(NULL) * kshpid * ppid));
 #endif
 	setint(global("PPID"), (long)ppid);
-	/* setstr can't fail here */
-	setstr(global("KSH_VERSION"), MKSH_VERSION, KSH_RETURN_ERROR);
 
 	/* execute initialisation statements */
 	for (wp = (char **)initcoms; *wp != NULL; wp++) {
diff --git a/misc.c b/misc.c
index 59f619e..5507e84 100644
--- a/misc.c
+++ b/misc.c
@@ -3,8 +3,8 @@
 
 #include "sh.h"
 
-__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.14 2006/08/22 22:16:04 tg Exp $"
-	"\t" MKSH_SH_H_ID "\t" MKSH_COMPAT_H_ID);
+__RCSID("$MirOS: src/bin/mksh/misc.c,v 1.15 2006/08/22 22:49:36 tg Exp $\t"
+	MKSH_SH_H_ID);
 
 short chtypes[UCHAR_MAX+1];	/* type bits for unsigned char */
 
@@ -12,7 +12,6 @@ static int do_gmatch(const unsigned char *, const unsigned char *,
     const unsigned char *, const unsigned char *);
 static const unsigned char *cclass(const unsigned char *, int);
 static int parse_T(char *);
-
 static char *do_phys_path(XString *, char *, const char *);
 
 /*
diff --git a/mksh.1 b/mksh.1
index 72c59e4..8222643 100644
--- a/mksh.1
+++ b/mksh.1
@@ -1,8 +1,8 @@
-.\" $MirOS: src/bin/mksh/mksh.1,v 1.56 2006/08/14 20:41:21 tg Exp $
+.\" $MirOS: src/bin/mksh/mksh.1,v 1.57 2006/08/22 22:49:36 tg Exp $
 .\" $OpenBSD: ksh.1,v 1.116 2006/07/26 10:13:25 jmc Exp $
 .\" $OpenBSD: sh.1tbl,v 1.53 2004/12/10 01:56:56 jaredy Exp $
 .\"
-.Dd August 14, 2006
+.Dd August 22, 2006
 .Dt MKSH 1
 .Os MirBSD
 .Sh NAME
@@ -5301,25 +5301,23 @@ yet.
 .Pp
 Please report bugs in
 .Nm
-or this manual page to the MirOS Project discussion mailing list at
+to the
 .Aq miros-discuss@mirbsd.org
-or in the
+mailing list or in the
 .Li \&#mksh
-channel on the OPN IRC network at
-.Pa irc.freenode.net
-.Pq port 6667 .
+or
+.Li \&#ksh
+IRC channel at
+.Pa irc.freenode.net .
 .Pp
 By the way, the most frequently reported bug is:
 .Bd -literal -offset indent
 $ print hi \*(Ba read a; print $a   # Does not show hi
 .Ed
 .Pp
-The
-.Nm pdksh
-author is aware of this and there is no need to report it.
 This does not work because the last command of a pipe sequence
-is run in a subshell.
-In
-.Nm "" ,
-this is a feature which can be depended on by scripts.
+is executed in a subshell.
+This is a
+.Nm
+feature which can be depended on by scripts.
 Use co-routines to work around if necessary and possible.
diff --git a/sh.h b/sh.h
index 637a407..74cee61 100644
--- a/sh.h
+++ b/sh.h
@@ -8,7 +8,8 @@
 /*	$OpenBSD: c_test.h,v 1.4 2004/12/20 11:34:26 otto Exp $	*/
 /*	$OpenBSD: tty.h,v 1.5 2004/12/20 11:34:26 otto Exp $	*/
 
-#define MKSH_SH_H_ID "$MirOS: src/bin/mksh/sh.h,v 1.38 2006/08/22 22:22:07 tg Exp $"
+#define MKSH_SH_H_ID "$MirOS: src/bin/mksh/sh.h,v 1.39 2006/08/22 22:49:37 tg Exp $"
+#define MKSH_VERSION "R28 2006/08/22"
 
 #include <sys/param.h>
 
@@ -44,7 +45,72 @@
 #include <termios.h>
 #include <time.h>
 #include <unistd.h>
-#include "compat.h"
+
+#ifdef NEED_COMPAT
+/* extra headers */
+
+#if defined(__sun__) || defined(__INTERIX)
+#include <sys/mkdev.h>
+#endif
+#if !defined(__OpenBSD__) && !defined(__CYGWIN__)
+#include <ulimit.h>
+#endif
+#if defined(__sun__) || defined(__gnu_linux__)
+#include <values.h>
+#endif
+
+/* extra macros */
+
+#ifndef timeradd
+#define	timeradd(tvp, uvp, vvp)						\
+	do {								\
+		(vvp)->tv_sec = (tvp)->tv_sec + (uvp)->tv_sec;		\
+		(vvp)->tv_usec = (tvp)->tv_usec + (uvp)->tv_usec;	\
+		if ((vvp)->tv_usec >= 1000000) {			\
+			(vvp)->tv_sec++;				\
+			(vvp)->tv_usec -= 1000000;			\
+		}							\
+	} while (0)
+#endif
+#ifndef timersub
+#define	timersub(tvp, uvp, vvp)						\
+	do {								\
+		(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec;		\
+		(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec;	\
+		if ((vvp)->tv_usec < 0) {				\
+			(vvp)->tv_sec--;				\
+			(vvp)->tv_usec += 1000000;			\
+		}							\
+	} while (0)
+#endif
+
+#ifndef S_ISTXT
+#define S_ISTXT 0001000
+#endif
+
+/* OS-dependent additions */
+
+#if defined(__gnu_linux__)
+size_t strlcat(char *, const char *, size_t);
+size_t strlcpy(char *, const char *, size_t);
+#endif
+
+#if defined(__sun__)
+size_t confstr(int, char *, size_t);
+#endif
+
+#if defined(__gnu_linux__) || defined(__sun__) || defined(__CYGWIN__)
+#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
+mode_t getmode(const void *, mode_t);
+void *setmode(const char *);
+#endif
+
+#ifdef __INTERIX
+#define	makedev(x,y)	mkdev((x),(y))
+extern int __cdecl seteuid(uid_t);
+extern int __cdecl setegid(gid_t);
+#endif
+#endif
 
 /* some useful #defines */
 #ifdef EXTERN
@@ -54,7 +120,6 @@
 # define EXTERN extern
 # define EXTERN_DEFINED
 #endif
-#include "version.h"
 
 #define EXECSHELL	"/bin/mksh"
 #define EXECSHELL_STR	"EXECSHELL"
@@ -95,6 +160,10 @@ EXTERN	gid_t kshgid;		/* real gid of shell */
 EXTERN	int exstat;		/* exit status */
 EXTERN	int subst_exstat;	/* exit status of last $(..)/`..` */
 EXTERN	const char *safe_prompt; /* safe prompt if PS1 substitution fails */
+#ifndef EXTERN_DEFINED
+static const char initvsn[] = "KSH_VERSION=@(#)MIRBSD KSH " MKSH_VERSION;
+#endif
+EXTERN	const char *KSH_VERSION I__(initvsn + 16);
 
 /*
  * Area-based allocation built on malloc/free
diff --git a/version.h b/version.h
deleted file mode 100644
index d16a94d..0000000
--- a/version.h
+++ /dev/null
@@ -1 +0,0 @@
-EXTERN const char MKSH_VERSION[] I__("@(#)MIRBSD KSH R28 2006/08/18");