diff --git a/kill.c b/kill.c
index 34cbc4d..3884ebd 100644
--- a/kill.c
+++ b/kill.c
@@ -34,96 +34,11 @@
 static const int KILL = 0;
 static const int KILLALL = 1;
 
-struct signal_name {
-	const char *name;
-	int number;
-};
-
-static const struct signal_name signames[] = {
-	/* POSIX signals */
-	{ "HUP",	SIGHUP },	/* 1 */
-	{ "INT",	SIGINT }, 	/* 2 */
-	{ "QUIT",	SIGQUIT }, 	/* 3 */
-	{ "ILL",	SIGILL }, 	/* 4 */
-	{ "ABRT",	SIGABRT }, 	/* 6 */
-	{ "FPE",	SIGFPE }, 	/* 8 */
-	{ "KILL",	SIGKILL }, 	/* 9 */
-	{ "SEGV",	SIGSEGV }, 	/* 11 */
-	{ "PIPE",	SIGPIPE }, 	/* 13 */
-	{ "ALRM",	SIGALRM }, 	/* 14 */
-	{ "TERM",	SIGTERM }, 	/* 15 */
-	{ "USR1",	SIGUSR1 }, 	/* 10 (arm,i386,m68k,ppc), 30 (alpha,sparc*), 16 (mips) */
-	{ "USR2",	SIGUSR2 }, 	/* 12 (arm,i386,m68k,ppc), 31 (alpha,sparc*), 17 (mips) */
-	{ "CHLD",	SIGCHLD }, 	/* 17 (arm,i386,m68k,ppc), 20 (alpha,sparc*), 18 (mips) */
-	{ "CONT",	SIGCONT }, 	/* 18 (arm,i386,m68k,ppc), 19 (alpha,sparc*), 25 (mips) */
-	{ "STOP",	SIGSTOP },	/* 19 (arm,i386,m68k,ppc), 17 (alpha,sparc*), 23 (mips) */
-	{ "TSTP",	SIGTSTP },	/* 20 (arm,i386,m68k,ppc), 18 (alpha,sparc*), 24 (mips) */
-	{ "TTIN",	SIGTTIN },	/* 21 (arm,i386,m68k,ppc,alpha,sparc*), 26 (mips) */
-	{ "TTOU",	SIGTTOU },	/* 22 (arm,i386,m68k,ppc,alpha,sparc*), 27 (mips) */
-	/* Miscellaneous other signals */
-#ifdef SIGTRAP
-	{ "TRAP",	SIGTRAP },	/* 5 */
-#endif
-#ifdef SIGIOT
-	{ "IOT",	SIGIOT }, 	/* 6, same as SIGABRT */
-#endif
-#ifdef SIGEMT
-	{ "EMT",	SIGEMT }, 	/* 7 (mips,alpha,sparc*) */
-#endif
-#ifdef SIGBUS
-	{ "BUS",	SIGBUS },	/* 7 (arm,i386,m68k,ppc), 10 (mips,alpha,sparc*) */
-#endif
-#ifdef SIGSYS
-	{ "SYS",	SIGSYS }, 	/* 12 (mips,alpha,sparc*) */
-#endif
-#ifdef SIGSTKFLT
-	{ "STKFLT",	SIGSTKFLT },	/* 16 (arm,i386,m68k,ppc) */
-#endif
-#ifdef SIGURG
-	{ "URG",	SIGURG },	/* 23 (arm,i386,m68k,ppc), 16 (alpha,sparc*), 21 (mips) */
-#endif
-#ifdef SIGIO
-	{ "IO",		SIGIO },	/* 29 (arm,i386,m68k,ppc), 23 (alpha,sparc*), 22 (mips) */
-#endif
-#ifdef SIGPOLL
-	{ "POLL",	SIGPOLL },	/* same as SIGIO */
-#endif
-#ifdef SIGCLD
-	{ "CLD",	SIGCLD },	/* same as SIGCHLD (mips) */
-#endif
-#ifdef SIGXCPU
-	{ "XCPU",	SIGXCPU },	/* 24 (arm,i386,m68k,ppc,alpha,sparc*), 30 (mips) */
-#endif
-#ifdef SIGXFSZ
-	{ "XFSZ",	SIGXFSZ },	/* 25 (arm,i386,m68k,ppc,alpha,sparc*), 31 (mips) */
-#endif
-#ifdef SIGVTALRM
-	{ "VTALRM",	SIGVTALRM },	/* 26 (arm,i386,m68k,ppc,alpha,sparc*), 28 (mips) */
-#endif
-#ifdef SIGPROF
-	{ "PROF",	SIGPROF },	/* 27 (arm,i386,m68k,ppc,alpha,sparc*), 29 (mips) */
-#endif
-#ifdef SIGPWR
-	{ "PWR",	SIGPWR },	/* 30 (arm,i386,m68k,ppc), 29 (alpha,sparc*), 19 (mips) */
-#endif
-#ifdef SIGINFO
-	{ "INFO",	SIGINFO },	/* 29 (alpha) */
-#endif
-#ifdef SIGLOST
-	{ "LOST",	SIGLOST }, 	/* 29 (arm,i386,m68k,ppc,sparc*) */
-#endif
-#ifdef SIGWINCH
-	{ "WINCH",	SIGWINCH },	/* 28 (arm,i386,m68k,ppc,alpha,sparc*), 20 (mips) */
-#endif
-#ifdef SIGUNUSED
-	{ "UNUSED",	SIGUNUSED },	/* 31 (arm,i386,m68k,ppc) */
-#endif
-	{0, 0}
-};
 
 extern int kill_main(int argc, char **argv)
 {
 	int whichApp, sig = SIGTERM;
+	const char *name;
 
 #ifdef BB_KILLALL
 	/* Figure out what we are trying to do here */
@@ -142,52 +57,37 @@
 		while (*++(*argv)) {
 			switch (**argv) {
 			case 'l':
-				{
+				if(argc>1) {
+					for(argv++; *argv; argv++) {
+						name = u_signal_names(*argv, &sig, -1);
+						if(name!=NULL)
+							printf("%s\n", name);
+					}
+				} else {
 					int col = 0;
-					const struct signal_name *s = signames;
-
-					while (s->name != 0) {
-						col += fprintf(stderr, "%2d) %-8s", s->number, s->name);
-						s++;
+					for(sig=1; sig < NSIG; sig++) {
+						name = u_signal_names(0, &sig, 1);
+						if(name==NULL)  /* unnamed */
+							continue;
+						col += printf("%2d) %-16s", sig, name);
 						if (col > 60) {
-							fprintf(stderr, "\n");
+							printf("\n");
 							col = 0;
 						}
 					}
-					fprintf(stderr, "\n\n");
-					return EXIT_SUCCESS;
+					printf("\n");
 				}
-				break;
+				return EXIT_SUCCESS;
 			case '-':
 				show_usage();
 			default:
-				{
-					if (isdigit(**argv)) {
-						sig = atoi(*argv);
-						if (sig < 0 || sig >= NSIG)
-							goto end;
-						else {
-							argc--;
-							argv++;
-							goto do_it_now;
-						}
-					} else {
-						const struct signal_name *s = signames;
-
-						while (s->name != 0) {
-							if (strcasecmp(s->name, *argv) == 0) {
-								sig = s->number;
+				name = u_signal_names(*argv, &sig, 0);
+				if(name==NULL)
+					error_msg_and_die( "bad signal name: %s", *argv);
 								argc--;
 								argv++;
 								goto do_it_now;
 							}
-							s++;
-						}
-						if (s->name == 0)
-							goto end;
-					}
-				}
-			}
 			argc--;
 			argv++;
 		}
@@ -239,8 +139,4 @@
 #endif
 
 	return EXIT_SUCCESS;
-
-
-  end:
-	error_msg_and_die( "bad signal name: %s", *argv);
 }
