int i;
        struct subtest_state *subtest_state;
        bool subtest_failed;
+       bool subtest_filtered;
        bool print_subtest;
 
        /* we do not print anything in the worker thread */
        for (i = 0; i < test_state->subtest_num; i++) {
                subtest_state = &test_state->subtest_states[i];
                subtest_failed = subtest_state->error_cnt;
+               subtest_filtered = subtest_state->filtered;
                print_subtest = verbose() || force_log || subtest_failed;
 
-               if (skip_ok_subtests && !subtest_failed)
+               if ((skip_ok_subtests && !subtest_failed) || subtest_filtered)
                        continue;
 
                if (subtest_state->log_cnt && print_subtest) {
                                state->subtest_num,
                                test->test_name,
                                subtest_name)) {
-               subtest_state->skipped = true;
+               subtest_state->filtered = true;
                return false;
        }
 
                subtest_state->name = strdup(msg.subtest_done.name);
                subtest_state->error_cnt = msg.subtest_done.error_cnt;
                subtest_state->skipped = msg.subtest_done.skipped;
+               subtest_state->filtered = msg.subtest_done.filtered;
 
                /* collect all logs */
                if (msg.subtest_done.have_log)
 
                msg.subtest_done.error_cnt = subtest_state->error_cnt;
                msg.subtest_done.skipped = subtest_state->skipped;
+               msg.subtest_done.filtered = subtest_state->filtered;
                msg.subtest_done.have_log = false;
 
                if (verbose() || state->force_log || subtest_state->error_cnt) {