Index: uspace/app/copy/copy.c
===================================================================
--- uspace/app/copy/copy.c	(revision 2309891a40e1d152d79920dd348288280124e4fb)
+++ uspace/app/copy/copy.c	(revision 79b77ce198ae82ef6cfa63bc7177b73d5108b6d8)
@@ -133,4 +133,5 @@
 	cons_event_t event;
 	kbd_event_t *ev;
+	const char *opstr = NULL;
 	errno_t rc;
 
@@ -143,7 +144,21 @@
 		putchar('\n');
 
-	fprintf(stderr, "I/O error %s file '%s' (%s).\n",
-	    err->optype == fmgt_io_write ? "writing" : "reading",
-	    err->fname, str_error(err->rc));
+	switch (err->optype) {
+	case fmgt_io_read:
+		opstr = "reading";
+		break;
+	case fmgt_io_write:
+		opstr = "writing";
+		break;
+	case fmgt_io_create:
+		opstr = "creating";
+		break;
+	case fmgt_io_open:
+		opstr = "opening";
+		break;
+	}
+
+	fprintf(stderr, "I/O error %s file '%s' (%s).\n", opstr, err->fname,
+	    str_error(err->rc));
 	fprintf(stderr, "[A]bort or [R]etry?\n");
 
Index: uspace/lib/fmgt/include/types/fmgt.h
===================================================================
--- uspace/lib/fmgt/include/types/fmgt.h	(revision 2309891a40e1d152d79920dd348288280124e4fb)
+++ uspace/lib/fmgt/include/types/fmgt.h	(revision 79b77ce198ae82ef6cfa63bc7177b73d5108b6d8)
@@ -65,5 +65,9 @@
 	fmgt_io_read,
 	/** Write */
-	fmgt_io_write
+	fmgt_io_write,
+	/** Open */
+	fmgt_io_open,
+	/** Create */
+	fmgt_io_create
 } fmgt_io_op_type_t;
 
Index: uspace/lib/fmgt/src/copy.c
===================================================================
--- uspace/lib/fmgt/src/copy.c	(revision 2309891a40e1d152d79920dd348288280124e4fb)
+++ uspace/lib/fmgt/src/copy.c	(revision 79b77ce198ae82ef6cfa63bc7177b73d5108b6d8)
@@ -97,14 +97,26 @@
 {
 	fmgt_t *fmgt = (fmgt_t *)arg;
-	errno_t rc;
-
-	rc = vfs_link_path(dest, KIND_DIRECTORY, NULL);
-
-	/* It is okay if the directory exists. */
-	if (rc != EOK && rc != EEXIST)
-		return rc; // XXX error recovery?
-
-	(void)fmgt;
-	return EOK;
+	fmgt_io_error_t err;
+	fmgt_error_action_t action;
+	errno_t rc;
+
+	do {
+		rc = vfs_link_path(dest, KIND_DIRECTORY, NULL);
+
+		/* It is okay if the directory exists. */
+		if (rc == EOK || rc == EEXIST)
+			break;
+
+		/* I/O error */
+		err.fname = dest;
+		err.optype = fmgt_io_create;
+		err.rc = rc;
+
+		fmgt_timer_stop(fmgt);
+		action = fmgt_io_error_query(fmgt, &err);
+		fmgt_timer_start(fmgt);
+	} while (action == fmgt_er_retry);
+
+	return rc;
 }
 
@@ -133,12 +145,39 @@
 		return ENOMEM;
 
-	rc = vfs_lookup_open(src, WALK_REGULAR, MODE_READ, &rfd);
+	do {
+		rc = vfs_lookup_open(src, WALK_REGULAR, MODE_READ, &rfd);
+		if (rc == EOK)
+			break;
+
+		/* I/O error */
+		err.fname = src;
+		err.optype = fmgt_io_open;
+		err.rc = rc;
+		fmgt_timer_stop(fmgt);
+		action = fmgt_io_error_query(fmgt, &err);
+		fmgt_timer_start(fmgt);
+	} while (action == fmgt_er_retry);
+
+	/* Not recovered? */
 	if (rc != EOK) {
 		free(buffer);
-		return rc; // XXX error recovery?
+		return rc;
 	}
 
-	rc = vfs_lookup_open(dest, WALK_REGULAR | WALK_MAY_CREATE, MODE_WRITE,
-	    &wfd);
+	do {
+		rc = vfs_lookup_open(dest, WALK_REGULAR | WALK_MAY_CREATE,
+		    MODE_WRITE, &wfd);
+		if (rc == EOK)
+			break;
+
+		/* I/O error */
+		err.fname = dest;
+		err.optype = fmgt_io_create;
+		err.rc = rc;
+		fmgt_timer_stop(fmgt);
+		action = fmgt_io_error_query(fmgt, &err);
+		fmgt_timer_start(fmgt);
+	} while (action == fmgt_er_retry);
+
 	if (rc != EOK) {
 		free(buffer);
