diff --git a/src/lib-sieve/plugins/variables/cmd-set.c b/src/lib-sieve/plugins/variables/cmd-set.c
index 6466603adedc7a83ae32df01332e758947c66c56..1e9b77ffad8ef94baf59e8a5bb184b45986e3331 100644
--- a/src/lib-sieve/plugins/variables/cmd-set.c
+++ b/src/lib-sieve/plugins/variables/cmd-set.c
@@ -230,7 +230,9 @@ static bool cmd_set_validate(struct sieve_validator *validator,
 		return FALSE;
 	}
 	
-	ext_variables_variable_argument_activate(validator, arg);
+	if ( !ext_variables_variable_assignment_activate(validator, arg, cmd) ) {
+		return FALSE;
+	}
 
 	arg = sieve_ast_argument_next(arg);
 	
diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.c b/src/lib-sieve/plugins/variables/ext-variables-common.c
index a7c43358a1beb9e16f23d9611354a9d51659e37a..39704ccd021bb4d23719da37e59f5d2e935e60f2 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-common.c
+++ b/src/lib-sieve/plugins/variables/ext-variables-common.c
@@ -283,18 +283,57 @@ static struct sieve_ast_argument *ext_variables_variable_argument_create
 	return arg;
 }
 
-void ext_variables_variable_argument_activate
-(struct sieve_validator *validator, struct sieve_ast_argument *arg)
+bool ext_variables_variable_assignment_activate
+(struct sieve_validator *validator, struct sieve_ast_argument *arg,
+	struct sieve_command_context *cmd)
 {
 	struct ext_variables_validator_context *ctx;
 	struct sieve_variable *var;
+	string_t *variable;
+	const char *varstr, *varend;
+	ARRAY_TYPE(ext_variable_name) vname;	
+	int nelements = 0;
+
+	t_array_init(&vname, 2);			
 	
-	ctx = ext_variables_validator_context_get(validator);
-	var = sieve_variable_scope_get_variable(ctx->main_scope, 
-		sieve_ast_argument_strc(arg));
+	variable = sieve_ast_argument_str(arg);
+	varstr = str_c(variable);
+	varend = PTR_OFFSET(varstr, str_len(variable));
+	nelements = ext_variable_name_parse(&vname, &varstr, varend);
+	
+	if ( nelements < 0 || varstr != varend ) {
+		sieve_command_validate_error(validator, cmd, 
+			"invalid variable name in assignment");
+		return FALSE;
+	}
+	
+	if ( nelements == 1 ) {
+		const struct ext_variable_name *cur_element = 
+			array_idx(&vname, 0);
 
-	arg->argument = &variable_argument;
-	arg->context = (void *) var;
+		if ( cur_element->num_variable == -1 ) {
+			ctx = ext_variables_validator_context_get(validator);
+			var = sieve_variable_scope_get_variable
+				(ctx->main_scope, str_c(cur_element->identifier));
+
+			arg->argument = &variable_argument;
+			arg->context = (void *) var;
+			
+			return TRUE;
+		} else {
+			sieve_command_validate_error(validator, cmd, 
+				"cannot assign to match variable");
+		}
+	} else {
+		const struct ext_variable_name *cur_element = 
+			array_idx(&vname, 0);
+
+		/* FIXME: Variable namespaces unsupported. */
+		sieve_command_validate_error(validator, cmd, 
+				"cannot assign to variable in unknown namespace '%s'", 
+				str_c(cur_element->identifier));
+	}
+	return FALSE;
 }
 
 static bool arg_variable_generate
diff --git a/src/lib-sieve/plugins/variables/ext-variables-common.h b/src/lib-sieve/plugins/variables/ext-variables-common.h
index 416fb2fce3c682c661922d8e1de86e83319fd8bc..c00a96104a924f19487e93bf3446909b33f09957 100644
--- a/src/lib-sieve/plugins/variables/ext-variables-common.h
+++ b/src/lib-sieve/plugins/variables/ext-variables-common.h
@@ -64,8 +64,9 @@ bool ext_variables_opr_variable_read
 void ext_variables_opr_variable_string_emit
 	(struct sieve_binary *sbin, unsigned int elements);
 
-void ext_variables_variable_argument_activate
-	(struct sieve_validator *validator, struct sieve_ast_argument *arg);
+bool ext_variables_variable_assignment_activate
+(struct sieve_validator *validator, struct sieve_ast_argument *arg,
+	struct sieve_command_context *cmd);
 
 struct sieve_variable *ext_variables_validator_get_variable
 (struct sieve_validator *validator, const char *variable);
diff --git a/src/lib-sieve/plugins/variables/variables-errors.sieve b/src/lib-sieve/plugins/variables/variables-errors.sieve
index 2f2b6af1785aa476f39828b82ab0c8037765dc62..02590cef36a9bc51002c3c7bdb88a61a02d491e4 100644
--- a/src/lib-sieve/plugins/variables/variables-errors.sieve
+++ b/src/lib-sieve/plugins/variables/variables-errors.sieve
@@ -6,3 +6,7 @@ set :lowerfirst :upperfirst "friep" "Friep";
 
 fileinto "${frop}";
 fileinto "${friep}";
+
+set "0" "Frop";
+set "frop." "Friep";
+set "frop.friep" "Frml";