Index: uspace/app/bdsh/Makefile
===================================================================
--- uspace/app/bdsh/Makefile	(revision 53afa639fb063807ea3cae7ec6673af94bc1c460)
+++ uspace/app/bdsh/Makefile	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -36,4 +36,6 @@
 	cmds/modules/module_aliases.c \
 	cmds/modules/modules.c \
+	cmds/modules/alias/alias.c \
+	cmds/modules/unalias/unalias.c \
 	cmds/modules/help/help.c \
 	cmds/modules/mkdir/mkdir.c \
Index: uspace/app/bdsh/cmds/modules/alias/alias.c
===================================================================
--- uspace/app/bdsh/cmds/modules/alias/alias.c	(revision b781cc497418aafed520d245eab50c6954c84dcd)
+++ uspace/app/bdsh/cmds/modules/alias/alias.c	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -0,0 +1,179 @@
+/*
+ * Copyright (c) 2018 Matthieu Riolo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <str.h>
+#include "config.h"
+#include "util.h"
+#include "errors.h"
+#include "entry.h"
+#include "alias.h"
+#include "cmds.h"
+
+#include <adt/odict.h>
+
+static const char *cmdname = "alias";
+static const char *alias_format = "%s='%s'\n";
+
+static void list_aliases()
+{
+	odlink_t *alias_link = odict_first(&alias_dict);
+	while (alias_link != NULL) {
+		alias_t *data = odict_get_instance(alias_link, alias_t, odict);
+		printf(alias_format, data->name, data->value);
+		alias_link = odict_next(alias_link, &alias_dict);
+	}
+}
+
+static bool print_alias(const char *name)
+{
+	odlink_t *alias_link = odict_find_eq(&alias_dict, (void *)name, NULL);
+	if (alias_link != NULL) {
+		alias_t *data = odict_get_instance(alias_link, alias_t, odict);
+		printf(alias_format, data->name, data->value);
+		return true;
+	}
+
+	cli_error(CL_ENOENT, "%s: No alias with the name '%s' exists\n", cmdname, name);
+	return false;
+}
+
+static errno_t set_alias(const char *name, const char *value)
+{
+	odlink_t *alias_link = odict_find_eq(&alias_dict, (void *)name, NULL);
+
+	if (alias_link != NULL) {
+		/* update existing value */
+		alias_t *data = odict_get_instance(alias_link, alias_t, odict);
+		char *dup_value = str_dup(value);
+
+		if (dup_value == NULL) {
+			cli_error(CL_ENOMEM, "%s: failing to allocate memory for value\n", cmdname);
+			return ENOMEM;
+		}
+
+		free(data->value);
+		data->value = dup_value;
+	} else {
+		/* add new value */
+		alias_t *data = (alias_t *)calloc(1, sizeof(alias_t));
+		if (data == NULL) {
+			cli_error(CL_ENOMEM, "%s: failing to allocate memory for data container\n", cmdname);
+			return ENOMEM;
+		}
+
+		data->name = str_dup(name);
+		if (data->name == NULL) {
+			cli_error(CL_ENOMEM, "%s: failing to allocate memory for name\n", cmdname);
+			free(data);
+			return ENOMEM;
+		}
+
+		data->value = str_dup(value);
+		if (data->value == NULL) {
+			cli_error(CL_ENOMEM, "%s: failing to allocate memory for value\n", cmdname);
+			free(data->name);
+			free(data);
+			return ENOMEM;
+		}
+		odict_insert(&data->odict, &alias_dict, NULL);
+	}
+
+	return EOK;
+}
+
+static bool validate_name(const char *name)
+{
+	while (*name != '\0') {
+		if (*name == '/')
+			return false;
+		if (*name == ' ')
+			return false;
+		if (*name == '\"')
+			return false;
+		if (*name == '\'')
+			return false;
+		if (*name == '|')
+			return false;
+
+		name++;
+	}
+
+	return true;
+}
+
+/* Dispays help for alias in various levels */
+void help_cmd_alias(unsigned int level)
+{
+	if (level == HELP_SHORT) {
+		printf("`%s' sets an alias, displays an alias or lists all aliases\n", cmdname);
+	} else {
+		help_cmd_alias(HELP_SHORT);
+		printf("Usage: `%s' [newalias[='existingCMD --flags] ...]'\n\n"
+		    "If no parameters are given it will display all existing aliases.\n"
+		    "If a parameter without an assignment is given, the value of the given alias will be returned.\n"
+		    "If a parameter with an assignment is given, the alias will be created or updated for the given value. "
+		    "It is possible to create an alias to a different alias. A circularity will prevent an alias to be resolved.\n",
+		    cmdname);
+	}
+}
+
+/* Main entry point for alias, accepts an array of arguments */
+int cmd_alias(char **argv)
+{
+
+	if (argv[1] == NULL) {
+		list_aliases();
+		return CMD_SUCCESS;
+	}
+
+	size_t i;
+	for (i = 1; argv[i] != NULL; i++) {
+		char *name = argv[i];
+		char *value;
+		if ((value = str_chr(name, '=')) != NULL) {
+			name[value - name] = '\0';
+
+			if (!validate_name(name)) {
+				cli_error(CL_EFAIL, "%s: invalid alias name given\n", cmdname);
+				return CMD_FAILURE;
+			}
+
+			if (set_alias(name, value + 1) != EOK) {
+				return CMD_FAILURE;
+			}
+		} else {
+			if (!print_alias(name)) {
+				return CMD_FAILURE;
+			}
+		}
+	}
+
+	return CMD_SUCCESS;
+}
Index: uspace/app/bdsh/cmds/modules/alias/alias.h
===================================================================
--- uspace/app/bdsh/cmds/modules/alias/alias.h	(revision b781cc497418aafed520d245eab50c6954c84dcd)
+++ uspace/app/bdsh/cmds/modules/alias/alias.h	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -0,0 +1,6 @@
+#ifndef ALIAS_H
+#define ALIAS_H
+
+/* Prototypes for the alias command, excluding entry points */
+
+#endif /* ALIAS_H */
Index: uspace/app/bdsh/cmds/modules/alias/alias_def.inc
===================================================================
--- uspace/app/bdsh/cmds/modules/alias/alias_def.inc	(revision b781cc497418aafed520d245eab50c6954c84dcd)
+++ uspace/app/bdsh/cmds/modules/alias/alias_def.inc	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -0,0 +1,7 @@
+{
+	"alias",
+	"setting, show or list aliases",
+	&cmd_alias,
+	&help_cmd_alias,
+},
+
Index: uspace/app/bdsh/cmds/modules/alias/entry.h
===================================================================
--- uspace/app/bdsh/cmds/modules/alias/entry.h	(revision b781cc497418aafed520d245eab50c6954c84dcd)
+++ uspace/app/bdsh/cmds/modules/alias/entry.h	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -0,0 +1,8 @@
+#ifndef ALIAS_ENTRY_H
+#define ALIAS_ENTRY_H
+
+/* Entry points for the alias command */
+extern int cmd_alias(char **);
+extern void help_cmd_alias(unsigned int);
+
+#endif /* ALIAS_ENTRY_H */
Index: uspace/app/bdsh/cmds/modules/modules.c
===================================================================
--- uspace/app/bdsh/cmds/modules/modules.c	(revision 53afa639fb063807ea3cae7ec6673af94bc1c460)
+++ uspace/app/bdsh/cmds/modules/modules.c	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -63,4 +63,6 @@
 #include "echo/entry.h"
 #include "cmp/entry.h"
+#include "alias/entry.h"
+#include "unalias/entry.h"
 
 /*
@@ -88,4 +90,6 @@
 #include "echo/echo_def.inc"
 #include "cmp/cmp_def.inc"
+#include "alias/alias_def.inc"
+#include "unalias/unalias_def.inc"
 
 	{ NULL, NULL, NULL, NULL }
Index: uspace/app/bdsh/cmds/modules/modules.h
===================================================================
--- uspace/app/bdsh/cmds/modules/modules.h	(revision 53afa639fb063807ea3cae7ec6673af94bc1c460)
+++ uspace/app/bdsh/cmds/modules/modules.h	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -31,5 +31,4 @@
 
 #include "../cmds.h"
-#include "modules.h"
 
 extern module_t modules[];
Index: uspace/app/bdsh/cmds/modules/unalias/entry.h
===================================================================
--- uspace/app/bdsh/cmds/modules/unalias/entry.h	(revision b781cc497418aafed520d245eab50c6954c84dcd)
+++ uspace/app/bdsh/cmds/modules/unalias/entry.h	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -0,0 +1,8 @@
+#ifndef UNALIAS_ENTRY_H
+#define UNALIAS_ENTRY_H
+
+/* Entry points for the unalias command */
+extern int cmd_unalias(char **);
+extern void help_cmd_unalias(unsigned int);
+
+#endif /* UNALIAS_ENTRY_H */
Index: uspace/app/bdsh/cmds/modules/unalias/unalias.c
===================================================================
--- uspace/app/bdsh/cmds/modules/unalias/unalias.c	(revision b781cc497418aafed520d245eab50c6954c84dcd)
+++ uspace/app/bdsh/cmds/modules/unalias/unalias.c	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2018 Matthieu Riolo
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <str.h>
+#include <adt/odict.h>
+
+#include "config.h"
+#include "util.h"
+#include "errors.h"
+#include "entry.h"
+#include "unalias.h"
+#include "cmds.h"
+
+static const char *cmdname = "unalias";
+
+static void free_alias(odlink_t *alias_link)
+{
+	alias_t *data = odict_get_instance(alias_link, alias_t, odict);
+	odict_remove(alias_link);
+
+	free(data->name);
+	free(data->value);
+	free(data);
+}
+
+/* Dispays help for unalias in various levels */
+void help_cmd_unalias(unsigned int level)
+{
+	if (level == HELP_SHORT) {
+		printf("`%s' removes an alias or all aliases with -a\n", cmdname);
+	} else {
+		help_cmd_unalias(HELP_SHORT);
+		printf("Usage: `%s' -a'\n"
+		    "`%s' name [name ...]'\n\n"
+		    "If no parameters are given it will display this help message.\n"
+		    "If the flag -a is given, all existing aliases will be removed.\n"
+		    "If one or multiple parameters are given, then those aliases will be removed.\n",
+		    cmdname, cmdname);
+	}
+}
+
+/* Main entry point for unalias, accepts an array of arguments */
+int cmd_unalias(char **argv)
+{
+
+	if (argv[1] == NULL) {
+		help_cmd_unalias(HELP_LONG);
+		return CMD_SUCCESS;
+	}
+
+	odlink_t *alias_link;
+
+	unsigned int argc = cli_count_args(argv);
+	if (argc == 2) {
+		if (str_cmp(argv[1], "-a") == 0) {
+			alias_link = odict_first(&alias_dict);
+			while (alias_link != NULL) {
+				odlink_t *old_alias_link = alias_link;
+				alias_link = odict_next(old_alias_link, &alias_dict);
+				free_alias(old_alias_link);
+			}
+
+			return CMD_SUCCESS;
+		}
+	}
+
+	int rc = CMD_SUCCESS;
+	size_t i;
+	for (i = 1; argv[i] != NULL; i++) {
+		alias_link = odict_find_eq(&alias_dict, (void *)argv[i], NULL);
+
+		if (alias_link == NULL) {
+			cli_error(CL_ENOENT, "%s: No alias '%s' found\n", cmdname, argv[i]);
+			rc = CMD_FAILURE;
+		} else {
+			free_alias(alias_link);
+		}
+	}
+
+	return rc;
+}
Index: uspace/app/bdsh/cmds/modules/unalias/unalias.h
===================================================================
--- uspace/app/bdsh/cmds/modules/unalias/unalias.h	(revision b781cc497418aafed520d245eab50c6954c84dcd)
+++ uspace/app/bdsh/cmds/modules/unalias/unalias.h	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -0,0 +1,6 @@
+#ifndef UNALIAS_H
+#define UNALIAS_H
+
+/* Prototypes for the unalias command, excluding entry points */
+
+#endif /* UNALIAS_H */
Index: uspace/app/bdsh/cmds/modules/unalias/unalias_def.inc
===================================================================
--- uspace/app/bdsh/cmds/modules/unalias/unalias_def.inc	(revision b781cc497418aafed520d245eab50c6954c84dcd)
+++ uspace/app/bdsh/cmds/modules/unalias/unalias_def.inc	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -0,0 +1,7 @@
+{
+	"unalias",
+	"Removes an alias",
+	&cmd_unalias,
+	&help_cmd_unalias,
+},
+
Index: uspace/app/bdsh/compl.c
===================================================================
--- uspace/app/bdsh/compl.c	(revision 53afa639fb063807ea3cae7ec6673af94bc1c460)
+++ uspace/app/bdsh/compl.c	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -35,5 +35,7 @@
 #include <vfs/vfs.h>
 #include <str.h>
-
+#include <adt/odict.h>
+
+#include "scli.h"
 #include "cmds/cmds.h"
 #include "compl.h"
@@ -63,4 +65,7 @@
 	/** Length of string prefix (number of characters) */
 	size_t prefix_len;
+
+	/* Pointer to the current alias */
+	odlink_t *alias_link;
 
 	/** Pointer inside list of modules */
@@ -243,4 +248,5 @@
 	} else if (cs->is_command) {
 		/* Command without path */
+		cs->alias_link = odict_first(&alias_dict);
 		cs->module = modules;
 		cs->builtin = builtins;
@@ -321,12 +327,30 @@
 	}
 
+	/* Alias */
+	if (cs->alias_link != NULL) {
+		while (*compl == NULL && cs->alias_link != NULL) {
+			alias_t *data = odict_get_instance(cs->alias_link, alias_t, odict);
+			if (compl_match_prefix(cs, data->name)) {
+				asprintf(compl, "%s ", data->name);
+				cs->last_compl = *compl;
+				if (*compl == NULL)
+					return ENOMEM;
+			}
+			cs->alias_link = odict_next(cs->alias_link, &alias_dict);
+		}
+	}
+
 	/* Modules */
 	if (cs->module != NULL) {
 		while (*compl == NULL && cs->module->name != NULL) {
+			/* prevents multiple listing of an overriden cmd */
 			if (compl_match_prefix(cs, cs->module->name)) {
-				asprintf(compl, "%s ", cs->module->name);
-				cs->last_compl = *compl;
-				if (*compl == NULL)
-					return ENOMEM;
+				odlink_t *alias_link = odict_find_eq(&alias_dict, (void *)cs->module->name, NULL);
+				if (alias_link == NULL) {
+					asprintf(compl, "%s ", cs->module->name);
+					cs->last_compl = *compl;
+					if (*compl == NULL)
+						return ENOMEM;
+				}
 			}
 			cs->module++;
@@ -338,8 +362,12 @@
 		while (*compl == NULL && cs->builtin->name != NULL) {
 			if (compl_match_prefix(cs, cs->builtin->name)) {
-				asprintf(compl, "%s ", cs->builtin->name);
-				cs->last_compl = *compl;
-				if (*compl == NULL)
-					return ENOMEM;
+				/* prevents multiple listing of an overriden cmd */
+				odlink_t *alias_link = odict_find_eq(&alias_dict, (void *)cs->module->name, NULL);
+				if (alias_link == NULL) {
+					asprintf(compl, "%s ", cs->builtin->name);
+					cs->last_compl = *compl;
+					if (*compl == NULL)
+						return ENOMEM;
+				}
 			}
 			cs->builtin++;
@@ -389,4 +417,12 @@
 				free(ent_path);
 
+				/* prevents multiple listing of an overriden cmd */
+				if (cs->is_command && !ent_stat.is_directory) {
+					odlink_t *alias_link = odict_find_eq(&alias_dict, (void *)dent->d_name, NULL);
+					if (alias_link != NULL) {
+						continue;
+					}
+				}
+
 				asprintf(compl, "%s%c", dent->d_name,
 				    ent_stat.is_directory ? '/' : ' ');
Index: uspace/app/bdsh/config.h
===================================================================
--- uspace/app/bdsh/config.h	(revision 53afa639fb063807ea3cae7ec6673af94bc1c460)
+++ uspace/app/bdsh/config.h	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -42,4 +42,9 @@
 #endif
 
+/* define maximal nested aliases */
+#ifndef HUBS_MAX
+#define HUBS_MAX 20
+#endif
+
 /* Used in many places */
 #define SMALL_BUFLEN 256
Index: uspace/app/bdsh/input.c
===================================================================
--- uspace/app/bdsh/input.c	(revision 53afa639fb063807ea3cae7ec6673af94bc1c460)
+++ uspace/app/bdsh/input.c	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -3,4 +3,5 @@
  * Copyright (c) 2011 Jiri Svoboda
  * Copyright (c) 2011 Martin Sucha
+ * Copyright (c) 2018 Matthieu Riolo
  * All rights reserved.
  *
@@ -43,4 +44,6 @@
 #include <stdbool.h>
 #include <tinput.h>
+#include <adt/odict.h>
+#include <adt/list.h>
 
 #include "config.h"
@@ -62,4 +65,20 @@
 static void print_pipe_usage(void);
 
+typedef struct {
+	link_t alias_hup_link;
+	alias_t *alias;
+} alias_hup_t;
+
+static bool find_alias_hup(alias_t *alias, list_t *alias_hups)
+{
+	list_foreach(*alias_hups, alias_hup_link, alias_hup_t, link) {
+		if (alias == link->alias) {
+			return true;
+		}
+	}
+
+	return false;
+}
+
 /*
  * Tokenizes input from console, sees if the first word is a built-in, if so
@@ -67,6 +86,11 @@
  * the handler
  */
-errno_t process_input(cliuser_t *usr)
-{
+static errno_t process_input_nohup(cliuser_t *usr, list_t *alias_hups, size_t count_executed_hups)
+{
+	if (count_executed_hups >= HUBS_MAX) {
+		cli_error(CL_EFAIL, "%s: maximal alias hubs reached\n", PACKAGE_NAME);
+		return ELIMIT;
+	}
+
 	token_t *tokens_buf = calloc(WORD_MAX, sizeof(token_t));
 	if (tokens_buf == NULL)
@@ -171,4 +195,54 @@
 	}
 
+	/* test if the passed cmd is an alias */
+	odlink_t *alias_link = odict_find_eq(&alias_dict, (void *)cmd[0], NULL);
+	if (alias_link != NULL) {
+		alias_t *data = odict_get_instance(alias_link, alias_t, odict);
+		/* check if the alias already has been resolved once */
+		if (!find_alias_hup(data, alias_hups)) {
+			alias_hup_t *hup = (alias_hup_t *)calloc(1, sizeof(alias_hup_t));
+			if (hup == NULL) {
+				cli_error(CL_EFAIL, "%s: cannot allocate alias structure\n", PACKAGE_NAME);
+				rc = ENOMEM;
+				goto finit;
+			}
+
+			hup->alias = data;
+			list_append(&hup->alias_hup_link, alias_hups);
+
+			char *oldLine = usr->line;
+			const size_t input_length = str_size(usr->line) - str_size(cmd[0]) + str_size(data->value) + 1;
+			usr->line = (char *)malloc(input_length);
+			if (usr->line == NULL) {
+				cli_error(CL_EFAIL, "%s: cannot allocate input structure\n", PACKAGE_NAME);
+				rc = ENOMEM;
+				goto finit;
+			}
+
+			usr->line[0] = '\0';
+
+			unsigned int cmd_replace_index = cmd_token_start;
+			for (i = 0; i < tokens_length; i++) {
+				if (i == cmd_replace_index) {
+					/* if there is a pipe symbol than cmd_token_start will point at the SPACE after the pipe symbol */
+					if (tokens[i].type == TOKTYPE_SPACE) {
+						cmd_replace_index++;
+						str_append(usr->line, input_length, tokens[i].text);
+						continue;
+					}
+
+					str_append(usr->line, input_length, data->value);
+				} else {
+					str_append(usr->line, input_length, tokens[i].text);
+				}
+			}
+
+			/* reprocess input after string replace */
+			rc = process_input_nohup(usr, alias_hups, count_executed_hups + 1);
+			usr->line = oldLine;
+			goto finit;
+		}
+	}
+
 	iostate_t new_iostate = {
 		.stdin = stdin,
@@ -225,4 +299,19 @@
 }
 
+errno_t process_input(cliuser_t *usr)
+{
+	list_t alias_hups;
+	list_initialize(&alias_hups);
+
+	errno_t rc = process_input_nohup(usr, &alias_hups, 0);
+
+	list_foreach_safe(alias_hups, cur_link, next_link) {
+		alias_hup_t *cur_item = list_get_instance(cur_link, alias_hup_t, alias_hup_link);
+		free(cur_item);
+	}
+
+	return rc;
+}
+
 void print_pipe_usage(void)
 {
Index: uspace/app/bdsh/scli.c
===================================================================
--- uspace/app/bdsh/scli.c	(revision 53afa639fb063807ea3cae7ec6673af94bc1c460)
+++ uspace/app/bdsh/scli.c	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -1,4 +1,5 @@
 /*
  * Copyright (c) 2008 Tim Post
+ * Copyright (c) 2018 Matthieu Riolo
  * All rights reserved.
  *
@@ -31,4 +32,5 @@
 #include <stddef.h>
 #include <str.h>
+#include <adt/odict.h>
 #include "config.h"
 #include "scli.h"
@@ -42,4 +44,6 @@
 static iostate_t *iostate;
 static iostate_t stdiostate;
+
+odict_t alias_dict;
 
 /*
@@ -55,4 +59,14 @@
  */
 const char *progname = PACKAGE_NAME;
+
+static int alias_cmp(void *a, void *b)
+{
+	return str_cmp((char *)a, (char *)b);
+}
+
+static void *alias_key(odlink_t *odlink)
+{
+	return (void *)odict_get_instance(odlink, alias_t, odict)->name;
+}
 
 /* These are not exposed, even to builtins */
@@ -108,4 +122,6 @@
 	iostate = &stdiostate;
 
+	odict_initialize(&alias_dict, alias_key, alias_cmp);
+
 	if (cli_init(&usr))
 		exit(EXIT_FAILURE);
Index: uspace/app/bdsh/scli.h
===================================================================
--- uspace/app/bdsh/scli.h	(revision 53afa639fb063807ea3cae7ec6673af94bc1c460)
+++ uspace/app/bdsh/scli.h	(revision b781cc497418aafed520d245eab50c6954c84dcd)
@@ -1,4 +1,5 @@
 /*
  * Copyright (c) 2008 Tim Post
+ * Copyright (c) 2018 Matthieu Riolo
  * All rights reserved.
  *
@@ -34,4 +35,5 @@
 #include <stdint.h>
 #include <stdio.h>
+#include <types/adt/odict.h>
 
 typedef struct {
@@ -54,3 +56,11 @@
 extern void set_iostate(iostate_t *);
 
+extern odict_t alias_dict;
+
+typedef struct {
+	odlink_t odict;
+	char *name;
+	char *value;
+} alias_t;
+
 #endif
