diff --git a/src/vim9script.c b/src/vim9script.c
index 0994e51..2a829f4 100644
--- a/src/vim9script.c
+++ b/src/vim9script.c
@@ -325,82 +325,43 @@
 {
     char_u	*arg = arg_start;
     char_u	*cmd_end = NULL;
-    char_u	*as_name = NULL;
     int		ret = FAIL;
     typval_T	tv;
     int		sid = -1;
     int		res;
+    int		mult = FALSE;
     garray_T	names;
+    garray_T	as_names;
 
     ga_init2(&names, sizeof(char_u *), 10);
+    ga_init2(&as_names, sizeof(char_u *), 10);
     if (*arg == '{')
     {
 	// "import {item, item} from ..."
+	mult = TRUE;
 	arg = skipwhite_and_linebreak(arg + 1, evalarg);
-	for (;;)
-	{
-	    char_u  *p = arg;
-	    int	    had_comma = FALSE;
-
-	    while (eval_isnamec(*arg))
-		++arg;
-	    if (p == arg)
-		break;
-	    if (ga_grow(&names, 1) == FAIL)
-		goto erret;
-	    ((char_u **)names.ga_data)[names.ga_len] =
-						      vim_strnsave(p, arg - p);
-	    ++names.ga_len;
-	    if (*arg == ',')
-	    {
-		had_comma = TRUE;
-		++arg;
-	    }
-	    arg = skipwhite_and_linebreak(arg, evalarg);
-	    if (*arg == '}')
-	    {
-		arg = skipwhite_and_linebreak(arg + 1, evalarg);
-		break;
-	    }
-	    if (!had_comma)
-	    {
-		emsg(_(e_missing_comma_in_import));
-		goto erret;
-	    }
-	}
-	if (names.ga_len == 0)
-	{
-	    emsg(_(e_syntax_error_in_import));
-	    goto erret;
-	}
     }
-    else
-    {
-	// "import Name from ..."
-	// "import * as Name from ..."
-	// "import item [as Name] from ..."
-	arg = skipwhite_and_linebreak(arg, evalarg);
-	if (arg[0] == '*' && IS_WHITE_OR_NUL(arg[1]))
-	    arg = skipwhite_and_linebreak(arg + 1, evalarg);
-	else if (eval_isnamec1(*arg))
-	{
-	    char_u  *p = arg;
 
+    for (;;)
+    {
+	char_u	    *p = arg;
+	int	    had_comma = FALSE;
+	char_u	    *as_name = NULL;
+
+	// accept "*" or "Name"
+	if (!mult && arg[0] == '*' && IS_WHITE_OR_NUL(arg[1]))
+	    ++arg;
+	else
 	    while (eval_isnamec(*arg))
 		++arg;
-	    if (ga_grow(&names, 1) == FAIL)
-		goto erret;
-	    ((char_u **)names.ga_data)[names.ga_len] =
-						      vim_strnsave(p, arg - p);
-	    ++names.ga_len;
-	    arg = skipwhite_and_linebreak(arg, evalarg);
-	}
-	else
-	{
-	    emsg(_(e_syntax_error_in_import));
+	if (p == arg)
+	    break;
+	if (ga_grow(&names, 1) == FAIL || ga_grow(&as_names, 1) == FAIL)
 	    goto erret;
-	}
+	((char_u **)names.ga_data)[names.ga_len] = vim_strnsave(p, arg - p);
+	++names.ga_len;
 
+	arg = skipwhite_and_linebreak(arg, evalarg);
 	if (STRNCMP("as", arg, 2) == 0 && IS_WHITE_OR_NUL(arg[2]))
 	{
 	    char_u *p;
@@ -421,6 +382,35 @@
 	    emsg(_(e_missing_as_after_star));
 	    goto erret;
 	}
+	// without "as Name" the as_names entry is NULL
+	((char_u **)as_names.ga_data)[as_names.ga_len] = as_name;
+	++as_names.ga_len;
+
+	if (!mult)
+	    break;
+	if (*arg == ',')
+	{
+	    had_comma = TRUE;
+	    ++arg;
+	}
+	arg = skipwhite_and_linebreak(arg, evalarg);
+	if (*arg == '}')
+	{
+	    ++arg;
+	    break;
+	}
+	if (!had_comma)
+	{
+	    emsg(_(e_missing_comma_in_import));
+	    goto erret;
+	}
+    }
+    arg = skipwhite_and_linebreak(arg, evalarg);
+
+    if (names.ga_len == 0)
+    {
+	emsg(_(e_syntax_error_in_import));
+	goto erret;
     }
 
     if (STRNCMP("from", arg, 4) != 0 || !IS_WHITE_OR_NUL(arg[4]))
@@ -501,8 +491,10 @@
 
     if (*arg_start == '*')
     {
-	imported_T *imported;
+	imported_T  *imported;
+	char_u	    *as_name = ((char_u **)as_names.ga_data)[0];
 
+	// "import * as That"
 	imported = find_imported(as_name, STRLEN(as_name), cctx);
 	if (imported != NULL && imported->imp_sid == sid)
 	{
@@ -521,7 +513,7 @@
 	if (imported == NULL)
 	    goto erret;
 	imported->imp_name = as_name;
-	as_name = NULL;
+	((char_u **)as_names.ga_data)[0] = NULL;
 	imported->imp_sid = sid;
 	imported->imp_flags = IMP_FLAGS_STAR;
     }
@@ -535,6 +527,7 @@
 	for (i = 0; i < names.ga_len; ++i)
 	{
 	    char_u	*name = ((char_u **)names.ga_data)[i];
+	    char_u	*as_name = ((char_u **)as_names.ga_data)[i];
 	    size_t	len = STRLEN(name);
 	    int		idx;
 	    imported_T	*imported;
@@ -572,10 +565,17 @@
 		if (imported == NULL)
 		    goto erret;
 
-		// TODO: check for "as" following
-		// imported->imp_name = vim_strsave(as_name);
-		imported->imp_name = name;
-		((char_u **)names.ga_data)[i] = NULL;
+		if (as_name == NULL)
+		{
+		    imported->imp_name = name;
+		    ((char_u **)names.ga_data)[i] = NULL;
+		} 
+		else
+		{
+		    // "import This as That ..."
+		    imported->imp_name = as_name;
+		    ((char_u **)as_names.ga_data)[i] = NULL;
+		}
 		imported->imp_sid = sid;
 		if (idx >= 0)
 		{
@@ -592,7 +592,7 @@
     }
 erret:
     ga_clear_strings(&names);
-    vim_free(as_name);
+    ga_clear_strings(&as_names);
     return cmd_end;
 }
 
