Index: uspace/lib/output/include/io/chargrid.h
===================================================================
--- uspace/lib/output/include/io/chargrid.h	(revision 32ae27bb2ab2a70745223947ea103c3e302cdb50)
+++ uspace/lib/output/include/io/chargrid.h	(revision 1a96db9b57f6dc5fbbe2f9708c1251717b9868bd)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2011 Martin Decky
  * All rights reserved.
@@ -81,4 +82,5 @@
 extern sysarg_t chargrid_putuchar(chargrid_t *, char32_t, bool);
 extern sysarg_t chargrid_newline(chargrid_t *);
+extern sysarg_t chargrid_cr(chargrid_t *);
 extern sysarg_t chargrid_tabstop(chargrid_t *, sysarg_t);
 extern sysarg_t chargrid_backspace(chargrid_t *);
Index: uspace/lib/output/src/chargrid.c
===================================================================
--- uspace/lib/output/src/chargrid.c	(revision 32ae27bb2ab2a70745223947ea103c3e302cdb50)
+++ uspace/lib/output/src/chargrid.c	(revision 1a96db9b57f6dc5fbbe2f9708c1251717b9868bd)
@@ -1,3 +1,4 @@
 /*
+ * Copyright (c) 2025 Jiri Svoboda
  * Copyright (c) 2006 Josef Cejka
  * All rights reserved.
@@ -180,4 +181,21 @@
 }
 
+/** Return cursor to the beginning of the line.
+ *
+ * @param scrbuf Chargrid.
+ *
+ * @return Number of rows which have been affected. In usual
+ *         situations this is 1.
+ *
+ */
+sysarg_t chargrid_cr(chargrid_t *scrbuf)
+{
+	assert(scrbuf->col < scrbuf->cols);
+	assert(scrbuf->row < scrbuf->rows);
+
+	scrbuf->col = 0;
+	return 1;
+}
+
 /** Jump to a new row in chargrid.
  *
Index: uspace/srv/hid/console/console.c
===================================================================
--- uspace/srv/hid/console/console.c	(revision 32ae27bb2ab2a70745223947ea103c3e302cdb50)
+++ uspace/srv/hid/console/console.c	(revision 1a96db9b57f6dc5fbbe2f9708c1251717b9868bd)
@@ -490,4 +490,5 @@
 		break;
 	case '\r':
+		updated = chargrid_cr(cons->frontbuf);
 		break;
 	case '\t':
