diff --git a/sway/commands.c b/sway/commands.c
index b841ef09..2c1b2cb9 100644
--- a/sway/commands.c
+++ b/sway/commands.c
@@ -284,17 +284,32 @@ list_t *execute_command(char *_exec, struct sway_seat *seat,
 				free_argv(argc, argv);
 				goto cleanup;
 			}
+		} else if (views->length == 0) {
+			list_add(res_list,
+					cmd_results_new(CMD_FAILURE, "No matching node."));
 		} else {
+			struct cmd_results *fail_res = NULL;
 			for (int i = 0; i < views->length; ++i) {
 				struct sway_view *view = views->items[i];
 				set_config_node(&view->container->node);
 				struct cmd_results *res = handler->handle(argc-1, argv+1);
-				list_add(res_list, res);
-				if (res->status == CMD_INVALID) {
-					free_argv(argc, argv);
-					goto cleanup;
+				if (res->status == CMD_SUCCESS) {
+					free_cmd_results(res);
+				} else {
+					// last failure will take precedence
+					if (fail_res) {
+						free_cmd_results(fail_res);
+					}
+					fail_res = res;
+					if (res->status == CMD_INVALID) {
+						list_add(res_list, fail_res);
+						free_argv(argc, argv);
+						goto cleanup;
+					}
 				}
 			}
+			list_add(res_list,
+					fail_res ? fail_res : cmd_results_new(CMD_SUCCESS, NULL));
 		}
 		free_argv(argc, argv);
 	} while(head);