diff --git a/subsys/shell/shell.c b/subsys/shell/shell.c
index eb4d54e..d39b577 100644
--- a/subsys/shell/shell.c
+++ b/subsys/shell/shell.c
@@ -28,27 +28,6 @@
 
 #define SHELL_INIT_OPTION_PRINTER	(NULL)
 
-#define EXIT_HISTORY(shell)					\
-		((shell)->ctx->internal.flags.history_exit)
-#define EXIT_HISTORY_REQUEST(shell)				\
-		((shell)->ctx->internal.flags.history_exit = 1)
-#define EXIT_HISTORY_CLEAR(shell)				\
-		((shell)->ctx->internal.flags.history_exit = 0)
-
-static int shell_execute(const struct shell *shell);
-
-/* Function returns true if delete escape code shall be interpreted as
- * backspace.
- */
-static inline bool flag_delete_mode_set(const struct shell *shell)
-{
-	return shell->ctx->internal.flags.mode_delete == 1 ? true : false;
-}
-
-static inline bool flag_processing_is_set(const struct shell *shell)
-{
-	return shell->ctx->internal.flags.processing == 1 ? true : false;
-}
 
 static inline void receive_state_change(const struct shell *shell,
 					enum shell_receive_state state)
@@ -56,29 +35,29 @@
 	shell->ctx->receive_state = state;
 }
 
-static void shell_cmd_buffer_clear(const struct shell *shell)
+static void cmd_buffer_clear(const struct shell *shell)
 {
 	shell->ctx->cmd_buff[0] = '\0'; /* clear command buffer */
 	shell->ctx->cmd_buff_pos = 0;
 	shell->ctx->cmd_buff_len = 0;
 }
 
-static inline void shell_prompt_print(const struct shell *shell)
+static inline void prompt_print(const struct shell *shell)
 {
 	shell_fprintf(shell, SHELL_INFO, "%s", shell->prompt);
 }
 
-static inline void shell_command_print(const struct shell *shell)
+static inline void cmd_print(const struct shell *shell)
 {
 	shell_fprintf(shell, SHELL_NORMAL, "%s", shell->ctx->cmd_buff);
 }
 
 static void cmd_line_print(const struct shell *shell)
 {
-	shell_prompt_print(shell);
+	prompt_print(shell);
 
-	if (flag_echo_is_set(shell)) {
-		shell_command_print(shell);
+	if (flag_echo_get(shell)) {
+		cmd_print(shell);
 		shell_op_cursor_position_synchronize(shell);
 	}
 }
@@ -91,15 +70,13 @@
  * @param[in] arg_cnt_ok  Flag indicating valid number of arguments.
  *
  * @return 0		  if check passed
- * @return 1		  if help was requested
  * @return -EINVAL	  if wrong argument count
  */
-static int shell_cmd_precheck(const struct shell *shell,
-			      bool arg_cnt_ok)
+static int cmd_precheck(const struct shell *shell,
+			bool arg_cnt_ok)
 {
 	if (!arg_cnt_ok) {
-		shell_fprintf(shell, SHELL_ERROR,
-			      "%s: wrong parameter count\n",
+		shell_fprintf(shell, SHELL_ERROR, "%s: wrong parameter count\n",
 			      shell->ctx->active_cmd.syntax);
 
 		if (IS_ENABLED(CONFIG_SHELL_HELP_ON_WRONG_ARGUMENT_COUNT)) {
@@ -112,64 +89,13 @@
 	return 0;
 }
 
-static void vt100_color_set(const struct shell *shell,
-			    enum shell_vt100_color color)
-{
-
-	if (shell->ctx->vt100_ctx.col.col == color) {
-		return;
-	}
-
-	shell->ctx->vt100_ctx.col.col = color;
-
-	if (color != SHELL_NORMAL) {
-
-		u8_t cmd[] = SHELL_VT100_COLOR(color - 1);
-
-		shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
-	} else {
-		static const u8_t cmd[] = SHELL_VT100_MODESOFF;
-
-		shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
-	}
-}
-
-static void vt100_bgcolor_set(const struct shell *shell,
-			      enum shell_vt100_color bgcolor)
-{
-	if ((bgcolor == SHELL_NORMAL) ||
-	    (shell->ctx->vt100_ctx.col.bgcol == bgcolor)) {
-		return;
-	}
-
-	/* -1 because default value is first in enum */
-	u8_t cmd[] = SHELL_VT100_BGCOLOR(bgcolor - 1);
-
-	shell->ctx->vt100_ctx.col.bgcol = bgcolor;
-	shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
-
-}
-
-static inline void vt100_colors_store(const struct shell *shell,
-				      struct shell_vt100_colors *color)
-{
-	memcpy(color, &shell->ctx->vt100_ctx.col, sizeof(*color));
-}
-
-static void vt100_colors_restore(const struct shell *shell,
-				 const struct shell_vt100_colors *color)
-{
-	vt100_color_set(shell, color->col);
-	vt100_bgcolor_set(shell, color->bgcol);
-}
-
-static void shell_state_set(const struct shell *shell, enum shell_state state)
+static void state_set(const struct shell *shell, enum shell_state state)
 {
 	shell->ctx->state = state;
 
 	if (state == SHELL_STATE_ACTIVE) {
-		shell_cmd_buffer_clear(shell);
-		shell_prompt_print(shell);
+		cmd_buffer_clear(shell);
+		prompt_print(shell);
 	}
 }
 
@@ -225,7 +151,7 @@
 		return;
 	}
 
-	EXIT_HISTORY_CLEAR(shell);
+	flag_history_exit_set(shell, false);
 	shell_history_mode_exit(shell->history);
 }
 
@@ -249,8 +175,8 @@
 	}
 
 	/* Checking if history process has been stopped */
-	if (EXIT_HISTORY(shell)) {
-		EXIT_HISTORY_CLEAR(shell);
+	if (flag_history_exit_get(shell)) {
+		flag_history_exit_set(shell, false);
 		shell_history_mode_exit(shell->history);
 	}
 
@@ -283,7 +209,7 @@
 
 	shell_op_cursor_home_move(shell);
 	clear_eos(shell);
-	shell_command_print(shell);
+	cmd_print(shell);
 	shell->ctx->cmd_buff_pos = len;
 	shell->ctx->cmd_buff_len = len;
 	shell_op_cond_next_line(shell);
@@ -353,11 +279,11 @@
 }
 
 /* Prepare arguments and return number of space available for completion. */
-static bool shell_tab_prepare(const struct shell *shell,
-			      const struct shell_static_entry **cmd,
-			      char **argv, size_t *argc,
-			      size_t *complete_arg_idx,
-			      struct shell_static_entry *d_entry)
+static bool tab_prepare(const struct shell *shell,
+			const struct shell_static_entry **cmd,
+			char **argv, size_t *argc,
+			size_t *complete_arg_idx,
+			struct shell_static_entry *d_entry)
 {
 	u16_t compl_space = completion_space_get(shell);
 	size_t search_argc;
@@ -474,10 +400,10 @@
 	/* Next character in the buffer is not 'space'. */
 	if (!isspace((int) shell->ctx->cmd_buff[
 					shell->ctx->cmd_buff_pos])) {
-		if (shell->ctx->internal.flags.insert_mode) {
-			shell->ctx->internal.flags.insert_mode = 0;
+		if (flag_insert_mode_get(shell)) {
+			flag_insert_mode_set(shell, false);
 			shell_op_char_insert(shell, ' ');
-			shell->ctx->internal.flags.insert_mode = 1;
+			flag_insert_mode_set(shell, true);
 		} else {
 			shell_op_char_insert(shell, ' ');
 		}
@@ -493,7 +419,7 @@
 	}
 }
 
-static size_t shell_str_common(const char *s1, const char *s2, size_t n)
+static size_t str_common(const char *s1, const char *s2, size_t n)
 {
 	size_t common = 0;
 
@@ -567,8 +493,8 @@
 			break;
 		}
 
-		curr_common = shell_str_common(match->syntax, match2->syntax,
-					       UINT16_MAX);
+		curr_common = str_common(match->syntax, match2->syntax,
+					 UINT16_MAX);
 		if ((arg_len == 0U) || (curr_common >= arg_len)) {
 			--cnt;
 			common = (curr_common < common) ? curr_common : common;
@@ -595,283 +521,6 @@
 	}
 }
 
-static void shell_tab_handle(const struct shell *shell)
-{
-	/* +1 reserved for NULL in function shell_make_argv */
-	char *argv[CONFIG_SHELL_ARGC_MAX + 1];
-	/* d_entry - placeholder for dynamic command */
-	struct shell_static_entry d_entry;
-	const struct shell_static_entry *cmd;
-	size_t first = 0;
-	size_t arg_idx;
-	u16_t longest;
-	size_t argc;
-	size_t cnt;
-
-	bool tab_possible = shell_tab_prepare(shell, &cmd, argv, &argc,
-					      &arg_idx, &d_entry);
-
-	if (tab_possible == false) {
-		return;
-	}
-
-	find_completion_candidates(cmd, argv[arg_idx], &first, &cnt, &longest);
-
-	if (cnt == 1) {
-		/* Autocompletion.*/
-		autocomplete(shell, cmd, argv[arg_idx], first);
-	} else if (cnt > 1) {
-		tab_options_print(shell, cmd, argv[arg_idx], first, cnt,
-				  longest);
-		partial_autocomplete(shell, cmd, argv[arg_idx], first, cnt);
-	}
-}
-
-static void metakeys_handle(const struct shell *shell, char data)
-{
-	/* Optional feature */
-	if (!IS_ENABLED(CONFIG_SHELL_METAKEYS)) {
-		return;
-	}
-
-	switch (data) {
-	case SHELL_VT100_ASCII_CTRL_A: /* CTRL + A */
-		shell_op_cursor_home_move(shell);
-		break;
-
-	case SHELL_VT100_ASCII_CTRL_C: /* CTRL + C */
-		shell_op_cursor_end_move(shell);
-		if (!shell_cursor_in_empty_line(shell)) {
-			cursor_next_line_move(shell);
-		}
-		EXIT_HISTORY_REQUEST(shell);
-		shell_state_set(shell, SHELL_STATE_ACTIVE);
-		break;
-
-	case SHELL_VT100_ASCII_CTRL_E: /* CTRL + E */
-		shell_op_cursor_end_move(shell);
-		break;
-
-	case SHELL_VT100_ASCII_CTRL_L: /* CTRL + L */
-		SHELL_VT100_CMD(shell, SHELL_VT100_CURSORHOME);
-		SHELL_VT100_CMD(shell, SHELL_VT100_CLEARSCREEN);
-		cmd_line_print(shell);
-		break;
-
-	case SHELL_VT100_ASCII_CTRL_U: /* CTRL + U */
-		shell_op_cursor_home_move(shell);
-		shell_cmd_buffer_clear(shell);
-		EXIT_HISTORY_REQUEST(shell);
-		clear_eos(shell);
-		break;
-
-	case SHELL_VT100_ASCII_CTRL_W: /* CTRL + W */
-		shell_op_word_remove(shell);
-		EXIT_HISTORY_REQUEST(shell);
-		break;
-
-	default:
-		break;
-	}
-}
-
-/* Functions returns true if new line character shall be processed */
-static bool process_nl(const struct shell *shell, u8_t data)
-{
-	if ((data != '\r') && (data != '\n')) {
-		shell->ctx->internal.flags.last_nl = 0;
-		return false;
-	}
-
-	if ((shell->ctx->internal.flags.last_nl == 0) ||
-	    (data == shell->ctx->internal.flags.last_nl)) {
-		shell->ctx->internal.flags.last_nl = data;
-		return true;
-	}
-
-	return false;
-}
-
-#define SHELL_ASCII_MAX_CHAR (127u)
-static inline int ascii_filter(const char data)
-{
-	return (u8_t) data > SHELL_ASCII_MAX_CHAR ? -EINVAL : 0;
-}
-
-static void shell_state_collect(const struct shell *shell)
-{
-	size_t count = 0;
-	char data;
-
-	while (true) {
-		(void)shell->iface->api->read(shell->iface, &data,
-					      sizeof(data), &count);
-		if (count == 0) {
-			return;
-		}
-
-		if (ascii_filter(data) != 0) {
-			continue;
-		}
-
-		switch (shell->ctx->receive_state) {
-		case SHELL_RECEIVE_DEFAULT:
-			if (process_nl(shell, data)) {
-				if (!shell->ctx->cmd_buff_len) {
-					history_mode_exit(shell);
-					cursor_next_line_move(shell);
-				} else {
-					/* Command execution */
-					(void)shell_execute(shell);
-				}
-				/* Function responsible for printing prompt
-				 * on received NL.
-				 */
-				shell_state_set(shell, SHELL_STATE_ACTIVE);
-				return;
-			}
-
-			switch (data) {
-			case SHELL_VT100_ASCII_ESC: /* ESCAPE */
-				receive_state_change(shell, SHELL_RECEIVE_ESC);
-				break;
-
-			case '\0':
-				break;
-
-			case '\t': /* TAB */
-				if (flag_echo_is_set(shell)) {
-					/* If the Tab key is pressed, "history
-					 * mode" must be terminated because
-					 * tab and history handlers are sharing
-					 * the same array: temp_buff.
-					 */
-					EXIT_HISTORY_REQUEST(shell);
-					shell_tab_handle(shell);
-				}
-				break;
-
-			case SHELL_VT100_ASCII_BSPACE: /* BACKSPACE */
-				if (flag_echo_is_set(shell)) {
-					EXIT_HISTORY_REQUEST(shell);
-					shell_op_char_backspace(shell);
-				}
-				break;
-
-			case SHELL_VT100_ASCII_DEL: /* DELETE */
-				if (flag_echo_is_set(shell)) {
-					EXIT_HISTORY_REQUEST(shell);
-					if (flag_delete_mode_set(shell)) {
-						shell_op_char_backspace(shell);
-
-					} else {
-						shell_op_char_delete(shell);
-					}
-				}
-				break;
-
-			default:
-				if (isprint((int) data)) {
-					EXIT_HISTORY_REQUEST(shell);
-					shell_op_char_insert(shell, data);
-				} else {
-					metakeys_handle(shell, data);
-				}
-				break;
-			}
-			break;
-
-		case SHELL_RECEIVE_ESC:
-			if (data == '[') {
-				receive_state_change(shell,
-						SHELL_RECEIVE_ESC_SEQ);
-			} else {
-				receive_state_change(shell,
-						SHELL_RECEIVE_DEFAULT);
-			}
-			break;
-
-		case SHELL_RECEIVE_ESC_SEQ:
-			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
-
-			if (!flag_echo_is_set(shell)) {
-				return;
-			}
-
-			switch (data) {
-			case 'A': /* UP arrow */
-				history_handle(shell, true);
-				break;
-
-			case 'B': /* DOWN arrow */
-				history_handle(shell, false);
-				break;
-
-			case 'C': /* RIGHT arrow */
-				shell_op_right_arrow(shell);
-				break;
-
-			case 'D': /* LEFT arrow */
-				shell_op_left_arrow(shell);
-				break;
-
-			case '4': /* END Button in ESC[n~ mode */
-				receive_state_change(shell,
-						SHELL_RECEIVE_TILDE_EXP);
-				/* fall through */
-				/* no break */
-			case 'F': /* END Button in VT100 mode */
-				shell_op_cursor_end_move(shell);
-				break;
-
-			case '1': /* HOME Button in ESC[n~ mode */
-				receive_state_change(shell,
-						SHELL_RECEIVE_TILDE_EXP);
-				/* fall through */
-				/* no break */
-			case 'H': /* HOME Button in VT100 mode */
-				shell_op_cursor_home_move(shell);
-				break;
-
-			case '2': /* INSERT Button in ESC[n~ mode */
-				receive_state_change(shell,
-						SHELL_RECEIVE_TILDE_EXP);
-				/* fall through */
-				/* no break */
-			case 'L': /* INSERT Button in VT100 mode */
-				shell->ctx->internal.flags.insert_mode ^= 1;
-				break;
-
-			case '3':/* DELETE Button in ESC[n~ mode */
-				receive_state_change(shell,
-						SHELL_RECEIVE_TILDE_EXP);
-				if (flag_echo_is_set(shell)) {
-					shell_op_char_delete(shell);
-				}
-				break;
-
-			default:
-				break;
-			}
-			break;
-
-		case SHELL_RECEIVE_TILDE_EXP:
-			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
-			break;
-
-		default:
-			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
-			break;
-		}
-	}
-}
-
-static void cmd_trim(const struct shell *shell)
-{
-	shell_buffer_trim(shell->ctx->cmd_buff, &shell->ctx->cmd_buff_len);
-	shell->ctx->cmd_buff_pos = shell->ctx->cmd_buff_len;
-}
-
 static int exec_cmd(const struct shell *shell, size_t argc, char **argv,
 		    struct shell_static_entry help_entry)
 {
@@ -898,15 +547,15 @@
 
 		if (args->optional > 0) {
 			/* Check if argc is within allowed range */
-			ret_val = shell_cmd_precheck(shell,
-						     ((argc >= args->mandatory)
-						      &&
-						     (argc <= args->mandatory +
-						     args->optional)));
+			ret_val = cmd_precheck(shell,
+					       ((argc >= args->mandatory)
+					       &&
+					       (argc <= args->mandatory +
+					       args->optional)));
 		} else {
 			/* Perform exact match if there are no optional args */
-			ret_val = shell_cmd_precheck(shell,
-						     (args->mandatory == argc));
+			ret_val = cmd_precheck(shell,
+					       (args->mandatory == argc));
 		}
 	}
 
@@ -921,7 +570,7 @@
  * invokes the  last recognized command which has a handler and passes the rest
  * of command buffer as arguments.
  */
-static int shell_execute(const struct shell *shell)
+static int execute(const struct shell *shell)
 {
 	struct shell_static_entry d_entry; /* Memory for dynamic commands. */
 	char *argv[CONFIG_SHELL_ARGC_MAX + 1]; /* +1 reserved for NULL */
@@ -942,7 +591,7 @@
 
 	memset(&shell->ctx->active_cmd, 0, sizeof(shell->ctx->active_cmd));
 
-	cmd_trim(shell);
+	shell_cmd_trim(shell);
 
 	history_put(shell, shell->ctx->cmd_buff,
 		    shell->ctx->cmd_buff_len);
@@ -960,15 +609,15 @@
 	}
 
 	if (quote != 0) {
-		shell_fprintf(shell, SHELL_ERROR, "not terminated: %c\r\n",
+		shell_fprintf(shell, SHELL_ERROR, "not terminated: %c\n",
 			      quote);
 		return -ENOEXEC;
 	}
 
 	/*  Searching for a matching root command. */
-	p_cmd = root_cmd_find(argv[0]);
+	p_cmd = shell_root_cmd_find(argv[0]);
 	if (p_cmd == NULL) {
-		shell_fprintf(shell, SHELL_ERROR, "%s%s\r\n", argv[0],
+		shell_fprintf(shell, SHELL_ERROR, "%s%s\n", argv[0],
 			      SHELL_MSG_COMMAND_NOT_FOUND);
 		return -ENOEXEC;
 	}
@@ -987,9 +636,8 @@
 			break;
 		}
 
-		if (IS_ENABLED(CONFIG_SHELL_HELP) &&
-		    (!strcmp(argv[cmd_lvl], "-h") ||
-		     !strcmp(argv[cmd_lvl], "--help"))) {
+		if (!strcmp(argv[cmd_lvl], "-h") ||
+		    !strcmp(argv[cmd_lvl], "--help")) {
 			/* Command called with help option so it makes no sense
 			 * to search deeper commands.
 			 */
@@ -1051,7 +699,7 @@
 							      SHELL_ERROR,
 							"Error: requested"
 							" multiple function"
-							" executions\r\n");
+							" executions\n");
 
 						return -ENOEXEC;
 					}
@@ -1087,10 +735,282 @@
 			&argv[cmd_with_handler_lvl], help_entry);
 }
 
-static void shell_transport_evt_handler(enum shell_transport_evt evt_type,
-				      void *context)
+static void tab_handle(const struct shell *shell)
 {
-	struct shell *shell = (struct shell *)context;
+	/* +1 reserved for NULL in function shell_make_argv */
+	char *argv[CONFIG_SHELL_ARGC_MAX + 1];
+	/* d_entry - placeholder for dynamic command */
+	struct shell_static_entry d_entry;
+	const struct shell_static_entry *cmd;
+	size_t first = 0;
+	size_t arg_idx;
+	u16_t longest;
+	size_t argc;
+	size_t cnt;
+
+	bool tab_possible = tab_prepare(shell, &cmd, argv, &argc,
+					      &arg_idx, &d_entry);
+
+	if (tab_possible == false) {
+		return;
+	}
+
+	find_completion_candidates(cmd, argv[arg_idx], &first, &cnt, &longest);
+
+	if (cnt == 1) {
+		/* Autocompletion.*/
+		autocomplete(shell, cmd, argv[arg_idx], first);
+	} else if (cnt > 1) {
+		tab_options_print(shell, cmd, argv[arg_idx], first, cnt,
+				  longest);
+		partial_autocomplete(shell, cmd, argv[arg_idx], first, cnt);
+	}
+}
+
+static void metakeys_handle(const struct shell *shell, char data)
+{
+	/* Optional feature */
+	if (!IS_ENABLED(CONFIG_SHELL_METAKEYS)) {
+		return;
+	}
+
+	switch (data) {
+	case SHELL_VT100_ASCII_CTRL_A: /* CTRL + A */
+		shell_op_cursor_home_move(shell);
+		break;
+
+	case SHELL_VT100_ASCII_CTRL_C: /* CTRL + C */
+		shell_op_cursor_end_move(shell);
+		if (!shell_cursor_in_empty_line(shell)) {
+			cursor_next_line_move(shell);
+		}
+		flag_history_exit_set(shell, true);
+		state_set(shell, SHELL_STATE_ACTIVE);
+		break;
+
+	case SHELL_VT100_ASCII_CTRL_E: /* CTRL + E */
+		shell_op_cursor_end_move(shell);
+		break;
+
+	case SHELL_VT100_ASCII_CTRL_L: /* CTRL + L */
+		SHELL_VT100_CMD(shell, SHELL_VT100_CURSORHOME);
+		SHELL_VT100_CMD(shell, SHELL_VT100_CLEARSCREEN);
+		cmd_line_print(shell);
+		break;
+
+	case SHELL_VT100_ASCII_CTRL_U: /* CTRL + U */
+		shell_op_cursor_home_move(shell);
+		cmd_buffer_clear(shell);
+		flag_history_exit_set(shell, true);
+		clear_eos(shell);
+		break;
+
+	case SHELL_VT100_ASCII_CTRL_W: /* CTRL + W */
+		shell_op_word_remove(shell);
+		flag_history_exit_set(shell, true);
+		break;
+
+	default:
+		break;
+	}
+}
+
+/* Functions returns true if new line character shall be processed */
+static bool process_nl(const struct shell *shell, u8_t data)
+{
+	if ((data != '\r') && (data != '\n')) {
+		flag_last_nl_set(shell, 0);
+		return false;
+	}
+
+	if ((flag_last_nl_get(shell) == 0) ||
+	    (data == flag_last_nl_get(shell))) {
+		flag_last_nl_set(shell, data);
+		return true;
+	}
+
+	return false;
+}
+
+#define SHELL_ASCII_MAX_CHAR (127u)
+static inline int ascii_filter(const char data)
+{
+	return (u8_t) data > SHELL_ASCII_MAX_CHAR ? -EINVAL : 0;
+}
+
+static void state_collect(const struct shell *shell)
+{
+	size_t count = 0;
+	char data;
+
+	while (true) {
+		(void)shell->iface->api->read(shell->iface, &data,
+					      sizeof(data), &count);
+		if (count == 0) {
+			return;
+		}
+
+		if (ascii_filter(data) != 0) {
+			continue;
+		}
+
+		switch (shell->ctx->receive_state) {
+		case SHELL_RECEIVE_DEFAULT:
+			if (process_nl(shell, data)) {
+				if (!shell->ctx->cmd_buff_len) {
+					history_mode_exit(shell);
+					cursor_next_line_move(shell);
+				} else {
+					/* Command execution */
+					(void)execute(shell);
+				}
+				/* Function responsible for printing prompt
+				 * on received NL.
+				 */
+				state_set(shell, SHELL_STATE_ACTIVE);
+				return;
+			}
+
+			switch (data) {
+			case SHELL_VT100_ASCII_ESC: /* ESCAPE */
+				receive_state_change(shell, SHELL_RECEIVE_ESC);
+				break;
+
+			case '\0':
+				break;
+
+			case '\t': /* TAB */
+				if (flag_echo_get(shell)) {
+					/* If the Tab key is pressed, "history
+					 * mode" must be terminated because
+					 * tab and history handlers are sharing
+					 * the same array: temp_buff.
+					 */
+					flag_history_exit_set(shell, true);
+					tab_handle(shell);
+				}
+				break;
+
+			case SHELL_VT100_ASCII_BSPACE: /* BACKSPACE */
+				if (flag_echo_get(shell)) {
+					flag_history_exit_set(shell, true);
+					shell_op_char_backspace(shell);
+				}
+				break;
+
+			case SHELL_VT100_ASCII_DEL: /* DELETE */
+				if (flag_echo_get(shell)) {
+					flag_history_exit_set(shell, true);
+					if (flag_mode_delete_get(shell)) {
+						shell_op_char_backspace(shell);
+
+					} else {
+						shell_op_char_delete(shell);
+					}
+				}
+				break;
+
+			default:
+				if (isprint((int) data)) {
+					flag_history_exit_set(shell, true);
+					shell_op_char_insert(shell, data);
+				} else {
+					metakeys_handle(shell, data);
+				}
+				break;
+			}
+			break;
+
+		case SHELL_RECEIVE_ESC:
+			if (data == '[') {
+				receive_state_change(shell,
+						SHELL_RECEIVE_ESC_SEQ);
+			} else {
+				receive_state_change(shell,
+						SHELL_RECEIVE_DEFAULT);
+			}
+			break;
+
+		case SHELL_RECEIVE_ESC_SEQ:
+			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
+
+			if (!flag_echo_get(shell)) {
+				return;
+			}
+
+			switch (data) {
+			case 'A': /* UP arrow */
+				history_handle(shell, true);
+				break;
+
+			case 'B': /* DOWN arrow */
+				history_handle(shell, false);
+				break;
+
+			case 'C': /* RIGHT arrow */
+				shell_op_right_arrow(shell);
+				break;
+
+			case 'D': /* LEFT arrow */
+				shell_op_left_arrow(shell);
+				break;
+
+			case '4': /* END Button in ESC[n~ mode */
+				receive_state_change(shell,
+						SHELL_RECEIVE_TILDE_EXP);
+				/* fall through */
+				/* no break */
+			case 'F': /* END Button in VT100 mode */
+				shell_op_cursor_end_move(shell);
+				break;
+
+			case '1': /* HOME Button in ESC[n~ mode */
+				receive_state_change(shell,
+						SHELL_RECEIVE_TILDE_EXP);
+				/* fall through */
+				/* no break */
+			case 'H': /* HOME Button in VT100 mode */
+				shell_op_cursor_home_move(shell);
+				break;
+
+			case '2': /* INSERT Button in ESC[n~ mode */
+				receive_state_change(shell,
+						SHELL_RECEIVE_TILDE_EXP);
+				/* fall through */
+				/* no break */
+			case 'L': {/* INSERT Button in VT100 mode */
+				bool status = flag_insert_mode_get(shell);
+				flag_insert_mode_set(shell, !status);
+				break;
+			}
+
+			case '3':/* DELETE Button in ESC[n~ mode */
+				receive_state_change(shell,
+						SHELL_RECEIVE_TILDE_EXP);
+				if (flag_echo_get(shell)) {
+					shell_op_char_delete(shell);
+				}
+				break;
+
+			default:
+				break;
+			}
+			break;
+
+		case SHELL_RECEIVE_TILDE_EXP:
+			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
+			break;
+
+		default:
+			receive_state_change(shell, SHELL_RECEIVE_DEFAULT);
+			break;
+		}
+	}
+}
+
+static void transport_evt_handler(enum shell_transport_evt evt_type, void *ctx)
+{
+	struct shell *shell = (struct shell *)ctx;
 	struct k_poll_signal *signal;
 
 	signal = (evt_type == SHELL_TRANSPORT_EVT_RX_RDY) ?
@@ -1099,17 +1019,6 @@
 	k_poll_signal_raise(signal, 0);
 }
 
-static void cmd_line_erase(const struct shell *shell)
-{
-	shell_multiline_data_calc(&shell->ctx->vt100_ctx.cons,
-				  shell->ctx->cmd_buff_pos,
-				  shell->ctx->cmd_buff_len);
-	shell_op_cursor_horiz_move(shell, -shell->ctx->vt100_ctx.cons.cur_x);
-	shell_op_cursor_vert_move(shell, shell->ctx->vt100_ctx.cons.cur_y - 1);
-
-	clear_eos(shell);
-}
-
 static void shell_log_process(const struct shell *shell)
 {
 	bool processed;
@@ -1117,7 +1026,7 @@
 	int result;
 
 	do {
-		cmd_line_erase(shell);
+		shell_cmd_line_erase(shell);
 		processed = shell_log_backend_process(shell->log_backend);
 		cmd_line_print(shell);
 
@@ -1134,8 +1043,8 @@
 	} while (processed && !signaled);
 }
 
-static int shell_instance_init(const struct shell *shell, const void *p_config,
-			       bool use_colors)
+static int instance_init(const struct shell *shell, const void *p_config,
+			 bool use_colors)
 {
 	__ASSERT_NO_MSG(shell);
 	__ASSERT_NO_MSG(shell->ctx && shell->iface && shell->prompt);
@@ -1143,7 +1052,7 @@
 			(shell->shell_flag == SHELL_FLAG_OLF_CRLF));
 
 	int err = shell->iface->api->init(shell->iface, p_config,
-					  shell_transport_evt_handler,
+					  transport_evt_handler,
 					  (void *) shell);
 
 	if (err != 0) {
@@ -1154,27 +1063,50 @@
 
 	memset(shell->ctx, 0, sizeof(*shell->ctx));
 
-	if (IS_ENABLED(CONFIG_SHELL_BACKSPACE_MODE_DELETE)) {
-		shell->ctx->internal.flags.mode_delete = 1;
-	}
-
 	if (IS_ENABLED(CONFIG_SHELL_STATS)) {
 		shell->stats->log_lost_cnt = 0;
 	}
 
-	shell->ctx->internal.flags.tx_rdy = 1;
-	shell->ctx->internal.flags.echo = CONFIG_SHELL_ECHO_STATUS;
+	flag_tx_rdy_set(shell, true);
+	flag_echo_set(shell, CONFIG_SHELL_ECHO_STATUS);
+	flag_mode_delete_set(shell,
+			     IS_ENABLED(CONFIG_SHELL_BACKSPACE_MODE_DELETE));
 	shell->ctx->state = SHELL_STATE_INITIALIZED;
 	shell->ctx->vt100_ctx.cons.terminal_wid = SHELL_DEFAULT_TERMINAL_WIDTH;
 	shell->ctx->vt100_ctx.cons.terminal_hei = SHELL_DEFAULT_TERMINAL_HEIGHT;
 	shell->ctx->vt100_ctx.cons.name_len = shell_strlen(shell->prompt);
-	shell->ctx->internal.flags.use_colors =
-					IS_ENABLED(CONFIG_SHELL_VT100_COLORS);
+	flag_use_colors_set(shell, IS_ENABLED(CONFIG_SHELL_VT100_COLORS));
 
 	return 0;
 }
 
-static int shell_instance_uninit(const struct shell *shell);
+static int instance_uninit(const struct shell *shell)
+{
+	__ASSERT_NO_MSG(shell);
+	__ASSERT_NO_MSG(shell->ctx && shell->iface && shell->prompt);
+
+	int err;
+
+	if (flag_processing_get(shell)) {
+		return -EBUSY;
+	}
+
+	if (IS_ENABLED(CONFIG_LOG)) {
+		/* todo purge log queue */
+		shell_log_backend_disable(shell->log_backend);
+	}
+
+	err = shell->iface->api->uninit(shell->iface);
+	if (err != 0) {
+		return err;
+	}
+
+	history_purge(shell);
+
+	shell->ctx->state = SHELL_STATE_UNINITIALIZED;
+
+	return 0;
+}
 
 void shell_thread(void *shell_handle, void *arg_log_backend,
 		  void *arg_log_level)
@@ -1217,7 +1149,7 @@
 		if (signaled) {
 			k_poll_signal_reset(
 				&shell->ctx->signals[SHELL_SIGNAL_KILL]);
-			(void)shell_instance_uninit(shell);
+			(void)instance_uninit(shell);
 
 			k_thread_abort(k_current_get());
 		}
@@ -1247,7 +1179,7 @@
 	__ASSERT_NO_MSG(shell);
 	__ASSERT_NO_MSG(shell->ctx && shell->iface && shell->prompt);
 
-	int err = shell_instance_init(shell, transport_config, use_colors);
+	int err = instance_init(shell, transport_config, use_colors);
 
 	if (err != 0) {
 		return err;
@@ -1264,34 +1196,6 @@
 	return 0;
 }
 
-static int shell_instance_uninit(const struct shell *shell)
-{
-	__ASSERT_NO_MSG(shell);
-	__ASSERT_NO_MSG(shell->ctx && shell->iface && shell->prompt);
-
-	int err;
-
-	if (flag_processing_is_set(shell)) {
-		return -EBUSY;
-	}
-
-	if (IS_ENABLED(CONFIG_LOG)) {
-		/* todo purge log queue */
-		shell_log_backend_disable(shell->log_backend);
-	}
-
-	err = shell->iface->api->uninit(shell->iface);
-	if (err != 0) {
-		return err;
-	}
-
-	history_purge(shell);
-
-	shell->ctx->state = SHELL_STATE_UNINITIALIZED;
-
-	return 0;
-}
-
 int shell_uninit(const struct shell *shell)
 {
 	__ASSERT_NO_MSG(shell);
@@ -1302,7 +1206,7 @@
 
 		return 0;
 	} else {
-		return shell_instance_uninit(shell);
+		return instance_uninit(shell);
 	}
 }
 
@@ -1323,12 +1227,12 @@
 	}
 
 	if (IS_ENABLED(CONFIG_SHELL_VT100_COLORS)) {
-		vt100_color_set(shell, SHELL_NORMAL);
+		shell_vt100_color_set(shell, SHELL_NORMAL);
 	}
 
 	shell_raw_fprintf(shell->fprintf_ctx, "\n\n");
 
-	shell_state_set(shell, SHELL_STATE_ACTIVE);
+	state_set(shell, SHELL_STATE_ACTIVE);
 
 	return 0;
 }
@@ -1343,7 +1247,7 @@
 		return -ENOTSUP;
 	}
 
-	shell_state_set(shell, SHELL_STATE_INITIALIZED);
+	state_set(shell, SHELL_STATE_INITIALIZED);
 
 	return 0;
 }
@@ -1368,7 +1272,7 @@
 		break;
 
 	case SHELL_STATE_ACTIVE:
-		shell_state_collect(shell);
+		state_collect(shell);
 		break;
 
 	default:
@@ -1400,12 +1304,12 @@
 	    (color != shell->ctx->vt100_ctx.col.col)) {
 		struct shell_vt100_colors col;
 
-		vt100_colors_store(shell, &col);
-		vt100_color_set(shell, color);
+		shell_vt100_colors_store(shell, &col);
+		shell_vt100_color_set(shell, color);
 
 		shell_fprintf_fmt(shell->fprintf_ctx, p_fmt, args);
 
-		vt100_colors_restore(shell, &col);
+		shell_vt100_colors_restore(shell, &col);
 	} else {
 		shell_fprintf_fmt(shell->fprintf_ctx, p_fmt, args);
 	}
@@ -1463,5 +1367,5 @@
 	shell->ctx->cmd_buff_len = cmd_len;
 	shell->ctx->cmd_buff_pos = cmd_len;
 
-	return shell_execute(shell);
+	return execute(shell);
 }
diff --git a/subsys/shell/shell_cmds.c b/subsys/shell/shell_cmds.c
index 48716be..a6c545c 100644
--- a/subsys/shell/shell_cmds.c
+++ b/subsys/shell/shell_cmds.c
@@ -197,7 +197,7 @@
 	ARG_UNUSED(argc);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.mode_delete = 0;
+	flag_mode_delete_set(shell, false);
 
 	return 0;
 }
@@ -208,7 +208,7 @@
 	ARG_UNUSED(argc);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.mode_delete = 1;
+	flag_mode_delete_set(shell, true);
 
 	return 0;
 }
@@ -218,7 +218,7 @@
 	ARG_UNUSED(argc);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.use_colors = 0;
+	flag_use_colors_set(shell, false);
 
 	return 0;
 }
@@ -228,7 +228,7 @@
 	ARG_UNUSED(argv);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.use_colors = 1;
+	flag_use_colors_set(shell, true);
 
 	return 0;
 }
@@ -238,7 +238,7 @@
 	ARG_UNUSED(argc);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.echo = 0;
+	flag_echo_set(shell, false);
 
 	return 0;
 }
@@ -248,7 +248,7 @@
 	ARG_UNUSED(argc);
 	ARG_UNUSED(argv);
 
-	shell->ctx->internal.flags.echo = 1;
+	flag_echo_set(shell, true);
 
 	return 0;
 }
@@ -262,7 +262,7 @@
 	}
 
 	shell_print(shell, "Echo status: %s",
-		    flag_echo_is_set(shell) ? "on" : "off");
+		    flag_echo_get(shell) ? "on" : "off");
 
 	return 0;
 }
diff --git a/subsys/shell/shell_ops.c b/subsys/shell/shell_ops.c
index 8eae498..7633479 100644
--- a/subsys/shell/shell_ops.c
+++ b/subsys/shell/shell_ops.c
@@ -204,7 +204,7 @@
 	shell->ctx->cmd_buff_len += len;
 	shell->ctx->cmd_buff[shell->ctx->cmd_buff_len] = '\0';
 
-	if (!flag_echo_is_set(shell)) {
+	if (!flag_echo_get(shell)) {
 		shell->ctx->cmd_buff_pos += len;
 		return;
 	}
@@ -263,6 +263,17 @@
 	data_insert(shell, compl, compl_len);
 }
 
+void shell_cmd_line_erase(const struct shell *shell)
+{
+	shell_multiline_data_calc(&shell->ctx->vt100_ctx.cons,
+				  shell->ctx->cmd_buff_pos,
+				  shell->ctx->cmd_buff_len);
+	shell_op_cursor_horiz_move(shell, -shell->ctx->vt100_ctx.cons.cur_x);
+	shell_op_cursor_vert_move(shell, shell->ctx->vt100_ctx.cons.cur_y - 1);
+
+	clear_eos(shell);
+}
+
 static void shell_pend_on_txdone(const struct shell *shell)
 {
 	if (IS_ENABLED(CONFIG_MULTITHREADING)) {
@@ -270,9 +281,9 @@
 		k_poll_signal_reset(&shell->ctx->signals[SHELL_SIGNAL_TXDONE]);
 	} else {
 		/* Blocking wait in case of bare metal. */
-		while (!shell->ctx->internal.flags.tx_rdy) {
+		while (!flag_tx_rdy_get(shell)) {
 		}
-		shell->ctx->internal.flags.tx_rdy = 0;
+		flag_tx_rdy_set(shell, false);
 	}
 }
 
@@ -306,3 +317,48 @@
 {
 	shell_write((const struct shell *) user_ctx, data, data_len);
 }
+
+static void vt100_bgcolor_set(const struct shell *shell,
+			      enum shell_vt100_color bgcolor)
+{
+	if ((bgcolor == SHELL_NORMAL) ||
+	    (shell->ctx->vt100_ctx.col.bgcol == bgcolor)) {
+		return;
+	}
+
+	/* -1 because default value is first in enum */
+	u8_t cmd[] = SHELL_VT100_BGCOLOR(bgcolor - 1);
+
+	shell->ctx->vt100_ctx.col.bgcol = bgcolor;
+	shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
+
+}
+
+void shell_vt100_color_set(const struct shell *shell,
+			   enum shell_vt100_color color)
+{
+
+	if (shell->ctx->vt100_ctx.col.col == color) {
+		return;
+	}
+
+	shell->ctx->vt100_ctx.col.col = color;
+
+	if (color != SHELL_NORMAL) {
+
+		u8_t cmd[] = SHELL_VT100_COLOR(color - 1);
+
+		shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
+	} else {
+		static const u8_t cmd[] = SHELL_VT100_MODESOFF;
+
+		shell_raw_fprintf(shell->fprintf_ctx, "%s", cmd);
+	}
+}
+
+void shell_vt100_colors_restore(const struct shell *shell,
+				       const struct shell_vt100_colors *color)
+{
+	shell_vt100_color_set(shell, color->col);
+	vt100_bgcolor_set(shell, color->bgcol);
+}
diff --git a/subsys/shell/shell_ops.h b/subsys/shell/shell_ops.h
index 70e63b2..b65f786 100644
--- a/subsys/shell/shell_ops.h
+++ b/subsys/shell/shell_ops.h
@@ -6,6 +6,7 @@
 #ifndef SHELL_OPS_H__
 #define SHELL_OPS_H__
 
+#include <stdbool.h>
 #include <shell/shell.h>
 #include "shell_vt100.h"
 #include "shell_utils.h"
@@ -68,11 +69,81 @@
 	shell_raw_fprintf(shell->fprintf_ctx, "%c", ch);
 }
 
-static inline bool flag_echo_is_set(const struct shell *shell)
+static inline bool flag_insert_mode_get(const struct shell *shell)
+{
+	return ((shell->ctx->internal.flags.insert_mode == 1) ? true : false);
+}
+
+static inline void flag_insert_mode_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.insert_mode = val ? 1 : 0;
+}
+
+static inline bool flag_use_colors_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.use_colors == 1 ? true : false;
+}
+
+static inline void flag_use_colors_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.use_colors = val ? 1 : 0;
+}
+
+static inline bool flag_echo_get(const struct shell *shell)
 {
 	return shell->ctx->internal.flags.echo == 1 ? true : false;
 }
 
+static inline void flag_echo_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.echo = val ? 1 : 0;
+}
+
+static inline bool flag_processing_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.processing == 1 ? true : false;
+}
+
+static inline bool flag_tx_rdy_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.tx_rdy == 1 ? true : false;
+}
+
+static inline void flag_tx_rdy_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.tx_rdy = val ? 1 : 0;
+}
+
+static inline bool flag_mode_delete_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.mode_delete == 1 ? true : false;
+}
+
+static inline void flag_mode_delete_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.mode_delete = val ? 1 : 0;
+}
+
+static inline bool flag_history_exit_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.history_exit == 1 ? true : false;
+}
+
+static inline void flag_history_exit_set(const struct shell *shell, bool val)
+{
+	shell->ctx->internal.flags.history_exit = val ? 1 : 0;
+}
+
+static inline u8_t flag_last_nl_get(const struct shell *shell)
+{
+	return shell->ctx->internal.flags.last_nl;
+}
+
+static inline void flag_last_nl_set(const struct shell *shell, u8_t val)
+{
+	shell->ctx->internal.flags.last_nl = val;
+}
+
 void shell_op_cursor_vert_move(const struct shell *shell, s32_t delta);
 void shell_op_cursor_horiz_move(const struct shell *shell, s32_t delta);
 
@@ -121,6 +192,8 @@
 
 bool shell_cursor_in_empty_line(const struct shell *shell);
 
+void shell_cmd_line_erase(const struct shell *shell);
+
 /* Function sends data stream to the shell instance. Each time before the
  * shell_write function is called, it must be ensured that IO buffer of fprintf
  * is flushed to avoid synchronization issues.
@@ -143,6 +216,19 @@
 void shell_print_stream(const void *user_ctx, const char *data,
 			size_t data_len);
 
+/** @internal @brief Function for setting font color */
+void shell_vt100_color_set(const struct shell *shell,
+			   enum shell_vt100_color color);
+
+static inline void shell_vt100_colors_store(const struct shell *shell,
+					    struct shell_vt100_colors *color)
+{
+	memcpy(color, &shell->ctx->vt100_ctx.col, sizeof(*color));
+}
+
+void shell_vt100_colors_restore(const struct shell *shell,
+				const struct shell_vt100_colors *color);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/subsys/shell/shell_utils.c b/subsys/shell/shell_utils.c
index f3ee1a3..f75e939 100644
--- a/subsys/shell/shell_utils.c
+++ b/subsys/shell/shell_utils.c
@@ -225,7 +225,7 @@
 }
 
 /* Function returning pointer to root command matching requested syntax. */
-const struct shell_cmd_entry *root_cmd_find(const char *syntax)
+const struct shell_cmd_entry *shell_root_cmd_find(const char *syntax)
 {
 	const size_t cmd_count = shell_root_cmd_count();
 	const struct shell_cmd_entry *cmd;
@@ -335,7 +335,10 @@
 	}
 }
 
-void shell_buffer_trim(char *buff, u16_t *buff_len)
+/** @brief Remove white chars from beginning and end of command buffer.
+ *
+ */
+static void buffer_trim(char *buff, u16_t *buff_len)
 {
 	u16_t i = 0U;
 
@@ -369,3 +372,9 @@
 		*buff_len = *buff_len - i;
 	}
 }
+
+void shell_cmd_trim(const struct shell *shell)
+{
+	buffer_trim(shell->ctx->cmd_buff, &shell->ctx->cmd_buff_len);
+	shell->ctx->cmd_buff_pos = shell->ctx->cmd_buff_len;
+}
diff --git a/subsys/shell/shell_utils.h b/subsys/shell/shell_utils.h
index 3848368..db7a4e5 100644
--- a/subsys/shell/shell_utils.h
+++ b/subsys/shell/shell_utils.h
@@ -64,20 +64,17 @@
 int shell_command_add(char *buff, u16_t *buff_len,
 		      const char *new_cmd, const char *pattern);
 
-const struct shell_cmd_entry *root_cmd_find(const char *syntax);
+const struct shell_cmd_entry *shell_root_cmd_find(const char *syntax);
 
 void shell_spaces_trim(char *str);
 
-/** @brief Remove white chars from beginning and end of command buffer.
- *
- */
-void shell_buffer_trim(char *buff, u16_t *buff_len);
-
 static inline void transport_buffer_flush(const struct shell *shell)
 {
 	shell_fprintf_buffer_flush(shell->fprintf_ctx);
 }
 
+void shell_cmd_trim(const struct shell *shell);
+
 #ifdef __cplusplus
 }
 #endif
