diff --git a/procps/ps.c b/procps/ps.c
index b8e4cd3..97a5d6b 100644
--- a/procps/ps.c
+++ b/procps/ps.c
@@ -23,16 +23,82 @@
 #include <unistd.h>
 #include <dirent.h>
 #include <stdio.h>
+#include <fcntl.h>
+#include <ctype.h>
+
+
+typedef struct proc_s {
+    char
+    	cmd[16];	/* basename of executable file in call to exec(2) */
+    int
+        ruid, rgid,     /* real only (sorry) */
+    	pid,		/* process id */
+    	ppid;		/* pid of parent process */
+    char
+    	state;		/* single-char code for process state (S=sleeping) */
+} proc_t;
+
+
+
+static int file2str(char *filename, char *ret, int cap) 
+{
+    int fd, num_read;
+
+    if ( (fd       = open(filename, O_RDONLY, 0)) == -1 ) return -1;
+    if ( (num_read = read(fd, ret, cap - 1))      <= 0 ) return -1;
+    ret[num_read] = 0;
+    close(fd);
+    return num_read;
+}
+
+
+static void parse_proc_status(char* S, proc_t* P) 
+{
+    char* tmp;
+    memset(P->cmd, 0, sizeof P->cmd);
+    sscanf (S, "Name:\t%15c", P->cmd);
+    tmp = strchr(P->cmd,'\n');
+    if (tmp)
+	*tmp='\0';
+    tmp = strstr (S,"State");
+    sscanf (tmp, "State:\t%c", &P->state);
+
+    tmp = strstr (S,"Pid:");
+    if(tmp) sscanf (tmp,
+        "Pid:\t%d\n"
+        "PPid:\t%d\n",
+        &P->pid,
+        &P->ppid
+    );
+    else fprintf(stderr, "Internal error!\n");
+
+    /* For busybox, ignoring effecting, saved, etc */
+    tmp = strstr (S,"Uid:");
+    if(tmp) sscanf (tmp,
+        "Uid:\t%d", &P->ruid);
+    else fprintf(stderr, "Internal error!\n");
+
+    tmp = strstr (S,"Gid:");
+    if(tmp) sscanf (tmp,
+        "Gid:\t%d", &P->rgid);
+    else fprintf(stderr, "Internal error!\n");
+
+}
 
 
 extern int ps_main(int argc, char **argv)
 {
+    proc_t p;
     DIR *dir;
     FILE *file;
     struct dirent *entry;
+    char path[32], sbuf[512];
+    char uidName[10]="";
+    char groupName[10]="";
+    int i, c;
 
     if ( argc>1 && **(argv+1) == '-' ) {
-	usage ("ps\n");
+	usage ("ps - report process status\nThis version of ps accepts no options.\n");
     }
     
     dir = opendir("/proc");
@@ -41,28 +107,44 @@
 	exit(FALSE);
     }
 
-    fprintf(stdout, "PID\tUid\tGid\tState\tName\n");
+    fprintf(stdout, "%5s  %-8s %-3s %5s %s\n", "PID", "Uid", "Gid", "State", "Command");
     while ((entry = readdir(dir)) != NULL) {
-	char psStatus[NAME_MAX];
-	char psName[NAME_MAX]="";
-	char psState[NAME_MAX]="";
-	int psPID=0, psPPID=0, psUid=0, psGid=0;
-	//if (match(entry->d_name, "[0-9]") == FALSE)
-	//    continue;
-	sprintf(psStatus, "/proc/%s/status", entry->d_name);
-	file = fopen( psStatus, "r");
-	if (file == NULL) {
+	uidName[0]='\0';
+	groupName[0]='\0';
+		
+	if (! isdigit(*entry->d_name))
 	    continue;
-	    //perror(psStatus);
-	    //exit( FALSE);
+	sprintf(path, "/proc/%s/status", entry->d_name);
+	if ((file2str(path, sbuf, sizeof sbuf)) != -1 ) {
+	    parse_proc_status(sbuf, &p);
 	}
-	fscanf(file, "Name:\t%s\nState:\t%s\nPid:\t%d\nPPid:\t%d\nUid:\t%d\nGid:\t%d", 
-		psName, psState, &psPID, &psPPID, &psUid, &psGid);
-	fclose(file);
 
-	fprintf(stdout, "%d\t%d\t%d\t%s\t%s\n", psPID, psUid, psGid, psState, psName);
+	/* Make some adjustments as needed */
+	my_getpwuid( uidName, p.ruid);
+	my_getgrgid( groupName, p.rgid);
+	if (*uidName == '\0')
+	    sprintf( uidName, "%d", p.ruid);
+	if (*groupName == '\0')
+	    sprintf( groupName, "%d", p.rgid);
+
+	fprintf(stdout, "%5d %-8s %-8s %c ", p.pid, uidName, groupName, p.state);
+	sprintf(path, "/proc/%s/cmdline", entry->d_name);
+	file = fopen(path, "r");
+	if (file == NULL) {
+	    perror(path);
+	    exit(FALSE);
+	}
+	i=0;
+	while (((c = getc(file)) != EOF) && (i < 53)) {
+	    i++;
+	    if (c == '\0')
+		c = ' ';
+	    putc(c, stdout);
+	}
+	if (i==0)
+	    fprintf(stdout, "%s", p.cmd);
+	fprintf(stdout, "\n");
     }
     closedir(dir);
     exit(TRUE);
 }
-
