diff --git a/Demo/curses/README b/Demo/curses/README
index 7de5c96..2fb1159 100644
--- a/Demo/curses/README
+++ b/Demo/curses/README
@@ -1,3 +1,28 @@
-Sample programs that use the curses package:
+This is a collection of demos and tests for the curses module. 
+
+ncurses demos
+=============
+
+These demos are converted from the C versions in the ncurses
+distribution, and were contributed by Thomas Gellekum <tg@FreeBSD.org>
+I didn't strive for a `pythonic' style, but bluntly copied the
+originals. I won't attempt to `beautify' the program anytime soon, but
+I wouldn't mind someone else making an effort in that direction, of
+course.
+
+ncurses.py	-- currently only a panels demo
+                   XXX this won't work until panel support is checked in
+rain.py		-- raindrops keep falling on my desktop
+tclock.py	-- ASCII clock, by Howard Jones
+
+Please send bugfixes and new contributions to me or, even better,
+submit them to the Python Bug Tracker on SourceForge
+(<URL:http://sourceforge.net/bugs/?group_id=5470>).
+
+
+Other demos
+===========
 
 life.py		Simple game of Life
+
+
diff --git a/Demo/curses/ncurses.py b/Demo/curses/ncurses.py
new file mode 100644
index 0000000..782d17f
--- /dev/null
+++ b/Demo/curses/ncurses.py
@@ -0,0 +1,272 @@
+#!/usr/bin/env python
+#
+# $Id$
+#
+# (n)curses exerciser in Python, an interactive test for the curses
+# module. Currently, only the panel demos are ported.
+
+import curses
+
+def wGetchar(win = None):
+    if win == None: win = stdscr
+    return win.getch()
+
+def Getchar():
+    wGetchar()
+
+#
+# Panels tester
+#
+def wait_a_while():
+    if nap_msec == 1:
+        Getchar()
+    else:
+        curses.napms(nap_msec)
+
+def saywhat(text):
+    stdscr.move(curses.LINES - 1, 0)
+    stdscr.clrtoeol()
+    stdscr.addstr(text)
+
+def mkpanel(color, rows, cols, tly, tlx):
+    win = curses.newwin(rows, cols, tly, tlx)
+    pan = win.new_panel()
+    if curses.has_colors():
+        if color == curses.COLOR_BLUE:
+            fg = curses.COLOR_WHITE
+        else:
+            fg = curses.COLOR_BLACK
+        bg = color
+        curses.init_pair(color, fg, bg)
+        win.bkgdset(ord(' '), curses.color_pair(color))
+    else:
+        win.bkgdset(ord(' '), curses.A_BOLD)
+
+    return pan
+
+def pflush():
+    curses.update_panels()
+    curses.doupdate()
+
+def fill_panel(pan):
+    win = pan.window()
+    num = pan.userptr()[1]
+
+    win.move(1, 1)
+    win.addstr("-pan%c-" % num)
+    win.clrtoeol()
+    win.box()
+
+    maxy, maxx = win.getmaxyx()
+    for y in range(2, maxy - 1):
+        for x in range(1, maxx - 1):
+            win.move(y, x)
+            win.addch(num)
+
+def demo_panels(win):
+    global stdscr, nap_msec, mod
+    stdscr = win
+    nap_msec = 1
+    mod = ["test", "TEST", "(**)", "*()*", "<-->", "LAST"]
+
+    stdscr.refresh()
+
+    for y in range(0, curses.LINES - 1):
+        for x in range(0, curses.COLS):
+            stdscr.addstr("%d" % ((y + x) % 10))
+    for y in range(0, 1):
+        p1 = mkpanel(curses.COLOR_RED,
+                     curses.LINES / 2 - 2,
+                     curses.COLS / 8 + 1,
+                     0,
+                     0)
+        p1.set_userptr("p1")
+
+        p2 = mkpanel(curses.COLOR_GREEN,
+                     curses.LINES / 2 + 1,
+                     curses.COLS / 7,
+                     curses.LINES / 4,
+                     curses.COLS / 10)
+        p2.set_userptr("p2")
+
+        p3 = mkpanel(curses.COLOR_YELLOW,
+                     curses.LINES / 4,
+                     curses.COLS / 10,
+                     curses.LINES / 2,
+                     curses.COLS / 9)
+        p3.set_userptr("p3")
+
+        p4 = mkpanel(curses.COLOR_BLUE,
+                     curses.LINES / 2 - 2,
+                     curses.COLS / 8,
+                     curses.LINES / 2 - 2,
+                     curses.COLS / 3)
+        p4.set_userptr("p4")
+
+        p5 = mkpanel(curses.COLOR_MAGENTA,
+                     curses.LINES / 2 - 2,
+                     curses.COLS / 8,
+                     curses.LINES / 2,
+                     curses.COLS / 2 - 2)
+        p5.set_userptr("p5")
+
+        fill_panel(p1)
+        fill_panel(p2)
+        fill_panel(p3)
+        fill_panel(p4)
+        fill_panel(p5)
+        p4.hide()
+        p5.hide()
+        pflush()
+        saywhat("press any key to continue")
+        wait_a_while()
+
+        saywhat("h3 s1 s2 s4 s5;press any key to continue")
+        p1.move(0, 0)
+        p3.hide()
+        p1.show()
+        p2.show()
+        p4.show()
+        p5.show()
+        pflush()
+        wait_a_while()
+
+        saywhat("s1; press any key to continue")
+        p1.show()
+        pflush()
+        wait_a_while()
+
+        saywhat("s2; press any key to continue")
+        p2.show()
+        pflush()
+        wait_a_while()
+
+        saywhat("m2; press any key to continue")
+        p2.move(curses.LINES / 3 + 1, curses.COLS / 8)
+        pflush()
+        wait_a_while()
+
+        saywhat("s3; press any key to continue")
+        p3.show()
+        pflush()
+        wait_a_while()
+
+        saywhat("m3; press any key to continue")
+        p3.move(curses.LINES / 4 + 1, curses.COLS / 15)
+        pflush()
+        wait_a_while()
+
+        saywhat("b3; press any key to continue")
+        p3.bottom()
+        pflush()
+        wait_a_while()
+
+        saywhat("s4; press any key to continue")
+        p4.show()
+        pflush()
+        wait_a_while()
+
+        saywhat("s5; press any key to continue")
+        p5.show()
+        pflush()
+        wait_a_while()
+
+        saywhat("t3; press any key to continue")
+        p3.top()
+        pflush()
+        wait_a_while()
+
+        saywhat("t1; press any key to continue")
+        p1.show()
+        pflush()
+        wait_a_while()
+
+        saywhat("t2; press any key to continue")
+        p2.show()
+        pflush()
+        wait_a_while()
+
+        saywhat("t3; press any key to continue")
+        p3.show()
+        pflush()
+        wait_a_while()
+
+        saywhat("t4; press any key to continue")
+        p4.show()
+        pflush()
+        wait_a_while()
+
+        for itmp in range(0, 6):
+            w4 = p4.window()
+            w5 = p5.window()
+
+            saywhat("m4; press any key to continue")
+            w4.move(curses.LINES / 8, 1)
+            w4.addstr(mod[itmp])
+            p4.move(curses.LINES / 6, itmp * curses.COLS / 8)
+            w5.move(curses.LINES / 6, 1)
+            w5.addstr(mod[itmp])
+            pflush()
+            wait_a_while()
+            
+            saywhat("m5; press any key to continue")
+            w4.move(curses.LINES / 6, 1)
+            w4.addstr(mod[itmp])
+            p5.move(curses.LINES / 3 - 1, itmp * 10 + 6)
+            w5.move(curses.LINES / 8, 1)
+            w5.addstr(mod[itmp])
+            pflush()
+            wait_a_while()
+            
+        saywhat("m4; press any key to continue")
+        p4.move(curses.LINES / 6, (itmp + 1) * curses.COLS / 8)
+        pflush()
+        wait_a_while()
+
+        saywhat("t5; press any key to continue")
+        p5.top()
+        pflush()
+        wait_a_while()
+
+        saywhat("t2; press any key to continue")
+        p2.top()
+        pflush()
+        wait_a_while()
+
+        saywhat("t1; press any key to continue")
+        p1.top()
+        pflush()
+        wait_a_while()
+
+        saywhat("d2; press any key to continue")
+        del p2
+        pflush()
+        wait_a_while()
+
+        saywhat("h3; press any key to continue")
+        p3.hide()
+        pflush()
+        wait_a_while()
+
+        saywhat("d1; press any key to continue")
+        del p1
+        pflush()
+        wait_a_while()
+
+        saywhat("d4; press any key to continue")
+        del p4
+        pflush()
+        wait_a_while()
+
+        saywhat("d5; press any key to continue")
+        del p5
+        pflush()
+        wait_a_while()
+        if nap_msec == 1:
+            break
+        nap_msec = 100
+
+#
+# one fine day there'll be the menu at this place
+#
+curses.wrapper(demo_panels)
diff --git a/Demo/curses/rain.py b/Demo/curses/rain.py
new file mode 100644
index 0000000..2399d7f
--- /dev/null
+++ b/Demo/curses/rain.py
@@ -0,0 +1,94 @@
+#!/usr/bin/env python
+#
+# $Id$
+#
+# somebody should probably check the randrange()s...
+
+import curses
+from random import randrange
+
+def next_j(j):
+    if j == 0:
+        j = 4
+    else:
+        j -= 1
+
+    if curses.has_colors():
+        z = randrange(0, 3)
+        color = curses.color_pair(z)
+        if z:
+            color = color | curses.A_BOLD
+        stdscr.attrset(color)
+
+    return j
+
+def main(win):
+    # we know that the first argument from curses.wrapper() is stdscr.
+    # Initialize it globally for convenience.
+    global stdscr
+    stdscr = win
+    
+    if curses.has_colors():
+        bg = curses.COLOR_BLACK
+        curses.init_pair(1, curses.COLOR_BLUE, bg)
+        curses.init_pair(2, curses.COLOR_CYAN, bg)
+    
+    curses.nl()
+    curses.noecho()
+    # XXX curs_set() always returns ERR
+    # curses.curs_set(0)
+    stdscr.timeout(0)
+    
+    c = curses.COLS - 4
+    r = curses.LINES - 4
+    xpos = [0] * c
+    ypos = [0] * r
+    for j in range(4, -1, -1):
+        xpos[j] = randrange(0, c) + 2
+        ypos[j] = randrange(0, r) + 2
+    
+    j = 0
+    while 1:
+        x = randrange(0, c) + 2
+        y = randrange(0, r) + 2
+        
+        stdscr.addch(y, x, ord('.'))
+        
+        stdscr.addch(ypos[j], xpos[j], ord('o'))
+        
+        j = next_j(j)
+        stdscr.addch(ypos[j], xpos[j], ord('O'))
+        
+        j = next_j(j)
+        stdscr.addch( ypos[j] - 1, xpos[j],     ord('-'))
+        stdscr.addstr(ypos[j],     xpos[j] - 1, "|.|")
+        stdscr.addch( ypos[j] + 1, xpos[j],     ord('-'))
+        
+        j = next_j(j)
+        stdscr.addch( ypos[j] - 2, xpos[j],     ord('-'))
+        stdscr.addstr(ypos[j] - 1, xpos[j] - 1, "/ \\")
+        stdscr.addstr(ypos[j],     xpos[j] - 2, "| O |")
+        stdscr.addstr(ypos[j] + 1, xpos[j] - 1, "\\ /")
+        stdscr.addch( ypos[j] + 2, xpos[j],     ord('-'))
+        
+        j = next_j(j)
+        stdscr.addch( ypos[j] - 2, xpos[j],     ord(' '))
+        stdscr.addstr(ypos[j] - 1, xpos[j] - 1, "   ")
+        stdscr.addstr(ypos[j],     xpos[j] - 2, "     ")
+        stdscr.addstr(ypos[j] + 1, xpos[j] - 1, "   ")
+        stdscr.addch( ypos[j] + 2, xpos[j],     ord(' '))
+        
+        xpos[j] = x
+        ypos[j] = y
+
+        ch = stdscr.getch()
+        if ch == ord('q') or ch == ord('Q'):
+            return 0
+        elif ch == ord('s'):
+            stdscr.nodelay(0)
+        elif ch == ord(' '):
+            stdscr.nodelay(1)
+
+        curses.napms(50)
+        
+curses.wrapper(main)
diff --git a/Demo/curses/tclock.py b/Demo/curses/tclock.py
new file mode 100644
index 0000000..adc0056
--- /dev/null
+++ b/Demo/curses/tclock.py
@@ -0,0 +1,149 @@
+#!/usr/bin/env python
+#
+# $Id$
+#
+# From tclock.c, Copyright Howard Jones <ha.jones@ic.ac.uk>, September 1994.
+
+from math import *
+import curses, time
+
+ASPECT = 2.2
+
+def sign(_x):
+    if _x < 0: return -1
+    return 1
+
+def A2XY(angle, radius):
+    return int(round(ASPECT * radius * sin(angle))), int(round(radius * cos(angle)))
+
+def plot(x, y, col):
+    stdscr.addch(y, x, col)
+
+# draw a diagonal line using Bresenham's algorithm
+def dline(pair, from_x, from_y, x2, y2, ch):
+    if curses.has_colors():
+        stdscr.attrset(curses.color_pair(pair))
+
+    dx = x2 - from_x
+    dy = y2 - from_y
+
+    ax = abs(dx * 2)
+    ay = abs(dy * 2)
+
+    sx = sign(dx)
+    sy = sign(dy)
+
+    x = from_x
+    y = from_y
+
+    if ax > ay:
+        d = ay - ax / 2
+
+        while 1:
+            plot(x, y, ch)
+            if x == x2:
+                return
+
+            if d >= 0:
+                y += sy
+                d -= ax
+            x += sx
+            d += ay
+    else:
+        d = ax - ay / 2
+
+        while 1:
+            plot(x, y, ch)
+            if y == y2:
+                return
+
+            if d >= 0:
+                x += sx
+                d -= ay
+            y += sy
+            d += ax
+
+def main(win):
+    global stdscr
+    stdscr = win
+    
+    lastbeep = -1
+    my_bg = curses.COLOR_BLACK
+
+    stdscr.nodelay(1)
+    stdscr.timeout(0)
+#    curses.curs_set(0)
+    if curses.has_colors():
+        curses.init_pair(1, curses.COLOR_RED, my_bg)
+        curses.init_pair(2, curses.COLOR_MAGENTA, my_bg)
+        curses.init_pair(3, curses.COLOR_GREEN, my_bg)
+
+    cx = (curses.COLS - 1) / 2
+    cy = curses.LINES / 2
+    if cx > cy:
+        ch = cy
+    else:
+        ch = cx
+    mradius = (3 * cy) / 4
+    hradius = cy / 2
+    sradius = (2 * cy) / 3
+
+    for i in range(0, 12):
+        sangle = (i + 1) * 2.0 * pi / 12.0
+        sradius = 5 * cy / 6
+        sdx, sdy = A2XY(sangle, sradius)
+
+        stdscr.addstr(cy - sdy, cx + sdx, "%d" % (i + 1))
+
+    stdscr.addstr(0, 0,
+                  "ASCII Clock by Howard Jones <ha.jones@ic.ac.uk>, 1994")
+
+    sradius = 8
+    while 1:
+        curses.napms(1000)
+
+        tim = time.time()
+        t = time.localtime(tim)
+
+        hours = t[3] + t[4] / 60.0
+        if hours > 12.0:
+            hours -= 12.0
+
+        mangle = t[4] * 2 * pi / 60.0
+        mdx, mdy = A2XY(mangle, mradius)
+
+        hangle = hours * 2 * pi / 12.0
+        hdx, hdy = A2XY(hangle, hradius)
+
+        sangle = t[5] * 2 * pi / 60.0
+        sdx, sdy = A2XY(sangle, sradius)
+
+        dline(3, cx, cy, cx + mdx, cy - mdy, ord('#'))
+
+        stdscr.attrset(curses.A_REVERSE)
+        dline(2, cx, cy, cx + hdx, cy - hdy, ord('.'))
+        stdscr.attroff(curses.A_REVERSE)
+
+        if curses.has_colors():
+            stdscr.attrset(curses.color_pair(1))
+
+        plot(cx + sdx, cy - sdy, ord('O'))
+        
+        if curses.has_colors():
+            stdscr.attrset(curses.color_pair(0))
+
+        stdscr.addstr(curses.LINES - 2, 0, time.ctime(tim))
+        stdscr.refresh()
+        if (t[5] % 5) == 0 and t[5] != lastbeep:
+            lastbeep = t[5]
+            curses.beep()
+
+        ch = stdscr.getch()
+        if ch == ord('q'):
+            return 0
+
+        plot(cx + sdx, cy - sdy, ord(' '))
+        dline(0, cx, cy, cx + hdx, cy - hdy, ord(' '))
+        dline(0, cx, cy, cx + mdx, cy - mdy, ord(' '))
+
+curses.wrapper(main)
