diff -pruN coreutils-5.2.1_orig/man/cp.1 coreutils-5.2.1/man/cp.1
--- coreutils-5.2.1_orig/man/cp.1	2004-03-02 23:51:05.000000000 +0100
+++ coreutils-5.2.1/man/cp.1	2005-01-21 20:54:29.298804960 +0100
@@ -33,6 +33,9 @@ copy contents of special files when recu
 \fB\-d\fR
 same as \fB\-\-no\-dereference\fR \fB\-\-preserve\fR=\fIlink\fR
 .TP
+\fB\-D\fR
+shows progress in % while copying
+.TP
 \fB\-\-no\-dereference\fR
 never follow symbolic links
 .TP
diff -pruN coreutils-5.2.1_orig/man/mv.1 coreutils-5.2.1/man/mv.1
--- coreutils-5.2.1_orig/man/mv.1	2004-03-02 23:52:29.000000000 +0100
+++ coreutils-5.2.1/man/mv.1	2005-01-21 20:54:29.299804808 +0100
@@ -24,6 +24,9 @@ make a backup of each existing destinati
 \fB\-b\fR
 like \fB\-\-backup\fR but does not accept an argument
 .TP
+\fB\-D\fR
+shows progress in % while copying (only between file-systems)
+.TP
 \fB\-f\fR, \fB\-\-force\fR
 do not prompt before overwriting
 (equivalent to \fB\-\-reply\fR=\fIyes\fR)
diff -pruN coreutils-5.2.1_orig/src/copy.c coreutils-5.2.1/src/copy.c
--- coreutils-5.2.1_orig/src/copy.c	2004-03-12 12:48:59.000000000 +0100
+++ coreutils-5.2.1/src/copy.c	2005-01-21 20:56:16.503507368 +0100
@@ -215,6 +215,8 @@ copy_reg (const char *src_path, const ch
   off_t n_read_total = 0;
   int last_write_made_hole = 0;
   int make_holes = 0;
+  int t_read = 0;
+  int p_stat = 0;
 
   source_desc = open (src_path, O_RDONLY);
   if (source_desc < 0)
@@ -373,12 +375,40 @@ copy_reg (const char *src_path, const ch
       if (ip == 0)
 	{
 	  size_t n = n_read;
-	  if (full_write (dest_desc, buf, n) != n)
+ 	  int n_written = 0;
+ 	  n_written = full_write (dest_desc, buf, n_read);
+ 	  if (n_written < 0)
 	    {
 	      error (0, errno, _("writing %s"), quote (dst_path));
 	      return_val = -1;
 	      goto close_src_and_dst_desc;
 	    }
+ 	  else if (x->dotted_copy_style)
+ 	    { /* TODO: insert dotted copy style */
+ 	      int f_size = (int)sb.st_size;
+ 	      t_read += n_written;
+ 	      if ( (int)(((float)t_read / (float)f_size) * 100) > p_stat)
+ 	        {
+ 		  p_stat = (int)(((float)t_read / (float)f_size) * 100);
+ 		  if (p_stat < 100)
+ 		    {
+ 		      if (p_stat < 10)
+ 		        {
+ 		          printf("\r%s:   %i%% copied", quote (src_path), p_stat);
+ 		        }
+ 		     else
+ 		        {
+ 			  printf("\r%s:  %i%% copied", quote (src_path), p_stat);
+ 		        }
+ 		    }
+ 		  else
+ 		    {
+ 		      printf("\r%s: %i%% copied\n", quote (src_path), p_stat);
+ 		    }
+ 		  fflush(stdout);
+ 	        }
+ 	    }
+ 	
 	  last_write_made_hole = 0;
 	}
     }
diff -pruN coreutils-5.2.1_orig/src/copy.h coreutils-5.2.1/src/copy.h
--- coreutils-5.2.1_orig/src/copy.h	2004-02-07 17:00:59.000000000 +0100
+++ coreutils-5.2.1/src/copy.h	2005-01-21 20:54:29.304804048 +0100
@@ -61,6 +61,8 @@ enum Dereference_symlink
 struct cp_options
 {
   enum backup_type backup_type;
+  int dotted_copy_style;
+  /* If 1, shows x% copied */
 
   /* If nonzero, copy all files except (directories and, if not dereferencing
      them, symbolic links,) as if they were regular files. */
diff -pruN coreutils-5.2.1_orig/src/cp.c coreutils-5.2.1/src/cp.c
--- coreutils-5.2.1_orig/src/cp.c	2004-02-07 16:55:09.000000000 +0100
+++ coreutils-5.2.1/src/cp.c	2005-01-21 20:54:29.307803592 +0100
@@ -175,6 +175,9 @@ Mandatory arguments to long options are 
       --copy-contents          copy contents of special files when recursive\n\
   -d                           same as --no-dereference --preserve=link\n\
 "), stdout);
+      fputs(_("\
+  -D                           print copyprogress in %\n\
+"), stdout);
       fputs (_("\
       --no-dereference         never follow symbolic links\n\
   -f, --force                  if an existing destination file cannot be\n\
@@ -715,6 +718,7 @@ cp_option_init (struct cp_options *x)
   x->myeuid = geteuid ();
   x->move_mode = 0;
   x->one_file_system = 0;
+  x->dotted_copy_style = 0;
 
   x->preserve_ownership = 0;
   x->preserve_links = 0;
@@ -844,7 +848,7 @@ main (int argc, char **argv)
      we'll actually use backup_suffix_string.  */
   backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
 
-  while ((c = getopt_long (argc, argv, "abdfHilLprsuvxPRS:V:", long_opts, NULL))
+  while ((c = getopt_long (argc, argv, "abdDfHilLprsuvxPRS:V:", long_opts, NULL))
 	 != -1)
     {
       switch (c)
@@ -889,6 +893,10 @@ main (int argc, char **argv)
 	  x.dereference = DEREF_NEVER;
 	  break;
 
+	case 'D':
+	  x.dotted_copy_style = 1;
+	  break;
+
 	case 'f':
 	  x.unlink_dest_after_failed_open = 1;
 	  break;
diff -pruN coreutils-5.2.1_orig/src/mv.c coreutils-5.2.1/src/mv.c
--- coreutils-5.2.1_orig/src/mv.c	2004-02-07 16:41:02.000000000 +0100
+++ coreutils-5.2.1/src/mv.c	2005-01-21 20:54:29.309803288 +0100
@@ -130,6 +130,7 @@ cp_option_init (struct cp_options *x)
   x->symbolic_link = 0;
   x->set_mode = 0;
   x->mode = 0;
+  x->dotted_copy_style = 0;
   x->stdin_tty = isatty (STDIN_FILENO);
 
   /* Find out the current file creation mask, to knock the right bits
@@ -318,6 +319,7 @@ Mandatory arguments to long options are 
       fputs (_("\
       --backup[=CONTROL]       make a backup of each existing destination file\n\
   -b                           like --backup but does not accept an argument\n\
+  -D                           print moveprogress in %\n\
   -f, --force                  do not prompt before overwriting\n\
                                  (equivalent to --reply=yes)\n\
   -i, --interactive            prompt before overwrite\n\
@@ -388,7 +390,7 @@ main (int argc, char **argv)
 
   errors = 0;
 
-  while ((c = getopt_long (argc, argv, "bfiuvS:V:", long_options, NULL)) != -1)
+  while ((c = getopt_long (argc, argv, "bDfiuvS:V:", long_options, NULL)) != -1)
     {
       switch (c)
 	{
@@ -407,6 +409,9 @@ main (int argc, char **argv)
 	  if (optarg)
 	    version_control_string = optarg;
 	  break;
+	case 'D':
+	  x.dotted_copy_style = 1;
+	  break;
 	case 'f':
 	  x.interactive = I_ALWAYS_YES;
 	  break;
