diff --git a/common/Makefile b/common/Makefile
index 7be89a41c6e0addc2519efad7336a72d2dd7e63e..fbfa536a30c07a4b56d79d069e39e1e296b688a4 100644
--- a/common/Makefile
+++ b/common/Makefile
@@ -86,6 +86,7 @@ COBJS-$(CONFIG_CMD_REISER) += cmd_reiser.o
 COBJS-y += cmd_sata.o
 COBJS-$(CONFIG_CMD_SCSI) += cmd_scsi.o
 COBJS-$(CONFIG_CMD_SPI) += cmd_spi.o
+COBJS-$(CONFIG_CMD_TERMINAL) += cmd_terminal.o
 COBJS-$(CONFIG_CMD_UNIVERSE) += cmd_universe.o
 COBJS-$(CONFIG_CMD_USB) += cmd_usb.o
 COBJS-y += cmd_vfd.o
diff --git a/common/cmd_terminal.c b/common/cmd_terminal.c
new file mode 100644
index 0000000000000000000000000000000000000000..88716072b30c623d8fc70064228cc0bb4e69c57f
--- /dev/null
+++ b/common/cmd_terminal.c
@@ -0,0 +1,102 @@
+/*
+ * (C) Copyright 2007 OpenMoko, Inc.
+ * Written by Harald Welte <laforge@openmoko.org>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+/*
+ * Boot support
+ */
+#include <common.h>
+#include <command.h>
+#include <devices.h>
+
+#if defined(CONFIG_CMD_TERMINAL)
+
+int do_terminal(cmd_tbl_t * cmd, int flag, int argc, char *argv[])
+{
+	int i, l;
+	int last_tilde = 0;
+	device_t *dev = NULL;
+
+	if (argc < 1)
+		return -1;
+
+	/* Scan for selected output/input device */
+	for (i = 1; i <= ListNumItems (devlist); i++) {
+		device_t *tmp = ListGetPtrToItem (devlist, i);
+		if (!strcmp(tmp->name, argv[1])) {
+			dev = tmp;
+			break;
+		}
+	}
+	if (!dev)
+		return -1;
+
+	serial_reinit_all();
+	printf("Entering terminal mode for port %s\n", dev->name);
+	puts("Use '~.' to leave the terminal and get back to u-boot\n");
+
+	while (1) {
+		int c;
+
+		/* read from console and display on serial port */
+		if (stdio_devices[0]->tstc()) {
+			c = stdio_devices[0]->getc();
+			if (last_tilde == 1) {
+				if (c == '.') {
+					putc(c);
+					putc('\n');
+					break;
+				} else {
+					last_tilde = 0;
+					/* write the delayed tilde */
+					dev->putc('~');
+					/* fall-through to print current
+					 * character */
+				}
+			}
+			if (c == '~') {
+				last_tilde = 1;
+				puts("[u-boot]");
+				putc(c);
+			}
+			dev->putc(c);
+		}
+
+		/* read from serial port and display on console */
+		if (dev->tstc()) {
+			c = dev->getc();
+			putc(c);
+		}
+	}
+	return 0;
+}
+
+
+/***************************************************/
+
+U_BOOT_CMD(
+	terminal,	3,	1,	do_terminal,
+	"terminal - start terminal emulator\n",
+	""
+);
+
+#endif /* CONFIG_CMD_TERMINAL */
diff --git a/include/config_cmd_all.h b/include/config_cmd_all.h
index d7ef65d5ddef775b1cecc118ff475198551d6286..f3965efe953f3584349299d90ad915fdc59b985a 100644
--- a/include/config_cmd_all.h
+++ b/include/config_cmd_all.h
@@ -73,6 +73,7 @@
 #define CONFIG_CMD_SETGETDCR	/* DCR support on 4xx		*/
 #define CONFIG_CMD_SNTP		/* SNTP support			*/
 #define CONFIG_CMD_SPI		/* SPI utility			*/
+#define CONFIG_CMD_TERMINAL	/* built-in Serial Terminal	*/
 #define CONFIG_CMD_UNIVERSE	/* Tundra Universe Support	*/
 #define CONFIG_CMD_USB		/* USB Support			*/
 #define CONFIG_CMD_VFD		/* VFD support (TRAB)		*/