From 587008c7b8fc5c8241a0c8ee41eed2895317a1d7 Mon Sep 17 00:00:00 2001
From: Kevin Griffin <griffin.kev@gmail.com>
Date: Tue, 15 Sep 2020 13:28:35 -0400
Subject: [PATCH] Adds config for gihub actions, introducing three jobs. Jobs
 for indy-common/node and lint.

Signed-off-by: Kevin Griffin <griffin.kev@gmail.com>
---
 .github/workflows/README.md                   |  25 +++
 .github/workflows/build.yaml                  | 158 ++++++++++++++
 .github/workflows/build/Dockerfile            |  17 ++
 .github/workflows/build/README.md             |   3 +
 .../build/indy-core-repo.preferences          |   3 +
 .github/workflows/build/scripts/clean.sh      |   6 +
 .github/workflows/build/scripts/user.sh       |  21 ++
 .github/workflows/lint/Dockerfile             |  21 ++
 .github/workflows/lint/README.md              |   3 +
 .gitignore                                    |  16 +-
 .../test_auth_rule_with_metadata_complex.py   |   8 +
 .../test_auth_rule_with_metadata_composite.py |  17 ++
 .../test_auth_rule_with_metadata_simple.py    |  21 ++
 .../test/auth/metadata/test_error_messages.py |   5 +
 .../test_auth_multi_sig_for_1_owner.py        |   3 +
 .../test_auth_multi_sig_for_5_owners.py       |   4 +
 indy_common/test/auth/test_auth_actions.py    |   5 +
 indy_common/test/auth/test_auth_anyone.py     |   1 +
 .../test_auth_claim_def_with_new_auth_map.py  |   4 +
 indy_common/test/auth/test_auth_constraint.py |  16 ++
 .../test_auth_for_auth_rule_new_auth_map.py   |   3 +
 .../auth/test_auth_node_with_new_auth_map.py  |  14 ++
 .../auth/test_auth_nym_with_new_auth_map.py   |  35 +++
 .../test_auth_pool_config_new_auth_map.py     |   3 +
 ...est_auth_pool_restart_with_new_auth_map.py |   3 +
 ...est_auth_pool_upgrade_with_new_auth_map.py |   6 +
 ...test_auth_rev_reg_def_with_new_auth_map.py |   4 +
 ...h_rich_schema_objects_with_new_auth_map.py |   2 +
 .../test_auth_schema_with_new_auth_map.py     |   4 +
 indy_common/test/auth/test_auth_strategies.py |  12 +
 ..._txn_author_agreement_with_new_auth_map.py |   3 +
 ...t_auth_validator_info_with_new_auth_map.py |   3 +
 .../test/auth/test_composite_authorizer.py    |   7 +
 .../auth/test_config_ledger_auth_strategy.py  |   3 +
 .../test/auth/test_endorser_authorizer.py     |  13 ++
 indy_common/test/auth/test_helper.py          |   4 +
 indy_common/test/auth/test_role_authorizer.py |  16 ++
 ..._author_agreement_aml_with_new_auth_map.py |   3 +
 indy_common/test/state/test_state_path.py     |   9 +
 indy_common/test/test_req_utils_claim_def.py  |  18 ++
 indy_common/test/test_req_utils_schema.py     |  13 ++
 indy_common/test/test_roles.py                |  13 +-
 indy_common/test/test_strict_schema.py        |   3 +
 indy_common/test/test_strict_types.py         |  21 +-
 indy_common/test/test_transactions.py         |   6 +
 indy_common/test/test_util.py                 |   4 +
 indy_common/test/types/test_attrib.py         |  20 ++
 indy_common/test/types/test_attrib_schema.py  |   2 +
 .../test/types/test_auth_rule_schema.py       |   8 +
 .../test/types/test_claim_def_get_schema.py   |   4 +
 .../test/types/test_claim_def_sub_schema.py   |   2 +
 indy_common/test/types/test_discl_schema.py   |   2 +
 .../test/types/test_get_attrib_schema.py      |   2 +
 .../test/types/test_get_auth_rule_schema.py   |   5 +
 indy_common/test/types/test_get_nym_schema.py |   2 +
 .../types/test_get_revoc_reg_def_schema.py    |   4 +
 .../types/test_get_revoc_reg_delta_schema.py  |   4 +
 .../types/test_get_revoc_reg_entry_schema.py  |   4 +
 ...est_get_rich_schema_object_by_id_schema.py |   4 +
 ...t_rich_schema_object_by_metadata_schema.py |   4 +
 .../test/types/test_get_schema_schema.py      |   6 +
 .../test/types/test_pool_config_schema.py     |   2 +
 .../test/types/test_pool_upg_schema.py        |   2 +
 .../test_revoc_def_entry_submit_schema.py     |   7 +
 .../types/test_revoc_def_submit_schema.py     |   7 +
 .../types/test_rich_schema_object_schema.py   |   2 +
 indy_common/test/types/test_schema_schema.py  |   6 +
 indy_common/test/version/test_node_version.py |   4 +
 .../version/test_node_version_fallback.py     |  10 +
 indy_common/test/version/test_version.py      |   3 +
 indy_node/test/anon_creds/conftest.py         |   2 +-
 .../anon_creds/test_get_revoc_reg_def_send.py |   3 +
 ...est_get_revoc_reg_delta_send_by_default.py |   5 +
 ...test_get_revoc_reg_delta_send_by_demand.py |   4 +
 .../test_get_revoc_reg_delta_unit.py          |   1 +
 .../test_get_revoc_reg_delta_validation.py    |   3 +
 ...t_get_revoc_reg_delta_with_none_results.py |   2 +
 .../anon_creds/test_get_revoc_reg_entry.py    |   3 +
 .../anon_creds/test_get_revoc_reg_send.py     |   3 +
 .../test_incorrect_revoc_reg_def.py           |   1 +
 .../test_integration_get_revoc_delta.py       |   1 +
 .../test/anon_creds/test_revoc_def_send.py    |   2 +
 .../test_revoc_def_static_validation.py       |   1 +
 .../anon_creds/test_revoc_def_validation.py   |   2 +
 .../test_revoc_entry_static_validation.py     |   1 +
 .../test_revoc_reg_entry_validation.py        |  10 +
 .../test_state_proof_for_get_request.py       |   7 +
 indy_node/test/api/test_attrib_reply.py       |   4 +
 indy_node/test/api/test_claim_def_reply.py    |   2 +
 indy_node/test/api/test_nym_reply.py          |   2 +
 .../api/test_rich_schema_objects_reply.py     |   1 +
 indy_node/test/api/test_schema_reply.py       |   3 +
 .../test/attrib_txn/test_attrib_txn_digest.py |   4 +
 .../test_n_minus_f_pool_processes_attrib.py   |   2 +
 indy_node/test/attrib_txn/test_nym_attrib.py  |  31 ++-
 .../test/attrib_txn/test_send_get_attr.py     |   7 +
 .../auth_framework/test_auth_rule_using.py    | 206 +++++++++++++-----
 indy_node/test/auth_rule/test_auth_map.py     |  15 ++
 .../auth_rule/test_auth_rule_transaction.py   |   9 +
 .../auth_rule/test_auth_rules_transaction.py  |   9 +
 .../test_catching_up_auth_rule_txn.py         |   1 +
 ...test_check_rule_for_add_action_changing.py |   1 +
 ...est_check_rule_for_edit_action_changing.py |   1 +
 .../test/auth_rule/test_constraint_field.py   |  12 +
 .../test/auth_rule/test_get_auth_rule.py      |  10 +
 .../test/auth_rule/test_multisig_auth_rule.py |   3 +
 .../test_node_txn_demote_by_endorser.py       |   1 +
 .../test_node_txn_promote_by_endorser.py      |   1 +
 .../test_revert_auth_rule_changing.py         |   1 +
 ...st_txn_with_different_signature_and_idr.py |   1 +
 ...est_use_modified_rules_from_uncommitted.py |   3 +
 ...h_rejected_and_later_ordered_on_catchup.py |   1 +
 .../test_requests_post_multiple_new_nodes.py  |   2 +
 .../test_requests_post_new_node_catchup.py    |   2 +
 .../test/catchup/test_state_recovering.py     |   1 +
 .../catchup/test_txn_version_controller.py    |   4 +
 .../claim_def/test_claim_def_auth_rule.py     |   1 +
 .../test/claim_def/test_send_claim_def.py     |   7 +
 .../test/claim_def/test_send_get_claim_def.py |   5 +
 .../did/test_did_with_abbreviated_verkey.py   |  17 +-
 .../test/did/test_did_with_full_verkey.py     |  17 +-
 indy_node/test/did/test_did_with_no_verkey.py |  17 +-
 .../test/endorser/test_send_by_endorser.py    |   6 +
 .../node_control_utils/test_debian_version.py |  12 +
 .../test_node_control_util.py                 |  11 +
 .../node_txn/test_send_node_validation.py     | 131 +++++++----
 .../test_create_did_without_endorser.py       |   6 +
 .../nym_txn/test_demote_network_monitor.py    |   2 +
 indy_node/test/nym_txn/test_nym.py            |   6 +-
 indy_node/test/nym_txn/test_nym_additional.py |  15 +-
 indy_node/test/nym_txn/test_nym_auth_rules.py |   3 +
 .../test/nym_txn/test_nym_blacklisting.py     |   3 +
 indy_node/test/nym_txn/test_nym_no_role.py    |   1 +
 indy_node/test/nym_txn/test_nym_resend.py     |   5 +
 .../test/nym_txn/test_send_nym_validation.py  |  64 +++---
 indy_node/test/package/test_metadata.py       |   7 +-
 indy_node/test/persistence/test_idr_cache.py  |  10 +-
 .../test_idr_cache_update_after_catchup.py    |   2 +
 .../test/pool_config/test_pool_config.py      |  17 +-
 .../test/pool_config/test_send_pool_config.py |   7 +
 .../test_send_pool_config_only_trustee.py     |   5 +
 .../pool_restart/test_fail_pool_restart.py    |   2 +
 .../test_node_control_tool_for_restart.py     |   2 +
 .../test/pool_restart/test_pool_restart.py    |   6 +
 ...st_pool_restart_now_with_empty_datetime.py |   3 +
 .../test_pool_restarts_one_by_one.py          |   2 +
 ...ol_restarts_one_by_one_with_restart_now.py |   3 +
 .../test_restart_on_inconsistency.py          |   1 +
 .../test_state_regenerated_from_ledger.py     |   2 +
 .../test_all_rich_schema_handlers.py          |   9 +
 .../test_get_rs_object_by_id_handler.py       |   3 +
 .../test_get_rs_object_by_metadata_handler.py |   3 +
 .../test_jsonld_context_handler.py            |  11 +
 .../test_rich_schema_cred_def_handler.py      |   8 +
 .../test_rich_schema_encoding_handler.py      |   7 +
 .../rich_schema/test_rich_schema_handler.py   |   1 +
 .../test_rich_schema_mapping_handler.py       |  14 ++
 .../test_rich_schema_pres_def_handler.py      |   1 +
 .../request_handlers/test_attrib_handler.py   |   6 +
 .../test_auth_rule_1_9_1_handler.py           |   1 +
 .../test_auth_rule_handler.py                 |   7 +
 .../test_auth_rules_handler.py                |   7 +
 .../test_claim_def_handler.py                 |   8 +
 .../test_get_auth_rule_handler.py             |   5 +
 .../test/request_handlers/test_nym_handler.py |  11 +
 .../test_pool_upgrade_handler.py              |   9 +
 .../test_revert_uncommitted_state.py          |   1 +
 .../test_revoc_reg_def_handler.py             |   5 +
 .../test_revoc_reg_entry_handler.py           |   6 +
 .../request_handlers/test_schema_handler.py   |   4 +
 .../test_txn_author_agreement_aml_handler.py  |   2 +
 ...st_txn_author_agreement_disable_handler.py |   2 +
 .../test_txn_author_agreement_handler.py      |   2 +
 .../test_txn_author_agreement_handler_v1.py   |   1 +
 .../test_update_state_config_req_handler.py   |   3 +
 .../test_request_propagates.py                |   1 +
 .../test_rich_schemas_disabled_by_default.py  |   3 +
 .../test_send_get_rich_schema_obj.py          |   6 +
 .../rich_schema/test_send_rich_schema_obj.py  |   2 +
 indy_node/test/schema/test_send_get_schema.py |   9 +
 indy_node/test/schema/test_send_schema.py     |   5 +
 .../test/state_proof/test_asking_one_node.py  |   1 +
 ...est_state_multi_proofs_for_get_requests.py |   7 +-
 .../test_state_proof_for_get_requests.py      |   8 +
 .../test_state_proof_for_missing_data.py      |   4 +
 .../test/suspension/test_node_suspension.py   |   8 +-
 .../test/suspension/test_nym_suspension.py    |  12 +-
 indy_node/test/suspension/test_suspension.py  |  21 +-
 indy_node/test/tools/test_nsreplay.py         |   1 +
 .../txn_author_agreement/test_get_taa_aml.py  |   1 +
 .../txn_author_agreement/test_node_taa.py     |   3 +
 .../test_recover_taa_from_ledger.py           |   2 +
 .../test_pool_upgrade_validation.py           |   3 +
 .../test_send_attrib_validation.py            | 126 +++++++----
 .../test_send_get_nym_validation.py           |  19 +-
 indy_node/test/upgrade/test_action_log.py     |  23 +-
 .../test_broken_connection_control_tool.py    |   1 +
 ...test_communication_with_control_service.py |   6 +-
 ...st_force_upgrade_process_in_view_change.py |   1 +
 ...de_if_ordered_and_then_request_received.py |   3 +
 ...ade_if_request_received_after_propagate.py |   3 +
 ...ced_upgrade_no_consensus_on_single_node.py |   3 +
 .../test/upgrade/test_get_deps_with_filter.py |   1 +
 indy_node/test/upgrade/test_migration_tool.py |  13 +-
 indy_node/test/upgrade/test_migration_util.py |   8 +
 .../test_node_control_tool_creates_backups.py |   3 +-
 ...t_node_control_tool_performs_migrations.py |   4 +-
 ...ode_control_tool_processes_invalid_data.py |   2 +
 ...est_node_control_tool_receives_messages.py |   5 +-
 .../test_node_control_tool_removes_backups.py |   4 +-
 ...ode_control_tool_resolves_dep_top_level.py |   1 +
 ...node_control_tool_resolves_dependencies.py |   7 +-
 ...node_control_tool_restores_from_backups.py |   4 +-
 ...de_does_not_reschedule_canceled_upgrade.py |   3 +
 ...andles_forced_upgrade_on_client_request.py |   3 +
 ...ode_handles_forced_upgrade_on_propagate.py |   3 +
 ...reschedules_upgrade_for_proper_datetime.py |   3 +
 .../upgrade/test_node_schedules_upgrade.py    |   4 +
 ...edules_upgrade_after_pool_ledger_update.py |   1 +
 ...st_node_schedules_upgrade_after_restart.py |   3 +
 ..._node_schedules_upgrade_exp_force_false.py |   4 +
 ...t_node_schedules_upgrade_exp_force_true.py |   4 +
 ...e_schedules_upgrade_for_proper_datetime.py |   3 +
 .../test_node_sustain_invalid_upgrade_txn.py  |   1 +
 indy_node/test/upgrade/test_node_upgrade.py   |   4 +
 .../upgrade/test_node_upgrade_in_progress.py  |   2 +
 ...st_node_upgrade_rescheduled_view_change.py |   2 +
 .../upgrade/test_node_upgrade_unsuccessful.py |   3 +
 .../test/upgrade/test_pool_upgrade_cancel.py  |   5 +-
 ..._pool_upgrade_force_scheduled_only_once.py |   3 +
 .../test/upgrade/test_pool_upgrade_no_loop.py |   4 +
 .../test_pool_upgrade_no_loop_force.py        |   3 +
 ...pool_upgrade_no_loop_force_unsuccessful.py |   3 +
 .../test_pool_upgrade_no_loop_reinstall.py    |   3 +
 ..._upgrade_no_loop_reinstall_unsuccessful.py |   3 +
 .../test_pool_upgrade_no_loop_unsuccessful.py |   3 +
 .../test/upgrade/test_pool_upgrade_reject.py  |  14 +-
 ...t_pool_upgrade_same_time_different_days.py |   2 +
 .../upgrade/test_pool_upgrade_same_version.py |   1 +
 ...est_pool_upgrade_same_version_reinstall.py |   3 +
 .../test_pool_upgrade_through_catchup.py      |   2 +-
 .../test_reschedule_upgrade_lower_version.py  |   5 +-
 indy_node/test/upgrade/test_restart_log.py    |   4 +-
 .../test/upgrade/test_send_node_upgrade.py    |   1 +
 indy_node/test/upgrade/test_upgrade_log.py    |   4 +
 .../test_upgrade_pool_with_demoted_nodes.py   |   3 +
 .../test/upgrade/test_upgrade_timeout.py      |   4 +-
 indy_node/test/upgrade/test_upgrader.py       |  13 ++
 .../test/upgrade/test_version_parsing.py      |   2 +
 .../validator_info/test_validator_info.py     |  12 +
 .../test_validator_info_command.py            |   2 +
 .../test_validator_info_handler.py            |   1 +
 ..._view_change_during_alternating_unstash.py |   1 +
 .../test_revocation_write_permission.py       |  10 +
 .../test_send_write_permission_no_client.py   |   4 +
 scripts/pytest_mark_check.py                  |  70 ++++++
 scripts/run_pytest_check.sh                   |  24 ++
 ...est_specific_tests_against_specific_env.py |   2 +-
 setup.py                                      |   2 +-
 259 files changed, 1949 insertions(+), 265 deletions(-)
 create mode 100644 .github/workflows/README.md
 create mode 100644 .github/workflows/build.yaml
 create mode 100644 .github/workflows/build/Dockerfile
 create mode 100644 .github/workflows/build/README.md
 create mode 100644 .github/workflows/build/indy-core-repo.preferences
 create mode 100755 .github/workflows/build/scripts/clean.sh
 create mode 100755 .github/workflows/build/scripts/user.sh
 create mode 100644 .github/workflows/lint/Dockerfile
 create mode 100644 .github/workflows/lint/README.md
 create mode 100644 scripts/pytest_mark_check.py
 create mode 100755 scripts/run_pytest_check.sh

diff --git a/.github/workflows/README.md b/.github/workflows/README.md
new file mode 100644
index 000000000..f1587ac39
--- /dev/null
+++ b/.github/workflows/README.md
@@ -0,0 +1,25 @@
+### Github Actions Workflow
+
+This build file replaces the existing `Jenkins.ci` build process.
+
+`lint.yaml` replaces the `Static code validation` stage of the Jenkins build.
+
+`build.yaml` replaces the `Build / Test` stage of the Jenkins build.
+
+Many of the other stages are replaced merely by the fact we're using Github Actions, we use prebuild Docker containers so we don't have to replicate the steps for building containers.
+
+The `Build result notification` stage was not moved to GHA, build failures will be reports via GHA.
+
+The build process for `Jenkins.nightly` was not ported to GHA.
+
+#### Configuring actions
+
+If you are cloning or forking this repo you will need to configure two secrets for Actions to run correctly.
+
+Secrets can be set via Settings -> Secrets -> New repository secret.
+
+CR_USER is your GH username.
+CR_PAT can be created by following [these directions](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token)
+
+Once you have run the build once with those secrets, you have to make then package public.
+Access the package at https://ghcr.io/USER/indy-node/indy-node-build or https://ghcr.io/USER/indy-node/indy-node-lint then change the visibility in 'Package Settings' to 'Public' then re-run the build.
diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml
new file mode 100644
index 000000000..9fd274309
--- /dev/null
+++ b/.github/workflows/build.yaml
@@ -0,0 +1,158 @@
+name: indy-node-build
+on: [ push, pull_request ]
+
+jobs:
+  workflow-setup:
+    runs-on: ubuntu-latest
+    outputs:
+      CACHE_KEY_LINT: ${{ steps.cache.outputs.CACHE_KEY_LINT }}
+      CACHE_KEY_BUILD: ${{ steps.cache.outputs.CACHE_KEY_BUILD }}
+    steps:
+      - name: Git checkout
+        uses: actions/checkout@v2
+      - name: Set outputs
+        id: cache
+        run: |
+          echo "::set-output name=CACHE_KEY_LINT::${{ hashFiles('.github/workflows/lint/Dockerfile') }}"
+          echo "::set-output name=CACHE_KEY_BUILD::${{ hashFiles('.github/workflows/build/Dockerfile') }}"
+           
+  build-lint-image:
+    needs: workflow-setup
+    runs-on: ubuntu-latest
+    env:
+      DOCKER_BUILDKIT: 1
+      CACHE_KEY_LINT: ${{ needs.workflow-setup.outputs.CACHE_KEY_LINT }}
+    steps:
+      - name: Git checkout
+        uses: actions/checkout@v2
+      - name: Try load from cache.
+        id: cache-image-lint
+        uses: actions/cache@v2
+        with:
+          path: ${GITHUB_WORKSPACE}/cache
+          key: ${{ env.CACHE_KEY_LINT }}
+      - name: If NOT found in cache, build and push image.
+        if: steps.cache-image-lint.outputs.cache-hit != 'true'
+        run: |
+          echo ${{ secrets.CR_PAT }} | docker login ghcr.io --username ${{ secrets.CR_USER }} --password-stdin
+          docker build -f .github/workflows/lint/Dockerfile --no-cache -t ${GITHUB_REPOSITORY}/indy-node-lint:${{ env.CACHE_KEY_LINT }} .
+          docker tag ${GITHUB_REPOSITORY}/indy-node-lint:${{ env.CACHE_KEY_LINT }} ghcr.io/${GITHUB_REPOSITORY}/indy-node-lint:latest
+          docker push ghcr.io/${GITHUB_REPOSITORY}/indy-node-lint:latest
+          mkdir -p ${GITHUB_WORKSPACE}/cache
+          touch ${GITHUB_WORKSPACE}/cache/${{ env.CACHE_KEY_LINT }}
+
+  build-test-image:
+    needs: workflow-setup
+    runs-on: ubuntu-latest
+    env:
+      DOCKER_BUILDKIT: 1
+      CACHE_KEY_BUILD: ${{ needs.workflow-setup.outputs.CACHE_KEY_BUILD }}
+    steps:
+      - name: Git checkout
+        uses: actions/checkout@v2
+      - name: Try load from cache.
+        id: cache-image-build
+        uses: actions/cache@v2
+        with:
+          path: ${GITHUB_WORKSPACE}/cache
+          key: ${{ env.CACHE_KEY_BUILD }}
+      - name: If NOT found in cache, build and push image.
+        if: steps.cache-image-build.outputs.cache-hit != 'true'
+        run: |
+          echo ${{ secrets.CR_PAT }} | docker login ghcr.io --username ${{ secrets.CR_USER }} --password-stdin
+          docker build -f .github/workflows/build/Dockerfile --no-cache -t ${GITHUB_REPOSITORY}/indy-node-build:${{ env.CACHE_KEY_BUILD }} .
+          docker tag ${GITHUB_REPOSITORY}/indy-node-build:${{ env.CACHE_KEY_BUILD }} ghcr.io/${GITHUB_REPOSITORY}/indy-node-build:latest
+          docker push ghcr.io/${GITHUB_REPOSITORY}/indy-node-build:latest
+          mkdir -p ${GITHUB_WORKSPACE}/cache
+          touch ${GITHUB_WORKSPACE}/cache/${{ env.CACHE_KEY_BUILD }}
+
+
+  decorator-checks:
+    name: Run decorator checks
+    needs: 
+      - build-test-image
+      - lint
+    runs-on: ubuntu-18.04
+    container:
+      image: ghcr.io/${{ github.repository }}/indy-node-build
+    outputs:
+      matrix-common: ${{ steps.ctd.outputs.matrix-common }}
+      matrix-node: ${{ steps.ctd.outputs.matrix-node }}
+    steps:
+      - name: Check out code
+        uses: actions/checkout@v2
+
+      - name: Check test decorators
+        id: ctd
+        run: |
+          chmod +x ./scripts/run_pytest_check.sh
+          ./scripts/run_pytest_check.sh
+
+  indy_common:
+    name: Build Indy Common
+    needs: decorator-checks
+    runs-on: ubuntu-18.04
+    container:
+      image: ghcr.io/${{ github.repository }}/indy-node-build
+    strategy:
+      matrix: ${{fromJson(needs.decorator-checks.outputs.matrix-common)}}
+      fail-fast: false
+    steps:
+      - name: Check out code
+        uses: actions/checkout@v2
+
+      - name: Install dependencies
+        run: pip install .[tests]
+        continue-on-error: true
+
+      - name: Run Indy Common tests
+        run: python3 -m pytest -l -m ${{ matrix.module }} -vv --junitxml=test-result-common-${{ matrix.module }}.xml indy_common
+
+      - name: Publish Test Report
+        uses: scacap/action-surefire-report@v1
+        with:
+          check_name: Indy Common ${{ matrix.module }} Test Report
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+          report_paths: test-result-common-${{ matrix.module }}.xml
+
+  indy_node:
+    name: Build Indy Node
+    needs: decorator-checks
+    runs-on: ubuntu-18.04
+    container:
+      image: ghcr.io/${{ github.repository }}/indy-node-build
+    strategy:
+      matrix: ${{fromJson(needs.decorator-checks.outputs.matrix-node)}}
+      fail-fast: false
+    steps:
+      - name: Check out code
+        uses: actions/checkout@v2
+
+      - name: Install dependencies
+        run: pip install .[tests]
+        continue-on-error: true
+
+      - name: Run Indy Node ${{ matrix.module }} tests
+        run: python3 -m pytest -l -m ${{ matrix.module }} -vv --junitxml=test-result-node-${{ matrix.module }}.xml indy_node
+
+      - name: Publish Test Report
+        uses: scacap/action-surefire-report@v1
+        with:
+          check_name: Indy Node ${{ matrix.module }} Test Report
+          github_token: ${{ secrets.GITHUB_TOKEN }}
+          report_paths: test-result-node-${{ matrix.module }}.xml
+
+  lint:
+    name: Lint
+    runs-on: ubuntu-latest
+    container:
+      image: ghcr.io/${{ github.repository }}/indy-node-lint
+    needs:
+      - build-lint-image
+    steps:      
+      - name: Check out code
+        uses: actions/checkout@v2
+
+      - name: flake8
+        run: python3 -m flake8
+          
\ No newline at end of file
diff --git a/.github/workflows/build/Dockerfile b/.github/workflows/build/Dockerfile
new file mode 100644
index 000000000..0a1ce13c6
--- /dev/null
+++ b/.github/workflows/build/Dockerfile
@@ -0,0 +1,17 @@
+FROM hyperledger/indy-core-baseci:0.0.3-master
+LABEL maintainer="Hyperledger <hyperledger-indy@lists.hyperledger.org>"
+
+RUN apt-get update -y && apt-get install -y \
+    python3-nacl \
+    libindy-crypto=0.4.5 \
+    libindy=1.13.0~1420 \
+# rocksdb python wrapper
+    libbz2-dev \
+    zlib1g-dev \
+    liblz4-dev \
+    libsnappy-dev \
+    rocksdb=5.8.8 \
+    ursa=0.3.2-2 \
+    jq
+
+RUN indy_image_clean
diff --git a/.github/workflows/build/README.md b/.github/workflows/build/README.md
new file mode 100644
index 000000000..984f201f2
--- /dev/null
+++ b/.github/workflows/build/README.md
@@ -0,0 +1,3 @@
+# Building the build image
+
+This `Dockerfile` is used as part of the workflow, any changes to it will force the docker image to be rebuilt and that new image will be used to run the downstream workflow.
\ No newline at end of file
diff --git a/.github/workflows/build/indy-core-repo.preferences b/.github/workflows/build/indy-core-repo.preferences
new file mode 100644
index 000000000..f6c625279
--- /dev/null
+++ b/.github/workflows/build/indy-core-repo.preferences
@@ -0,0 +1,3 @@
+Package: /indy-crypto/ /libindy/
+Pin: release l=Indy Main Repository
+Pin-Priority: 1000
diff --git a/.github/workflows/build/scripts/clean.sh b/.github/workflows/build/scripts/clean.sh
new file mode 100755
index 000000000..34a806766
--- /dev/null
+++ b/.github/workflows/build/scripts/clean.sh
@@ -0,0 +1,6 @@
+#!/bin/bash
+set -e
+set -x
+
+apt-get -y autoremove
+rm -rf /var/lib/apt/lists/*
diff --git a/.github/workflows/build/scripts/user.sh b/.github/workflows/build/scripts/user.sh
new file mode 100755
index 000000000..74e044c22
--- /dev/null
+++ b/.github/workflows/build/scripts/user.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+set -e
+set -x
+
+USERID="$1"
+USERNAME="$2"
+
+useradd -ms /bin/bash -u "$USERID" "$USERNAME"
+
+USERHOME=$(eval echo "~$USERNAME")
+VENVPATH="$USERHOME/$3"
+su -c "virtualenv -p python3.5 \"$VENVPATH\"" - "$USERNAME"
+
+# TODO virtualenv activation seems as better approach
+# but it's more tricky (failed to find out how) to automate
+# that for all cases (e.g. non interactive docker run/exec)
+USER_PYTHON=$(su -c "which python" - "$USERNAME")
+USER_PIP=$(su -c "which pip" - "$USERNAME")
+
+ln -sf "${VENVPATH}/bin/python" "$USER_PYTHON"
+ln -sf "${VENVPATH}/bin/pip" "$USER_PIP"
diff --git a/.github/workflows/lint/Dockerfile b/.github/workflows/lint/Dockerfile
new file mode 100644
index 000000000..d1870d403
--- /dev/null
+++ b/.github/workflows/lint/Dockerfile
@@ -0,0 +1,21 @@
+# Development
+FROM ubuntu:18.04
+LABEL maintainer="Kevin Griffin <griffin.kev@gmail.com>"
+
+RUN apt-get update && apt-get dist-upgrade -y
+
+# Install environment
+RUN apt-get install -y \
+	git \
+	wget \
+	python3.5 \
+	python3-pip \
+	python-setuptools \
+	python3-nacl
+
+RUN pip3 install -U \
+	'pip<10.0.0' \
+	setuptools \
+	pep8==1.7.1 \
+	pep8-naming==0.6.1 \
+	flake8==3.5.0
diff --git a/.github/workflows/lint/README.md b/.github/workflows/lint/README.md
new file mode 100644
index 000000000..6b2a83fd0
--- /dev/null
+++ b/.github/workflows/lint/README.md
@@ -0,0 +1,3 @@
+# Building the lint image
+
+This `Dockerfile` is used as part of the workflow, any changes to it will force the docker image to be rebuilt and that new image will be used to run the downstream workflow.
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 6147ec972..ca783e72d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,6 +24,9 @@ var/
 *.egg
 *.eggs
 
+# Needed for GitHub Actions
+!.github/workflows/build
+
 # Installer logs
 pip-log.txt
 pip-delete-this-directory.txt
@@ -72,8 +75,15 @@ include/
 # generated doc files
 docs/source/api_docs/
 
-# hidden files
-.*
+# IntelliJ specific config
+*.idea
+*.iml
+
+#vscode
+.vscode
 
 # Vagrant files
-.vagrant
\ No newline at end of file
+.vagrant
+
+# test output from working with GitHub actions
+test-result-node.xml
\ No newline at end of file
diff --git a/indy_common/test/auth/metadata/test_auth_rule_with_metadata_complex.py b/indy_common/test/auth/metadata/test_auth_rule_with_metadata_complex.py
index 762b8b887..935ecf7fa 100644
--- a/indy_common/test/auth/metadata/test_auth_rule_with_metadata_complex.py
+++ b/indy_common/test/auth/metadata/test_auth_rule_with_metadata_complex.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_common.authorize.auth_constraints import AuthConstraint, IDENTITY_OWNER, AuthConstraintOr, AuthConstraintAnd, \
     AuthConstraintForbidden
 from indy_common.constants import ENDORSER
@@ -7,6 +9,7 @@
 MAX_SIG_COUNT = 3
 
 
+@pytest.mark.auth
 def test_plugin_and_or_rule_same_role_trustee_no_endorser(write_auth_req_validator, write_request_validation,
                                                           signatures, amount):
     validate(
@@ -40,6 +43,7 @@ def test_plugin_and_or_rule_same_role_trustee_no_endorser(write_auth_req_validat
     )
 
 
+@pytest.mark.auth
 def test_plugin_and_or_rule_diff_role_trustee_no_endorser(write_auth_req_validator, write_request_validation,
                                                           signatures, is_owner, amount):
     validate(
@@ -81,6 +85,7 @@ def test_plugin_and_or_rule_diff_role_trustee_no_endorser(write_auth_req_validat
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_and_rule_diff_roles_trustee_no_endorser(write_auth_req_validator, write_request_validation,
                                                            signatures, is_owner, amount):
     validate(
@@ -128,6 +133,7 @@ def test_plugin_or_and_rule_diff_roles_trustee_no_endorser(write_auth_req_valida
     )
 
 
+@pytest.mark.auth
 def test_plugin_complex_trustee_no_endorser(write_auth_req_validator, write_request_validation,
                                             signatures, is_owner, amount):
     validate(
@@ -202,6 +208,7 @@ def test_plugin_complex_trustee_no_endorser(write_auth_req_validator, write_requ
     )
 
 
+@pytest.mark.auth
 def test_plugin_complex_with_and_rule_with_not_allowed(write_auth_req_validator, write_request_validation,
                                                        signatures, is_owner, off_ledger_signature, amount):
     validate(
@@ -219,6 +226,7 @@ def test_plugin_complex_with_and_rule_with_not_allowed(write_auth_req_validator,
     )
 
 
+@pytest.mark.auth
 def test_plugin_complex_with_or_rule_with_not_allowed_trustee_no_endorser(write_auth_req_validator,
                                                                           write_request_validation,
                                                                           signatures, is_owner, off_ledger_signature,
diff --git a/indy_common/test/auth/metadata/test_auth_rule_with_metadata_composite.py b/indy_common/test/auth/metadata/test_auth_rule_with_metadata_composite.py
index 74ec144aa..c00439656 100644
--- a/indy_common/test/auth/metadata/test_auth_rule_with_metadata_composite.py
+++ b/indy_common/test/auth/metadata/test_auth_rule_with_metadata_composite.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_common.authorize.auth_constraints import AuthConstraint, IDENTITY_OWNER, AuthConstraintOr, AuthConstraintAnd
 from indy_common.constants import ENDORSER
 from indy_common.test.auth.metadata.helper import validate, PLUGIN_FIELD, Action
@@ -6,6 +8,7 @@
 MAX_SIG_COUNT = 3
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_all_amount_trustee_no_endorser(write_auth_req_validator, write_request_validation,
                                                        signatures, is_owner, amount):
     validate(
@@ -39,6 +42,7 @@ def test_plugin_or_rule_all_amount_trustee_no_endorser(write_auth_req_validator,
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_one_amount_same_role_endorser_no_endorser(write_auth_req_validator, write_request_validation,
                                                                   signatures, is_owner, amount):
     validate(
@@ -59,6 +63,7 @@ def test_plugin_or_rule_one_amount_same_role_endorser_no_endorser(write_auth_req
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_one_amount_same_role_endorser_endorser(write_auth_req_validator, write_request_validation,
                                                                signatures, is_owner, amount):
     validate(
@@ -79,6 +84,7 @@ def test_plugin_or_rule_one_amount_same_role_endorser_endorser(write_auth_req_va
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_one_amount_same_role_owner_no_endorser(write_auth_req_validator, write_request_validation,
                                                                signatures, is_owner, amount):
     validate(
@@ -95,6 +101,7 @@ def test_plugin_or_rule_one_amount_same_role_owner_no_endorser(write_auth_req_va
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_one_amount_same_role_owner_endorser(write_auth_req_validator, write_request_validation,
                                                             signatures, is_owner, amount):
     validate(
@@ -116,6 +123,7 @@ def test_plugin_or_rule_one_amount_same_role_owner_endorser(write_auth_req_valid
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_one_amount_diff_roles_endorser_no_endorser(write_auth_req_validator, write_request_validation,
                                                                    signatures, is_owner, amount):
     validate(
@@ -140,6 +148,7 @@ def test_plugin_or_rule_one_amount_diff_roles_endorser_no_endorser(write_auth_re
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_one_amount_diff_roles_owner_no_endorser(write_auth_req_validator, write_request_validation,
                                                                 signatures, is_owner, amount):
     validate(
@@ -158,6 +167,7 @@ def test_plugin_or_rule_one_amount_diff_roles_owner_no_endorser(write_auth_req_v
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_one_amount_diff_roles_owner_endorser(write_auth_req_validator, write_request_validation,
                                                              signatures, is_owner, amount):
     validate(
@@ -183,6 +193,7 @@ def test_plugin_or_rule_one_amount_diff_roles_owner_endorser(write_auth_req_vali
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_one_amount_all_roles_endorser_no_endorser(write_auth_req_validator, write_request_validation,
                                                                   signatures, is_owner, amount, off_ledger_signature):
     validate(
@@ -205,6 +216,7 @@ def test_plugin_or_rule_one_amount_all_roles_endorser_no_endorser(write_auth_req
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_one_amount_all_roles_owner_no_endorser(write_auth_req_validator, write_request_validation,
                                                                signatures, is_owner, amount, off_ledger_signature):
     validate(
@@ -224,6 +236,7 @@ def test_plugin_or_rule_one_amount_all_roles_owner_no_endorser(write_auth_req_va
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_one_amount_all_roles_owner_endorser(write_auth_req_validator, write_request_validation,
                                                             signatures, is_owner, amount, off_ledger_signature):
     validate(
@@ -249,6 +262,7 @@ def test_plugin_or_rule_one_amount_all_roles_owner_endorser(write_auth_req_valid
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_diff_amount_same_role_endorser_no_endorser(write_auth_req_validator, write_request_validation,
                                                                    signatures, is_owner, amount):
     validate(
@@ -275,6 +289,7 @@ def test_plugin_or_rule_diff_amount_same_role_endorser_no_endorser(write_auth_re
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_diff_amount_same_role_owner_no_endorser(write_auth_req_validator, write_request_validation,
                                                                 signatures, is_owner, amount):
     validate(
@@ -292,6 +307,7 @@ def test_plugin_or_rule_diff_amount_same_role_owner_no_endorser(write_auth_req_v
     )
 
 
+@pytest.mark.auth
 def test_plugin_or_rule_diff_amount_same_role_owner_endorser(write_auth_req_validator, write_request_validation,
                                                              signatures, is_owner, amount):
     validate(
@@ -317,6 +333,7 @@ def test_plugin_or_rule_diff_amount_same_role_owner_endorser(write_auth_req_vali
     )
 
 
+@pytest.mark.auth
 def test_plugin_and_rule_trustee_no_endorser(write_auth_req_validator, write_request_validation,
                                              signatures, is_owner, amount):
     validate(
diff --git a/indy_common/test/auth/metadata/test_auth_rule_with_metadata_simple.py b/indy_common/test/auth/metadata/test_auth_rule_with_metadata_simple.py
index 1bfce1714..4d33f86a7 100644
--- a/indy_common/test/auth/metadata/test_auth_rule_with_metadata_simple.py
+++ b/indy_common/test/auth/metadata/test_auth_rule_with_metadata_simple.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_common.authorize.auth_constraints import AuthConstraint, IDENTITY_OWNER, AuthConstraintForbidden
 from indy_common.constants import ENDORSER
 from indy_common.test.auth.metadata.helper import validate, PLUGIN_FIELD, Action
@@ -6,6 +8,7 @@
 MAX_SIG_COUNT = 3
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_1_sig_owner_no_endorser(write_auth_req_validator, write_request_validation,
                                                     signatures, is_owner, amount):
     validate(
@@ -23,6 +26,7 @@ def test_plugin_simple_rule_1_sig_owner_no_endorser(write_auth_req_validator, wr
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_1_sig_owner_endorser(write_auth_req_validator, write_request_validation,
                                                  signatures, is_owner, amount):
     validate(
@@ -41,6 +45,7 @@ def test_plugin_simple_rule_1_sig_owner_endorser(write_auth_req_validator, write
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_1_sig_endorser_no_endorser(write_auth_req_validator, write_request_validation,
                                                        signatures, is_owner, amount):
     validate(
@@ -58,6 +63,7 @@ def test_plugin_simple_rule_1_sig_endorser_no_endorser(write_auth_req_validator,
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_1_sig_endorser_endorser(write_auth_req_validator, write_request_validation,
                                                     signatures, is_owner, amount):
     validate(
@@ -75,6 +81,7 @@ def test_plugin_simple_rule_1_sig_endorser_endorser(write_auth_req_validator, wr
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_1_sig_trustee_no_endorser(write_auth_req_validator, write_request_validation,
                                                       signatures, is_owner, amount):
     validate(
@@ -93,6 +100,7 @@ def test_plugin_simple_rule_1_sig_trustee_no_endorser(write_auth_req_validator,
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_1_sig_trustee_endorser(write_auth_req_validator, write_request_validation,
                                                    signatures, is_owner, amount):
     validate(
@@ -112,6 +120,7 @@ def test_plugin_simple_rule_1_sig_trustee_endorser(write_auth_req_validator, wri
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_1_sig_all_roles_owner_no_endorser(write_auth_req_validator, write_request_validation,
                                                               signatures, is_owner, off_ledger_signature, amount):
     validate(
@@ -130,6 +139,7 @@ def test_plugin_simple_rule_1_sig_all_roles_owner_no_endorser(write_auth_req_val
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_1_sig_all_roles_owner_endorser(write_auth_req_validator, write_request_validation,
                                                            signatures, is_owner, off_ledger_signature, amount):
     validate(
@@ -149,6 +159,7 @@ def test_plugin_simple_rule_1_sig_all_roles_owner_endorser(write_auth_req_valida
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_1_sig_all_roles_trustee_no_endorser(write_auth_req_validator, write_request_validation,
                                                                 signatures, is_owner, off_ledger_signature, amount):
     validate(
@@ -167,6 +178,7 @@ def test_plugin_simple_rule_1_sig_all_roles_trustee_no_endorser(write_auth_req_v
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_1_sig_all_roles_trustee_endorser(write_auth_req_validator, write_request_validation,
                                                              signatures, is_owner, off_ledger_signature, amount):
     validate(
@@ -186,6 +198,7 @@ def test_plugin_simple_rule_1_sig_all_roles_trustee_endorser(write_auth_req_vali
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_3_sig_trustee_no_endorser(write_auth_req_validator, write_request_validation,
                                                       signatures, is_owner, amount):
     validate(
@@ -202,6 +215,7 @@ def test_plugin_simple_rule_3_sig_trustee_no_endorser(write_auth_req_validator,
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_3_sig_trustee_endorser(write_auth_req_validator, write_request_validation,
                                                    signatures, is_owner, amount):
     validate(
@@ -220,6 +234,7 @@ def test_plugin_simple_rule_3_sig_trustee_endorser(write_auth_req_validator, wri
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_3_sig_owner_no_endorser(write_auth_req_validator, write_request_validation,
                                                     signatures, is_owner, amount):
     validate(
@@ -233,6 +248,7 @@ def test_plugin_simple_rule_3_sig_owner_no_endorser(write_auth_req_validator, wr
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_3_sig_owner_endorser(write_auth_req_validator, write_request_validation,
                                                  signatures, is_owner, amount):
     validate(
@@ -252,6 +268,7 @@ def test_plugin_simple_rule_3_sig_owner_endorser(write_auth_req_validator, write
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_0_sig_owner_no_endorser(write_auth_req_validator, write_request_validation,
                                                     signatures, is_owner, off_ledger_signature, amount):
     validate(
@@ -272,6 +289,7 @@ def test_plugin_simple_rule_0_sig_owner_no_endorser(write_auth_req_validator, wr
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_0_sig_owner_endorser(write_auth_req_validator, write_request_validation,
                                                  signatures, is_owner, off_ledger_signature, amount):
     validate(
@@ -289,6 +307,7 @@ def test_plugin_simple_rule_0_sig_owner_endorser(write_auth_req_validator, write
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_0_sig_trustee_no_endorser(write_auth_req_validator, write_request_validation,
                                                       signatures, is_owner, off_ledger_signature, amount):
     validate(
@@ -306,6 +325,7 @@ def test_plugin_simple_rule_0_sig_trustee_no_endorser(write_auth_req_validator,
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_0_sig_trustee_endorser(write_auth_req_validator, write_request_validation,
                                                    signatures, is_owner, off_ledger_signature, amount):
     validate(
@@ -323,6 +343,7 @@ def test_plugin_simple_rule_0_sig_trustee_endorser(write_auth_req_validator, wri
     )
 
 
+@pytest.mark.auth
 def test_plugin_simple_rule_not_allowed(write_auth_req_validator, write_request_validation,
                                         author, endorser, signatures, is_owner, amount):
     validate(
diff --git a/indy_common/test/auth/metadata/test_error_messages.py b/indy_common/test/auth/metadata/test_error_messages.py
index 26af15ef9..baf09c051 100644
--- a/indy_common/test/auth/metadata/test_error_messages.py
+++ b/indy_common/test/auth/metadata/test_error_messages.py
@@ -11,6 +11,7 @@
 MAX_SIG_COUNT = 3
 
 
+@pytest.mark.auth
 def test_plugin_simple_error_msg_no_plugin_field(write_auth_req_validator):
     set_auth_constraint(write_auth_req_validator,
                         AuthConstraint(role=IDENTITY_OWNER, sig_count=1, need_to_be_owner=True,
@@ -26,6 +27,7 @@ def test_plugin_simple_error_msg_no_plugin_field(write_auth_req_validator):
     assert ("missing required plugin field") in str(excinfo.value)
 
 
+@pytest.mark.auth
 def test_plugin_simple_error_msg_extra_plugin_field(write_auth_req_validator):
     set_auth_constraint(write_auth_req_validator,
                         AuthConstraint(role=IDENTITY_OWNER, sig_count=1, need_to_be_owner=True))
@@ -40,6 +42,7 @@ def test_plugin_simple_error_msg_extra_plugin_field(write_auth_req_validator):
     assert ("plugin field must be absent") in str(excinfo.value)
 
 
+@pytest.mark.auth
 def test_plugin_simple_error_msg_not_enough_amount(write_auth_req_validator):
     set_auth_constraint(write_auth_req_validator,
                         AuthConstraint(role=IDENTITY_OWNER, sig_count=1, need_to_be_owner=True,
@@ -55,6 +58,7 @@ def test_plugin_simple_error_msg_not_enough_amount(write_auth_req_validator):
     assert ("not enough amount in plugin field") in str(excinfo.value)
 
 
+@pytest.mark.auth
 def test_plugin_or_error_msg_not_enough_amount(write_auth_req_validator):
     set_auth_constraint(write_auth_req_validator,
                         AuthConstraintOr(auth_constraints=[
@@ -80,6 +84,7 @@ def test_plugin_or_error_msg_not_enough_amount(write_auth_req_validator):
     assert expected in str(excinfo.value.reason)
 
 
+@pytest.mark.auth
 def test_plugin_or_error_msg_not_enough_amount_multiple_metadata_fields(write_auth_req_validator):
     set_auth_constraint(write_auth_req_validator,
                         AuthConstraintOr(auth_constraints=[
diff --git a/indy_common/test/auth/multi_sig/test_auth_multi_sig_for_1_owner.py b/indy_common/test/auth/multi_sig/test_auth_multi_sig_for_1_owner.py
index 6bdac648e..4b820feb5 100644
--- a/indy_common/test/auth/multi_sig/test_auth_multi_sig_for_1_owner.py
+++ b/indy_common/test/auth/multi_sig/test_auth_multi_sig_for_1_owner.py
@@ -9,12 +9,14 @@ def write_auth_req_validator(write_auth_req_validator, key):
     return write_auth_req_validator
 
 
+@pytest.mark.auth
 def test_claim_def_adding_success_1_owner(write_request_validation, req,
                                           identity_owners, key):
     req.signatures = {identity_owners[0]: "signature"}
     assert write_request_validation(req, [key])
 
 
+@pytest.mark.auth
 def test_claim_def_adding_success_2_owner(write_request_validation, req,
                                           identity_owners, endorsers, key):
     req.signatures = {idr: "signature" for idr in identity_owners[:2]}
@@ -24,6 +26,7 @@ def test_claim_def_adding_success_2_owner(write_request_validation, req,
     assert write_request_validation(req, [key])
 
 
+@pytest.mark.auth
 def test_claim_def_adding_fail_1_trustee(write_request_validation, req,
                                          trustees, key):
     req.signatures = {trustees[0]: "signature"}
diff --git a/indy_common/test/auth/multi_sig/test_auth_multi_sig_for_5_owners.py b/indy_common/test/auth/multi_sig/test_auth_multi_sig_for_5_owners.py
index 9598e4755..fb616575d 100644
--- a/indy_common/test/auth/multi_sig/test_auth_multi_sig_for_5_owners.py
+++ b/indy_common/test/auth/multi_sig/test_auth_multi_sig_for_5_owners.py
@@ -9,6 +9,7 @@ def write_auth_req_validator(write_auth_req_validator, key):
     return write_auth_req_validator
 
 
+@pytest.mark.auth
 def test_claim_def_adding_success_5_owners(write_request_validation, req,
                                            identity_owners, endorsers, key, write_auth_req_validator):
     req.signatures = {idr: "signature" for idr in identity_owners}
@@ -18,12 +19,14 @@ def test_claim_def_adding_success_5_owners(write_request_validation, req,
     assert write_request_validation(req, [key])
 
 
+@pytest.mark.auth
 def test_claim_def_adding_fail_4_owners(write_request_validation, req,
                                         identity_owners, key):
     req.signatures = {idr: "signature" for idr in identity_owners[:4]}
     assert not write_request_validation(req, [key])
 
 
+@pytest.mark.auth
 def test_claim_def_adding_fail_1_owner_4_unknown(write_request_validation, req,
                                                  identity_owners, key):
     req.signatures = {identity_owners[0]: "signature"}
@@ -35,6 +38,7 @@ def test_claim_def_adding_fail_1_owner_4_unknown(write_request_validation, req,
     assert not write_request_validation(req, [key])
 
 
+@pytest.mark.auth
 def test_claim_def_adding_fail_5_trustees(write_request_validation, req,
                                           trustees, key):
     req.signatures = {idr: "signature" for idr in trustees}
diff --git a/indy_common/test/auth/test_auth_actions.py b/indy_common/test/auth/test_auth_actions.py
index f0a91f998..dbb166a90 100644
--- a/indy_common/test/auth/test_auth_actions.py
+++ b/indy_common/test/auth/test_auth_actions.py
@@ -1,6 +1,9 @@
+import pytest
+
 from indy_common.authorize.auth_actions import compile_action_id, ADD_PREFIX, EDIT_PREFIX, split_action_id, ActionDef
 
 
+@pytest.mark.auth
 def test_get_action_id_action_add(action_add):
     assert action_add.get_action_id() == compile_action_id(txn_type='SomeType',
                                                            field='some_field',
@@ -9,6 +12,7 @@ def test_get_action_id_action_add(action_add):
                                                            prefix=ADD_PREFIX)
 
 
+@pytest.mark.auth
 def test_get_action_id_action_edit(action_edit):
     assert action_edit.get_action_id() == compile_action_id(txn_type='SomeType',
                                                             field='some_field',
@@ -17,6 +21,7 @@ def test_get_action_id_action_edit(action_edit):
                                                             prefix=EDIT_PREFIX)
 
 
+@pytest.mark.auth
 def test_split_action_id():
     origin = ActionDef('SomeType', 'PREFIX', 'some_field', 'old_value', 'new_value')
     splitted_action = split_action_id(compile_action_id(txn_type='SomeType',
diff --git a/indy_common/test/auth/test_auth_anyone.py b/indy_common/test/auth/test_auth_anyone.py
index 779d288c4..e327f7941 100644
--- a/indy_common/test/auth/test_auth_anyone.py
+++ b/indy_common/test/auth/test_auth_anyone.py
@@ -17,6 +17,7 @@ def write_auth_req_validator(write_auth_req_validator):
     return write_auth_req_validator
 
 
+@pytest.mark.auth
 def test_auth_request_without_signatures(write_request_validation):
     req = Request(identifier="UnknownIdr",
                   operation={})
diff --git a/indy_common/test/auth/test_auth_claim_def_with_new_auth_map.py b/indy_common/test/auth/test_auth_claim_def_with_new_auth_map.py
index 0650cc8ac..2ae0b79ab 100644
--- a/indy_common/test/auth/test_auth_claim_def_with_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_claim_def_with_new_auth_map.py
@@ -1,8 +1,11 @@
+import pytest
+
 from indy_common.authorize.auth_actions import AuthActionAdd, AuthActionEdit
 
 from indy_common.constants import CLAIM_DEF
 
 
+@pytest.mark.auth
 def test_claim_def_adding(write_request_validation, req, is_owner):
     authorized = req.identifier in ("trustee_identifier", "steward_identifier", "endorser_identifier")
     assert authorized == write_request_validation(req,
@@ -12,6 +15,7 @@ def test_claim_def_adding(write_request_validation, req, is_owner):
                                                                  is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_claim_def_editing(write_request_validation, req, is_owner):
     authorized = is_owner
     assert authorized == write_request_validation(req,
diff --git a/indy_common/test/auth/test_auth_constraint.py b/indy_common/test/auth/test_auth_constraint.py
index fd6828d9b..4a74f3929 100644
--- a/indy_common/test/auth/test_auth_constraint.py
+++ b/indy_common/test/auth/test_auth_constraint.py
@@ -9,6 +9,7 @@
 from plenum.common.constants import TRUSTEE, STEWARD
 
 
+@pytest.mark.auth
 def test_str_any_7_off_ledger_sig():
     constraint = AuthConstraint(role='*',
                                 sig_count=7,
@@ -16,6 +17,7 @@ def test_str_any_7_off_ledger_sig():
     assert str(constraint) == '7 signatures of any role (off-ledger included) are required'
 
 
+@pytest.mark.auth
 def test_str_any_1_off_ledger_sig():
     constraint = AuthConstraint(role='*',
                                 sig_count=1,
@@ -23,6 +25,7 @@ def test_str_any_1_off_ledger_sig():
     assert str(constraint) == '1 signature of any role (off-ledger included) is required'
 
 
+@pytest.mark.auth
 def test_str_not_any_7_sig_owner():
     constraint = AuthConstraint(role=TRUSTEE,
                                 sig_count=7,
@@ -30,6 +33,7 @@ def test_str_not_any_7_sig_owner():
     assert str(constraint) == '7 TRUSTEE signatures are required and needs to be owner'
 
 
+@pytest.mark.auth
 def test_str_not_any_7_sig_not_owner():
     constraint = AuthConstraint(role=TRUSTEE,
                                 sig_count=7,
@@ -37,6 +41,7 @@ def test_str_not_any_7_sig_not_owner():
     assert str(constraint) == '7 TRUSTEE signatures are required'
 
 
+@pytest.mark.auth
 def test_str_not_any_1_sig_not_owner():
     constraint = AuthConstraint(role=TRUSTEE,
                                 sig_count=1,
@@ -44,6 +49,7 @@ def test_str_not_any_1_sig_not_owner():
     assert str(constraint) == '1 TRUSTEE signature is required'
 
 
+@pytest.mark.auth
 def test_str_not_any_1_sig_owner():
     constraint = AuthConstraint(role=TRUSTEE,
                                 sig_count=1,
@@ -51,6 +57,7 @@ def test_str_not_any_1_sig_owner():
     assert str(constraint) == '1 TRUSTEE signature is required and needs to be owner'
 
 
+@pytest.mark.auth
 def test_str_any_1_sig_owner():
     constraint = AuthConstraint(role="*",
                                 sig_count=1,
@@ -58,6 +65,7 @@ def test_str_any_1_sig_owner():
     assert str(constraint) == '1 signature of any role is required and needs to be owner'
 
 
+@pytest.mark.auth
 def test_str_any_1_sig_not_owner():
     constraint = AuthConstraint(role='*',
                                 sig_count=1,
@@ -65,6 +73,7 @@ def test_str_any_1_sig_not_owner():
     assert str(constraint) == '1 signature of any role is required'
 
 
+@pytest.mark.auth
 def test_str_any_several_sig_not_owner():
     constraint = AuthConstraint(role='*',
                                 sig_count=7,
@@ -72,6 +81,7 @@ def test_str_any_several_sig_not_owner():
     assert str(constraint) == '7 signatures of any role are required'
 
 
+@pytest.mark.auth
 def test_str_any_several_sig_owner():
     constraint = AuthConstraint(role='*',
                                 sig_count=7,
@@ -79,6 +89,7 @@ def test_str_any_several_sig_owner():
     assert str(constraint) == '7 signatures of any role are required and needs to be owner'
 
 
+@pytest.mark.auth
 def test_str_for_auth_constraint_or():
     constraint = AuthConstraintOr([AuthConstraint(role=TRUSTEE,
                                                   sig_count=1,
@@ -91,6 +102,7 @@ def test_str_for_auth_constraint_or():
                               '1 STEWARD signature is required and needs to be owner'
 
 
+@pytest.mark.auth
 def test_str_for_auth_constraint_and():
     constraint = AuthConstraintAnd([AuthConstraint(role=TRUSTEE,
                                                    sig_count=1,
@@ -103,6 +115,7 @@ def test_str_for_auth_constraint_and():
                               '1 STEWARD signature is required and needs to be owner'
 
 
+@pytest.mark.auth
 def test_str_for_auth_constraint_forbidden():
     constraint = AuthConstraintForbidden()
     assert str(constraint) == 'The action is forbidden'
@@ -122,6 +135,7 @@ def constraints():
     return role_constraints[0], and_constraint, or_constraint, forbidden_constraint
 
 
+@pytest.mark.auth
 def test_check_equal(constraints):
     same_role, same_and, same_or, same_forbidden = constraints
     """
@@ -147,6 +161,7 @@ def test_check_equal(constraints):
     assert same_forbidden == forbidden_constraint
 
 
+@pytest.mark.auth
 def test_constraint_serialization(constraints):
     constraint_serializer = ConstraintsSerializer(domain_state_serializer)
     for constraint in constraints:
@@ -198,6 +213,7 @@ def constraints_as_dict():
 #     constraint_serializer.deserialize(b"some_string")
 
 
+@pytest.mark.auth
 def test_constraint_creator(constraints_as_dict,
                             constraints):
     from_creator = [ConstraintCreator.create_constraint(c) for c in constraints_as_dict]
diff --git a/indy_common/test/auth/test_auth_for_auth_rule_new_auth_map.py b/indy_common/test/auth/test_auth_for_auth_rule_new_auth_map.py
index 82291d51c..9b8854dca 100644
--- a/indy_common/test/auth/test_auth_for_auth_rule_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_for_auth_rule_new_auth_map.py
@@ -1,7 +1,10 @@
+import pytest
+
 from indy_common.authorize.auth_actions import AuthActionEdit
 from indy_common.constants import POOL_CONFIG, ACTION, AUTH_RULE
 
 
+@pytest.mark.auth
 def test_auth_rule(write_request_validation, is_owner, req):
     authorized = req.identifier == "trustee_identifier"
     assert authorized == write_request_validation(req,
diff --git a/indy_common/test/auth/test_auth_node_with_new_auth_map.py b/indy_common/test/auth/test_auth_node_with_new_auth_map.py
index e9148a243..b59d840a5 100644
--- a/indy_common/test/auth/test_auth_node_with_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_node_with_new_auth_map.py
@@ -1,8 +1,11 @@
+import pytest
+
 from indy_common.authorize.auth_actions import AuthActionEdit, AuthActionAdd
 from plenum.common.constants import SERVICES, NODE, NODE_IP, NODE_PORT, CLIENT_PORT, \
     CLIENT_IP, BLS_KEY, ALIAS
 
 
+@pytest.mark.auth
 def test_node_enable(write_request_validation, req, is_owner):
     authorized = (req.identifier == "steward_identifier" and is_owner)
     assert authorized == write_request_validation(req,
@@ -12,6 +15,7 @@ def test_node_enable(write_request_validation, req, is_owner):
                                                                  is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_node_enable_with_empty_services(write_request_validation, req, is_owner):
     authorized = (req.identifier == "steward_identifier" and is_owner)
     assert authorized == write_request_validation(req,
@@ -21,6 +25,7 @@ def test_node_enable_with_empty_services(write_request_validation, req, is_owner
                                                                  is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_node_promote(write_request_validation, req, is_owner):
     authorized = (req.identifier == "steward_identifier" and is_owner) or (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -31,6 +36,7 @@ def test_node_promote(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_node_demote(write_request_validation, req, is_owner):
     authorized = (req.identifier == "steward_identifier" and is_owner) or (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -41,6 +47,7 @@ def test_node_demote(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_node_wrong_old_service_name(write_request_validation, req, is_owner):
     assert not write_request_validation(req,
                                         [AuthActionEdit(txn_type=NODE,
@@ -50,6 +57,7 @@ def test_node_wrong_old_service_name(write_request_validation, req, is_owner):
                                                         is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_node_wrong_new_service_name(write_request_validation, req, is_owner):
     assert not write_request_validation(req,
                                         [AuthActionEdit(txn_type=NODE,
@@ -59,6 +67,7 @@ def test_node_wrong_new_service_name(write_request_validation, req, is_owner):
                                                         is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_node_change_node_ip(write_request_validation, req, is_owner):
     authorized = (req.identifier == "steward_identifier" and is_owner)
     assert authorized == write_request_validation(req,
@@ -69,6 +78,7 @@ def test_node_change_node_ip(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_node_change_node_port(write_request_validation, req, is_owner):
     authorized = (req.identifier == "steward_identifier" and is_owner)
     assert authorized == write_request_validation(req,
@@ -79,6 +89,7 @@ def test_node_change_node_port(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_node_change_client_ip(write_request_validation, req, is_owner):
     authorized = (req.identifier == "steward_identifier" and is_owner)
     assert authorized == write_request_validation(req,
@@ -89,6 +100,7 @@ def test_node_change_client_ip(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_node_change_client_port(write_request_validation, req, is_owner):
     authorized = (req.identifier == "steward_identifier" and is_owner)
     assert authorized == write_request_validation(req,
@@ -99,6 +111,7 @@ def test_node_change_client_port(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_node_change_bls_keys(write_request_validation, req, is_owner):
     authorized = (req.identifier == "steward_identifier" and is_owner)
     assert authorized == write_request_validation(req,
@@ -109,6 +122,7 @@ def test_node_change_bls_keys(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_node_change_alias(write_request_validation, req, is_owner):
     authorized = False  # alias can not be changed
     assert authorized == write_request_validation(req,
diff --git a/indy_common/test/auth/test_auth_nym_with_new_auth_map.py b/indy_common/test/auth/test_auth_nym_with_new_auth_map.py
index 3e10c7319..352b14934 100644
--- a/indy_common/test/auth/test_auth_nym_with_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_nym_with_new_auth_map.py
@@ -10,6 +10,7 @@ def is_owner(request):
     return request.param
 
 
+@pytest.mark.auth
 def test_make_trustee(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -19,6 +20,7 @@ def test_make_trustee(write_request_validation, req, is_owner):
                                                                  is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_make_steward(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -28,6 +30,7 @@ def test_make_steward(write_request_validation, req, is_owner):
                                                                  is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_make_endorser(write_request_validation, req, is_owner):
     authorized = req.identifier in ("trustee_identifier", "steward_identifier")
     assert authorized == write_request_validation(req,
@@ -37,6 +40,7 @@ def test_make_endorser(write_request_validation, req, is_owner):
                                                                  is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_make_network_monitor(write_request_validation, req, is_owner):
     authorized = req.identifier in ("trustee_identifier", "steward_identifier")
     assert authorized == write_request_validation(req,
@@ -47,6 +51,8 @@ def test_make_network_monitor(write_request_validation, req, is_owner):
 
 
 # Trustee tests
+
+@pytest.mark.auth
 def test_change_trustee_to_trustee(write_request_validation, req, is_owner):
     authorized = is_owner
     assert authorized == write_request_validation(req,
@@ -57,6 +63,7 @@ def test_change_trustee_to_trustee(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_trustee_to_steward(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -67,6 +74,7 @@ def test_change_trustee_to_steward(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_trustee_to_endorser(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -77,6 +85,7 @@ def test_change_trustee_to_endorser(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_trustee_to_network_monitor(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -87,6 +96,7 @@ def test_change_trustee_to_network_monitor(write_request_validation, req, is_own
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_trustee_to_identity_owner(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -98,6 +108,8 @@ def test_change_trustee_to_identity_owner(write_request_validation, req, is_owne
 
 
 # Steward tests
+
+@pytest.mark.auth
 def test_change_steward_to_trustee(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -108,6 +120,7 @@ def test_change_steward_to_trustee(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_steward_to_steward(write_request_validation, req, is_owner):
     authorized = is_owner
     assert authorized == write_request_validation(req,
@@ -118,6 +131,7 @@ def test_change_steward_to_steward(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_steward_to_endorser(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -128,6 +142,7 @@ def test_change_steward_to_endorser(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_steward_to_network_monitor(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -138,6 +153,7 @@ def test_change_steward_to_network_monitor(write_request_validation, req, is_own
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_steward_to_identity_owner(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -149,6 +165,8 @@ def test_change_steward_to_identity_owner(write_request_validation, req, is_owne
 
 
 # Endorser tests
+
+@pytest.mark.auth
 def test_change_endorser_to_trustee(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -159,6 +177,7 @@ def test_change_endorser_to_trustee(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_endorser_to_steward(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -169,6 +188,7 @@ def test_change_endorser_to_steward(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_endorser_to_endorser(write_request_validation, req, is_owner):
     authorized = is_owner
     assert authorized == write_request_validation(req,
@@ -179,6 +199,7 @@ def test_change_endorser_to_endorser(write_request_validation, req, is_owner):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_endorser_to_network_monitor(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -189,6 +210,7 @@ def test_change_endorser_to_network_monitor(write_request_validation, req, is_ow
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_endorser_to_identity_owner(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -200,6 +222,8 @@ def test_change_endorser_to_identity_owner(write_request_validation, req, is_own
 
 
 # Network Monitor tests
+
+@pytest.mark.auth
 def test_change_network_monitor_to_trustee(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -210,6 +234,7 @@ def test_change_network_monitor_to_trustee(write_request_validation, req, is_own
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_network_monitor_to_steward(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -220,6 +245,7 @@ def test_change_network_monitor_to_steward(write_request_validation, req, is_own
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_network_monitor_to_endorser(write_request_validation, req, is_owner):
     authorized = req.identifier in ("trustee_identifier", "steward_identifier")
     assert authorized == write_request_validation(req,
@@ -230,6 +256,7 @@ def test_change_network_monitor_to_endorser(write_request_validation, req, is_ow
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_network_monitor_to_network_monitor(write_request_validation, req, is_owner):
     authorized = is_owner
     assert authorized == write_request_validation(req,
@@ -240,6 +267,7 @@ def test_change_network_monitor_to_network_monitor(write_request_validation, req
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_network_monitor_to_identity_owner(write_request_validation, req, is_owner):
     authorized = req.identifier in ("trustee_identifier", "steward_identifier")
     assert authorized == write_request_validation(req,
@@ -251,6 +279,8 @@ def test_change_network_monitor_to_identity_owner(write_request_validation, req,
 
 
 # Identity Owner tests
+
+@pytest.mark.auth
 def test_change_identity_owner_to_trustee(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -261,6 +291,7 @@ def test_change_identity_owner_to_trustee(write_request_validation, req, is_owne
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_identity_owner_to_steward(write_request_validation, req, is_owner):
     authorized = (req.identifier == "trustee_identifier")
     assert authorized == write_request_validation(req,
@@ -271,6 +302,7 @@ def test_change_identity_owner_to_steward(write_request_validation, req, is_owne
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_identity_owner_to_endorser(write_request_validation, req, is_owner):
     authorized = req.identifier in ("trustee_identifier", "steward_identifier")
     assert authorized == write_request_validation(req,
@@ -281,6 +313,7 @@ def test_change_identity_owner_to_endorser(write_request_validation, req, is_own
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_identity_owner_to_network_monitor(write_request_validation, req, is_owner):
     authorized = req.identifier in ("trustee_identifier", "steward_identifier")
     assert authorized == write_request_validation(req,
@@ -291,6 +324,7 @@ def test_change_identity_owner_to_network_monitor(write_request_validation, req,
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_identity_owner_to_identity_owner(write_request_validation, req, is_owner):
     authorized = is_owner
     assert authorized == write_request_validation(req,
@@ -301,6 +335,7 @@ def test_change_identity_owner_to_identity_owner(write_request_validation, req,
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_change_verkey(write_request_validation, req, is_owner):
     authorized = is_owner
     assert authorized == write_request_validation(req,
diff --git a/indy_common/test/auth/test_auth_pool_config_new_auth_map.py b/indy_common/test/auth/test_auth_pool_config_new_auth_map.py
index 805eca08a..c6e7cd333 100644
--- a/indy_common/test/auth/test_auth_pool_config_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_pool_config_new_auth_map.py
@@ -1,7 +1,10 @@
+import pytest
+
 from indy_common.authorize.auth_actions import AuthActionEdit
 from indy_common.constants import POOL_CONFIG, ACTION
 
 
+@pytest.mark.auth
 def test_pool_config_change(write_request_validation, is_owner, req):
     authorized = req.identifier == "trustee_identifier"
     assert authorized == write_request_validation(req,
diff --git a/indy_common/test/auth/test_auth_pool_restart_with_new_auth_map.py b/indy_common/test/auth/test_auth_pool_restart_with_new_auth_map.py
index e92a56c8d..b574377aa 100644
--- a/indy_common/test/auth/test_auth_pool_restart_with_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_pool_restart_with_new_auth_map.py
@@ -1,7 +1,10 @@
+import pytest
+
 from indy_common.authorize.auth_actions import AuthActionAdd
 from indy_common.constants import ACTION, POOL_RESTART
 
 
+@pytest.mark.auth
 def test_pool_restart_add_action(write_request_validation, is_owner, req):
     authorized = req.identifier == "trustee_identifier"
     assert authorized == write_request_validation(req,
diff --git a/indy_common/test/auth/test_auth_pool_upgrade_with_new_auth_map.py b/indy_common/test/auth/test_auth_pool_upgrade_with_new_auth_map.py
index f1ebc57dd..a81731dbd 100644
--- a/indy_common/test/auth/test_auth_pool_upgrade_with_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_pool_upgrade_with_new_auth_map.py
@@ -1,7 +1,10 @@
+import pytest
+
 from indy_common.authorize.auth_actions import AuthActionAdd, AuthActionEdit
 from indy_common.constants import POOL_UPGRADE, ACTION
 
 
+@pytest.mark.auth
 def test_pool_upgrade_start(write_request_validation, is_owner, req):
     authorized = req.identifier == "trustee_identifier"
     assert authorized == write_request_validation(req,
@@ -11,6 +14,7 @@ def test_pool_upgrade_start(write_request_validation, is_owner, req):
                                                                  is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_pool_upgrade_cancel(write_request_validation, is_owner, req):
     authorized = req.identifier == "trustee_identifier"
     assert authorized == write_request_validation(req,
@@ -21,6 +25,7 @@ def test_pool_upgrade_cancel(write_request_validation, is_owner, req):
                                                                   is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_pool_upgrade_cancel_wrong_new_value(write_request_validation, is_owner, req):
     assert not write_request_validation(req,
                                         [AuthActionEdit(txn_type=POOL_UPGRADE,
@@ -30,6 +35,7 @@ def test_pool_upgrade_cancel_wrong_new_value(write_request_validation, is_owner,
                                                         is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_pool_upgrade_cancel_wrong_old_value(write_request_validation, is_owner, req):
     assert not write_request_validation(req,
                                         [AuthActionEdit(txn_type=POOL_UPGRADE,
diff --git a/indy_common/test/auth/test_auth_rev_reg_def_with_new_auth_map.py b/indy_common/test/auth/test_auth_rev_reg_def_with_new_auth_map.py
index 1171af821..ae7621e43 100644
--- a/indy_common/test/auth/test_auth_rev_reg_def_with_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_rev_reg_def_with_new_auth_map.py
@@ -1,7 +1,10 @@
+import pytest
+
 from indy_common.authorize.auth_actions import AuthActionAdd, AuthActionEdit
 from indy_common.constants import REVOC_REG_DEF
 
 
+@pytest.mark.auth
 def test_rev_reg_def_adding(write_request_validation, req, is_owner):
     authorized = req.identifier in ("trustee_identifier", "steward_identifier", "endorser_identifier")
     assert authorized == write_request_validation(req,
@@ -11,6 +14,7 @@ def test_rev_reg_def_adding(write_request_validation, req, is_owner):
                                                                  is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_rev_reg_def_editing(write_request_validation, req, is_owner):
     authorized = is_owner
     assert authorized == write_request_validation(req,
diff --git a/indy_common/test/auth/test_auth_rich_schema_objects_with_new_auth_map.py b/indy_common/test/auth/test_auth_rich_schema_objects_with_new_auth_map.py
index e83689417..83c604b3a 100644
--- a/indy_common/test/auth/test_auth_rich_schema_objects_with_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_rich_schema_objects_with_new_auth_map.py
@@ -5,6 +5,7 @@
     RICH_SCHEMA_MAPPING, RICH_SCHEMA_CRED_DEF, RICH_SCHEMA_PRES_DEF
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('txn_type',
                          [JSON_LD_CONTEXT, RICH_SCHEMA, RICH_SCHEMA_ENCODING, RICH_SCHEMA_MAPPING,
                           RICH_SCHEMA_CRED_DEF, RICH_SCHEMA_PRES_DEF])
@@ -17,6 +18,7 @@ def test_rich_schema_object_adding(write_request_validation, req, is_owner, txn_
                                                                  is_owner=is_owner)])
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('txn_type',
                          [JSON_LD_CONTEXT, RICH_SCHEMA, RICH_SCHEMA_ENCODING, RICH_SCHEMA_MAPPING,
                           RICH_SCHEMA_CRED_DEF, RICH_SCHEMA_PRES_DEF])
diff --git a/indy_common/test/auth/test_auth_schema_with_new_auth_map.py b/indy_common/test/auth/test_auth_schema_with_new_auth_map.py
index 4a83c0d5d..422024f8a 100644
--- a/indy_common/test/auth/test_auth_schema_with_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_schema_with_new_auth_map.py
@@ -1,7 +1,10 @@
+import pytest
+
 from indy_common.authorize.auth_actions import AuthActionAdd, AuthActionEdit
 from indy_common.constants import SCHEMA
 
 
+@pytest.mark.auth
 def test_schema_adding(write_request_validation, req, is_owner):
     authorized = req.identifier in ("trustee_identifier", "steward_identifier", "endorser_identifier")
     assert authorized == write_request_validation(req,
@@ -11,6 +14,7 @@ def test_schema_adding(write_request_validation, req, is_owner):
                                                                  is_owner=is_owner)])
 
 
+@pytest.mark.auth
 def test_schema_editing(write_request_validation, req, is_owner):
     assert not write_request_validation(req,
                                         [AuthActionEdit(txn_type=SCHEMA,
diff --git a/indy_common/test/auth/test_auth_strategies.py b/indy_common/test/auth/test_auth_strategies.py
index b0a025417..d91319b08 100644
--- a/indy_common/test/auth/test_auth_strategies.py
+++ b/indy_common/test/auth/test_auth_strategies.py
@@ -27,11 +27,13 @@ def local_auth_strategy(auth_map):
     return LocalAuthStrategy(auth_map=auth_map)
 
 
+@pytest.mark.auth
 def test_local_strategy_found_the_same_action_id(local_auth_strategy):
     assert local_auth_strategy.get_auth_constraint("SomeType--ADD--some_field--*--new_value")
     assert local_auth_strategy.get_auth_constraint("SomeType--EDIT--some_field--old_value--new_value")
 
 
+@pytest.mark.auth
 def test_local_strategy_not_found_action_id(local_auth_strategy):
     assert local_auth_strategy.get_auth_constraint("SomeType--ADD--some_field--*--other_new_value") is None
     assert local_auth_strategy.get_auth_constraint("SomeType--EDIT--some_field--old_value--other_new_value") is None
@@ -52,51 +54,61 @@ def config_ledger_strategy(state, state_serializer):
                                     serializer=state_serializer)
 
 
+@pytest.mark.auth
 def test_is_accepted_by_the_same(is_accepted):
     assert is_accepted("TYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE",
                        "TYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE")
 
 
+@pytest.mark.auth
 def test_not_is_accepted_by_prefix(is_accepted):
     assert not is_accepted("TYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE",
                            "aaTYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE")
 
 
+@pytest.mark.auth
 def test_not_is_accepted_by_type(is_accepted):
     assert not is_accepted("TYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE",
                            "TYPE--aaPREFIX--FIELD--OLD_VALUE--NEW_VALUE")
 
 
+@pytest.mark.auth
 def test_not_is_accepted_by_field(is_accepted):
     assert not is_accepted("TYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE",
                            "TYPE--PREFIX--aaFIELD--OLD_VALUE--NEW_VALUE")
 
 
+@pytest.mark.auth
 def test_not_is_accepted_by_old_value(is_accepted):
     assert not is_accepted("TYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE",
                            "TYPE--PREFIX--FIELD--aaOLD_VALUE--NEW_VALUE")
 
 
+@pytest.mark.auth
 def test_not_is_accepted_by_new_value(is_accepted):
     assert not is_accepted("TYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE",
                            "TYPE--PREFIX--FIELD--OLD_VALUE--aaNEW_VALUE")
 
 
+@pytest.mark.auth
 def test_is_accepted_for_all_field(is_accepted):
     assert is_accepted("TYPE--PREFIX--*--OLD_VALUE--NEW_VALUE",
                        "TYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE")
 
 
+@pytest.mark.auth
 def test_is_accepted_for_all_old_value(is_accepted):
     assert is_accepted("TYPE--PREFIX--FIELD--*--NEW_VALUE",
                        "TYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE")
 
 
+@pytest.mark.auth
 def test_is_accepted_for_all_new_value(is_accepted):
     assert is_accepted("TYPE--PREFIX--FIELD--OLD_VALUE--*",
                        "TYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE")
 
 
+@pytest.mark.auth
 def test_is_accepted_for_all(is_accepted):
     assert is_accepted("TYPE--PREFIX--*--*--*",
                        "TYPE--PREFIX--FIELD--OLD_VALUE--NEW_VALUE")
diff --git a/indy_common/test/auth/test_auth_txn_author_agreement_with_new_auth_map.py b/indy_common/test/auth/test_auth_txn_author_agreement_with_new_auth_map.py
index a77b0d273..194f46b45 100644
--- a/indy_common/test/auth/test_auth_txn_author_agreement_with_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_txn_author_agreement_with_new_auth_map.py
@@ -1,7 +1,10 @@
+import pytest
+
 from indy_common.authorize.auth_actions import AuthActionAdd
 from plenum.common.constants import TXN_AUTHOR_AGREEMENT
 
 
+@pytest.mark.auth
 def test_auth_txn_author_agreement_with_new_auth_map(write_request_validation, is_owner, req):
     authorized = req.identifier == "trustee_identifier"
     assert authorized == write_request_validation(req,
diff --git a/indy_common/test/auth/test_auth_validator_info_with_new_auth_map.py b/indy_common/test/auth/test_auth_validator_info_with_new_auth_map.py
index d7c951a29..93b7343b8 100644
--- a/indy_common/test/auth/test_auth_validator_info_with_new_auth_map.py
+++ b/indy_common/test/auth/test_auth_validator_info_with_new_auth_map.py
@@ -1,7 +1,10 @@
+import pytest
+
 from indy_common.authorize.auth_actions import AuthActionAdd
 from indy_common.constants import VALIDATOR_INFO
 
 
+@pytest.mark.auth
 def test_pool_restart_add_action(write_request_validation, is_owner, req):
     authorized = req.identifier in ("trustee_identifier", "steward_identifier", "network_monitor_identifier")
     assert authorized == write_request_validation(req,
diff --git a/indy_common/test/auth/test_composite_authorizer.py b/indy_common/test/auth/test_composite_authorizer.py
index 03033b6ef..932e07a89 100644
--- a/indy_common/test/auth/test_composite_authorizer.py
+++ b/indy_common/test/auth/test_composite_authorizer.py
@@ -49,21 +49,25 @@ def other_req_id():
                    protocolVersion=CURRENT_PROTOCOL_VERSION)
 
 
+@pytest.mark.auth
 def test_authorize_with_role(composite_authorizer, req_auth):
     assert composite_authorizer.authorize(req_auth, AuthConstraint(STEWARD, 1), None)
 
 
+@pytest.mark.auth
 def test_raise_on_not_authorize_with_other_role(composite_authorizer, req_auth):
     with pytest.raises(AuthValidationError):
         assert composite_authorizer.authorize(req_auth, AuthConstraint(TRUSTEE, 1), None)
 
 
+@pytest.mark.auth
 def test_authorize_with_and_constraint(composite_authorizer, req_auth):
     composite_authorizer.authorize(req_auth,
                                    AuthConstraintAnd([AuthConstraint(STEWARD, 1), AuthConstraint(STEWARD, 1)]),
                                    None)
 
 
+@pytest.mark.auth
 def test_not_authorize_with_and_constraint(composite_authorizer, req_auth):
     with pytest.raises(AuthValidationError):
         composite_authorizer.authorize(req_auth,
@@ -71,18 +75,21 @@ def test_not_authorize_with_and_constraint(composite_authorizer, req_auth):
                                        None)
 
 
+@pytest.mark.auth
 def test_authorize_with_or_constraint(composite_authorizer, req_auth):
     composite_authorizer.authorize(req_auth,
                                    AuthConstraintOr([AuthConstraint(STEWARD, 1), AuthConstraint(STEWARD, 1)]),
                                    None)
 
 
+@pytest.mark.auth
 def test_authorize_with_or_constraint_with_one_fail(composite_authorizer, req_auth):
     composite_authorizer.authorize(req_auth,
                                    AuthConstraintOr([AuthConstraint(STEWARD, 1), AuthConstraint(TRUSTEE, 1)]),
                                    None)
 
 
+@pytest.mark.auth
 def test_not_authorized_with_or_constraint(composite_authorizer, req_auth):
     with pytest.raises(AuthValidationError):
         composite_authorizer.authorize(req_auth,
diff --git a/indy_common/test/auth/test_config_ledger_auth_strategy.py b/indy_common/test/auth/test_config_ledger_auth_strategy.py
index 71995a902..be2647a1a 100644
--- a/indy_common/test/auth/test_config_ledger_auth_strategy.py
+++ b/indy_common/test/auth/test_config_ledger_auth_strategy.py
@@ -19,6 +19,7 @@ def state_serializer():
     return ConstraintsSerializer(domain_state_serializer)
 
 
+@pytest.mark.auth
 def test_config_strategy_get_constraint_from_state(state,
                                                    state_serializer):
     action_id = "1--2--3--4--5"
@@ -39,6 +40,7 @@ def test_config_strategy_get_constraint_from_state(state,
     assert from_state == constraint_to_state
 
 
+@pytest.mark.auth
 def test_config_strategy_constraint_from_map(state,
                                              state_serializer):
     action_id = "1--2--3--4--5"
@@ -53,6 +55,7 @@ def test_config_strategy_constraint_from_map(state,
     assert from_map == constraint
 
 
+@pytest.mark.auth
 def test_config_strategy_constraint_not_found(state,
                                               state_serializer):
     state_action_id = "1--2--3--4--5"
diff --git a/indy_common/test/auth/test_endorser_authorizer.py b/indy_common/test/auth/test_endorser_authorizer.py
index d01a954f2..304a465ad 100644
--- a/indy_common/test/auth/test_endorser_authorizer.py
+++ b/indy_common/test/auth/test_endorser_authorizer.py
@@ -112,6 +112,7 @@ def build_req_signed_by_author_only(author_role):
                    protocolVersion=CURRENT_PROTOCOL_VERSION)
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('author_role', [IDENTITY_OWNER, NETWORK_MONITOR, TRUSTEE, STEWARD, ENDORSER])
 def test_dont_require_endorser_if_one_sig(authorizer, author_role):
     req = build_req_signed_by_author_only(author_role)
@@ -119,6 +120,7 @@ def test_dont_require_endorser_if_one_sig(authorizer, author_role):
     assert authorized
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('author_role', [IDENTITY_OWNER, NETWORK_MONITOR, TRUSTEE, STEWARD, ENDORSER])
 def test_dont_require_endorser_if_one_multisig(authorizer, author_role):
     req = build_req_multi_signed_by_author_only(author_role)
@@ -126,6 +128,7 @@ def test_dont_require_endorser_if_one_multisig(authorizer, author_role):
     assert authorized
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('author_role', [IDENTITY_OWNER, NETWORK_MONITOR])
 @pytest.mark.parametrize('non_author_role', [TRUSTEE, STEWARD, ENDORSER])
 def test_require_endorser_if_signed_by_non_author(authorizer, author_role, non_author_role):
@@ -135,6 +138,7 @@ def test_require_endorser_if_signed_by_non_author(authorizer, author_role, non_a
     assert "'Endorser' field must be explicitly set for the endorsed transaction" in reason
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('author_role', [TRUSTEE, STEWARD, ENDORSER])
 @pytest.mark.parametrize('non_author_role', [IDENTITY_OWNER, NETWORK_MONITOR, TRUSTEE, STEWARD, ENDORSER])
 def test_dont_require_endorser_if_signed_by_non_author(authorizer, author_role, non_author_role):
@@ -143,6 +147,7 @@ def test_dont_require_endorser_if_signed_by_non_author(authorizer, author_role,
     assert authorized
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('author_role', [IDENTITY_OWNER, NETWORK_MONITOR])
 @pytest.mark.parametrize('endorser_role', [TRUSTEE, STEWARD, ENDORSER])
 def test_require_endorser_when_multi_sig(authorizer, author_role, endorser_role):
@@ -158,6 +163,7 @@ def test_require_endorser_when_multi_sig(authorizer, author_role, endorser_role)
     assert authorized
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('author_role', [IDENTITY_OWNER, NETWORK_MONITOR])
 @pytest.mark.parametrize('non_author_role', [IDENTITY_OWNER, NETWORK_MONITOR])
 def test_dont_require_endorser_when_multi_sig_by_owner(authorizer, author_role, non_author_role):
@@ -166,6 +172,7 @@ def test_dont_require_endorser_when_multi_sig_by_owner(authorizer, author_role,
     assert authorized
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('author_role', [TRUSTEE, STEWARD, ENDORSER])
 def test_dont_require_endorser_when_multi_sig(authorizer, author_role):
     # authorized even without explicit Endorser field
@@ -179,6 +186,7 @@ def test_dont_require_endorser_when_multi_sig(authorizer, author_role):
     assert authorized
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('endorser_role', [ENDORSER])
 def test_allowed_endorser_roles(authorizer, endorser_role):
     req = build_req_multi_signed_by_endorser(author_role=IDENTITY_OWNER,
@@ -187,6 +195,7 @@ def test_allowed_endorser_roles(authorizer, endorser_role):
     assert authorized
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('endorser_role', [TRUSTEE, STEWARD, IDENTITY_OWNER, NETWORK_MONITOR])
 def test_not_allowed_endorser_roles(authorizer, endorser_role):
     req = build_req_multi_signed_by_endorser(author_role=IDENTITY_OWNER,
@@ -196,6 +205,7 @@ def test_not_allowed_endorser_roles(authorizer, endorser_role):
     assert "Endorser must have one of the following roles" in reason
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('author_role', [TRUSTEE, STEWARD, ENDORSER])
 def test_endorser_role_checked_when_author_is_endorser(authorizer, author_role):
     req = build_req_multi_signed_by_endorser(author_role=author_role,
@@ -205,6 +215,7 @@ def test_endorser_role_checked_when_author_is_endorser(authorizer, author_role):
     assert "Endorser must have one of the following roles" in reason
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('author_role', [IDENTITY_OWNER, NETWORK_MONITOR, TRUSTEE, STEWARD])
 def test_endorser_must_sign(authorizer, author_role):
     req = build_req_multi_signed_by_author_only(author_role=author_role)
@@ -214,6 +225,7 @@ def test_endorser_must_sign(authorizer, author_role):
     assert "Endorser must sign the transaction" in reason
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('author_role', [IDENTITY_OWNER, NETWORK_MONITOR, TRUSTEE, STEWARD])
 def test_endorser_is_author_and_1_sig(authorizer, author_role):
     req = build_req_signed_by_author_only(author_role=ENDORSER)
@@ -222,6 +234,7 @@ def test_endorser_is_author_and_1_sig(authorizer, author_role):
     assert authorized
 
 
+@pytest.mark.auth
 @pytest.mark.parametrize('author_role', [IDENTITY_OWNER, NETWORK_MONITOR, TRUSTEE, STEWARD])
 def test_endorser_is_not_author_and_1_sig(authorizer, author_role):
     req = build_req_signed_by_author_only(author_role=ENDORSER)
diff --git a/indy_common/test/auth/test_helper.py b/indy_common/test/auth/test_helper.py
index 13242a5a1..f970ebbe9 100644
--- a/indy_common/test/auth/test_helper.py
+++ b/indy_common/test/auth/test_helper.py
@@ -1,10 +1,14 @@
+import pytest
+
 from indy_common.authorize.helper import get_named_role
 from plenum.common.constants import TRUSTEE_STRING, TRUSTEE
 
 
+@pytest.mark.auth
 def test_for_known_role():
     assert get_named_role(TRUSTEE) == TRUSTEE_STRING
 
 
+@pytest.mark.auth
 def test_for_unknown_role():
     assert get_named_role("SomeOtherRole") == "Unknown role"
diff --git a/indy_common/test/auth/test_role_authorizer.py b/indy_common/test/auth/test_role_authorizer.py
index 82194a62c..20c9c369a 100644
--- a/indy_common/test/auth/test_role_authorizer.py
+++ b/indy_common/test/auth/test_role_authorizer.py
@@ -49,11 +49,13 @@ def idr_cache_none_role(req_auth):
     return cache
 
 
+@pytest.mark.auth
 def test_role_authorizer_get_role(idr_cache, req_auth):
     authorizer = RolesAuthorizer(cache=idr_cache)
     assert authorizer.get_role(req_auth) == STEWARD
 
 
+@pytest.mark.auth
 def test_role_authorizer_is_role_accepted(idr_cache):
     authorizer = RolesAuthorizer(cache=idr_cache)
     assert authorizer.is_role_accepted(role="", auth_constraint_role=IDENTITY_OWNER)
@@ -63,6 +65,7 @@ def test_role_authorizer_is_role_accepted(idr_cache):
     assert authorizer.is_role_accepted(role="", auth_constraint_role="*")
 
 
+@pytest.mark.auth
 def test_role_authorizer_is_owner_accepted(idr_cache, is_owner):
     authorizer = RolesAuthorizer(cache=idr_cache)
     authorized = is_owner
@@ -71,6 +74,7 @@ def test_role_authorizer_is_owner_accepted(idr_cache, is_owner):
         AuthActionAdd(txn_type=NYM, field='some_field', value='some_value', is_owner=is_owner))
 
 
+@pytest.mark.auth
 def test_role_authorizer_authorize_with_owner(idr_cache, req_auth, is_owner):
     req = Request(identifier=req_auth.identifier,
                   operation={TARGET_NYM: req_auth.identifier,
@@ -84,12 +88,14 @@ def test_role_authorizer_authorize_with_owner(idr_cache, req_auth, is_owner):
     assert authorized == is_owner
 
 
+@pytest.mark.auth
 def test_role_authorizer_authorize_with_role(idr_cache, req_auth):
     authorizer = RolesAuthorizer(cache=idr_cache)
     authorized, reason = authorizer.authorize(req_auth, AuthConstraint(role=STEWARD, sig_count=1))
     assert authorized
 
 
+@pytest.mark.auth
 def test_role_authorizer_not_authorize_role(idr_cache, req_auth):
     authorizer = RolesAuthorizer(cache=idr_cache)
     authorized, reason = authorizer.authorize(req_auth, AuthConstraint(role=TRUSTEE, sig_count=1))
@@ -97,6 +103,7 @@ def test_role_authorizer_not_authorize_role(idr_cache, req_auth):
     assert reason == "Not enough TRUSTEE signatures"
 
 
+@pytest.mark.auth
 def test_role_authorizer_not_authorize_unknown_nym(idr_cache):
     authorizer = RolesAuthorizer(cache=idr_cache)
 
@@ -112,16 +119,19 @@ def test_role_authorizer_not_authorize_unknown_nym(idr_cache):
     assert reason == "sender's DID {} is not found in the Ledger".format(unknown_req_auth.identifier)
 
 
+@pytest.mark.auth
 def test_role_authorizer_is_sig_count_accepted(idr_cache_none_role, req_auth):
     authorizer = RolesAuthorizer(cache=idr_cache_none_role)
     assert authorizer.is_sig_count_accepted(req_auth, AuthConstraint(role="*", sig_count=1))
 
 
+@pytest.mark.auth
 def test_role_authorizer_not_is_sig_count_accepted(idr_cache_none_role, req_auth):
     authorizer = RolesAuthorizer(cache=idr_cache_none_role)
     assert not authorizer.is_sig_count_accepted(req_auth, AuthConstraint(role=TRUSTEE, sig_count=10))
 
 
+@pytest.mark.auth
 def test_role_authorizer_off_ledger_signature_pass(idr_cache, req_auth):
     authorizer = RolesAuthorizer(cache=idr_cache)
     req_auth._identifier = 'id_off_ledger'
@@ -130,6 +140,7 @@ def test_role_authorizer_off_ledger_signature_pass(idr_cache, req_auth):
     assert authorized
 
 
+@pytest.mark.auth
 def test_role_authorizer_off_ledger_signature_not_pass(idr_cache, req_auth):
     authorizer = RolesAuthorizer(cache=idr_cache)
     req_auth._identifier = 'id_off_ledger'
@@ -139,6 +150,7 @@ def test_role_authorizer_off_ledger_signature_not_pass(idr_cache, req_auth):
     assert "DID id_off_ledger is not found in the Ledger" in reason
 
 
+@pytest.mark.auth
 def test_role_authorizer_off_ledger_signature_count_2_pass(idr_cache, req_auth):
     authorizer = RolesAuthorizer(cache=idr_cache)
     req_auth._identifier = 'id_off_ledger'
@@ -149,6 +161,7 @@ def test_role_authorizer_off_ledger_signature_count_2_pass(idr_cache, req_auth):
     assert authorized
 
 
+@pytest.mark.auth
 def test_role_authorizer_off_ledger_signature_count_2_different_pass(idr_cache, req_auth):
     authorizer = RolesAuthorizer(cache=idr_cache)
     req_auth.signature = None
@@ -158,6 +171,7 @@ def test_role_authorizer_off_ledger_signature_count_2_different_pass(idr_cache,
     assert authorized
 
 
+@pytest.mark.auth
 def test_role_authorizer_off_ledger_signature_count_0_pass(idr_cache, req_auth):
     authorizer = RolesAuthorizer(cache=idr_cache)
     req_auth._identifier = 'id_off_ledger'
@@ -166,6 +180,7 @@ def test_role_authorizer_off_ledger_signature_count_0_pass(idr_cache, req_auth):
     assert authorized
 
 
+@pytest.mark.auth
 def test_signed_by_author_if_more_than_1_sig(idr_cache, req_multi_signed_by_non_author):
     authorizer = RolesAuthorizer(cache=idr_cache)
     authorized, reason = authorizer.authorize(req_multi_signed_by_non_author,
@@ -174,6 +189,7 @@ def test_signed_by_author_if_more_than_1_sig(idr_cache, req_multi_signed_by_non_
     assert "Author must sign the transaction" in reason
 
 
+@pytest.mark.auth
 def test_no_sign_by_author_if_0_sig(idr_cache, req_multi_signed_by_non_author):
     authorizer = RolesAuthorizer(cache=idr_cache)
     authorized, reason = authorizer.authorize(req_multi_signed_by_non_author,
diff --git a/indy_common/test/auth/test_txn_author_agreement_aml_with_new_auth_map.py b/indy_common/test/auth/test_txn_author_agreement_aml_with_new_auth_map.py
index e8ba40458..45a9dd032 100644
--- a/indy_common/test/auth/test_txn_author_agreement_aml_with_new_auth_map.py
+++ b/indy_common/test/auth/test_txn_author_agreement_aml_with_new_auth_map.py
@@ -1,7 +1,10 @@
+import pytest
+
 from indy_common.authorize.auth_actions import AuthActionAdd
 from plenum.common.constants import TXN_AUTHOR_AGREEMENT_AML
 
 
+@pytest.mark.auth
 def test_taa_aml_with_new_auth_map(write_request_validation, is_owner, req):
     authorized = req.identifier == "trustee_identifier"
     assert authorized == write_request_validation(req,
diff --git a/indy_common/test/state/test_state_path.py b/indy_common/test/state/test_state_path.py
index e81d817a9..ffa11f936 100644
--- a/indy_common/test/state/test_state_path.py
+++ b/indy_common/test/state/test_state_path.py
@@ -1,8 +1,11 @@
+import pytest
+
 from indy_common.state.domain import make_state_path_for_attr, make_state_path_for_schema, \
     make_state_path_for_claim_def, make_state_path_for_revoc_def, make_state_path_for_revoc_reg_entry, \
     make_state_path_for_revoc_reg_entry_accum
 
 
+@pytest.mark.state
 def test_make_state_path_for_attr():
     assert b'did1:1:attrName1' == make_state_path_for_attr('did1', 'attrName1', attr_is_hash=True)
     assert b'did1:1:677a81e8649df8f1a1e8af7709a5ece1d965cb684b2c185272114c5cc3b7ec49' == \
@@ -11,28 +14,34 @@ def test_make_state_path_for_attr():
            make_state_path_for_attr('did1', 'attrName1')
 
 
+@pytest.mark.state
 def test_make_state_path_for_schema():
     assert b'did1:2:name1:version1' == make_state_path_for_schema('did1', 'name1', 'version1')
 
 
+@pytest.mark.state
 def test_make_state_path_for_claim_def():
     assert b'did1:3:CL:18:tag' == make_state_path_for_claim_def('did1', 18, 'CL', 'tag')
 
 
+@pytest.mark.state
 def test_make_state_path_for_revoc_def():
     assert b'did1:4:did1:3:18:CL:tag:CL_ACCUM:tag' == \
            make_state_path_for_revoc_def('did1', 'did1:3:18:CL:tag', 'CL_ACCUM', 'tag')
 
 
+@pytest.mark.state
 def test_make_state_path_for_revoc_reg_entry():
     assert b'5:did1:4:did1:3:18:CL:tag:CL_ACCUM:tag' == \
            make_state_path_for_revoc_reg_entry('did1:4:did1:3:18:CL:tag:CL_ACCUM:tag')
 
 
+@pytest.mark.state
 def test_make_state_path_for_revoc_reg_entry_accum():
     assert b'6:did1:4:did1:3:18:CL:tag:CL_ACCUM:tag' == \
            make_state_path_for_revoc_reg_entry_accum('did1:4:did1:3:18:CL:tag:CL_ACCUM:tag')
 
 
+@pytest.mark.state
 def test_prepare_attr_for_state():
     pass
diff --git a/indy_common/test/test_req_utils_claim_def.py b/indy_common/test/test_req_utils_claim_def.py
index 3f80b1489..fd8b51e64 100644
--- a/indy_common/test/test_req_utils_claim_def.py
+++ b/indy_common/test/test_req_utils_claim_def.py
@@ -73,81 +73,99 @@ def read_claim_def_request_no_tag(read_claim_def_request):
     return read_claim_def_request
 
 
+@pytest.mark.test
 def test_get_write_claim_def_signature_type(write_claim_def_request):
     assert 'CL1' == get_write_claim_def_signature_type(write_claim_def_request)
 
 
+@pytest.mark.test
 def test_get_write_claim_def_signature_type_default(write_claim_def_request_no_signature_type):
     assert 'CL' == get_write_claim_def_signature_type(write_claim_def_request_no_signature_type)
 
 
+@pytest.mark.test
 def test_get_write_claim_def_schema_ref(write_claim_def_request):
     assert 18 == get_write_claim_def_schema_ref(write_claim_def_request)
 
 
+@pytest.mark.test
 def test_get_write_claim_def_tag(write_claim_def_request):
     assert 'key111' == get_write_claim_def_tag(write_claim_def_request)
 
 
+@pytest.mark.test
 def test_get_write_claim_def_tag_default(write_claim_def_request_no_tag):
     assert 'tag' == get_write_claim_def_tag(write_claim_def_request_no_tag)
 
 
+@pytest.mark.test
 def test_get_write_claim_public_keys(write_claim_def_request):
     assert {'primary': {'primaryKey1': 'a'}, 'revocation': {'revocationKey1': 'b'}} == \
         get_write_claim_def_public_keys(write_claim_def_request)
 
 
+@pytest.mark.test
 def test_get_txn_claim_def_signature_type(write_claim_def_request):
     txn = reqToTxn(write_claim_def_request)
     assert 'CL1' == get_txn_claim_def_signature_type(txn)
 
 
+@pytest.mark.test
 def test_get_txn_claim_def_signature_type_default(write_claim_def_request_no_signature_type):
     txn = reqToTxn(write_claim_def_request_no_signature_type)
     assert 'CL' == get_txn_claim_def_signature_type(txn)
 
 
+@pytest.mark.test
 def test_get_txn_claim_def_schema_ref(write_claim_def_request):
     txn = reqToTxn(write_claim_def_request)
     assert 18 == get_txn_claim_def_schema_ref(txn)
 
 
+@pytest.mark.test
 def test_get_txn_claim_def_tag(write_claim_def_request):
     txn = reqToTxn(write_claim_def_request)
     assert 'key111' == get_txn_claim_def_tag(txn)
 
 
+@pytest.mark.test
 def test_get_txn_claim_def_tag_default(write_claim_def_request_no_tag):
     txn = reqToTxn(write_claim_def_request_no_tag)
     assert 'tag' == get_txn_claim_def_tag(txn)
 
 
+@pytest.mark.test
 def test_get_txn_claim_public_keys(write_claim_def_request):
     txn = reqToTxn(write_claim_def_request)
     assert {'primary': {'primaryKey1': 'a'}, 'revocation': {'revocationKey1': 'b'}} == \
         get_txn_claim_def_public_keys(txn)
 
 
+@pytest.mark.test
 def test_get_read_claim_def_signature_type(read_claim_def_request):
     assert 'CL1' == get_read_claim_def_signature_type(read_claim_def_request)
 
 
+@pytest.mark.test
 def test_get_read_claim_def_signature_type_default(read_claim_def_request_no_signature_type):
     assert 'CL' == get_read_claim_def_signature_type(read_claim_def_request_no_signature_type)
 
 
+@pytest.mark.test
 def test_get_read_claim_def_schema_ref(read_claim_def_request):
     assert 18 == get_read_claim_def_schema_ref(read_claim_def_request)
 
 
+@pytest.mark.test
 def test_get_read_claim_def_tag(read_claim_def_request):
     assert 'key111' == get_read_claim_def_tag(read_claim_def_request)
 
 
+@pytest.mark.test
 def test_get_read_claim_def_tag_default(read_claim_def_request_no_tag):
     assert 'tag' == get_read_claim_def_tag(read_claim_def_request_no_tag)
 
 
+@pytest.mark.test
 def test_get_read_claim_def_from(read_claim_def_request):
     assert 'L5AD5g65TDQr1PPHHRoiGf' == get_read_claim_def_from(read_claim_def_request)
diff --git a/indy_common/test/test_req_utils_schema.py b/indy_common/test/test_req_utils_schema.py
index 33622f985..89bfc30c7 100644
--- a/indy_common/test/test_req_utils_schema.py
+++ b/indy_common/test/test_req_utils_schema.py
@@ -68,59 +68,72 @@ def get_schema_reply():
     }
 
 
+@pytest.mark.test
 def test_get_write_schema_name(write_schema_request):
     assert 'Degree' == get_write_schema_name(write_schema_request)
 
 
+@pytest.mark.test
 def test_get_write_schema_version(write_schema_request):
     assert '1.0' == get_write_schema_version(write_schema_request)
 
 
+@pytest.mark.test
 def test_get_write_schema_attr_names(write_schema_request):
     assert ['undergrad', 'last_name', 'first_name', 'birth_date', 'postgrad',
             'expiry_date'] == get_write_schema_attr_names(write_schema_request)
 
 
+@pytest.mark.test
 def test_get_txn_schema_name(write_schema_request):
     txn = reqToTxn(write_schema_request)
     assert 'Degree' == get_txn_schema_name(txn)
 
 
+@pytest.mark.test
 def test_get_txn_schema_version(write_schema_request):
     txn = reqToTxn(write_schema_request)
     assert '1.0' == get_txn_schema_version(txn)
 
 
+@pytest.mark.test
 def test_get_txn_schema_attr_names(write_schema_request):
     txn = reqToTxn(write_schema_request)
     assert ['undergrad', 'last_name', 'first_name', 'birth_date', 'postgrad',
             'expiry_date'] == get_txn_schema_attr_names(txn)
 
 
+@pytest.mark.test
 def test_get_read_schema_name(read_schema_request):
     assert 'Degree' == get_read_schema_name(read_schema_request)
 
 
+@pytest.mark.test
 def test_get_read_schema_version(read_schema_request):
     assert '1.0' == get_read_schema_version(read_schema_request)
 
 
+@pytest.mark.test
 def test_get_read_schema_from(read_schema_request):
     assert 'L5AD5g65TDQr1PPHHRoiGf' == get_read_schema_from(read_schema_request)
 
 
+@pytest.mark.test
 def test_get_reply_schema_name(get_schema_reply):
     assert 'Degree' == get_reply_schema_name(get_schema_reply)
 
 
+@pytest.mark.test
 def test_get_reply_schema_version(get_schema_reply):
     assert '1.0' == get_reply_schema_version(get_schema_reply)
 
 
+@pytest.mark.test
 def test_get_reply_schema_from(get_schema_reply):
     assert 'L5AD5g65TDQr1PPHHRoiGf' == get_reply_schema_from(get_schema_reply)
 
 
+@pytest.mark.test
 def test_get_reply_schema_attr_names(get_schema_reply):
     assert ['undergrad', 'last_name', 'first_name', 'birth_date', 'postgrad',
             'expiry_date'] == get_reply_schema_attr_names(get_schema_reply)
diff --git a/indy_common/test/test_roles.py b/indy_common/test/test_roles.py
index 93eefcc5b..7248aed21 100644
--- a/indy_common/test/test_roles.py
+++ b/indy_common/test/test_roles.py
@@ -1,27 +1,32 @@
+import pytest
 from plenum.common.constants import STEWARD, TRUSTEE
 from indy_common.constants import ENDORSER
 from indy_common.roles import Roles
 
 
-def testRolesAreEncoded():
+@pytest.mark.test
+def test_roles_are_encoded():
     assert STEWARD == "2"
     assert TRUSTEE == "0"
     assert ENDORSER == "101"
 
 
-def testRolesEnumDecoded():
+@pytest.mark.test
+def test_roles_enum_decoded():
     assert Roles.STEWARD.name == "STEWARD"
     assert Roles.TRUSTEE.name == "TRUSTEE"
     assert Roles.ENDORSER.name == "ENDORSER"
 
 
-def testRolesEnumEncoded():
+@pytest.mark.test
+def test_roles_enum_encoded():
     assert Roles.STEWARD.value == "2"
     assert Roles.TRUSTEE.value == "0"
     assert Roles.ENDORSER.value == "101"
 
 
-def testNameFromValue():
+@pytest.mark.test
+def test_name_from_value():
     assert Roles.nameFromValue("2") == "STEWARD"
     assert Roles.nameFromValue("0") == "TRUSTEE"
     assert Roles.nameFromValue("101") == "ENDORSER"
diff --git a/indy_common/test/test_strict_schema.py b/indy_common/test/test_strict_schema.py
index e01c375d2..fc1879510 100644
--- a/indy_common/test/test_strict_schema.py
+++ b/indy_common/test/test_strict_schema.py
@@ -1,9 +1,12 @@
+import pytest
+
 from indy_common.types import SafeRequest
 from plenum.common.constants import CURRENT_PROTOCOL_VERSION, TXN_TYPE, TARGET_NYM, VERKEY, NYM
 from plenum.common.types import f, OPERATION
 from plenum.test.input_validation.constants import TEST_TARGET_NYM, TEST_VERKEY_ABBREVIATED
 
 
+@pytest.mark.test
 def test_client_safe_req_not_strict_by_default():
     operation = {
         TXN_TYPE: NYM,
diff --git a/indy_common/test/test_strict_types.py b/indy_common/test/test_strict_types.py
index 0044a0303..d1f41c4fd 100644
--- a/indy_common/test/test_strict_types.py
+++ b/indy_common/test/test_strict_types.py
@@ -20,21 +20,25 @@ def takesUnion(s: typing.Union[str, None]) -> int:
         pass
 
 
-def testInvalidArgumentType():
+@pytest.mark.test
+def test_invalid_argument_type():
     with pytest.raises(TypeError):
         takesStr(1)
 
 
-def testInvalidReturnType():
+@pytest.mark.test
+def test_invalid_return_type():
     with pytest.raises(TypeError):
         assert takesStr('return None')
 
 
-def testValidInputAndReturn():
+@pytest.mark.test
+def test_valid_input_and_return():
     takesStr('1')
 
 
-def testWorksWithComplexTypes():
+@pytest.mark.test
+def test_works_with_complex_types():
     takesUnion('1')
 
 
@@ -60,19 +64,22 @@ def t():
     return TestClass()
 
 
-def testWholeClassInvalidArgumentType(t):
+@pytest.mark.test
+def test_whole_class_invalid_argument_type(t):
     with pytest.raises(TypeError):
         t.takesStr(1)
     with pytest.raises(TypeError):
         t.takesInt('1')
 
 
-def testWholeClassInvalidReturnType(t):
+@pytest.mark.test
+def test_whole_class_invalid_return_type(t):
     with pytest.raises(TypeError):
         assert t.takesStr('return None')
         assert t.takesInt(457)
 
 
-def testWholeClassValidInputAndReturn(t):
+@pytest.mark.test
+def test_whole_class_valid_input_and_return(t):
     t.takesStr('1')
     t.takesInt(1)
diff --git a/indy_common/test/test_transactions.py b/indy_common/test/test_transactions.py
index f74055ee4..ade6c4632 100644
--- a/indy_common/test/test_transactions.py
+++ b/indy_common/test/test_transactions.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_common.constants import NYM, NODE, ATTRIB, SCHEMA, CLAIM_DEF, DISCLO, GET_ATTR, GET_NYM, GET_TXNS, \
     GET_SCHEMA, GET_CLAIM_DEF, POOL_UPGRADE, NODE_UPGRADE, \
     POOL_CONFIG, REVOC_REG_DEF, REVOC_REG_ENTRY, \
@@ -9,6 +11,7 @@
 from indy_common.transactions import IndyTransactions
 
 
+@pytest.mark.test
 def test_transactions_are_encoded():
     assert NODE == "0"
     assert NYM == "1"
@@ -49,6 +52,7 @@ def test_transactions_are_encoded():
     assert GET_RICH_SCHEMA_OBJECT_BY_METADATA == "301"
 
 
+@pytest.mark.test
 def test_transaction_enum_decoded():
     assert IndyTransactions.NODE.name == "NODE"
     assert IndyTransactions.NYM.name == "NYM"
@@ -89,6 +93,7 @@ def test_transaction_enum_decoded():
     assert IndyTransactions.GET_RICH_SCHEMA_OBJECT_BY_METADATA.name == "GET_RICH_SCHEMA_OBJECT_BY_METADATA"
 
 
+@pytest.mark.test
 def test_transaction_enum_encoded():
     assert IndyTransactions.NODE.value == "0"
     assert IndyTransactions.NYM.value == "1"
@@ -125,6 +130,7 @@ def test_transaction_enum_encoded():
     assert IndyTransactions.GET_RICH_SCHEMA_OBJECT_BY_METADATA.value == "301"
 
 
+@pytest.mark.test
 def test_get_name_from_code():
     assert IndyTransactions.get_name_from_code(IndyTransactions.NODE.value) == "NODE"
     assert IndyTransactions.get_name_from_code(IndyTransactions.NYM.value) == "NYM"
diff --git a/indy_common/test/test_util.py b/indy_common/test/test_util.py
index 73f2b55d9..936eab8c0 100644
--- a/indy_common/test/test_util.py
+++ b/indy_common/test/test_util.py
@@ -1,7 +1,11 @@
 from operator import itemgetter
+
+import pytest
+
 from indy_common.util import getIndex
 
 
+@pytest.mark.test
 def test_getIndex():
     items = [('a', {'key1': 1}), ('b', {'key2': 2})]
     getDict = itemgetter(1)
diff --git a/indy_common/test/types/test_attrib.py b/indy_common/test/types/test_attrib.py
index b0b45c485..5c690a190 100644
--- a/indy_common/test/types/test_attrib.py
+++ b/indy_common/test/types/test_attrib.py
@@ -14,6 +14,7 @@
 assert len(VALID_HASH) == 64
 
 
+@pytest.mark.types
 def test_attrib_with_enc_raw_hash_at_same_time_fails():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -29,6 +30,7 @@ def test_attrib_with_enc_raw_hash_at_same_time_fails():
                   "".format(RAW, ENC, HASH))
 
 
+@pytest.mark.types
 def test_attrib_without_enc_raw_hash_fails():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -44,6 +46,7 @@ def test_attrib_without_enc_raw_hash_fails():
             HASH))
 
 
+@pytest.mark.types
 def test_attrib_with_raw_string_fails():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -56,6 +59,7 @@ def test_attrib_with_raw_string_fails():
                   r"valid JSON string \({}=foo\)".format(RAW))
 
 
+@pytest.mark.types
 def test_attrib_with_raw_empty_json_fails():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -69,6 +73,7 @@ def test_attrib_with_raw_empty_json_fails():
         r"\({}={{}}\)".format(RAW))
 
 
+@pytest.mark.types
 def test_attrib_with_raw_array_fails():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -82,6 +87,7 @@ def test_attrib_with_raw_array_fails():
         r"\({}=<class 'list'>\)".format(RAW))
 
 
+@pytest.mark.types
 def test_attrib_with_raw_having_more_one_attrib_fails():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -95,6 +101,7 @@ def test_attrib_with_raw_having_more_one_attrib_fails():
         r"\({}={{.*}}\)".format(RAW))
 
 
+@pytest.mark.types
 def test_attrib_with_raw_having_one_attrib_passes():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -104,6 +111,7 @@ def test_attrib_with_raw_having_one_attrib_passes():
     validator.validate(msg)
 
 
+@pytest.mark.types
 def test_attrib_with_raw_having_endpoint_equal_null_passes():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -113,6 +121,7 @@ def test_attrib_with_raw_having_endpoint_equal_null_passes():
     validator.validate(msg)
 
 
+@pytest.mark.types
 def test_attrib_with_raw_having_endpoint_ha_equal_null_passes():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -122,6 +131,7 @@ def test_attrib_with_raw_having_endpoint_ha_equal_null_passes():
     validator.validate(msg)
 
 
+@pytest.mark.types
 def test_attrib_with_raw_having_endpoint_without_ha_passes():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -131,6 +141,7 @@ def test_attrib_with_raw_having_endpoint_without_ha_passes():
     validator.validate(msg)
 
 
+@pytest.mark.types
 def test_attrib_with_raw_having_endpoint_ha_with_ip_address_only_fails():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -144,6 +155,7 @@ def test_attrib_with_raw_having_endpoint_ha_with_ip_address_only_fails():
         r"\({}={{'ha': '8.8.8.8'}}\)".format(ENDPOINT))
 
 
+@pytest.mark.types
 def test_attrib_with_raw_having_endpoint_ha_with_invalid_port_fails():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -157,6 +169,7 @@ def test_attrib_with_raw_having_endpoint_ha_with_invalid_port_fails():
         r"\(ha=8.8.8.8:65536\)")
 
 
+@pytest.mark.types
 def test_attrib_with_raw_having_endpoint_ha_with_invalid_ip_address_fails():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -170,6 +183,7 @@ def test_attrib_with_raw_having_endpoint_ha_with_invalid_ip_address_fails():
         r"\(ha=256.8.8.8:9700\)")
 
 
+@pytest.mark.types
 def test_attrib_with_valid_hash_passes():
     msg = {
         TXN_TYPE: ATTRIB,
@@ -179,6 +193,7 @@ def test_attrib_with_valid_hash_passes():
     validator.validate(msg)
 
 
+@pytest.mark.types
 def test_attrib_with_shorter_hash_fails():
     invalid_hash = VALID_HASH[:-1]
     msg = {
@@ -192,6 +207,7 @@ def test_attrib_with_shorter_hash_fails():
                   r"\(needs to be in hex too\) \({}={}\)".format(HASH, invalid_hash))
 
 
+@pytest.mark.types
 def test_attrib_with_longer_hash_fails():
     invalid_hash = VALID_HASH + 'a'
     msg = {
@@ -205,6 +221,7 @@ def test_attrib_with_longer_hash_fails():
                   r"\(needs to be in hex too\) \({}={}\)".format(HASH, invalid_hash))
 
 
+@pytest.mark.types
 def test_attrib_with_invalid_hash_fails():
     idx = 10
     invalid_hash = VALID_HASH[:idx] + 'X' + VALID_HASH[idx + 1:]
@@ -220,6 +237,7 @@ def test_attrib_with_invalid_hash_fails():
                   r"\(needs to be in hex too\) \({}={}\)".format(HASH, invalid_hash))
 
 
+@pytest.mark.types
 def test_attrib_with_empty_hash_fails():
     empty_hash = ''
     msg = {
@@ -244,6 +262,7 @@ def test_attrib_with_empty_hash_fails():
                   r"'str', got 'NoneType' \({}={}\)".format(HASH, empty_hash))
 
 
+@pytest.mark.types
 def test_attrib_with_enc_passes():
     secretBox = SecretBox()
     enc_data = secretBox.encrypt(json.dumps({'name': 'Alice'}).encode()).hex()
@@ -256,6 +275,7 @@ def test_attrib_with_enc_passes():
     validator.validate(msg)
 
 
+@pytest.mark.types
 def test_attrib_with_empty_enc_fails():
     empty_enc = ''
     msg = {
diff --git a/indy_common/test/types/test_attrib_schema.py b/indy_common/test/types/test_attrib_schema.py
index 05bbef029..05527e08f 100644
--- a/indy_common/test/types/test_attrib_schema.py
+++ b/indy_common/test/types/test_attrib_schema.py
@@ -14,11 +14,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientAttribOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientAttribOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_auth_rule_schema.py b/indy_common/test/types/test_auth_rule_schema.py
index 9a671e1ed..7e5a7ef6e 100644
--- a/indy_common/test/types/test_auth_rule_schema.py
+++ b/indy_common/test/types/test_auth_rule_schema.py
@@ -1,5 +1,7 @@
 from collections import OrderedDict
 
+import pytest
+
 from indy_common.types import ClientSchemaOperation, SchemaField, ConstraintListField, ClientAuthRuleOperation, \
     ConstraintEntityField, ConstraintField, AuthRuleValueField
 from plenum.common.messages.fields import ConstantField, VersionField, IterableField, LimitedLengthStringField, \
@@ -12,11 +14,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields_list():
     actual_field_names = OrderedDict(ConstraintListField().schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS_CONSTRAINT_LIST.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators_list():
     schema = dict(ConstraintListField().schema)
     for field, validator in EXPECTED_ORDERED_FIELDS_CONSTRAINT_LIST.items():
@@ -34,11 +38,13 @@ def test_has_expected_validators_list():
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields_entity():
     actual_field_names = OrderedDict(ConstraintEntityField.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS_CONSTRAINT_ENTITY.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators_entity():
     schema = dict(ConstraintEntityField.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS_CONSTRAINT_ENTITY.items():
@@ -57,11 +63,13 @@ def test_has_expected_validators_entity():
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientAuthRuleOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientAuthRuleOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_claim_def_get_schema.py b/indy_common/test/types/test_claim_def_get_schema.py
index 36bb7effd..4e2b26271 100644
--- a/indy_common/test/types/test_claim_def_get_schema.py
+++ b/indy_common/test/types/test_claim_def_get_schema.py
@@ -1,5 +1,7 @@
 from collections import OrderedDict
 
+import pytest
+
 from indy_common.types import ClientClaimDefGetOperation
 from plenum.common.messages.fields import ConstantField, LimitedLengthStringField, TxnSeqNoField, IdentifierField
 
@@ -12,11 +14,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientClaimDefGetOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientClaimDefGetOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_claim_def_sub_schema.py b/indy_common/test/types/test_claim_def_sub_schema.py
index acefe6e5b..90b924e41 100644
--- a/indy_common/test/types/test_claim_def_sub_schema.py
+++ b/indy_common/test/types/test_claim_def_sub_schema.py
@@ -13,12 +13,14 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(
         ClientClaimDefSubmitOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientClaimDefSubmitOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_discl_schema.py b/indy_common/test/types/test_discl_schema.py
index 03cebea22..e7646f727 100644
--- a/indy_common/test/types/test_discl_schema.py
+++ b/indy_common/test/types/test_discl_schema.py
@@ -12,11 +12,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientDiscloOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientDiscloOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_get_attrib_schema.py b/indy_common/test/types/test_get_attrib_schema.py
index aee498db2..a3724987c 100644
--- a/indy_common/test/types/test_get_attrib_schema.py
+++ b/indy_common/test/types/test_get_attrib_schema.py
@@ -13,11 +13,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientGetAttribOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientGetAttribOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_get_auth_rule_schema.py b/indy_common/test/types/test_get_auth_rule_schema.py
index 06822eac3..6e1ed16e5 100644
--- a/indy_common/test/types/test_get_auth_rule_schema.py
+++ b/indy_common/test/types/test_get_auth_rule_schema.py
@@ -1,5 +1,7 @@
 from collections import OrderedDict
 
+import pytest
+
 from indy_common.types import ClientGetAuthRuleOperation, AuthRuleValueField
 from plenum.common.messages.fields import ConstantField, LimitedLengthStringField, ChooseField
 
@@ -13,17 +15,20 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientGetAuthRuleOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientGetAuthRuleOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
         assert isinstance(schema[field], validator)
 
 
+@pytest.mark.types
 def test_attrib_with_empty_enc_fails():
     validator = AuthRuleValueField()
     value = ''
diff --git a/indy_common/test/types/test_get_nym_schema.py b/indy_common/test/types/test_get_nym_schema.py
index fba4698d2..e4c44be10 100644
--- a/indy_common/test/types/test_get_nym_schema.py
+++ b/indy_common/test/types/test_get_nym_schema.py
@@ -10,11 +10,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientGetNymOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientGetNymOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_get_revoc_reg_def_schema.py b/indy_common/test/types/test_get_revoc_reg_def_schema.py
index 2c3be62b3..81ad816eb 100644
--- a/indy_common/test/types/test_get_revoc_reg_def_schema.py
+++ b/indy_common/test/types/test_get_revoc_reg_def_schema.py
@@ -1,4 +1,7 @@
 from collections import OrderedDict
+
+import pytest
+
 from indy_common.types import ClientGetRevocRegDefField
 from plenum.common.messages.fields import NonEmptyStringField, ConstantField
 from indy_common.constants import ID, TXN_TYPE, REVOC_TYPE
@@ -10,6 +13,7 @@
 ])
 
 
+@pytest.mark.types
 def test_get_revoc_reg_def_schema():
     actual_field_name = OrderedDict(ClientGetRevocRegDefField.schema).keys()
     assert EXPECTED_GET_REVOC_REG_DEF_FIELD.keys() == actual_field_name
diff --git a/indy_common/test/types/test_get_revoc_reg_delta_schema.py b/indy_common/test/types/test_get_revoc_reg_delta_schema.py
index c5c7daa26..3b2d0cd5a 100644
--- a/indy_common/test/types/test_get_revoc_reg_delta_schema.py
+++ b/indy_common/test/types/test_get_revoc_reg_delta_schema.py
@@ -1,4 +1,7 @@
 from collections import OrderedDict
+
+import pytest
+
 from indy_common.types import ClientGetRevocRegDeltaField
 from plenum.common.messages.fields import NonEmptyStringField, ConstantField, IntegerField
 from indy_common.constants import TXN_TYPE, REVOC_REG_DEF_ID, FROM, TO, GET_REVOC_REG_DELTA
@@ -12,6 +15,7 @@
 ])
 
 
+@pytest.mark.types
 def test_get_revoc_reg_def_schema():
     actual_field_name = OrderedDict(ClientGetRevocRegDeltaField.schema).keys()
     assert EXPECTED_GET_REVOC_REG_DELTA_FIELD.keys() == actual_field_name
diff --git a/indy_common/test/types/test_get_revoc_reg_entry_schema.py b/indy_common/test/types/test_get_revoc_reg_entry_schema.py
index dbcef1550..5302c5f7b 100644
--- a/indy_common/test/types/test_get_revoc_reg_entry_schema.py
+++ b/indy_common/test/types/test_get_revoc_reg_entry_schema.py
@@ -1,4 +1,7 @@
 from collections import OrderedDict
+
+import pytest
+
 from indy_common.types import ClientGetRevocRegField
 from plenum.common.messages.fields import NonEmptyStringField, ConstantField, IntegerField
 from indy_common.constants import TXN_TYPE, REVOC_REG_DEF_ID, TIMESTAMP, GET_REVOC_REG
@@ -11,6 +14,7 @@
 ])
 
 
+@pytest.mark.types
 def test_get_revoc_reg_def_schema():
     actual_field_name = OrderedDict(ClientGetRevocRegField.schema).keys()
     assert EXPECTED_GET_REVOC_REG_FIELD.keys() == actual_field_name
diff --git a/indy_common/test/types/test_get_rich_schema_object_by_id_schema.py b/indy_common/test/types/test_get_rich_schema_object_by_id_schema.py
index 87035f7d6..36c8d6b7e 100644
--- a/indy_common/test/types/test_get_rich_schema_object_by_id_schema.py
+++ b/indy_common/test/types/test_get_rich_schema_object_by_id_schema.py
@@ -1,5 +1,7 @@
 from collections import OrderedDict
 
+import pytest
+
 from indy_common.types import ClientGetRichSchemaObjectByIdOperation
 from plenum.common.messages.fields import ConstantField, NonEmptyStringField
 
@@ -9,11 +11,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientGetRichSchemaObjectByIdOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientGetRichSchemaObjectByIdOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_get_rich_schema_object_by_metadata_schema.py b/indy_common/test/types/test_get_rich_schema_object_by_metadata_schema.py
index a1919821c..6a9312a11 100644
--- a/indy_common/test/types/test_get_rich_schema_object_by_metadata_schema.py
+++ b/indy_common/test/types/test_get_rich_schema_object_by_metadata_schema.py
@@ -1,5 +1,7 @@
 from collections import OrderedDict
 
+import pytest
+
 from indy_common.types import ClientGetRichSchemaObjectByMetadataOperation
 from plenum.common.messages.fields import ConstantField, LimitedLengthStringField, VersionField, NonEmptyStringField
 
@@ -11,11 +13,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientGetRichSchemaObjectByMetadataOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientGetRichSchemaObjectByMetadataOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_get_schema_schema.py b/indy_common/test/types/test_get_schema_schema.py
index c79786948..0bcece633 100644
--- a/indy_common/test/types/test_get_schema_schema.py
+++ b/indy_common/test/types/test_get_schema_schema.py
@@ -1,5 +1,7 @@
 from collections import OrderedDict
 
+import pytest
+
 from indy_common.types import ClientGetSchemaOperation, GetSchemaField
 from plenum.common.messages.fields import ConstantField, IdentifierField, VersionField, LimitedLengthStringField
 
@@ -10,11 +12,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields_s():
     actual_field_names = OrderedDict(GetSchemaField.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS_SCHEMA.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators_s():
     schema = dict(GetSchemaField.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS_SCHEMA.items():
@@ -28,11 +32,13 @@ def test_has_expected_validators_s():
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientGetSchemaOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientGetSchemaOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_pool_config_schema.py b/indy_common/test/types/test_pool_config_schema.py
index a8a1dc394..2798a3af9 100644
--- a/indy_common/test/types/test_pool_config_schema.py
+++ b/indy_common/test/types/test_pool_config_schema.py
@@ -11,11 +11,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientPoolConfigOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientPoolConfigOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_pool_upg_schema.py b/indy_common/test/types/test_pool_upg_schema.py
index b92cb5491..9a0a90735 100644
--- a/indy_common/test/types/test_pool_upg_schema.py
+++ b/indy_common/test/types/test_pool_upg_schema.py
@@ -21,11 +21,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientPoolUpgradeOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientPoolUpgradeOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/types/test_revoc_def_entry_submit_schema.py b/indy_common/test/types/test_revoc_def_entry_submit_schema.py
index 2b2e72f29..95e91a827 100644
--- a/indy_common/test/types/test_revoc_def_entry_submit_schema.py
+++ b/indy_common/test/types/test_revoc_def_entry_submit_schema.py
@@ -1,4 +1,7 @@
 from collections import OrderedDict
+
+import pytest
+
 from indy_common.types import RevocRegEntryValueField, ClientRevocRegEntrySubmitField
 from plenum.common.messages.fields import NonEmptyStringField, IterableField, ConstantField, LimitedLengthStringField
 from indy_common.constants import REVOC_REG_DEF_ID, REVOC_TYPE, VALUE, PREV_ACCUM, \
@@ -20,24 +23,28 @@
 ])
 
 
+@pytest.mark.types
 def test_revoc_entry_value_has_expected_fields():
     actual_field_names = OrderedDict(
         RevocRegEntryValueField.schema).keys()
     assert actual_field_names == EXPECTED_REVOC_DEF_ENTRY_VALUE_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_revoc_entry_value_has_expected_validators():
     schema = dict(RevocRegEntryValueField.schema)
     for field, validator in EXPECTED_REVOC_DEF_ENTRY_VALUE_FIELDS.items():
         assert isinstance(schema[field], validator)
 
 
+@pytest.mark.types
 def test_client_revoc_entry_submit_has_expected_fields():
     actual_field_names = OrderedDict(
         ClientRevocRegEntrySubmitField.schema).keys()
     assert actual_field_names == EXPECTED_REVOC_DEF_ENTRY_SUBMIT_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_client_revoc_entry_submit_has_expected_validators():
     schema = dict(ClientRevocRegEntrySubmitField.schema)
     for field, validator in EXPECTED_REVOC_DEF_ENTRY_SUBMIT_FIELDS.items():
diff --git a/indy_common/test/types/test_revoc_def_submit_schema.py b/indy_common/test/types/test_revoc_def_submit_schema.py
index 10652d48b..74deb40d0 100644
--- a/indy_common/test/types/test_revoc_def_submit_schema.py
+++ b/indy_common/test/types/test_revoc_def_submit_schema.py
@@ -1,4 +1,7 @@
 from collections import OrderedDict
+
+import pytest
+
 from indy_common.types import RevocDefValueField, ClientRevocDefSubmitField
 from plenum.common.messages.fields import IntegerField, AnyMapField, NonEmptyStringField, ConstantField, ChooseField, \
     LimitedLengthStringField
@@ -24,24 +27,28 @@
 ])
 
 
+@pytest.mark.types
 def test_revoc_value_has_expected_fields():
     actual_field_names = OrderedDict(
         RevocDefValueField.schema).keys()
     assert actual_field_names == EXPECTED_REVOC_DEF_VALUE_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_revoc_value_has_expected_validators():
     schema = dict(RevocDefValueField.schema)
     for field, validator in EXPECTED_REVOC_DEF_VALUE_FIELDS.items():
         assert isinstance(schema[field], validator)
 
 
+@pytest.mark.types
 def test_client_submit_has_expected_fields():
     actual_field_names = OrderedDict(
         ClientRevocDefSubmitField.schema).keys()
     assert actual_field_names == EXPECTED_REVOC_DEF_SUBMIT_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_client_submit_has_expected_validators():
     schema = dict(ClientRevocDefSubmitField.schema)
     for field, validator in EXPECTED_REVOC_DEF_SUBMIT_FIELDS.items():
diff --git a/indy_common/test/types/test_rich_schema_object_schema.py b/indy_common/test/types/test_rich_schema_object_schema.py
index 89abcf2bd..4a8f5b118 100644
--- a/indy_common/test/types/test_rich_schema_object_schema.py
+++ b/indy_common/test/types/test_rich_schema_object_schema.py
@@ -18,6 +18,7 @@
 ])
 
 
+@pytest.mark.types
 @pytest.mark.parametrize('operation_class',
                          [ClientJsonLdContextOperation, ClientRichSchemaOperation, ClientRichSchemaEncodingOperation,
                           ClientRichSchemaMappingOperation,
@@ -28,6 +29,7 @@ def test_has_expected_fields(operation_class):
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 @pytest.mark.parametrize('operation_class, txn_type, rs_type',
                          [(ClientJsonLdContextOperation, "200", 'ctx'),
                           (ClientRichSchemaOperation, "201", 'sch'),
diff --git a/indy_common/test/types/test_schema_schema.py b/indy_common/test/types/test_schema_schema.py
index b57de5bb9..8ed64438d 100644
--- a/indy_common/test/types/test_schema_schema.py
+++ b/indy_common/test/types/test_schema_schema.py
@@ -1,5 +1,7 @@
 from collections import OrderedDict
 
+import pytest
+
 from indy_common.types import ClientSchemaOperation, SchemaField
 from plenum.common.messages.fields import ConstantField, VersionField, IterableField, LimitedLengthStringField
 
@@ -10,11 +12,13 @@
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields_s():
     actual_field_names = OrderedDict(SchemaField.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS_SCHEMA.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators_s():
     schema = dict(SchemaField.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS_SCHEMA.items():
@@ -27,11 +31,13 @@ def test_has_expected_validators_s():
 ])
 
 
+@pytest.mark.types
 def test_has_expected_fields():
     actual_field_names = OrderedDict(ClientSchemaOperation.schema).keys()
     assert actual_field_names == EXPECTED_ORDERED_FIELDS.keys()
 
 
+@pytest.mark.types
 def test_has_expected_validators():
     schema = dict(ClientSchemaOperation.schema)
     for field, validator in EXPECTED_ORDERED_FIELDS.items():
diff --git a/indy_common/test/version/test_node_version.py b/indy_common/test/version/test_node_version.py
index a61c68e2b..d2989e22f 100644
--- a/indy_common/test/version/test_node_version.py
+++ b/indy_common/test/version/test_node_version.py
@@ -12,6 +12,7 @@
 #  epoch
 #  local version
 #  parts num != 3
+@pytest.mark.version
 @pytest.mark.parametrize(
     'version',
     [
@@ -30,6 +31,7 @@ def test_node_version_invalid_value(version):
         NodeVersion(version)
 
 
+@pytest.mark.version
 @pytest.mark.parametrize(
     'version',
     [
@@ -42,12 +44,14 @@ def test_node_version_valid(version):
     NodeVersion(version)
 
 
+@pytest.mark.version
 def test_node_version_parts():
     assert NodeVersion('1.2.3.dev2').parts == (1, 2, 3, 'dev', 2)
     assert NodeVersion('1.2.3.rc3').parts == (1, 2, 3, 'rc', 3)
     assert NodeVersion('1.2.3').parts == (1, 2, 3, None, None)
 
 
+@pytest.mark.version
 def test_node_version_upstream():
     pv = NodeVersion('1.2.3')
     assert pv.upstream is pv
diff --git a/indy_common/test/version/test_node_version_fallback.py b/indy_common/test/version/test_node_version_fallback.py
index 5388a6483..47b084f61 100644
--- a/indy_common/test/version/test_node_version_fallback.py
+++ b/indy_common/test/version/test_node_version_fallback.py
@@ -5,16 +5,19 @@
 )
 
 
+@pytest.mark.version
 def test_node_version_fallback_str():
     version = '1.2.3'
     assert str(NodeVersionFallback(version)) == version
 
 
+@pytest.mark.version
 def test_node_version_fallback_repr():
     version = '1.2.3'
     assert (repr(NodeVersionFallback(version)) == "{}(version='{}')".format(NodeVersionFallback.__name__, version))
 
 
+@pytest.mark.version
 @pytest.mark.parametrize(
     'version',
     [
@@ -52,6 +55,7 @@ def test_node_version_fallback_init_invalid(version):
         NodeVersionFallback(version)
 
 
+@pytest.mark.version
 @pytest.mark.parametrize(
     'version',
     [
@@ -68,12 +72,14 @@ def test_node_version_fallback_init_valid(version):
     NodeVersionFallback(version)
 
 
+@pytest.mark.version
 def test_sem_ver_base_api():
     assert NodeVersionFallback('1.2.3').major == 1
     assert NodeVersionFallback('1.2.3').minor == 2
     assert NodeVersionFallback('1.2.3').patch == 3
 
 
+@pytest.mark.version
 def test_node_version_fallback_comparison_operators():
     with pytest.raises(TypeError):
         assert NodeVersionFallback('1.2.2') < NodeVersionFallback('1.2.3')
@@ -92,11 +98,13 @@ def test_node_version_fallback_comparison_operators():
     assert NodeVersionFallback('1.2.2') != NodeVersionFallback('1.2.3')
 
 
+@pytest.mark.version
 def test_node_version_fallback_upstream():
     pv = NodeVersionFallback('1.2.3')
     assert pv.upstream is pv
 
 
+@pytest.mark.version
 def test_node_version_fallback_public():
     assert NodeVersionFallback('1.2.3.dev0').parts == (1, 2, 3, 'dev', 0)
     assert NodeVersionFallback('1.2.3.dev2').parts == (1, 2, 3, 'dev', 2)
@@ -105,12 +113,14 @@ def test_node_version_fallback_public():
     assert NodeVersionFallback('1.2.3').parts == (1, 2, 3, None, None)
 
 
+@pytest.mark.version
 def test_node_version_fallback_parts():
     assert NodeVersionFallback('1.2.3.dev2').parts == (1, 2, 3, 'dev', 2)
     assert NodeVersionFallback('1.2.3.rc3').parts == (1, 2, 3, 'rc', 3)
     assert NodeVersionFallback('1.2.3').parts == (1, 2, 3, None, None)
 
 
+@pytest.mark.version
 @pytest.mark.parametrize(
     'version',
     [
diff --git a/indy_common/test/version/test_version.py b/indy_common/test/version/test_version.py
index faeb4ea9c..b4dbb4895 100644
--- a/indy_common/test/version/test_version.py
+++ b/indy_common/test/version/test_version.py
@@ -8,6 +8,7 @@
 )
 
 
+@pytest.mark.version
 def test_schema_version():
     for version in ['', '1', '1.2.3.4', '1.2.a']:
         with pytest.raises(InvalidVersionError):
@@ -16,6 +17,7 @@ def test_schema_version():
     SchemaVersion('1.2.3')
 
 
+@pytest.mark.version
 def test_top_package_default_version():
     for version in ['', '1', '1.2.3.4', '1.2.a']:
         with pytest.raises(InvalidVersionError):
@@ -24,6 +26,7 @@ def test_top_package_default_version():
     TopPkgDefVersion('1.2.3')
 
 
+@pytest.mark.version
 def test_src_version_cls():
     assert src_version_cls() == NodeVersion
     assert src_version_cls(APP_NAME) == NodeVersion
diff --git a/indy_node/test/anon_creds/conftest.py b/indy_node/test/anon_creds/conftest.py
index ddfeb37dc..bd4326c77 100644
--- a/indy_node/test/anon_creds/conftest.py
+++ b/indy_node/test/anon_creds/conftest.py
@@ -373,4 +373,4 @@ def send_revoc_reg_entry_by_demand(looper,
 @pytest.fixture(scope="module")
 def create_node_and_not_start(create_node_and_not_start):
     create_node_and_not_start.bootstrapper.upload_states()
-    return create_node_and_not_start
\ No newline at end of file
+    return create_node_and_not_start
diff --git a/indy_node/test/anon_creds/test_get_revoc_reg_def_send.py b/indy_node/test/anon_creds/test_get_revoc_reg_def_send.py
index 827c35fe0..63f01341d 100644
--- a/indy_node/test/anon_creds/test_get_revoc_reg_def_send.py
+++ b/indy_node/test/anon_creds/test_get_revoc_reg_def_send.py
@@ -1,3 +1,4 @@
+import pytest
 import json
 import time
 from indy_common.constants import CRED_DEF_ID, ID, REVOC_TYPE, TAG, GET_REVOC_REG_DEF, VALUE, MAX_CRED_NUM, TXN_TYPE
@@ -15,6 +16,7 @@ def compare_request_reply(req, reply):
     assert req['operation'][VALUE] == reply['result']['data'][VALUE]
 
 
+@pytest.mark.anon_creds
 def test_send_get_revoc_reg_def(looper,
                                 txnPoolNodeSet,
                                 sdk_wallet_steward,
@@ -42,6 +44,7 @@ def test_send_get_revoc_reg_def(looper,
     compare_request_reply(revoc_req, reply)
 
 
+@pytest.mark.anon_creds
 def test_get_revoc_reg_def_from_uncommited(looper,
                                            txnPoolNodeSet,
                                            sdk_wallet_steward,
diff --git a/indy_node/test/anon_creds/test_get_revoc_reg_delta_send_by_default.py b/indy_node/test/anon_creds/test_get_revoc_reg_delta_send_by_default.py
index 8f69eb35d..936a053df 100644
--- a/indy_node/test/anon_creds/test_get_revoc_reg_delta_send_by_default.py
+++ b/indy_node/test/anon_creds/test_get_revoc_reg_delta_send_by_default.py
@@ -1,3 +1,4 @@
+import pytest
 import json
 import copy
 
@@ -12,6 +13,7 @@
 from plenum.common.util import randomString
 
 
+@pytest.mark.anon_creds
 def test_send_with_wrong_rev_reg_id_default(looper, txnPoolNodeSet,
                                             sdk_pool_handle,
                                             send_revoc_reg_entry_by_default,
@@ -27,6 +29,7 @@ def test_send_with_wrong_rev_reg_id_default(looper, txnPoolNodeSet,
     assert reply['result'][DATA] is None
 
 
+@pytest.mark.anon_creds
 def test_send_with_only_to_by_default(looper,
                             txnPoolNodeSet,
                             sdk_pool_handle,
@@ -44,6 +47,7 @@ def test_send_with_only_to_by_default(looper,
     assert rev_entry_req['operation'][VALUE][REVOKED] == reply['result'][DATA][VALUE][REVOKED]
 
 
+@pytest.mark.anon_creds
 def test_send_earlier_then_first_entry_by_default(
         looper,
         txnPoolNodeSet,
@@ -63,6 +67,7 @@ def test_send_earlier_then_first_entry_by_default(
     assert reply['result'][TXN_TIME] is None
 
 
+@pytest.mark.anon_creds
 def test_send_with_from_by_default(looper,
         txnPoolNodeSet,
         sdk_pool_handle,
diff --git a/indy_node/test/anon_creds/test_get_revoc_reg_delta_send_by_demand.py b/indy_node/test/anon_creds/test_get_revoc_reg_delta_send_by_demand.py
index 4d777e952..481332798 100644
--- a/indy_node/test/anon_creds/test_get_revoc_reg_delta_send_by_demand.py
+++ b/indy_node/test/anon_creds/test_get_revoc_reg_delta_send_by_demand.py
@@ -1,3 +1,4 @@
+import pytest
 import json
 import copy
 
@@ -12,6 +13,7 @@
 from plenum.common.util import randomString
 
 
+@pytest.mark.anon_creds
 def test_send_with_only_to_by_demand(looper,
                             txnPoolNodeSet,
                             sdk_pool_handle,
@@ -29,6 +31,7 @@ def test_send_with_only_to_by_demand(looper,
     assert rev_entry_req['operation'][VALUE][ISSUED] == reply['result'][DATA][VALUE][ISSUED]
 
 
+@pytest.mark.anon_creds
 def test_send_earlier_then_first_entry_by_demand(
         looper,
         txnPoolNodeSet,
@@ -48,6 +51,7 @@ def test_send_earlier_then_first_entry_by_demand(
     assert reply['result'][TXN_TIME] is None
 
 
+@pytest.mark.anon_creds
 def test_send_with_from_by_demand(looper,
         txnPoolNodeSet,
         sdk_pool_handle,
diff --git a/indy_node/test/anon_creds/test_get_revoc_reg_delta_unit.py b/indy_node/test/anon_creds/test_get_revoc_reg_delta_unit.py
index e0e5742b3..853308c76 100644
--- a/indy_node/test/anon_creds/test_get_revoc_reg_delta_unit.py
+++ b/indy_node/test/anon_creds/test_get_revoc_reg_delta_unit.py
@@ -65,6 +65,7 @@ def reg_entry_with_other_reg_id(looper,
     return txn
 
 
+@pytest.mark.anon_creds
 def test_get_delta_with_other_reg_def_in_state(looper,
                                                create_node_and_not_start,
                                                reg_entry_with_other_reg_id,
diff --git a/indy_node/test/anon_creds/test_get_revoc_reg_delta_validation.py b/indy_node/test/anon_creds/test_get_revoc_reg_delta_validation.py
index 73f52b4aa..e162f5ad9 100644
--- a/indy_node/test/anon_creds/test_get_revoc_reg_delta_validation.py
+++ b/indy_node/test/anon_creds/test_get_revoc_reg_delta_validation.py
@@ -9,6 +9,7 @@
 from plenum.common.exceptions import InvalidClientRequest
 
 
+@pytest.mark.anon_creds
 def test_revoc_reg_delta_schema_validation_wrong_type(looper, sdk_wallet_steward):
     req = build_get_revoc_reg_delta(looper, sdk_wallet_steward)
     req['operation'][FROM] = "10"
@@ -16,6 +17,7 @@ def test_revoc_reg_delta_schema_validation_wrong_type(looper, sdk_wallet_steward
         SafeRequest(**req)
 
 
+@pytest.mark.anon_creds
 def test_revoc_reg_delta_schema_validation_missed_fields(looper, sdk_wallet_steward):
     req = build_get_revoc_reg_delta(looper, sdk_wallet_steward)
     del req['operation'][REVOC_REG_DEF_ID]
@@ -23,6 +25,7 @@ def test_revoc_reg_delta_schema_validation_missed_fields(looper, sdk_wallet_stew
         SafeRequest(**req)
 
 
+@pytest.mark.anon_creds
 def test_revoc_reg_delta_from_greater_then_to(create_node_and_not_start,
                                               looper, sdk_wallet_steward):
     node = create_node_and_not_start
diff --git a/indy_node/test/anon_creds/test_get_revoc_reg_delta_with_none_results.py b/indy_node/test/anon_creds/test_get_revoc_reg_delta_with_none_results.py
index daa71a1e8..03081c9fa 100644
--- a/indy_node/test/anon_creds/test_get_revoc_reg_delta_with_none_results.py
+++ b/indy_node/test/anon_creds/test_get_revoc_reg_delta_with_none_results.py
@@ -1,3 +1,4 @@
+import pytest
 import copy
 import json
 
@@ -11,6 +12,7 @@
 from plenum.test.helper import sdk_send_and_check
 
 
+@pytest.mark.anon_creds
 def test_send_reg_def_and_get_delta_then(
         looper,
         txnPoolNodeSet,
diff --git a/indy_node/test/anon_creds/test_get_revoc_reg_entry.py b/indy_node/test/anon_creds/test_get_revoc_reg_entry.py
index 72de01b8e..055e5b09e 100644
--- a/indy_node/test/anon_creds/test_get_revoc_reg_entry.py
+++ b/indy_node/test/anon_creds/test_get_revoc_reg_entry.py
@@ -1,3 +1,4 @@
+import pytest
 import time
 
 from indy_common.constants import TIMESTAMP
@@ -7,11 +8,13 @@
 from plenum.common.types import f, OPERATION
 
 
+@pytest.mark.anon_creds
 def test_validate_get_revoc_reg_entry(looper, sdk_wallet_steward):
     req = build_get_revoc_reg_entry(looper, sdk_wallet_steward)
     SafeRequest(**req)
 
 
+@pytest.mark.anon_creds
 def test_get_revoc_reg_entry_without_any_rev_entry(send_revoc_reg_def_by_default,
                                                    looper, sdk_wallet_steward,
                                                    txnPoolNodeSet):
diff --git a/indy_node/test/anon_creds/test_get_revoc_reg_send.py b/indy_node/test/anon_creds/test_get_revoc_reg_send.py
index c1ad7a197..03ddc9417 100644
--- a/indy_node/test/anon_creds/test_get_revoc_reg_send.py
+++ b/indy_node/test/anon_creds/test_get_revoc_reg_send.py
@@ -1,3 +1,4 @@
+import pytest
 import json
 import copy
 
@@ -9,6 +10,7 @@
 from plenum.common.types import f
 
 
+@pytest.mark.anon_creds
 def test_send_get_revoc_reg_later_then_first_entry(looper,
                             txnPoolNodeSet,
                             sdk_pool_handle,
@@ -24,6 +26,7 @@ def test_send_get_revoc_reg_later_then_first_entry(looper,
     assert rev_entry_req['operation'][VALUE][ACCUM] == reply['result']['data'][VALUE][ACCUM]
 
 
+@pytest.mark.anon_creds
 def test_send_get_revoc_reg_earlier_then_first_entry(
         looper,
         txnPoolNodeSet,
diff --git a/indy_node/test/anon_creds/test_incorrect_revoc_reg_def.py b/indy_node/test/anon_creds/test_incorrect_revoc_reg_def.py
index 8104efe84..95623b0f3 100644
--- a/indy_node/test/anon_creds/test_incorrect_revoc_reg_def.py
+++ b/indy_node/test/anon_creds/test_incorrect_revoc_reg_def.py
@@ -10,6 +10,7 @@
 from plenum.test.helper import sdk_sign_request_from_dict, sdk_send_and_check
 
 
+@pytest.mark.anon_creds
 def test_incorrect_revoc_reg_def(looper,
                                   txnPoolNodeSet,
                                   sdk_wallet_steward,
diff --git a/indy_node/test/anon_creds/test_integration_get_revoc_delta.py b/indy_node/test/anon_creds/test_integration_get_revoc_delta.py
index 00e0bd1a6..c748470bb 100644
--- a/indy_node/test/anon_creds/test_integration_get_revoc_delta.py
+++ b/indy_node/test/anon_creds/test_integration_get_revoc_delta.py
@@ -9,6 +9,7 @@
 from indy_node.test.state_proof.conftest import nodeSetWithOneNodeResponding
 
 
+@pytest.mark.anon_creds
 def test_state_proof_returned_for_get_revoc_reg_delta(looper,
                                                       nodeSetWithOneNodeResponding,
                                                       sdk_wallet_steward,
diff --git a/indy_node/test/anon_creds/test_revoc_def_send.py b/indy_node/test/anon_creds/test_revoc_def_send.py
index f4aa8b637..9d6a1c1d0 100644
--- a/indy_node/test/anon_creds/test_revoc_def_send.py
+++ b/indy_node/test/anon_creds/test_revoc_def_send.py
@@ -1,3 +1,4 @@
+import pytest
 import json
 
 from indy_common.constants import CRED_DEF_ID, CLAIM_DEF_SCHEMA_REF, CLAIM_DEF_SIGNATURE_TYPE, CLAIM_DEF_TAG
@@ -6,6 +7,7 @@
 from plenum.test.helper import sdk_sign_request_from_dict
 
 
+@pytest.mark.anon_creds
 def test_send_revoc_reg_def(looper,
                             txnPoolNodeSet,
                             sdk_wallet_steward,
diff --git a/indy_node/test/anon_creds/test_revoc_def_static_validation.py b/indy_node/test/anon_creds/test_revoc_def_static_validation.py
index 8761ab49e..75c77425c 100644
--- a/indy_node/test/anon_creds/test_revoc_def_static_validation.py
+++ b/indy_node/test/anon_creds/test_revoc_def_static_validation.py
@@ -43,6 +43,7 @@ def revoc_def_req(looper,
     return _expected, sdk_sign_request_from_dict(looper, sdk_wallet_steward, _req['operation'])
 
 
+@pytest.mark.anon_creds
 def test_revoc_def_static_validation_on_field_size(revoc_def_req,
                                                    looper,
                                                    txnPoolNodeSet,
diff --git a/indy_node/test/anon_creds/test_revoc_def_validation.py b/indy_node/test/anon_creds/test_revoc_def_validation.py
index 3f3b0167b..2bebf555c 100644
--- a/indy_node/test/anon_creds/test_revoc_def_validation.py
+++ b/indy_node/test/anon_creds/test_revoc_def_validation.py
@@ -7,6 +7,7 @@
 from plenum.common.util import randomString
 
 
+@pytest.mark.anon_creds
 def test_validation_cred_def_not_present(build_revoc_def_by_default,
                                          create_node_and_not_start):
     node = create_node_and_not_start
@@ -15,6 +16,7 @@ def test_validation_cred_def_not_present(build_revoc_def_by_default,
         node.write_manager.dynamic_validation(Request(**req), 0)
 
 
+@pytest.mark.anon_creds
 def test_invalid_cred_def_id_format(build_revoc_def_by_default,
                                     create_node_and_not_start):
     node = create_node_and_not_start
diff --git a/indy_node/test/anon_creds/test_revoc_entry_static_validation.py b/indy_node/test/anon_creds/test_revoc_entry_static_validation.py
index b4b8b3828..3559d8382 100644
--- a/indy_node/test/anon_creds/test_revoc_entry_static_validation.py
+++ b/indy_node/test/anon_creds/test_revoc_entry_static_validation.py
@@ -59,6 +59,7 @@ def revoc_entry(looper,
     return _expected, sdk_sign_request_from_dict(looper, sdk_wallet_steward, _req)
 
 
+@pytest.mark.anon_creds
 def test_revoc_entry_static_validation_on_size(revoc_entry,
                                                looper,
                                                txnPoolNodeSet,
diff --git a/indy_node/test/anon_creds/test_revoc_reg_entry_validation.py b/indy_node/test/anon_creds/test_revoc_reg_entry_validation.py
index 7c9ebfd7a..639dd44ca 100644
--- a/indy_node/test/anon_creds/test_revoc_reg_entry_validation.py
+++ b/indy_node/test/anon_creds/test_revoc_reg_entry_validation.py
@@ -9,6 +9,7 @@
 from plenum.common.util import randomString
 
 
+@pytest.mark.anon_creds
 def test_validation_with_prev_accum_but_empty_ledger(
         build_txn_for_revoc_def_entry_by_default,
         create_node_and_not_start):
@@ -20,6 +21,7 @@ def test_validation_with_prev_accum_but_empty_ledger(
         node.write_manager.dynamic_validation(Request(**req_entry), 0)
 
 
+@pytest.mark.anon_creds
 def test_validation_with_right_accums_but_empty_indices(
         build_txn_for_revoc_def_entry_by_default,
         create_node_and_not_start):
@@ -34,6 +36,7 @@ def test_validation_with_right_accums_but_empty_indices(
         node.write_manager.dynamic_validation(Request(**req_entry), 0)
 
 
+@pytest.mark.anon_creds
 def test_validation_with_unexpected_accum(
         build_txn_for_revoc_def_entry_by_default,
         create_node_and_not_start):
@@ -44,6 +47,7 @@ def test_validation_with_unexpected_accum(
         node.write_manager.dynamic_validation(Request(**req_entry), 0)
 
 
+@pytest.mark.anon_creds
 def test_validation_with_same_revoked_by_default(
         build_txn_for_revoc_def_entry_by_default,
         create_node_and_not_start):
@@ -57,6 +61,7 @@ def test_validation_with_same_revoked_by_default(
         node.write_manager.dynamic_validation(Request(**req_entry), 0)
 
 
+@pytest.mark.anon_creds
 def test_validation_with_issued_no_revoked_before_by_default(
         build_txn_for_revoc_def_entry_by_default,
         create_node_and_not_start):
@@ -72,6 +77,7 @@ def test_validation_with_issued_no_revoked_before_by_default(
         node.write_manager.dynamic_validation(Request(**req_entry), 0)
 
 
+@pytest.mark.anon_creds
 def test_validation_with_same_issued_by_demand(
         build_txn_for_revoc_def_entry_by_demand,
         create_node_and_not_start):
@@ -86,6 +92,7 @@ def test_validation_with_same_issued_by_demand(
         node.write_manager.dynamic_validation(Request(**req_entry), 0)
 
 
+@pytest.mark.anon_creds
 def test_validation_with_revoked_no_issued_before_by_demand(
         build_txn_for_revoc_def_entry_by_demand,
         create_node_and_not_start):
@@ -100,6 +107,7 @@ def test_validation_with_revoked_no_issued_before_by_demand(
         node.write_manager.dynamic_validation(Request(**req_entry), 0)
 
 
+@pytest.mark.anon_creds
 def test_validation_if_issued_revoked_has_same_index(
         build_txn_for_revoc_def_entry_by_default,
         create_node_and_not_start):
@@ -111,6 +119,7 @@ def test_validation_if_issued_revoked_has_same_index(
         node.write_manager.dynamic_validation(Request(**req_entry), 0)
 
 
+@pytest.mark.anon_creds
 def test_validation_if_revoc_def_does_not_exist(
         build_txn_for_revoc_def_entry_by_default,
         create_node_and_not_start):
@@ -126,6 +135,7 @@ def test_validation_if_revoc_def_does_not_exist(
         node.write_manager.dynamic_validation(Request(**req_entry), 0)
 
 
+@pytest.mark.anon_creds
 def test_validation_with_equal_accums_but_not_empty_indices(
         build_txn_for_revoc_def_entry_by_default,
         create_node_and_not_start):
diff --git a/indy_node/test/anon_creds/test_state_proof_for_get_request.py b/indy_node/test/anon_creds/test_state_proof_for_get_request.py
index 5971fda7e..cbe764f20 100644
--- a/indy_node/test/anon_creds/test_state_proof_for_get_request.py
+++ b/indy_node/test/anon_creds/test_state_proof_for_get_request.py
@@ -1,3 +1,4 @@
+import pytest
 import json
 import copy
 from indy_common.constants import CRED_DEF_ID, ID, REVOC_TYPE, TAG, GET_REVOC_REG_DEF, \
@@ -13,6 +14,7 @@
 from plenum.common.util import get_utc_epoch
 
 
+@pytest.mark.anon_creds
 def test_state_proof_returned_for_get_revoc_reg_def(looper,
                                                     txnPoolNodeSet,
                                                     sdk_wallet_steward,
@@ -39,6 +41,7 @@ def test_state_proof_returned_for_get_revoc_reg_def(looper,
     check_valid_proof(reply)
 
 
+@pytest.mark.anon_creds
 def test_state_proof_returned_for_get_revoc_reg(looper,
                                                 txnPoolNodeSet,
                                                 sdk_pool_handle,
@@ -53,6 +56,7 @@ def test_state_proof_returned_for_get_revoc_reg(looper,
     check_valid_proof(reply)
 
 
+@pytest.mark.anon_creds
 def test_state_proof_returned_for_get_revoc_reg_delta(looper,
                                                       txnPoolNodeSet,
                                                       sdk_pool_handle,
@@ -95,6 +99,7 @@ def test_state_proof_returned_for_get_revoc_reg_delta(looper,
     check_valid_proof(reply)
 
 
+@pytest.mark.anon_creds
 def test_state_proof_returned_for_get_revoc_reg_delta_with_only_to(
                                                       looper,
                                                       txnPoolNodeSet,
@@ -111,6 +116,7 @@ def test_state_proof_returned_for_get_revoc_reg_delta_with_only_to(
     check_valid_proof(reply)
 
 
+@pytest.mark.anon_creds
 def test_state_proof_returned_for_delta_with_None_reply(
                                                       looper,
                                                       txnPoolNodeSet,
@@ -127,6 +133,7 @@ def test_state_proof_returned_for_delta_with_None_reply(
     assert STATE_PROOF not in reply['result']
 
 
+@pytest.mark.anon_creds
 def test_state_proof_returned_for_delta_with_from_earlier(
                                                       looper,
                                                       txnPoolNodeSet,
diff --git a/indy_node/test/api/test_attrib_reply.py b/indy_node/test/api/test_attrib_reply.py
index 1af7ccb09..1a518a0b4 100644
--- a/indy_node/test/api/test_attrib_reply.py
+++ b/indy_node/test/api/test_attrib_reply.py
@@ -1,5 +1,6 @@
 import json
 
+import pytest
 from indy.ledger import build_attrib_request
 from indy_node.test.api.helper import validate_write_reply, validate_attrib_txn
 from plenum.test.helper import sdk_get_reply, sdk_sign_and_submit_req
@@ -12,6 +13,7 @@ def execute_attrib_txn(looper, sdk_pool_handle, sdk_wallet_steward, xhash, raw,
     return sdk_get_reply(looper, sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_steward, request))[1]
 
 
+@pytest.mark.api
 def test_attrib_xhash_reply_is_valid(looper, sdk_pool_handle, sdk_wallet_steward):
     xhash = sha256("Hello, world".encode()).hexdigest()
     reply = execute_attrib_txn(looper, sdk_pool_handle, sdk_wallet_steward, xhash, None, None)
@@ -21,6 +23,7 @@ def test_attrib_xhash_reply_is_valid(looper, sdk_pool_handle, sdk_wallet_steward
     assert reply['result']['txn']['data']['hash'] == xhash
 
 
+@pytest.mark.api
 def test_attrib_raw_reply_is_valid(looper, sdk_pool_handle, sdk_wallet_steward):
     raw = json.dumps({'answer': 42})
     reply = execute_attrib_txn(looper, sdk_pool_handle, sdk_wallet_steward, None, raw, None)
@@ -30,6 +33,7 @@ def test_attrib_raw_reply_is_valid(looper, sdk_pool_handle, sdk_wallet_steward):
     assert json.loads(reply['result']['txn']['data']['raw']) == json.loads(raw)
 
 
+@pytest.mark.api
 def test_attrib_enc_reply_is_valid(looper, sdk_pool_handle, sdk_wallet_steward):
     enc = "amgine"
     reply = execute_attrib_txn(looper, sdk_pool_handle, sdk_wallet_steward, None, None, enc)
diff --git a/indy_node/test/api/test_claim_def_reply.py b/indy_node/test/api/test_claim_def_reply.py
index 35153e513..0f2684a37 100644
--- a/indy_node/test/api/test_claim_def_reply.py
+++ b/indy_node/test/api/test_claim_def_reply.py
@@ -1,11 +1,13 @@
 import json
 
+import pytest
 from indy.anoncreds import issuer_create_and_store_credential_def
 from indy.ledger import build_cred_def_request, build_get_schema_request, parse_get_schema_response
 from indy_node.test.api.helper import validate_write_reply, validate_claim_def_txn, sdk_write_schema
 from plenum.test.helper import sdk_get_reply, sdk_sign_and_submit_req
 
 
+@pytest.mark.api
 def test_claim_def_reply_is_valid(looper, sdk_pool_handle, sdk_wallet_steward):
     wallet_handle, identifier = sdk_wallet_steward
 
diff --git a/indy_node/test/api/test_nym_reply.py b/indy_node/test/api/test_nym_reply.py
index b04063b97..e42ce369b 100644
--- a/indy_node/test/api/test_nym_reply.py
+++ b/indy_node/test/api/test_nym_reply.py
@@ -1,9 +1,11 @@
+import pytest
 from indy.ledger import build_nym_request
 from indy_node.test.helper import createHalfKeyIdentifierAndAbbrevVerkey
 from indy_node.test.api.helper import validate_write_reply, validate_nym_txn
 from plenum.test.helper import sdk_get_reply, sdk_sign_and_submit_req
 
 
+@pytest.mark.api
 def test_nym_reply_is_valid(looper, sdk_pool_handle, sdk_wallet_steward):
     idr, verkey = createHalfKeyIdentifierAndAbbrevVerkey()
 
diff --git a/indy_node/test/api/test_rich_schema_objects_reply.py b/indy_node/test/api/test_rich_schema_objects_reply.py
index b16266d99..0b5581580 100644
--- a/indy_node/test/api/test_rich_schema_objects_reply.py
+++ b/indy_node/test/api/test_rich_schema_objects_reply.py
@@ -22,6 +22,7 @@ def tconf(tconf):
 # The order of creation is essential as some rich schema object reference others by ID
 # Encoding's id must be equal to the one used in RICH_SCHEMA_MAPPING_EX1
 
+@pytest.mark.api
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id',
                          [(JSON_LD_CONTEXT, RS_CONTEXT_TYPE_VALUE, W3C_BASE_CONTEXT, randomString()),
                           (RICH_SCHEMA, RS_SCHEMA_TYPE_VALUE, RICH_SCHEMA_EX1, RICH_SCHEMA_EX1['@id']),
diff --git a/indy_node/test/api/test_schema_reply.py b/indy_node/test/api/test_schema_reply.py
index 8db13ce2a..9c3046a88 100644
--- a/indy_node/test/api/test_schema_reply.py
+++ b/indy_node/test/api/test_schema_reply.py
@@ -1,6 +1,9 @@
+import pytest
+
 from indy_node.test.api.helper import validate_write_reply, validate_schema_txn, sdk_write_schema
 
 
+@pytest.mark.api
 def test_schema_reply_is_valid(looper, sdk_pool_handle, sdk_wallet_steward):
     _, reply = sdk_write_schema(looper, sdk_pool_handle, sdk_wallet_steward)
     validate_write_reply(reply)
diff --git a/indy_node/test/attrib_txn/test_attrib_txn_digest.py b/indy_node/test/attrib_txn/test_attrib_txn_digest.py
index 7332f499b..42d2e9163 100644
--- a/indy_node/test/attrib_txn/test_attrib_txn_digest.py
+++ b/indy_node/test/attrib_txn/test_attrib_txn_digest.py
@@ -26,21 +26,25 @@ def req(req_json, looper, sdk_wallet_steward):
     return Request(**json.loads(req_signed))
 
 
+@pytest.mark.attrib_txn
 def test_attrib_txn_payload_digest_req_json(req_json, req):
     txn = reqToTxn(req_json)
     assert get_payload_digest(txn) == req.payload_digest
 
 
+@pytest.mark.attrib_txn
 def test_attrib_txn_digest_req_dict(req):
     txn = reqToTxn(req.as_dict)
     assert get_digest(txn) == req.digest
 
 
+@pytest.mark.attrib_txn
 def test_attrib_txn_digest_req_instance(req):
     txn = reqToTxn(req)
     assert get_digest(txn) == req.digest
 
 
+@pytest.mark.attrib_txn
 def test_attrib_txn_different_payload(req_json):
     req_json = json.loads(req_json)
     n_req = Request(**req_json)
diff --git a/indy_node/test/attrib_txn/test_n_minus_f_pool_processes_attrib.py b/indy_node/test/attrib_txn/test_n_minus_f_pool_processes_attrib.py
index cadf4fb39..95cf217ea 100644
--- a/indy_node/test/attrib_txn/test_n_minus_f_pool_processes_attrib.py
+++ b/indy_node/test/attrib_txn/test_n_minus_f_pool_processes_attrib.py
@@ -1,7 +1,9 @@
+import pytest
 from plenum.test.test_node import ensure_node_disconnected, getNonPrimaryReplicas
 from indy_node.test.helper import sdk_add_raw_attribute
 
 
+@pytest.mark.attrib_txn
 def test_n_minus_f_pool_processes_attrib(looper, nodeSet,
                                          sdk_pool_handle,
                                          sdk_wallet_steward):
diff --git a/indy_node/test/attrib_txn/test_nym_attrib.py b/indy_node/test/attrib_txn/test_nym_attrib.py
index 7dbeeca20..1379ea4e3 100644
--- a/indy_node/test/attrib_txn/test_nym_attrib.py
+++ b/indy_node/test/attrib_txn/test_nym_attrib.py
@@ -61,11 +61,13 @@ def whitelistextras(*msg):
     [whitelistArray.remove(m) for m, _in in ins.items() if not _in]
 
 
-def testEndorserAddsAttributeForUser(sdk_added_raw_attribute):
+@pytest.mark.attrib_txn
+def test_endorser_adds_attribute_for_user(sdk_added_raw_attribute):
     pass
 
 
-def testEndorserGetAttrsForUser(looper,
+@pytest.mark.attrib_txn
+def test_endorser_get_attrs_for_user(looper,
                                    sdk_user_wallet_a,
                                    sdk_wallet_endorser,
                                    sdk_pool_handle,
@@ -76,6 +78,7 @@ def testEndorserGetAttrsForUser(looper,
                                 sdk_wallet_endorser, dest, attributeName)
 
 
+@pytest.mark.attrib_txn
 def test_edit_attrib(sdk_pool_handle, sdk_user_wallet_a,
                      sdk_wallet_endorser, attributeData, looper, attributeName):
     _, did_cl = sdk_user_wallet_a
@@ -97,6 +100,7 @@ def test_edit_attrib(sdk_pool_handle, sdk_user_wallet_a,
         json.loads(data.replace(' ', '')))
 
 
+@pytest.mark.attrib_txn
 def test_non_endorser_cannot_add_attribute_for_user(
         looper,
         nodeSet,
@@ -112,7 +116,8 @@ def test_non_endorser_cannot_add_attribute_for_user(
     e.match('can not touch raw field since only the owner can modify it')
 
 
-def testOnlyUsersEndorserCanAddAttribute(
+@pytest.mark.attrib_txn
+def test_only_users_endorser_can_add_attribute(
         nodeSet,
         looper,
         attributeData,
@@ -128,7 +133,8 @@ def testOnlyUsersEndorserCanAddAttribute(
     e.match('can not touch raw field since only the owner can modify it')
 
 
-def testStewardCannotAddUsersAttribute(
+@pytest.mark.attrib_txn
+def test_steward_cannot_add_users_attribute(
         nodeSet,
         looper,
         attributeData,
@@ -146,7 +152,8 @@ def testStewardCannotAddUsersAttribute(
 
 # TODO: Ask Jason, if getting the latest attribute makes sense since in case
 # of encrypted and hashed attributes, there is no name.
-def testLatestAttrIsReceived(
+@pytest.mark.attrib_txn
+def test_latest_attr_is_received(
         looper,
         nodeSet,
         sdk_wallet_endorser,
@@ -174,6 +181,7 @@ def reply_equality_of_get_attribute(reply, value):
     assert json.loads(result['data'])[result['raw']] == value
 
 
+@pytest.mark.attrib_txn
 def test_user_add_attrs_for_herself_and_get_it(
         looper,
         nodeSet,
@@ -217,7 +225,7 @@ def test_attr_with_no_dest_added(nodeSet, looper, attributeData):
 
 
 @pytest.mark.skip(reason="SOV-561. Test not implemented")
-def testGetTxnsNoSeqNo():
+def test_get_txns_no_seq_no():
     """
     Test GET_TXNS from client and do not provide any seqNo to fetch from
     """
@@ -226,7 +234,7 @@ def testGetTxnsNoSeqNo():
 
 @pytest.mark.skip(reason="SOV-560. Come back to it later since "
                          "requestPendingTxns move to wallet")
-def testGetTxnsSeqNo(nodeSet, endorserWallet, looper):
+def test_get_txns_seq_no(nodeSet, endorserWallet, looper):
     pass
     """
     Test GET_TXNS from client and provide seqNo to fetch from
@@ -243,12 +251,12 @@ def testGetTxnsSeqNo(nodeSet, endorserWallet, looper):
 
 
 @pytest.mark.skip(reason="SOV-560. Attribute encryption is done in client")
-def testEndorserAddedAttributeIsEncrypted(addedEncryptedAttribute):
+def test_endorser_added_attribute_is_encrypted(addedEncryptedAttribute):
     pass
 
 
 @pytest.mark.skip(reason="SOV-560. Attribute Disclosure is not done for now")
-def testEndorserDisclosesEncryptedAttribute(
+def test_endorser_discloses_encrypted_attribute(
         addedEncryptedAttribute,
         symEncData,
         looper,
@@ -274,7 +282,7 @@ def testEndorserDisclosesEncryptedAttribute(
 
 
 @pytest.mark.skip(reason="SOV-561. Pending implementation")
-def testEndorserAddedAttributeCanBeChanged(sdk_added_raw_attribute):
+def test_endorser_added_attribute_can_be_changed(sdk_added_raw_attribute):
     # TODO but only by user(if user has taken control of his identity) and
     # endorser
     raise NotImplementedError
@@ -303,6 +311,7 @@ def set_attrib_auth_to_none(looper, sdk_wallet_trustee, sdk_pool_handle):
                                                                    need_to_be_owner=True).as_dict)
 
 
+@pytest.mark.attrib_txn
 def test_auth_rule_for_raw_attrib_works(looper,
                                         sdk_wallet_trustee,
                                         sdk_pool_handle,
@@ -359,6 +368,7 @@ def test_auth_rule_for_raw_attrib_works(looper,
     e.match('Not enough STEWARD signatures')
 
 
+@pytest.mark.attrib_txn
 def test_auth_rule_for_hash_attrib_works(looper,
                                          sdk_wallet_trustee,
                                          sdk_pool_handle,
@@ -413,6 +423,7 @@ def test_auth_rule_for_hash_attrib_works(looper,
     e.match('Not enough STEWARD signatures')
 
 
+@pytest.mark.attrib_txn
 def test_auth_rule_for_enc_attrib_works(looper,
                                         sdk_wallet_trustee,
                                         sdk_pool_handle,
diff --git a/indy_node/test/attrib_txn/test_send_get_attr.py b/indy_node/test/attrib_txn/test_send_get_attr.py
index c6abd2c87..6fe8626e0 100644
--- a/indy_node/test/attrib_txn/test_send_get_attr.py
+++ b/indy_node/test/attrib_txn/test_send_get_attr.py
@@ -48,12 +48,14 @@ def send_hash_attrib(looper, sdk_pool_handle, sdk_wallet_trustee):
     return rep
 
 
+@pytest.mark.attrib_txn
 def test_send_get_attr_succeeds_for_existing_uuid_dest(
         looper, sdk_pool_handle, sdk_wallet_trustee, send_raw_attrib):
     wh, did = sdk_wallet_trustee
     sdk_get_attribute_and_check(looper, sdk_pool_handle, sdk_wallet_trustee, did, attrib_name)
 
 
+@pytest.mark.attrib_txn
 def test_send_get_attr_fails_for_nonexistent_uuid_dest(
         looper, sdk_pool_handle, sdk_wallet_trustee, send_raw_attrib):
     _, submitter_did = sdk_wallet_trustee
@@ -67,6 +69,7 @@ def test_send_get_attr_fails_for_nonexistent_uuid_dest(
     e.match('should be one of \[16, 32\]')
 
 
+@pytest.mark.attrib_txn
 def test_send_get_attr_fails_for_invalid_attrib(
         looper, sdk_pool_handle, sdk_wallet_trustee, send_raw_attrib):
     did = createUuidIdentifier()
@@ -78,6 +81,7 @@ def test_send_get_attr_fails_for_invalid_attrib(
     sdk_get_and_check_replies(looper, [request_couple])
 
 
+@pytest.mark.attrib_txn
 def test_send_get_attr_fails_with_missing_dest(
         looper, sdk_pool_handle, sdk_wallet_trustee, send_raw_attrib):
     _, submitter_did = sdk_wallet_trustee
@@ -91,6 +95,7 @@ def test_send_get_attr_fails_with_missing_dest(
     e.match('should be one of \[16, 32\]')
 
 
+@pytest.mark.attrib_txn
 def test_send_get_attr_fails_with_missing_attrib(
         looper, sdk_pool_handle, sdk_wallet_trustee, send_raw_attrib):
     _, submitter_did = sdk_wallet_trustee
@@ -106,6 +111,7 @@ def test_send_get_attr_fails_with_missing_attrib(
     e.match('missed fields')
 
 
+@pytest.mark.attrib_txn
 def test_send_get_attr_enc_succeeds_for_existing_uuid_dest(
         looper, sdk_pool_handle, sdk_wallet_trustee, send_enc_attrib):
     _, submitter_did = sdk_wallet_trustee
@@ -116,6 +122,7 @@ def test_send_get_attr_enc_succeeds_for_existing_uuid_dest(
     sdk_get_and_check_replies(looper, [request_couple])
 
 
+@pytest.mark.attrib_txn
 def test_send_get_attr_hash_succeeds_for_existing_uuid_dest(
         looper, sdk_pool_handle, sdk_wallet_trustee, send_hash_attrib):
     _, submitter_did = sdk_wallet_trustee
diff --git a/indy_node/test/auth_rule/auth_framework/test_auth_rule_using.py b/indy_node/test/auth_rule/auth_framework/test_auth_rule_using.py
index 2f7341461..9aa6206b9 100644
--- a/indy_node/test/auth_rule/auth_framework/test_auth_rule_using.py
+++ b/indy_node/test/auth_rule/auth_framework/test_auth_rule_using.py
@@ -2,7 +2,7 @@
 import pytest
 from datetime import datetime, timedelta
 from collections import OrderedDict
-
+import unittest
 from indy_node.test.auth_rule.auth_framework.disable_taa import TAADisableTest
 from plenum.common.constants import STEWARD, TRUSTEE, IDENTITY_OWNER
 
@@ -55,6 +55,7 @@
 from stp_core.common.log import Logger
 
 Logger().enableStdLogging()
+unittest.TestLoader.sortTestMethodsUsing = None
 
 
 @pytest.fixture(scope="module")
@@ -63,19 +64,8 @@ def tconf(tconf):
         yield tconf
 
 
-class TestAuthRuleUsing():
-    map_of_tests = OrderedDict({
-        auth_map.add_new_trustee.get_action_id(): AddNewTrusteeTest,
-        auth_map.add_new_steward.get_action_id(): AddNewStewardTest,
-        auth_map.add_new_endorser.get_action_id(): AddNewEndorserTest,
-        auth_map.add_new_network_monitor.get_action_id(): AddNewNetworkMonitorTest,
-        auth_map.add_new_identity_owner.get_action_id(): AddNewIdentityOwnerTest,
-        auth_map.add_attrib.get_action_id(): AddAttribTest,
-        auth_map.edit_attrib.get_action_id(): EditAttribTest,
-        auth_map.add_revoc_reg_def.get_action_id(): AddRevocRegDefTest,
-        auth_map.edit_revoc_reg_def.get_action_id(): EditRevocRegDefTest,
-        auth_map.add_revoc_reg_entry.get_action_id(): AddRevocRegEntryTest,
-        auth_map.edit_revoc_reg_entry.get_action_id(): EditRevocRegEntryTest,
+class TestEditRoleActionsUsing:
+    edit_role_actions_test = OrderedDict({
         auth_map.edit_role_actions[TRUSTEE][STEWARD].get_action_id(): EditTrusteeToStewardTest,
         auth_map.edit_role_actions[TRUSTEE][ENDORSER].get_action_id(): EditTrusteeToEndorserTest,
         auth_map.edit_role_actions[TRUSTEE][NETWORK_MONITOR].get_action_id(): EditTrusteeToNetworkMonitorTest,
@@ -101,46 +91,24 @@ class TestAuthRuleUsing():
         auth_map.edit_role_actions[ENDORSER][ENDORSER].get_action_id(): EditEndorserToEndorserTest,
         auth_map.edit_role_actions[NETWORK_MONITOR][NETWORK_MONITOR].get_action_id(): EditNetworkMonitorToNetworkMonitorTest,
         auth_map.edit_role_actions[IDENTITY_OWNER][IDENTITY_OWNER].get_action_id(): EditIdentityOwnerToIdentityOwnerTest,
-        auth_map.key_rotation.get_action_id(): RotateKeyTest,
-        auth_map.txn_author_agreement_aml.get_action_id(): TxnAuthorAgreementAMLTest,
-        auth_map.add_schema.get_action_id(): SchemaTest,
-        auth_map.add_claim_def.get_action_id(): AddClaimDefTest,
-        auth_map.edit_claim_def.get_action_id(): EditClaimDefTest,
-        auth_map.start_upgrade.get_action_id(): StartUpgradeTest,
-        auth_map.cancel_upgrade.get_action_id(): CancelUpgradeTest,
-        auth_map.pool_restart.get_action_id(): RestartTest,
-        auth_map.pool_config.get_action_id(): PoolConfigTest,
-        auth_map.auth_rule.get_action_id(): AuthRuleTest,
-        auth_map.auth_rules.get_action_id(): AuthRulesTest,
-        auth_map.validator_info.get_action_id(): ValidatorInfoTest,
-        auth_map.adding_new_node.get_action_id(): AddNewNodeTest,
-        auth_map.adding_new_node_with_empty_services.get_action_id(): AddNewNodeEmptyServiceTest,
-        auth_map.demote_node.get_action_id(): DemoteNodeTest,
-        auth_map.promote_node.get_action_id(): PromoteNodeTest,
-        auth_map.change_node_ip.get_action_id(): EditNodeIpTest,
-        auth_map.change_node_port.get_action_id(): EditNodePortTest,
-        auth_map.change_client_ip.get_action_id(): EditNodeClientIpTest,
-        auth_map.change_client_port.get_action_id(): EditNodeClientPortTest,
-        auth_map.change_bls_key.get_action_id(): EditNodeBlsTest,
-        auth_map.disable_txn_author_agreement.get_action_id(): TAADisableTest,
     })
 
     # TODO a workaround until sdk aceepts empty TAA to make possible its deactivation
-    map_of_tests[auth_map.txn_author_agreement.get_action_id()] = TxnAuthorAgreementTest
+    edit_role_actions_test[auth_map.txn_author_agreement.get_action_id()] = TxnAuthorAgreementTest
 
     @pytest.fixture(scope='module')
     def pckg(self):
         return (EXT_PKT_NAME, EXT_PKT_VERSION)
 
     @pytest.fixture(scope='module')
-    def monkeymodule(self):
+    def monkey_module(self):
         from _pytest.monkeypatch import MonkeyPatch
         mpatch = MonkeyPatch()
         yield mpatch
         mpatch.undo()
 
     @pytest.fixture(scope='module')
-    def validUpgrade(self, nodeIds, tconf, pckg, monkeymodule):
+    def valid_upgrade(self, nodeIds, tconf, pckg, monkey_module):
         schedule = {}
         unow = datetime.utcnow().replace(tzinfo=dateutil.tz.tzutc())
         startAt = unow + timedelta(seconds=3000)
@@ -150,7 +118,7 @@ def validUpgrade(self, nodeIds, tconf, pckg, monkeymodule):
             startAt = startAt + timedelta(seconds=acceptableDiff + 3)
 
         new_version = bumpedVersion(pckg[1])
-        patch_packet_mgr_output(monkeymodule, pckg[0], pckg[1], new_version)
+        patch_packet_mgr_output(monkey_module, pckg[0], pckg[1], new_version)
 
         return dict(name='upgrade-{}'.format(randomText(3)), version=new_version,
                     action=START, schedule=schedule, timeout=1, package=pckg[0],
@@ -171,7 +139,7 @@ def env(self,
             sdk_wallet_steward,
             sdk_wallet_endorser,
             sdk_wallet_client,
-            validUpgrade,
+            valid_upgrade,
             poolConfigWTFF,
             sdk_wallet_network_monitor,
             txnPoolNodeSet):
@@ -191,19 +159,157 @@ def env(self,
                              sdk_wallet_client=sdk_wallet_client,
                              role_to_wallet=role_to_wallet,
                              txnPoolNodeSet=txnPoolNodeSet,
-                             valid_upgrade=validUpgrade,
+                             valid_upgrade=valid_upgrade,
                              pool_config_wtff=poolConfigWTFF)
 
-    @pytest.fixture(scope='module', params=[k for k in map_of_tests.keys()])
-    def auth_rule_tests(self, request, env):
+    # @pytest.fixture(scope='module', params=[k for k in edit_role_actions_test.keys()])
+    # def edit_role_actions_tests(self, request, env):
+    #     action_id = request.param
+    #     test_cls = self.edit_role_actions_test[action_id]
+    #     test = test_cls(env, action_id)
+    #     return action_id, test
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_add_new_trustee(self, env):
+        self.runner(AddNewTrusteeTest(env, auth_map.add_new_trustee.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_add_new_steward(self, env):
+        self.runner(AddNewStewardTest(env, auth_map.add_new_steward.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_add_new_endorser(self, env):
+        self.runner(AddNewEndorserTest(env, auth_map.add_new_endorser.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_add_new_network_monitor(self, env):
+        self.runner(AddNewNetworkMonitorTest(env, auth_map.add_new_network_monitor.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_add_new_identity_owner(self, env):
+        self.runner(AddNewIdentityOwnerTest(env, auth_map.add_new_identity_owner.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_add_attrib(self, env):
+        self.runner(AddAttribTest(env, auth_map.add_attrib.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_edit_attrib(self, env):
+        self.runner(EditAttribTest(env, auth_map.edit_attrib.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_add_revoc_reg_def(self, env):
+        self.runner(AddRevocRegDefTest(env, auth_map.add_revoc_reg_def.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_edit_revoc_reg_def(self, env):
+        self.runner(EditRevocRegDefTest(env, auth_map.edit_revoc_reg_def.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_add_revoc_reg_entry(self, env):
+        self.runner(AddRevocRegEntryTest(env, auth_map.add_revoc_reg_entry.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_edit_revoc_reg_entry(self, env):
+        self.runner(EditRevocRegEntryTest(env, auth_map.edit_revoc_reg_entry.get_action_id()))
+
+    @pytest.mark.auth_framework
+    @pytest.fixture(scope='module', params=[k for k in edit_role_actions_test.keys()])
+    def test_edit_role_actions_using(self, request, env):
         action_id = request.param
-        test_cls = self.map_of_tests[action_id]
-        test = test_cls(env, action_id)
-        return action_id, test
+        test_cls = self.edit_role_actions_test[action_id]
+        self.runner(test_cls(env, action_id))
+
+    @pytest.mark.auth_framework
+    def test_auth_rule_key_rotation(self, env):
+        self.runner(RotateKeyTest(env, auth_map.key_rotation.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_txn_author_agreement_aml(self, env):
+        self.runner(TxnAuthorAgreementAMLTest(env, auth_map.txn_author_agreement_aml.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_txn_add_schema(self, env):
+        self.runner(SchemaTest(env, auth_map.add_schema.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_add_claim_def(self, env):
+        self.runner(AddClaimDefTest(env, auth_map.add_claim_def.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_edit_claim_def(self, env):
+        self.runner(EditClaimDefTest(env, auth_map.edit_claim_def.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_start_upgrade(self, env):
+        self.runner(StartUpgradeTest(env, auth_map.start_upgrade.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_cancel_upgrade(self, env):
+        self.runner(CancelUpgradeTest(env, auth_map.cancel_upgrade.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_pool_restart(self, env):
+        self.runner(RestartTest(env, auth_map.pool_restart.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_pool_config(self, env):
+        self.runner(PoolConfigTest(env, auth_map.pool_config.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_auth_rule(self, env):
+        self.runner(AuthRuleTest(env, auth_map.auth_rule.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_auth_rules(self, env):
+        self.runner(AuthRulesTest(env, auth_map.auth_rules.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_validator_info(self, env):
+        self.runner(ValidatorInfoTest(env, auth_map.validator_info.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_adding_new_node(self, env):
+        self.runner(AddNewNodeTest(env, auth_map.adding_new_node.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_adding_new_node_with_empty_services(self, env):
+        self.runner(AddNewNodeEmptyServiceTest(env, auth_map.adding_new_node_with_empty_services.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_demote_node(self, env):
+        self.runner(DemoteNodeTest(env, auth_map.demote_node.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_promote_node(self, env):
+        self.runner(PromoteNodeTest(env, auth_map.promote_node.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_change_node_ip(self, env):
+        self.runner(EditNodeIpTest(env, auth_map.change_node_ip.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_change_node_port(self, env):
+        self.runner(EditNodePortTest(env, auth_map.change_node_port.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_change_client_ip(self, env):
+        self.runner(EditNodeClientIpTest(env, auth_map.change_client_ip.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_change_client_port(self, env):
+        self.runner(EditNodeClientPortTest(env, auth_map.change_client_port.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_change_bls_key(self, env):
+        self.runner(EditNodeBlsTest(env, auth_map.change_bls_key.get_action_id()))
+
+    @pytest.mark.auth_framework
+    def test_auth_disable_txn_author_agreement(self, env):
+        self.runner(TAADisableTest(env, auth_map.disable_txn_author_agreement.get_action_id()))
 
-    def test_auth_rule_using(self, auth_rule_tests):
-        descr, test = auth_rule_tests
-        print("Running test: {}".format(descr))
+    @staticmethod
+    def runner(test):
         test.prepare()
         test.run()
         test.result()
diff --git a/indy_node/test/auth_rule/test_auth_map.py b/indy_node/test/auth_rule/test_auth_map.py
index f71385a86..01a366065 100644
--- a/indy_node/test/auth_rule/test_auth_map.py
+++ b/indy_node/test/auth_rule/test_auth_map.py
@@ -1,6 +1,9 @@
+import pytest
+
 from indy_common.authorize import auth_map
 
 
+@pytest.mark.auth_rule
 def test_auth_map_node():
     node_rules = [(auth_map.adding_new_node, "0--ADD--services--*--['VALIDATOR']"),
                   (auth_map.adding_new_node_with_empty_services, "0--ADD--services--*--[]"),
@@ -17,6 +20,7 @@ def test_auth_map_node():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_nym():
     nym_rules = [(auth_map.add_new_trustee, "1--ADD--role--*--0"),
                  (auth_map.add_new_steward, "1--ADD--role--*--2"),
@@ -30,6 +34,7 @@ def test_auth_map_nym():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_txn_author_agreement():
     rules = [(auth_map.txn_author_agreement, "4--ADD--*--*--*"), ]
 
@@ -38,6 +43,7 @@ def test_auth_map_txn_author_agreement():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_txn_author_agreement_aml():
     rules = [(auth_map.txn_author_agreement_aml, "5--ADD--*--*--*"), ]
 
@@ -46,6 +52,7 @@ def test_auth_map_txn_author_agreement_aml():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_attrib():
     rules = [(auth_map.add_attrib, "100--ADD--*--*--*"),
              (auth_map.edit_attrib, "100--EDIT--*--*--*")]
@@ -55,6 +62,7 @@ def test_auth_map_attrib():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_schema():
     rules = [(auth_map.add_schema, "101--ADD--*--*--*")]
 
@@ -63,6 +71,7 @@ def test_auth_map_schema():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_schema_for_omitted():
     rules = [(auth_map.edit_schema, "101--EDIT--*--*--*")]
 
@@ -71,6 +80,7 @@ def test_auth_map_schema_for_omitted():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_claim_def():
     rules = [(auth_map.add_claim_def, "102--ADD--*--*--*"),
              (auth_map.edit_claim_def, "102--EDIT--*--*--*")]
@@ -80,6 +90,7 @@ def test_auth_map_claim_def():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_upgrade():
     rules = [(auth_map.start_upgrade, "109--ADD--action--*--start"),
              (auth_map.cancel_upgrade, "109--EDIT--action--start--cancel")]
@@ -89,6 +100,7 @@ def test_auth_map_upgrade():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_config():
     rules = [(auth_map.pool_config, "111--EDIT--action--*--*"), ]
 
@@ -97,6 +109,7 @@ def test_auth_map_config():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_action():
     nym_rules = [(auth_map.pool_restart, "118--ADD--action--*--*"),
                  (auth_map.auth_rule, "120--EDIT--*--*--*"),
@@ -108,6 +121,7 @@ def test_auth_map_action():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_revoc_reg():
     nym_rules = [(auth_map.add_revoc_reg_def, "113--ADD--*--*--*"),
                  (auth_map.add_revoc_reg_entry, "114--ADD--*--*--*"),
@@ -119,6 +133,7 @@ def test_auth_map_revoc_reg():
         assert rule_str in auth_map.auth_map.keys()
 
 
+@pytest.mark.auth_rule
 def test_auth_map_disable_taa():
     rules = [(auth_map.disable_txn_author_agreement, '8--ADD--*--*--*')]
 
diff --git a/indy_node/test/auth_rule/test_auth_rule_transaction.py b/indy_node/test/auth_rule/test_auth_rule_transaction.py
index b41021709..d3e071250 100644
--- a/indy_node/test/auth_rule/test_auth_rule_transaction.py
+++ b/indy_node/test/auth_rule/test_auth_rule_transaction.py
@@ -23,6 +23,7 @@
 )
 
 
+@pytest.mark.auth_rule
 def test_auth_rule_transaction_for_edit(looper,
                                         sdk_wallet_trustee,
                                         sdk_pool_handle):
@@ -32,6 +33,7 @@ def test_auth_rule_transaction_for_edit(looper,
                                          auth_action=EDIT_PREFIX)
 
 
+@pytest.mark.auth_rule
 def test_auth_rule_transaction(looper,
                                sdk_wallet_trustee,
                                sdk_pool_handle):
@@ -40,6 +42,7 @@ def test_auth_rule_transaction(looper,
     )
 
 
+@pytest.mark.auth_rule
 def test_auth_rule_transaction_with_large_constraint(looper,
                                                      sdk_wallet_trustee,
                                                      sdk_pool_handle):
@@ -51,6 +54,7 @@ def test_auth_rule_transaction_with_large_constraint(looper,
                                          constraint=constraint)
 
 
+@pytest.mark.auth_rule
 def test_reject_with_unacceptable_role_in_constraint(looper,
                                                      sdk_wallet_trustee,
                                                      sdk_pool_handle):
@@ -67,6 +71,7 @@ def test_reject_with_unacceptable_role_in_constraint(looper,
     e.match('Role {} is not acceptable'.format(unacceptable_role))
 
 
+@pytest.mark.auth_rule
 def test_reject_auth_rule_transaction(looper,
                                       sdk_wallet_steward,
                                       sdk_pool_handle):
@@ -77,6 +82,7 @@ def test_reject_auth_rule_transaction(looper,
     e.match('Not enough TRUSTEE signatures')
 
 
+@pytest.mark.auth_rule
 def test_reqnack_auth_rule_transaction_with_wrong_key(looper,
                                                       sdk_wallet_trustee,
                                                       sdk_pool_handle):
@@ -90,6 +96,7 @@ def test_reqnack_auth_rule_transaction_with_wrong_key(looper,
     e.match("is not found in authorization map")
 
 
+@pytest.mark.auth_rule
 def test_reqnack_auth_rule_edit_transaction_with_wrong_format(looper,
                                                               sdk_wallet_trustee,
                                                               sdk_pool_handle):
@@ -109,6 +116,7 @@ def test_reqnack_auth_rule_edit_transaction_with_wrong_format(looper,
             format(AUTH_ACTION, EDIT_PREFIX, OLD_VALUE))
 
 
+@pytest.mark.auth_rule
 def test_reqnack_auth_rule_add_transaction_with_wrong_format(looper,
                                                              sdk_wallet_trustee,
                                                              sdk_pool_handle):
@@ -127,6 +135,7 @@ def test_reqnack_auth_rule_add_transaction_with_wrong_format(looper,
 
 
 @pytest.mark.parametrize("off_ledger_signature", [True, False])
+@pytest.mark.auth_rule
 def test_auth_rule_state_format(
     looper, sdk_pool_handle, sdk_wallet_trustee, txnPoolNodeSet, off_ledger_signature
 ):
diff --git a/indy_node/test/auth_rule/test_auth_rules_transaction.py b/indy_node/test/auth_rule/test_auth_rules_transaction.py
index 937d88115..a67387bb0 100644
--- a/indy_node/test/auth_rule/test_auth_rules_transaction.py
+++ b/indy_node/test/auth_rule/test_auth_rules_transaction.py
@@ -25,6 +25,7 @@ def _send_and_check_get_auth_rule(looper, sdk_pool_handle, sdk_wallet, key):
     )
 
 
+@pytest.mark.auth_rule
 def test_auth_rules_transaction_without_changes(looper,
                                                 sdk_wallet_trustee,
                                                 sdk_pool_handle):
@@ -41,6 +42,7 @@ def test_auth_rules_transaction_without_changes(looper,
     assert before_resp[0][1]["result"][DATA] == after_resp[0][1]["result"][DATA]
 
 
+@pytest.mark.auth_rule
 def test_auth_rules_transaction(looper,
                                 sdk_wallet_trustee,
                                 sdk_pool_handle):
@@ -58,6 +60,7 @@ def test_auth_rules_transaction(looper,
     assert [rule] == after_resp[0][1]["result"][DATA]
 
 
+@pytest.mark.auth_rule
 def test_reject_all_rules_from_auth_rules_txn(looper,
                                               sdk_wallet_trustee,
                                               sdk_pool_handle):
@@ -79,6 +82,7 @@ def test_reject_all_rules_from_auth_rules_txn(looper,
     assert before_resp["result"][DATA] == after_resp["result"][DATA]
 
 
+@pytest.mark.auth_rule
 def test_reject_with_empty_rules_list(looper,
                                       sdk_wallet_trustee,
                                       sdk_pool_handle):
@@ -90,6 +94,7 @@ def test_reject_with_empty_rules_list(looper,
                                                       rules=[])
 
 
+@pytest.mark.auth_rule
 def test_reject_with_unacceptable_role_in_constraint(looper,
                                                      sdk_wallet_trustee,
                                                      sdk_pool_handle):
@@ -106,6 +111,7 @@ def test_reject_with_unacceptable_role_in_constraint(looper,
     e.match('Role {} is not acceptable'.format(unacceptable_role))
 
 
+@pytest.mark.auth_rule
 def test_reject_auth_rules_transaction(looper,
                                        sdk_wallet_steward,
                                        sdk_pool_handle):
@@ -116,6 +122,7 @@ def test_reject_auth_rules_transaction(looper,
     e.match('Not enough TRUSTEE signatures')
 
 
+@pytest.mark.auth_rule
 def test_reqnack_auth_rules_transaction_with_wrong_key(looper,
                                                        sdk_wallet_trustee,
                                                        sdk_pool_handle):
@@ -129,6 +136,7 @@ def test_reqnack_auth_rules_transaction_with_wrong_key(looper,
     e.match("is not found in authorization map")
 
 
+@pytest.mark.auth_rule
 def test_reqnack_auth_rules_edit_transaction_with_wrong_format(looper,
                                                                sdk_wallet_trustee,
                                                                sdk_pool_handle):
@@ -146,6 +154,7 @@ def test_reqnack_auth_rules_edit_transaction_with_wrong_format(looper,
             format(AUTH_ACTION, EDIT_PREFIX, OLD_VALUE))
 
 
+@pytest.mark.auth_rule
 def test_reqnack_auth_rules_add_transaction_with_wrong_format(looper,
                                                               sdk_wallet_trustee,
                                                               sdk_pool_handle):
diff --git a/indy_node/test/auth_rule/test_catching_up_auth_rule_txn.py b/indy_node/test/auth_rule/test_catching_up_auth_rule_txn.py
index 0b2e09f75..c3479c2d1 100644
--- a/indy_node/test/auth_rule/test_catching_up_auth_rule_txn.py
+++ b/indy_node/test/auth_rule/test_catching_up_auth_rule_txn.py
@@ -17,6 +17,7 @@
 from stp_core.loop.eventually import eventually
 
 
+@pytest.mark.auth_rule
 def test_catching_up_auth_rule_txn(looper,
                                    txnPoolNodeSet,
                                    sdk_wallet_trustee,
diff --git a/indy_node/test/auth_rule/test_check_rule_for_add_action_changing.py b/indy_node/test/auth_rule/test_check_rule_for_add_action_changing.py
index 0a7351fa9..01c274415 100644
--- a/indy_node/test/auth_rule/test_check_rule_for_add_action_changing.py
+++ b/indy_node/test/auth_rule/test_check_rule_for_add_action_changing.py
@@ -9,6 +9,7 @@
 from plenum.test.pool_transactions.helper import sdk_add_new_nym
 
 
+@pytest.mark.auth_rule
 def test_check_rule_for_add_action_changing(looper,
                                             sdk_wallet_trustee,
                                             sdk_wallet_steward,
diff --git a/indy_node/test/auth_rule/test_check_rule_for_edit_action_changing.py b/indy_node/test/auth_rule/test_check_rule_for_edit_action_changing.py
index 83256f9f4..c84dbe9ac 100644
--- a/indy_node/test/auth_rule/test_check_rule_for_edit_action_changing.py
+++ b/indy_node/test/auth_rule/test_check_rule_for_edit_action_changing.py
@@ -9,6 +9,7 @@
 from plenum.test.pool_transactions.helper import sdk_add_new_nym
 
 
+@pytest.mark.auth_rule
 def test_check_rule_for_edit_action_changing(looper,
                                              sdk_wallet_trustee,
                                              sdk_wallet_steward,
diff --git a/indy_node/test/auth_rule/test_constraint_field.py b/indy_node/test/auth_rule/test_constraint_field.py
index 0a0f62fc5..016c84807 100644
--- a/indy_node/test/auth_rule/test_constraint_field.py
+++ b/indy_node/test/auth_rule/test_constraint_field.py
@@ -22,12 +22,14 @@
                                             generate_constraint_entity()])]))
 
 
+@pytest.mark.auth_rule
 def test_valid():
     validator.validate(valid_auth_rule_operation_small)
     validator.validate(valid_auth_rule_operation_large)
     validator.validate(valid_auth_rule_operation_extra_large)
 
 
+@pytest.mark.auth_rule
 def test_invalid_operation_action():
     # must be ADD_PREFIX or EDIT_PREFIX
     invalid_auth_rule_operation = generate_auth_rule_operation(auth_action="auth_action")
@@ -35,6 +37,7 @@ def test_invalid_operation_action():
         validator.validate(invalid_auth_rule_operation)
 
 
+@pytest.mark.auth_rule
 def test_invalid_entity_role():
     # ConstraintEntityField without required field 'role'
     invalid_auth_rule_operation = generate_auth_rule_operation()
@@ -43,6 +46,7 @@ def test_invalid_entity_role():
         validator.validate(invalid_auth_rule_operation)
 
 
+@pytest.mark.auth_rule
 def test_invalid_entity_role_in_extra_large_constraint():
     # ConstraintEntityField without required field 'role'
     invalid_auth_rule_operation = generate_auth_rule_operation(constraint=generate_constraint_list(
@@ -55,6 +59,7 @@ def test_invalid_entity_role_in_extra_large_constraint():
         validator.validate(invalid_auth_rule_operation)
 
 
+@pytest.mark.auth_rule
 def test_invalid_operation_auth_constraints():
     # ConstraintListField without required field 'auth_constraints'
     invalid_auth_rule_operation = generate_auth_rule_operation(constraint=generate_constraint_list(
@@ -65,6 +70,7 @@ def test_invalid_operation_auth_constraints():
         validator.validate(invalid_auth_rule_operation)
 
 
+@pytest.mark.auth_rule
 def test_invalid_operation_auth_constraints_with_large_constraint():
     # ConstraintListField without required field 'auth_constraints' on the 2nd level
     invalid_auth_rule_operation = generate_auth_rule_operation(constraint=generate_constraint_list(
@@ -77,6 +83,7 @@ def test_invalid_operation_auth_constraints_with_large_constraint():
         validator.validate(invalid_auth_rule_operation)
 
 
+@pytest.mark.auth_rule
 def test_invalid_operation_constraint_id_with_large_constraint():
     # ConstraintListField without required field CONSTRAINT_ID on the 2nd level
     invalid_auth_rule_operation = generate_auth_rule_operation(constraint=generate_constraint_list(
@@ -89,6 +96,7 @@ def test_invalid_operation_constraint_id_with_large_constraint():
         validator.validate(invalid_auth_rule_operation)
 
 
+@pytest.mark.auth_rule
 def test_invalid_operation_with_empty_auth_constraints():
     # ConstraintListField without empty list in auth_constraints
     invalid_auth_rule_operation = generate_auth_rule_operation(constraint=generate_constraint_list(
@@ -100,6 +108,7 @@ def test_invalid_operation_with_empty_auth_constraints():
         validator.validate(invalid_auth_rule_operation)
 
 
+@pytest.mark.auth_rule
 def test_invalid_operation_with_empty_constraint_list():
     # ClientAuthRuleOperation with empty list of constraints
     invalid_auth_rule_operation = generate_auth_rule_operation(constraint=[])
@@ -108,6 +117,7 @@ def test_invalid_operation_with_empty_constraint_list():
         validator.validate(invalid_auth_rule_operation)
 
 
+@pytest.mark.auth_rule
 def test_invalid_operation_without_none_constraint():
     # ConstraintListField without None in field CONSTRAINT
     invalid_auth_rule_operation = generate_auth_rule_operation()
@@ -117,6 +127,7 @@ def test_invalid_operation_without_none_constraint():
         validator.validate(invalid_auth_rule_operation)
 
 
+@pytest.mark.auth_rule
 def test_auth_constraint_from_dct_succesfull():
     unkwn = 'unknown_field'
     auth_dct = {ROLE: STEWARD,
@@ -133,6 +144,7 @@ def test_auth_constraint_from_dct_succesfull():
     assert not hasattr(constr, unkwn)
 
 
+@pytest.mark.auth_rule
 def test_auth_constraint_without_off_ledger_sig_from_dct_succesfull():
     unkwn = 'unknown_field'
     auth_dct = {CONSTRAINT_ID: ConstraintsEnum.ROLE_CONSTRAINT_ID,
diff --git a/indy_node/test/auth_rule/test_get_auth_rule.py b/indy_node/test/auth_rule/test_get_auth_rule.py
index b3d575417..5425e2799 100644
--- a/indy_node/test/auth_rule/test_get_auth_rule.py
+++ b/indy_node/test/auth_rule/test_get_auth_rule.py
@@ -26,6 +26,7 @@
 RESULT = "result"
 
 
+@pytest.mark.auth_rule
 def test_fail_get_auth_rule_with_incorrect_key(looper,
                                                sdk_wallet_trustee,
                                                sdk_pool_handle):
@@ -55,6 +56,7 @@ def _check_key(key, resp_key):
         assert OLD_VALUE not in resp_key
 
 
+@pytest.mark.auth_rule
 def test_get_one_auth_rule_transaction(looper,
                                        sdk_wallet_trustee,
                                        sdk_pool_handle):
@@ -69,6 +71,7 @@ def test_get_one_auth_rule_transaction(looper,
         assert auth_map.get(str_key).as_dict == resp_rule[CONSTRAINT]
 
 
+@pytest.mark.auth_rule
 def test_get_unknown_auth_rule_transaction_is_rejected(
     looper, sdk_wallet_trustee, sdk_pool_handle
 ):
@@ -84,6 +87,7 @@ def test_get_unknown_auth_rule_transaction_is_rejected(
         )
 
 
+@pytest.mark.auth_rule
 def test_get_one_disabled_auth_rule_transaction(looper,
                                                 sdk_wallet_trustee,
                                                 sdk_pool_handle):
@@ -99,6 +103,7 @@ def test_get_one_disabled_auth_rule_transaction(looper,
     assert AuthConstraintForbidden().as_dict == result[0][CONSTRAINT]
 
 
+@pytest.mark.auth_rule
 def test_get_all_auth_rule_transactions(looper,
                                         sdk_wallet_trustee,
                                         sdk_pool_handle):
@@ -116,6 +121,7 @@ def test_get_all_auth_rule_transactions(looper,
             assert constraint.as_dict == rule[CONSTRAINT]
 
 
+@pytest.mark.auth_rule
 def test_get_one_auth_rule_transaction_after_write(looper,
                                                    sdk_wallet_trustee,
                                                    sdk_pool_handle):
@@ -143,6 +149,7 @@ def test_get_one_auth_rule_transaction_after_write(looper,
     assert resp[0][1]["result"][STATE_PROOF]
 
 
+@pytest.mark.auth_rule
 def test_get_all_auth_rule_transactions_after_write(looper,
                                                     sdk_wallet_trustee,
                                                     sdk_pool_handle):
@@ -174,6 +181,7 @@ def test_get_all_auth_rule_transactions_after_write(looper,
             assert auth_map[key].as_dict == rule[CONSTRAINT]
 
 
+@pytest.mark.auth_rule
 def test_auth_rule_after_get_auth_rule_as_is(
     looper, sdk_pool_handle, sdk_wallet_trustee
 ):
@@ -211,6 +219,7 @@ def test_auth_rule_after_get_auth_rule_as_is(
         assert get_response[0][1]["result"][STATE_PROOF]
 
 
+@pytest.mark.auth_rule
 def test_auth_rule_after_get_auth_rule_as_is_using_sdk(
     looper, sdk_pool_handle, sdk_wallet_trustee
 ):
@@ -247,6 +256,7 @@ def test_auth_rule_after_get_auth_rule_as_is_using_sdk(
         assert get_response[0][1]["result"][STATE_PROOF]
 
 
+@pytest.mark.auth_rule
 def test_auth_rule_after_get_auth_rule_as_is_except_constraint(
     looper, sdk_wallet_trustee, sdk_pool_handle
 ):
diff --git a/indy_node/test/auth_rule/test_multisig_auth_rule.py b/indy_node/test/auth_rule/test_multisig_auth_rule.py
index 8887d24fd..01b24db9a 100644
--- a/indy_node/test/auth_rule/test_multisig_auth_rule.py
+++ b/indy_node/test/auth_rule/test_multisig_auth_rule.py
@@ -99,6 +99,7 @@ def add_new_nym(looper, sdk_pool_handle, creators_wallets,
     sdk_get_and_check_replies(looper, [request_couple])
 
 
+@pytest.mark.auth_rule
 def test_multi_sig_auth_rule(looper,
                              wallets_for_success,
                              sdk_pool_handle,
@@ -114,6 +115,7 @@ def test_multi_sig_auth_rule(looper,
     get_nym(looper, sdk_pool_handle, wallets_for_success[0], did)
 
 
+@pytest.mark.auth_rule
 def test_reject_request_with_multi_sig_auth_rule(looper,
                                                  wallets_for_fail,
                                                  sdk_pool_handle,
@@ -127,6 +129,7 @@ def test_reject_request_with_multi_sig_auth_rule(looper,
                     STEWARD_STRING)
 
 
+@pytest.mark.auth_rule
 def test_validate_by_auth_rule_without_signatures(looper,  # noqa: F811
                                                   sdk_wallet_client,
                                                   sdk_pool_handle,
diff --git a/indy_node/test/auth_rule/test_node_txn_demote_by_endorser.py b/indy_node/test/auth_rule/test_node_txn_demote_by_endorser.py
index bc9012a10..d2ab4c543 100644
--- a/indy_node/test/auth_rule/test_node_txn_demote_by_endorser.py
+++ b/indy_node/test/auth_rule/test_node_txn_demote_by_endorser.py
@@ -9,6 +9,7 @@
 from plenum.test.pool_transactions.helper import sdk_add_new_nym, demote_node
 
 
+@pytest.mark.auth_rule
 def test_node_txn_demote_by_endorser(txnPoolNodeSet,
                                      sdk_pool_handle,
                                      sdk_wallet_trustee,
diff --git a/indy_node/test/auth_rule/test_node_txn_promote_by_endorser.py b/indy_node/test/auth_rule/test_node_txn_promote_by_endorser.py
index a398f3c2d..ac32965a2 100644
--- a/indy_node/test/auth_rule/test_node_txn_promote_by_endorser.py
+++ b/indy_node/test/auth_rule/test_node_txn_promote_by_endorser.py
@@ -9,6 +9,7 @@
 from plenum.test.pool_transactions.helper import sdk_add_new_nym, demote_node, promote_node
 
 
+@pytest.mark.auth_rule
 def test_node_txn_promote_by_endorser(txnPoolNodeSet,
                                      sdk_pool_handle,
                                      sdk_wallet_trustee,
diff --git a/indy_node/test/auth_rule/test_revert_auth_rule_changing.py b/indy_node/test/auth_rule/test_revert_auth_rule_changing.py
index 7d0b21688..190065740 100644
--- a/indy_node/test/auth_rule/test_revert_auth_rule_changing.py
+++ b/indy_node/test/auth_rule/test_revert_auth_rule_changing.py
@@ -17,6 +17,7 @@
 from stp_core.loop.eventually import eventually
 
 
+@pytest.mark.auth_rule
 def test_revert_auth_rule_changing(looper,
                                    txnPoolNodeSet,
                                    sdk_wallet_trustee,
diff --git a/indy_node/test/auth_rule/test_txn_with_different_signature_and_idr.py b/indy_node/test/auth_rule/test_txn_with_different_signature_and_idr.py
index 70dddd66f..0863faff0 100644
--- a/indy_node/test/auth_rule/test_txn_with_different_signature_and_idr.py
+++ b/indy_node/test/auth_rule/test_txn_with_different_signature_and_idr.py
@@ -9,6 +9,7 @@
 from plenum.test.pool_transactions.helper import prepare_nym_request
 
 
+@pytest.mark.auth_rule
 def test_txn_with_different_signature_and_idr(
         looper, txnPoolNodeSet, sdk_pool_handle, sdk_wallet_trustee, sdk_wallet_client):
     # filling nym request and getting steward did
diff --git a/indy_node/test/auth_rule/test_use_modified_rules_from_uncommitted.py b/indy_node/test/auth_rule/test_use_modified_rules_from_uncommitted.py
index d61e671da..9f88181bd 100644
--- a/indy_node/test/auth_rule/test_use_modified_rules_from_uncommitted.py
+++ b/indy_node/test/auth_rule/test_use_modified_rules_from_uncommitted.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_common.authorize.auth_actions import ADD_PREFIX
 from indy_common.authorize.auth_constraints import AuthConstraint
 from indy_node.test.auth_rule.helper import create_verkey_did, sdk_send_and_check_auth_rule_request
@@ -9,6 +11,7 @@
 from plenum.test.stasher import delay_rules
 
 
+@pytest.mark.auth_rule
 def test_use_modified_rules_from_uncommitted(looper,
                                              txnPoolNodeSet,
                                              sdk_wallet_trustee,
diff --git a/indy_node/test/catchup/test_batch_rejected_and_later_ordered_on_catchup.py b/indy_node/test/catchup/test_batch_rejected_and_later_ordered_on_catchup.py
index b54ed0f90..ecc346e17 100644
--- a/indy_node/test/catchup/test_batch_rejected_and_later_ordered_on_catchup.py
+++ b/indy_node/test/catchup/test_batch_rejected_and_later_ordered_on_catchup.py
@@ -42,6 +42,7 @@ def disable_transport_batching():
                        logging.CRITICAL]
 
 
+@pytest.mark.catchup
 def test_batch_rejected_on_catchup_start_can_be_ordered_before_ledgers_sync(
         looper,
         tdirWithPoolTxns,
diff --git a/indy_node/test/catchup/test_requests_post_multiple_new_nodes.py b/indy_node/test/catchup/test_requests_post_multiple_new_nodes.py
index 0816456f8..a5745362c 100644
--- a/indy_node/test/catchup/test_requests_post_multiple_new_nodes.py
+++ b/indy_node/test/catchup/test_requests_post_multiple_new_nodes.py
@@ -1,3 +1,4 @@
+import pytest
 from plenum.test.node_catchup.helper import waitNodeDataEquality
 from indy_node.test.conftest import sdk_node_theta_added
 from indy_node.test.helper import TestNode
@@ -5,6 +6,7 @@
 from plenum.test.pool_transactions.helper import sdk_add_new_nym
 
 
+@pytest.mark.catchup
 def test_requests_post_multiple_new_nodes(
         looper,
         nodeSet,
diff --git a/indy_node/test/catchup/test_requests_post_new_node_catchup.py b/indy_node/test/catchup/test_requests_post_new_node_catchup.py
index 5b499b3b2..2c0000c36 100644
--- a/indy_node/test/catchup/test_requests_post_new_node_catchup.py
+++ b/indy_node/test/catchup/test_requests_post_new_node_catchup.py
@@ -1,3 +1,4 @@
+import pytest
 from plenum.common.constants import DOMAIN_LEDGER_ID
 from plenum.common.util import randomString
 from plenum.test.node_catchup.helper import checkNodeDataForEquality, \
@@ -11,6 +12,7 @@
 from indy_common.config_helper import NodeConfigHelper
 
 
+@pytest.mark.catchup
 def test_new_node_catchup_update_projection(looper,
                                             nodeSet, tconf, tdir,
                                             sdk_pool_handle,
diff --git a/indy_node/test/catchup/test_state_recovering.py b/indy_node/test/catchup/test_state_recovering.py
index 95f0ff53e..e63138e1f 100644
--- a/indy_node/test/catchup/test_state_recovering.py
+++ b/indy_node/test/catchup/test_state_recovering.py
@@ -87,6 +87,7 @@ def send_auth_rule(looper,
                                                                                    sig_count=1).as_dict)
 
 
+@pytest.mark.catchup
 def test_state_recovering_for_auth_rule(nodeSet, looper, sdk_pool_handle, sdk_wallet_steward,
                                         sdk_wallet_trustee,
                                         tdir, tconf,
diff --git a/indy_node/test/catchup/test_txn_version_controller.py b/indy_node/test/catchup/test_txn_version_controller.py
index 2249ba0f2..04623c398 100644
--- a/indy_node/test/catchup/test_txn_version_controller.py
+++ b/indy_node/test/catchup/test_txn_version_controller.py
@@ -29,6 +29,7 @@ def create_node_upgrade_txn(version, frm, timestamp=0):
                                                     VERSION: version}}}}
 
 
+@pytest.mark.catchup
 def test_update_version_without_pool_upgrade(txn_version_controller):
     version = "version1"
     assert txn_version_controller.version is None
@@ -37,6 +38,7 @@ def test_update_version_without_pool_upgrade(txn_version_controller):
     assert txn_version_controller.version == version
 
 
+@pytest.mark.catchup
 def test_update_version_with_pool_upgrade(txn_version_controller, pool_upgrade_txn):
     version = "version1"
     assert txn_version_controller.version is None
@@ -52,6 +54,7 @@ def test_update_version_with_pool_upgrade(txn_version_controller, pool_upgrade_t
     assert txn_version_controller.version == version
 
 
+@pytest.mark.catchup
 def test_cleanup_after_update_version(txn_version_controller, pool_upgrade_txn):
     version1 = "version1"
     version2 = "version2"
@@ -72,6 +75,7 @@ def test_cleanup_after_update_version(txn_version_controller, pool_upgrade_txn):
     assert txn_version_controller.version == version2
 
 
+@pytest.mark.catchup
 def test_get_version_with_timestamp(txn_version_controller, pool_upgrade_txn):
     version1 = "version1"
     version2 = "version2"
diff --git a/indy_node/test/claim_def/test_claim_def_auth_rule.py b/indy_node/test/claim_def/test_claim_def_auth_rule.py
index b52276ed6..8c09344e9 100644
--- a/indy_node/test/claim_def/test_claim_def_auth_rule.py
+++ b/indy_node/test/claim_def/test_claim_def_auth_rule.py
@@ -22,6 +22,7 @@ def send_and_check(looper, sdk_pool_handle, req_json, wallet):
         looper, sdk_pool_handle, wallet, req_json)[0]
 
 
+@pytest.mark.claim_def
 def test_auth_rule_transaction_for_edit(looper,
                                         txnPoolNodeSet,
                                         sdk_wallet_trustee,
diff --git a/indy_node/test/claim_def/test_send_claim_def.py b/indy_node/test/claim_def/test_send_claim_def.py
index a6a20514f..685028c19 100644
--- a/indy_node/test/claim_def/test_send_claim_def.py
+++ b/indy_node/test/claim_def/test_send_claim_def.py
@@ -21,6 +21,7 @@ def sdk_send_claim_def(looper, sdk_pool_handle, sdk_wallet, tag, schema_json):
     return reply
 
 
+@pytest.mark.claim_def
 def test_send_claim_def_succeeds(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, schema_json):
     wallet_handle, identifier = sdk_wallet_trustee
@@ -31,6 +32,7 @@ def test_send_claim_def_succeeds(
     sdk_get_and_check_replies(looper, [sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_trustee, request)])
 
 
+@pytest.mark.claim_def
 def test_send_claim_def_succeeds_for_large_schema(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, large_schema_json):
     wallet_handle, identifier = sdk_wallet_trustee
@@ -41,6 +43,7 @@ def test_send_claim_def_succeeds_for_large_schema(
     sdk_get_and_check_replies(looper, [sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_trustee, request)])
 
 
+@pytest.mark.claim_def
 def test_send_claim_def_schema_and_claim_def_in_one_batch(
         looper, tconf, sdk_pool_handle, nodeSet, sdk_wallet_trustee):
     with max_3pc_batch_limits(tconf, size=2) as tconf:
@@ -66,6 +69,7 @@ def test_send_claim_def_schema_and_claim_def_in_one_batch(
         sdk_get_and_check_replies(looper, [schema_req, claim_def_req])
 
 
+@pytest.mark.claim_def
 def test_send_claim_def_fails_if_ref_is_seqno_of_non_schema_txn(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, schema_json):
     wallet_handle, identifier = sdk_wallet_trustee
@@ -79,6 +83,7 @@ def test_send_claim_def_fails_if_ref_is_seqno_of_non_schema_txn(
     e.match('isn\'t seqNo of the schema.')
 
 
+@pytest.mark.claim_def
 def test_send_claim_def_fails_if_ref_is_not_existing_seqno(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, schema_json):
     wallet_handle, identifier = sdk_wallet_trustee
@@ -92,6 +97,7 @@ def test_send_claim_def_fails_if_ref_is_not_existing_seqno(
     e.match('doesn\'t exist')
 
 
+@pytest.mark.claim_def
 def test_update_claim_def_for_same_schema_and_signature_type(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, schema_json):
     wallet_handle, identifier = sdk_wallet_trustee
@@ -106,6 +112,7 @@ def test_update_claim_def_for_same_schema_and_signature_type(
     sdk_get_and_check_replies(looper, [sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_trustee, request)])
 
 
+@pytest.mark.claim_def
 def test_can_send_same_claim_def_by_different_issuers(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, sdk_wallet_steward, schema_json):
     wallet_handle, identifier = sdk_wallet_trustee
diff --git a/indy_node/test/claim_def/test_send_get_claim_def.py b/indy_node/test/claim_def/test_send_get_claim_def.py
index 792bc7da7..1a032793a 100644
--- a/indy_node/test/claim_def/test_send_get_claim_def.py
+++ b/indy_node/test/claim_def/test_send_get_claim_def.py
@@ -33,6 +33,7 @@ def added_claim_def_id_large_schema(looper, sdk_pool_handle, nodeSet,
     return rep[0][1]['result'][TXN_METADATA][TXN_METADATA_ID]
 
 
+@pytest.mark.claim_def
 def test_send_get_claim_def_succeeds(looper, sdk_pool_handle, nodeSet,
                                      sdk_wallet_trustee, added_claim_def_id):
     _, did = sdk_wallet_trustee
@@ -40,6 +41,7 @@ def test_send_get_claim_def_succeeds(looper, sdk_pool_handle, nodeSet,
     sdk_get_and_check_replies(looper, [sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_trustee, request)])
 
 
+@pytest.mark.claim_def
 def test_send_get_claim_def_succeeds_for_large_schema(looper, sdk_pool_handle, nodeSet,
                                                       sdk_wallet_trustee, added_claim_def_id_large_schema):
     _, did = sdk_wallet_trustee
@@ -47,6 +49,7 @@ def test_send_get_claim_def_succeeds_for_large_schema(looper, sdk_pool_handle, n
     sdk_get_and_check_replies(looper, [sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_trustee, request)])
 
 
+@pytest.mark.claim_def
 def test_send_get_claim_def_as_client_succeeds(
         looper,
         sdk_pool_handle,
@@ -58,6 +61,7 @@ def test_send_get_claim_def_as_client_succeeds(
     sdk_get_and_check_replies(looper, [sdk_sign_and_submit_req(sdk_pool_handle, sdk_wallet_client, request)])
 
 
+@pytest.mark.claim_def
 def test_send_get_claim_def_with_invalid_ref_fails(looper, sdk_pool_handle, nodeSet,
                                                    sdk_wallet_trustee, added_claim_def_id):
     _, did = sdk_wallet_trustee
@@ -68,6 +72,7 @@ def test_send_get_claim_def_with_invalid_ref_fails(looper, sdk_pool_handle, node
     e.match('expected types \'int\', got \'str\'')
 
 
+@pytest.mark.claim_def
 def test_send_get_claim_def_with_invalid_signature_not_get_claim(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, added_claim_def_id):
     _, did = sdk_wallet_trustee
diff --git a/indy_node/test/did/test_did_with_abbreviated_verkey.py b/indy_node/test/did/test_did_with_abbreviated_verkey.py
index 692d95060..7cc834787 100644
--- a/indy_node/test/did/test_did_with_abbreviated_verkey.py
+++ b/indy_node/test/did/test_did_with_abbreviated_verkey.py
@@ -1,25 +1,31 @@
+import pytest
+
 from indy_node.test.did.conftest import nym_get
 from indy_node.test.helper import sdk_rotate_verkey
 
 
-def testAddDidWithVerkey(nym_abbrv_vk):
+@pytest.mark.did
+def test_add_did_with_verkey(nym_abbrv_vk):
     pass
 
 
-def testRetrieveAbbrvVerkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_abbrv_vk):
+@pytest.mark.did
+def test_retrieve_abbrv_verkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_abbrv_vk):
     nwh, ndid, nvk = nym_abbrv_vk
     resp_data = nym_get(looper, sdk_pool_handle, sdk_wallet_trustee, ndid)
     assert ndid == resp_data[0]
     assert nvk == resp_data[1]
 
 
-def testChangeVerkeyToNewVerkey(looper, tconf, nodeSet, sdk_pool_handle, nym_abbrv_vk):
+@pytest.mark.did
+def test_change_verkey_to_new_verkey(looper, tconf, nodeSet, sdk_pool_handle, nym_abbrv_vk):
     wh, did, nvk = nym_abbrv_vk
     new_verkey = sdk_rotate_verkey(looper, sdk_pool_handle, wh, did, did)
     assert nvk != new_verkey
 
 
-def testRetrieveChangedVerkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_abbrv_vk):
+@pytest.mark.did
+def test_retrieve_changed_verkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_abbrv_vk):
     wh, did, vk = nym_abbrv_vk
     new_vk = sdk_rotate_verkey(looper, sdk_pool_handle, wh, did, did)
     resp_data = nym_get(looper, sdk_pool_handle, sdk_wallet_trustee, did)
@@ -28,7 +34,8 @@ def testRetrieveChangedVerkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_walle
     assert new_vk == resp_data[1]
 
 
-def testVerifySigWithChangedVerkey(looper, tconf, nodeSet, sdk_pool_handle, nym_abbrv_vk):
+@pytest.mark.did
+def test_verify_sig_with_changed_verkey(looper, tconf, nodeSet, sdk_pool_handle, nym_abbrv_vk):
     wh, did, vk = nym_abbrv_vk
     new_vk = sdk_rotate_verkey(looper, sdk_pool_handle, wh, did, did)
     # check sign by getting nym from ledger - if succ then sign is ok
diff --git a/indy_node/test/did/test_did_with_full_verkey.py b/indy_node/test/did/test_did_with_full_verkey.py
index 19b6da426..cd0d5ed74 100644
--- a/indy_node/test/did/test_did_with_full_verkey.py
+++ b/indy_node/test/did/test_did_with_full_verkey.py
@@ -1,25 +1,31 @@
+import pytest
+
 from indy_node.test.did.conftest import nym_get
 from indy_node.test.helper import sdk_rotate_verkey
 
 
-def testAddDidWithVerkey(nym_full_vk):
+@pytest.mark.did
+def test_add_did_with_verkey(nym_full_vk):
     pass
 
 
-def testRetrieveFullVerkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_full_vk):
+@pytest.mark.did
+def test_retrieve_full_verkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_full_vk):
     nwh, ndid, nvk = nym_full_vk
     resp_data = nym_get(looper, sdk_pool_handle, sdk_wallet_trustee, ndid)
     assert ndid == resp_data[0]
     assert nvk == resp_data[1]
 
 
-def testChangeVerkeyToNewVerkey(looper, tconf, nodeSet, sdk_pool_handle, nym_full_vk):
+@pytest.mark.did
+def test_change_verkey_to_new_verkey(looper, tconf, nodeSet, sdk_pool_handle, nym_full_vk):
     wh, did, nvk = nym_full_vk
     new_verkey = sdk_rotate_verkey(looper, sdk_pool_handle, wh, did, did)
     assert nvk != new_verkey
 
 
-def testRetrieveChangedVerkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_full_vk):
+@pytest.mark.did
+def test_retrieve_changed_verkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_full_vk):
     wh, did, vk = nym_full_vk
     new_vk = sdk_rotate_verkey(looper, sdk_pool_handle, wh, did, did)
     resp_data = nym_get(looper, sdk_pool_handle, sdk_wallet_trustee, did)
@@ -28,7 +34,8 @@ def testRetrieveChangedVerkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_walle
     assert new_vk == resp_data[1]
 
 
-def testVerifySigWithChangedVerkey(looper, tconf, nodeSet, sdk_pool_handle, nym_full_vk):
+@pytest.mark.did
+def test_verify_sig_with_changed_verkey(looper, tconf, nodeSet, sdk_pool_handle, nym_full_vk):
     wh, did, vk = nym_full_vk
     new_vk = sdk_rotate_verkey(looper, sdk_pool_handle, wh, did, did)
     # check sign by getting nym from ledger - if succ then sign is ok
diff --git a/indy_node/test/did/test_did_with_no_verkey.py b/indy_node/test/did/test_did_with_no_verkey.py
index 3735aa563..feb986ed7 100644
--- a/indy_node/test/did/test_did_with_no_verkey.py
+++ b/indy_node/test/did/test_did_with_no_verkey.py
@@ -1,26 +1,32 @@
+import pytest
+
 from indy_node.test.did.conftest import nym_get
 from indy_node.test.helper import sdk_rotate_verkey
 
 
-def testAddDidWithoutAVerkey(nym_empty_vk):
+@pytest.mark.did
+def test_add_did_without_a_verkey(nym_empty_vk):
     pass
 
 
-def testRetrieveEmptyVerkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_empty_vk):
+@pytest.mark.did
+def test_retrieve_empty_verkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_empty_vk):
     nwh, ndid = nym_empty_vk
     resp_data = nym_get(looper, sdk_pool_handle, sdk_wallet_trustee, ndid)
     assert ndid == resp_data[0]
     assert not resp_data[1]
 
 
-def testChangeEmptyVerkeyToNewVerkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_empty_vk):
+@pytest.mark.did
+def test_change_empty_verkey_to_new_verkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_empty_vk):
     _, did = nym_empty_vk
     trw, trd = sdk_wallet_trustee
     new_vk = sdk_rotate_verkey(looper, sdk_pool_handle, trw, trd, did)
     assert new_vk
 
 
-def testRetrieveChangedVerkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_empty_vk):
+@pytest.mark.did
+def test_retrieve_changed_verkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_empty_vk):
     _, did = nym_empty_vk
     trw, trd = sdk_wallet_trustee
     new_vk = sdk_rotate_verkey(looper, sdk_pool_handle, trw, trd, did)
@@ -29,7 +35,8 @@ def testRetrieveChangedVerkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_walle
     assert new_vk == resp_data[1]
 
 
-def testVerifySigWithChangedVerkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_empty_vk):
+@pytest.mark.did
+def test_verify_sig_with_changed_verkey(looper, tconf, nodeSet, sdk_pool_handle, sdk_wallet_trustee, nym_empty_vk):
     wh, did = nym_empty_vk
     trw, trd = sdk_wallet_trustee
     new_vk = sdk_rotate_verkey(looper, sdk_pool_handle, trw, trd, did)
diff --git a/indy_node/test/endorser/test_send_by_endorser.py b/indy_node/test/endorser/test_send_by_endorser.py
index 969d82fa6..0c174d1d1 100644
--- a/indy_node/test/endorser/test_send_by_endorser.py
+++ b/indy_node/test/endorser/test_send_by_endorser.py
@@ -19,6 +19,7 @@
 from plenum.test.helper import sdk_multisign_request_object, sdk_get_and_check_replies, sdk_send_signed_requests
 
 
+@pytest.mark.endorser
 def test_send_by_endorser(looper, sdk_pool_handle, sdk_wallet_new_client, sdk_wallet_endorser):
     # try writing without Endorser by a None-role client
     with pytest.raises(RequestRejectedException):
@@ -33,6 +34,7 @@ def test_send_by_endorser(looper, sdk_pool_handle, sdk_wallet_new_client, sdk_wa
                                      request_json=req_json)
 
 
+@pytest.mark.endorser
 def test_both_author_and_endorser_must_sign(looper, sdk_pool_handle, sdk_wallet_trustee, sdk_wallet_endorser):
     '''
     Both author and endorser must sign the request even if the author can send the request without Endorser
@@ -60,6 +62,7 @@ def test_both_author_and_endorser_must_sign(looper, sdk_pool_handle, sdk_wallet_
     sdk_get_and_check_replies(looper, [request_couple])
 
 
+@pytest.mark.endorser
 def test_endorser_field_must_be_explicit(looper, sdk_pool_handle, sdk_wallet_new_client, sdk_wallet_endorser):
     req_json = sdk_build_schema_request(looper, sdk_wallet_new_client,
                                         ["attr1", "attr2"], "name2", "3.0")
@@ -75,6 +78,7 @@ def test_endorser_field_must_be_explicit(looper, sdk_pool_handle, sdk_wallet_new
         sdk_get_and_check_replies(looper, [request_couple])
 
 
+@pytest.mark.endorser
 def test_endorser_must_have_known_role(looper, sdk_pool_handle, sdk_wallet_new_client, sdk_wallet_trustee):
     req_json = sdk_build_schema_request(looper, sdk_wallet_trustee,
                                         ["attr1", "attr2"], "name3", "4.0")
@@ -85,6 +89,7 @@ def test_endorser_must_have_known_role(looper, sdk_pool_handle, sdk_wallet_new_c
                                          request_json=req_json)
 
 
+@pytest.mark.endorser
 def test_endorser_not_required_when_two_trustee_sigs(looper, sdk_pool_handle, sdk_wallet_trustee_list):
     change_new_schema_auth_rule(looper, sdk_pool_handle, sdk_wallet_trustee_list[0],
                                 constraint=AuthConstraint(role=TRUSTEE, sig_count=2))
@@ -98,6 +103,7 @@ def test_endorser_not_required_when_two_trustee_sigs(looper, sdk_pool_handle, sd
     sdk_get_and_check_replies(looper, [request_couple])
 
 
+@pytest.mark.endorser
 def test_endorser_required_when_multi_sig_with_off_ledger_signature(looper, txnPoolNodeSet,
                                                                     sdk_wallet_client,
                                                                     sdk_pool_handle,
diff --git a/indy_node/test/node_control_utils/test_debian_version.py b/indy_node/test/node_control_utils/test_debian_version.py
index 85941898e..b2bdf3ff9 100644
--- a/indy_node/test/node_control_utils/test_debian_version.py
+++ b/indy_node/test/node_control_utils/test_debian_version.py
@@ -40,6 +40,7 @@ def _f(command, *args, **kwargs):
 
 
 # TODO coverage
+@pytest.mark.node_control_utils
 @pytest.mark.parametrize(
     'version',
     [
@@ -53,6 +54,7 @@ def test_invalid_no_upstream(version):
         DebianVersionTest(version)
 
 
+@pytest.mark.node_control_utils
 @pytest.mark.parametrize(
     'version',
     [
@@ -66,6 +68,7 @@ def test_invalid_epoch(version):
         DebianVersionTest(version)
 
 
+@pytest.mark.node_control_utils
 @pytest.mark.parametrize(
     'version',
     [
@@ -79,12 +82,14 @@ def test_invalid_upstream(version):
         DebianVersionTest(version)
 
 
+@pytest.mark.node_control_utils
 def test_invalid_upstream_keep_tilde():
     with pytest.raises(InvalidVersionError):
         DebianVersionTest('1.2.3~rc1', keep_tilde=True)
 
 
 # TODO coverage
+@pytest.mark.node_control_utils
 @pytest.mark.parametrize(
     'epoch,upstream,revision',
     [
@@ -116,10 +121,12 @@ def test_valid_version(epoch, upstream, revision):
     assert dv.release_parts == (epoch, upstream, revision)
 
 
+@pytest.mark.node_control_utils
 def test_default_upstream_cls():
     assert isinstance(DebianVersion('1.2.3').upstream, GenericVersion)
 
 
+@pytest.mark.node_control_utils
 def test_generated_cmd_cmp(catch_generated_command):
     version1 = '1.2.2'
     version2 = '1.2.3'
@@ -129,6 +136,7 @@ def test_generated_cmd_cmp(catch_generated_command):
     )
 
 
+@pytest.mark.node_control_utils
 def test_equal_no_shell_cmd(monkeypatch):
     called = 0
     run_shell_script_extended = NodeControlUtil.run_shell_script_extended
@@ -143,6 +151,7 @@ def _f(*args, **kwargs):
     assert not called
 
 
+@pytest.mark.node_control_utils
 def test_comparison_operators():
     assert DebianVersionTest('1.2.2') < DebianVersionTest('1.2.3')
     assert DebianVersionTest('1.2.3') > DebianVersionTest('1.2.2')
@@ -152,6 +161,7 @@ def test_comparison_operators():
     assert DebianVersionTest('1.2.3') != DebianVersionTest('1.2.2')
 
 
+@pytest.mark.node_control_utils
 def test_compare_called_once(monkeypatch):
     called = 0
     run_shell_script_extended = NodeControlUtil.run_shell_script_extended
@@ -168,6 +178,7 @@ def _f(*args, **kwargs):
     assert called == 1
 
 
+@pytest.mark.node_control_utils
 @pytest.mark.parametrize(
     'v1,v2,expected',
     [
@@ -184,6 +195,7 @@ def test_compare_valid(v1, v2, expected):
     assert res if expected else not res
 
 
+@pytest.mark.node_control_utils
 def test_compare_shell_error(monkeypatch):
     run_shell_script_extended = NodeControlUtil.run_shell_script_extended
 
diff --git a/indy_node/test/node_control_utils/test_node_control_util.py b/indy_node/test/node_control_utils/test_node_control_util.py
index 0ad8344fb..94d59e9bf 100644
--- a/indy_node/test/node_control_utils/test_node_control_util.py
+++ b/indy_node/test/node_control_utils/test_node_control_util.py
@@ -29,6 +29,7 @@ def _f(command, *args, **kwargs):
     monkeypatch.setattr(NodeControlUtil, 'run_shell_command', _f)
 
 
+@pytest.mark.node_control_utils
 def test_generated_cmd_get_curr_info(catch_generated_commands):
     pkg_name = 'some_package'
     # TODO not an API for now
@@ -37,6 +38,7 @@ def test_generated_cmd_get_curr_info(catch_generated_commands):
     assert generated_commands[0] == "dpkg -s {}".format(pkg_name)
 
 
+@pytest.mark.node_control_utils
 def test_generated_cmd_get_latest_pkg_version(catch_generated_commands):
     pkg_name = 'some_package'
     NodeControlUtil.get_latest_pkg_version(pkg_name)
@@ -58,6 +60,7 @@ def test_generated_cmd_get_latest_pkg_version(catch_generated_commands):
     )
 
 
+@pytest.mark.node_control_utils
 def test_generated_cmd_get_info_from_package_manager(catch_generated_commands):
     packages = ['package1', 'package2']
     # TODO not an API for now
@@ -66,12 +69,14 @@ def test_generated_cmd_get_info_from_package_manager(catch_generated_commands):
     assert generated_commands[0] == "apt-cache show {}".format(" ".join(packages))
 
 
+@pytest.mark.node_control_utils
 def test_generated_cmd_update_package_cache(catch_generated_commands):
     NodeControlUtil.update_package_cache()
     assert len(generated_commands) == 1
     assert generated_commands[0] == "apt update"
 
 
+@pytest.mark.node_control_utils
 def test_generated_cmd_get_sys_holds(monkeypatch, catch_generated_commands):
     monkeypatch.setattr(shutil, 'which', lambda *_: 'path')
     NodeControlUtil.get_sys_holds()
@@ -79,6 +84,7 @@ def test_generated_cmd_get_sys_holds(monkeypatch, catch_generated_commands):
     assert generated_commands[0] == "apt-mark showhold"
 
 
+@pytest.mark.node_control_utils
 def test_generated_cmd_hold_packages(monkeypatch, catch_generated_commands):
     packages = ['package1', 'package2']
     monkeypatch.setattr(shutil, 'which', lambda *_: 'path')
@@ -87,6 +93,7 @@ def test_generated_cmd_hold_packages(monkeypatch, catch_generated_commands):
     assert generated_commands[0] == "apt-mark hold {}".format(' '.join(packages))
 
 
+@pytest.mark.node_control_utils
 def test_get_latest_pkg_version_invalid_args():
     pkg_name = 'any_package'
     with pytest.raises(TypeError) as excinfo:
@@ -101,6 +108,7 @@ def test_get_latest_pkg_version_invalid_args():
     )
 
 
+@pytest.mark.node_control_utils
 @pytest.mark.parametrize(
     'pkg_name,upstream,output,expected',
     [
@@ -149,16 +157,19 @@ def _f(command, *args, **kwargs):
     assert expected == res if expected is None else res.upstream
 
 
+@pytest.mark.node_control_utils
 def test_get_latest_pkg_version_for_unknown_package():
     assert NodeControlUtil.get_latest_pkg_version(
         'some-unknown-package-name', update_cache=False) is None
 
 
+@pytest.mark.node_control_utils
 def test_curr_pkg_info_no_data(monkeypatch):
     monkeypatch.setattr(NodeControlUtil, 'run_shell_command', lambda *_: '')
     assert (None, []) == NodeControlUtil.curr_pkg_info('any_package')
 
 
+@pytest.mark.node_control_utils
 def test_curr_pkg_info(monkeypatch):
     output = 'Version: 1.2.3\nDepends: aaa (= 1.2.4), bbb (>= 1.2.5), ccc, aaa'
     expected_deps = ['aaa=1.2.4', 'bbb=1.2.5', 'ccc']
diff --git a/indy_node/test/node_txn/test_send_node_validation.py b/indy_node/test/node_txn/test_send_node_validation.py
index 3624ec213..5ef9f8713 100644
--- a/indy_node/test/node_txn/test_send_node_validation.py
+++ b/indy_node/test/node_txn/test_send_node_validation.py
@@ -29,7 +29,8 @@ def ensurePoolIsOperable(looper, sdk_pool_handle, sdk_wallet_creator):
     sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_creator)
 
 
-def testSendNodeFailsIfDestIsShortReadableName(
+@pytest.mark.node_txn
+def test_send_node_fails_if_dest_is_short_readable_name(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['dest'] = 'TheNewNode'
     steward_wallet, node = sdk_node_theta_added
@@ -41,7 +42,8 @@ def testSendNodeFailsIfDestIsShortReadableName(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfDestIsHexKey(
+@pytest.mark.node_txn
+def test_send_node_fails_if_dest_is_hex_key(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['dest'] = cryptonymToHex(
         node_request['operation']['dest']).decode() + "0"
@@ -54,7 +56,8 @@ def testSendNodeFailsIfDestIsHexKey(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeHasInvalidSyntaxIfDestIsEmpty(
+@pytest.mark.node_txn
+def test_send_node_has_invalid_syntax_if_dest_is_empty(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['dest'] = ''
     steward_wallet, node = sdk_node_theta_added
@@ -66,7 +69,8 @@ def testSendNodeHasInvalidSyntaxIfDestIsEmpty(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeHasInvalidSyntaxIfDestIsMissed(
+@pytest.mark.node_txn
+def test_send_node_has_invalid_syntax_if_dest_is_missed(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     del node_request['operation']['dest']
     steward_wallet, node = sdk_node_theta_added
@@ -78,7 +82,8 @@ def testSendNodeHasInvalidSyntaxIfDestIsMissed(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfNodeIpContainsLeadingSpace(
+@pytest.mark.node_txn
+def test_send_node_fails_if_node_ip_contains_leading_space(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][NODE_IP] = ' 122.62.52.13'
     steward_wallet, node = sdk_node_theta_added
@@ -90,7 +95,8 @@ def testSendNodeFailsIfNodeIpContainsLeadingSpace(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfNodeIpContainsTrailingSpace(
+@pytest.mark.node_txn
+def test_send_node_fails_if_node_ip_contains_trailing_space(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][NODE_IP] = '122.62.52.13 '
     steward_wallet, node = sdk_node_theta_added
@@ -103,7 +109,8 @@ def testSendNodeFailsIfNodeIpContainsTrailingSpace(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfNodeIpHasWrongFormat(
+@pytest.mark.node_txn
+def test_send_node_fails_if_node_ip_has_wrong_format(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][NODE_IP] = '122.62.52'
     steward_wallet, node = sdk_node_theta_added
@@ -115,7 +122,8 @@ def testSendNodeFailsIfNodeIpHasWrongFormat(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfSomeNodeIpComponentsAreNegative(
+@pytest.mark.node_txn
+def test_send_node_fails_if_some_node_ip_components_are_negative(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][NODE_IP] = '122.-1.52.13'
     steward_wallet, node = sdk_node_theta_added
@@ -127,7 +135,8 @@ def testSendNodeFailsIfSomeNodeIpComponentsAreNegative(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfSomeNodeIpComponentsAreHigherThanUpperBound(
+@pytest.mark.node_txn
+def test_send_node_fails_if_some_node_ip_components_are_higher_than_upper_bound(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][NODE_IP] = '122.62.256.13'
     steward_wallet, node = sdk_node_theta_added
@@ -139,7 +148,8 @@ def testSendNodeFailsIfSomeNodeIpComponentsAreHigherThanUpperBound(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfNodeIpIsEmpty(
+@pytest.mark.node_txn
+def test_send_node_fails_if_node_ip_is_empty(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][NODE_IP] = ''
     steward_wallet, node = sdk_node_theta_added
@@ -151,7 +161,8 @@ def testSendNodeFailsIfNodeIpIsEmpty(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfNodeIpIsMissed(
+@pytest.mark.node_txn
+def test_send_node_fails_if_node_ip_is_missed(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     del node_request['operation']['data'][NODE_IP]
     steward_wallet, node = sdk_node_theta_added
@@ -163,7 +174,8 @@ def testSendNodeFailsIfNodeIpIsMissed(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfNodePortIsNegative(
+@pytest.mark.node_txn
+def test_send_node_fails_if_node_port_is_negative(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][NODE_PORT] = -1
     steward_wallet, node = sdk_node_theta_added
@@ -175,7 +187,8 @@ def testSendNodeFailsIfNodePortIsNegative(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfNodePortIsHigherThanUpperBound(
+@pytest.mark.node_txn
+def test_send_node_fails_if_node_port_is_higher_than_upper_bound(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][NODE_PORT] = 65536
     steward_wallet, node = sdk_node_theta_added
@@ -187,7 +200,8 @@ def testSendNodeFailsIfNodePortIsHigherThanUpperBound(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfNodePortIsFloat(
+@pytest.mark.node_txn
+def test_send_node_fails_if_node_port_is_float(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][NODE_PORT] = 5555.5
     steward_wallet, node = sdk_node_theta_added
@@ -199,7 +213,8 @@ def testSendNodeFailsIfNodePortIsFloat(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfNodePortHasWrongFormat(
+@pytest.mark.node_txn
+def test_send_node_fails_if_node_port_has_wrong_format(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][NODE_PORT] = 'ninety'
     steward_wallet, node = sdk_node_theta_added
@@ -211,7 +226,8 @@ def testSendNodeFailsIfNodePortHasWrongFormat(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfNodePortIsEmpty(
+@pytest.mark.node_txn
+def test_send_node_fails_if_node_port_is_empty(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][NODE_PORT] = ''
     steward_wallet, node = sdk_node_theta_added
@@ -223,7 +239,8 @@ def testSendNodeFailsIfNodePortIsEmpty(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfNodePortIsMissed(
+@pytest.mark.node_txn
+def test_send_node_fails_if_node_port_is_missed(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     del node_request['operation']['data'][NODE_PORT]
     steward_wallet, node = sdk_node_theta_added
@@ -235,7 +252,8 @@ def testSendNodeFailsIfNodePortIsMissed(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfClientIpContainsLeadingSpace(
+@pytest.mark.node_txn
+def test_send_node_fails_if_client_ip_contains_leading_space(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][CLIENT_IP] = ' 122.62.52.13'
     steward_wallet, node = sdk_node_theta_added
@@ -247,7 +265,8 @@ def testSendNodeFailsIfClientIpContainsLeadingSpace(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfClientIpContainsTrailingSpace(
+@pytest.mark.node_txn
+def test_send_node_fails_if_client_ip_contains_trailing_space(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][CLIENT_IP] = '122.62.52.13 '
     steward_wallet, node = sdk_node_theta_added
@@ -259,7 +278,8 @@ def testSendNodeFailsIfClientIpContainsTrailingSpace(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfClientIpHasWrongFormat(
+@pytest.mark.node_txn
+def test_send_node_fails_if_client_ip_has_wrong_format(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][CLIENT_IP] = '122.62.52'
     steward_wallet, node = sdk_node_theta_added
@@ -271,7 +291,8 @@ def testSendNodeFailsIfClientIpHasWrongFormat(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfSomeClientIpComponentsAreNegative(
+@pytest.mark.node_txn
+def test_send_node_fails_if_some_client_ip_components_are_negative(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][CLIENT_IP] = '122.-1.52.13'
     steward_wallet, node = sdk_node_theta_added
@@ -283,7 +304,8 @@ def testSendNodeFailsIfSomeClientIpComponentsAreNegative(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfSomeClientIpComponentsAreHigherThanUpperBound(
+@pytest.mark.node_txn
+def test_send_node_fails_if_some_client_ip_components_are_higher_than_upper_bound(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][CLIENT_IP] = '122.62.256.13'
     steward_wallet, node = sdk_node_theta_added
@@ -295,7 +317,8 @@ def testSendNodeFailsIfSomeClientIpComponentsAreHigherThanUpperBound(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfClientIpIsEmpty(
+@pytest.mark.node_txn
+def test_send_node_fails_if_client_ip_is_empty(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][CLIENT_IP] = ''
     steward_wallet, node = sdk_node_theta_added
@@ -307,7 +330,8 @@ def testSendNodeFailsIfClientIpIsEmpty(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfClientIpIsMissed(
+@pytest.mark.node_txn
+def test_send_node_fails_if_client_ip_is_missed(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     del node_request['operation']['data'][CLIENT_IP]
     steward_wallet, node = sdk_node_theta_added
@@ -319,7 +343,8 @@ def testSendNodeFailsIfClientIpIsMissed(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfClientPortIsNegative(
+@pytest.mark.node_txn
+def test_send_node_fails_if_client_port_is_negative(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][CLIENT_PORT] = -1
     steward_wallet, node = sdk_node_theta_added
@@ -331,7 +356,8 @@ def testSendNodeFailsIfClientPortIsNegative(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfClientPortIsHigherThanUpperBound(
+@pytest.mark.node_txn
+def test_send_node_fails_if_client_port_is_higher_than_upper_bound(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][CLIENT_PORT] = 65536
     steward_wallet, node = sdk_node_theta_added
@@ -343,7 +369,8 @@ def testSendNodeFailsIfClientPortIsHigherThanUpperBound(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfClientPortIsFloat(
+@pytest.mark.node_txn
+def test_send_node_fails_if_client_port_is_float(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][CLIENT_PORT] = 5555.5
     steward_wallet, node = sdk_node_theta_added
@@ -355,7 +382,8 @@ def testSendNodeFailsIfClientPortIsFloat(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfClientPortHasWrongFormat(
+@pytest.mark.node_txn
+def test_send_node_fails_if_client_port_has_wrong_format(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][CLIENT_PORT] = 'ninety'
     steward_wallet, node = sdk_node_theta_added
@@ -367,7 +395,8 @@ def testSendNodeFailsIfClientPortHasWrongFormat(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfClientPortIsEmpty(
+@pytest.mark.node_txn
+def test_send_node_fails_if_client_port_is_empty(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][CLIENT_PORT] = ''
     steward_wallet, node = sdk_node_theta_added
@@ -379,7 +408,8 @@ def testSendNodeFailsIfClientPortIsEmpty(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfClientPortIsMissed(
+@pytest.mark.node_txn
+def test_send_node_fails_if_client_port_is_missed(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     del node_request['operation']['data'][CLIENT_PORT]
     steward_wallet, node = sdk_node_theta_added
@@ -391,7 +421,8 @@ def testSendNodeFailsIfClientPortIsMissed(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfAliasIsEmpty(
+@pytest.mark.node_txn
+def test_send_node_fails_if_alias_is_empty(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][ALIAS] = ''
     steward_wallet, node = sdk_node_theta_added
@@ -403,7 +434,8 @@ def testSendNodeFailsIfAliasIsEmpty(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfAliasIsMissed(
+@pytest.mark.node_txn
+def test_send_node_fails_if_alias_is_missed(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     del node_request['operation']['data'][ALIAS]
     steward_wallet, node = sdk_node_theta_added
@@ -415,7 +447,8 @@ def testSendNodeFailsIfAliasIsMissed(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfServicesContainsUnknownValue(
+@pytest.mark.node_txn
+def test_send_node_fails_if_services_contains_unknown_value(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][SERVICES] = [VALIDATOR, 'DECIDER']
     steward_wallet, node = sdk_node_theta_added
@@ -427,7 +460,8 @@ def testSendNodeFailsIfServicesContainsUnknownValue(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfServicesIsValidatorValue(
+@pytest.mark.node_txn
+def test_send_node_fails_if_services_is_validator_value(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][SERVICES] = VALIDATOR  # just string, not array
     steward_wallet, node = sdk_node_theta_added
@@ -439,7 +473,8 @@ def testSendNodeFailsIfServicesIsValidatorValue(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfServicesIsEmptyString(
+@pytest.mark.node_txn
+def test_send_node_fails_if_services_is_empty_string(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][SERVICES] = ''
     steward_wallet, node = sdk_node_theta_added
@@ -451,7 +486,8 @@ def testSendNodeFailsIfServicesIsEmptyString(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeSuccessIfDataContainsUnknownField(
+@pytest.mark.node_txn
+def test_send_node_success_if_data_contains_unknown_field(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'][SERVICES] = []
     node_request['operation']['data']['extra'] = 42
@@ -464,7 +500,8 @@ def testSendNodeSuccessIfDataContainsUnknownField(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfDataIsEmptyJson(
+@pytest.mark.node_txn
+def test_send_node_fails_if_data_is_empty_json(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'] = {}
     steward_wallet, node = sdk_node_theta_added
@@ -476,7 +513,8 @@ def testSendNodeFailsIfDataIsEmptyJson(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfDataIsBrokenJson(
+@pytest.mark.node_txn
+def test_send_node_fails_if_data_is_broken_json(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'] = "{'node_ip': '10.0.0.105', 'node_port': 9701"
     steward_wallet, node = sdk_node_theta_added
@@ -488,7 +526,8 @@ def testSendNodeFailsIfDataIsBrokenJson(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeFailsIfDataIsNotJson(
+@pytest.mark.node_txn
+def test_send_node_fails_if_data_is_not_json(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'] = 'not_json'
     steward_wallet, node = sdk_node_theta_added
@@ -500,7 +539,8 @@ def testSendNodeFailsIfDataIsNotJson(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeHasInvalidSyntaxIfDataIsEmptyString(
+@pytest.mark.node_txn
+def test_send_node_has_invalid_syntax_if_data_is_empty_string(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['data'] = ''
     steward_wallet, node = sdk_node_theta_added
@@ -512,7 +552,8 @@ def testSendNodeHasInvalidSyntaxIfDataIsEmptyString(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeHasInvalidSyntaxIfDataIsMissed(
+@pytest.mark.node_txn
+def test_send_node_has_invalid_syntax_if_data_is_missed(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     del node_request['operation']['data']
     steward_wallet, node = sdk_node_theta_added
@@ -525,7 +566,7 @@ def testSendNodeHasInvalidSyntaxIfDataIsMissed(
 
 
 @pytest.mark.skip(reason='INDY-1864')
-def testSendNodeHasInvalidSyntaxIfUnknownParameterIsPassed(
+def test_send_node_has_invalid_syntax_if_unknown_parameter_is_passed(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     node_request['operation']['albus'] = 'severus'
     steward_wallet, node = sdk_node_theta_added
@@ -535,7 +576,8 @@ def testSendNodeHasInvalidSyntaxIfUnknownParameterIsPassed(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeHasInvalidSyntaxIfAllParametersAreMissed(
+@pytest.mark.node_txn
+def test_send_node_has_invalid_syntax_if_all_parameters_are_missed(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     for f in node_request['operation'].keys():
         node_request['operation'][f] = ''
@@ -548,7 +590,8 @@ def testSendNodeHasInvalidSyntaxIfAllParametersAreMissed(
     ensurePoolIsOperable(looper, sdk_pool_handle, steward_wallet)
 
 
-def testSendNodeSucceedsIfServicesIsMissed(
+@pytest.mark.node_txn
+def test_send_node_succeeds_if_services_is_missed(
         looper, sdk_pool_handle, nodeSet, sdk_node_theta_added, node_request):
     del node_request['operation']['data'][SERVICES]
     steward_wallet, node = sdk_node_theta_added
diff --git a/indy_node/test/nym_txn/test_create_did_without_endorser.py b/indy_node/test/nym_txn/test_create_did_without_endorser.py
index ceb892b43..a3a84b90a 100644
--- a/indy_node/test/nym_txn/test_create_did_without_endorser.py
+++ b/indy_node/test/nym_txn/test_create_did_without_endorser.py
@@ -47,6 +47,7 @@ def change_auth_rule(looper, sdk_pool_handle, sdk_wallet_trustee, constraint):
     sdk_send_and_check_req_json(looper, sdk_pool_handle, sdk_wallet_trustee, req)
 
 
+@pytest.mark.nym_txn
 def test_create_did_without_endorser_fails(looper, txnPoolNodeSet, nym_txn_data, sdk_pool_handle):
     wh, alias, sender_did, sender_verkey = nym_txn_data
     nym_request = looper.loop.run_until_complete(
@@ -57,6 +58,7 @@ def test_create_did_without_endorser_fails(looper, txnPoolNodeSet, nym_txn_data,
         sdk_get_and_check_replies(looper, [request_couple])
 
 
+@pytest.mark.nym_txn
 def test_create_did_without_endorser(looper, txnPoolNodeSet, nym_txn_data, sdk_pool_handle, sdk_wallet_trustee):
     change_auth_rule(looper, sdk_pool_handle, sdk_wallet_trustee, constraint=AuthConstraint(role='*',
                                                                                             sig_count=1,
@@ -74,6 +76,7 @@ def test_create_did_without_endorser(looper, txnPoolNodeSet, nym_txn_data, sdk_p
     assert details[VERKEY] == sender_verkey
 
 
+@pytest.mark.nym_txn
 def test_create_did_without_endorser_empty_verkey(looper, nym_txn_data, sdk_wallet_client, sdk_pool_handle):
     wh, alias, sender_did, sender_verkey = nym_txn_data
 
@@ -85,6 +88,7 @@ def test_create_did_without_endorser_empty_verkey(looper, nym_txn_data, sdk_wall
         sdk_get_and_check_replies(looper, [request_couple])
 
 
+@pytest.mark.nym_txn
 def test_create_did_without_endorser_with_different_dest(looper, nym_txn_data, sdk_wallet_client, sdk_pool_handle):
     wh, alias, sender_did, sender_verkey = nym_txn_data
 
@@ -97,6 +101,7 @@ def test_create_did_without_endorser_with_different_dest(looper, nym_txn_data, s
         sdk_get_and_check_replies(looper, [request_couple])
 
 
+@pytest.mark.nym_txn
 def test_create_did_without_endorser_sig_count_0(looper, txnPoolNodeSet, nym_txn_data, sdk_pool_handle,
                                                  sdk_wallet_trustee):
     change_auth_rule(looper, sdk_pool_handle, sdk_wallet_trustee, constraint=AuthConstraint(role='*',
@@ -115,6 +120,7 @@ def test_create_did_without_endorser_sig_count_0(looper, txnPoolNodeSet, nym_txn
     assert details[VERKEY] == sender_verkey
 
 
+@pytest.mark.nym_txn
 def test_create_did_without_endorser_need_to_be(looper, txnPoolNodeSet, nym_txn_data, sdk_pool_handle,
                                                 sdk_wallet_trustee):
     change_auth_rule(looper, sdk_pool_handle, sdk_wallet_trustee, constraint=AuthConstraint(role='*',
diff --git a/indy_node/test/nym_txn/test_demote_network_monitor.py b/indy_node/test/nym_txn/test_demote_network_monitor.py
index 71c635e19..aa93264b3 100644
--- a/indy_node/test/nym_txn/test_demote_network_monitor.py
+++ b/indy_node/test/nym_txn/test_demote_network_monitor.py
@@ -9,6 +9,7 @@
 from plenum.test.pool_transactions.helper import sdk_add_new_nym
 
 
+@pytest.mark.nym_txn
 def test_network_monitor_suspension_by_another_steward(looper,
                                                        sdk_pool_handle,
                                                        sdk_wallet_steward,
@@ -51,6 +52,7 @@ def test_network_monitor_suspension_by_another_steward(looper,
             sdk_get_validator_info(looper, (sdk_wallet_handle, new_network_monitor_did), sdk_pool_handle)
 
 
+@pytest.mark.nym_txn
 def test_network_monitor_suspension_by_itself(looper,
                                               sdk_pool_handle,
                                               sdk_wallet_steward,
diff --git a/indy_node/test/nym_txn/test_nym.py b/indy_node/test/nym_txn/test_nym.py
index 31e179db7..02d16a786 100644
--- a/indy_node/test/nym_txn/test_nym.py
+++ b/indy_node/test/nym_txn/test_nym.py
@@ -6,10 +6,12 @@
 from plenum.test.pool_transactions.helper import sdk_add_new_nym
 
 
-def testStewardCreatesAEndorser(looper, sdk_pool_handle, sdk_wallet_steward):
+@pytest.mark.nym_txn
+def test_steward_creates_a_endorser(looper, sdk_pool_handle, sdk_wallet_steward):
     sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_steward, role=ENDORSER_STRING)
 
 
+@pytest.mark.nym_txn
 # FIXME why is it necessary to check
-def testStewardCreatesAnotherEndorser(looper, sdk_pool_handle, sdk_wallet_steward):
+def test_steward_creates_another_endorser(looper, sdk_pool_handle, sdk_wallet_steward):
     sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_steward, role=ENDORSER_STRING)
diff --git a/indy_node/test/nym_txn/test_nym_additional.py b/indy_node/test/nym_txn/test_nym_additional.py
index 1c589a27b..87032e8d0 100644
--- a/indy_node/test/nym_txn/test_nym_additional.py
+++ b/indy_node/test/nym_txn/test_nym_additional.py
@@ -1,4 +1,5 @@
 import json
+
 import pytest
 
 from indy.did import create_and_store_my_did, replace_keys_start, replace_keys_apply
@@ -33,9 +34,11 @@ def endorser_did_verkey(looper, sdk_wallet_client):
     return named_did, verkey
 
 
+@pytest.mark.nym_txn
 def test_pool_nodes_started(nodeSet):
     pass
 
+
 @pytest.fixture(scope='function', params=['trustee', 'steward'])
 def sdk_wallet(request, sdk_wallet_steward, sdk_wallet_trustee):
     if request.param == 'steward':
@@ -44,6 +47,7 @@ def sdk_wallet(request, sdk_wallet_steward, sdk_wallet_trustee):
         yield sdk_wallet_trustee
 
 
+@pytest.mark.nym_txn
 def test_send_same_nyms_only_first_gets_written(
         looper, sdk_pool_handle, sdk_wallet):
     wh, _ = sdk_wallet
@@ -71,6 +75,7 @@ def get_nym(looper, sdk_pool_handle, sdk_wallet_steward, t_did):
     return sdk_get_and_check_replies(looper, [req])
 
 
+@pytest.mark.nym_txn
 def test_get_nym_without_adding_it(looper, sdk_pool_handle, sdk_wallet_steward,
                                    endorser_did_verkey):
     t_did, _ = endorser_did_verkey
@@ -84,10 +89,12 @@ def nym_added(looper, sdk_pool_handle, sdk_wallet_steward, endorser_did_verkey):
     set_verkey(looper, sdk_pool_handle, sdk_wallet_steward, dest, None)
 
 
+@pytest.mark.nym_txn
 def test_add_nym(nym_added):
     pass
 
 
+@pytest.mark.nym_txn
 def test_get_nym_without_verkey(looper, sdk_pool_handle, sdk_wallet_steward, nym_added,
                                 endorser_did_verkey):
     t_did, _ = endorser_did_verkey
@@ -97,6 +104,7 @@ def test_get_nym_without_verkey(looper, sdk_pool_handle, sdk_wallet_steward, nym
 
 
 @pytest.fixture(scope="module")
+@pytest.mark.nym_txn
 def verkey_added_to_nym(looper, sdk_pool_handle, sdk_wallet_steward, nym_added, endorser_did_verkey):
     wh, _ = sdk_wallet_steward
     did, _ = endorser_did_verkey
@@ -105,10 +113,12 @@ def verkey_added_to_nym(looper, sdk_pool_handle, sdk_wallet_steward, nym_added,
     looper.loop.run_until_complete(replace_keys_apply(wh, did))
 
 
+@pytest.mark.nym_txn
 def test_add_verkey_to_existing_nym(verkey_added_to_nym):
     pass
 
 
+@pytest.mark.nym_txn
 def test_get_did_with_verkey(looper, sdk_pool_handle, sdk_wallet_steward, verkey_added_to_nym,
                              endorser_did_verkey):
     t_did, _ = endorser_did_verkey
@@ -117,6 +127,7 @@ def test_get_did_with_verkey(looper, sdk_pool_handle, sdk_wallet_steward, verkey
     assert json.loads(rep[0][1]['result']['data'])['verkey']
 
 
+@pytest.mark.nym_txn
 def test_send_attrib_for_did(looper, sdk_pool_handle, sdk_wallet_steward,
                              verkey_added_to_nym, endorser_did_verkey):
     raw = '{"name": "Alice"}'
@@ -126,6 +137,7 @@ def test_send_attrib_for_did(looper, sdk_pool_handle, sdk_wallet_steward,
 
 
 @pytest.fixture(scope="module")
+@pytest.mark.nym_txn
 def verkey_removed_from_existing_did(looper, sdk_pool_handle, sdk_wallet_steward,
                                      verkey_added_to_nym, endorser_did_verkey):
     did, _ = endorser_did_verkey
@@ -133,6 +145,7 @@ def verkey_removed_from_existing_did(looper, sdk_pool_handle, sdk_wallet_steward
     set_verkey(looper, sdk_pool_handle, (wh, did), did, None)
 
 
+@pytest.mark.nym_txn
 def test_remove_verkey_from_did(verkey_removed_from_existing_did):
     pass
 
@@ -141,6 +154,6 @@ def test_remove_verkey_from_did(verkey_removed_from_existing_did):
     reason="SOV-568. Obsolete assumption, if an identity has set "
            "its verkey to blank, no-one including "
            "itself can change it")
-def testNewverkey_added_to_nym(be, do, philCli, abbrevIdr,
+def test_newverkey_added_to_nym(be, do, philCli, abbrevIdr,
                                verkeyRemovedFromExistingDID):
     pass
diff --git a/indy_node/test/nym_txn/test_nym_auth_rules.py b/indy_node/test/nym_txn/test_nym_auth_rules.py
index f1c5f8c92..4a23a01c0 100644
--- a/indy_node/test/nym_txn/test_nym_auth_rules.py
+++ b/indy_node/test/nym_txn/test_nym_auth_rules.py
@@ -316,6 +316,8 @@ def sign_and_validate(looper, node, action_id, signer, op, did_ledger=None):
 # TESTS
 # Note. some fixtures are referred explicitly just to make test nodeid names predictable
 
+
+@pytest.mark.nym_txn
 def test_nym_add(
         provisioner_role, nym_add_dest_role, nym_add_dest_verkey,
         looper, txnPoolNodeSet,
@@ -323,6 +325,7 @@ def test_nym_add(
     sign_and_validate(looper, txnPoolNodeSet[0], ActionIds.add, provisioner, add_op)
 
 
+@pytest.mark.nym_txn
 def test_nym_edit(
         edited_ledger_role, edited_ledger_verkey, editor_type,
         edited_nym_role, edited_nym_verkey,
diff --git a/indy_node/test/nym_txn/test_nym_blacklisting.py b/indy_node/test/nym_txn/test_nym_blacklisting.py
index a5ef79315..e4e0b021b 100644
--- a/indy_node/test/nym_txn/test_nym_blacklisting.py
+++ b/indy_node/test/nym_txn/test_nym_blacklisting.py
@@ -8,6 +8,8 @@
 from plenum.test.pool_transactions.helper import sdk_add_new_nym
 
 
+
+@pytest.mark.nym_txn
 def test_steward_suspension_by_another_trustee(looper,
                                                sdk_pool_handle,
                                                sdk_wallet_trustee,
@@ -40,6 +42,7 @@ def test_steward_suspension_by_another_trustee(looper,
         sdk_get_and_check_replies(looper, [req])
 
 
+@pytest.mark.nym_txn
 def test_steward_cannot_create_endorsers_after_demote(looper,
                                                           sdk_pool_handle,
                                                           sdk_wallet_trustee,
diff --git a/indy_node/test/nym_txn/test_nym_no_role.py b/indy_node/test/nym_txn/test_nym_no_role.py
index b86c36c8d..c1852c784 100644
--- a/indy_node/test/nym_txn/test_nym_no_role.py
+++ b/indy_node/test/nym_txn/test_nym_no_role.py
@@ -7,6 +7,7 @@
 from plenum.test.helper import sdk_get_and_check_replies, sdk_sign_and_submit_op
 
 
+@pytest.mark.nym_txn
 def test_new_DID_cannot_update_another_DID(looper,
                                            sdk_pool_handle,
                                            sdk_wallet_trustee,
diff --git a/indy_node/test/nym_txn/test_nym_resend.py b/indy_node/test/nym_txn/test_nym_resend.py
index 89eb4586b..5b4b297f9 100644
--- a/indy_node/test/nym_txn/test_nym_resend.py
+++ b/indy_node/test/nym_txn/test_nym_resend.py
@@ -1,10 +1,14 @@
 import json
 
+import pytest
+
 from indy_node.test.helper import createHalfKeyIdentifierAndAbbrevVerkey
 from indy.ledger import sign_request, submit_request, build_nym_request
 from plenum.common.constants import REPLY, REJECT
 
 
+
+@pytest.mark.nym_txn
 def test_nym_send_twice(looper, sdk_pool_handle, sdk_wallet_steward):
     idr, verkey = createHalfKeyIdentifierAndAbbrevVerkey()
 
@@ -21,6 +25,7 @@ def test_nym_send_twice(looper, sdk_pool_handle, sdk_wallet_steward):
             assert result['op'] == REJECT
 
 
+@pytest.mark.nym_txn
 def test_nym_resend(looper, sdk_pool_handle, sdk_wallet_steward):
     idr, verkey = createHalfKeyIdentifierAndAbbrevVerkey()
 
diff --git a/indy_node/test/nym_txn/test_send_nym_validation.py b/indy_node/test/nym_txn/test_send_nym_validation.py
index a5abe10cc..b1fc06bda 100644
--- a/indy_node/test/nym_txn/test_send_nym_validation.py
+++ b/indy_node/test/nym_txn/test_send_nym_validation.py
@@ -29,7 +29,8 @@ def nym_request(looper, sdk_wallet_trustee):
     return json.loads(nym_request)
 
 
-def testSendNymSucceedsForUuidIdentifierAnsdk_pool_handlemittedVerkey(
+@pytest.mark.nym_txn
+def test_send_nym_succeeds_for_uuid_identifier_ansdk_pool_handlemitted_verkey(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     parameters = {
         'dest': createUuidIdentifier(),
@@ -41,7 +42,8 @@ def testSendNymSucceedsForUuidIdentifierAnsdk_pool_handlemittedVerkey(
     sdk_get_and_check_replies(looper, [request_couple])
 
 
-def testSendNymSucceedsForUuidIdentifierAndFullVerkey(
+@pytest.mark.nym_txn
+def test_send_nym_succeeds_for_uuid_identifier_and_full_verkey(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     uuidIdentifier, fullVerkey = createUuidIdentifierAndFullVerkey()
     parameters = {
@@ -55,7 +57,8 @@ def testSendNymSucceedsForUuidIdentifierAndFullVerkey(
     sdk_get_and_check_replies(looper, [request_couple])
 
 
-def testSendNymSucceedsForHalfKeyIdentifierAndAbbrevVerkey(
+@pytest.mark.nym_txn
+def test_send_nym_succeeds_for_half_key_identifier_and_abbrev_verkey(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     halfKeyIdentifier, abbrevVerkey = createHalfKeyIdentifierAndAbbrevVerkey()
     parameters = {
@@ -70,7 +73,7 @@ def testSendNymSucceedsForHalfKeyIdentifierAndAbbrevVerkey(
 
 
 @pytest.mark.skip(reason='INDY-210')
-def testSendNymFailsForCryptonymIdentifierAnsdk_pool_handlemittedVerkey(
+def test_send_nym_fails_for_cryptonym_identifier_ansdk_pool_handlemitted_verkey(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     parameters = {
         'dest': createCryptonym(),
@@ -83,7 +86,7 @@ def testSendNymFailsForCryptonymIdentifierAnsdk_pool_handlemittedVerkey(
 
 
 @pytest.mark.skip(reason='INDY-210')
-def testSendNymFailsForCryptonymIdentifierAndFullVerkey(
+def test_send_nym_fails_for_cryptonym_identifier_and_full_verkey(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     cryptonym = createCryptonym()
 
@@ -100,7 +103,8 @@ def testSendNymFailsForCryptonymIdentifierAndFullVerkey(
     sdk_get_and_check_replies(looper, [request_couple])
 
 
-def testSendNymFailsForCryptonymIdentifierAndMatchedAbbrevVerkey(
+@pytest.mark.nym_txn
+def test_send_nym_fails_for_cryptonym_identifier_and_matched_abbrev_verkey(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     cryptonym = createCryptonym()
 
@@ -119,7 +123,7 @@ def testSendNymFailsForCryptonymIdentifierAndMatchedAbbrevVerkey(
 
 
 @pytest.mark.skip(reason='SOV-1108')
-def testSendNymFailsIfIdentifierSizeIs15Bytes(
+def test_send_nym_fails_if_identifier_size_is15_bytes(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     parameters = {
         'dest': rawToFriendly(randombytes(15)),
@@ -132,7 +136,7 @@ def testSendNymFailsIfIdentifierSizeIs15Bytes(
 
 
 @pytest.mark.skip(reason='SOV-1108')
-def testSendNymFailsIfIdentifierSizeIs17Bytes(
+def test_send_nym_fails_if_identifier_size_is17_bytes(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     parameters = {
         'dest': rawToFriendly(randombytes(17)),
@@ -145,7 +149,7 @@ def testSendNymFailsIfIdentifierSizeIs17Bytes(
 
 
 @pytest.mark.skip(reason='SOV-1108')
-def testSendNymFailsIfFullVerkeySizeIs31Bytes(
+def test_send_nym_fails_if_full_verkey_size_is31_bytes(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     parameters = {
         'dest': rawToFriendly(randombytes(16)),
@@ -159,7 +163,7 @@ def testSendNymFailsIfFullVerkeySizeIs31Bytes(
 
 
 @pytest.mark.skip(reason='SOV-1108')
-def testSendNymFailsIfFullVerkeySizeIs33Bytes(
+def test_send_nym_fails_if_full_verkey_size_is33_bytes(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     parameters = {
         'dest': rawToFriendly(randombytes(16)),
@@ -173,7 +177,7 @@ def testSendNymFailsIfFullVerkeySizeIs33Bytes(
 
 
 @pytest.mark.skip(reason='SOV-1108')
-def testSendNymFailsIfAbbrevVerkeySizeIs15Bytes(
+def test_send_nym_fails_if_abbrev_verkey_size_is15_bytes(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     parameters = {
         'dest': rawToFriendly(randombytes(16)),
@@ -187,7 +191,7 @@ def testSendNymFailsIfAbbrevVerkeySizeIs15Bytes(
 
 
 @pytest.mark.skip(reason='SOV-1108')
-def testSendNymFailsIfAbbrevVerkeySizeIs17Bytes(
+def test_send_nym_fails_if_abbrev_verkey_size_is17_bytes(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     parameters = {
         'dest': rawToFriendly(randombytes(16)),
@@ -201,7 +205,7 @@ def testSendNymFailsIfAbbrevVerkeySizeIs17Bytes(
 
 
 @pytest.mark.skip(reason='SOV-1109')
-def testSendNymFailsIfUuidIdentifierIsHexEncoded(
+def test_send_nym_fails_if_uuid_identifier_is_hex_encoded(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     parameters = {
         'dest': friendlyToHexStr(createUuidIdentifier()),
@@ -214,7 +218,7 @@ def testSendNymFailsIfUuidIdentifierIsHexEncoded(
 
 
 @pytest.mark.skip(reason='SOV-1109')
-def testSendNymFailsIfFullVerkeyIsHexEncoded(
+def test_send_nym_fails_if_full_verkey_is_hex_encoded(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     uuidIdentifier, fullVerkey = createUuidIdentifierAndFullVerkey()
     parameters = {
@@ -229,7 +233,7 @@ def testSendNymFailsIfFullVerkeyIsHexEncoded(
 
 
 @pytest.mark.skip(reason='SOV-1109')
-def testSendNymFailsIfAbbrevVerkeyIsHexEncoded(
+def test_send_nym_fails_if_abbrev_verkey_is_hex_encoded(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     halfKeyIdentifier, abbrevVerkey = createHalfKeyIdentifierAndAbbrevVerkey()
     parameters = {
@@ -244,7 +248,7 @@ def testSendNymFailsIfAbbrevVerkeyIsHexEncoded(
 
 
 @pytest.mark.skip(reason='SOV-1109')
-def testSendNymFailsIfIdentifierContainsNonBase58Characters(
+def test_send_nym_fails_if_identifier_contains_non_base58_characters(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     uuidIdentifier = createUuidIdentifier()
     parameters = {
@@ -258,7 +262,7 @@ def testSendNymFailsIfIdentifierContainsNonBase58Characters(
 
 
 @pytest.mark.skip(reason='SOV-1109')
-def testSendNymFailsIfFullVerkeyContainsNonBase58Characters(
+def test_send_nym_fails_if_full_verkey_contains_non_base58_characters(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     uuidIdentifier, fullVerkey = createUuidIdentifierAndFullVerkey()
     parameters = {
@@ -273,7 +277,7 @@ def testSendNymFailsIfFullVerkeyContainsNonBase58Characters(
 
 
 @pytest.mark.skip(reason='SOV-1109')
-def testSendNymFailsIfAbbrevVerkeyContainsNonBase58Characters(
+def test_send_nym_fails_if_abbrev_verkey_contains_non_base58_characters(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     halfKeyIdentifier, abbrevVerkey = createHalfKeyIdentifierAndAbbrevVerkey()
     parameters = {
@@ -288,7 +292,7 @@ def testSendNymFailsIfAbbrevVerkeyContainsNonBase58Characters(
 
 
 @pytest.mark.skip(reason='SOV-1109')
-def testSendNymFailsIfFullVerkeyContainsTilde(
+def test_send_nym_fails_if_full_verkey_contains_tilde(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     uuidIdentifier, fullVerkey = createUuidIdentifierAndFullVerkey()
     parameters = {
@@ -303,7 +307,7 @@ def testSendNymFailsIfFullVerkeyContainsTilde(
 
 
 @pytest.mark.skip(reason='SOV-1109')
-def testSendNymFailsIfAbbrevVerkeysdk_pool_handleesNotContainTilde(
+def test_send_nym_fails_if_abbrev_verkeysdk_pool_handlees_not_contain_tilde(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     halfKeyIdentifier, abbrevVerkey = createHalfKeyIdentifierAndAbbrevVerkey()
     parameters = {
@@ -318,7 +322,7 @@ def testSendNymFailsIfAbbrevVerkeysdk_pool_handleesNotContainTilde(
 
 
 @pytest.mark.skip(reason='SOV-1110')
-def testSendNymFailsIfRoleIsUnknown(
+def test_send_nym_fails_if_role_is_unknown(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     halfKeyIdentifier, abbrevVerkey = createHalfKeyIdentifierAndAbbrevVerkey()
     parameters = {
@@ -333,7 +337,7 @@ def testSendNymFailsIfRoleIsUnknown(
 
 
 @pytest.mark.skip(reason='SOV-1110')
-def testSendNymFailsIfRoleIsSpecifiedUsingNumericCode(
+def test_send_nym_fails_if_role_is_specified_using_numeric_code(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     halfKeyIdentifier, abbrevVerkey = createHalfKeyIdentifierAndAbbrevVerkey()
     parameters = {
@@ -348,7 +352,7 @@ def testSendNymFailsIfRoleIsSpecifiedUsingNumericCode(
 
 
 @pytest.mark.skip(reason='SOV-1111')
-def testSendNymHasInvalidSyntaxIfParametersOrderIsWrong(
+def test_send_nym_has_invalid_syntax_if_parameters_order_is_wrong(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     halfKeyIdentifier, abbrevVerkey = createHalfKeyIdentifierAndAbbrevVerkey()
     parameters = {
@@ -363,7 +367,7 @@ def testSendNymHasInvalidSyntaxIfParametersOrderIsWrong(
 
 
 @pytest.mark.skip(reason='SOV-1111')
-def testSendNymHasInvalidSyntaxIfIdentifierIsEmpty(
+def test_send_nym_has_invalid_syntax_if_identifier_is_empty(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     _, fullVerkey = createUuidIdentifierAndFullVerkey()
     parameters = {
@@ -378,7 +382,7 @@ def testSendNymHasInvalidSyntaxIfIdentifierIsEmpty(
 
 
 @pytest.mark.skip(reason='SOV-1111')
-def testSendNymHasInvalidSyntaxIfIdentifierIsOmitted(
+def test_send_nym_has_invalid_syntax_if_identifier_is_omitted(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     _, fullVerkey = createUuidIdentifierAndFullVerkey()
     parameters = {
@@ -391,7 +395,8 @@ def testSendNymHasInvalidSyntaxIfIdentifierIsOmitted(
     sdk_get_and_check_replies(looper, [request_couple])
 
 
-def testSendNymHasInvalidSyntaxForUuidIdentifierAndEmptyVerkey(
+@pytest.mark.nym_txn
+def test_send_nym_has_invalid_syntax_for_uuid_identifier_and_empty_verkey(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     parameters = {
         'dest': createUuidIdentifier(),
@@ -406,7 +411,7 @@ def testSendNymHasInvalidSyntaxForUuidIdentifierAndEmptyVerkey(
 
 
 @pytest.mark.skip(reason='SOV-1111')
-def testSendNymHasInvalidSyntaxIfIdentifierAndVerkeyAreOmitted(
+def test_send_nym_has_invalid_syntax_if_identifier_and_verkey_are_omitted(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     parameters = {
         'role': ENDORSER
@@ -418,7 +423,7 @@ def testSendNymHasInvalidSyntaxIfIdentifierAndVerkeyAreOmitted(
 
 
 @pytest.mark.skip(reason='SOV-1111')
-def testSendNymHasInvalidSyntaxIfUnknownParameterIsPassed(
+def test_send_nym_has_invalid_syntax_if_unknown_parameter_is_passed(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     uuidIdentifier, fullVerkey = createUuidIdentifierAndFullVerkey()
     parameters = {
@@ -433,7 +438,8 @@ def testSendNymHasInvalidSyntaxIfUnknownParameterIsPassed(
     sdk_get_and_check_replies(looper, [request_couple])
 
 
-def testSendNymHasInvalidSyntaxIfAllParametersAreOmitted(
+@pytest.mark.nym_txn
+def test_send_nym_has_invalid_syntax_if_all_parameters_are_omitted(
         looper, sdk_pool_handle, txnPoolNodeSet, nym_request, sdk_wallet_trustee):
     for f in nym_request[OPERATION].keys():
         nym_request[OPERATION][f] = ''
diff --git a/indy_node/test/package/test_metadata.py b/indy_node/test/package/test_metadata.py
index e1b02a5b2..424b663ba 100644
--- a/indy_node/test/package/test_metadata.py
+++ b/indy_node/test/package/test_metadata.py
@@ -30,6 +30,7 @@ def idfn(v):
     return str(v).replace(' ', '')
 
 
+@pytest.mark.package
 @pytest.mark.parametrize(
     'version',
     [
@@ -50,7 +51,7 @@ def test_load_version_invalid(version, version_file_path):
 
 
 # TODO ??? wider coverage
-
+@pytest.mark.package
 @pytest.mark.parametrize(
     'version',
     [
@@ -72,6 +73,7 @@ def test_set_version_invalid(version, version_file_path):
         set_version(version, version_file_path)
 
 
+@pytest.mark.package
 @pytest.mark.parametrize(
     'version',
     [
@@ -85,12 +87,13 @@ def test_set_load_version_valid(version, version_file_path):
     assert load_version(version_file_path) == NodeVersion(version)
 
 
-
+@pytest.mark.package
 def test_load_absent_manifest(manifest_file_path):
     assert load_manifest(manifest_file_path) is None
 
 
 # TODO ??? wider coverage
+@pytest.mark.package
 @pytest.mark.parametrize(
     'manifest',
     [
diff --git a/indy_node/test/persistence/test_idr_cache.py b/indy_node/test/persistence/test_idr_cache.py
index f656795a8..edc0f62e0 100644
--- a/indy_node/test/persistence/test_idr_cache.py
+++ b/indy_node/test/persistence/test_idr_cache.py
@@ -1,15 +1,16 @@
+import pytest
 from plenum.common.util import get_utc_epoch
 from storage.kv_in_memory import KeyValueStorageInMemory
 from indy_node.persistence.idr_cache import IdrCache
 
 identifier = "fake_identifier"
-committed_items = (0,   # seq_no
-                   get_utc_epoch(), # txn_time
+committed_items = (0,  # seq_no
+                   get_utc_epoch(),  # txn_time
                    "committed_ta_value",
                    "committed_role_value",
                    "committed_verkey_value",)
 uncommitted_items = (1,
-                     get_utc_epoch(), # txn_time
+                     get_utc_epoch(),  # txn_time
                      "uncommitted_ta_value",
                      "uncommitted_role_value",
                      "uncommitted_verkey_value",)
@@ -21,6 +22,7 @@ def make_idr_cache():
     return cache
 
 
+@pytest.mark.persistance
 def test_committed():
     """
     Check that it is possible to set and get committed items
@@ -33,6 +35,7 @@ def test_committed():
     assert committed_items == real_items
 
 
+@pytest.mark.persistance
 def test_uncommitted():
     """
     Check that it is possible to set and get uncommitted items
@@ -43,6 +46,7 @@ def test_uncommitted():
     assert uncommitted_items == real_items
 
 
+@pytest.mark.persistance
 def test_committed_and_uncommitted():
     """
     Check that uncommitted and committed can present together
diff --git a/indy_node/test/persistence/test_idr_cache_update_after_catchup.py b/indy_node/test/persistence/test_idr_cache_update_after_catchup.py
index 9926c13a1..4e75b75d7 100644
--- a/indy_node/test/persistence/test_idr_cache_update_after_catchup.py
+++ b/indy_node/test/persistence/test_idr_cache_update_after_catchup.py
@@ -1,5 +1,6 @@
 import json
 
+import pytest
 from indy.ledger import build_nym_request, sign_request, submit_request
 
 from indy_common.state import domain
@@ -10,6 +11,7 @@
 from plenum.test.pool_transactions.helper import disconnect_node_and_ensure_disconnected
 
 
+@pytest.mark.persistance
 def test_idr_cache_update_after_catchup(txnPoolNodeSet,
                                         looper,
                                         sdk_pool_handle,
diff --git a/indy_node/test/pool_config/test_pool_config.py b/indy_node/test/pool_config/test_pool_config.py
index 834961a77..702f44620 100644
--- a/indy_node/test/pool_config/test_pool_config.py
+++ b/indy_node/test/pool_config/test_pool_config.py
@@ -31,7 +31,8 @@ def sdk_pool_bad_config_sent(looper, sdk_pool_handle, sdk_wallet_trustee, change
     return req
 
 
-def testPoolConfigInvalidSyntax(looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWTFF):
+@pytest.mark.pool_config
+def test_pool_config_invalid_syntax(looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWTFF):
     req = sdk_pool_bad_config_sent(looper, sdk_pool_handle, sdk_wallet_trustee,
                                    'wites', 'force', True, False)
     sdk_get_bad_response(looper, [req], RequestNackedException, 'missed fields - writes')
@@ -43,7 +44,8 @@ def testPoolConfigInvalidSyntax(looper, sdk_pool_handle, sdk_wallet_trustee, poo
     sdk_get_bad_response(looper, [req], RequestNackedException, 'expected types \'bool\', got \'int\'')
 
 
-def testPoolConfigWritableFalse(looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWFFF):
+@pytest.mark.pool_config
+def test_pool_config_writable_false(looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWFFF):
     sdk_ensure_pool_config_sent(looper, sdk_pool_handle, sdk_wallet_trustee,
                                 poolConfigWFFF)
     with pytest.raises(RequestNackedException) as e:
@@ -51,7 +53,8 @@ def testPoolConfigWritableFalse(looper, sdk_pool_handle, sdk_wallet_trustee, poo
     e.match('Pool is in readonly mode')
 
 
-def testPoolConfigWritableTrue(looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWTFF):
+@pytest.mark.pool_config
+def test_pool_config_writable_true(looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWTFF):
     with pytest.raises(RequestNackedException) as e:
         sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     e.match('Pool is in readonly mode')
@@ -60,7 +63,8 @@ def testPoolConfigWritableTrue(looper, sdk_pool_handle, sdk_wallet_trustee, pool
     sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
 
 
-def testPoolConfigWritableFalseCanRead(looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWFFF):
+@pytest.mark.pool_config
+def test_pool_config_writable_false_can_read(looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWFFF):
     _, did = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     get_nym(looper, sdk_pool_handle, sdk_wallet_trustee, did)
     sdk_ensure_pool_config_sent(looper, sdk_pool_handle, sdk_wallet_trustee,
@@ -71,12 +75,13 @@ def testPoolConfigWritableFalseCanRead(looper, sdk_pool_handle, sdk_wallet_trust
     get_nym(looper, sdk_pool_handle, sdk_wallet_trustee, did)
 
 
-def testPoolUpgradeOnReadonlyPool(
+@pytest.mark.pool_config
+def test_pool_upgrade_on_readonly_pool(
         looper, nodeSet, sdk_pool_handle, sdk_wallet_trustee, validUpgrade, poolConfigWFFF):
     sdk_ensure_pool_config_sent(looper, sdk_pool_handle, sdk_wallet_trustee,
                                 poolConfigWFFF)
     sdk_ensure_upgrade_sent(looper, sdk_pool_handle, sdk_wallet_trustee,
-                     validUpgrade)
+                            validUpgrade)
 
     for node in nodeSet:
         assert len(node.upgrader.aqStash) > 0
diff --git a/indy_node/test/pool_config/test_send_pool_config.py b/indy_node/test/pool_config/test_send_pool_config.py
index 04f9c391e..560729506 100644
--- a/indy_node/test/pool_config/test_send_pool_config.py
+++ b/indy_node/test/pool_config/test_send_pool_config.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_node.test.pool_config.helper import check_pool_config_writable_set, \
     sdk_ensure_pool_config_sent, sdk_pool_config_sent
 from stp_core.loop.eventually import eventually
@@ -5,6 +7,7 @@
 from plenum.test.pool_transactions.helper import disconnect_node_and_ensure_disconnected
 
 
+@pytest.mark.pool_config
 def test_send_pool_config_writes_false_force_false(
         nodeSet, looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWFFF):
     sdk_ensure_pool_config_sent(looper, sdk_pool_handle, sdk_wallet_trustee,
@@ -12,6 +15,7 @@ def test_send_pool_config_writes_false_force_false(
     check_pool_config_writable_set(nodeSet, False)
 
 
+@pytest.mark.pool_config
 def test_send_pool_config_writes_true_force_true(
         nodeSet, looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWTFT):
     sdk_ensure_pool_config_sent(looper, sdk_pool_handle, sdk_wallet_trustee,
@@ -19,6 +23,7 @@ def test_send_pool_config_writes_true_force_true(
     check_pool_config_writable_set(nodeSet, True)
 
 
+@pytest.mark.pool_config
 def test_send_pool_config_writes_false_force_true(
         nodeSet, looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWFFT):
     sdk_ensure_pool_config_sent(looper, sdk_pool_handle, sdk_wallet_trustee,
@@ -26,6 +31,7 @@ def test_send_pool_config_writes_false_force_true(
     check_pool_config_writable_set(nodeSet, False)
 
 
+@pytest.mark.pool_config
 def test_send_pool_config_writes_true_force_false(
         nodeSet, looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWTFF):
     sdk_ensure_pool_config_sent(looper, sdk_pool_handle, sdk_wallet_trustee,
@@ -33,6 +39,7 @@ def test_send_pool_config_writes_true_force_false(
     check_pool_config_writable_set(nodeSet, True)
 
 
+@pytest.mark.pool_config
 def test_send_pool_config_2_nodes_can_force_writes_false_force_true(
         nodeSet, looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWFFT):
     assert len(nodeSet) == 4
diff --git a/indy_node/test/pool_config/test_send_pool_config_only_trustee.py b/indy_node/test/pool_config/test_send_pool_config_only_trustee.py
index 3c2417935..9e5b78a3c 100644
--- a/indy_node/test/pool_config/test_send_pool_config_only_trustee.py
+++ b/indy_node/test/pool_config/test_send_pool_config_only_trustee.py
@@ -1,3 +1,4 @@
+import pytest
 from plenum.common.exceptions import RequestRejectedException, RequestNackedException
 from plenum.test.helper import sdk_get_bad_response
 from plenum.test.pool_transactions.helper import sdk_add_new_nym
@@ -5,6 +6,7 @@
 from plenum.common.constants import STEWARD_STRING
 
 
+@pytest.mark.pool_config
 def test_only_trustee_send_pool_config_writes_true_force_false(
         nodeSet, looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWTFF):
     sdk_wallet_steward = sdk_add_new_nym(looper, sdk_pool_handle,
@@ -13,6 +15,7 @@ def test_only_trustee_send_pool_config_writes_true_force_false(
     sdk_get_bad_response(looper, [req], RequestRejectedException, "Not enough TRUSTEE signatures")
 
 
+@pytest.mark.pool_config
 def test_only_trustee_send_pool_config_writes_false_force_false(
         nodeSet, looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWFFF):
     sdk_wallet_steward = sdk_add_new_nym(looper, sdk_pool_handle,
@@ -21,6 +24,7 @@ def test_only_trustee_send_pool_config_writes_false_force_false(
     sdk_get_bad_response(looper, [req], RequestRejectedException, "Not enough TRUSTEE signatures")
 
 
+@pytest.mark.pool_config
 def test_only_trustee_send_pool_config_writes_true_force_true(
         nodeSet, looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWTFT):
     sdk_wallet_steward = sdk_add_new_nym(looper, sdk_pool_handle,
@@ -29,6 +33,7 @@ def test_only_trustee_send_pool_config_writes_true_force_true(
     sdk_get_bad_response(looper, [req], RequestNackedException, "Not enough TRUSTEE signatures")
 
 
+@pytest.mark.pool_config
 def test_only_trustee_send_pool_config_writes_false_force_true(
         nodeSet, looper, sdk_pool_handle, sdk_wallet_trustee, poolConfigWFFT):
     sdk_wallet_steward = sdk_add_new_nym(looper, sdk_pool_handle,
diff --git a/indy_node/test/pool_restart/test_fail_pool_restart.py b/indy_node/test/pool_restart/test_fail_pool_restart.py
index fff79d0e5..8fe84d5d8 100644
--- a/indy_node/test/pool_restart/test_fail_pool_restart.py
+++ b/indy_node/test/pool_restart/test_fail_pool_restart.py
@@ -9,6 +9,7 @@
     sdk_get_reply, sdk_get_and_check_replies
 
 
+@pytest.mark.pool_restart
 def test_fail_pool_restart_with_steward_role(
         sdk_pool_handle, sdk_wallet_steward, looper):
     op = {
@@ -25,6 +26,7 @@ def test_fail_pool_restart_with_steward_role(
     assert excinfo.match('Not enough TRUSTEE signatures')
 
 
+@pytest.mark.pool_restart
 def test_fail_pool_restart_with_invalid_datetime(
         sdk_pool_handle, sdk_wallet_steward, looper):
     invalid_datetime = "12.05.2018 4/40"
diff --git a/indy_node/test/pool_restart/test_node_control_tool_for_restart.py b/indy_node/test/pool_restart/test_node_control_tool_for_restart.py
index 9e71752b2..5040c766e 100644
--- a/indy_node/test/pool_restart/test_node_control_tool_for_restart.py
+++ b/indy_node/test/pool_restart/test_node_control_tool_for_restart.py
@@ -23,6 +23,7 @@ def tconf(tconf, tdir):
     yield tconf
 
 
+@pytest.mark.pool_restart
 def test_node_control_tool_restart(looper, tdir, monkeypatch, tconf):
     received = m.list()
     msg = RESTART_MESSAGE
@@ -44,6 +45,7 @@ def check_message():
         nct.stop()
 
 
+@pytest.mark.pool_restart
 def test_communication_with_node_control_tool(looper, tdir, tconf, monkeypatch):
     received = m.list()
     msg = RESTART_MESSAGE
diff --git a/indy_node/test/pool_restart/test_pool_restart.py b/indy_node/test/pool_restart/test_pool_restart.py
index e0ef51421..558ddcd87 100644
--- a/indy_node/test/pool_restart/test_pool_restart.py
+++ b/indy_node/test/pool_restart/test_pool_restart.py
@@ -2,6 +2,7 @@
 from datetime import datetime, timedelta
 
 import dateutil
+import pytest
 from jsonpickle import json
 
 from indy_node.server.restart_log import RestartLog, RestartLogData
@@ -14,6 +15,7 @@
 from plenum.test.testing_utils import FakeSomething
 
 
+@pytest.mark.pool_restart
 def test_pool_restart(
         sdk_pool_handle, sdk_wallet_trustee, looper, tconf, txnPoolNodeSet):
 
@@ -38,6 +40,7 @@ def test_pool_restart(
     _comparison_reply(responses, req_obj)
 
 
+@pytest.mark.pool_restart
 def test_restarter_can_initialize_after_pool_restart(txnPoolNodeSet):
     '''
     1. Add restart schedule message to ActionLog
@@ -56,6 +59,7 @@ def test_restarter_can_initialize_after_pool_restart(txnPoolNodeSet):
               actionLog=restarted_node.restarter._actionLog)
 
 
+@pytest.mark.pool_restart
 def test_pool_restart_cancel(
         sdk_pool_handle, sdk_wallet_trustee, looper, tconf, txnPoolNodeSet):
     loop = asyncio.get_event_loop()
@@ -88,12 +92,14 @@ def test_pool_restart_cancel(
     _comparison_reply(responses, req_obj)
 
 
+@pytest.mark.pool_restart
 def test_pool_restart_now_without_datetime(
         sdk_pool_handle, sdk_wallet_trustee, looper, tdir, tconf):
     pool_restart_now(sdk_pool_handle, sdk_wallet_trustee, looper,
                      tdir, tconf, START)
 
 
+@pytest.mark.pool_restart
 def test_pool_restart_in_view_change(sdk_pool_handle, sdk_wallet_trustee, looper,
                                      tdir, tconf, txnPoolNodeSet):
 
diff --git a/indy_node/test/pool_restart/test_pool_restart_now_with_empty_datetime.py b/indy_node/test/pool_restart/test_pool_restart_now_with_empty_datetime.py
index ac3e22215..71046ce0e 100644
--- a/indy_node/test/pool_restart/test_pool_restart_now_with_empty_datetime.py
+++ b/indy_node/test/pool_restart/test_pool_restart_now_with_empty_datetime.py
@@ -1,7 +1,10 @@
+import pytest
+
 from indy_common.constants import START
 from indy_node.test.pool_restart.test_pool_restart import pool_restart_now
 
 
+@pytest.mark.pool_restart
 def test_pool_restart_now_with_empty_datetime(
         sdk_pool_handle, sdk_wallet_trustee, looper, tdir, tconf):
     pool_restart_now(sdk_pool_handle, sdk_wallet_trustee, looper,
diff --git a/indy_node/test/pool_restart/test_pool_restarts_one_by_one.py b/indy_node/test/pool_restart/test_pool_restarts_one_by_one.py
index d12f6ff57..702712672 100644
--- a/indy_node/test/pool_restart/test_pool_restarts_one_by_one.py
+++ b/indy_node/test/pool_restart/test_pool_restarts_one_by_one.py
@@ -1,6 +1,7 @@
 from datetime import datetime, timedelta
 
 import dateutil
+import pytest
 
 from indy_common.constants import START
 from indy_node.server.restart_log import RestartLog
@@ -8,6 +9,7 @@
 from indy_node.test.pool_restart.test_pool_restart import _comparison_reply, _check_restart_log
 
 
+@pytest.mark.pool_restart
 def test_pool_restarts_one_by_one(
         sdk_pool_handle, sdk_wallet_trustee, looper, tconf, txnPoolNodeSet):
     server, indicator = looper.loop.run_until_complete(
diff --git a/indy_node/test/pool_restart/test_pool_restarts_one_by_one_with_restart_now.py b/indy_node/test/pool_restart/test_pool_restarts_one_by_one_with_restart_now.py
index c4944abcc..ebffad175 100644
--- a/indy_node/test/pool_restart/test_pool_restarts_one_by_one_with_restart_now.py
+++ b/indy_node/test/pool_restart/test_pool_restarts_one_by_one_with_restart_now.py
@@ -2,12 +2,15 @@
 
 from datetime import datetime, timedelta
 
+import pytest
+
 from indy_common.constants import START
 from indy_node.server.restart_log import RestartLog
 from indy_node.test.pool_restart.helper import _createServer, sdk_send_restart, _stopServer
 from indy_node.test.pool_restart.test_pool_restart import _comparison_reply, _check_restart_log
 
 
+@pytest.mark.pool_restart
 def test_pool_restarts_one_by_one_with_restart_now(
         sdk_pool_handle, sdk_wallet_trustee, looper, tconf, txnPoolNodeSet):
     server, indicator = looper.loop.run_until_complete(
diff --git a/indy_node/test/pool_restart/test_restart_on_inconsistency.py b/indy_node/test/pool_restart/test_restart_on_inconsistency.py
index 122a07ab1..cca95d91e 100644
--- a/indy_node/test/pool_restart/test_restart_on_inconsistency.py
+++ b/indy_node/test/pool_restart/test_restart_on_inconsistency.py
@@ -17,6 +17,7 @@ def tconf(tconf, tdir):
     tconf.INCONSISTENCY_WATCHER_NETWORK_TIMEOUT = old_restart_timeout
 
 
+@pytest.mark.pool_restart
 def test_restart_on_inconsistency(looper, txnPoolNodeSet, tconf, tdir, monkeypatch):
     restarted = multiprocessing.Value('i', 0)
 
diff --git a/indy_node/test/replay/test_state_regenerated_from_ledger.py b/indy_node/test/replay/test_state_regenerated_from_ledger.py
index e537e9d9f..a2b7f796b 100644
--- a/indy_node/test/replay/test_state_regenerated_from_ledger.py
+++ b/indy_node/test/replay/test_state_regenerated_from_ledger.py
@@ -1,5 +1,6 @@
 import shutil
 
+import pytest
 from plenum.common.constants import DOMAIN_LEDGER_ID
 from plenum.common.util import randomString
 from plenum.test.node_catchup.helper import ensure_all_nodes_have_same_data, \
@@ -13,6 +14,7 @@
 TestRunningTimeLimitSec = 200
 
 
+@pytest.mark.replay
 def test_state_regenerated_from_ledger(looper,
                                        nodeSet, tconf, tdir,
                                        sdk_pool_handle,
diff --git a/indy_node/test/request_handlers/rich_schema/test_all_rich_schema_handlers.py b/indy_node/test/request_handlers/rich_schema/test_all_rich_schema_handlers.py
index 3247bc9b5..e05bf0135 100644
--- a/indy_node/test/request_handlers/rich_schema/test_all_rich_schema_handlers.py
+++ b/indy_node/test/request_handlers/rich_schema/test_all_rich_schema_handlers.py
@@ -20,6 +20,7 @@
 from plenum.common.util import SortedDict, randomString
 
 
+@pytest.mark.request_handlers
 def test_update_state(handler_and_request):
     handler, request = handler_and_request
     seq_no = 1
@@ -52,11 +53,13 @@ def test_update_state(handler_and_request):
     assert handler.state.get(secondary_key, isCommitted=False) == op[RS_ID].encode()
 
 
+@pytest.mark.request_handlers
 def test_static_validation_pass(handler_and_request):
     handler, request = handler_and_request
     handler.static_validation(request)
 
 
+@pytest.mark.request_handlers
 def test_static_validation_content_is_json(handler_and_request):
     handler, request = handler_and_request
 
@@ -65,6 +68,7 @@ def test_static_validation_content_is_json(handler_and_request):
         handler.static_validation(request)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
 def test_static_validation_content_is_json_ld_with_atid(handler_and_request, status):
     handler, request = handler_and_request
@@ -86,6 +90,7 @@ def test_static_validation_content_is_json_ld_with_atid(handler_and_request, sta
         handler.static_validation(request)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
 def test_static_validation_content_is_json_ld_with_attype(handler_and_request, status):
     handler, request = handler_and_request
@@ -108,6 +113,7 @@ def test_static_validation_content_is_json_ld_with_attype(handler_and_request, s
         handler.static_validation(request)
 
 
+@pytest.mark.request_handlers
 def test_static_validation_atid_equals_to_id(handler_and_request):
     handler, request = handler_and_request
 
@@ -123,6 +129,7 @@ def test_static_validation_atid_equals_to_id(handler_and_request):
         handler.static_validation(request)
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation_failed_not_authorised(handler_and_request):
     handler, request = handler_and_request
     add_to_idr(handler.database_manager.idr_cache, request.identifier, None)
@@ -130,6 +137,7 @@ def test_dynamic_validation_failed_not_authorised(handler_and_request):
         handler.dynamic_validation(request, 0)
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation_for_existing(handler_and_request):
     handler, request = handler_and_request
     make_rich_schema_object_exist(handler, request)
@@ -140,6 +148,7 @@ def test_dynamic_validation_for_existing(handler_and_request):
         handler.dynamic_validation(request, 0)
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation_for_existing_metadata(handler_and_request):
     handler, request = handler_and_request
     make_rich_schema_object_exist(handler, request)
diff --git a/indy_node/test/request_handlers/rich_schema/test_get_rs_object_by_id_handler.py b/indy_node/test/request_handlers/rich_schema/test_get_rs_object_by_id_handler.py
index c8aba4494..510f2aab1 100644
--- a/indy_node/test/request_handlers/rich_schema/test_get_rs_object_by_id_handler.py
+++ b/indy_node/test/request_handlers/rich_schema/test_get_rs_object_by_id_handler.py
@@ -33,6 +33,7 @@ def get_rich_schema_by_id_handler(db_manager):
     return GetRichSchemaObjectByIdHandler(db_manager)
 
 
+@pytest.mark.request_handlers
 def test_get_rich_schema_obj(db_manager, handler_and_request, id,
                              get_rich_schema_by_id_handler, get_rich_schema_req):
     # prepare: store object in state with bls multi-sg
@@ -73,6 +74,7 @@ def test_get_rich_schema_obj(db_manager, handler_and_request, id,
                              path, result[DATA], seq_no, txn_time)
 
 
+@pytest.mark.request_handlers
 def test_get_rich_schema_obj_not_existent(db_manager, handler_and_request,
                                           get_rich_schema_by_id_handler, get_rich_schema_req):
     save_multi_sig(db_manager)
@@ -89,6 +91,7 @@ def test_get_rich_schema_obj_not_existent(db_manager, handler_and_request,
     check_valid_proof(result)
 
 
+@pytest.mark.request_handlers
 def test_get_rich_schema_obj_committed_only(db_manager, handler_and_request, id,
                                             get_rich_schema_by_id_handler, get_rich_schema_req):
     # prepare: store object in state with bls multi-sig, and then update the object (uncommitted)
diff --git a/indy_node/test/request_handlers/rich_schema/test_get_rs_object_by_metadata_handler.py b/indy_node/test/request_handlers/rich_schema/test_get_rs_object_by_metadata_handler.py
index b9d52b541..6393b2e69 100644
--- a/indy_node/test/request_handlers/rich_schema/test_get_rs_object_by_metadata_handler.py
+++ b/indy_node/test/request_handlers/rich_schema/test_get_rs_object_by_metadata_handler.py
@@ -36,6 +36,7 @@ def get_rich_schema_by_meta_handler(db_manager):
     return GetRichSchemaObjectByMetadataHandler(db_manager)
 
 
+@pytest.mark.request_handlers
 def test_get_rich_schema_obj(db_manager, handler_and_request, metadata,
                              get_rich_schema_by_meta_handler, get_rich_schema_req):
     # prepare: store object in state with bls multi-sg
@@ -79,6 +80,7 @@ def test_get_rich_schema_obj(db_manager, handler_and_request, metadata,
                              path, result[DATA], seq_no, txn_time)
 
 
+@pytest.mark.request_handlers
 def test_get_rich_schema_obj_not_existent(db_manager, handler_and_request, metadata,
                                           get_rich_schema_by_meta_handler, get_rich_schema_req):
     save_multi_sig(db_manager)
@@ -95,6 +97,7 @@ def test_get_rich_schema_obj_not_existent(db_manager, handler_and_request, metad
     check_valid_proof(result)
 
 
+@pytest.mark.request_handlers
 def test_get_rich_schema_obj_committed_only(db_manager, handler_and_request, metadata,
                                             get_rich_schema_by_meta_handler, get_rich_schema_req):
     # prepare: store object in state with bls multi-sig, and then update the object (uncommitted)
diff --git a/indy_node/test/request_handlers/rich_schema/test_jsonld_context_handler.py b/indy_node/test/request_handlers/rich_schema/test_jsonld_context_handler.py
index 88e480617..56ca52957 100644
--- a/indy_node/test/request_handlers/rich_schema/test_jsonld_context_handler.py
+++ b/indy_node/test/request_handlers/rich_schema/test_jsonld_context_handler.py
@@ -26,6 +26,7 @@ def context_req(context_handler):
     return req
 
 
+@pytest.mark.request_handlers
 def test_static_validation_context_no_context_field(context_handler, context_req):
     context_req.operation[RS_CONTENT] = json.dumps({"aaa": "2http:/..@#$"})
     with pytest.raises(InvalidClientRequest) as e:
@@ -34,6 +35,7 @@ def test_static_validation_context_no_context_field(context_handler, context_req
     assert "must contain a @context field" in str(e.value)
 
 
+@pytest.mark.request_handlers
 def test_static_validation_context_fail_bad_uri(context_handler, context_req):
     context_req.operation[RS_CONTENT] = json.dumps({JSON_LD_CONTEXT_FIELD: "2http:/..@#$"})
     with pytest.raises(InvalidClientRequest) as e:
@@ -42,6 +44,7 @@ def test_static_validation_context_fail_bad_uri(context_handler, context_req):
     assert "@context URI 2http:/..@#$ badly formed" in str(e.value)
 
 
+@pytest.mark.request_handlers
 def test_static_validation_fail_context_not_uri_or_array_or_object(context_handler, context_req):
     context_req.operation[RS_CONTENT] = json.dumps({JSON_LD_CONTEXT_FIELD: 52})
     with pytest.raises(InvalidClientRequest) as e:
@@ -50,6 +53,7 @@ def test_static_validation_fail_context_not_uri_or_array_or_object(context_handl
     assert "'@context' value must be url, array, or object" in str(e.value)
 
 
+@pytest.mark.request_handlers
 def test_static_validation_pass_context_value_is_dict(context_handler, context_req):
     context = {
         "favoriteColor": "https://example.com/vocab#favoriteColor"
@@ -58,6 +62,7 @@ def test_static_validation_pass_context_value_is_dict(context_handler, context_r
     context_handler.static_validation(context_req)
 
 
+@pytest.mark.request_handlers
 def test_static_validation_pass_context_value_is_list_with_dict_and_uri(context_handler, context_req):
     context = [
         {
@@ -69,6 +74,7 @@ def test_static_validation_pass_context_value_is_list_with_dict_and_uri(context_
     context_handler.static_validation(context_req)
 
 
+@pytest.mark.request_handlers
 def test_static_validation_pass_context_w3c_example_15(context_handler, context_req):
     context = {
         "@context": {
@@ -80,6 +86,7 @@ def test_static_validation_pass_context_w3c_example_15(context_handler, context_
     context_handler.static_validation(context_req)
 
 
+@pytest.mark.request_handlers
 def test_static_validation_fail_context_is_list_with_dict_and_bad_uri(context_handler, context_req):
     context = [
         {
@@ -94,6 +101,7 @@ def test_static_validation_fail_context_is_list_with_dict_and_bad_uri(context_ha
     assert "@context URI this is a bad uri badly formed" in str(e.value)
 
 
+@pytest.mark.request_handlers
 def test_static_validation_pass_context_w3c_base(context_handler, context_req):
     # Sample from specification: https://w3c.github.io/vc-data-model/#base-context
     # Actual file contents from: https://www.w3.org/2018/credentials/v1
@@ -101,17 +109,20 @@ def test_static_validation_pass_context_w3c_base(context_handler, context_req):
     context_handler.static_validation(context_req)
 
 
+@pytest.mark.request_handlers
 def test_static_validation_pass_context_w3c_examples_v1(context_handler, context_req):
     # test for https://www.w3.org/2018/credentials/examples/v1
     context_req.operation[RS_CONTENT] = json.dumps(W3C_EXAMPLE_V1_CONTEXT)
     context_handler.static_validation(context_req)
 
 
+@pytest.mark.request_handlers
 def test_static_validation_fail_invalid_type(context_handler, context_req):
     context_req.operation[TXN_TYPE] = "201"
     with pytest.raises(LogicError):
         context_handler.static_validation(context_req)
 
 
+@pytest.mark.request_handlers
 def test_schema_dynamic_validation_passes(context_handler, context_req):
     context_handler.dynamic_validation(context_req, 0)
diff --git a/indy_node/test/request_handlers/rich_schema/test_rich_schema_cred_def_handler.py b/indy_node/test/request_handlers/rich_schema/test_rich_schema_cred_def_handler.py
index 6489d6faa..ec15f43c2 100644
--- a/indy_node/test/request_handlers/rich_schema/test_rich_schema_cred_def_handler.py
+++ b/indy_node/test/request_handlers/rich_schema/test_rich_schema_cred_def_handler.py
@@ -60,10 +60,12 @@ def cred_def_req(rich_schema_handler, mapping_handler, rich_schema_req, mapping_
     return req
 
 
+@pytest.mark.request_handlers
 def test_static_validation_pass(cred_def_handler, cred_def_req):
     cred_def_handler.static_validation(cred_def_req)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('missing_field', ['signatureType', 'mapping', 'schema', 'publicKey'])
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
 def test_static_validation_no_field(cred_def_handler, cred_def_req, missing_field, status):
@@ -81,6 +83,7 @@ def test_static_validation_no_field(cred_def_handler, cred_def_req, missing_fiel
         cred_def_handler.static_validation(cred_def_req)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
 def test_static_validation_no_all_fields(cred_def_handler, cred_def_req, status):
     content = copy.deepcopy(json.loads(cred_def_req.operation[RS_CONTENT]))
@@ -105,10 +108,13 @@ def test_static_validation_no_all_fields(cred_def_handler, cred_def_req, status)
                        match="'signatureType', 'mapping', 'schema', 'publicKey' must be set in 'content'"):
         cred_def_handler.static_validation(cred_def_req)
 
+
+@pytest.mark.request_handlers
 def test_dynamic_validation_passes(cred_def_handler, cred_def_req):
     cred_def_handler.dynamic_validation(cred_def_req, 0)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('field', [RS_CRED_DEF_SCHEMA, RS_CRED_DEF_MAPPING])
 def test_dynamic_validation_not_existent_ref(cred_def_handler, cred_def_req,
                                              field):
@@ -123,6 +129,7 @@ def test_dynamic_validation_not_existent_ref(cred_def_handler, cred_def_req,
         cred_def_handler.dynamic_validation(cred_def_req, 0)
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation_not_schema_in_schema_field(cred_def_handler, cred_def_req,
                                                        mapping_req):
     content = copy.deepcopy(json.loads(cred_def_req.operation[RS_CONTENT]))
@@ -134,6 +141,7 @@ def test_dynamic_validation_not_schema_in_schema_field(cred_def_handler, cred_de
         cred_def_handler.dynamic_validation(cred_def_req, 0)
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation_not_mapping_in_mapping_field(cred_def_handler, cred_def_req,
                                                          rich_schema_req):
     content = copy.deepcopy(json.loads(cred_def_req.operation[RS_CONTENT]))
diff --git a/indy_node/test/request_handlers/rich_schema/test_rich_schema_encoding_handler.py b/indy_node/test/request_handlers/rich_schema/test_rich_schema_encoding_handler.py
index e3bf1125f..bfa746d15 100644
--- a/indy_node/test/request_handlers/rich_schema/test_rich_schema_encoding_handler.py
+++ b/indy_node/test/request_handlers/rich_schema/test_rich_schema_encoding_handler.py
@@ -25,6 +25,7 @@ def encoding_req(encoding_handler):
     return req
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('missing_field', ['input', 'output', 'algorithm', 'testVectors'])
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
 def test_static_validation_no_field(encoding_handler, encoding_req, missing_field, status):
@@ -42,6 +43,7 @@ def test_static_validation_no_field(encoding_handler, encoding_req, missing_fiel
         encoding_handler.static_validation(encoding_req)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
 def test_static_validation_no_all_fields(encoding_handler, encoding_req, status):
     content = copy.deepcopy(json.loads(encoding_req.operation[RS_CONTENT]))
@@ -67,6 +69,7 @@ def test_static_validation_no_all_fields(encoding_handler, encoding_req, status)
         encoding_handler.static_validation(encoding_req)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('missing_field', ['id', 'type'])
 @pytest.mark.parametrize('input_output', ['input', 'output'])
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
@@ -85,6 +88,7 @@ def test_static_validation_input_output(encoding_handler, encoding_req, missing_
         encoding_handler.static_validation(encoding_req)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('input_output', ['input', 'output'])
 @pytest.mark.parametrize('status', ['empty', 'none'])
 def test_static_validation_input_output_all_missing(encoding_handler, encoding_req, input_output,
@@ -103,6 +107,7 @@ def test_static_validation_input_output_all_missing(encoding_handler, encoding_r
         encoding_handler.static_validation(encoding_req)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('missing_field', ['description', 'documentation', 'implementation'])
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
 def test_static_validation_algorithm(encoding_handler, encoding_req, missing_field, status):
@@ -120,6 +125,7 @@ def test_static_validation_algorithm(encoding_handler, encoding_req, missing_fie
         encoding_handler.static_validation(encoding_req)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('status', ['empty', 'none'])
 def test_static_validation_algorithm_all_missing(encoding_handler, encoding_req, status):
     content = copy.deepcopy(json.loads(encoding_req.operation[RS_CONTENT]))
@@ -139,5 +145,6 @@ def test_static_validation_algorithm_all_missing(encoding_handler, encoding_req,
         encoding_handler.static_validation(encoding_req)
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation_passes(encoding_handler, encoding_req):
     encoding_handler.dynamic_validation(encoding_req, 0)
diff --git a/indy_node/test/request_handlers/rich_schema/test_rich_schema_handler.py b/indy_node/test/request_handlers/rich_schema/test_rich_schema_handler.py
index 8704f7e84..8f86c3893 100644
--- a/indy_node/test/request_handlers/rich_schema/test_rich_schema_handler.py
+++ b/indy_node/test/request_handlers/rich_schema/test_rich_schema_handler.py
@@ -20,5 +20,6 @@ def rich_schema_req(rich_schema_handler):
     return req
 
 
+@pytest.mark.request_handlers
 def test_schema_dynamic_validation_passes(rich_schema_handler, rich_schema_req):
     rich_schema_handler.dynamic_validation(rich_schema_req, 0)
diff --git a/indy_node/test/request_handlers/rich_schema/test_rich_schema_mapping_handler.py b/indy_node/test/request_handlers/rich_schema/test_rich_schema_mapping_handler.py
index a80613a07..4ca996464 100644
--- a/indy_node/test/request_handlers/rich_schema/test_rich_schema_mapping_handler.py
+++ b/indy_node/test/request_handlers/rich_schema/test_rich_schema_mapping_handler.py
@@ -130,10 +130,12 @@ def mapping_req(rich_schema_handler, encoding_handler, rich_schema_req):
     return req
 
 
+@pytest.mark.request_handlers
 def test_static_validation_pass(mapping_handler, mapping_req):
     mapping_handler.static_validation(mapping_req)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
 @pytest.mark.parametrize('missing_field', ['schema', 'attributes'])
 def test_static_validation_fail_no_schema_or_attribute(mapping_handler, mapping_req, status, missing_field):
@@ -151,6 +153,7 @@ def test_static_validation_fail_no_schema_or_attribute(mapping_handler, mapping_
         mapping_handler.static_validation(mapping_req)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
 def test_static_validation_fail_no_schema_and_attributes(mapping_handler, mapping_req, status):
     content = copy.deepcopy(json.loads(mapping_req.operation[RS_CONTENT]))
@@ -170,6 +173,7 @@ def test_static_validation_fail_no_schema_and_attributes(mapping_handler, mappin
         mapping_handler.static_validation(mapping_req)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
 @pytest.mark.parametrize('missing_field', ['issuer', 'issuanceDate'])
 def test_static_validation_fail_no_issuer_or_issuance_date(mapping_handler, mapping_req, status, missing_field):
@@ -187,6 +191,7 @@ def test_static_validation_fail_no_issuer_or_issuance_date(mapping_handler, mapp
         mapping_handler.static_validation(mapping_req)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('status', ['missing', 'empty', 'none'])
 def test_static_validation_fail_no_issuance_date_and_issuer(mapping_handler, mapping_req, status):
     content = copy.deepcopy(json.loads(mapping_req.operation[RS_CONTENT]))
@@ -206,10 +211,12 @@ def test_static_validation_fail_no_issuance_date_and_issuer(mapping_handler, map
         mapping_handler.static_validation(mapping_req)
 
 
+@pytest.mark.request_handlers
 def test_schema_dynamic_validation_passes(mapping_handler, mapping_req):
     mapping_handler.dynamic_validation(mapping_req, 0)
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation_not_existent_schema(mapping_handler, mapping_req):
     schema_id = randomString()
     content = copy.deepcopy(json.loads(mapping_req.operation[RS_CONTENT]))
@@ -222,6 +229,7 @@ def test_dynamic_validation_not_existent_schema(mapping_handler, mapping_req):
         mapping_handler.dynamic_validation(mapping_req, 0)
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation_not_schema_in_schema_field(mapping_handler, mapping_req):
     content = copy.deepcopy(json.loads(mapping_req.operation[RS_CONTENT]))
     content[RS_MAPPING_SCHEMA] = TEST_ENCODING_1.operation[RS_ID]
@@ -237,6 +245,7 @@ def get_mapping_attr_value(keys, mapping_content):
 
 
 # a test against TEST_MAPPING
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('enc_path, index', [
     (['attr1'], 0),
     (['attr2'], 0),
@@ -264,6 +273,7 @@ def test_dynamic_validation_empty_field_in_encoding_desc(mapping_handler, mappin
 
 
 # a test against TEST_MAPPING
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('enc_path, index', [
     (['attr1'], 0),
     (['attr2'], 0),
@@ -296,6 +306,7 @@ def test_dynamic_validation_empty_encoding_desc(mapping_handler, mapping_req,
 
 
 # a test against TEST_MAPPING
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('enc_path, index', [
     (['attr1'], 0),
     (['attr2'], 0),
@@ -318,6 +329,7 @@ def test_dynamic_validation_not_existent_encoding(mapping_handler, mapping_req,
 
 
 # a test against TEST_MAPPING
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('enc_path, index', [
     (['attr1'], 0),
     (['attr2'], 0),
@@ -340,6 +352,7 @@ def test_dynamic_validation_not_encoding_in_enc_field(mapping_handler, mapping_r
 
 
 # a test against TEST_MAPPING
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('enc_path, index', [
     (['attr1'], 0),
     (['attr2'], 0),
@@ -363,6 +376,7 @@ def test_dynamic_validation_rank_sequence(mapping_handler, mapping_req,
         mapping_handler.dynamic_validation(mapping_req, 0)
 
 
+@pytest.mark.request_handlers
 @pytest.mark.parametrize('enc_path, index', [
     (['attr1'], 0),
     (['attr2'], 0),
diff --git a/indy_node/test/request_handlers/rich_schema/test_rich_schema_pres_def_handler.py b/indy_node/test/request_handlers/rich_schema/test_rich_schema_pres_def_handler.py
index 69b0302b6..5f9745c9f 100644
--- a/indy_node/test/request_handlers/rich_schema/test_rich_schema_pres_def_handler.py
+++ b/indy_node/test/request_handlers/rich_schema/test_rich_schema_pres_def_handler.py
@@ -21,5 +21,6 @@ def pres_def_req(pres_def_handler):
     return req
 
 
+@pytest.mark.request_handlers
 def test_schema_dynamic_validation_passes(pres_def_handler, pres_def_req):
     pres_def_handler.dynamic_validation(pres_def_req, 0)
diff --git a/indy_node/test/request_handlers/test_attrib_handler.py b/indy_node/test/request_handlers/test_attrib_handler.py
index 0020f8c27..7a0e96ee5 100644
--- a/indy_node/test/request_handlers/test_attrib_handler.py
+++ b/indy_node/test/request_handlers/test_attrib_handler.py
@@ -33,33 +33,39 @@ def attrib_request(attributeData, looper, sdk_wallet_client):
                               'raw': attributeData})
 
 
+@pytest.mark.request_handlers
 def test_attrib_static_validation_passes(attrib_request, attrib_handler: AttributeHandler):
     attrib_handler.static_validation(attrib_request)
 
 
+@pytest.mark.request_handlers
 def test_attrib_static_validation_fails(attrib_request, attrib_handler: AttributeHandler):
     attrib_request.operation[ENC] = randomString()
     with pytest.raises(InvalidClientRequest):
         attrib_handler.static_validation(attrib_request)
 
 
+@pytest.mark.request_handlers
 def test_attrib_dynamic_validation_fails(attrib_request, attrib_handler: AttributeHandler):
     with pytest.raises(InvalidClientRequest):
         attrib_handler.dynamic_validation(attrib_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_attrib_dynamic_validation_fails_not_owner(attrib_request, attrib_handler: AttributeHandler):
     add_to_idr(attrib_handler.database_manager.idr_cache, attrib_request.operation['dest'], None)
     with pytest.raises(UnauthorizedClientRequest):
         attrib_handler.dynamic_validation(attrib_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_attrib_dynamic_validation_passes(attrib_request, attrib_handler: AttributeHandler):
     add_to_idr(attrib_handler.database_manager.idr_cache, attrib_request.operation['dest'], None)
     attrib_request._identifier = attrib_request.operation['dest']
     attrib_handler.dynamic_validation(attrib_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_update_state(attrib_handler, attrib_request):
     seq_no = 1
     txn_time = 1560241033
diff --git a/indy_node/test/request_handlers/test_auth_rule_1_9_1_handler.py b/indy_node/test/request_handlers/test_auth_rule_1_9_1_handler.py
index ab2a7c357..fdaf8c5d3 100644
--- a/indy_node/test/request_handlers/test_auth_rule_1_9_1_handler.py
+++ b/indy_node/test/request_handlers/test_auth_rule_1_9_1_handler.py
@@ -13,6 +13,7 @@ def auth_rule_handler_1_9_1(db_manager, write_auth_req_validator):
     return AuthRuleHandler191(db_manager, write_auth_req_validator)
 
 
+@pytest.mark.request_handlers
 def test_update_state(auth_rule_request, auth_rule_handler_1_9_1: AuthRuleHandler):
     txn = reqToTxn(auth_rule_request)
     payload = get_payload_data(txn)
diff --git a/indy_node/test/request_handlers/test_auth_rule_handler.py b/indy_node/test/request_handlers/test_auth_rule_handler.py
index 18de41148..b8d5f9960 100644
--- a/indy_node/test/request_handlers/test_auth_rule_handler.py
+++ b/indy_node/test/request_handlers/test_auth_rule_handler.py
@@ -19,10 +19,12 @@ def auth_rule_handler(db_manager, write_auth_req_validator):
     return AuthRuleHandler(db_manager, write_auth_req_validator)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation(auth_rule_request, auth_rule_handler: AuthRuleHandler):
     auth_rule_handler.static_validation(auth_rule_request)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation_failed_without_old_value(auth_rule_request,
                                                               auth_rule_handler: AuthRuleHandler):
     if OLD_VALUE in auth_rule_request.operation:
@@ -32,6 +34,7 @@ def test_auth_rule_static_validation_failed_without_old_value(auth_rule_request,
         auth_rule_handler.static_validation(auth_rule_request)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation_failed_with_excess_field(auth_rule_request,
                                                               auth_rule_handler: AuthRuleHandler):
     auth_rule_request.operation[OLD_VALUE] = "old_value"
@@ -40,6 +43,7 @@ def test_auth_rule_static_validation_failed_with_excess_field(auth_rule_request,
         auth_rule_handler.static_validation(auth_rule_request)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation_failed_with_incorrect_key(auth_rule_request,
                                                                auth_rule_handler: AuthRuleHandler):
     auth_rule_request.operation = generate_auth_rule_operation(auth_action=ADD_PREFIX,
@@ -49,6 +53,7 @@ def test_auth_rule_static_validation_failed_with_incorrect_key(auth_rule_request
         auth_rule_handler.static_validation(auth_rule_request)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_dynamic_validation_without_permission(auth_rule_request,
                                                          auth_rule_handler: AuthRuleHandler, creator):
     add_to_idr(auth_rule_handler.database_manager.idr_cache, creator, STEWARD)
@@ -56,12 +61,14 @@ def test_auth_rule_dynamic_validation_without_permission(auth_rule_request,
         auth_rule_handler.dynamic_validation(auth_rule_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_dynamic_validation(auth_rule_request,
                                       auth_rule_handler: AuthRuleHandler, creator):
     add_to_idr(auth_rule_handler.database_manager.idr_cache, creator, TRUSTEE)
     auth_rule_handler.dynamic_validation(auth_rule_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_update_state(auth_rule_request, auth_rule_handler: AuthRuleHandler):
     txn = reqToTxn(auth_rule_request)
     payload = get_payload_data(txn)
diff --git a/indy_node/test/request_handlers/test_auth_rules_handler.py b/indy_node/test/request_handlers/test_auth_rules_handler.py
index d5b7c8850..86a7e7bb8 100644
--- a/indy_node/test/request_handlers/test_auth_rules_handler.py
+++ b/indy_node/test/request_handlers/test_auth_rules_handler.py
@@ -29,10 +29,12 @@ def auth_rules_request(creator):
                               RULES: [generate_auth_rule()]})
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation(auth_rules_request, auth_rules_handler: AuthRulesHandler):
     auth_rules_handler.static_validation(auth_rules_request)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation_failed_without_old_value(auth_rules_request,
                                                               auth_rules_handler: AuthRulesHandler):
     rule = auth_rules_request.operation[RULES][0]
@@ -43,6 +45,7 @@ def test_auth_rule_static_validation_failed_without_old_value(auth_rules_request
         auth_rules_handler.static_validation(auth_rules_request)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation_failed_with_excess_field(auth_rules_request,
                                                               auth_rules_handler: AuthRulesHandler):
     rule = auth_rules_request.operation[RULES][0]
@@ -52,6 +55,7 @@ def test_auth_rule_static_validation_failed_with_excess_field(auth_rules_request
         auth_rules_handler.static_validation(auth_rules_request)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation_failed_with_incorrect_key(auth_rules_request,
                                                                auth_rules_handler: AuthRulesHandler):
     auth_rules_request.operation[RULES].append(generate_auth_rule(auth_action=ADD_PREFIX,
@@ -61,6 +65,7 @@ def test_auth_rule_static_validation_failed_with_incorrect_key(auth_rules_reques
         auth_rules_handler.static_validation(auth_rules_request)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_dynamic_validation_without_permission(auth_rules_request,
                                                          auth_rules_handler: AuthRulesHandler, creator):
     add_to_idr(auth_rules_handler.database_manager.idr_cache, creator, STEWARD)
@@ -68,11 +73,13 @@ def test_auth_rule_dynamic_validation_without_permission(auth_rules_request,
         auth_rules_handler.dynamic_validation(auth_rules_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_dynamic_validation(auth_rules_request,
                                       auth_rules_handler: AuthRulesHandler, creator):
     add_to_idr(auth_rules_handler.database_manager.idr_cache, creator, TRUSTEE)
 
 
+@pytest.mark.request_handlers
 def test_update_state(auth_rules_request, auth_rules_handler: AuthRulesHandler):
     txn = reqToTxn(auth_rules_request)
     payload = get_payload_data(txn)
diff --git a/indy_node/test/request_handlers/test_claim_def_handler.py b/indy_node/test/request_handlers/test_claim_def_handler.py
index 4ec25e351..2966f6f64 100644
--- a/indy_node/test/request_handlers/test_claim_def_handler.py
+++ b/indy_node/test/request_handlers/test_claim_def_handler.py
@@ -53,6 +53,7 @@ def claim_def_request(creator, schema):
                               'data': {}})
 
 
+@pytest.mark.request_handlers
 def test_claim_def_dynamic_validation_without_schema(claim_def_request,
                                                      claim_def_handler: ClaimDefHandler):
     with pytest.raises(InvalidClientRequest) as e:
@@ -61,12 +62,14 @@ def test_claim_def_dynamic_validation_without_schema(claim_def_request,
            in e._excinfo[1].reason
 
 
+@pytest.mark.request_handlers
 def test_claim_def_dynamic_validation_for_new_claim_def(claim_def_request, schema,
                                                         claim_def_handler: ClaimDefHandler):
     claim_def_handler.ledger.appendTxns([schema])
     claim_def_handler.dynamic_validation(claim_def_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_claim_def_dynamic_validation_without_permission(claim_def_request, schema,
                                                          claim_def_handler: ClaimDefHandler):
     claim_def_handler.ledger.appendTxns([schema])
@@ -83,6 +86,7 @@ def test_claim_def_dynamic_validation_without_permission(claim_def_request, sche
         claim_def_handler.dynamic_validation(request, 0)
 
 
+@pytest.mark.request_handlers
 def test_claim_def_dynamic_validation_for_unknown_identifier(claim_def_request, schema,
                                                              claim_def_handler: ClaimDefHandler):
     test_identifier = randomString()
@@ -95,6 +99,7 @@ def test_claim_def_dynamic_validation_for_unknown_identifier(claim_def_request,
         claim_def_handler.dynamic_validation(request, 0)
 
 
+@pytest.mark.request_handlers
 def test_claim_def_dynamic_validation_without_ref_to_not_schema(claim_def_request, schema,
                                                                 claim_def_handler: ClaimDefHandler, creator):
     claim_def_handler.ledger.appendTxns([schema])
@@ -107,6 +112,7 @@ def test_claim_def_dynamic_validation_without_ref_to_not_schema(claim_def_reques
            in e._excinfo[1].reason
 
 
+@pytest.mark.request_handlers
 def test_update_state(claim_def_request, claim_def_handler: ClaimDefHandler, schema_handler, schema_request):
     # add schema to state
     schema_seq_no = 1
@@ -129,6 +135,7 @@ def test_update_state(claim_def_request, claim_def_handler: ClaimDefHandler, sch
                                                       claim_def_txn_time)
 
 
+@pytest.mark.request_handlers
 def test_update_state_with_incorrect_data(claim_def_request, claim_def_handler: ClaimDefHandler,
                                           schema_handler, schema_request):
     # add schema to state
@@ -152,6 +159,7 @@ def test_update_state_with_incorrect_data(claim_def_request, claim_def_handler:
         claim_def_handler.update_state(claim_def_txn, None, claim_def_request)
 
 
+@pytest.mark.request_handlers
 def test_update_state_with_incorrect_schema_seq_no(claim_def_request, claim_def_handler: ClaimDefHandler,
                                                    schema_handler, schema_request):
     claim_def_seq_no = 1
diff --git a/indy_node/test/request_handlers/test_get_auth_rule_handler.py b/indy_node/test/request_handlers/test_get_auth_rule_handler.py
index da64f7b3a..c2c06c198 100644
--- a/indy_node/test/request_handlers/test_get_auth_rule_handler.py
+++ b/indy_node/test/request_handlers/test_get_auth_rule_handler.py
@@ -48,14 +48,17 @@ def creator(db_manager):
     return identifier
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation(get_auth_rule_request, get_auth_rule_handler: GetAuthRuleHandler):
     get_auth_rule_handler.static_validation(get_auth_rule_request)
 
 
+@pytest.mark.request_handlers
 def test_all_auth_rules_static_validation(get_all_auth_rules_request, get_auth_rule_handler: GetAuthRuleHandler):
     get_auth_rule_handler.static_validation(get_all_auth_rules_request)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation_failed_without_old_value(get_auth_rule_request,
                                                               get_auth_rule_handler: GetAuthRuleHandler):
     if OLD_VALUE in get_auth_rule_request.operation:
@@ -65,6 +68,7 @@ def test_auth_rule_static_validation_failed_without_old_value(get_auth_rule_requ
         get_auth_rule_handler.static_validation(get_auth_rule_request)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation_failed_with_excess_field(get_auth_rule_request,
                                                               get_auth_rule_handler: GetAuthRuleHandler):
     get_auth_rule_request.operation[OLD_VALUE] = "old_value"
@@ -73,6 +77,7 @@ def test_auth_rule_static_validation_failed_with_excess_field(get_auth_rule_requ
         get_auth_rule_handler.static_validation(get_auth_rule_request)
 
 
+@pytest.mark.request_handlers
 def test_auth_rule_static_validation_failed_with_incorrect_key(get_auth_rule_request,
                                                                get_auth_rule_handler: GetAuthRuleHandler):
     get_auth_rule_request.operation.update(generate_key(auth_action=EDIT_PREFIX,
diff --git a/indy_node/test/request_handlers/test_nym_handler.py b/indy_node/test/request_handlers/test_nym_handler.py
index 7b34085a9..472be764a 100644
--- a/indy_node/test/request_handlers/test_nym_handler.py
+++ b/indy_node/test/request_handlers/test_nym_handler.py
@@ -37,46 +37,54 @@ def creator(db_manager):
     return identifier
 
 
+@pytest.mark.request_handlers
 def test_nym_static_validation_passes(nym_request, nym_handler: NymHandler):
     nym_handler.static_validation(nym_request)
 
 
+@pytest.mark.request_handlers
 def test_nym_static_validation_failed_without_dest(nym_request, nym_handler: NymHandler):
     del nym_request.operation['dest']
     with pytest.raises(InvalidClientRequest):
         nym_handler.static_validation(nym_request)
 
 
+@pytest.mark.request_handlers
 def test_nym_static_validation_failed_with_none_dest(nym_request, nym_handler: NymHandler):
     nym_request.operation['dest'] = None
     with pytest.raises(InvalidClientRequest):
         nym_handler.static_validation(nym_request)
 
 
+@pytest.mark.request_handlers
 def test_nym_static_validation_failed_with_empty_dest(nym_request, nym_handler: NymHandler):
     nym_request.operation['dest'] = ''
     with pytest.raises(InvalidClientRequest):
         nym_handler.static_validation(nym_request)
 
 
+@pytest.mark.request_handlers
 def test_nym_static_validation_failed_with_spaced_dest(nym_request, nym_handler: NymHandler):
     nym_request.operation['dest'] = ' ' * 5
     with pytest.raises(InvalidClientRequest):
         nym_handler.static_validation(nym_request)
 
 
+@pytest.mark.request_handlers
 def test_nym_static_validation_authorized(nym_request, nym_handler: NymHandler):
     for role in Authoriser.ValidRoles:
         nym_request.operation['role'] = role
         nym_handler.static_validation(nym_request)
 
 
+@pytest.mark.request_handlers
 def test_nym_static_validation_not_authorized_random(nym_request, nym_handler: NymHandler):
     nym_request.operation['role'] = randomString()
     with pytest.raises(InvalidClientRequest):
         nym_handler.static_validation(nym_request)
 
 
+@pytest.mark.request_handlers
 def test_nym_dynamic_validation_for_new_nym(nym_request, nym_handler: NymHandler, creator):
     nym_handler.write_req_validator.validate = get_exception(False)
     add_to_idr(nym_handler.database_manager.idr_cache, creator, STEWARD)
@@ -87,6 +95,7 @@ def test_nym_dynamic_validation_for_new_nym(nym_request, nym_handler: NymHandler
         nym_handler.dynamic_validation(nym_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_nym_dynamic_validation_for_existing_nym(nym_request: Request, nym_handler: NymHandler, creator):
     add_to_idr(nym_handler.database_manager.idr_cache, nym_request.operation['dest'], None)
     nym_handler.write_req_validator.validate = get_exception(False)
@@ -98,6 +107,7 @@ def test_nym_dynamic_validation_for_existing_nym(nym_request: Request, nym_handl
         nym_handler.dynamic_validation(nym_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_nym_dynamic_validation_for_existing_nym_fails_with_no_changes(nym_handler: NymHandler,
                                                                        creator):
     nym_request = Request(identifier=creator,
@@ -112,6 +122,7 @@ def test_nym_dynamic_validation_for_existing_nym_fails_with_no_changes(nym_handl
         nym_handler.dynamic_validation(nym_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_update_state(nym_request: Request, nym_handler: NymHandler):
     seq_no = 1
     txn_time = 1560241033
diff --git a/indy_node/test/request_handlers/test_pool_upgrade_handler.py b/indy_node/test/request_handlers/test_pool_upgrade_handler.py
index 1c4cf7fdc..b37febdbe 100644
--- a/indy_node/test/request_handlers/test_pool_upgrade_handler.py
+++ b/indy_node/test/request_handlers/test_pool_upgrade_handler.py
@@ -44,6 +44,7 @@ def pkg_version(pool_upgrade_request):
     )
 
 
+@pytest.mark.request_handlers
 def test_pool_upgrade_static_validation_fails_action(pool_upgrade_handler,
                                                      pool_upgrade_request):
     pool_upgrade_request.operation[ACTION] = 'smth'
@@ -52,6 +53,7 @@ def test_pool_upgrade_static_validation_fails_action(pool_upgrade_handler,
     e.match('not a valid action')
 
 
+@pytest.mark.request_handlers
 def test_pool_upgrade_static_validation_fails_schedule(pool_upgrade_handler,
                                                        pool_upgrade_request):
     pool_upgrade_handler.pool_manager.getNodesServices = lambda: 1
@@ -61,6 +63,7 @@ def test_pool_upgrade_static_validation_fails_schedule(pool_upgrade_handler,
     e.match('not a valid schedule since')
 
 
+@pytest.mark.request_handlers
 def test_pool_upgrade_static_validation_passes(pool_upgrade_handler,
                                                pool_upgrade_request):
     pool_upgrade_handler.pool_manager.getNodesServices = lambda: 1
@@ -68,6 +71,7 @@ def test_pool_upgrade_static_validation_passes(pool_upgrade_handler,
     pool_upgrade_handler.static_validation(pool_upgrade_request)
 
 
+@pytest.mark.request_handlers
 def test_pool_upgrade_dynamic_validation_fails_pckg(pool_upgrade_handler,
                                                     pool_upgrade_request,
                                                     tconf):
@@ -77,6 +81,7 @@ def test_pool_upgrade_dynamic_validation_fails_pckg(pool_upgrade_handler,
     e.match('Upgrade package name is empty')
 
 
+@pytest.mark.request_handlers
 def test_pool_upgrade_dynamic_validation_fails_not_installed(
         monkeypatch,
         pool_upgrade_handler,
@@ -89,6 +94,7 @@ def test_pool_upgrade_dynamic_validation_fails_not_installed(
     e.match('is not installed and cannot be upgraded')
 
 
+@pytest.mark.request_handlers
 def test_pool_upgrade_dynamic_validation_fails_belong(
         monkeypatch,
         pool_upgrade_handler,
@@ -101,6 +107,7 @@ def test_pool_upgrade_dynamic_validation_fails_belong(
     e.match('doesn\'t belong to pool')
 
 
+@pytest.mark.request_handlers
 def test_pool_upgrade_dynamic_validation_fails_upgradable(
         monkeypatch,
         pool_upgrade_handler,
@@ -118,6 +125,7 @@ def test_pool_upgrade_dynamic_validation_fails_upgradable(
     e.match('Version {} is not upgradable'.format(pkg_version.upstream.full))
 
 
+@pytest.mark.request_handlers
 def test_pool_upgrade_dynamic_validation_fails_scheduled(
         monkeypatch,
         pool_upgrade_handler,
@@ -143,6 +151,7 @@ def test_pool_upgrade_dynamic_validation_fails_scheduled(
     e.match('is already scheduled')
 
 
+@pytest.mark.request_handlers
 def test_pool_upgrade_dynamic_validation_passes(
         monkeypatch,
         pool_upgrade_handler,
diff --git a/indy_node/test/request_handlers/test_revert_uncommitted_state.py b/indy_node/test/request_handlers/test_revert_uncommitted_state.py
index 5c3b1e374..1fd0728b5 100644
--- a/indy_node/test/request_handlers/test_revert_uncommitted_state.py
+++ b/indy_node/test/request_handlers/test_revert_uncommitted_state.py
@@ -23,6 +23,7 @@ def fake_ordering_service(config_ledger,
     return ordering_service
 
 
+@pytest.mark.request_handlers
 def test_revert_uncommitted_state(write_manager,
                                   db_manager,
                                   constraint_serializer,
diff --git a/indy_node/test/request_handlers/test_revoc_reg_def_handler.py b/indy_node/test/request_handlers/test_revoc_reg_def_handler.py
index 54340c909..a700eb49d 100644
--- a/indy_node/test/request_handlers/test_revoc_reg_def_handler.py
+++ b/indy_node/test/request_handlers/test_revoc_reg_def_handler.py
@@ -10,6 +10,7 @@
 from plenum.server.request_handlers.utils import encode_state_value
 
 
+@pytest.mark.request_handlers
 def test_revoc_reg_def_dynamic_validation_fails_wrong_id(revoc_reg_def_handler,
                                                          revoc_reg_def_request):
     revoc_reg_def_request.operation[CRED_DEF_ID] = 'sample' * 3
@@ -20,6 +21,7 @@ def test_revoc_reg_def_dynamic_validation_fails_wrong_id(revoc_reg_def_handler,
         revoc_reg_def_handler.static_validation(revoc_reg_def_request)
 
 
+@pytest.mark.request_handlers
 def test_revoc_reg_def_dynamic_validation_fails_no_cred_def(revoc_reg_def_handler,
                                                             revoc_reg_def_request):
     add_to_idr(revoc_reg_def_handler.database_manager.idr_cache,
@@ -41,6 +43,7 @@ def test_revoc_reg_def_dynamic_validation_fails_no_cred_def(revoc_reg_def_handle
         revoc_reg_def_handler.dynamic_validation(revoc_reg_def_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_revoc_reg_def_dynamic_validation_passes(revoc_reg_def_handler,
                                                  revoc_reg_def_request):
     add_to_idr(revoc_reg_def_handler.database_manager.idr_cache,
@@ -52,6 +55,7 @@ def test_revoc_reg_def_dynamic_validation_passes(revoc_reg_def_handler,
     revoc_reg_def_handler.dynamic_validation(revoc_reg_def_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_revoc_reg_def_dynamic_validation_without_permission(revoc_reg_def_handler,
                                                              revoc_reg_def_request):
     add_to_idr(revoc_reg_def_handler.database_manager.idr_cache,
@@ -65,6 +69,7 @@ def test_revoc_reg_def_dynamic_validation_without_permission(revoc_reg_def_handl
         revoc_reg_def_handler.dynamic_validation(revoc_reg_def_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_update_state(revoc_reg_def_handler, revoc_reg_def_request):
     seq_no = 1
     txn_time = 1560241033
diff --git a/indy_node/test/request_handlers/test_revoc_reg_entry_handler.py b/indy_node/test/request_handlers/test_revoc_reg_entry_handler.py
index 5fbc09150..ff6a48c3e 100644
--- a/indy_node/test/request_handlers/test_revoc_reg_entry_handler.py
+++ b/indy_node/test/request_handlers/test_revoc_reg_entry_handler.py
@@ -32,6 +32,7 @@ def revoc_reg_entry_request():
                    signature="randomString")
 
 
+@pytest.mark.request_handlers
 def test_revoc_reg_entry_dynamic_validation_without_req_def(revoc_reg_entry_handler,
                                                             revoc_reg_entry_request):
     with pytest.raises(InvalidClientRequest,
@@ -39,6 +40,7 @@ def test_revoc_reg_entry_dynamic_validation_without_req_def(revoc_reg_entry_hand
         revoc_reg_entry_handler.dynamic_validation(revoc_reg_entry_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_revoc_reg_entry_dynamic_validation_passes(revoc_reg_entry_handler,
                                                    revoc_reg_entry_request):
     add_to_idr(revoc_reg_entry_handler.database_manager.idr_cache,
@@ -51,6 +53,7 @@ def test_revoc_reg_entry_dynamic_validation_passes(revoc_reg_entry_handler,
     revoc_reg_entry_handler.dynamic_validation(revoc_reg_entry_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_revoc_reg_entry_dynamic_validation_fail_in_strategy(revoc_reg_entry_handler,
                                                              revoc_reg_entry_request):
     add_to_idr(revoc_reg_entry_handler.database_manager.idr_cache,
@@ -66,6 +69,7 @@ def test_revoc_reg_entry_dynamic_validation_fail_in_strategy(revoc_reg_entry_han
         revoc_reg_entry_handler.dynamic_validation(revoc_reg_entry_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_revoc_reg_entry_dynamic_validation_without_permission(revoc_reg_entry_handler,
                                                                revoc_reg_entry_request):
     add_to_idr(revoc_reg_entry_handler.database_manager.idr_cache,
@@ -82,6 +86,7 @@ def test_revoc_reg_entry_dynamic_validation_without_permission(revoc_reg_entry_h
         revoc_reg_entry_handler.dynamic_validation(revoc_reg_entry_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_failed_update_state(revoc_reg_entry_handler, revoc_reg_entry_request):
     seq_no = 1
     txn_time = 1560241033
@@ -92,6 +97,7 @@ def test_failed_update_state(revoc_reg_entry_handler, revoc_reg_entry_request):
         revoc_reg_entry_handler.update_state(txn, None, revoc_reg_entry_request)
 
 
+@pytest.mark.request_handlers
 def test_update_state(revoc_reg_entry_handler, revoc_reg_entry_request,
                       revoc_reg_def_handler, revoc_reg_def_request):
     # create revoc_req_def
diff --git a/indy_node/test/request_handlers/test_schema_handler.py b/indy_node/test/request_handlers/test_schema_handler.py
index bbe867bbc..a3e548411 100644
--- a/indy_node/test/request_handlers/test_schema_handler.py
+++ b/indy_node/test/request_handlers/test_schema_handler.py
@@ -19,23 +19,27 @@ def make_schema_exist(schema_request, schema_handler):
     schema_handler.state.set(path, encode_state_value("value", "seqNo", "txnTime"))
 
 
+@pytest.mark.request_handlers
 def test_schema_dynamic_validation_failed_existing_schema(schema_request, schema_handler):
     make_schema_exist(schema_request, schema_handler)
     with pytest.raises(UnauthorizedClientRequest, match=str(AuthConstraintForbidden())):
         schema_handler.dynamic_validation(schema_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_schema_dynamic_validation_failed_not_authorised(schema_request, schema_handler):
     add_to_idr(schema_handler.database_manager.idr_cache, schema_request.identifier, None)
     with pytest.raises(UnauthorizedClientRequest):
         schema_handler.dynamic_validation(schema_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_schema_dynamic_validation_passes(schema_request, schema_handler):
     add_to_idr(schema_handler.database_manager.idr_cache, schema_request.identifier, TRUSTEE)
     schema_handler.dynamic_validation(schema_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_update_state(schema_request, schema_handler):
     seq_no = 1
     txn_time = 1560241033
diff --git a/indy_node/test/request_handlers/test_txn_author_agreement_aml_handler.py b/indy_node/test/request_handlers/test_txn_author_agreement_aml_handler.py
index 30ba5a7ec..a812b839a 100644
--- a/indy_node/test/request_handlers/test_txn_author_agreement_aml_handler.py
+++ b/indy_node/test/request_handlers/test_txn_author_agreement_aml_handler.py
@@ -28,6 +28,7 @@ def aml_request(txn_author_agreement_aml_handler, creator):
                               AML_CONTEXT: "AML_CONTEXT"})
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation_without_permission(aml_request,
                                                txn_author_agreement_aml_handler: TxnAuthorAgreementAmlHandler,
                                                creator):
@@ -36,6 +37,7 @@ def test_dynamic_validation_without_permission(aml_request,
         txn_author_agreement_aml_handler.dynamic_validation(aml_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation(aml_request,
                             txn_author_agreement_aml_handler: TxnAuthorAgreementAmlHandler,
                             creator):
diff --git a/indy_node/test/request_handlers/test_txn_author_agreement_disable_handler.py b/indy_node/test/request_handlers/test_txn_author_agreement_disable_handler.py
index b64fd6810..24425917e 100644
--- a/indy_node/test/request_handlers/test_txn_author_agreement_disable_handler.py
+++ b/indy_node/test/request_handlers/test_txn_author_agreement_disable_handler.py
@@ -23,6 +23,8 @@ def disable_taa_request(request):
                                    signature="sign",
                                    operation=operation))
 
+
+@pytest.mark.request_handlers
 def test_taa_disable_only_for_trustee(disable_taa_handler,
                                       disable_taa_request):
     who, req = disable_taa_request
diff --git a/indy_node/test/request_handlers/test_txn_author_agreement_handler.py b/indy_node/test/request_handlers/test_txn_author_agreement_handler.py
index fa425bb4d..fab0d123c 100644
--- a/indy_node/test/request_handlers/test_txn_author_agreement_handler.py
+++ b/indy_node/test/request_handlers/test_txn_author_agreement_handler.py
@@ -28,6 +28,7 @@ def set_aml(txn_author_agreement_handler):
                                                               serializer=config_state_serializer))
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation_without_permission(taa_request,
                                                txn_author_agreement_handler: TxnAuthorAgreementHandler,
                                                creator,
@@ -37,6 +38,7 @@ def test_dynamic_validation_without_permission(taa_request,
         txn_author_agreement_handler.dynamic_validation(taa_request, 0)
 
 
+@pytest.mark.request_handlers
 def test_dynamic_validation(taa_request,
                             txn_author_agreement_handler: TxnAuthorAgreementHandler,
                             creator,
diff --git a/indy_node/test/request_handlers/test_txn_author_agreement_handler_v1.py b/indy_node/test/request_handlers/test_txn_author_agreement_handler_v1.py
index 492f67775..7d0bc10ed 100644
--- a/indy_node/test/request_handlers/test_txn_author_agreement_handler_v1.py
+++ b/indy_node/test/request_handlers/test_txn_author_agreement_handler_v1.py
@@ -27,6 +27,7 @@ def txn_author_agreement_handler(tconf, domain_state, write_auth_req_validator):
     return handler
 
 
+@pytest.mark.request_handlers
 def test_update_state(txn_author_agreement_handler, taa_request):
     seq_no = 1
     txn_time = 1560241033
diff --git a/indy_node/test/request_handlers/test_update_state_config_req_handler.py b/indy_node/test/request_handlers/test_update_state_config_req_handler.py
index d07e1bb21..75361e66a 100644
--- a/indy_node/test/request_handlers/test_update_state_config_req_handler.py
+++ b/indy_node/test/request_handlers/test_update_state_config_req_handler.py
@@ -45,6 +45,7 @@ def prepare_request(looper, sdk_wallet_trustee):
     return action, constraint, Request(**json.loads(req_json))
 
 
+@pytest.mark.request_handlers
 def test_update_state(write_manager,
                       db_manager,
                       prepare_request,
@@ -61,6 +62,7 @@ def test_update_state(write_manager,
     assert head_hash_after != head_hash_before
 
 
+@pytest.mark.request_handlers
 def test_uncommitted_state_after_apply(write_manager,
                                        db_manager,
                                        constraint_serializer,
@@ -77,6 +79,7 @@ def test_uncommitted_state_after_apply(write_manager,
     assert constraint_serializer.deserialize(from_state) == constraint
 
 
+@pytest.mark.request_handlers
 def test_init_state_from_ledger(write_manager,
                                 db_manager,
                                 constraint_serializer,
diff --git a/indy_node/test/request_propagates/test_request_propagates.py b/indy_node/test/request_propagates/test_request_propagates.py
index 3ec8ee224..fb2113a83 100644
--- a/indy_node/test/request_propagates/test_request_propagates.py
+++ b/indy_node/test/request_propagates/test_request_propagates.py
@@ -58,6 +58,7 @@ def req(request, looper, sdk_pool_handle, sdk_wallet_steward):
     return Request(**json.loads(req_signed))
 
 
+@pytest.mark.request_propagates
 def test_propagate_request(looper, node, sdk_wallet_steward, req):
     # Emulate Received PROPAGATE with the req
     propagate = Propagate(req.as_dict, "client_name")
diff --git a/indy_node/test/rich_schema/test_rich_schemas_disabled_by_default.py b/indy_node/test/rich_schema/test_rich_schemas_disabled_by_default.py
index 63b9f24ae..c12cba617 100644
--- a/indy_node/test/rich_schema/test_rich_schemas_disabled_by_default.py
+++ b/indy_node/test/rich_schema/test_rich_schemas_disabled_by_default.py
@@ -24,6 +24,7 @@ def write_rich_schema(looper, sdk_pool_handle, sdk_wallet_endorser, tconf):
                                                    rs_version=rs_version, rs_type=rs_type, rs_content=content)
 
 
+@pytest.mark.rich_schema
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id',
                          [(JSON_LD_CONTEXT, RS_CONTEXT_TYPE_VALUE, W3C_BASE_CONTEXT, randomString())])
 def test_send_rich_schema_obj_disabled_by_default(looper, sdk_pool_handle, sdk_wallet_endorser, txn_type, rs_type,
@@ -39,6 +40,7 @@ def test_send_rich_schema_obj_disabled_by_default(looper, sdk_pool_handle, sdk_w
         sdk_get_and_check_replies(looper, [req])
 
 
+@pytest.mark.rich_schema
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id, rs_name, rs_version', PARAMS)
 def test_send_get_rich_schema_obj_by_id_disabled_by_default(looper, sdk_pool_handle, sdk_wallet_endorser, txn_type,
                                                             rs_type, content, rs_id, rs_name, rs_version,
@@ -54,6 +56,7 @@ def test_send_get_rich_schema_obj_by_id_disabled_by_default(looper, sdk_pool_han
                                             get_rich_schema_by_id_operation)
 
 
+@pytest.mark.rich_schema
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id, rs_name, rs_version', PARAMS)
 def test_send_get_rich_schema_obj_by_metadata_disabled_by_default(looper, sdk_pool_handle, sdk_wallet_endorser,
                                                                   txn_type, rs_type, content, rs_id, rs_name,
diff --git a/indy_node/test/rich_schema/test_send_get_rich_schema_obj.py b/indy_node/test/rich_schema/test_send_get_rich_schema_obj.py
index 7f9a0c5f2..a43a2c004 100644
--- a/indy_node/test/rich_schema/test_send_get_rich_schema_obj.py
+++ b/indy_node/test/rich_schema/test_send_get_rich_schema_obj.py
@@ -61,6 +61,7 @@ def write_rich_schema(looper, sdk_pool_handle, sdk_wallet_endorser):
                                                rs_version=rs_version, rs_type=rs_type, rs_content=content)
 
 
+@pytest.mark.rich_schema
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id, rs_name, rs_version', PARAMS)
 def test_send_get_rich_schema_obj_by_id(looper, sdk_pool_handle, sdk_wallet_endorser,
                                         write_rich_schema,
@@ -90,6 +91,7 @@ def test_send_get_rich_schema_obj_by_id(looper, sdk_pool_handle, sdk_wallet_endo
     check_valid_proof(result)
 
 
+@pytest.mark.rich_schema
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id, rs_name, rs_version', PARAMS)
 def test_send_get_rich_schema_obj_by_metadata(looper, sdk_pool_handle, sdk_wallet_endorser, sdk_wallet_client,
                                               write_rich_schema,
@@ -121,6 +123,7 @@ def test_send_get_rich_schema_obj_by_metadata(looper, sdk_pool_handle, sdk_walle
     check_valid_proof(result)
 
 
+@pytest.mark.rich_schema
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id, rs_name, rs_version', PARAMS)
 def test_send_get_rich_schema_obj_by_invalid_id(looper, sdk_pool_handle, sdk_wallet_endorser,
                                                 write_rich_schema,
@@ -140,6 +143,7 @@ def test_send_get_rich_schema_obj_by_invalid_id(looper, sdk_pool_handle, sdk_wal
     check_valid_proof(result)
 
 
+@pytest.mark.rich_schema
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id, rs_name, rs_version', PARAMS)
 @pytest.mark.parametrize('invalid_meta_name, invalid_meta_value', [(RS_NAME, randomString()),
                                                                    (RS_VERSION, "100.3"),
@@ -166,6 +170,7 @@ def test_send_get_rich_schema_obj_by_invalid_metadata(looper, sdk_pool_handle, s
     check_valid_proof(result)
 
 
+@pytest.mark.rich_schema
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id, rs_name, rs_version', PARAMS)
 def test_send_get_rich_schema_obj_by_no_id(looper, sdk_pool_handle, sdk_wallet_endorser,
                                            write_rich_schema,
@@ -180,6 +185,7 @@ def test_send_get_rich_schema_obj_by_no_id(looper, sdk_pool_handle, sdk_wallet_e
                                             get_rich_schema_by_id_operation)
 
 
+@pytest.mark.rich_schema
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id, rs_name, rs_version', PARAMS)
 @pytest.mark.parametrize('absent_meta', [RS_NAME, RS_VERSION, RS_TYPE])
 def test_send_get_rich_schema_obj_by_no_metadata(looper, sdk_pool_handle, sdk_wallet_endorser,
diff --git a/indy_node/test/rich_schema/test_send_rich_schema_obj.py b/indy_node/test/rich_schema/test_send_rich_schema_obj.py
index 04c7cb154..3e130db20 100644
--- a/indy_node/test/rich_schema/test_send_rich_schema_obj.py
+++ b/indy_node/test/rich_schema/test_send_rich_schema_obj.py
@@ -28,6 +28,7 @@ def tconf(tconf):
 # The order of creation is essential as some rich schema object reference others by ID
 # Encoding's id must be equal to the one used in RICH_SCHEMA_MAPPING_EX1
 
+@pytest.mark.rich_schema
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id',
                          [(JSON_LD_CONTEXT, RS_CONTEXT_TYPE_VALUE, W3C_BASE_CONTEXT, randomString()),
                           (RICH_SCHEMA, RS_SCHEMA_TYPE_VALUE, RICH_SCHEMA_EX1, RICH_SCHEMA_EX1['@id']),
@@ -61,6 +62,7 @@ def test_send_rich_schema_obj(looper, sdk_pool_handle, sdk_wallet_endorser,
         sdk_get_and_check_replies(looper, [req])
 
 
+@pytest.mark.rich_schema
 @pytest.mark.parametrize('txn_type, rs_type, content, rs_id',
                          [(JSON_LD_CONTEXT, RS_CONTEXT_TYPE_VALUE, W3C_BASE_CONTEXT, randomString()),
                           (RICH_SCHEMA, RS_SCHEMA_TYPE_VALUE, RICH_SCHEMA_EX1, RICH_SCHEMA_EX1['@id']),
diff --git a/indy_node/test/schema/test_send_get_schema.py b/indy_node/test/schema/test_send_get_schema.py
index f4f47c85b..73cdc47de 100644
--- a/indy_node/test/schema/test_send_get_schema.py
+++ b/indy_node/test/schema/test_send_get_schema.py
@@ -37,6 +37,7 @@ def send_schema_req(looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee):
     return schema_json, reply
 
 
+@pytest.mark.schema
 def test_send_get_schema_succeeds(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, send_schema):
     _, did = sdk_wallet_trustee
@@ -46,6 +47,7 @@ def test_send_get_schema_succeeds(
     assert rep[0][1]['result']['seqNo']
 
 
+@pytest.mark.schema
 def test_send_get_schema_as_client(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_client, send_schema):
     _, did = sdk_wallet_client
@@ -55,6 +57,7 @@ def test_send_get_schema_as_client(
     assert rep[0][1]['result']['seqNo']
 
 
+@pytest.mark.schema
 def test_send_get_schema_fails_with_invalid_name(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, send_schema):
     _, did = sdk_wallet_trustee
@@ -65,6 +68,7 @@ def test_send_get_schema_fails_with_invalid_name(
     assert rep[0][1]['result']['seqNo'] is None
 
 
+@pytest.mark.schema
 def test_send_get_schema_fails_with_invalid_dest(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, send_schema):
     uuid_identifier = createUuidIdentifier()
@@ -76,6 +80,7 @@ def test_send_get_schema_fails_with_invalid_dest(
     assert rep[0][1]['result']['seqNo'] is None
 
 
+@pytest.mark.schema
 def test_send_get_schema_fails_with_invalid_version(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, send_schema):
     _, did = sdk_wallet_trustee
@@ -86,6 +91,7 @@ def test_send_get_schema_fails_with_invalid_version(
     assert rep[0][1]['result']['seqNo'] is None
 
 
+@pytest.mark.schema
 def test_send_get_schema_fails_with_invalid_version_syntax(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, send_schema):
     _, did = sdk_wallet_trustee
@@ -97,6 +103,7 @@ def test_send_get_schema_fails_with_invalid_version_syntax(
     e.match("Invalid version: 'asd'")
 
 
+@pytest.mark.schema
 def test_send_get_schema_fails_without_version(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, send_schema):
     _, did = sdk_wallet_trustee
@@ -110,6 +117,7 @@ def test_send_get_schema_fails_without_version(
     e.match('missed fields - version')
 
 
+@pytest.mark.schema
 def test_send_get_schema_fails_without_name(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, send_schema):
     _, did = sdk_wallet_trustee
@@ -123,6 +131,7 @@ def test_send_get_schema_fails_without_name(
     e.match('missed fields - name')
 
 
+@pytest.mark.schema
 def test_send_get_schema_fails_without_dest(
         looper, sdk_pool_handle, nodeSet, sdk_wallet_trustee, send_schema):
     _, did = sdk_wallet_trustee
diff --git a/indy_node/test/schema/test_send_schema.py b/indy_node/test/schema/test_send_schema.py
index 227b5bc74..826a00441 100644
--- a/indy_node/test/schema/test_send_schema.py
+++ b/indy_node/test/schema/test_send_schema.py
@@ -12,6 +12,7 @@
 from plenum.config import NAME_FIELD_LIMIT
 
 
+@pytest.mark.schema
 def test_send_schema_multiple_attrib(looper, sdk_pool_handle,
                                      sdk_wallet_endorser):
     sdk_write_schema_and_check(
@@ -23,6 +24,7 @@ def test_send_schema_multiple_attrib(looper, sdk_pool_handle,
     )
 
 
+@pytest.mark.schema
 def test_send_schema_one_attrib(looper, sdk_pool_handle,
                                 sdk_wallet_endorser):
     sdk_write_schema_and_check(
@@ -34,6 +36,7 @@ def test_send_schema_one_attrib(looper, sdk_pool_handle,
     )
 
 
+@pytest.mark.schema
 def test_can_not_send_same_schema(looper, sdk_pool_handle,
                                   sdk_wallet_endorser):
     sdk_write_schema_and_check(
@@ -56,6 +59,7 @@ def test_can_not_send_same_schema(looper, sdk_pool_handle,
         validate_write_reply(resp)
 
 
+@pytest.mark.schema
 def test_schema_maximum_attrib(looper, sdk_pool_handle,
                                sdk_wallet_endorser):
     attribs = []
@@ -71,6 +75,7 @@ def test_schema_maximum_attrib(looper, sdk_pool_handle,
     )
 
 
+@pytest.mark.schema
 def test_schema_over_maximum_attrib():
     attribs = []
     for i in range(SCHEMA_ATTRIBUTES_LIMIT + 1):
diff --git a/indy_node/test/state_proof/test_asking_one_node.py b/indy_node/test/state_proof/test_asking_one_node.py
index 12d97946a..dbe9e0b7b 100644
--- a/indy_node/test/state_proof/test_asking_one_node.py
+++ b/indy_node/test/state_proof/test_asking_one_node.py
@@ -9,6 +9,7 @@
     attributeName, attributeValue, sdk_added_raw_attribute
 
 
+@pytest.mark.state_proof
 def test_client_gets_read_reply_from_1_node_only(looper,
                                                  nodeSetWithOneNodeResponding,
                                                  sdk_added_raw_attribute,
diff --git a/indy_node/test/state_proof/test_state_multi_proofs_for_get_requests.py b/indy_node/test/state_proof/test_state_multi_proofs_for_get_requests.py
index 5bd4d267a..df2918337 100644
--- a/indy_node/test/state_proof/test_state_multi_proofs_for_get_requests.py
+++ b/indy_node/test/state_proof/test_state_multi_proofs_for_get_requests.py
@@ -4,6 +4,7 @@
 import time
 
 import base58
+import pytest
 
 from common.serializers.serialization import state_roots_serializer, domain_state_serializer
 from crypto.bls.bls_multi_signature import MultiSignature, MultiSignatureValue
@@ -62,7 +63,7 @@ def is_proof_verified(db_manager,
 
 
 # Similar tests for Rich Schema objects are in indy_node/test/request_handlers/rich_schema
-
+@pytest.mark.state_proof
 def test_state_proofs_for_get_attr(write_manager,
                                    read_manager,
                                    db_manager):
@@ -109,6 +110,7 @@ def test_state_proofs_for_get_attr(write_manager,
                              domain.hash_of(attr_value), seq_no, txn_time)
 
 
+@pytest.mark.state_proof
 def test_state_proofs_for_get_claim_def(write_manager,
                                         read_manager,
                                         db_manager):
@@ -167,6 +169,7 @@ def test_state_proofs_for_get_claim_def(write_manager,
                              key_components, seq_no, txn_time)
 
 
+@pytest.mark.state_proof
 def test_state_proofs_for_get_schema(write_manager,
                                      read_manager,
                                      db_manager):
@@ -292,6 +295,7 @@ def get_nym_verify_proof(read_manager,
     )
 
 
+@pytest.mark.state_proof
 def test_state_proofs_for_get_nym(write_manager,
                                   read_manager,
                                   db_manager):
@@ -312,6 +316,7 @@ def test_state_proofs_for_get_nym(write_manager,
     assert get_nym_verify_proof(read_manager, db_manager, garbled_nym, None, multi_sig)
 
 
+@pytest.mark.state_proof
 def test_no_state_proofs_if_protocol_version_less(write_manager,
                                                   read_manager,
                                                   db_manager):
diff --git a/indy_node/test/state_proof/test_state_proof_for_get_requests.py b/indy_node/test/state_proof/test_state_proof_for_get_requests.py
index e865fcc88..c866b3c2d 100644
--- a/indy_node/test/state_proof/test_state_proof_for_get_requests.py
+++ b/indy_node/test/state_proof/test_state_proof_for_get_requests.py
@@ -37,6 +37,7 @@
 from plenum.test.helper import sdk_get_and_check_replies, sdk_sign_and_submit_req
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_get_attr(looper,
                                            nodeSetWithOneNodeResponding,
                                            sdk_added_raw_attribute,
@@ -65,6 +66,7 @@ def test_state_proof_returned_for_get_attr(looper,
     check_valid_proof(result)
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_get_nym(looper,
                                           nodeSetWithOneNodeResponding,
                                           sdk_user_wallet_a,
@@ -104,6 +106,7 @@ def test_state_proof_returned_for_get_nym(looper,
     check_valid_proof(result)
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_get_schema(looper,
                                              nodeSetWithOneNodeResponding,
                                              sdk_wallet_endorser,
@@ -271,6 +274,7 @@ def test_state_proof_returned_for_get_rich_schema_obj_by_metadata(looper,
     check_valid_proof(result)
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_get_claim_def(looper,
                                                 nodeSetWithOneNodeResponding,
                                                 sdk_wallet_endorser,
@@ -315,6 +319,7 @@ def test_state_proof_returned_for_get_claim_def(looper,
     check_valid_proof(result)
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_get_auth_rule(looper,
                                                 nodeSetWithOneNodeResponding,
                                                 sdk_wallet_steward,
@@ -337,6 +342,7 @@ def test_state_proof_returned_for_get_auth_rule(looper,
     check_valid_proof(result)
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_get_revoc_reg_def(looper,
                                                     nodeSetWithOneNodeResponding,
                                                     sdk_wallet_steward,
@@ -360,6 +366,7 @@ def test_state_proof_returned_for_get_revoc_reg_def(looper,
     check_valid_proof(result)
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_get_revoc_reg_entry(looper,
                                                       nodeSetWithOneNodeResponding,
                                                       sdk_wallet_steward,
@@ -411,6 +418,7 @@ def check_get_delta(looper, sdk_wallet_client, sdk_wallet_steward, revoc_reg_def
         check_valid_proof(result)
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_get_revoc_reg_delta(looper,
                                                       nodeSetWithOneNodeResponding,
                                                       sdk_wallet_steward,
diff --git a/indy_node/test/state_proof/test_state_proof_for_missing_data.py b/indy_node/test/state_proof/test_state_proof_for_missing_data.py
index f3a8d5c48..9322fc0b8 100644
--- a/indy_node/test/state_proof/test_state_proof_for_missing_data.py
+++ b/indy_node/test/state_proof/test_state_proof_for_missing_data.py
@@ -22,6 +22,7 @@ def check_no_data_and_valid_proof(result):
     check_valid_proof(result)
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_missing_attr(looper, nodeSetWithOneNodeResponding,
                                                attributeName,
                                                sdk_pool_handle,
@@ -41,6 +42,7 @@ def test_state_proof_returned_for_missing_attr(looper, nodeSetWithOneNodeRespond
     check_no_data_and_valid_proof(result)
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_missing_nym(looper, nodeSetWithOneNodeResponding,
                                               sdk_pool_handle,
                                               sdk_wallet_endorser,
@@ -63,6 +65,7 @@ def test_state_proof_returned_for_missing_nym(looper, nodeSetWithOneNodeRespondi
     check_no_data_and_valid_proof(result)
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_missing_schema(looper, nodeSetWithOneNodeResponding,
                                                  sdk_pool_handle,
                                                  sdk_wallet_endorser):
@@ -87,6 +90,7 @@ def test_state_proof_returned_for_missing_schema(looper, nodeSetWithOneNodeRespo
     check_valid_proof(result)
 
 
+@pytest.mark.state_proof
 def test_state_proof_returned_for_missing_claim_def(looper, nodeSetWithOneNodeResponding,
                                                     sdk_pool_handle,
                                                     sdk_wallet_endorser):
diff --git a/indy_node/test/suspension/test_node_suspension.py b/indy_node/test/suspension/test_node_suspension.py
index 8352b345d..89ec4232f 100644
--- a/indy_node/test/suspension/test_node_suspension.py
+++ b/indy_node/test/suspension/test_node_suspension.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_common.config_helper import NodeConfigHelper
 from indy_node.test.conftest import sdk_node_theta_added
 from indy_node.test.helper import TestNode
@@ -13,7 +15,8 @@
 nodeCount = 7
 
 
-def testSuspendNode(looper, sdk_pool_handle, sdk_wallet_trustee, nodeSet,
+@pytest.mark.suspension
+def test_suspend_node(looper, sdk_pool_handle, sdk_wallet_trustee, nodeSet,
                     tdir, tconf, allPluginsPath):
     """
     Suspend a node and then cancel suspension. Suspend while suspended
@@ -51,7 +54,8 @@ def _wait_view_change_finish(looper, nodes, view_no):
     ensureElectionsDone(looper=looper, nodes=nodes)
 
 
-def testDemoteNodeWhichWasNeverActive(looper, nodeSet, sdk_pool_handle,
+@pytest.mark.suspension
+def test_demote_node_which_was_never_active(looper, nodeSet, sdk_pool_handle,
                                       sdk_wallet_trustee, tdir, tconf,
                                       allPluginsPath):
     """
diff --git a/indy_node/test/suspension/test_nym_suspension.py b/indy_node/test/suspension/test_nym_suspension.py
index 29d86b9bf..704d85541 100644
--- a/indy_node/test/suspension/test_nym_suspension.py
+++ b/indy_node/test/suspension/test_nym_suspension.py
@@ -7,7 +7,8 @@
 from plenum.test.pool_transactions.helper import sdk_add_new_nym
 
 
-def testTrusteeSuspendingEndorser(looper, sdk_pool_handle, sdk_wallet_trustee,
+@pytest.mark.suspension
+def test_trustee_suspending_endorser(looper, sdk_pool_handle, sdk_wallet_trustee,
                                      sdk_wallet_endorser):
     _, did = sdk_wallet_endorser
     sdk_suspend_role(looper, sdk_pool_handle, sdk_wallet_trustee, did)
@@ -16,7 +17,8 @@ def testTrusteeSuspendingEndorser(looper, sdk_pool_handle, sdk_wallet_trustee,
     e.match('Rule for this action is')
 
 
-def testTrusteeSuspendingTrustee(looper, sdk_pool_handle, sdk_wallet_trustee,
+@pytest.mark.suspension
+def test_trustee_suspending_trustee(looper, sdk_pool_handle, sdk_wallet_trustee,
                                  another_trustee):
     _, did = another_trustee
     sdk_suspend_role(looper, sdk_pool_handle, sdk_wallet_trustee, did)
@@ -25,7 +27,8 @@ def testTrusteeSuspendingTrustee(looper, sdk_pool_handle, sdk_wallet_trustee,
     e.match('Rule for this action is')
 
 
-def testTrusteeSuspendingSteward(looper, sdk_pool_handle, sdk_wallet_trustee,
+@pytest.mark.suspension
+def test_trustee_suspending_steward(looper, sdk_pool_handle, sdk_wallet_trustee,
                                  sdk_wallet_steward):
     _, did = sdk_wallet_steward
     sdk_suspend_role(looper, sdk_pool_handle, sdk_wallet_trustee, did)
@@ -34,7 +37,8 @@ def testTrusteeSuspendingSteward(looper, sdk_pool_handle, sdk_wallet_trustee,
     e.match('Rule for this action is')
 
 
-def testEndorserSuspendingHimselfByVerkeyFlush(looper, sdk_pool_handle,
+@pytest.mark.suspension
+def test_endorser_suspending_himself_by_verkey_flush(looper, sdk_pool_handle,
                                                   sdk_wallet_endorser):
     # The endorser has already lost its role due to previous tests,
     # but it is ok for this test where the endorser flushes its verkey
diff --git a/indy_node/test/suspension/test_suspension.py b/indy_node/test/suspension/test_suspension.py
index 1017f44f9..0bd85d506 100644
--- a/indy_node/test/suspension/test_suspension.py
+++ b/indy_node/test/suspension/test_suspension.py
@@ -44,21 +44,25 @@ def another_endorser1(looper, nodeSet, sdk_pool_handle, sdk_wallet_trustee):
                            sdk_wallet_trustee, 'newEndorser1', ENDORSER_STRING)
 
 
-def testTrusteeAddingAnotherTrustee(another_trustee):
+@pytest.mark.suspension
+def test_trustee_adding_another_trustee(another_trustee):
     pass
 
 
-def testTrusteeAddingSteward(looper, sdk_pool_handle, another_steward):
+@pytest.mark.suspension
+def test_trustee_adding_steward(looper, sdk_pool_handle, another_steward):
     # The new Steward adds a ENDORSER
     sdk_add_new_nym(looper, sdk_pool_handle, another_steward, role=ENDORSER_STRING)
 
 
-def testTrusteeAddingEndorser(looper, sdk_pool_handle, another_endorser):
+@pytest.mark.suspension
+def test_trustee_adding_endorser(looper, sdk_pool_handle, another_endorser):
     # The new TEndorser adds a NYM
     sdk_add_new_nym(looper, sdk_pool_handle, another_endorser)
 
 
-def testStewardSuspensionByTrustee(looper, sdk_pool_handle,
+@pytest.mark.suspension
+def test_steward_suspension_by_trustee(looper, sdk_pool_handle,
                                    another_trustee, another_steward):
     _, did_stew = another_steward
     sdk_suspend_role(looper, sdk_pool_handle, another_trustee, did_stew)
@@ -67,7 +71,8 @@ def testStewardSuspensionByTrustee(looper, sdk_pool_handle,
                         another_steward, role=ENDORSER_STRING)
 
 
-def testEndorserSuspensionByTrustee(
+@pytest.mark.suspension
+def test_endorser_suspension_by_trustee(
         looper, sdk_pool_handle, another_trustee, another_endorser):
     _, did_ta = another_endorser
     sdk_suspend_role(looper, sdk_pool_handle, another_trustee, did_ta)
@@ -76,7 +81,8 @@ def testEndorserSuspensionByTrustee(
                         another_endorser, alias=randomString())
 
 
-def testTrusteeSuspensionByTrustee(looper, sdk_pool_handle, sdk_wallet_trustee,
+@pytest.mark.suspension
+def test_trustee_suspension_by_trustee(looper, sdk_pool_handle, sdk_wallet_trustee,
                                    another_trustee, another_steward1):
     # trustee suspension by trustee is succeed
     _, did = another_trustee
@@ -91,7 +97,8 @@ def testTrusteeSuspensionByTrustee(looper, sdk_pool_handle, sdk_wallet_trustee,
 
 # Keep the test below at the end of the suite since it will make one of the
 # nodes inactive, unless you are planning to add new nodes.
-def testValidatorSuspensionByTrustee(sdk_wallet_trustee, sdk_pool_handle, looper, nodeSet):
+@pytest.mark.suspension
+def test_validator_suspension_by_trustee(sdk_wallet_trustee, sdk_pool_handle, looper, nodeSet):
     node = nodeSet[-1]
     demote_node(looper, sdk_wallet_trustee, sdk_pool_handle, node)
     for n in nodeSet[:-1]:
diff --git a/indy_node/test/tools/test_nsreplay.py b/indy_node/test/tools/test_nsreplay.py
index d3d9d42f3..3300855ba 100644
--- a/indy_node/test/tools/test_nsreplay.py
+++ b/indy_node/test/tools/test_nsreplay.py
@@ -43,6 +43,7 @@ def run_script(script_name, args):
             return rtn
 
 
+@pytest.mark.tools
 def test_nscapture_unit_tests():
     cmd_path = os.path.join(find_ns_script_dir(), 'nscapture')
     with open(cmd_path, 'r+b') as r_file:
diff --git a/indy_node/test/txn_author_agreement/test_get_taa_aml.py b/indy_node/test/txn_author_agreement/test_get_taa_aml.py
index 3c888ab00..7e7c76925 100644
--- a/indy_node/test/txn_author_agreement/test_get_taa_aml.py
+++ b/indy_node/test/txn_author_agreement/test_get_taa_aml.py
@@ -11,6 +11,7 @@
 from plenum.common.types import OPERATION, f
 
 
+@pytest.mark.txn_author_agreement
 def test_get_taa_aml_static_validation_fails(looper, txnPoolNodeSet, sdk_pool_handle, sdk_wallet_client):
     req = {
         OPERATION: {
diff --git a/indy_node/test/txn_author_agreement/test_node_taa.py b/indy_node/test/txn_author_agreement/test_node_taa.py
index c32ce20b1..db717d8c1 100644
--- a/indy_node/test/txn_author_agreement/test_node_taa.py
+++ b/indy_node/test/txn_author_agreement/test_node_taa.py
@@ -16,6 +16,7 @@
 from plenum.test.txn_author_agreement.helper import sdk_send_txn_author_agreement, sdk_get_txn_author_agreement
 
 
+@pytest.mark.txn_author_agreement
 def test_send_valid_txn_author_agreement_succeeds(looper, setup_aml, txnPoolNodeSet, sdk_pool_handle,
                                                   sdk_wallet_trustee, sdk_wallet_client):
     text = randomString(1024)
@@ -32,6 +33,7 @@ def test_send_valid_txn_author_agreement_succeeds(looper, setup_aml, txnPoolNode
     assert result[TXN_AUTHOR_AGREEMENT_RATIFICATION_TS] == ratified
 
 
+@pytest.mark.txn_author_agreement
 def test_send_valid_txn_author_agreement_without_enough_privileges_fails(looper, setup_aml, txnPoolNodeSet,
                                                                          sdk_pool_handle,
                                                                          sdk_wallet_steward):
@@ -40,6 +42,7 @@ def test_send_valid_txn_author_agreement_without_enough_privileges_fails(looper,
                                       randomString(16), randomString(1024))
 
 
+@pytest.mark.txn_author_agreement
 def test_txn_author_agreement_respects_current_auth_rules(looper, setup_aml, txnPoolNodeSet, sdk_pool_handle,
                                                           sdk_wallet_trustee, sdk_wallet_steward):
     sdk_send_and_check_auth_rule_request(looper, sdk_pool_handle, sdk_wallet_trustee,
diff --git a/indy_node/test/txn_author_agreement/test_recover_taa_from_ledger.py b/indy_node/test/txn_author_agreement/test_recover_taa_from_ledger.py
index 4efdbefa2..676111a4c 100644
--- a/indy_node/test/txn_author_agreement/test_recover_taa_from_ledger.py
+++ b/indy_node/test/txn_author_agreement/test_recover_taa_from_ledger.py
@@ -1,3 +1,4 @@
+import pytest
 from plenum.common.constants import TXN_AUTHOR_AGREEMENT, TXN_AUTHOR_AGREEMENT_DIGEST, \
     TXN_AUTHOR_AGREEMENT_RATIFICATION_TS, TXN_AUTHOR_AGREEMENT_VERSION, TXN_AUTHOR_AGREEMENT_RETIREMENT_TS, \
     CURRENT_TXN_PAYLOAD_VERSIONS
@@ -12,6 +13,7 @@
     sdk_send_txn_author_agreement_disable
 
 
+@pytest.mark.txn_author_agreement
 def test_recover_taa_from_ledger(txnPoolNodeSet,
                                  sdk_pool_handle,
                                  sdk_wallet_trustee,
diff --git a/indy_node/test/txn_validation/test_pool_upgrade_validation.py b/indy_node/test/txn_validation/test_pool_upgrade_validation.py
index b7b5d6469..4eaf1f70c 100644
--- a/indy_node/test/txn_validation/test_pool_upgrade_validation.py
+++ b/indy_node/test/txn_validation/test_pool_upgrade_validation.py
@@ -10,6 +10,7 @@
 from indy_node.test.upgrade.conftest import validUpgrade, nodeIds, pckg
 
 
+@pytest.mark.txn_validation
 def testPoolUpgradeFailsIfVersionIsLowerThanCurrent(
         looper, sdk_pool_handle, validUpgrade, sdk_wallet_trustee):
     upgrade = deepcopy(validUpgrade)
@@ -20,6 +21,7 @@ def testPoolUpgradeFailsIfVersionIsLowerThanCurrent(
     e.match('Version {} is not upgradable'.format(upgrade[VERSION]))
 
 
+@pytest.mark.txn_validation
 def testPoolUpgradeHasInvalidSyntaxIfJustificationIsEmpty(
         looper, sdk_pool_handle, validUpgrade, sdk_wallet_trustee):
     upgrade = deepcopy(validUpgrade)
@@ -30,6 +32,7 @@ def testPoolUpgradeHasInvalidSyntaxIfJustificationIsEmpty(
     e.match('empty string')
 
 
+@pytest.mark.txn_validation
 def testPoolUpgradeHasInvalidSyntaxIfJustificationIsVeryLong(
         looper, sdk_pool_handle, validUpgrade, sdk_wallet_trustee):
     upgrade = deepcopy(validUpgrade)
diff --git a/indy_node/test/txn_validation/test_send_attrib_validation.py b/indy_node/test/txn_validation/test_send_attrib_validation.py
index ca3097286..013ddf055 100644
--- a/indy_node/test/txn_validation/test_send_attrib_validation.py
+++ b/indy_node/test/txn_validation/test_send_attrib_validation.py
@@ -14,14 +14,16 @@
 from plenum.test.pool_transactions.helper import sdk_add_new_nym
 
 
-def testSendAttribSucceedsForExistingDest(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_existing_dest(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({'name': 'Alice'})
     sdk_add_attribute_and_check(looper, sdk_pool_handle, new_wallet, parameters)
 
 
-def testSendAttribFailsForNotExistingDest(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_not_existing_dest(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     wh, _ = sdk_wallet_trustee
     seed = randomString(32)
@@ -35,7 +37,8 @@ def testSendAttribFailsForNotExistingDest(
     e.match('dest should be added before adding attribute for it')
 
 
-def testSendAttribSucceedsForRawWithCompoundAttr(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_raw_with_compound_attr(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -48,7 +51,8 @@ def testSendAttribSucceedsForRawWithCompoundAttr(
     sdk_add_attribute_and_check(looper, sdk_pool_handle, new_wallet, parameters)
 
 
-def testSendAttribSucceedsForRawWithNullifiedAttr(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_raw_with_nullified_attr(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -57,7 +61,8 @@ def testSendAttribSucceedsForRawWithNullifiedAttr(
     sdk_add_attribute_and_check(looper, sdk_pool_handle, new_wallet, parameters)
 
 
-def testSendAttribSucceedsForRawWithEndpointWithHaContainingIpAddrAndPort(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_raw_with_endpoint_with_ha_containing_ip_addr_and_port(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -68,7 +73,8 @@ def testSendAttribSucceedsForRawWithEndpointWithHaContainingIpAddrAndPort(
     sdk_add_attribute_and_check(looper, sdk_pool_handle, new_wallet, parameters)
 
 
-def testSendAttribSucceedsForRawWithEndpointWithHaBeingNull(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_raw_with_endpoint_with_ha_being_null(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -79,7 +85,8 @@ def testSendAttribSucceedsForRawWithEndpointWithHaBeingNull(
     sdk_add_attribute_and_check(looper, sdk_pool_handle, new_wallet, parameters)
 
 
-def testSendAttribSucceedsForRawWithEndpointWithValidHaAndOtherProperties(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_raw_with_endpoint_with_valid_ha_and_other_properties(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -92,7 +99,8 @@ def testSendAttribSucceedsForRawWithEndpointWithValidHaAndOtherProperties(
     sdk_add_attribute_and_check(looper, sdk_pool_handle, new_wallet, parameters)
 
 
-def testSendAttribSucceedsForRawWithEndpointWithoutHaButWithOtherProperties(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_raw_with_endpoint_without_ha_but_with_other_properties(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -104,7 +112,8 @@ def testSendAttribSucceedsForRawWithEndpointWithoutHaButWithOtherProperties(
     sdk_add_attribute_and_check(looper, sdk_pool_handle, new_wallet, parameters)
 
 
-def testSendAttribSucceedsForRawWithEndpointWithoutProperties(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_raw_with_endpoint_without_properties(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -113,7 +122,8 @@ def testSendAttribSucceedsForRawWithEndpointWithoutProperties(
     sdk_add_attribute_and_check(looper, sdk_pool_handle, new_wallet, parameters)
 
 
-def testSendAttribSucceedsForRawWithEndpointBeingNull(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_raw_with_endpoint_being_null(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -122,7 +132,8 @@ def testSendAttribSucceedsForRawWithEndpointBeingNull(
     sdk_add_attribute_and_check(looper, sdk_pool_handle, new_wallet, parameters)
 
 
-def testSendAttribFailsForRawWithEndpointWithHaIfIpAddrHasWrongFormat(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_if_ip_addr_has_wrong_format(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -135,7 +146,8 @@ def testSendAttribFailsForRawWithEndpointWithHaIfIpAddrHasWrongFormat(
     e.match('invalid endpoint address')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaIfSomeIpComponentsAreNegative(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_if_some_ip_components_are_negative(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -148,7 +160,8 @@ def testSendAttribFailsForRawWithEndpointWithHaIfSomeIpComponentsAreNegative(
     e.match('invalid endpoint address')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaIfSomeIpCompHigherThanUpperBound(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_if_some_ip_comp_higher_than_upper_bound(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -161,7 +174,8 @@ def testSendAttribFailsForRawWithEndpointWithHaIfSomeIpCompHigherThanUpperBound(
     e.match('invalid endpoint address')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaIfIpAddrIsEmpty(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_if_ip_addr_is_empty(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -174,7 +188,8 @@ def testSendAttribFailsForRawWithEndpointWithHaIfIpAddrIsEmpty(
     e.match('invalid endpoint address')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaIfPortIsNegative(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_if_port_is_negative(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -187,7 +202,8 @@ def testSendAttribFailsForRawWithEndpointWithHaIfPortIsNegative(
     e.match('invalid endpoint port')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaIfPortIsHigherThanUpperBound(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_if_port_is_higher_than_upper_bound(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -200,7 +216,8 @@ def testSendAttribFailsForRawWithEndpointWithHaIfPortIsHigherThanUpperBound(
     e.match('invalid endpoint port')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaIfPortIsFloat(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_if_port_is_float(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -213,7 +230,8 @@ def testSendAttribFailsForRawWithEndpointWithHaIfPortIsFloat(
     e.match('invalid endpoint port')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaIfPortHasWrongFormat(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_if_port_has_wrong_format(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -226,7 +244,8 @@ def testSendAttribFailsForRawWithEndpointWithHaIfPortHasWrongFormat(
     e.match('invalid endpoint port')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaIfPortIsEmpty(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_if_port_is_empty(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -239,7 +258,8 @@ def testSendAttribFailsForRawWithEndpointWithHaIfPortIsEmpty(
     e.match('invalid endpoint port')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaContainingIpAddrOnly(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_containing_ip_addr_only(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -252,7 +272,8 @@ def testSendAttribFailsForRawWithEndpointWithHaContainingIpAddrOnly(
     e.match('invalid endpoint format')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaContainingPortOnly(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_containing_port_only(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -265,7 +286,8 @@ def testSendAttribFailsForRawWithEndpointWithHaContainingPortOnly(
     e.match('invalid endpoint format')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaContainingDomainNameAndPort(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_containing_domain_name_and_port(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -278,7 +300,8 @@ def testSendAttribFailsForRawWithEndpointWithHaContainingDomainNameAndPort(
     e.match('invalid endpoint address')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaContainingDomainNameOnly(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_containing_domain_name_only(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -291,7 +314,8 @@ def testSendAttribFailsForRawWithEndpointWithHaContainingDomainNameOnly(
     e.match('invalid endpoint format')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaBeingHumanReadableText(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_being_human_readable_text(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -304,7 +328,8 @@ def testSendAttribFailsForRawWithEndpointWithHaBeingHumanReadableText(
     e.match('invalid endpoint format')
 
 
-def testSendAttribFailsForRawWithEndpointWithHaBeingDecimalNumber(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_ha_being_decimal_number(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -317,7 +342,8 @@ def testSendAttribFailsForRawWithEndpointWithHaBeingDecimalNumber(
     e.match('is not iterable')
 
 
-def testSendAttribFailsForRawWithEndpointWithEmptyHa(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_with_empty_ha(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -330,7 +356,8 @@ def testSendAttribFailsForRawWithEndpointWithEmptyHa(
     e.match('invalid endpoint format')
 
 
-def testSendAttribFailsForRawWithEndpointBeingEmptyString(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_raw_with_endpoint_being_empty_string(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -341,7 +368,8 @@ def testSendAttribFailsForRawWithEndpointBeingEmptyString(
     e.match('should be a dict')
 
 
-def testSendAttribFailsIfRawContainsMulipleAttrs(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_if_raw_contains_muliple_attrs(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({
@@ -353,7 +381,8 @@ def testSendAttribFailsIfRawContainsMulipleAttrs(
     e.match(' should contain one attribute')
 
 
-def testSendAttribFailsIfRawContainsNoAttrs(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_if_raw_contains_no_attrs(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = json.dumps({})
@@ -362,7 +391,8 @@ def testSendAttribFailsIfRawContainsNoAttrs(
     e.match(' should contain one attribute')
 
 
-def testSendAttribSucceedsForHexSha256Hash(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_hex_sha256_hash(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     raw = json.dumps({
         'name': 'Alice'
@@ -374,7 +404,8 @@ def testSendAttribSucceedsForHexSha256Hash(
                                 xhash=sha256(raw.encode()).hexdigest())
 
 
-def testSendAttribSucceedsForHexHashWithLettersInBothCases(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_hex_hash_with_letters_in_both_cases(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = None
@@ -382,7 +413,8 @@ def testSendAttribSucceedsForHexHashWithLettersInBothCases(
                                 xhash='6d4a333838d0ef96756cccC680AF2531075C512502Fb68c5503c63d93de859b3')
 
 
-def testSendAttribFailsForHashShorterThanSha256(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_hash_shorter_than_sha256(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = None
@@ -392,7 +424,8 @@ def testSendAttribFailsForHashShorterThanSha256(
     e.match('not a valid hash')
 
 
-def testSendAttribFailsForHashLongerThanSha256(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_hash_longer_than_sha256(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = None
@@ -402,7 +435,8 @@ def testSendAttribFailsForHashLongerThanSha256(
     e.match('not a valid hash')
 
 
-def testSendAttribFailsForBase58Hash(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_base58_hash(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     raw = json.dumps({
         'name': 'Alice'
@@ -417,7 +451,8 @@ def testSendAttribFailsForBase58Hash(
     e.match('not a valid hash')
 
 
-def testSendAttribFailsForBase64Hash(
+@pytest.mark.txn_validation
+def test_send_attrib_fails_for_base64_hash(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     raw = json.dumps({
         'name': 'Alice'
@@ -432,7 +467,8 @@ def testSendAttribFailsForBase64Hash(
     e.match('not a valid hash')
 
 
-def testSendAttribHasInvalidSyntaxIfHashIsEmpty(
+@pytest.mark.txn_validation
+def test_send_attrib_has_invalid_syntax_if_hash_is_empty(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = None
@@ -442,7 +478,8 @@ def testSendAttribHasInvalidSyntaxIfHashIsEmpty(
     e.match('not a valid hash')
 
 
-def testSendAttribSucceedsForNonEmptyEnc(
+@pytest.mark.txn_validation
+def test_send_attrib_succeeds_for_non_empty_enc(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     raw = json.dumps({
         'name': 'Alice'
@@ -455,7 +492,8 @@ def testSendAttribSucceedsForNonEmptyEnc(
                                 enc=secretBox.encrypt(raw.encode()).hex())
 
 
-def testSendAttribHasInvalidSyntaxIfEncIsEmpty(
+@pytest.mark.txn_validation
+def test_send_attrib_has_invalid_syntax_if_enc_is_empty(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     parameters = None
@@ -465,7 +503,8 @@ def testSendAttribHasInvalidSyntaxIfEncIsEmpty(
     e.match('empty string')
 
 
-def testSendAttribHasInvalidSyntaxIfRawAndHashPassedAtSameTime(
+@pytest.mark.txn_validation
+def test_send_attrib_has_invalid_syntax_if_raw_and_hash_passed_at_same_time(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     raw = json.dumps({
         'name': 'Alice'
@@ -479,7 +518,8 @@ def testSendAttribHasInvalidSyntaxIfRawAndHashPassedAtSameTime(
     e.match('only one field from raw, enc, hash is expected')
 
 
-def testSendAttribHasInvalidSyntaxIfRawAndEncPassedAtSameTime(
+@pytest.mark.txn_validation
+def test_send_attrib_has_invalid_syntax_if_raw_and_enc_passed_at_same_time(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     raw = json.dumps({
         'name': 'Alice'
@@ -494,7 +534,8 @@ def testSendAttribHasInvalidSyntaxIfRawAndEncPassedAtSameTime(
     e.match('not a valid hash')
 
 
-def testSendAttribHasInvalidSyntaxIfHashAndEncPassedAtSameTime(
+@pytest.mark.txn_validation
+def test_send_attrib_has_invalid_syntax_if_hash_and_enc_passed_at_same_time(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     raw = json.dumps({
         'name': 'Alice'
@@ -511,7 +552,8 @@ def testSendAttribHasInvalidSyntaxIfHashAndEncPassedAtSameTime(
     e.match('only one field from raw, enc, hash is expected')
 
 
-def testSendAttribHasInvalidSyntaxIfRawHashAndEncPassedAtSameTime(
+@pytest.mark.txn_validation
+def test_send_attrib_has_invalid_syntax_if_raw_hash_and_enc_passed_at_same_time(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     raw = json.dumps({
         'name': 'Alice'
diff --git a/indy_node/test/txn_validation/test_send_get_nym_validation.py b/indy_node/test/txn_validation/test_send_get_nym_validation.py
index f57306832..5a172e06a 100644
--- a/indy_node/test/txn_validation/test_send_get_nym_validation.py
+++ b/indy_node/test/txn_validation/test_send_get_nym_validation.py
@@ -14,17 +14,20 @@
 from plenum.test.pool_transactions.helper import sdk_add_new_nym, sdk_sign_and_send_prepared_request
 
 
-def testSendGetNymSucceedsForExistingUuidDest(
+@pytest.mark.txn_validation
+def test_send_get_nym_succeeds_for_existing_uuid_dest(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     new_wallet = sdk_add_new_nym(looper, sdk_pool_handle, sdk_wallet_trustee)
     get_nym(looper, sdk_pool_handle, sdk_wallet_trustee, new_wallet[1])
 
 
-def testSendGetNymFailsForNotExistingUuidDest(
+@pytest.mark.txn_validation
+def test_send_get_nym_fails_for_not_existing_uuid_dest(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     get_nym(looper, sdk_pool_handle, sdk_wallet_trustee, createUuidIdentifier())
 
 
+@pytest.mark.txn_validation
 def test_get_nym_returns_role(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     current_role = ENDORSER_STRING
@@ -39,12 +42,14 @@ def test_get_nym_returns_role(
     get_nym(looper, sdk_pool_handle, sdk_wallet_trustee, createUuidIdentifier())
 
 
-def testSendGetNymFailsIfCryptonymIsPassedAsDest(
+@pytest.mark.txn_validation
+def test_send_get_nym_fails_if_cryptonym_is_passed_as_dest(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     get_nym(looper, sdk_pool_handle, sdk_wallet_trustee, createCryptonym())
 
 
-def testSendGetNymFailsIfDestIsPassedInHexFormat(
+@pytest.mark.txn_validation
+def test_send_get_nym_fails_if_dest_is_passed_in_hex_format(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     # Sometimes hex representation can use only base58 compatible characters
     while True:
@@ -65,7 +70,8 @@ def testSendGetNymFailsIfDestIsPassedInHexFormat(
     e.match('should not contain the following chars')
 
 
-def testSendGetNymFailsIfDestIsInvalid(
+@pytest.mark.txn_validation
+def test_send_get_nym_fails_if_dest_is_invalid(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     uuidIdentifier = createUuidIdentifier()
     invalidIdentifier = uuidIdentifier[:-4]
@@ -79,7 +85,8 @@ def testSendGetNymFailsIfDestIsInvalid(
     e.match('should be one of \[16, 32\]')
 
 
-def testSendGetNymHasInvalidSyntaxIfDestIsEmpty(
+@pytest.mark.txn_validation
+def test_send_get_nym_has_invalid_syntax_if_dest_is_empty(
         looper, sdk_pool_handle, sdk_wallet_trustee):
     uuidIdentifier = createUuidIdentifier()
     _, s_did = sdk_wallet_trustee
diff --git a/indy_node/test/upgrade/test_action_log.py b/indy_node/test/upgrade/test_action_log.py
index 0f5539243..884576d08 100644
--- a/indy_node/test/upgrade/test_action_log.py
+++ b/indy_node/test/upgrade/test_action_log.py
@@ -9,6 +9,7 @@
     ActionLogEvents, ActionLogData, ActionLogEvent, ActionLog,
 )
 
+
 # TODO
 # - check specific error messages for expected exceptions
 # - try to load current logs
@@ -41,12 +42,12 @@ def __str__(self):
 
 
 class ActionTestLog(ActionLog):
-
     Events = Events
 
     """
     Append-only event log of upgrade event
     """
+
     def __init__(self, *args, **kwargs):
         super().__init__(
             *args,
@@ -126,6 +127,7 @@ def __ne__(self, other):
 
 
 @pytest.fixture(scope='module')
+@pytest.mark.upgrade
 def test_obj():
     return CsvSerializerTest('1', str(datetime.utcnow()), 'qwerty')
 
@@ -133,10 +135,12 @@ def test_obj():
 # TESTS
 
 
+@pytest.mark.upgrade
 def test_csv_serializer_iter(test_obj):
     assert list(iter(test_obj)) == [test_obj.int_, test_obj.ts, test_obj.str_]
 
 
+@pytest.mark.upgrade
 def test_csv_serializer_pack_unpack():
     delimiter = '_'
     args = (5,)
@@ -149,6 +153,7 @@ def test_csv_serializer_pack_unpack():
     )
 
 
+@pytest.mark.upgrade
 def test_action_log_data_init(valid_ts):
     assert ActionLogData(valid_ts).when == valid_ts
     assert ActionLogData(valid_ts.isoformat()).when == valid_ts
@@ -157,6 +162,7 @@ def test_action_log_data_init(valid_ts):
         ActionLogData(123)
 
 
+@pytest.mark.upgrade
 def test_action_log_event_init_invalid_ts(valid_ts, valid_event):
     with pytest.raises(TypeError):
         ActionLogEvent(
@@ -164,6 +170,7 @@ def test_action_log_event_init_invalid_ts(valid_ts, valid_event):
         )
 
 
+@pytest.mark.upgrade
 def test_action_log_event_init_valid_ts_none(valid_event, valid_data):
     ts1 = datetime.utcnow()
     ev = ActionLogEvent(None, valid_event, valid_data, types=Events)
@@ -172,12 +179,14 @@ def test_action_log_event_init_valid_ts_none(valid_event, valid_data):
     assert ts1 <= ev.ts <= ts2
 
 
+@pytest.mark.upgrade
 def test_action_log_event_init_valid_ts_datetime(
         valid_ts, valid_event, valid_data):
     ev = ActionLogEvent(valid_ts, valid_event, valid_data, types=Events)
     assert ev.ts == valid_ts
 
 
+@pytest.mark.upgrade
 def test_action_log_event_init_valid_ts_str(
         valid_ts, valid_event, valid_data):
     ev = ActionLogEvent(valid_ts.isoformat(), valid_event,
@@ -185,6 +194,7 @@ def test_action_log_event_init_valid_ts_str(
     assert ev.ts == valid_ts
 
 
+@pytest.mark.upgrade
 def test_action_log_event_init_invalid_ev_type(valid_ts, valid_data):
     _Events = Enum('_Events', 'ev1 ev2 ev3')
 
@@ -204,6 +214,7 @@ def test_action_log_event_init_invalid_ev_type(valid_ts, valid_data):
         )
 
 
+@pytest.mark.upgrade
 def test_action_log_event_init_valid_ev_type(valid_ts, valid_data):
     _Events = Enum('_Events', 'ev1 ev2 ev3')
 
@@ -216,6 +227,7 @@ def test_action_log_event_init_valid_ev_type(valid_ts, valid_data):
     ).ev_type == _Events.ev3
 
 
+@pytest.mark.upgrade
 def test_action_log_event_init_invalid_data(valid_ts, valid_event):
     # data_class is not specified and data not an instance of CsvSerializer
     with pytest.raises(TypeError):
@@ -229,14 +241,15 @@ def test_action_log_event_init_invalid_data(valid_ts, valid_event):
         )
 
 
+@pytest.mark.upgrade
 def test_action_log_event_init_valid_data(valid_ts, valid_event, valid_data):
     assert ActionLogEvent(
         valid_ts, valid_event, valid_data, types=Events
     ).data == valid_data
 
 
+@pytest.mark.upgrade
 def test_action_log_event_init_data_class_passed(valid_ts, valid_event):
-
     class SomeClass(CsvSerializer):
         _items = ['item1', 'item2', 'item3']
 
@@ -252,6 +265,7 @@ def __init__(self, *args):
     ev.data == SomeClass('_item1', '_item2', '_item3')
 
 
+@pytest.mark.upgrade
 def test_action_log_event_pack_unpack(valid_ts, valid_event, valid_data):
     delimiter = '|'
     ev = ActionLogEvent(valid_ts, valid_event, valid_data, types=Events)
@@ -260,10 +274,10 @@ def test_action_log_event_pack_unpack(valid_ts, valid_event, valid_data):
         data_class=LogData, types=Events)
 
 
+@pytest.mark.upgrade
 def test_action_log_api_basic(
         action_log_prepared, log_file_path,
         log_delimiter, prepared_data):
-
     # basic ones
     assert action_log_prepared.file_path == log_file_path
     assert action_log_prepared.delimiter == log_delimiter
@@ -277,6 +291,7 @@ def test_action_log_api_basic(
         assert hasattr(action_log_prepared, "append_{}".format(ev_type.name))
 
 
+@pytest.mark.upgrade
 @pytest.mark.parametrize('ev_type', Events)
 def test_action_log_append(action_log, ev_type):
     ev_data = LogData('1', 2)
@@ -285,6 +300,7 @@ def test_action_log_append(action_log, ev_type):
     assert action_log.last_event.ev_type == ev_type
 
 
+@pytest.mark.upgrade
 def test_action_log_write_file(action_log):
     ev_data = LogData('1', 2)
 
@@ -303,6 +319,7 @@ def check_log(expected):
     check_log(3)
 
 
+@pytest.mark.upgrade
 def test_action_log_load(action_log_prepared):
     new_log = ActionTestLog(
         action_log_prepared.file_path,
diff --git a/indy_node/test/upgrade/test_broken_connection_control_tool.py b/indy_node/test/upgrade/test_broken_connection_control_tool.py
index a69263a18..93b5bf273 100644
--- a/indy_node/test/upgrade/test_broken_connection_control_tool.py
+++ b/indy_node/test/upgrade/test_broken_connection_control_tool.py
@@ -40,6 +40,7 @@ def skip_functions():
     Upgrader._action_failed = old_action_failed
 
 
+@pytest.mark.upgrade
 def test_node_doesnt_retry_upgrade(looper, nodeSet, validUpgrade, nodeIds,
                                    sdk_pool_handle, sdk_wallet_trustee, tconf,
                                    skip_functions):
diff --git a/indy_node/test/upgrade/test_communication_with_control_service.py b/indy_node/test/upgrade/test_communication_with_control_service.py
index bb0b3f2d0..cd7f805a8 100644
--- a/indy_node/test/upgrade/test_communication_with_control_service.py
+++ b/indy_node/test/upgrade/test_communication_with_control_service.py
@@ -1,6 +1,7 @@
 import asyncio
 from datetime import datetime
 
+import pytest
 from stp_core.loop.eventually import eventuallySoon
 
 from indy_node.server.upgrade_log import UpgradeLogData
@@ -46,7 +47,8 @@ def _check():
     return _check
 
 
-def testScheduleNodeUpgrade(tconf, nodeSet):
+@pytest.mark.upgrade
+def test_schedule_node_upgrade(tconf, nodeSet):
     """
     Tests that upgrade scheduling works. For that it starts mock
     control service, schedules upgrade for near future and then checks that
@@ -82,7 +84,7 @@ def testScheduleNodeUpgrade(tconf, nodeSet):
     assert result == expectedResult.toJson()
 
 
-# def testCancelNodeUpgrade():
+# def test_cancel_node_upgrade():
 #     """
 #     Test cancellation of scheduled upgrades. This test schedules upgrade for
 #     unreachable moment in future and then tries to cancel that
diff --git a/indy_node/test/upgrade/test_force_upgrade_process_in_view_change.py b/indy_node/test/upgrade/test_force_upgrade_process_in_view_change.py
index 660915abc..4004cbdc1 100644
--- a/indy_node/test/upgrade/test_force_upgrade_process_in_view_change.py
+++ b/indy_node/test/upgrade/test_force_upgrade_process_in_view_change.py
@@ -19,6 +19,7 @@ def fake_node(tdir, tconf):
     return node
 
 
+@pytest.mark.upgrade
 def test_client_force_request_not_discard_in_view_change_with_dict(fake_node):
     sender = "frm"
     msg = sdk_gen_request({TXN_TYPE: POOL_UPGRADE, FORCE: True}).as_dict
diff --git a/indy_node/test/upgrade/test_forced_upgrade_if_ordered_and_then_request_received.py b/indy_node/test/upgrade/test_forced_upgrade_if_ordered_and_then_request_received.py
index 7e71f6816..b785b9b4e 100644
--- a/indy_node/test/upgrade/test_forced_upgrade_if_ordered_and_then_request_received.py
+++ b/indy_node/test/upgrade/test_forced_upgrade_if_ordered_and_then_request_received.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_node.server.upgrade_log import UpgradeLog
 from indy_node.test import waits
 from indy_node.test.upgrade.helper import checkUpgradeScheduled, \
@@ -8,6 +10,7 @@
 from stp_core.loop.eventually import eventually
 
 
+@pytest.mark.upgrade
 def test_forced_upgrade_handled_once_if_ordered_and_then_request_received(
         looper, nodeSet, sdk_pool_handle, sdk_wallet_trustee,
         validUpgradeExpForceTrue):
diff --git a/indy_node/test/upgrade/test_forced_upgrade_if_request_received_after_propagate.py b/indy_node/test/upgrade/test_forced_upgrade_if_request_received_after_propagate.py
index 65e78ae77..0eb7d1381 100644
--- a/indy_node/test/upgrade/test_forced_upgrade_if_request_received_after_propagate.py
+++ b/indy_node/test/upgrade/test_forced_upgrade_if_request_received_after_propagate.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_node.server.upgrade_log import UpgradeLog
 from indy_node.test import waits
 from indy_node.test.upgrade.helper import checkUpgradeScheduled, sdk_ensure_upgrade_sent
@@ -8,6 +10,7 @@
 from plenum.test.test_node import getNonPrimaryReplicas
 
 
+@pytest.mark.upgrade
 def test_forced_upgrade_handled_once_if_request_received_after_propagate(
         looper, nodeSet, sdk_pool_handle, sdk_wallet_trustee,
         validUpgradeExpForceTrue):
diff --git a/indy_node/test/upgrade/test_forced_upgrade_no_consensus_on_single_node.py b/indy_node/test/upgrade/test_forced_upgrade_no_consensus_on_single_node.py
index f5681693f..cf2d96a80 100644
--- a/indy_node/test/upgrade/test_forced_upgrade_no_consensus_on_single_node.py
+++ b/indy_node/test/upgrade/test_forced_upgrade_no_consensus_on_single_node.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_node.test import waits
 from indy_node.test.upgrade.helper import bumpVersion, get_req_from_update
 from plenum.common.constants import VERSION
@@ -6,6 +8,7 @@
 from indy_common.version import src_version_cls
 
 
+@pytest.mark.upgrade
 def test_forced_upgrade_no_consensus_on_single_node(
         validUpgradeExpForceTrue, looper, nodeSet, sdk_pool_handle, sdk_wallet_trustee):
     nup = validUpgradeExpForceTrue.copy()
diff --git a/indy_node/test/upgrade/test_get_deps_with_filter.py b/indy_node/test/upgrade/test_get_deps_with_filter.py
index 32cf7a48d..40da7b5cc 100644
--- a/indy_node/test/upgrade/test_get_deps_with_filter.py
+++ b/indy_node/test/upgrade/test_get_deps_with_filter.py
@@ -43,6 +43,7 @@ def patch_pkg_mgr(monkeypatch):
                         lambda *x: mock_get_info_from_package_manager(*x))
 
 
+@pytest.mark.upgrade
 @pytest.mark.parametrize("fltr_hld,res_dep",
                          [
                           ([pkg_a[0]], [pkg_a]),
diff --git a/indy_node/test/upgrade/test_migration_tool.py b/indy_node/test/upgrade/test_migration_tool.py
index 34b25fdba..205074dd3 100644
--- a/indy_node/test/upgrade/test_migration_tool.py
+++ b/indy_node/test/upgrade/test_migration_tool.py
@@ -15,7 +15,8 @@
 TEST_TIMEOUT = 1
 
 
-def testGetRelevantMigrations():
+@pytest.mark.upgrade
+def test_get_relevant_migrations():
     relevantMigrations = migration_tool._get_relevant_migrations(
         TEST_MIGRATION_SCRIPTS, TEST_VERSION, TEST_NEW_VERSION)
     assert len(relevantMigrations) == 3
@@ -23,7 +24,8 @@ def testGetRelevantMigrations():
         '0_3_100_to_0_3_101', '0_3_100_to_0_3_104', '0_9_2_to_0_9_10']
 
 
-def testMigrate(monkeypatch):
+@pytest.mark.upgrade
+def test_migrate(monkeypatch):
     testList = []
 
     monkeypatch.setattr(migration_tool, '_call_migration_script',
@@ -36,7 +38,8 @@ def testMigrate(monkeypatch):
     assert len(testList) == 3
 
 
-def testMigrateTimesOut(monkeypatch):
+@pytest.mark.upgrade
+def test_migrate_times_out(monkeypatch):
     monkeypatch.setattr(migration_tool, '_call_migration_script',
                         lambda *x: exec('raise(TimeoutError())'))
     monkeypatch.setattr(migration_tool, '_get_migration_scripts',
@@ -45,7 +48,9 @@ def testMigrateTimesOut(monkeypatch):
     with pytest.raises(TimeoutError):
         migration_tool.migrate(TEST_VERSION, TEST_NEW_VERSION, TEST_TIMEOUT)
 
-def testGetMigrationScripts():
+
+@pytest.mark.upgrade
+def test_get_migration_scripts():
     try:
         res = migration_tool._get_migration_scripts(migration_tool._get_current_platform())
     except Exception as e:
diff --git a/indy_node/test/upgrade/test_migration_util.py b/indy_node/test/upgrade/test_migration_util.py
index fca91537c..f03b09311 100644
--- a/indy_node/test/upgrade/test_migration_util.py
+++ b/indy_node/test/upgrade/test_migration_util.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_node.utils.migration_tool import _get_relevant_migrations
 
 
@@ -10,6 +12,7 @@ def comparator_relevant_migration_script(
         migration_scripts, current_version, new_version)
 
 
+@pytest.mark.upgrade
 def test_relevant_migration_script_positive():
     comparator_relevant_migration_script(['1_0_96_to_1_0_97'],
                                          '1.0.95',
@@ -37,6 +40,7 @@ def test_relevant_migration_script_positive():
                                          ['1_0_96_to_1_0_97'])
 
 
+@pytest.mark.upgrade
 def test_relevant_migration_script_current_version_higher():
     comparator_relevant_migration_script(['1_0_96_to_1_0_97'],
                                          '1.0.97',
@@ -52,6 +56,7 @@ def test_relevant_migration_script_current_version_higher():
                                          [])
 
 
+@pytest.mark.upgrade
 def test_relevant_migration_script_downgrade():
     comparator_relevant_migration_script(['1_0_96_to_1_0_97'],
                                          '1.0.97',
@@ -71,6 +76,7 @@ def test_relevant_migration_script_downgrade():
                                          ['1_0_97_to_1_0_96'])
 
 
+@pytest.mark.upgrade
 def test_relevant_migration_script_new_version_lower():
     comparator_relevant_migration_script(['1_0_96_to_1_0_97'],
                                          '1.0.87',
@@ -82,6 +88,7 @@ def test_relevant_migration_script_new_version_lower():
                                          [])
 
 
+@pytest.mark.upgrade
 def test_relevant_migration_script_multiple_scripts():
     comparator_relevant_migration_script(['1_0_96_to_1_0_97', '1_0_100_to_1_0_102'],
                                          '1.0.87',
@@ -121,6 +128,7 @@ def test_relevant_migration_script_multiple_scripts():
                                           '1_0_102_to_1_0_104'])
 
 
+@pytest.mark.upgrade
 def test_relevant_migration_reinstall():
     comparator_relevant_migration_script(['1_0_96_to_1_0_97'],
                                          '1.0.96',
diff --git a/indy_node/test/upgrade/test_node_control_tool_creates_backups.py b/indy_node/test/upgrade/test_node_control_tool_creates_backups.py
index 05bf82a05..7c16ce0fe 100644
--- a/indy_node/test/upgrade/test_node_control_tool_creates_backups.py
+++ b/indy_node/test/upgrade/test_node_control_tool_creates_backups.py
@@ -27,7 +27,8 @@ def tconf(tconf, tdir):
     yield tconf
 
 
-def testNodeControlCreatesBackups(monkeypatch, tdir, looper, tconf):
+@pytest.mark.upgrade
+def test_node_control_creates_backups(monkeypatch, tdir, looper, tconf):
     version = bumpedVersion()
     stdout = 'teststdout'
     curr_src_ver = Upgrader.get_src_version()
diff --git a/indy_node/test/upgrade/test_node_control_tool_performs_migrations.py b/indy_node/test/upgrade/test_node_control_tool_performs_migrations.py
index da8d2b46a..a1bfc67fb 100644
--- a/indy_node/test/upgrade/test_node_control_tool_performs_migrations.py
+++ b/indy_node/test/upgrade/test_node_control_tool_performs_migrations.py
@@ -28,7 +28,8 @@ def tconf(tconf, tdir):
     yield tconf
 
 
-def testNodeControlPerformsMigrations(monkeypatch, tdir, looper, tconf):
+@pytest.mark.upgrade
+def test_node_control_performs_migrations(monkeypatch, tdir, looper, tconf):
     version = bumpedVersion()
     stdout = 'teststdout'
     migrationFile = 'migrationProof'
@@ -75,5 +76,6 @@ def checkMigration():
         nct.stop()
 
 
+@pytest.mark.upgrade
 def test_get_current_platform():
     _get_current_platform()
diff --git a/indy_node/test/upgrade/test_node_control_tool_processes_invalid_data.py b/indy_node/test/upgrade/test_node_control_tool_processes_invalid_data.py
index c90d1d842..d9061f73e 100644
--- a/indy_node/test/upgrade/test_node_control_tool_processes_invalid_data.py
+++ b/indy_node/test/upgrade/test_node_control_tool_processes_invalid_data.py
@@ -18,6 +18,7 @@ def tconf(tconf, tdir):
     yield tconf
 
 
+@pytest.mark.upgrade
 def test_node_control_tool_processes_invalid_json(
     monkeypatch, tdir, tconf
 ):
@@ -32,6 +33,7 @@ def patch(tool):
         tool._process_data('{12345}'.encode('utf-8'))
 
 
+@pytest.mark.upgrade
 @pytest.mark.parametrize(
     'pkg_name,version',
     [
diff --git a/indy_node/test/upgrade/test_node_control_tool_receives_messages.py b/indy_node/test/upgrade/test_node_control_tool_receives_messages.py
index 1899906ec..57f86ba49 100644
--- a/indy_node/test/upgrade/test_node_control_tool_receives_messages.py
+++ b/indy_node/test/upgrade/test_node_control_tool_receives_messages.py
@@ -1,4 +1,6 @@
 import multiprocessing
+
+import pytest
 from stp_core.loop.eventually import eventually
 from indy_common.version import src_version_cls
 from indy_node.utils.node_control_utils import NodeControlUtil, DebianVersion
@@ -17,7 +19,8 @@
 whitelist = ['Unexpected error in _upgrade test']
 
 
-def testNodeControlReceivesMessages(monkeypatch, looper, tdir, tconf):
+@pytest.mark.upgrade
+def test_node_control_receives_messages(monkeypatch, looper, tdir, tconf):
     received = m.list()
     version = bumpedVersion()
     stdout = 'teststdout'
diff --git a/indy_node/test/upgrade/test_node_control_tool_removes_backups.py b/indy_node/test/upgrade/test_node_control_tool_removes_backups.py
index 61d3d0205..075457106 100644
--- a/indy_node/test/upgrade/test_node_control_tool_removes_backups.py
+++ b/indy_node/test/upgrade/test_node_control_tool_removes_backups.py
@@ -3,6 +3,7 @@
 import functools
 import shutil
 
+import pytest
 from stp_core.loop.eventually import eventually
 from stp_core.common.log import getlogger
 
@@ -23,7 +24,8 @@
 logger = getlogger()
 
 
-def testNodeControlRemovesBackups(monkeypatch, tdir, looper, tconf):
+@pytest.mark.upgrade
+def test_node_control_removes_backups(monkeypatch, tdir, looper, tconf):
     version = bumpedVersion()
     stdout = 'teststdout'
     curr_src_ver = Upgrader.get_src_version()
diff --git a/indy_node/test/upgrade/test_node_control_tool_resolves_dep_top_level.py b/indy_node/test/upgrade/test_node_control_tool_resolves_dep_top_level.py
index 3e4b290f8..507bd3ad8 100644
--- a/indy_node/test/upgrade/test_node_control_tool_resolves_dep_top_level.py
+++ b/indy_node/test/upgrade/test_node_control_tool_resolves_dep_top_level.py
@@ -25,6 +25,7 @@ def tconf(tconf, tdir):
     tconf.UPGRADE_ENTRY = oldv
 
 
+@pytest.mark.upgrade
 def test_node_as_depend(monkeypatch, tconf):
     nct = NodeControlTool(config=tconf)
     top_level_package = (EXT_PKT_NAME, EXT_PKT_VERSION)
diff --git a/indy_node/test/upgrade/test_node_control_tool_resolves_dependencies.py b/indy_node/test/upgrade/test_node_control_tool_resolves_dependencies.py
index 2ca4b5a4c..7f9b88132 100644
--- a/indy_node/test/upgrade/test_node_control_tool_resolves_dependencies.py
+++ b/indy_node/test/upgrade/test_node_control_tool_resolves_dependencies.py
@@ -1,9 +1,12 @@
+import pytest
+
 from indy_node.utils.node_control_tool import NodeControlTool
 from plenum.test.helper import randomText
 from indy_node.utils.node_control_utils import NodeControlUtil, MAX_DEPS_DEPTH
 
 
-def testNodeControlResolvesDependencies(monkeypatch, tconf):
+@pytest.mark.upgrade
+def test_node_control_resolves_dependencies(monkeypatch, tconf):
     nct = NodeControlTool(config=tconf)
     node_package = ('indy-node', '0.0.1')
     plenum_package = ('indy-plenum', '0.0.3')
@@ -31,6 +34,7 @@ def mock_get_info_from_package_manager(*package):
                                           node_package_with_version])
 
 
+@pytest.mark.upgrade
 def test_create_deps_for_exotic_version_style():
     depends = ['package1', 'package2']
     versions = ['1.6.74', '0.9.4~+.-AbCd1.2.3.4.EiF']
@@ -69,6 +73,7 @@ def mock_info_from_package_manager(*package):
     assert any(["{}={}".format(depends[1], versions[1]) in l for l in ret[1][0]])
 
 
+@pytest.mark.upgrade
 def test_max_depth_for_deps_tree():
     depends = ['package1', 'package2']
     def mock_info_from_package_manager(*package):
diff --git a/indy_node/test/upgrade/test_node_control_tool_restores_from_backups.py b/indy_node/test/upgrade/test_node_control_tool_restores_from_backups.py
index ac608e781..6a851e386 100644
--- a/indy_node/test/upgrade/test_node_control_tool_restores_from_backups.py
+++ b/indy_node/test/upgrade/test_node_control_tool_restores_from_backups.py
@@ -5,6 +5,7 @@
 
 import time
 
+import pytest
 from stp_core.loop.eventually import eventually
 from indy_common.version import src_version_cls
 from indy_node.server.upgrader import Upgrader
@@ -22,7 +23,8 @@
 whitelist = ['Unexpected error in _upgrade test']
 
 
-def testNodeControlRestoresFromBackups(monkeypatch, tdir, looper, tconf):
+@pytest.mark.upgrade
+def test_node_control_restores_from_backups(monkeypatch, tdir, looper, tconf):
     version = bumpedVersion()
     stdout = 'teststdout'
     backupWasRestored = m.Value('b', False)
diff --git a/indy_node/test/upgrade/test_node_does_not_reschedule_canceled_upgrade.py b/indy_node/test/upgrade/test_node_does_not_reschedule_canceled_upgrade.py
index 3edae425b..bae14b049 100644
--- a/indy_node/test/upgrade/test_node_does_not_reschedule_canceled_upgrade.py
+++ b/indy_node/test/upgrade/test_node_does_not_reschedule_canceled_upgrade.py
@@ -1,5 +1,7 @@
 from copy import deepcopy
 
+import pytest
+
 from indy_common.constants import ACTION, CANCEL, SCHEDULE
 from indy_node.test import waits
 from indy_node.test.upgrade.helper import checkNoUpgradeScheduled, \
@@ -9,6 +11,7 @@
 from indy_common.config_helper import NodeConfigHelper
 
 
+@pytest.mark.upgrade
 def test_node_does_not_reschedule_cancelled_upgrade_after_restart(
         upgradeScheduled, looper, nodeSet, validUpgrade,
         testNodeClass, tdir, tconf, allPluginsPath,
diff --git a/indy_node/test/upgrade/test_node_handles_forced_upgrade_on_client_request.py b/indy_node/test/upgrade/test_node_handles_forced_upgrade_on_client_request.py
index 2198ac310..edb5c0cab 100644
--- a/indy_node/test/upgrade/test_node_handles_forced_upgrade_on_client_request.py
+++ b/indy_node/test/upgrade/test_node_handles_forced_upgrade_on_client_request.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_node.test import waits
 from indy_node.test.upgrade.helper import checkUpgradeScheduled, \
     sdk_send_upgrade
@@ -7,6 +9,7 @@
 from stp_core.loop.eventually import eventually
 
 
+@pytest.mark.upgrade
 def test_node_handles_forced_upgrade_on_client_request(
         looper, nodeSet, sdk_pool_handle, sdk_wallet_trustee,
         validUpgradeExpForceTrue):
diff --git a/indy_node/test/upgrade/test_node_handles_forced_upgrade_on_propagate.py b/indy_node/test/upgrade/test_node_handles_forced_upgrade_on_propagate.py
index a0d6c8c55..8e93ca3b6 100644
--- a/indy_node/test/upgrade/test_node_handles_forced_upgrade_on_propagate.py
+++ b/indy_node/test/upgrade/test_node_handles_forced_upgrade_on_propagate.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_node.test import waits
 from indy_node.test.upgrade.helper import checkUpgradeScheduled, \
     sdk_send_upgrade
@@ -7,6 +9,7 @@
 from stp_core.loop.eventually import eventually
 
 
+@pytest.mark.upgrade
 def test_node_handles_forced_upgrade_on_propagate(
         looper, nodeSet, sdk_pool_handle, sdk_wallet_trustee,
         validUpgradeExpForceTrue):
diff --git a/indy_node/test/upgrade/test_node_reschedules_upgrade_for_proper_datetime.py b/indy_node/test/upgrade/test_node_reschedules_upgrade_for_proper_datetime.py
index 2b102e8a2..7b4715395 100644
--- a/indy_node/test/upgrade/test_node_reschedules_upgrade_for_proper_datetime.py
+++ b/indy_node/test/upgrade/test_node_reschedules_upgrade_for_proper_datetime.py
@@ -3,6 +3,8 @@
 import dateutil
 from datetime import timedelta
 
+import pytest
+
 from indy_common.constants import SHA256, SCHEDULE
 from indy_node.test import waits
 from indy_node.test.upgrade.helper import bumpVersion, checkUpgradeScheduled, \
@@ -12,6 +14,7 @@
 from stp_core.loop.eventually import eventually
 
 
+@pytest.mark.upgrade
 def test_node_reschedules_upgrade_for_proper_datetime(
         looper, tconf, nodeSet, validUpgrade,
         sdk_pool_handle, sdk_wallet_trustee):
diff --git a/indy_node/test/upgrade/test_node_schedules_upgrade.py b/indy_node/test/upgrade/test_node_schedules_upgrade.py
index abc384f80..bcd29d153 100644
--- a/indy_node/test/upgrade/test_node_schedules_upgrade.py
+++ b/indy_node/test/upgrade/test_node_schedules_upgrade.py
@@ -1,2 +1,6 @@
+import pytest
+
+
+@pytest.mark.upgrade
 def test_node_schedules_upgrade(upgradeScheduled):
     pass
diff --git a/indy_node/test/upgrade/test_node_schedules_upgrade_after_pool_ledger_update.py b/indy_node/test/upgrade/test_node_schedules_upgrade_after_pool_ledger_update.py
index 3d4499ecc..58ccff2ab 100644
--- a/indy_node/test/upgrade/test_node_schedules_upgrade_after_pool_ledger_update.py
+++ b/indy_node/test/upgrade/test_node_schedules_upgrade_after_pool_ledger_update.py
@@ -14,6 +14,7 @@ def update_bls_keys(looper, tconf, nodeSet, sdk_pool_handle,
     check_bls_key(new_blspk, node, nodeSet)
 
 
+@pytest.mark.upgrade
 def test_node_schedules_upgrade_after_bls_keys_update(update_bls_keys,
                                                       upgradeScheduled):
     # Upgrade should work even after an update to the pool ledger with a
diff --git a/indy_node/test/upgrade/test_node_schedules_upgrade_after_restart.py b/indy_node/test/upgrade/test_node_schedules_upgrade_after_restart.py
index 2cbb6b20b..0e4dce066 100644
--- a/indy_node/test/upgrade/test_node_schedules_upgrade_after_restart.py
+++ b/indy_node/test/upgrade/test_node_schedules_upgrade_after_restart.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_node.test import waits
 from indy_node.test.upgrade.helper import checkUpgradeScheduled
 from plenum.common.constants import VERSION
@@ -6,6 +8,7 @@
 from indy_common.config_helper import NodeConfigHelper
 
 
+@pytest.mark.upgrade
 def testNodeSchedulesUpgradeAfterRestart(upgradeScheduled, looper, nodeSet,
                                          validUpgrade, testNodeClass,
                                          tdir, tconf, allPluginsPath):
diff --git a/indy_node/test/upgrade/test_node_schedules_upgrade_exp_force_false.py b/indy_node/test/upgrade/test_node_schedules_upgrade_exp_force_false.py
index 8155b9394..73c8e6473 100644
--- a/indy_node/test/upgrade/test_node_schedules_upgrade_exp_force_false.py
+++ b/indy_node/test/upgrade/test_node_schedules_upgrade_exp_force_false.py
@@ -1,2 +1,6 @@
+import pytest
+
+
+@pytest.mark.upgrade
 def test_node_schedules_upgrade_exp_force_false(upgradeScheduledExpForceFalse):
     pass
diff --git a/indy_node/test/upgrade/test_node_schedules_upgrade_exp_force_true.py b/indy_node/test/upgrade/test_node_schedules_upgrade_exp_force_true.py
index e588d139b..bc0ebca7e 100644
--- a/indy_node/test/upgrade/test_node_schedules_upgrade_exp_force_true.py
+++ b/indy_node/test/upgrade/test_node_schedules_upgrade_exp_force_true.py
@@ -1,2 +1,6 @@
+import pytest
+
+
+@pytest.mark.upgrade
 def test_node_schedules_upgrade_exp_force_true(upgradeScheduledExpForceTrue):
     pass
diff --git a/indy_node/test/upgrade/test_node_schedules_upgrade_for_proper_datetime.py b/indy_node/test/upgrade/test_node_schedules_upgrade_for_proper_datetime.py
index 1bbd0e21e..721edd6af 100644
--- a/indy_node/test/upgrade/test_node_schedules_upgrade_for_proper_datetime.py
+++ b/indy_node/test/upgrade/test_node_schedules_upgrade_for_proper_datetime.py
@@ -3,6 +3,8 @@
 import dateutil
 from datetime import timedelta
 
+import pytest
+
 from indy_common.constants import SCHEDULE
 from indy_node.test import waits
 from indy_node.test.upgrade.helper import checkUpgradeScheduled, \
@@ -11,6 +13,7 @@
 from stp_core.loop.eventually import eventually
 
 
+@pytest.mark.upgrade
 def test_node_schedules_upgrade_for_proper_datetime(
         looper, tconf, nodeSet, validUpgrade, sdk_pool_handle, sdk_wallet_trustee):
     upgr1 = deepcopy(validUpgrade)
diff --git a/indy_node/test/upgrade/test_node_sustain_invalid_upgrade_txn.py b/indy_node/test/upgrade/test_node_sustain_invalid_upgrade_txn.py
index 5a8dc3dda..9fb56c5c9 100644
--- a/indy_node/test/upgrade/test_node_sustain_invalid_upgrade_txn.py
+++ b/indy_node/test/upgrade/test_node_sustain_invalid_upgrade_txn.py
@@ -12,6 +12,7 @@ def pckg(request):
     return EXT_PKT_NAME, EXT_PKT_VERSION
 
 
+@pytest.mark.upgrade
 def test_forced_request_validation(looper, txnPoolNodeSet,
                                    sdk_pool_handle, sdk_wallet_steward,
                                    sdk_wallet_trustee, validUpgradeExpForceTrue):
diff --git a/indy_node/test/upgrade/test_node_upgrade.py b/indy_node/test/upgrade/test_node_upgrade.py
index 744537ac1..40c390451 100644
--- a/indy_node/test/upgrade/test_node_upgrade.py
+++ b/indy_node/test/upgrade/test_node_upgrade.py
@@ -27,6 +27,7 @@ def tdirWithPoolTxns(tdirWithPoolTxns, poolTxnNodeNames, tdir, tconf):
     return tdirWithPoolTxns
 
 
+@pytest.mark.upgrade
 def test_node_detected_upgrade_done(nodeSet):
     '''
     Test that each node checks Upgrade Log on startup (after Upgrade restart), and writes SUCCESS to it
@@ -38,6 +39,7 @@ def test_node_detected_upgrade_done(nodeSet):
         assert node.upgrader.lastActionEventInfo.ev_type == UpgradeLog.Events.succeeded
 
 
+@pytest.mark.upgrade
 def test_node_sent_upgrade_successful(looper, nodeSet, nodeIds):
     '''
     Test that each node sends NODE_UPGRADE Success event (because it sees SUCCESS in Upgrade log)
@@ -49,6 +51,7 @@ def test_node_sent_upgrade_successful(looper, nodeSet, nodeIds):
                                          expected_version=version)
 
 
+@pytest.mark.upgrade
 def test_node_sent_upgrade_successful_once_view_change(looper, nodeSet, nodeIds):
     '''
     Test that each node sends NODE_UPGRADE Success event only once after each view change
@@ -66,6 +69,7 @@ def test_node_sent_upgrade_successful_once_view_change(looper, nodeSet, nodeIds)
                                                 expected_version=version)
 
 
+@pytest.mark.upgrade
 def test_node_sent_upgrade_successful_once_restart(looper, nodeSet, nodeIds):
     '''
     Test that each node sends NODE_UPGRADE Success event only once after restart,
diff --git a/indy_node/test/upgrade/test_node_upgrade_in_progress.py b/indy_node/test/upgrade/test_node_upgrade_in_progress.py
index 41328bbc2..9fcb67c3a 100644
--- a/indy_node/test/upgrade/test_node_upgrade_in_progress.py
+++ b/indy_node/test/upgrade/test_node_upgrade_in_progress.py
@@ -1,4 +1,5 @@
 import dateutil.parser
+import pytest
 
 from indy_common.constants import IN_PROGRESS
 from indy_node.server.upgrade_log import UpgradeLogData
@@ -8,6 +9,7 @@
 whitelist = ['unable to send message']
 
 
+@pytest.mark.upgrade
 def test_node_sent_upgrade_in_progress(looper, nodeSet, nodeIds, validUpgrade):
     '''
     Test that each node sends NODE_UPGRADE In Progress event
diff --git a/indy_node/test/upgrade/test_node_upgrade_rescheduled_view_change.py b/indy_node/test/upgrade/test_node_upgrade_rescheduled_view_change.py
index 99010bb28..99e94b65d 100644
--- a/indy_node/test/upgrade/test_node_upgrade_rescheduled_view_change.py
+++ b/indy_node/test/upgrade/test_node_upgrade_rescheduled_view_change.py
@@ -1,4 +1,5 @@
 import dateutil
+import pytest
 
 from indy_common.constants import APP_NAME
 from indy_node.server.upgrade_log import UpgradeLogData, UpgradeLog
@@ -10,6 +11,7 @@
 # TODO: Implement a client in node
 
 
+@pytest.mark.upgrade
 def test_scheduled_once_after_view_change(nodeSet, validUpgrade, upgradeScheduled):
     '''
     Test that each node schedules update only once after each view change
diff --git a/indy_node/test/upgrade/test_node_upgrade_unsuccessful.py b/indy_node/test/upgrade/test_node_upgrade_unsuccessful.py
index 1dbd81a7f..360c93a56 100644
--- a/indy_node/test/upgrade/test_node_upgrade_unsuccessful.py
+++ b/indy_node/test/upgrade/test_node_upgrade_unsuccessful.py
@@ -24,6 +24,7 @@ def tdirWithPoolTxns(tdirWithPoolTxns, poolTxnNodeNames, tdir, tconf):
     return tdirWithPoolTxns
 
 
+@pytest.mark.upgrade
 def test_node_detected_upgrade_failed(nodeSet):
     '''
     Test that each node checks Upgrade Log on startup (after Upgrade restart), and writes FAIL to it
@@ -35,6 +36,7 @@ def test_node_detected_upgrade_failed(nodeSet):
         assert node.upgrader.lastActionEventInfo.ev_type == UpgradeLog.Events.failed
 
 
+@pytest.mark.upgrade
 def test_node_sent_upgrade_fail(looper, nodeSet, nodeIds):
     '''
     Test that each node sends NODE_UPGRADE Fail event (because it sees FAIL in Upgrade log)
@@ -46,6 +48,7 @@ def test_node_sent_upgrade_fail(looper, nodeSet, nodeIds):
                                          expected_version=INVALID_VERSION)
 
 
+@pytest.mark.upgrade
 def test_node_sent_upgrade_unsuccessful_once(looper, nodeSet, nodeIds):
     '''
     Test that each node sends NODE_UPGRADE Fail event only once,
diff --git a/indy_node/test/upgrade/test_pool_upgrade_cancel.py b/indy_node/test/upgrade/test_pool_upgrade_cancel.py
index 24a5d1ccd..94cd2fc2c 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_cancel.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_cancel.py
@@ -1,5 +1,7 @@
 from copy import deepcopy
 
+import pytest
+
 from indy_common.constants import CANCEL, \
     ACTION, SCHEDULE, JUSTIFICATION
 from indy_node.test import waits
@@ -9,7 +11,8 @@
 whitelist = ['Failed to upgrade node']
 
 
-def testTrustyCancelsUpgrade(validUpgradeSent, looper, nodeSet, sdk_pool_handle,
+@pytest.mark.upgrade
+def test_trusty_cancels_upgrade(validUpgradeSent, looper, nodeSet, sdk_pool_handle,
                              sdk_wallet_trustee, validUpgrade):
     validUpgradeCopy = deepcopy(validUpgrade)
     validUpgradeCopy[ACTION] = CANCEL
diff --git a/indy_node/test/upgrade/test_pool_upgrade_force_scheduled_only_once.py b/indy_node/test/upgrade/test_pool_upgrade_force_scheduled_only_once.py
index 3bafa1f55..68c9e7fb3 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_force_scheduled_only_once.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_force_scheduled_only_once.py
@@ -1,7 +1,10 @@
+import pytest
+
 from indy_node.server.upgrade_log import UpgradeLog
 from indy_node.test.upgrade.helper import count_action_log_package
 
 
+@pytest.mark.upgrade
 def test_pool_upgrade_force_scheduled_only_once(validUpgradeExpForceTrue, upgradeScheduledExpForceTrue, nodeSet):
     for node in nodeSet:
         assert count_action_log_package(list(node.upgrader._actionLog), validUpgradeExpForceTrue['package']) == 1
diff --git a/indy_node/test/upgrade/test_pool_upgrade_no_loop.py b/indy_node/test/upgrade/test_pool_upgrade_no_loop.py
index 6752b977d..b68331c7c 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_no_loop.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_no_loop.py
@@ -1,5 +1,7 @@
 from copy import deepcopy
 
+import pytest
+
 from indy_node.test import waits
 from stp_core.loop.eventually import eventually
 from plenum.common.constants import VERSION
@@ -9,6 +11,8 @@
 from indy_node.server.upgrade_log import UpgradeLog
 from indy_node.utils.node_control_utils import NodeControlUtil
 
+
+@pytest.mark.upgrade
 def test_upgrade_does_not_get_into_loop(looper, tconf, nodeSet,
                                         validUpgrade, sdk_pool_handle,
                                         sdk_wallet_trustee, monkeypatch):
diff --git a/indy_node/test/upgrade/test_pool_upgrade_no_loop_force.py b/indy_node/test/upgrade/test_pool_upgrade_no_loop_force.py
index 69708611a..6bfe08764 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_no_loop_force.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_no_loop_force.py
@@ -1,5 +1,7 @@
 from copy import deepcopy
 
+import pytest
+
 from indy_node.test import waits
 from stp_core.loop.eventually import eventually
 from plenum.common.constants import VERSION
@@ -13,6 +15,7 @@
 whitelist = ['Failed to upgrade node']
 
 
+@pytest.mark.upgrade
 def test_upgrade_does_not_get_into_loop_force(looper, tconf, nodeSet,
                                               validUpgrade, sdk_pool_handle,
                                               sdk_wallet_trustee, monkeypatch):
diff --git a/indy_node/test/upgrade/test_pool_upgrade_no_loop_force_unsuccessful.py b/indy_node/test/upgrade/test_pool_upgrade_no_loop_force_unsuccessful.py
index 5eca225ab..7646b5f05 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_no_loop_force_unsuccessful.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_no_loop_force_unsuccessful.py
@@ -1,5 +1,7 @@
 from copy import deepcopy
 
+import pytest
+
 from indy_node.test import waits
 from stp_core.loop.eventually import eventually
 from plenum.common.constants import VERSION
@@ -14,6 +16,7 @@
              'This problem may have external reasons, check syslog for more information']
 
 
+@pytest.mark.upgrade
 def test_upgrade_does_not_get_into_loop_force_if_failed(
         looper, tconf, nodeSet, validUpgrade, sdk_pool_handle,
         sdk_wallet_trustee, monkeypatch):
diff --git a/indy_node/test/upgrade/test_pool_upgrade_no_loop_reinstall.py b/indy_node/test/upgrade/test_pool_upgrade_no_loop_reinstall.py
index d968ef9f1..8c6a0fd7f 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_no_loop_reinstall.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_no_loop_reinstall.py
@@ -1,5 +1,7 @@
 from copy import deepcopy
 
+import pytest
+
 from indy_node.test import waits
 from stp_core.loop.eventually import eventually
 from plenum.common.constants import VERSION
@@ -11,6 +13,7 @@
 from indy_node.utils.node_control_utils import NodeControlUtil
 
 
+@pytest.mark.upgrade
 def test_upgrade_does_not_get_into_loop_if_reinstall(
         looper,
         tconf,
diff --git a/indy_node/test/upgrade/test_pool_upgrade_no_loop_reinstall_unsuccessful.py b/indy_node/test/upgrade/test_pool_upgrade_no_loop_reinstall_unsuccessful.py
index de42e706b..ca257279d 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_no_loop_reinstall_unsuccessful.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_no_loop_reinstall_unsuccessful.py
@@ -1,5 +1,7 @@
 from copy import deepcopy
 
+import pytest
+
 from indy_node.test import waits
 from stp_core.loop.eventually import eventually
 from plenum.common.constants import VERSION
@@ -14,6 +16,7 @@
              'This problem may have external reasons, check syslog for more information']
 
 
+@pytest.mark.upgrade
 def test_upgrade_does_not_get_into_loop_if_reinstall_and_failed(
         looper, tconf, nodeSet, validUpgrade, sdk_pool_handle, sdk_wallet_trustee, monkeypatch):
     new_version = bumpedVersion(validUpgrade['version'])
diff --git a/indy_node/test/upgrade/test_pool_upgrade_no_loop_unsuccessful.py b/indy_node/test/upgrade/test_pool_upgrade_no_loop_unsuccessful.py
index e1634e609..89d3eadaa 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_no_loop_unsuccessful.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_no_loop_unsuccessful.py
@@ -1,5 +1,7 @@
 from copy import deepcopy
 
+import pytest
+
 from indy_node.test import waits
 from stp_core.loop.eventually import eventually
 from plenum.common.constants import VERSION
@@ -13,6 +15,7 @@
              'This problem may have external reasons, check syslog for more information']
 
 
+@pytest.mark.upgrade
 def test_upgrade_does_not_get_into_loop_if_failed(looper, tconf, nodeSet,
                                                   validUpgrade, sdk_pool_handle,
                                                   sdk_wallet_trustee, monkeypatch):
diff --git a/indy_node/test/upgrade/test_pool_upgrade_reject.py b/indy_node/test/upgrade/test_pool_upgrade_reject.py
index 29551a8c9..193d733cd 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_reject.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_reject.py
@@ -1,5 +1,6 @@
 from copy import deepcopy
 
+import pytest
 from plenum.common.constants import NAME, VERSION, STEWARD_STRING
 from plenum.common.exceptions import RequestNackedException, RequestRejectedException
 from indy_common.constants import CANCEL, \
@@ -10,13 +11,15 @@
 whitelist = ['Failed to upgrade node']
 
 
-def testNodeRejectsPoolUpgrade(looper, nodeSet, tdir, sdk_pool_handle,
+@pytest.mark.upgrade
+def test_node_rejects_pool_upgrade(looper, nodeSet, tdir, sdk_pool_handle,
                                sdk_wallet_trustee, invalidUpgrade):
     req = sdk_send_upgrade(looper, sdk_pool_handle, sdk_wallet_trustee, invalidUpgrade)
     sdk_get_bad_response(looper, [req], RequestNackedException, 'since time span between upgrades')
 
 
-def testOnlyTrusteeCanSendPoolUpgrade(looper, sdk_pool_handle, sdk_wallet_steward, validUpgrade):
+@pytest.mark.upgrade
+def test_only_trustee_can_send_pool_upgrade(looper, sdk_pool_handle, sdk_wallet_steward, validUpgrade):
     # A steward sending POOL_UPGRADE but txn fails
     validUpgrade = deepcopy(validUpgrade)
     validUpgrade[NAME] = 'upgrade-20'
@@ -25,7 +28,8 @@ def testOnlyTrusteeCanSendPoolUpgrade(looper, sdk_pool_handle, sdk_wallet_stewar
     sdk_get_bad_response(looper, [req], RequestRejectedException, 'Not enough TRUSTEE signatures')
 
 
-def testNonTrustyCannotCancelUpgrade(looper, validUpgradeSent, sdk_pool_handle,
+@pytest.mark.upgrade
+def test_non_trusty_cannot_cancel_upgrade(looper, validUpgradeSent, sdk_pool_handle,
                                      sdk_wallet_steward, validUpgrade):
     validUpgradeCopy = deepcopy(validUpgrade)
     validUpgradeCopy[ACTION] = CANCEL
@@ -33,6 +37,7 @@ def testNonTrustyCannotCancelUpgrade(looper, validUpgradeSent, sdk_pool_handle,
     sdk_get_bad_response(looper, [req], RequestRejectedException, 'Not enough TRUSTEE signatures')
 
 
+@pytest.mark.upgrade
 def test_accept_then_reject_upgrade(
         looper, sdk_pool_handle, sdk_wallet_trustee, validUpgradeSent, validUpgrade):
     upgrade_name = validUpgrade[NAME]
@@ -44,7 +49,8 @@ def test_accept_then_reject_upgrade(
     sdk_get_bad_response(looper, [req], RequestRejectedException, error_msg)
 
 
-def testOnlyTrusteeCanSendPoolUpgradeForceTrue(
+@pytest.mark.upgrade
+def test_only_trustee_can_send_pool_upgrade_force_true(
         looper, sdk_pool_handle, sdk_wallet_steward, validUpgradeExpForceTrue):
     req = sdk_send_upgrade(looper, sdk_pool_handle, sdk_wallet_steward, validUpgradeExpForceTrue)
     sdk_get_bad_response(looper, [req], RequestNackedException, 'Not enough TRUSTEE signatures')
diff --git a/indy_node/test/upgrade/test_pool_upgrade_same_time_different_days.py b/indy_node/test/upgrade/test_pool_upgrade_same_time_different_days.py
index 955779edf..654a27696 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_same_time_different_days.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_same_time_different_days.py
@@ -4,10 +4,12 @@
 
 import dateutil
 import dateutil.tz
+import pytest
 
 from indy_node.test.upgrade.helper import sdk_ensure_upgrade_sent
 
 
+@pytest.mark.upgrade
 def test_pool_upgrade_same_time_different_days(looper, tconf, nodeSet,
                                                validUpgrade, sdk_pool_handle,
                                                sdk_wallet_trustee, nodeIds):
diff --git a/indy_node/test/upgrade/test_pool_upgrade_same_version.py b/indy_node/test/upgrade/test_pool_upgrade_same_version.py
index abb2cbc04..b5e0b39f8 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_same_version.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_same_version.py
@@ -8,6 +8,7 @@
 from indy_node.test.upgrade.helper import sdk_ensure_upgrade_sent, lowerVersion
 
 
+@pytest.mark.upgrade
 def test_do_not_upgrade_to_the_same_version(looper, tconf, nodeSet,
                                             validUpgrade, sdk_pool_handle,
                                             sdk_wallet_trustee):
diff --git a/indy_node/test/upgrade/test_pool_upgrade_same_version_reinstall.py b/indy_node/test/upgrade/test_pool_upgrade_same_version_reinstall.py
index f6acff65e..dba89be65 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_same_version_reinstall.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_same_version_reinstall.py
@@ -1,5 +1,7 @@
 from copy import deepcopy
 
+import pytest
+
 from indy_node.test import waits
 from stp_core.loop.eventually import eventually
 from plenum.common.constants import VERSION
@@ -9,6 +11,7 @@
 from indy_common.constants import REINSTALL
 
 
+@pytest.mark.upgrade
 def test_do_upgrade_to_the_same_version_if_reinstall(looper, tconf, nodeSet,
                                                      validUpgrade, sdk_pool_handle,
                                                      sdk_wallet_trustee):
diff --git a/indy_node/test/upgrade/test_pool_upgrade_through_catchup.py b/indy_node/test/upgrade/test_pool_upgrade_through_catchup.py
index 03e958f92..ab12327de 100644
--- a/indy_node/test/upgrade/test_pool_upgrade_through_catchup.py
+++ b/indy_node/test/upgrade/test_pool_upgrade_through_catchup.py
@@ -24,7 +24,7 @@ def txnPoolNodeSet(tconf, nodeSet):
 
 
 @pytest.mark.skip(reason='SOV-559')
-def testUpgradeLatestUncancelledVersion(looper,
+def test_upgrade_latest_uncancelled_version(looper,
                                         txnPoolNodeSet, tconf, sdk_node_theta_added,
                                         validUpgrade, sdk_pool_handle, sdk_wallet_trustee,
                                         tdirWithPoolTxns, allPluginsPath):
diff --git a/indy_node/test/upgrade/test_reschedule_upgrade_lower_version.py b/indy_node/test/upgrade/test_reschedule_upgrade_lower_version.py
index 38330f096..8b3840df8 100644
--- a/indy_node/test/upgrade/test_reschedule_upgrade_lower_version.py
+++ b/indy_node/test/upgrade/test_reschedule_upgrade_lower_version.py
@@ -1,5 +1,7 @@
 from copy import deepcopy
 
+import pytest
+
 from indy_common.constants import SHA256
 from indy_node.test import waits
 from indy_node.test.upgrade.helper import bumpVersion, checkUpgradeScheduled, \
@@ -9,7 +11,8 @@
 from stp_core.loop.eventually import eventually
 
 
-def testRescheduleUpgradeToLowerVersionThanPreviouslyScheduled(
+@pytest.mark.upgrade
+def test_reschedule_upgrade_to_lower_version_than_previously_scheduled(
         looper, tconf, nodeSet, validUpgrade, sdk_pool_handle, sdk_wallet_trustee):
     """
     A node starts at version 1.2 running has scheduled upgrade for version 1.5
diff --git a/indy_node/test/upgrade/test_restart_log.py b/indy_node/test/upgrade/test_restart_log.py
index 7388113d7..a23edab43 100644
--- a/indy_node/test/upgrade/test_restart_log.py
+++ b/indy_node/test/upgrade/test_restart_log.py
@@ -12,6 +12,7 @@ def log_file_path(tdir, request):
     )
 
 
+@pytest.mark.upgrade
 def test_restart_log_data_pack_unpack():
     delimiter = '|'
     data = RestartLogData(datetime.datetime.utcnow())
@@ -20,8 +21,8 @@ def test_restart_log_data_pack_unpack():
     )
 
 
-
 # TODO actually it is already well tested in base calss ActionLog
+@pytest.mark.upgrade
 @pytest.mark.parametrize('ev_type', RestartLog.Events)
 def test_restart_log_append_api(log_file_path, ev_type):
     restart_log = RestartLog(log_file_path)
@@ -31,6 +32,7 @@ def test_restart_log_append_api(log_file_path, ev_type):
     assert restart_log.last_event.ev_type == ev_type
 
 
+@pytest.mark.upgrade
 def test_restart_log_loads_legacy_data(monkeypatch, log_file_path):
 
     ev_index = None
diff --git a/indy_node/test/upgrade/test_send_node_upgrade.py b/indy_node/test/upgrade/test_send_node_upgrade.py
index c7510ebc6..a80aedee7 100644
--- a/indy_node/test/upgrade/test_send_node_upgrade.py
+++ b/indy_node/test/upgrade/test_send_node_upgrade.py
@@ -12,6 +12,7 @@
 from plenum.common.types import OPERATION, f
 
 
+@pytest.mark.upgrade
 def test_send_node_upgrade_txn(looper, sdk_wallet_client, sdk_pool_handle):
     req = {
         OPERATION: {
diff --git a/indy_node/test/upgrade/test_upgrade_log.py b/indy_node/test/upgrade/test_upgrade_log.py
index f5263e48c..ca4391ebd 100644
--- a/indy_node/test/upgrade/test_upgrade_log.py
+++ b/indy_node/test/upgrade/test_upgrade_log.py
@@ -25,12 +25,14 @@ def src_version_cls_patched(monkeypatch):
     )
 
 
+@pytest.mark.upgrade
 def test_upgrade_log_data_unpack_invalid_version():
     with pytest.raises(TypeError) as excinfo:
         UpgradeLogData(str(datetime.datetime.utcnow()), 123, 'some_id', 'some_pkg')
     assert "'version' should be 'SourceVersion' or 'str'" in str(excinfo.value)
 
 
+@pytest.mark.upgrade
 def test_upgrade_log_data_pack_unpack():
     delimiter = '|'
     data = UpgradeLogData(datetime.datetime.utcnow(), '1.2.3', 'some_id', 'some_pkg')
@@ -40,6 +42,7 @@ def test_upgrade_log_data_pack_unpack():
 
 
 # TODO actually it is already well tested in base calss ActionLog
+@pytest.mark.upgrade
 @pytest.mark.parametrize('ev_type', UpgradeLog.Events)
 def test_upgrade_log_append_api(log_file_path, ev_type):
     upgrade_log = UpgradeLog(log_file_path)
@@ -49,6 +52,7 @@ def test_upgrade_log_append_api(log_file_path, ev_type):
     assert upgrade_log.last_event.ev_type == ev_type
 
 
+@pytest.mark.upgrade
 def test_upgrade_log_loads_legacy_data(monkeypatch, log_file_path):
 
     ev_index = None
diff --git a/indy_node/test/upgrade/test_upgrade_pool_with_demoted_nodes.py b/indy_node/test/upgrade/test_upgrade_pool_with_demoted_nodes.py
index 37fa7356f..a500e2aa7 100644
--- a/indy_node/test/upgrade/test_upgrade_pool_with_demoted_nodes.py
+++ b/indy_node/test/upgrade/test_upgrade_pool_with_demoted_nodes.py
@@ -1,3 +1,5 @@
+import pytest
+
 from indy_node.test import waits
 from plenum.test.pool_transactions.helper import demote_node
 from stp_core.loop.eventually import eventually
@@ -6,6 +8,7 @@
 from indy_node.test.upgrade.helper import checkUpgradeScheduled, sdk_ensure_upgrade_sent
 
 
+@pytest.mark.upgrade
 def test_update_with_demoted_node(looper, nodeSet, validUpgrade,
                                   sdk_pool_handle, sdk_wallet_stewards,
                                   sdk_wallet_trustee):
diff --git a/indy_node/test/upgrade/test_upgrade_timeout.py b/indy_node/test/upgrade/test_upgrade_timeout.py
index 84470a535..720eaef36 100644
--- a/indy_node/test/upgrade/test_upgrade_timeout.py
+++ b/indy_node/test/upgrade/test_upgrade_timeout.py
@@ -1,5 +1,6 @@
 from datetime import datetime
 
+import pytest
 from stp_core.loop.eventually import eventually
 from indy_node.server.upgrade_log import UpgradeLogData
 from indy_node.server.upgrader import Upgrader
@@ -10,7 +11,8 @@
              'This problem may have external reasons, check syslog for more information']
 
 
-def testTimeoutWorks(nodeSet, looper, monkeypatch, tconf):
+@pytest.mark.upgrade
+def test_timeout_works(nodeSet, looper, monkeypatch, tconf):
     """
     Checks that after some timeout upgrade is marked as failed if
     it not started
diff --git a/indy_node/test/upgrade/test_upgrader.py b/indy_node/test/upgrade/test_upgrader.py
index 52344e9a6..a28900c6e 100644
--- a/indy_node/test/upgrade/test_upgrader.py
+++ b/indy_node/test/upgrade/test_upgrader.py
@@ -62,6 +62,7 @@ def wrapped(*x, **y):
         )
 
 
+@pytest.mark.upgrade
 @pytest.mark.parametrize(
     'lower_version,higher_version',
     [
@@ -88,6 +89,7 @@ def test_versions_comparison(lower_version, higher_version):
     assert not Upgrader.is_version_upgradable(higher_version, lower_version)
 
 
+@pytest.mark.upgrade
 def test_get_src_version_for_app(monkeypatch):
     called = 0
 
@@ -103,41 +105,48 @@ def _f(*args, **kwargs):
     assert called
 
 
+@pytest.mark.upgrade
 @pytest.mark.pkg_info('1:1.2.2-3', [])
 def test_get_src_version_for(monkeypatch):
     assert (Upgrader.get_src_version(some_pkg_name) ==
             src_version_cls(some_pkg_name)('1.2.2'))
 
 
+@pytest.mark.upgrade
 def test_check_upgrade_possible_invalid_target_version():
     assert 'invalid target version' in Upgrader.check_upgrade_possible(
         APP_NAME, '1.2.3.4')
 
 
+@pytest.mark.upgrade
 @pytest.mark.pkg_info(None, [])
 def test_check_upgrade_possible_pkg_not_installed():
     assert ('is not installed' in Upgrader.check_upgrade_possible(
         some_pkg_name, '1.2.3'))
 
 
+@pytest.mark.upgrade
 @pytest.mark.pkg_info('1.2.2', ['pkg1'])
 def test_check_upgrade_possible_invalid_top_level_pkg():
     assert ("doesn't belong to pool" in Upgrader.check_upgrade_possible(
         some_pkg_name, '1.2.3'))
 
 
+@pytest.mark.upgrade
 @pytest.mark.pkg_info('1.2.2', [APP_NAME])
 def test_check_upgrade_possible_not_gt_version():
     assert ("is not upgradable" in Upgrader.check_upgrade_possible(
         some_pkg_name, '1.2.2'))
 
 
+@pytest.mark.upgrade
 @pytest.mark.pkg_info('1.2.2', [APP_NAME])
 def test_check_upgrade_possible_not_ge_version_reinstall():
     assert ("is not upgradable" in Upgrader.check_upgrade_possible(
         some_pkg_name, '1.2.1', reinstall=True))
 
 
+@pytest.mark.upgrade
 @pytest.mark.skip(reason='INDY-2026')
 @pytest.mark.pkg_info('1.2.2', [APP_NAME])
 #@pytest.mark.latest_pkg_ver(None) TODO INDY-2026
@@ -149,6 +158,7 @@ def test_check_upgrade_possible_no_pkg_with_target_version():
     )
 
 
+@pytest.mark.upgrade
 @pytest.mark.pkg_info('1.2.2', [APP_NAME])
 #@pytest.mark.latest_pkg_ver('1.2.3') TODO INDY-2026
 def test_check_upgrade_possible_succeeded():
@@ -158,6 +168,7 @@ def test_check_upgrade_possible_succeeded():
         some_pkg_name, target_ver, reinstall=True)
 
 
+@pytest.mark.upgrade
 @pytest.mark.pkg_info('1.2.2', [], pkg_name=APP_NAME)
 #@pytest.mark.latest_pkg_ver('1.2.3') TODO INDY-2026
 def test_check_upgrade_possible_succeeded_for_app_pkg():
@@ -167,6 +178,7 @@ def test_check_upgrade_possible_succeeded_for_app_pkg():
         APP_NAME, target_ver, reinstall=True)
 
 
+@pytest.mark.upgrade
 @pytest.mark.pkg_info('1.2.2', [APP_NAME])
 #@pytest.mark.latest_pkg_ver('1.2.2') TODO INDY-2026
 def test_check_upgrade_possible_reinstall_succeeded():
@@ -174,6 +186,7 @@ def test_check_upgrade_possible_reinstall_succeeded():
         some_pkg_name, '1.2.2', reinstall=True)
 
 
+@pytest.mark.upgrade
 @pytest.mark.pkg_info('1.2.2', [], pkg_name=APP_NAME)
 #@pytest.mark.latest_pkg_ver('1.2.2') TODO INDY-2026
 def test_check_upgrade_possible_reinstall_succeeded_for_app_pkg():
diff --git a/indy_node/test/upgrade/test_version_parsing.py b/indy_node/test/upgrade/test_version_parsing.py
index 9fead7a00..e574cec71 100644
--- a/indy_node/test/upgrade/test_version_parsing.py
+++ b/indy_node/test/upgrade/test_version_parsing.py
@@ -2,6 +2,7 @@
 from indy_node.utils.node_control_utils import NodeControlUtil
 
 
+@pytest.mark.upgrade
 @pytest.mark.parametrize("vers_str,vers_parsed",
                          [("aa (= 1)", ["aa=1"]), ("aa (= 1), bb", ["aa=1", "bb"]),
                           ("aa (= 1), bb (= 2) | cc (= 3)", ["aa=1", "bb=2", "cc=3"]),
@@ -12,6 +13,7 @@ def test_version_parse(vers_str, vers_parsed):
     assert vers == vers_parsed
 
 
+@pytest.mark.upgrade
 @pytest.mark.parametrize("pkgs,pkgs_dd",
                          [([], []), (["aa=1"], ["aa=1"]), (["aa=1", "aa=1", "aa=2"], ["aa=1"]),
                           (["aa=1", "bb=2", "cc=3"], ["aa=1", "bb=2", "cc=3"]),
diff --git a/indy_node/test/validator_info/test_validator_info.py b/indy_node/test/validator_info/test_validator_info.py
index 863524b4c..354b98fd0 100644
--- a/indy_node/test/validator_info/test_validator_info.py
+++ b/indy_node/test/validator_info/test_validator_info.py
@@ -17,19 +17,23 @@
 INFO_FILENAME = '{}_info.json'.format(TEST_NODE_NAME.lower())
 
 
+@pytest.mark.validator_info
 def test_validator_info_file_schema_is_valid(info):
     assert isinstance(info, dict)
     assert 'config' in info['Node_info']['Metrics']['transaction-count']
 
 
+@pytest.mark.validator_info
 def test_validator_info_file_metrics_count_ledger_field_valid(info):
     assert info['Node_info']['Metrics']['transaction-count']['config'] == 0
 
 
+@pytest.mark.validator_info
 def test_validator_info_bls_key_field_valid(node, info):
     assert info['Node_info']['BLS_key']
 
 
+@pytest.mark.validator_info
 def test_validator_info_ha_fields_valid(node, info):
     assert info['Node_info']['Node_ip']
     assert info['Node_info']['Client_ip']
@@ -37,6 +41,7 @@ def test_validator_info_ha_fields_valid(node, info):
     assert info['Node_info']['Client_port']
 
 
+@pytest.mark.validator_info
 def test_validator_info_file_software_indy_node_valid(info):
     assert info['Software']['indy-node'] == node_pgk_version
 
@@ -49,6 +54,7 @@ def node_with_broken_info_tool(node):
     node._info_tool._node = node_bk
 
 
+@pytest.mark.validator_info
 def test_validator_info_file_handle_fails(node_with_broken_info_tool,
                                           node):
     latest_info = node._info_tool.info
@@ -56,6 +62,7 @@ def test_validator_info_file_handle_fails(node_with_broken_info_tool,
     assert 'Node_info' not in latest_info
 
 
+@pytest.mark.validator_info
 def test_validator_info_file_get_nym(read_txn_and_get_latest_info,
                                      node):
     reset_node_total_read_request_number(node)
@@ -65,6 +72,7 @@ def test_validator_info_file_get_nym(read_txn_and_get_latest_info,
     assert latest_info['Node_info']['Metrics']['average-per-second']['read-transactions'] > 0
 
 
+@pytest.mark.validator_info
 def test_validator_info_file_get_schema(read_txn_and_get_latest_info,
                                         node):
     reset_node_total_read_request_number(node)
@@ -74,6 +82,7 @@ def test_validator_info_file_get_schema(read_txn_and_get_latest_info,
     assert latest_info['Node_info']['Metrics']['average-per-second']['read-transactions'] > 0
 
 
+@pytest.mark.validator_info
 def test_validator_info_file_get_attr(read_txn_and_get_latest_info,
                                       node):
     reset_node_total_read_request_number(node)
@@ -83,6 +92,7 @@ def test_validator_info_file_get_attr(read_txn_and_get_latest_info,
     assert latest_info['Node_info']['Metrics']['average-per-second']['read-transactions'] > 0
 
 
+@pytest.mark.validator_info
 def test_validator_info_file_get_claim_def(read_txn_and_get_latest_info,
                                            node):
     reset_node_total_read_request_number(node)
@@ -179,6 +189,7 @@ def size(self):
         return 100
 
 
+@pytest.mark.validator_info
 def test_validator_info_file_metrics_count_all_ledgers_field_valid(node):
     new_ids = [444, 555, 666, 777]
     for newid in new_ids:
@@ -188,6 +199,7 @@ def test_validator_info_file_metrics_count_all_ledgers_field_valid(node):
     assert has_cnt == len(new_ids) + 4
 
 
+@pytest.mark.validator_info
 def test_validator_info_update_date_field_valid(info):
     assert "Update_time" in info
     import time
diff --git a/indy_node/test/validator_info/test_validator_info_command.py b/indy_node/test/validator_info/test_validator_info_command.py
index 97785d41e..5edf10287 100644
--- a/indy_node/test/validator_info/test_validator_info_command.py
+++ b/indy_node/test/validator_info/test_validator_info_command.py
@@ -11,6 +11,7 @@
     sdk_get_reply, sdk_send_signed_requests, sdk_get_and_check_replies
 
 
+@pytest.mark.validator_info
 def test_validator_info_command(
         sdk_pool_handle, sdk_wallet_trustee, looper):
     req, resp = sdk_get_validator_info(looper,
@@ -19,6 +20,7 @@ def test_validator_info_command(
     _comparison_reply(resp, req)
 
 
+@pytest.mark.validator_info
 def test_fail_validator_info_command(
         sdk_pool_handle, sdk_wallet_client, looper):
     with pytest.raises(RequestRejectedException) as excinfo:
diff --git a/indy_node/test/validator_info/test_validator_info_handler.py b/indy_node/test/validator_info/test_validator_info_handler.py
index 7a02c7b7e..e916eb4ba 100644
--- a/indy_node/test/validator_info/test_validator_info_handler.py
+++ b/indy_node/test/validator_info/test_validator_info_handler.py
@@ -6,6 +6,7 @@
 from plenum.test.helper import sdk_gen_request, sdk_sign_request_objects
 
 
+@pytest.mark.validator_info
 def test_validator_info_handler(monkeypatch,
                                 sdk_wallet_trustee,
                                 txnPoolNodeSet,
diff --git a/indy_node/test/view_change/test_view_change_during_alternating_unstash.py b/indy_node/test/view_change/test_view_change_during_alternating_unstash.py
index 68d5fbf1d..77863dd8f 100644
--- a/indy_node/test/view_change/test_view_change_during_alternating_unstash.py
+++ b/indy_node/test/view_change/test_view_change_during_alternating_unstash.py
@@ -36,6 +36,7 @@ def sdk_wallet_new_steward(looper, sdk_pool_handle, sdk_wallet_trustee):
     return wh, client_did
 
 
+@pytest.mark.view_change
 def test_view_change_during_alternating_unstash(looper, txnPoolNodeSet, sdk_pool_handle,
                                                 sdk_wallet_trustee, sdk_wallet_new_steward, tconf):
     slow_node = txnPoolNodeSet[-1]
diff --git a/indy_node/test/write_permission/test_revocation_write_permission.py b/indy_node/test/write_permission/test_revocation_write_permission.py
index 3c0762d4d..17618c4ec 100644
--- a/indy_node/test/write_permission/test_revocation_write_permission.py
+++ b/indy_node/test/write_permission/test_revocation_write_permission.py
@@ -47,6 +47,7 @@ def create_revoc_reg_entry(looper, txnPoolNodeSet, sdk_pool_handle, build_revoc,
     return rev_entry_req
 
 
+@pytest.mark.write_permission
 def test_client_cant_create_revoc_reg_def(looper,
                                           txnPoolNodeSet,
                                           sdk_wallet_client,
@@ -58,6 +59,7 @@ def test_client_cant_create_revoc_reg_def(looper,
                              claim_def, sdk_wallet_client)
 
 
+@pytest.mark.write_permission
 def test_allowed_roles_can_create_revoc_reg_def(looper,
                                                 txnPoolNodeSet,
                                                 sdk_wallet_trustee,
@@ -77,6 +79,7 @@ def test_allowed_roles_can_create_revoc_reg_def(looper,
                          claim_def, sdk_wallet_trustee)
 
 
+@pytest.mark.write_permission
 def test_allowed_roles_can_send_revoc_reg_entry(looper,
                                                 txnPoolNodeSet,
                                                 sdk_wallet_trustee,
@@ -99,6 +102,7 @@ def test_allowed_roles_can_send_revoc_reg_entry(looper,
                          build_revoc_def_by_default, claim_def, sdk_wallet_trustee)
 
 
+@pytest.mark.write_permission
 def test_client_not_owner_cant_create_revoc_reg_entry(looper,
                                                       txnPoolNodeSet,
                                                       sdk_wallet_trustee,
@@ -117,6 +121,7 @@ def test_client_not_owner_cant_create_revoc_reg_entry(looper,
         sdk_send_and_check([json.dumps(rev_entry_req_client)], looper, txnPoolNodeSet, sdk_pool_handle)
 
 
+@pytest.mark.write_permission
 def test_endorser_not_owner_cant_create_revoc_reg_entry(looper,
                                                             txnPoolNodeSet,
                                                             sdk_wallet_trustee,
@@ -135,6 +140,7 @@ def test_endorser_not_owner_cant_create_revoc_reg_entry(looper,
         sdk_send_and_check([json.dumps(rev_entry_req_endorser)], looper, txnPoolNodeSet, sdk_pool_handle)
 
 
+@pytest.mark.write_permission
 def test_trustee_not_owner_cant_create_revoc_reg_entry(looper,
                                                        txnPoolNodeSet,
                                                        sdk_wallet_trustee,
@@ -154,6 +160,7 @@ def test_trustee_not_owner_cant_create_revoc_reg_entry(looper,
         sdk_send_and_check([json.dumps(rev_entry_req_trustee)], looper, txnPoolNodeSet, sdk_pool_handle)
 
 
+@pytest.mark.write_permission
 def test_allowed_roles_can_edit_revoc_reg_entry(looper,
                                                 txnPoolNodeSet,
                                                 sdk_wallet_endorser,
@@ -206,6 +213,7 @@ def test_allowed_roles_can_edit_revoc_reg_entry(looper,
     sdk_send_and_check([json.dumps(revoc_entry_req_steward)], looper, txnPoolNodeSet, sdk_pool_handle)
 
 
+@pytest.mark.write_permission
 def test_not_owner_trustee_cant_edit_revoc_reg_entry(looper,
                                                      txnPoolNodeSet,
                                                      sdk_wallet_trustee,
@@ -227,6 +235,7 @@ def test_not_owner_trustee_cant_edit_revoc_reg_entry(looper,
         sdk_send_and_check([json.dumps(revoc_entry_req_steward)], looper, txnPoolNodeSet, sdk_pool_handle)
 
 
+@pytest.mark.write_permission
 def test_not_owner_steward_cant_edit_revoc_reg_entry(looper,
                                                      txnPoolNodeSet,
                                                      sdk_wallet_steward,
@@ -248,6 +257,7 @@ def test_not_owner_steward_cant_edit_revoc_reg_entry(looper,
         sdk_send_and_check([json.dumps(revoc_entry_req_steward)], looper, txnPoolNodeSet, sdk_pool_handle)
 
 
+@pytest.mark.write_permission
 def test_not_owner_endorser_cant_edit_revoc_reg_entry(looper,
                                                           txnPoolNodeSet,
                                                           sdk_wallet_steward,
diff --git a/indy_node/test/write_permission/test_send_write_permission_no_client.py b/indy_node/test/write_permission/test_send_write_permission_no_client.py
index 4e191bf83..a9fede92a 100644
--- a/indy_node/test/write_permission/test_send_write_permission_no_client.py
+++ b/indy_node/test/write_permission/test_send_write_permission_no_client.py
@@ -18,6 +18,7 @@
 from indy.ledger import build_schema_request
 
 
+@pytest.mark.write_permission
 def test_client_cant_send_nym(looper,
                               txnPoolNodeSet,
                               sdk_wallet_client,
@@ -32,6 +33,7 @@ def test_client_cant_send_nym(looper,
     e.match('Rule for this action is')
 
 
+@pytest.mark.write_permission
 def test_client_can_send_attrib(looper,
                                 sdk_wallet_client,
                                 sdk_wallet_endorser,
@@ -50,6 +52,7 @@ def test_client_can_send_attrib(looper,
     assert e.match('can not touch raw field since only the owner can modify it')
 
 
+@pytest.mark.write_permission
 def test_client_cant_send_schema(looper,
                                  txnPoolNodeSet,
                                  sdk_wallet_client,
@@ -71,6 +74,7 @@ def test_client_cant_send_schema(looper,
                          RequestRejectedException, 'Rule for this action is')
 
 
+@pytest.mark.write_permission
 def test_client_cant_send_claim_def(looper,
                                     txnPoolNodeSet,
                                     sdk_wallet_client,
diff --git a/scripts/pytest_mark_check.py b/scripts/pytest_mark_check.py
new file mode 100644
index 000000000..80a84f00b
--- /dev/null
+++ b/scripts/pytest_mark_check.py
@@ -0,0 +1,70 @@
+import ast
+import json
+import os
+import sys
+
+
+def check_for_decorator(filename, m):
+    with open(filename, "r") as source:
+        tree = ast.parse(source.read())
+        fails = []
+        for node in ast.walk(tree):
+            if isinstance(node, ast.FunctionDef) and node.name.startswith('test_'):
+                valid_decorator = False
+                for d in node.decorator_list:
+                    if has_valid_pytest_mark_decorator(d):
+                        valid_decorator = True
+                        if isinstance(d, ast.Attribute):
+                            m.add(d.attr)
+                        break
+
+                if not valid_decorator:
+                    fails.append('{0} {1}:{2} missing @pytest.mark decorator'.format(filename, node.name, node.lineno))
+
+        if len(fails) > 0:
+            return fails
+
+
+def flatten_list(in_list):
+    flat_list = []
+    for element in in_list:
+        if type(element) is list:
+            for item in element:
+                flat_list.append(item)
+        else:
+            flat_list.append(element)
+    return flat_list
+
+
+# the decorator is nested and we need to unpack it to see if the origin is pytest
+# The format is <ast.Name.id>.<ast.Attribute.attr>.<ast.Attribute.attr>
+#                      pytest.                mark.             example
+# we start from the right side and move on 2
+def has_valid_pytest_mark_decorator(d):
+    return (isinstance(d, ast.Attribute) and isinstance(d.value,
+                                                        ast.Attribute) and d.value.attr == 'mark' and isinstance(
+        d.value.value, ast.Name)) or (isinstance(d, ast.Call) and d.func.attr == 'skip')
+
+
+if __name__ == "__main__":
+    errs = []
+    matrix = set()
+    for (root, dirs, files) in os.walk('{0}/test'.format(sys.argv[1]), topdown=True):
+        path = root.split(os.sep)
+
+        if os.path.basename(root) not in {'__pycache__'}:
+            for file in files:
+                if file.startswith('test_'):
+                    res = check_for_decorator(root + os.sep + file, matrix)
+                    if res is not None:
+                        errs.append(res)
+
+    out = {}
+    if len(errs) > 0:
+        out['status'] = "failed"
+        out['errors'] = flatten_list(errs)
+    else:
+        out['status'] = "success"
+        out['module'] = list(matrix)
+
+    print(json.dumps(out))
diff --git a/scripts/run_pytest_check.sh b/scripts/run_pytest_check.sh
new file mode 100755
index 000000000..d5ad9394b
--- /dev/null
+++ b/scripts/run_pytest_check.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+modules=( "common" "node" )
+errs=0
+
+for m in "${modules[@]}"
+do
+    out=$(python3 scripts/pytest_mark_check.py indy_$m)
+
+
+    result=$(echo $out | jq '.status')
+
+    if [[ "$result" = "\"success\"" ]]; then
+        fin=$(echo $out | jq -c 'del(.status, .errors)')
+        echo "::set-output name=matrix-$m::$fin"
+    else
+        ((errs=errs+1))
+        echo "$(echo $out | jq '.errors' | jq .[])"
+    fi
+done
+
+if [[ errs -gt 0 ]]; then 
+    exit 1
+fi
diff --git a/scripts/test_specific_tests_against_specific_env.py b/scripts/test_specific_tests_against_specific_env.py
index b82a70db2..126473a5a 100644
--- a/scripts/test_specific_tests_against_specific_env.py
+++ b/scripts/test_specific_tests_against_specific_env.py
@@ -100,7 +100,7 @@
 #
 # # TODO: Need to properly test this and make sure monkey patching
 # # doesn't break any other tests (which run after this one)
-# def testSpecificModTest(monkeypatch):
+# def test_specific_mod_test(monkeypatch):
 #     envExitCodes = {}
 #     curDirPath = os.path.dirname(os.path.abspath(__file__))
 #
diff --git a/setup.py b/setup.py
index 5e8cd71e7..e8fdb3788 100644
--- a/setup.py
+++ b/setup.py
@@ -28,7 +28,7 @@
 BASE_DIR = os.path.join(os.path.expanduser("~"), ".indy")
 
 tests_require = ['attrs==19.1.0', 'pytest==3.3.1', 'pytest-xdist==1.22.1', 'pytest-forked==0.2',
-                 'python3-indy==1.13.0-dev-1420', 'pytest-asyncio==0.8.0']
+                 'python3-indy==1.15.0', 'pytest-asyncio==0.8.0']
 
 setup(
     name=metadata['__title__'],