diff --git a/test/hanoi.c b/test/hanoi.c
index 7447ae2..6d92332 100644
--- a/test/hanoi.c
+++ b/test/hanoi.c
@@ -1,5 +1,6 @@
 /****************************************************************************
- * Copyright (c) 1998-2013,2014 Free Software Foundation, Inc.              *
+ * Copyright 2019-2021,2022 Thomas E. Dickey                                *
+ * Copyright 1998-2014,2017 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            *
@@ -41,7 +42,7 @@
  *
  *	Date: 05.Nov.90
  *
- * $Id: hanoi.c,v 1.36 2014/08/02 17:24:07 tom Exp $
+ * $Id: hanoi.c,v 1.47 2022/12/04 00:40:11 tom Exp $
  */
 
 #include <test.priv.h>
@@ -89,104 +90,6 @@
 static int NMoves = 0;
 static bool AutoFlag = FALSE;
 
-static void InitTiles(void);
-static void DisplayTiles(void);
-static void MakeMove(int From, int To);
-static void AutoMove(int From, int To, int Num);
-static void Usage(void);
-static int Solved(int NumTiles);
-static int GetMove(int *From, int *To);
-static int InvalidMove(int From, int To);
-
-int
-main(int argc, char **argv)
-{
-    int FromCol, ToCol;
-
-    setlocale(LC_ALL, "");
-
-    switch (argc) {
-    case 1:
-	NTiles = DEFAULTTILES;
-	break;
-    case 2:
-	NTiles = atoi(argv[1]);
-	if (NTiles > MAXTILES || NTiles < MINTILES) {
-	    fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES);
-	    ExitProgram(EXIT_FAILURE);
-	}
-	break;
-    case 3:
-	if (strcmp(argv[2], "a")) {
-	    Usage();
-	    ExitProgram(EXIT_FAILURE);
-	}
-	NTiles = atoi(argv[1]);
-	if (NTiles > MAXTILES || NTiles < MINTILES) {
-	    fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES);
-	    ExitProgram(EXIT_FAILURE);
-	}
-	AutoFlag = TRUE;
-	break;
-    default:
-	Usage();
-	ExitProgram(EXIT_FAILURE);
-    }
-    initscr();
-    if (has_colors()) {
-	int i;
-	short bg = COLOR_BLACK;
-	start_color();
-#if HAVE_USE_DEFAULT_COLORS
-	if (use_default_colors() == OK)
-	    bg = -1;
-#endif
-	for (i = 0; i < 9; i++)
-	    init_pair((short) (i + 1), bg, TileColour[i]);
-    }
-    cbreak();
-    if (LINES < 24) {
-	endwin();
-	fprintf(stderr, "Min screen length 24 lines\n");
-	ExitProgram(EXIT_FAILURE);
-    }
-    if (AutoFlag) {
-	curs_set(0);
-	leaveok(stdscr, TRUE);	/* Attempt to remove cursor */
-    }
-    InitTiles();
-    DisplayTiles();
-    if (AutoFlag) {
-	do {
-	    noecho();
-	    AutoMove(0, 2, NTiles);
-	} while (!Solved(NTiles));
-	sleep(2);
-    } else {
-	echo();
-	for (;;) {
-	    if (GetMove(&FromCol, &ToCol))
-		break;
-	    if (InvalidMove(FromCol, ToCol)) {
-		MvAddStr(STATUSLINE, 0, "Invalid Move !!");
-		refresh();
-		beep();
-		continue;
-	    }
-	    MakeMove(FromCol, ToCol);
-	    if (Solved(NTiles)) {
-		MvPrintw(STATUSLINE, 0,
-			 "Well Done !! You did it in %d moves", NMoves);
-		refresh();
-		sleep(5);
-		break;
-	    }
-	}
-    }
-    endwin();
-    ExitProgram(EXIT_SUCCESS);
-}
-
 static int
 InvalidMove(int From, int To)
 {
@@ -222,6 +125,15 @@
     Pegs[2].Count = 0;
 }
 
+static int
+two2n(int n)
+{
+    int result = 1;
+    while (n-- > 0)
+	result *= 2;
+    return result;
+}
+
 static void
 DisplayTiles(void)
 {
@@ -231,7 +143,7 @@
     erase();
     MvAddStr(1, 24, "T O W E R S   O F   H A N O I");
     MvAddStr(3, 34, "SJR 1990");
-    MvPrintw(19, 5, "Moves : %d of %.0f", NMoves, pow(2.0, (float) NTiles) - 1);
+    MvPrintw(19, 5, "Moves : %d of %d", NMoves, two2n(NTiles) - 1);
     (void) attrset(A_REVERSE);
     MvAddStr(BASELINE, 8,
 	     "                                                               ");
@@ -329,9 +241,136 @@
 }
 
 static void
-Usage(void)
+usage(int ok)
 {
-    fprintf(stderr, "Usage: hanoi [<No Of Tiles>] [a]\n");
-    fprintf(stderr,
-	    "The 'a' option causes the tower to be solved automatically\n");
+    static const char *msg[] =
+    {
+	"Usage: hanoi [options] [[<No Of Tiles>] [a]]"
+	,""
+	,USAGE_COMMON
+	,"Options:"
+#if HAVE_USE_DEFAULT_COLORS
+	," -d       invoke use_default_colors"
+#endif
+	," -n NUM   set number of tiles (positional param is deprecated)"
+	," -X       solve automatically (positional \"a\" is deprecated)"
+    };
+    size_t n;
+
+    for (n = 0; n < SIZEOF(msg); n++)
+	fprintf(stderr, "%s\n", msg[n]);
+
+    ExitProgram(ok ? EXIT_SUCCESS : EXIT_FAILURE);
+}
+/* *INDENT-OFF* */
+VERSION_COMMON()
+/* *INDENT-ON* */
+
+int
+main(int argc, char **argv)
+{
+    int ch, FromCol, ToCol;
+
+#if HAVE_USE_DEFAULT_COLORS
+    bool d_option = FALSE;
+#endif
+
+    NTiles = DEFAULTTILES;
+    while ((ch = getopt(argc, argv, OPTS_COMMON "dn:X")) != -1) {
+	switch (ch) {
+#if HAVE_USE_DEFAULT_COLORS
+	case 'd':
+	    d_option = TRUE;
+	    break;
+#endif
+	case 'n':
+	    NTiles = atoi(optarg);
+	    break;
+	case 'X':
+	    AutoFlag = TRUE;
+	    break;
+	case OPTS_VERSION:
+	    show_version(argv);
+	    ExitProgram(EXIT_SUCCESS);
+	default:
+	    usage(ch == OPTS_USAGE);
+	    /* NOTREACHED */
+	}
+    }
+    setlocale(LC_ALL, "");
+
+    switch (argc - optind) {
+    case 2:
+	if (strcmp(argv[optind + 1], "a")) {
+	    usage(FALSE);
+	}
+	AutoFlag = TRUE;
+	/* FALLTHRU */
+    case 1:
+	NTiles = atoi(argv[optind]);
+	/* FALLTHRU */
+    case 0:
+	break;
+    default:
+	usage(FALSE);
+    }
+
+    if (NTiles > MAXTILES || NTiles < MINTILES) {
+	fprintf(stderr, "Range %d to %d\n", MINTILES, MAXTILES);
+	usage(FALSE);
+    }
+
+    initscr();
+    if (has_colors()) {
+	int i;
+	short bg = COLOR_BLACK;
+	start_color();
+#if HAVE_USE_DEFAULT_COLORS
+	if (d_option && (use_default_colors() == OK))
+	    bg = -1;
+#endif
+	for (i = 0; i < 9; i++)
+	    init_pair((short) (i + 1), bg, TileColour[i]);
+    }
+    cbreak();
+    if (LINES < 24) {
+	endwin();
+	fprintf(stderr, "Min screen length 24 lines\n");
+	ExitProgram(EXIT_FAILURE);
+    }
+    if (AutoFlag) {
+	curs_set(0);
+	leaveok(stdscr, TRUE);	/* Attempt to remove cursor */
+    }
+    InitTiles();
+    DisplayTiles();
+    if (AutoFlag) {
+	do {
+	    noecho();
+	    AutoMove(0, 2, NTiles);
+	} while (!Solved(NTiles));
+	sleep(2);
+    } else {
+	echo();
+	for (;;) {
+	    if (GetMove(&FromCol, &ToCol))
+		break;
+	    if (InvalidMove(FromCol, ToCol)) {
+		MvAddStr(STATUSLINE, 0, "Invalid Move !!");
+		refresh();
+		beep();
+		continue;
+	    }
+	    MakeMove(FromCol, ToCol);
+	    if (Solved(NTiles)) {
+		MvPrintw(STATUSLINE, 0,
+			 "Well Done !! You did it in %d moves", NMoves);
+		refresh();
+		sleep(5);
+		break;
+	    }
+	}
+    }
+    stop_curses();
+    ExitProgram(EXIT_SUCCESS);
 }
