diff --git a/test/dots.c b/test/dots.c
new file mode 100644
index 0000000..2d64718
--- /dev/null
+++ b/test/dots.c
@@ -0,0 +1,162 @@
+/****************************************************************************
+ * Copyright (c) 1999-2007,2008 Free Software Foundation, Inc.              *
+ *                                                                          *
+ * Permission is hereby granted, free of charge, to any person obtaining a  *
+ * copy of this software and associated documentation files (the            *
+ * "Software"), to deal in the Software without restriction, including      *
+ * without limitation the rights to use, copy, modify, merge, publish,      *
+ * distribute, distribute with modifications, sublicense, and/or sell       *
+ * copies of the Software, and to permit persons to whom the Software is    *
+ * furnished to do so, subject to the following conditions:                 *
+ *                                                                          *
+ * The above copyright notice and this permission notice shall be included  *
+ * in all copies or substantial portions of the Software.                   *
+ *                                                                          *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS  *
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF               *
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.   *
+ * IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,   *
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR    *
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR    *
+ * THE USE OR OTHER DEALINGS IN THE SOFTWARE.                               *
+ *                                                                          *
+ * Except as contained in this notice, the name(s) of the above copyright   *
+ * holders shall not be used in advertising or otherwise to promote the     *
+ * sale, use or other dealings in this Software without prior written       *
+ * authorization.                                                           *
+ ****************************************************************************/
+
+/*
+ * Author: Thomas E. Dickey <dickey@clark.net> 1999
+ *
+ * $Id: dots.c,v 1.17 2008/02/09 18:08:50 tom Exp $
+ *
+ * A simple demo of the terminfo interface.
+ */
+#define USE_TINFO
+#include <test.priv.h>
+
+#if HAVE_SETUPTERM
+
+#include <time.h>
+
+#define valid(s) ((s != 0) && s != (char *)-1)
+
+static bool interrupted = FALSE;
+static long total_chars = 0;
+static time_t started;
+
+static int
+outc(TPUTS_ARG c)
+{
+    if (interrupted) {
+	char tmp = c;
+	write(STDOUT_FILENO, &tmp, 1);
+    } else {
+	putc(c, stdout);
+    }
+    return 0;
+}
+
+static bool
+outs(char *s)
+{
+    if (valid(s)) {
+	tputs(s, 1, outc);
+	return TRUE;
+    }
+    return FALSE;
+}
+
+static void
+cleanup(void)
+{
+    outs(exit_attribute_mode);
+    if (!outs(orig_colors))
+	outs(orig_pair);
+    outs(clear_screen);
+    outs(cursor_normal);
+
+    printf("\n\n%ld total chars, rate %.2f/sec\n",
+	   total_chars,
+	   ((double) (total_chars) / (time((time_t *) 0) - started)));
+}
+
+static void
+onsig(int n GCC_UNUSED)
+{
+    interrupted = TRUE;
+}
+
+static float
+ranf(void)
+{
+    long r = (rand() & 077777);
+    return ((float) r / 32768.);
+}
+
+int
+main(
+	int argc GCC_UNUSED,
+	char *argv[]GCC_UNUSED)
+{
+    int x, y, z, p;
+    float r;
+    float c;
+
+    CATCHALL(onsig);
+
+    srand((unsigned) time(0));
+    setupterm((char *) 0, 1, (int *) 0);
+    outs(clear_screen);
+    outs(cursor_invisible);
+    if (max_colors > 1) {
+	if (!valid(set_a_foreground)
+	    || !valid(set_a_background)
+	    || (!valid(orig_colors) && !valid(orig_pair)))
+	    max_colors = -1;
+    }
+
+    r = (float) (lines - 4);
+    c = (float) (columns - 4);
+    started = time((time_t *) 0);
+
+    while (!interrupted) {
+	x = (int) (c * ranf()) + 2;
+	y = (int) (r * ranf()) + 2;
+	p = (ranf() > 0.9) ? '*' : ' ';
+
+	tputs(tparm3(cursor_address, y, x), 1, outc);
+	if (max_colors > 0) {
+	    z = (int) (ranf() * max_colors);
+	    if (ranf() > 0.01) {
+		tputs(tparm2(set_a_foreground, z), 1, outc);
+	    } else {
+		tputs(tparm2(set_a_background, z), 1, outc);
+		napms(1);
+	    }
+	} else if (valid(exit_attribute_mode)
+		   && valid(enter_reverse_mode)) {
+	    if (ranf() <= 0.01) {
+		outs((ranf() > 0.6)
+		     ? enter_reverse_mode
+		     : exit_attribute_mode);
+		napms(1);
+	    }
+	}
+	outc(p);
+	fflush(stdout);
+	++total_chars;
+    }
+    cleanup();
+    ExitProgram(EXIT_SUCCESS);
+}
+#else
+int
+main(int argc GCC_UNUSED,
+     char *argv[]GCC_UNUSED)
+{
+    fprintf(stderr, "This program requires terminfo\n");
+    exit(EXIT_FAILURE);
+}
+#endif
