diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2359e4d..3985a5f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -51,6 +51,7 @@
 option(TINT_BUILD_WGSL_WRITER "Build the WGSL output writer" ON)
 option(TINT_BUILD_FUZZERS "Build fuzzers" OFF)
 option(TINT_BUILD_SPIRV_TOOLS_FUZZER "Build SPIRV-Tools fuzzer" OFF)
+option(TINT_BUILD_AST_FUZZER "Build AST fuzzer" OFF)
 option(TINT_BUILD_TESTS "Build tests" ${TINT_BUILD_TESTS_DEFAULT})
 option(TINT_BUILD_AS_OTHER_OS "Override OS detection to force building of *_other.cc files" OFF)
 option(TINT_BUILD_REMOTE_COMPILE "Build the remote-compile tool for validating shaders on a remote machine" OFF)
@@ -73,6 +74,7 @@
 message(STATUS "Tint build WGSL writer: ${TINT_BUILD_WGSL_WRITER}")
 message(STATUS "Tint build fuzzers: ${TINT_BUILD_FUZZERS}")
 message(STATUS "Tint build SPIRV-Tools fuzzer: ${TINT_BUILD_SPIRV_TOOLS_FUZZER}")
+message(STATUS "Tint build AST fuzzer: ${TINT_BUILD_AST_FUZZER}")
 message(STATUS "Tint build tests: ${TINT_BUILD_TESTS}")
 message(STATUS "Tint build with ASAN: ${TINT_ENABLE_ASAN}")
 message(STATUS "Tint build with MSAN: ${TINT_ENABLE_MSAN}")
@@ -85,13 +87,13 @@
 
 if (${TINT_BUILD_SPIRV_TOOLS_FUZZER})
   message(STATUS "TINT_BUILD_SPIRV_TOOLS_FUZZER is ON - setting
-          TINT_BUILD_FUZZERS,
-          TINT_BUILD_SPV_READER,
-          TINT_BUILD_WGSL_READER,
-          TINT_BUILD_WGSL_WRITER,
-          TINT_BUILD_HLSL_WRITER,
-          TINT_BUILD_MSL_WRITER,
-          TINT_BUILD_SPV_WRITER to ON")
+      TINT_BUILD_FUZZERS
+      TINT_BUILD_SPV_READER
+      TINT_BUILD_WGSL_READER
+      TINT_BUILD_WGSL_WRITER
+      TINT_BUILD_HLSL_WRITER
+      TINT_BUILD_MSL_WRITER
+      TINT_BUILD_SPV_WRITER to ON")
   set(TINT_BUILD_FUZZERS ON)
   set(TINT_BUILD_SPV_READER ON)
   set(TINT_BUILD_WGSL_READER ON)
@@ -101,6 +103,22 @@
   set(TINT_BUILD_SPV_WRITER ON)
 endif()
 
+if (${TINT_BUILD_AST_FUZZER})
+  message(STATUS "TINT_BUILD_AST_FUZZER is ON - setting
+      TINT_BUILD_FUZZERS
+      TINT_BUILD_WGSL_READER
+      TINT_BUILD_WGSL_WRITER
+      TINT_BUILD_SPV_WRITER
+      TINT_BUILD_MSL_WRITER
+      TINT_BUILD_HLSL_WRITER to ON")
+  set(TINT_BUILD_FUZZERS ON)
+  set(TINT_BUILD_WGSL_READER ON)
+  set(TINT_BUILD_WGSL_WRITER ON)
+  set(TINT_BUILD_SPV_WRITER ON)
+  set(TINT_BUILD_MSL_WRITER ON)
+  set(TINT_BUILD_HLSL_WRITER ON)
+endif()
+
 set(TINT_ROOT_SOURCE_DIR ${PROJECT_SOURCE_DIR})
 
 # CMake < 3.15 sets /W3 in CMAKE_CXX_FLAGS. Remove it if it's there.
diff --git a/DEPS b/DEPS
index d3b3dcb..c710f14 100644
--- a/DEPS
+++ b/DEPS
@@ -45,7 +45,7 @@
       '/google/googletest.git@' + Var('googletest_revision'),
 
   'third_party/protobuf': Var('chromium_git') + Var('github') +
-        '/protocolbuffers/protobuf.git@' + Var('protobuf_revision'),
+      '/protocolbuffers/protobuf.git@' + Var('protobuf_revision'),
 }
 
 hooks = [
diff --git a/Doxyfile b/Doxyfile
index 8cf5eee..211e3b8 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -789,6 +789,8 @@
                          fuzzers/tint_spirv_tools_fuzzer \
                          src \
                          tools/src \
+                         fuzzers/tint_spirv_tools_fuzzer \
+                         fuzzers/tint_ast_fuzzer
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/fuzzers/CMakeLists.txt b/fuzzers/CMakeLists.txt
index 70e1ceb..8847be2 100644
--- a/fuzzers/CMakeLists.txt
+++ b/fuzzers/CMakeLists.txt
@@ -77,3 +77,7 @@
 if (${TINT_BUILD_SPIRV_TOOLS_FUZZER})
   add_subdirectory(tint_spirv_tools_fuzzer)
 endif()
+
+if (${TINT_BUILD_AST_FUZZER})
+  add_subdirectory(tint_ast_fuzzer)
+endif()
diff --git a/fuzzers/tint_ast_fuzzer/CMakeLists.txt b/fuzzers/tint_ast_fuzzer/CMakeLists.txt
new file mode 100644
index 0000000..e8d5a42
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/CMakeLists.txt
@@ -0,0 +1,102 @@
+# Copyright 2021 The Tint Authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+if (NOT (${CMAKE_CXX_COMPILER_ID} MATCHES Clang))
+    message(FATAL_ERROR "Libfuzzer is supported only on clang")
+endif ()
+
+set(PROTOBUF_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/protobufs/tint_ast_fuzzer.proto)
+
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/protobufs)
+
+add_custom_command(
+        OUTPUT
+        ${CMAKE_CURRENT_BINARY_DIR}/protobufs/tint_ast_fuzzer.pb.cc
+        ${CMAKE_CURRENT_BINARY_DIR}/protobufs/tint_ast_fuzzer.pb.h
+        COMMAND
+        "protobuf::protoc" -I=${CMAKE_CURRENT_SOURCE_DIR}/protobufs
+        --cpp_out=${CMAKE_CURRENT_BINARY_DIR}/protobufs ${PROTOBUF_SOURCES}
+        DEPENDS ${PROTOBUF_SOURCES}
+        COMMENT "Generate protobuf sources from proto definition file.")
+
+set(LIBTINT_AST_FUZZER_SOURCES
+        mt_rng.h
+        mutation.h
+        mutation_finder.h
+        mutation_finders/replace_identifiers.h
+        mutations/replace_identifier.h
+        mutator.h
+        node_id_map.h
+        probability_context.h
+        protobufs/tint_ast_fuzzer.h
+        random_number_generator.h
+        util.h
+        ${CMAKE_CURRENT_BINARY_DIR}/protobufs/tint_ast_fuzzer.pb.h)
+
+set(LIBTINT_AST_FUZZER_SOURCES ${LIBTINT_AST_FUZZER_SOURCES}
+        mt_rng.cc
+        mutation.cc
+        mutation_finder.cc
+        mutation_finders/replace_identifiers.cc
+        mutations/replace_identifier.cc
+        mutator.cc
+        node_id_map.cc
+        probability_context.cc
+        random_number_generator.cc
+        ${CMAKE_CURRENT_BINARY_DIR}/protobufs/tint_ast_fuzzer.pb.cc)
+
+set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/protobufs/tint_ast_fuzzer.pb.cc PROPERTIES COMPILE_FLAGS -w)
+
+# Add static library target.
+add_library(libtint_ast_fuzzer STATIC ${LIBTINT_AST_FUZZER_SOURCES})
+target_link_libraries(libtint_ast_fuzzer protobuf::libprotobuf libtint)
+tint_default_compile_options(libtint_ast_fuzzer)
+target_include_directories(libtint_ast_fuzzer PRIVATE ${CMAKE_BINARY_DIR})
+
+set(AST_FUZZER_SOURCES
+        cli.cc
+        cli.h
+        fuzzer.cc
+        ../tint_common_fuzzer.cc
+        ../tint_common_fuzzer.h)
+
+set_source_files_properties(fuzzer.cc PROPERTIES COMPILE_FLAGS -Wno-missing-prototypes)
+
+# Add libfuzzer target.
+add_executable(tint_ast_fuzzer ${AST_FUZZER_SOURCES})
+target_link_libraries(tint_ast_fuzzer libtint-fuzz libtint_ast_fuzzer)
+tint_default_compile_options(tint_ast_fuzzer)
+target_compile_definitions(tint_ast_fuzzer PRIVATE CUSTOM_MUTATOR)
+target_include_directories(tint_ast_fuzzer PRIVATE ${CMAKE_BINARY_DIR})
+
+# Add tests.
+if (${TINT_BUILD_TESTS})
+    set(TEST_SOURCES
+            mutations/replace_identifier_test.cc)
+
+    add_executable(tint_ast_fuzzer_unittests ${TEST_SOURCES})
+
+    target_include_directories(
+            tint_ast_fuzzer_unittests PRIVATE ${gmock_SOURCE_DIR}/include)
+    target_link_libraries(tint_ast_fuzzer_unittests gmock_main libtint_ast_fuzzer)
+    tint_default_compile_options(tint_ast_fuzzer_unittests)
+    target_compile_options(tint_ast_fuzzer_unittests PRIVATE
+            -Wno-global-constructors
+            -Wno-weak-vtables
+            -Wno-covered-switch-default)
+
+    target_include_directories(tint_ast_fuzzer_unittests PRIVATE ${CMAKE_BINARY_DIR})
+
+    add_test(NAME tint_ast_fuzzer_unittests COMMAND tint_ast_fuzzer_unittests)
+endif ()
diff --git a/fuzzers/tint_ast_fuzzer/cli.cc b/fuzzers/tint_ast_fuzzer/cli.cc
new file mode 100644
index 0000000..5e3f073
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/cli.cc
@@ -0,0 +1,162 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fuzzers/tint_ast_fuzzer/cli.h"
+
+#include <cstring>
+#include <iostream>
+#include <limits>
+#include <sstream>
+#include <string>
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+namespace {
+
+const char* const kHelpMessage = R"(
+This is a fuzzer for the Tint compiler that works by mutating the AST.
+
+Below is a list of all supported parameters for this fuzzer. You may want to
+run it with -help=1 to check out libfuzzer parameters.
+
+  --enable_all_mutations=
+                       If `false`, the fuzzer will only apply mutations from a
+                       randomly selected subset of mutation types. Otherwise,
+                       all mutation types will be considered. This must be one
+                       of `true` or `false` (without `). By default it's `false`.
+
+  --fuzzing_target=
+                       Specifies the shading language to target during fuzzing.
+                       This must be one or a combination of `wgsl`, `spv`, `hlsl`,
+                       `msl` (without `) separated by commas. By default it's
+                       `wgsl,msl,hlsl,spv`.
+
+  --help
+                       Show this message. Note that there is also a -help=1
+                       parameter that will display libfuzzer's help message.
+
+  --mutation_batch_size=
+                       The number of mutations to apply in a single libfuzzer
+                       mutation session. This must be a numeric value that fits
+                       in type `uint32_t`. By default it's 5.
+
+  --record_mutations=
+                       Whether to record applied mutations in the protobuf
+                       message. This is useful to debug the fuzzer and during
+                       metamorphic fuzzing. The value must be one of `true` or
+                       `false` (without `). By default it's `false`.
+)";
+
+bool HasPrefix(const char* str, const char* prefix) {
+  return strncmp(str, prefix, strlen(prefix)) == 0;
+}
+
+[[noreturn]] void InvalidParam(const char* param) {
+  std::cout << "Invalid value for " << param << std::endl;
+  std::cout << kHelpMessage << std::endl;
+  exit(1);
+}
+
+bool ParseBool(const char* value, bool* out) {
+  if (!strcmp(value, "true")) {
+    *out = true;
+  } else if (!strcmp(value, "false")) {
+    *out = false;
+  } else {
+    return false;
+  }
+  return true;
+}
+
+bool ParseUint32(const char* value, uint32_t* out) {
+  auto parsed = strtoul(value, nullptr, 10);
+  if (parsed > std::numeric_limits<uint32_t>::max()) {
+    return false;
+  }
+  *out = static_cast<uint32_t>(parsed);
+  return true;
+}
+
+bool ParseFuzzingTarget(const char* value, FuzzingTarget* out) {
+  if (!strcmp(value, "wgsl")) {
+    *out = FuzzingTarget::kWgsl;
+  } else if (!strcmp(value, "spv")) {
+    *out = FuzzingTarget::kSpv;
+  } else if (!strcmp(value, "msl")) {
+    *out = FuzzingTarget::kMsl;
+  } else if (!strcmp(value, "hlsl")) {
+    *out = FuzzingTarget::kHlsl;
+  } else {
+    return false;
+  }
+  return true;
+}
+
+}  // namespace
+
+CliParams ParseCliParams(int argc, const char* const* argv) {
+  CliParams cli_params;
+  auto help = false;
+
+  for (int i = 1; i < argc; ++i) {
+    auto param = argv[i];
+    if (HasPrefix(param, "--record_mutations=")) {
+      if (!ParseBool(param + sizeof("--record_mutations=") - 1,
+                     &cli_params.record_mutations)) {
+        InvalidParam(param);
+      }
+    } else if (HasPrefix(param, "--enable_all_mutations=")) {
+      if (!ParseBool(param + sizeof("--enable_all_mutations=") - 1,
+                     &cli_params.enable_all_mutations)) {
+        InvalidParam(param);
+      }
+    } else if (HasPrefix(param, "--mutation_batch_size=")) {
+      if (!ParseUint32(param + sizeof("--mutation_batch_size=") - 1,
+                       &cli_params.mutation_batch_size)) {
+        InvalidParam(param);
+      }
+    } else if (HasPrefix(param, "--fuzzing_target=")) {
+      auto result = FuzzingTarget::kNone;
+
+      std::stringstream ss(param + sizeof("--fuzzing_target=") - 1);
+      for (std::string value; std::getline(ss, value, ',');) {
+        auto tmp = FuzzingTarget::kNone;
+        if (!ParseFuzzingTarget(value.c_str(), &tmp)) {
+          InvalidParam(param);
+        }
+        result = result | tmp;
+      }
+
+      if (result == FuzzingTarget::kNone) {
+        InvalidParam(param);
+      }
+
+      cli_params.fuzzing_target = result;
+    } else if (!strcmp(param, "--help")) {
+      help = true;
+    }
+  }
+
+  if (help) {
+    std::cout << kHelpMessage << std::endl;
+    exit(0);
+  }
+
+  return cli_params;
+}
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/cli.h b/fuzzers/tint_ast_fuzzer/cli.h
new file mode 100644
index 0000000..dd94fbb
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/cli.h
@@ -0,0 +1,74 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_CLI_H_
+#define FUZZERS_TINT_AST_FUZZER_CLI_H_
+
+#include <cstdint>
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+/// The backend this fuzzer will test.
+enum class FuzzingTarget {
+  kNone = 0,
+  kHlsl = 1 << 0,
+  kMsl = 1 << 1,
+  kSpv = 1 << 2,
+  kWgsl = 1 << 3,
+  kAll = kHlsl | kMsl | kSpv | kWgsl
+};
+
+inline FuzzingTarget operator|(FuzzingTarget a, FuzzingTarget b) {
+  return static_cast<FuzzingTarget>(static_cast<int>(a) | static_cast<int>(b));
+}
+
+inline FuzzingTarget operator&(FuzzingTarget a, FuzzingTarget b) {
+  return static_cast<FuzzingTarget>(static_cast<int>(a) & static_cast<int>(b));
+}
+
+/// CLI parameters accepted by the fuzzer. Type --help in the CLI to see the
+/// help message
+struct CliParams {
+  /// Whether to record applied mutations.
+  bool record_mutations = false;
+
+  /// Whether to use all mutation finders or only a randomly selected subset of
+  /// them.
+  bool enable_all_mutations = false;
+
+  /// The maximum number of mutations applied during a single mutation session
+  /// (i.e. a call to `ast_fuzzer::Mutate` function).
+  uint32_t mutation_batch_size = 5;
+
+  /// Compiler backends we want to fuzz.
+  FuzzingTarget fuzzing_target = FuzzingTarget::kAll;
+};
+
+/// @brief Parses CLI parameters.
+///
+/// This function will exit the process with non-zero return code if some
+/// parameters are invalid.
+///
+/// @param argc - the total number of parameters.
+/// @param argv - array of all CLI parameters.
+/// @return parsed parameters.
+CliParams ParseCliParams(int argc, const char* const* argv);
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
+
+#endif  // FUZZERS_TINT_AST_FUZZER_CLI_H_
diff --git a/fuzzers/tint_ast_fuzzer/fuzzer.cc b/fuzzers/tint_ast_fuzzer/fuzzer.cc
new file mode 100644
index 0000000..59dc075
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/fuzzer.cc
@@ -0,0 +1,154 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <cstddef>
+#include <cstdint>
+
+#include "fuzzers/tint_ast_fuzzer/cli.h"
+#include "fuzzers/tint_ast_fuzzer/mt_rng.h"
+#include "fuzzers/tint_ast_fuzzer/mutator.h"
+#include "fuzzers/tint_ast_fuzzer/protobufs/tint_ast_fuzzer.h"
+#include "fuzzers/tint_common_fuzzer.h"
+
+#include "src/reader/wgsl/parser.h"
+#include "src/writer/wgsl/generator.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+namespace {
+
+CliParams cli_params{};
+
+extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv) {
+  // Parse CLI parameters. `ParseCliParams` will call `exit` if some parameter
+  // is invalid.
+  cli_params = ParseCliParams(*argc, *argv);
+  return 0;
+}
+
+extern "C" size_t LLVMFuzzerCustomMutator(uint8_t* data,
+                                          size_t size,
+                                          size_t max_size,
+                                          unsigned seed) {
+  protobufs::MutatorState mutator_state;
+  auto success = mutator_state.ParseFromArray(data, static_cast<int>(size));
+  (void)success;  // This variable will be unused in release mode.
+  assert(success && "Can't parse protobuf message");
+
+  tint::Source::File file("test.wgsl", mutator_state.program());
+  auto program = reader::wgsl::Parse(&file);
+  protobufs::MutationSequence* mutation_sequence = nullptr;
+
+  if (cli_params.record_mutations) {
+    // If mutations are being recorded, then `mutator_state.program` is the
+    // original (unmodified) program and it is necessary to replay all
+    // mutations.
+    mutation_sequence = mutator_state.mutable_mutation_sequence();
+    program = Replay(std::move(program), *mutation_sequence);
+    if (!program.IsValid()) {
+      std::cout << "Replayer produced invalid WGSL:" << std::endl
+                << "  seed: " << seed << std::endl
+                << program.Diagnostics().str() << std::endl;
+      return 0;
+    }
+  }
+
+  // Run the mutator.
+  MtRng mt_rng(seed);
+  ProbabilityContext probability_context(&mt_rng);
+  program = Mutate(std::move(program), &probability_context,
+                   cli_params.enable_all_mutations,
+                   cli_params.mutation_batch_size, mutation_sequence);
+
+  if (!program.IsValid()) {
+    std::cout << "Mutator produced invalid WGSL:" << std::endl
+              << "  seed: " << seed << std::endl
+              << program.Diagnostics().str() << std::endl;
+    return 0;
+  }
+
+  if (!cli_params.record_mutations) {
+    // If mutations are not being recorded, then the mutated `program` must be
+    // stored into the `mutator_state`.
+    writer::wgsl::Generator generator(&program);
+    if (!generator.Generate()) {
+      std::cout << "Can't generate WGSL for valid tint::Program:" << std::endl
+                << "  seed: " << seed << std::endl
+                << generator.error() << std::endl;
+      return 0;
+    }
+    *mutator_state.mutable_program() = generator.result();
+  }
+
+  if (mutator_state.ByteSizeLong() > max_size) {
+    return 0;
+  }
+
+  success = mutator_state.SerializeToArray(data, static_cast<int>(max_size));
+  assert(success && "Can't serialize a protobuf message");
+  return mutator_state.ByteSizeLong();
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  if (size == 0) {
+    return 0;
+  }
+
+  protobufs::MutatorState mutator_state;
+  auto success = mutator_state.ParseFromArray(data, static_cast<int>(size));
+  (void)success;  // This variable will be unused in release mode.
+  assert(success && "Can't parse a protobuf message");
+
+  std::string program_text;
+  if (cli_params.record_mutations) {
+    // If mutations are being recorded, then it's necessary to replay them
+    // before invoking the system under test.
+    Source::File file("test.wgsl", mutator_state.program());
+    auto program =
+        Replay(reader::wgsl::Parse(&file), mutator_state.mutation_sequence());
+    assert(program.IsValid() && "Replayed program is invalid");
+
+    writer::wgsl::Generator generator(&program);
+    success = generator.Generate();
+    assert(success && "Can't generate a shader for the valid tint::Program");
+    program_text = generator.result();
+  } else {
+    program_text.assign(data, data + size);
+  }
+
+  std::pair<FuzzingTarget, OutputFormat> targets[] = {
+      {FuzzingTarget::kWgsl, OutputFormat::kWGSL},
+      {FuzzingTarget::kHlsl, OutputFormat::kHLSL},
+      {FuzzingTarget::kMsl, OutputFormat::kMSL},
+      {FuzzingTarget::kSpv, OutputFormat::kSpv}};
+
+  for (auto target : targets) {
+    if ((target.first & cli_params.fuzzing_target) != target.first) {
+      continue;
+    }
+
+    CommonFuzzer fuzzer(InputFormat::kWGSL, target.second);
+    fuzzer.EnableInspector();
+    fuzzer.Run(reinterpret_cast<const uint8_t*>(program_text.data()),
+               program_text.size());
+  }
+
+  return 0;
+}
+
+}  // namespace
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/mt_rng.cc b/fuzzers/tint_ast_fuzzer/mt_rng.cc
new file mode 100644
index 0000000..586b2d9
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mt_rng.cc
@@ -0,0 +1,44 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fuzzers/tint_ast_fuzzer/mt_rng.h"
+
+#include <cassert>
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+namespace {
+
+template <typename T>
+T RandomUInt(std::mt19937* rng, T bound) {
+  assert(bound > 0 && "`bound` must be positive");
+  return std::uniform_int_distribution<T>(0, bound - 1)(*rng);
+}
+
+}  // namespace
+
+MtRng::MtRng(uint32_t seed) : rng_(seed) {}
+
+uint32_t MtRng::RandomUint32(uint32_t bound) {
+  return RandomUInt(&rng_, bound);
+}
+
+uint64_t MtRng::RandomUint64(uint64_t bound) {
+  return RandomUInt(&rng_, bound);
+}
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/mt_rng.h b/fuzzers/tint_ast_fuzzer/mt_rng.h
new file mode 100644
index 0000000..ebbddc4
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mt_rng.h
@@ -0,0 +1,45 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_MT_RNG_H_
+#define FUZZERS_TINT_AST_FUZZER_MT_RNG_H_
+
+#include <random>
+
+#include "fuzzers/tint_ast_fuzzer/random_number_generator.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+/// The random number generator that uses STL's Mersenne Twister (std::mt19937)
+/// under the hood.
+class MtRng : public RandomNumberGenerator {
+ public:
+  /// @brief Initializes this RNG with some `seed`.
+  /// @param seed - passed down to the `std::mt19937`.
+  explicit MtRng(uint32_t seed);
+
+  uint32_t RandomUint32(uint32_t bound) override;
+  uint64_t RandomUint64(uint64_t bound) override;
+
+ private:
+  std::mt19937 rng_;
+};
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
+
+#endif  // FUZZERS_TINT_AST_FUZZER_MT_RNG_H_
diff --git a/fuzzers/tint_ast_fuzzer/mutation.cc b/fuzzers/tint_ast_fuzzer/mutation.cc
new file mode 100644
index 0000000..0e52471
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mutation.cc
@@ -0,0 +1,40 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fuzzers/tint_ast_fuzzer/mutation.h"
+
+#include <cassert>
+
+#include "fuzzers/tint_ast_fuzzer/mutations/replace_identifier.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+Mutation::~Mutation() = default;
+
+std::unique_ptr<Mutation> Mutation::FromMessage(
+    const protobufs::Mutation& message) {
+  switch (message.mutation_case()) {
+    case protobufs::Mutation::kReplaceIdentifier:
+      return std::make_unique<MutationReplaceIdentifier>(
+          message.replace_identifier());
+    case protobufs::Mutation::MUTATION_NOT_SET:
+      assert(false && "Mutation is not set");
+  }
+}
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/mutation.h b/fuzzers/tint_ast_fuzzer/mutation.h
new file mode 100644
index 0000000..77f29f3
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mutation.h
@@ -0,0 +1,86 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_MUTATION_H_
+#define FUZZERS_TINT_AST_FUZZER_MUTATION_H_
+
+#include <memory>
+#include <vector>
+
+#include "fuzzers/tint_ast_fuzzer/node_id_map.h"
+#include "fuzzers/tint_ast_fuzzer/protobufs/tint_ast_fuzzer.h"
+
+#include "src/clone_context.h"
+#include "src/program.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+/// The base class for all the mutations in the fuzzer. Children must override
+/// three methods:
+/// - `IsApplicable` - checks whether it is possible to apply the mutation
+///   in a manner that will lead to a valid program.
+/// - `Apply` - applies the mutation.
+/// - `ToMessage` - converts the mutation data into a protobuf message.
+class Mutation {
+ public:
+  /// Virtual destructor.
+  virtual ~Mutation();
+
+  /// @brief Determines whether this mutation is applicable to the `program`.
+  ///
+  /// @param program - the program this mutation will be applied to. The program
+  ///     must be valid.
+  /// @param node_id_map - the map from `tint::ast::` nodes to their ids.
+  /// @return `true` if `Apply` method can be called without breaking the
+  ///     semantics of the `program`.
+  /// @return `false` otherwise.
+  virtual bool IsApplicable(const tint::Program& program,
+                            const NodeIdMap& node_id_map) const = 0;
+
+  /// @brief Applies this mutation to the `clone_context`.
+  ///
+  /// Precondition: `IsApplicable` must return `true` when invoked on the same
+  /// `node_id_map` and `clone_context->src` instance of `tint::Program`. A new
+  /// `tint::Program` that arises in `clone_context` must be valid.
+  ///
+  /// @param node_id_map - the map from `tint::ast::` nodes to their ids.
+  /// @param clone_context - the context that will clone the program with some
+  ///     changes introduced by this mutation.
+  /// @param new_node_id_map - this map will store ids for the mutated and
+  ///     cloned program. This argument cannot be a `nullptr` nor can it point
+  ///     to the same object as `node_id_map`.
+  virtual void Apply(const NodeIdMap& node_id_map,
+                     tint::CloneContext* clone_context,
+                     NodeIdMap* new_node_id_map) const = 0;
+
+  /// @return a protobuf message for this mutation.
+  virtual protobufs::Mutation ToMessage() const = 0;
+
+  /// @brief Converts a protobuf message into the mutation instance.
+  ///
+  /// @param message - a protobuf message.
+  /// @return the instance of this class.
+  static std::unique_ptr<Mutation> FromMessage(
+      const protobufs::Mutation& message);
+};
+
+using MutationList = std::vector<std::unique_ptr<Mutation>>;
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
+
+#endif  // FUZZERS_TINT_AST_FUZZER_MUTATION_H_
diff --git a/fuzzers/tint_ast_fuzzer/mutation_finder.cc b/fuzzers/tint_ast_fuzzer/mutation_finder.cc
new file mode 100644
index 0000000..daf1d6d
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mutation_finder.cc
@@ -0,0 +1,25 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fuzzers/tint_ast_fuzzer/mutation_finder.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+MutationFinder::~MutationFinder() = default;
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/mutation_finder.h b/fuzzers/tint_ast_fuzzer/mutation_finder.h
new file mode 100644
index 0000000..546dce4
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mutation_finder.h
@@ -0,0 +1,77 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_MUTATION_FINDER_H_
+#define FUZZERS_TINT_AST_FUZZER_MUTATION_FINDER_H_
+
+#include <memory>
+#include <vector>
+
+#include "fuzzers/tint_ast_fuzzer/mutation.h"
+#include "fuzzers/tint_ast_fuzzer/node_id_map.h"
+#include "fuzzers/tint_ast_fuzzer/probability_context.h"
+
+#include "src/program.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+/// Instances of this class traverse the `tint::Program`, looking for
+/// opportunities to apply mutations and return them to the caller.
+///
+/// Ideally, the behaviour of this class (precisely, its `FindMutations` method)
+/// should not be probabilistic. This is useful when mutation finders are used
+/// for test case reduction, because it enables the test case reducer to
+/// systematically explore all available mutations. There may be some
+/// exceptions, however. For example, if a huge number of mutations is returned,
+/// it would make sense to apply only a probabilistically selected subset of
+/// them.
+class MutationFinder {
+ public:
+  /// Virtual destructor.
+  virtual ~MutationFinder();
+
+  /// @brief Traverses the `program`, looking for opportunities to apply
+  /// mutations.
+  ///
+  /// @param program - the program being fuzzed.
+  /// @param node_id_map - a map from `tint::ast::` nodes in the `program` to
+  ///     their unique ids.
+  /// @param probability_context - determines various probabilistic stuff in the
+  ///     mutator. This should ideally be used as less as possible.
+  /// @return all the found mutations.
+  virtual MutationList FindMutations(
+      const tint::Program& program,
+      const NodeIdMap& node_id_map,
+      ProbabilityContext* probability_context) const = 0;
+
+  /// @brief Compute a probability of applying a single mutation, returned by
+  /// this class.
+  ///
+  /// @param probability_context - contains information about various
+  ///     non-deterministic stuff in the fuzzer.
+  /// @return a number in the range [0; 100] which is a chance of applying a
+  ///     mutation.
+  virtual uint32_t GetChanceOfApplyingMutation(
+      ProbabilityContext* probability_context) const = 0;
+};
+
+using MutationFinderList = std::vector<std::unique_ptr<MutationFinder>>;
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
+
+#endif  // FUZZERS_TINT_AST_FUZZER_MUTATION_FINDER_H_
diff --git a/fuzzers/tint_ast_fuzzer/mutation_finders/replace_identifiers.cc b/fuzzers/tint_ast_fuzzer/mutation_finders/replace_identifiers.cc
new file mode 100644
index 0000000..7eb3f6d
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mutation_finders/replace_identifiers.cc
@@ -0,0 +1,79 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fuzzers/tint_ast_fuzzer/mutation_finders/replace_identifiers.h"
+
+#include <memory>
+
+#include "fuzzers/tint_ast_fuzzer/mutations/replace_identifier.h"
+#include "fuzzers/tint_ast_fuzzer/util.h"
+
+#include "src/sem/expression.h"
+#include "src/sem/statement.h"
+#include "src/sem/variable.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+MutationList MutationFinderReplaceIdentifiers::FindMutations(
+    const tint::Program& program,
+    const NodeIdMap& node_id_map,
+    ProbabilityContext* probability_context) const {
+  MutationList result;
+
+  // Go through each variable in the AST and for each user of that variable, try
+  // to replace it with some other variable usage.
+
+  for (const auto* node : program.SemNodes().Objects()) {
+    const auto* sem_variable = tint::As<sem::Variable>(node);
+    if (!sem_variable) {
+      continue;
+    }
+
+    // Iterate over all users of `sem_variable`.
+    for (const auto* user : sem_variable->Users()) {
+      // Get all variables that can be used to replace the `user` of
+      // `sem_variable`.
+      auto candidate_variables = util::GetAllVarsInScope(
+          program, user->Stmt(), [user](const sem::Variable* var) {
+            return var != user->Variable() && var->Type() == user->Type();
+          });
+
+      if (candidate_variables.empty()) {
+        // No suitable replacements have been found.
+        continue;
+      }
+
+      const auto* replacement =
+          candidate_variables[probability_context->GetRandomIndex(
+              candidate_variables)];
+
+      result.push_back(std::make_unique<MutationReplaceIdentifier>(
+          node_id_map.GetId(user->Declaration()),
+          node_id_map.GetId(replacement->Declaration())));
+    }
+  }
+
+  return result;
+}
+
+uint32_t MutationFinderReplaceIdentifiers::GetChanceOfApplyingMutation(
+    ProbabilityContext* probability_context) const {
+  return probability_context->GetChanceOfReplacingIdentifiers();
+}
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/mutation_finders/replace_identifiers.h b/fuzzers/tint_ast_fuzzer/mutation_finders/replace_identifiers.h
new file mode 100644
index 0000000..957abf2
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mutation_finders/replace_identifiers.h
@@ -0,0 +1,42 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_MUTATION_FINDERS_REPLACE_IDENTIFIERS_H_
+#define FUZZERS_TINT_AST_FUZZER_MUTATION_FINDERS_REPLACE_IDENTIFIERS_H_
+
+#include "fuzzers/tint_ast_fuzzer/mutation_finder.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+/// Looks for opportunities to apply `MutationReplaceIdentifier`.
+///
+/// Concretely, for each variable in the module, tries to replace its users with
+/// the uses of some other variables.
+class MutationFinderReplaceIdentifiers : public MutationFinder {
+ public:
+  MutationList FindMutations(
+      const tint::Program& program,
+      const NodeIdMap& node_id_map,
+      ProbabilityContext* probability_context) const override;
+  uint32_t GetChanceOfApplyingMutation(
+      ProbabilityContext* probability_context) const override;
+};
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
+
+#endif  // FUZZERS_TINT_AST_FUZZER_MUTATION_FINDERS_REPLACE_IDENTIFIERS_H_
diff --git a/fuzzers/tint_ast_fuzzer/mutations/replace_identifier.cc b/fuzzers/tint_ast_fuzzer/mutations/replace_identifier.cc
new file mode 100644
index 0000000..2b2bb9d
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mutations/replace_identifier.cc
@@ -0,0 +1,106 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fuzzers/tint_ast_fuzzer/mutations/replace_identifier.h"
+
+#include <utility>
+
+#include "fuzzers/tint_ast_fuzzer/util.h"
+#include "src/program_builder.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+MutationReplaceIdentifier::MutationReplaceIdentifier(
+    protobufs::MutationReplaceIdentifier message)
+    : message_(std::move(message)) {}
+
+MutationReplaceIdentifier::MutationReplaceIdentifier(uint32_t use_id,
+                                                     uint32_t replacement_id) {
+  message_.set_use_id(use_id);
+  message_.set_replacement_id(replacement_id);
+}
+
+bool MutationReplaceIdentifier::IsApplicable(
+    const tint::Program& program,
+    const NodeIdMap& node_id_map) const {
+  const auto* use_ast_node = tint::As<ast::IdentifierExpression>(
+      node_id_map.GetNode(message_.use_id()));
+  if (!use_ast_node) {
+    // Either the `use_id` is invalid or the node is not an
+    // `IdentifierExpression`.
+    return false;
+  }
+
+  const auto* use_sem_node =
+      tint::As<sem::VariableUser>(program.Sem().Get(use_ast_node));
+  if (!use_sem_node) {
+    // Either the semantic information is not present for a `use_node` or that
+    // node is not a variable user.
+    return false;
+  }
+
+  const auto* replacement_ast_node =
+      tint::As<ast::Variable>(node_id_map.GetNode(message_.replacement_id()));
+  if (!replacement_ast_node) {
+    // Either the `replacement_id` is invalid or is not an id of a variable.
+    return false;
+  }
+
+  const auto* replacement_sem_node = program.Sem().Get(replacement_ast_node);
+  if (!replacement_sem_node) {
+    return false;
+  }
+
+  if (replacement_sem_node == use_sem_node->Variable()) {
+    return false;
+  }
+
+  auto in_scope =
+      util::GetAllVarsInScope(program, use_sem_node->Stmt(),
+                              [replacement_sem_node](const sem::Variable* var) {
+                                return var == replacement_sem_node;
+                              });
+  if (in_scope.empty()) {
+    // The replacement variable is not in scope.
+    return false;
+  }
+
+  return use_sem_node->Type() == replacement_sem_node->Type();
+}
+
+void MutationReplaceIdentifier::Apply(const NodeIdMap& node_id_map,
+                                      tint::CloneContext* clone_context,
+                                      NodeIdMap* new_node_id_map) const {
+  const auto* use_node = node_id_map.GetNode(message_.use_id());
+  const auto* replacement_var =
+      tint::As<ast::Variable>(node_id_map.GetNode(message_.replacement_id()));
+
+  auto* cloned_replacement =
+      clone_context->dst->Expr(clone_context->Clone(use_node->source()),
+                               clone_context->Clone(replacement_var->symbol()));
+  clone_context->Replace(use_node, cloned_replacement);
+  new_node_id_map->Add(cloned_replacement, message_.use_id());
+}
+
+protobufs::Mutation MutationReplaceIdentifier::ToMessage() const {
+  protobufs::Mutation mutation;
+  *mutation.mutable_replace_identifier() = message_;
+  return mutation;
+}
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/mutations/replace_identifier.h b/fuzzers/tint_ast_fuzzer/mutations/replace_identifier.h
new file mode 100644
index 0000000..fa16715
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mutations/replace_identifier.h
@@ -0,0 +1,77 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_MUTATIONS_REPLACE_IDENTIFIER_H_
+#define FUZZERS_TINT_AST_FUZZER_MUTATIONS_REPLACE_IDENTIFIER_H_
+
+#include "fuzzers/tint_ast_fuzzer/mutation.h"
+
+#include "src/sem/variable.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+/// @see MutationReplaceIdentifier::Apply
+class MutationReplaceIdentifier : public Mutation {
+ public:
+  /// @brief Constructs an instance of this mutation from a protobuf message.
+  /// @param message - protobuf message
+  explicit MutationReplaceIdentifier(
+      protobufs::MutationReplaceIdentifier message);
+
+  /// @brief Constructor.
+  /// @param use_id - the id of a variable user.
+  /// @param replacement_id - the id of a variable to replace the `use_id`.
+  MutationReplaceIdentifier(uint32_t use_id, uint32_t replacement_id);
+
+  /// @copybrief Mutation::IsApplicable
+  ///
+  /// The mutation is applicable iff:
+  /// - `use_id` is a valid id of an `ast::IdentifierExpression`, that
+  ///   references a variable.
+  /// - `replacement_id` is a valid id of an `ast::Variable`.
+  /// - The identifier expression doesn't reference the variable of a
+  ///   `replacement_id`.
+  /// - The variable with `replacement_id` is in scope of an identifier
+  ///   expression with `use_id`.
+  /// - The identifier expression and the variable have the same type.
+  ///
+  /// @copydetails Mutation::IsApplicable
+  bool IsApplicable(const tint::Program& program,
+                    const NodeIdMap& node_id_map) const override;
+
+  /// @copybrief Mutation::Apply
+  ///
+  /// Replaces the use of an identifier expression with `use_id` with a newly
+  /// created identifier expression, that references a variable with
+  /// `replacement_id`. The newly created identifier expression will have the
+  /// same id as the old one (i.e. `use_id`).
+  ///
+  /// @copydetails Mutation::Apply
+  void Apply(const NodeIdMap& node_id_map,
+             tint::CloneContext* clone_context,
+             NodeIdMap* new_node_id_map) const override;
+
+  protobufs::Mutation ToMessage() const override;
+
+ private:
+  protobufs::MutationReplaceIdentifier message_;
+};
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
+
+#endif  // FUZZERS_TINT_AST_FUZZER_MUTATIONS_REPLACE_IDENTIFIER_H_
diff --git a/fuzzers/tint_ast_fuzzer/mutations/replace_identifier_test.cc b/fuzzers/tint_ast_fuzzer/mutations/replace_identifier_test.cc
new file mode 100644
index 0000000..84e47b5
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mutations/replace_identifier_test.cc
@@ -0,0 +1,723 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <string>
+
+#include "gtest/gtest.h"
+
+#include "fuzzers/tint_ast_fuzzer/mt_rng.h"
+#include "fuzzers/tint_ast_fuzzer/mutations/replace_identifier.h"
+#include "fuzzers/tint_ast_fuzzer/mutator.h"
+#include "fuzzers/tint_ast_fuzzer/probability_context.h"
+
+#include "fuzzers/tint_ast_fuzzer/node_id_map.h"
+
+#include "src/ast/call_statement.h"
+#include "src/program_builder.h"
+#include "src/reader/wgsl/parser.h"
+#include "src/writer/wgsl/generator.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+namespace {
+
+TEST(ReplaceIdentifierTest, NotApplicable_Simple) {
+  std::string content = R"(
+    fn main() {
+      let a = 5;
+      let c = 6;
+      let b = a + 5;
+
+      let d = vec2<i32>(1, 2);
+      let e = d.x;
+    }
+  )";
+  Source::File file("test.wgsl", content);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  const auto& main_fn_stmts =
+      program.AST().Functions()[0]->body()->statements();
+
+  const auto* a_var =
+      main_fn_stmts[0]->As<ast::VariableDeclStatement>()->variable();
+  ASSERT_NE(a_var, nullptr);
+
+  const auto* b_var =
+      main_fn_stmts[2]->As<ast::VariableDeclStatement>()->variable();
+  ASSERT_NE(b_var, nullptr);
+
+  const auto* e_var =
+      main_fn_stmts[4]->As<ast::VariableDeclStatement>()->variable();
+  ASSERT_NE(e_var, nullptr);
+
+  auto a_var_id = node_id_map.GetId(a_var);
+  ASSERT_NE(a_var_id, 0);
+
+  auto b_var_id = node_id_map.GetId(b_var);
+  ASSERT_NE(b_var_id, 0);
+
+  const auto* sum_expr = b_var->constructor()->As<ast::BinaryExpression>();
+  ASSERT_NE(sum_expr, nullptr);
+
+  auto a_ident_id = node_id_map.GetId(sum_expr->lhs());
+  ASSERT_NE(a_ident_id, 0);
+
+  auto sum_expr_id = node_id_map.GetId(sum_expr);
+  ASSERT_NE(sum_expr_id, 0);
+
+  auto e_var_id = node_id_map.GetId(e_var);
+  ASSERT_NE(e_var_id, 0);
+
+  auto vec_member_access_id = node_id_map.GetId(
+      e_var->constructor()->As<ast::MemberAccessorExpression>()->member());
+  ASSERT_NE(vec_member_access_id, 0);
+
+  // use_id is invalid.
+  EXPECT_FALSE(MutationReplaceIdentifier(0, a_var_id)
+                   .IsApplicable(program, node_id_map));
+
+  // use_id is not an identifier expression.
+  EXPECT_FALSE(MutationReplaceIdentifier(sum_expr_id, a_var_id)
+                   .IsApplicable(program, node_id_map));
+
+  // use_id is an identifier but not a variable user.
+  EXPECT_FALSE(MutationReplaceIdentifier(vec_member_access_id, a_var_id)
+                   .IsApplicable(program, node_id_map));
+
+  // replacement_id is invalid.
+  EXPECT_FALSE(MutationReplaceIdentifier(a_ident_id, 0)
+                   .IsApplicable(program, node_id_map));
+
+  // replacement_id is not a variable.
+  EXPECT_FALSE(MutationReplaceIdentifier(a_ident_id, sum_expr_id)
+                   .IsApplicable(program, node_id_map));
+
+  // Can't replace a variable with itself.
+  EXPECT_FALSE(MutationReplaceIdentifier(a_ident_id, a_var_id)
+                   .IsApplicable(program, node_id_map));
+
+  // Replacement is not in scope.
+  EXPECT_FALSE(MutationReplaceIdentifier(a_ident_id, b_var_id)
+                   .IsApplicable(program, node_id_map));
+  EXPECT_FALSE(MutationReplaceIdentifier(a_ident_id, e_var_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, GlobalVarNotInScope) {
+  // Can't use the global variable if it's not in scope.
+  std::string shader = R"(
+var<private> a: i32;
+
+fn f() {
+  a = 3;
+}
+
+var<private> b: i32;
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[0]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->lhs());
+  ASSERT_NE(use_id, 0);
+
+  auto replacement_id = node_id_map.GetId(program.AST().GlobalVariables()[1]);
+  ASSERT_NE(replacement_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable1) {
+  // Can't replace `a` with `b` since the store type is wrong (the same storage
+  // class though).
+  std::string shader = R"(
+var<private> a: i32;
+var<private> b: u32;
+fn f() {
+  *&a = 4;
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto replacement_id = node_id_map.GetId(program.AST().GlobalVariables()[1]);
+  ASSERT_NE(replacement_id, 0);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[0]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->lhs()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable2) {
+  // Can't replace `a` with `b` since the store type is wrong (the storage
+  // class is different though).
+  std::string shader = R"(
+var<private> a: i32;
+fn f() {
+  var b: u32;
+  *&a = 4;
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto replacement_id = node_id_map.GetId(program.AST()
+                                              .Functions()[0]
+                                              ->body()
+                                              ->statements()[0]
+                                              ->As<ast::VariableDeclStatement>()
+                                              ->variable());
+  ASSERT_NE(replacement_id, 0);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[1]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->lhs()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable3) {
+  // Can't replace `a` with `b` since the latter is not a reference (the store
+  // type is the same, though).
+  std::string shader = R"(
+var<private> a: i32;
+fn f() {
+  let b = 45;
+  *&a = 4;
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto replacement_id = node_id_map.GetId(program.AST()
+                                              .Functions()[0]
+                                              ->body()
+                                              ->statements()[0]
+                                              ->As<ast::VariableDeclStatement>()
+                                              ->variable());
+  ASSERT_NE(replacement_id, 0);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[1]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->lhs()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable4) {
+  // Can't replace `a` with `b` since the latter is not a reference (the store
+  // type is the same, though).
+  std::string shader = R"(
+var<private> a: i32;
+fn f(b: i32) {
+  *&a = 4;
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto replacement_id =
+      node_id_map.GetId(program.AST().Functions()[0]->params()[0]);
+  ASSERT_NE(replacement_id, 0);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[0]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->lhs()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable5) {
+  // Can't replace `a` with `b` since the latter has a wrong access mode
+  // (`read` for uniform storage class).
+  std::string shader = R"(
+[[block]]
+struct S {
+  a: i32;
+};
+
+var<private> a: S;
+[[group(1), binding(1)]] var<uniform> b: S;
+fn f() {
+  *&a = S(4);
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto replacement_id = node_id_map.GetId(program.AST().GlobalVariables()[1]);
+  ASSERT_NE(replacement_id, 0);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[0]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->lhs()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable6) {
+  // Can't replace `ptr_b` with `a` since the latter is not a pointer.
+  std::string shader = R"(
+[[block]]
+struct S {
+  a: i32;
+};
+
+var<private> a: S;
+[[group(1), binding(1)]] var<uniform> b: S;
+fn f() {
+  let ptr_b = &b;
+  *&a = *ptr_b;
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto replacement_id = node_id_map.GetId(program.AST().GlobalVariables()[0]);
+  ASSERT_NE(replacement_id, 0);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[1]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->rhs()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable8) {
+  // Can't replace `ptr_b` with `c` since the latter has a wrong access mode and
+  // storage class.
+  std::string shader = R"(
+[[block]]
+struct S {
+  a: i32;
+};
+
+var<private> a: S;
+[[group(1), binding(1)]] var<uniform> b: S;
+[[group(1), binding(2)]] var<storage, write> c: S;
+fn f() {
+  let ptr_b = &b;
+  *&a = *ptr_b;
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto replacement_id = node_id_map.GetId(program.AST().GlobalVariables()[2]);
+  ASSERT_NE(replacement_id, 0);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[1]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->rhs()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable9) {
+  // Can't replace `b` with `e` since the latter is not a reference.
+  std::string shader = R"(
+[[block]]
+struct S {
+  a: i32;
+};
+
+var<private> a: S;
+let e = 3;
+[[group(1), binding(1)]] var<uniform> b: S;
+fn f() {
+  *&a = *&b;
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto replacement_id = node_id_map.GetId(program.AST().GlobalVariables()[1]);
+  ASSERT_NE(replacement_id, 0);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[0]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->rhs()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable10) {
+  // Can't replace `b` with `e` since the latter has a wrong access mode.
+  std::string shader = R"(
+[[block]]
+struct S {
+  a: i32;
+};
+
+var<private> a: S;
+[[group(0), binding(0)]] var<storage, write> e: S;
+[[group(1), binding(1)]] var<uniform> b: S;
+fn f() {
+  *&a = *&b;
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto replacement_id = node_id_map.GetId(program.AST().GlobalVariables()[1]);
+  ASSERT_NE(replacement_id, 0);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[0]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->rhs()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, Applicable1) {
+  // Can replace `a` with `b` (same storage class).
+  std::string shader = R"(
+fn f() {
+  var b : vec2<u32>;
+  var a = vec2<u32>(34u, 45u);
+  (*&a)[1] = 3u;
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[2]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->lhs()
+                                      ->As<ast::ArrayAccessorExpression>()
+                                      ->array()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  auto replacement_id = node_id_map.GetId(program.AST()
+                                              .Functions()[0]
+                                              ->body()
+                                              ->statements()[0]
+                                              ->As<ast::VariableDeclStatement>()
+                                              ->variable());
+  ASSERT_NE(replacement_id, 0);
+
+  ASSERT_TRUE(MaybeApplyMutation(
+      program, MutationReplaceIdentifier(use_id, replacement_id), node_id_map,
+      &program, &node_id_map, nullptr));
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  writer::wgsl::Generator generator(&program);
+  ASSERT_TRUE(generator.Generate()) << generator.error();
+
+  std::string expected_shader = R"(fn f() {
+  var b : vec2<u32>;
+  var a = vec2<u32>(34u, 45u);
+  (*(&(b)))[1] = 3u;
+}
+)";
+  ASSERT_EQ(expected_shader, generator.result());
+}
+
+TEST(ReplaceIdentifierTest, Applicable2) {
+  // Can replace `ptr_a` with `b` - the function parameter.
+  std::string shader = R"(
+fn f(b: ptr<function, vec2<u32>>) {
+  var a = vec2<u32>(34u, 45u);
+  let ptr_a = &a;
+  (*ptr_a)[1] = 3u;
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[2]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->lhs()
+                                      ->As<ast::ArrayAccessorExpression>()
+                                      ->array()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  auto replacement_id =
+      node_id_map.GetId(program.AST().Functions()[0]->params()[0]);
+  ASSERT_NE(replacement_id, 0);
+
+  ASSERT_TRUE(MaybeApplyMutation(
+      program, MutationReplaceIdentifier(use_id, replacement_id), node_id_map,
+      &program, &node_id_map, nullptr));
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  writer::wgsl::Generator generator(&program);
+  ASSERT_TRUE(generator.Generate()) << generator.error();
+
+  std::string expected_shader = R"(fn f(b : ptr<function, vec2<u32>>) {
+  var a = vec2<u32>(34u, 45u);
+  let ptr_a = &(a);
+  (*(b))[1] = 3u;
+}
+)";
+  ASSERT_EQ(expected_shader, generator.result());
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable12) {
+  // Can't replace `a` with `b` (both are references with different storage
+  // class).
+  std::string shader = R"(
+var<private> b : vec2<u32>;
+fn f() {
+  var a = vec2<u32>(34u, 45u);
+  (*&a)[1] = 3u;
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[1]
+                                      ->As<ast::AssignmentStatement>()
+                                      ->lhs()
+                                      ->As<ast::ArrayAccessorExpression>()
+                                      ->array()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  auto replacement_id = node_id_map.GetId(program.AST().GlobalVariables()[0]);
+  ASSERT_NE(replacement_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable13) {
+  // Can't replace `a` with `b` (both are references with different storage
+  // class).
+  std::string shader = R"(
+var<private> b : vec2<u32>;
+fn f() {
+  var a = vec2<u32>(34u, 45u);
+  let c = (*&a)[1];
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[1]
+                                      ->As<ast::VariableDeclStatement>()
+                                      ->variable()
+                                      ->constructor()
+                                      ->As<ast::ArrayAccessorExpression>()
+                                      ->array()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  auto replacement_id = node_id_map.GetId(program.AST().GlobalVariables()[0]);
+  ASSERT_NE(replacement_id, 0);
+
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+TEST(ReplaceIdentifierTest, NotApplicable14) {
+  // Can't replace `ptr_a` with `ptr_b` (both are pointers with different
+  // storage class).
+  std::string shader = R"(
+var<private> b: vec2<u32>;
+fn f() {
+  var a = vec2<u32>(34u, 45u);
+  let ptr_a = &a;
+  let ptr_b = &b;
+  let c = (*ptr_a)[1];
+}
+)";
+  Source::File file("test.wgsl", shader);
+  auto program = reader::wgsl::Parse(&file);
+  ASSERT_TRUE(program.IsValid()) << program.Diagnostics().str();
+
+  NodeIdMap node_id_map(program);
+
+  auto use_id = node_id_map.GetId(program.AST()
+                                      .Functions()[0]
+                                      ->body()
+                                      ->statements()[3]
+                                      ->As<ast::VariableDeclStatement>()
+                                      ->variable()
+                                      ->constructor()
+                                      ->As<ast::ArrayAccessorExpression>()
+                                      ->array()
+                                      ->As<ast::UnaryOpExpression>()
+                                      ->expr());
+  ASSERT_NE(use_id, 0);
+
+  auto replacement_id = node_id_map.GetId(program.AST()
+                                              .Functions()[0]
+                                              ->body()
+                                              ->statements()[2]
+                                              ->As<ast::VariableDeclStatement>()
+                                              ->variable());
+  ASSERT_NE(replacement_id, 0);
+  ASSERT_FALSE(MutationReplaceIdentifier(use_id, replacement_id)
+                   .IsApplicable(program, node_id_map));
+}
+
+}  // namespace
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/mutator.cc b/fuzzers/tint_ast_fuzzer/mutator.cc
new file mode 100644
index 0000000..f8ebb7c
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mutator.cc
@@ -0,0 +1,184 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fuzzers/tint_ast_fuzzer/mutator.h"
+
+#include <cassert>
+#include <memory>
+#include <unordered_map>
+#include <utility>
+#include <vector>
+
+#include "fuzzers/tint_ast_fuzzer/mutation_finders/replace_identifiers.h"
+#include "fuzzers/tint_ast_fuzzer/node_id_map.h"
+
+#include "src/program_builder.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+namespace {
+
+template <typename T, typename... Args>
+void MaybeAddFinder(bool enable_all_mutations,
+                    ProbabilityContext* probability_context,
+                    MutationFinderList* finders,
+                    Args&&... args) {
+  if (enable_all_mutations || probability_context->RandomBool()) {
+    finders->push_back(std::make_unique<T>(std::forward<Args>(args)...));
+  }
+}
+
+MutationFinderList CreateMutationFinders(
+    ProbabilityContext* probability_context,
+    bool enable_all_mutations) {
+  MutationFinderList result;
+  do {
+    MaybeAddFinder<MutationFinderReplaceIdentifiers>(
+        enable_all_mutations, probability_context, &result);
+  } while (result.empty());
+  return result;
+}
+
+}  // namespace
+
+bool MaybeApplyMutation(const tint::Program& program,
+                        const Mutation& mutation,
+                        const NodeIdMap& node_id_map,
+                        tint::Program* out_program,
+                        NodeIdMap* out_node_id_map,
+                        protobufs::MutationSequence* mutation_sequence) {
+  assert(out_program && "`out_program` may not be a nullptr");
+  assert(out_node_id_map && "`out_node_id_map` may not be a nullptr");
+
+  if (!mutation.IsApplicable(program, node_id_map)) {
+    return false;
+  }
+
+  // The mutated `program` will be copied into the `mutated` program builder.
+  tint::ProgramBuilder mutated;
+  tint::CloneContext clone_context(&mutated, &program);
+  NodeIdMap new_node_id_map;
+  clone_context.ReplaceAll(
+      [&node_id_map, &new_node_id_map, &clone_context](ast::Node* node) {
+        // Make sure all `tint::ast::` nodes' ids are preserved.
+        auto* cloned = tint::As<ast::Node>(node->Clone(&clone_context));
+        new_node_id_map.Add(cloned, node_id_map.GetId(node));
+        return cloned;
+      });
+
+  mutation.Apply(node_id_map, &clone_context, &new_node_id_map);
+  if (mutation_sequence) {
+    *mutation_sequence->add_mutation() = mutation.ToMessage();
+  }
+
+  clone_context.Clone();
+  *out_program = tint::Program(std::move(mutated));
+  *out_node_id_map = std::move(new_node_id_map);
+  return true;
+}
+
+tint::Program Replay(tint::Program program,
+                     const protobufs::MutationSequence& mutation_sequence) {
+  assert(program.IsValid() && "Initial program is invalid");
+
+  NodeIdMap node_id_map(program);
+  for (const auto& mutation_message : mutation_sequence.mutation()) {
+    auto mutation = Mutation::FromMessage(mutation_message);
+    auto status = MaybeApplyMutation(program, *mutation, node_id_map, &program,
+                                     &node_id_map, nullptr);
+    (void)status;  // `status` will be unused in release mode.
+    assert(status && "`mutation` is inapplicable - it's most likely a bug");
+    if (!program.IsValid()) {
+      // `mutation` has a bug.
+      break;
+    }
+  }
+
+  return program;
+}
+
+tint::Program Mutate(tint::Program program,
+                     ProbabilityContext* probability_context,
+                     bool enable_all_mutations,
+                     uint32_t max_applied_mutations,
+                     protobufs::MutationSequence* mutation_sequence) {
+  assert(max_applied_mutations != 0 &&
+         "Maximum number of mutations is invalid");
+  assert(program.IsValid() && "Initial program is invalid");
+
+  // The number of allowed failed attempts to apply mutations. If this number is
+  // exceeded, the mutator is considered stuck and the mutation session is
+  // stopped.
+  const uint32_t kMaxFailureToApply = 10;
+
+  auto finders =
+      CreateMutationFinders(probability_context, enable_all_mutations);
+  NodeIdMap node_id_map(program);
+
+  // Total number of applied mutations during this call to `Mutate`.
+  uint32_t applied_mutations = 0;
+
+  // The number of consecutively failed attempts to apply mutations.
+  uint32_t failure_to_apply = 0;
+
+  // Apply mutations as long as the `program` is valid, the limit on the number
+  // of mutations is not reached and the mutator is not stuck (i.e. unable to
+  // apply any mutations for some time).
+  while (program.IsValid() && applied_mutations < max_applied_mutations &&
+         failure_to_apply < kMaxFailureToApply) {
+    // Get all applicable mutations from some mutation finder.
+    const auto& mutation_finder =
+        finders[probability_context->GetRandomIndex(finders)];
+    auto mutations = mutation_finder->FindMutations(program, node_id_map,
+                                                    probability_context);
+
+    const auto old_applied_mutations = applied_mutations;
+    for (const auto& mutation : mutations) {
+      if (!probability_context->ChoosePercentage(
+              mutation_finder->GetChanceOfApplyingMutation(
+                  probability_context))) {
+        // Skip this `mutation` probabilistically.
+        continue;
+      }
+
+      if (!MaybeApplyMutation(program, *mutation, node_id_map, &program,
+                              &node_id_map, mutation_sequence)) {
+        // This `mutation` is inapplicable. This may happen if some of the
+        // earlier mutations cancelled this one.
+        continue;
+      }
+
+      applied_mutations++;
+      if (!program.IsValid()) {
+        // This `mutation` has a bug.
+        return program;
+      }
+    }
+
+    if (old_applied_mutations == applied_mutations) {
+      // No mutation was applied. Increase the counter to prevent an infinite
+      // loop.
+      failure_to_apply++;
+    } else {
+      failure_to_apply = 0;
+    }
+  }
+
+  return program;
+}
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/mutator.h b/fuzzers/tint_ast_fuzzer/mutator.h
new file mode 100644
index 0000000..7746e6a
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/mutator.h
@@ -0,0 +1,102 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_MUTATOR_H_
+#define FUZZERS_TINT_AST_FUZZER_MUTATOR_H_
+
+#include "fuzzers/tint_ast_fuzzer/mutation.h"
+#include "fuzzers/tint_ast_fuzzer/mutation_finder.h"
+#include "fuzzers/tint_ast_fuzzer/node_id_map.h"
+#include "fuzzers/tint_ast_fuzzer/probability_context.h"
+#include "fuzzers/tint_ast_fuzzer/protobufs/tint_ast_fuzzer.h"
+#include "fuzzers/tint_ast_fuzzer/random_number_generator.h"
+
+#include "src/program.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+/// @file
+
+/// @brief Tries to apply a `mutation` to the `program`.
+///
+/// If the `mutation` is inapplicable, this function will return `false` and
+/// `out_program`, `out_node_id_map` and `mutation_sequence` won't be modified.
+///
+/// The `mutation` is required to produce a valid program when the
+/// `Mutation::Apply` method is called. This guarantees that this function
+/// returns a valid program as well.
+///
+/// @param program - the initial program (must be valid).
+/// @param mutation - the mutation that will be applied.
+/// @param node_id_map - a map from `tint::ast::` nodes in the `program` to
+///     their unique ids.
+/// @param out_program - the resulting mutated program will be written through
+///     this pointer. It may *not* be a `nullptr`. It _may_ point to `program`,
+///     so that a program can be updated in place.
+/// @param out_node_id_map - will contain new ids for the AST nodes in the
+///     mutated program. It may *not* be a `nullptr`. It _may_ point to
+///     `node_id_map`, so that a map can be updated in place.
+/// @param mutation_sequence - the message about this mutation will be recorded
+///     here. It may be a `nullptr`, in which case it's ignored.
+/// @return `true` if the `mutation` was applied.
+/// @return `false` if the `mutation` is inapplicable.
+bool MaybeApplyMutation(const tint::Program& program,
+                        const Mutation& mutation,
+                        const NodeIdMap& node_id_map,
+                        tint::Program* out_program,
+                        NodeIdMap* out_node_id_map,
+                        protobufs::MutationSequence* mutation_sequence);
+
+/// @brief Applies mutations from `mutations_sequence` to the `program`.
+///
+/// All mutations in `mutation_sequence` must be applicable. Additionally, all
+/// mutations must produce a valid program when the `Mutation::Apply` method is
+/// called. This guarantees that this function returns a valid program as well.
+///
+/// @param program - the initial program - must be valid.
+/// @param mutation_sequence - a sequence of mutations.
+/// @return the mutated program.
+tint::Program Replay(tint::Program program,
+                     const protobufs::MutationSequence& mutation_sequence);
+
+/// @brief Applies up to `max_applied_mutations` mutations to the `program`.
+///
+/// All applied mutations must produce valid programs. This guarantees that the
+/// returned program is valid as well. The returned program may be identical to
+/// the initial `program` if no mutation was applied.
+///
+/// @param program - initial program - must be valid.
+/// @param probability_context - contains information about various
+///     probabilistic behaviour of the fuzzer.
+/// @param enable_all_mutations - if `false`, only mutations from a
+///     probabilistically selected set of mutation types are applied. If `true`,
+///     all mutation types are considered.
+/// @param max_applied_mutations - the maximum number of applied mutations. This
+///     may not be 0.
+/// @param mutation_sequence - applied mutations will be recorded into this
+///     protobuf message. This argument may be `nullptr`, in which case it's
+///     ignored.
+/// @return the mutated program.
+tint::Program Mutate(tint::Program program,
+                     ProbabilityContext* probability_context,
+                     bool enable_all_mutations,
+                     uint32_t max_applied_mutations,
+                     protobufs::MutationSequence* mutation_sequence);
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
+
+#endif  // FUZZERS_TINT_AST_FUZZER_MUTATOR_H_
diff --git a/fuzzers/tint_ast_fuzzer/node_id_map.cc b/fuzzers/tint_ast_fuzzer/node_id_map.cc
new file mode 100644
index 0000000..bdb22eb
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/node_id_map.cc
@@ -0,0 +1,61 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fuzzers/tint_ast_fuzzer/node_id_map.h"
+
+#include <cassert>
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+NodeIdMap::NodeIdMap() = default;
+
+NodeIdMap::NodeIdMap(const tint::Program& program) : NodeIdMap() {
+  for (const auto* node : program.ASTNodes().Objects()) {
+    Add(node, TakeFreshId());
+  }
+}
+
+NodeIdMap::IdType NodeIdMap::GetId(const ast::Node* node) const {
+  auto it = node_to_id_.find(node);
+  return it == node_to_id_.end() ? 0 : it->second;
+}
+
+const ast::Node* NodeIdMap::GetNode(IdType id) const {
+  auto it = id_to_node_.find(id);
+  return it == id_to_node_.end() ? nullptr : it->second;
+}
+
+void NodeIdMap::Add(const ast::Node* node, IdType id) {
+  assert(!node_to_id_.count(node) && "The node already exists in the map");
+  assert(!id_to_node_.count(id) && "Id already exists in the map");
+  assert(node && "`node` can't be a nullptr");
+  assert(id && "`id` can't be equal to 0");
+
+  node_to_id_[node] = id;
+  id_to_node_[id] = node;
+  if (id >= fresh_id_) {
+    fresh_id_ = id + 1;
+  }
+}
+
+NodeIdMap::IdType NodeIdMap::TakeFreshId() {
+  assert(fresh_id_ != 0 && "`NodeIdMap` id has overflowed");
+  return fresh_id_++;
+}
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/node_id_map.h b/fuzzers/tint_ast_fuzzer/node_id_map.h
new file mode 100644
index 0000000..e6e2e3d
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/node_id_map.h
@@ -0,0 +1,89 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_NODE_ID_MAP_H_
+#define FUZZERS_TINT_AST_FUZZER_NODE_ID_MAP_H_
+
+#include <unordered_map>
+
+#include "src/program.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+/// Contains a one-to-one mapping between the nodes in the AST of the program
+/// and their ids.
+///
+/// The motivation for having this mapping is:
+/// - To be able to uniquely identify a node in the AST. This will be used
+///   to record transformations in the protobuf messages.
+/// - When the AST is being modified, only the mapping for the modified nodes
+///   must be affected. That is, if some node is unchanged, it must have the
+///   same id defined in this class.
+///
+/// This class achieves these goals partially. Concretely, the only way to
+/// change the AST is by cloning it since all instances of `tint::ast::` classes
+/// are immutable. This will invalidate all the pointers to the AST nodes which
+/// are used in this class. To overcome this, a new instance of this class is
+/// created with all the cloned nodes and the old instance is discarded.
+class NodeIdMap {
+ public:
+  /// Type of the id used by this map.
+  using IdType = uint32_t;
+
+  /// Creates an empty map.
+  NodeIdMap();
+
+  /// @brief Initializes this instance with all the nodes in the `program`.
+  /// @param program - must be valid.
+  explicit NodeIdMap(const tint::Program& program);
+
+  /// @brief Returns a node for the given `id`.
+  /// @param id - any value is accepted.
+  /// @return a pointer to some node if `id` exists in this map.
+  /// @return `nullptr` otherwise.
+  const ast::Node* GetNode(IdType id) const;
+
+  /// @brief Returns an id of the given `node`.
+  /// @param node - can be a `nullptr`.
+  /// @return not equal to 0 if `node` exists in this map.
+  /// @return 0 otherwise.
+  IdType GetId(const ast::Node* node) const;
+
+  /// @brief Adds a mapping from `node` to `id` to this map.
+  /// @param node - may not be a `nullptr` and can't be present in this map.
+  /// @param id - may not be 0 and can't be present in this map.
+  void Add(const ast::Node* node, IdType id);
+
+  /// @brief Returns an id that is guaranteed to be unoccupied in this map.
+  ///
+  /// This will effectively increase the counter. This means that two
+  /// consecutive calls to this method will return different ids.
+  ///
+  /// @return an unoccupied id.
+  IdType TakeFreshId();
+
+ private:
+  IdType fresh_id_ = 1;
+
+  std::unordered_map<const ast::Node*, IdType> node_to_id_;
+  std::unordered_map<IdType, const ast::Node*> id_to_node_;
+};
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
+
+#endif  // FUZZERS_TINT_AST_FUZZER_NODE_ID_MAP_H_
diff --git a/fuzzers/tint_ast_fuzzer/probability_context.cc b/fuzzers/tint_ast_fuzzer/probability_context.cc
new file mode 100644
index 0000000..1b38a10
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/probability_context.cc
@@ -0,0 +1,39 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fuzzers/tint_ast_fuzzer/probability_context.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+namespace {
+
+const std::pair<uint32_t, uint32_t> kChanceOfReplacingIdentifiers = {30, 70};
+
+}  // namespace
+
+ProbabilityContext::ProbabilityContext(RandomNumberGenerator* rng)
+    : rng_(rng),
+      chance_of_replacing_identifiers_(
+          RandomFromRange(kChanceOfReplacingIdentifiers)) {}
+
+uint32_t ProbabilityContext::RandomFromRange(
+    std::pair<uint32_t, uint32_t> range) {
+  assert(range.first <= range.second && "Range must be non-decreasing");
+  return range.first + rng_->RandomUint32(range.second - range.first + 1);
+}
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/probability_context.h b/fuzzers/tint_ast_fuzzer/probability_context.h
new file mode 100644
index 0000000..572f125
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/probability_context.h
@@ -0,0 +1,72 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_PROBABILITY_CONTEXT_H_
+#define FUZZERS_TINT_AST_FUZZER_PROBABILITY_CONTEXT_H_
+
+#include <utility>
+#include <vector>
+
+#include "fuzzers/tint_ast_fuzzer/random_number_generator.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+/// This class is intended to be used by the `MutationFinder`s to introduce some
+/// variance to the mutation process.
+class ProbabilityContext {
+ public:
+  /// Initializes this instance with a random number generator.
+  /// @param rng - may not be a `nullptr`. Must remain in scope as long as this
+  ///     instance exists.
+  explicit ProbabilityContext(RandomNumberGenerator* rng);
+
+  /// @copydoc RandomNumberGenerator::RandomBool
+  bool RandomBool() { return rng_->RandomBool(); }
+
+  /// @copydoc RandomNumberGenerator::ChoosePercentage
+  bool ChoosePercentage(uint32_t percentage) {
+    return rng_->ChoosePercentage(percentage);
+  }
+
+  /// Returns a random value in the range `[0; arr.size())`.
+  /// @tparam T - type of the elements in the vector.
+  /// @param arr - may not be empty.
+  /// @return the random index in the `arr`.
+  template <typename T>
+  size_t GetRandomIndex(const std::vector<T>& arr) {
+    return static_cast<size_t>(rng_->RandomUint64(arr.size()));
+  }
+
+  /// @return the probability of replacing some identifier with some other one.
+  uint32_t GetChanceOfReplacingIdentifiers() const {
+    return chance_of_replacing_identifiers_;
+  }
+
+ private:
+  /// @param range - a pair of integers `a` and `b` s.t. `a <= b`.
+  /// @return an random number in the range `[a; b]`.
+  uint32_t RandomFromRange(std::pair<uint32_t, uint32_t> range);
+
+  RandomNumberGenerator* rng_;
+
+  uint32_t chance_of_replacing_identifiers_;
+};
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
+
+#endif  // FUZZERS_TINT_AST_FUZZER_PROBABILITY_CONTEXT_H_
diff --git a/fuzzers/tint_ast_fuzzer/protobufs/tint_ast_fuzzer.h b/fuzzers/tint_ast_fuzzer/protobufs/tint_ast_fuzzer.h
new file mode 100644
index 0000000..9439ed3
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/protobufs/tint_ast_fuzzer.h
@@ -0,0 +1,33 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_PROTOBUFS_TINT_AST_FUZZER_H_
+#define FUZZERS_TINT_AST_FUZZER_PROTOBUFS_TINT_AST_FUZZER_H_
+
+// Compilation of the protobuf library and its autogenerated code can produce
+// warnings. Ignore them since we can't control them.
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wunused-parameter"
+#pragma clang diagnostic ignored "-Wreserved-id-macro"
+#pragma clang diagnostic ignored "-Wsign-conversion"
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
+#pragma clang diagnostic ignored "-Wextra-semi-stmt"
+#pragma clang diagnostic ignored "-Winconsistent-missing-destructor-override"
+#pragma clang diagnostic ignored "-Wweak-vtables"
+
+#include "fuzzers/tint_ast_fuzzer/protobufs/tint_ast_fuzzer.pb.h"
+
+#pragma clang diagnostic pop
+
+#endif  // FUZZERS_TINT_AST_FUZZER_PROTOBUFS_TINT_AST_FUZZER_H_
diff --git a/fuzzers/tint_ast_fuzzer/protobufs/tint_ast_fuzzer.proto b/fuzzers/tint_ast_fuzzer/protobufs/tint_ast_fuzzer.proto
new file mode 100644
index 0000000..3682a0c
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/protobufs/tint_ast_fuzzer.proto
@@ -0,0 +1,48 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package tint.fuzzers.ast_fuzzer.protobufs;
+
+message Mutation {
+  oneof mutation { MutationReplaceIdentifier replace_identifier = 1; };
+}
+
+message MutationSequence {
+  repeated Mutation mutation = 1;
+}
+
+message MutatorState {
+  // Contains the state of the fuzzer.
+
+  // The program that is being fuzzed. This can be either
+  // the original program (if mutation sequence is available) or
+  // the mutated version (if mutations are being recorded).
+  string program = 1;
+
+  // The sequence of mutations that was applied to the `program`.
+  // This may not have any mutations if they are not being recorded.
+  MutationSequence mutation_sequence = 2;
+}
+
+message MutationReplaceIdentifier {
+  // This transformation replaces a use of one variable with another.
+
+  // The id of the use of a variable in the AST.
+  uint32 use_id = 1;
+
+  // The id of a definition of a variable to replace the use with.
+  uint32 replacement_id = 2;
+}
diff --git a/fuzzers/tint_ast_fuzzer/random_number_generator.cc b/fuzzers/tint_ast_fuzzer/random_number_generator.cc
new file mode 100644
index 0000000..6d32e38
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/random_number_generator.cc
@@ -0,0 +1,37 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "fuzzers/tint_ast_fuzzer/random_number_generator.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+RandomNumberGenerator::~RandomNumberGenerator() = default;
+
+bool RandomNumberGenerator::RandomBool() {
+  return RandomUint32(2);
+}
+
+bool RandomNumberGenerator::ChoosePercentage(uint32_t percentage) {
+  assert(percentage <= 100 && "|percentage| is invalid");
+  // 100 is used as a bound instead of 101 because otherwise it would be
+  // possible to return `false` when `percentage == 100` holds. This would
+  // happen when the result of `RandomUint32` is 100 as well.
+  return RandomUint32(100) < percentage;
+}
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
diff --git a/fuzzers/tint_ast_fuzzer/random_number_generator.h b/fuzzers/tint_ast_fuzzer/random_number_generator.h
new file mode 100644
index 0000000..27b1b54
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/random_number_generator.h
@@ -0,0 +1,57 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_RANDOM_NUMBER_GENERATOR_H_
+#define FUZZERS_TINT_AST_FUZZER_RANDOM_NUMBER_GENERATOR_H_
+
+#include <cassert>
+#include <cstdint>
+#include <vector>
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+
+/// Abstracts away the underlying algorithm that is used to generate random
+/// numbers.
+class RandomNumberGenerator {
+ public:
+  /// Virtual destructor.
+  virtual ~RandomNumberGenerator();
+
+  /// @brief Compute a random `uint32_t` value in the range `[0; bound)`.
+  /// @param bound - the upper exclusive bound for the computed integer
+  ///     (must be positive).
+  /// @return the random number.
+  virtual uint32_t RandomUint32(uint32_t bound) = 0;
+
+  /// @brief Compute a random `uint64_t` value in the range `[0; bound)`.
+  /// @param bound - the upper exclusive bound for the computed integer
+  ///     (must be positive).
+  /// @return the random number.
+  virtual uint64_t RandomUint64(uint64_t bound) = 0;
+
+  /// @return a randomly generated boolean value.
+  bool RandomBool();
+
+  /// @param percentage - must be in the range `[0; 100]`.
+  /// @return `true` with `percentage` probability.
+  bool ChoosePercentage(uint32_t percentage);
+};
+
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
+
+#endif  // FUZZERS_TINT_AST_FUZZER_RANDOM_NUMBER_GENERATOR_H_
diff --git a/fuzzers/tint_ast_fuzzer/util.h b/fuzzers/tint_ast_fuzzer/util.h
new file mode 100644
index 0000000..ec2f5ee
--- /dev/null
+++ b/fuzzers/tint_ast_fuzzer/util.h
@@ -0,0 +1,107 @@
+// Copyright 2021 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef FUZZERS_TINT_AST_FUZZER_UTIL_H_
+#define FUZZERS_TINT_AST_FUZZER_UTIL_H_
+
+#include <vector>
+
+#include "src/ast/module.h"
+#include "src/ast/variable_decl_statement.h"
+#include "src/program.h"
+#include "src/sem/block_statement.h"
+#include "src/sem/statement.h"
+#include "src/sem/variable.h"
+
+namespace tint {
+namespace fuzzers {
+namespace ast_fuzzer {
+namespace util {
+/// @file
+
+/// @brief Returns all in-scope variables (including formal function parameters)
+/// related to statement `curr_stmt`.
+///
+/// These variables are additionally filtered by applying a predicate `pred`.
+///
+/// @tparam Pred - a predicate that accepts a `const sem::Variable*` and returns
+///     `bool`.
+/// @param program - the program to look for variables in.
+/// @param curr_stmt - the current statement. Everything below it is not in
+///     scope.
+/// @param pred - a predicate (e.g. a function pointer, functor, lambda etc) of
+///     type `Pred`.
+/// @return a vector of all variables that can be accessed from `curr_stmt`.
+template <typename Pred>
+std::vector<const sem::Variable*> GetAllVarsInScope(
+    const tint::Program& program,
+    const sem::Statement* curr_stmt,
+    Pred&& pred) {
+  std::vector<const sem::Variable*> result;
+
+  // Walk up the hierarchy of blocks in which `curr_stmt` is contained.
+  for (const auto* block = curr_stmt->Block(); block; block = block->Block()) {
+    for (const auto* stmt : *block->Declaration()) {
+      if (stmt == curr_stmt->Declaration()) {
+        // `curr_stmt` was found. This is only possible if `block is the
+        // enclosing block of `curr_stmt` since the AST nodes are not shared.
+        // Because of all this, skip the iteration of the inner loop since
+        // the rest of the instructions in the `block` are not visible from the
+        // `curr_stmt`.
+        break;
+      }
+
+      if (const auto* var_node = tint::As<ast::VariableDeclStatement>(stmt)) {
+        const auto* sem_var = program.Sem().Get(var_node->variable());
+        if (pred(sem_var)) {
+          result.push_back(sem_var);
+        }
+      }
+    }
+  }
+
+  // Process function parameters.
+  for (const auto* param : curr_stmt->Function()->params()) {
+    const auto* sem_var = program.Sem().Get(param);
+    if (pred(sem_var)) {
+      result.push_back(sem_var);
+    }
+  }
+
+  // Global variables do not belong to any ast::BlockStatement.
+  for (const auto* global_decl : program.AST().GlobalDeclarations()) {
+    if (global_decl == curr_stmt->Function()) {
+      // The same situation as in the previous loop. The current function has
+      // been reached. If there are any variables declared below, they won't be
+      // visible in this function. Thus, exit the loop.
+      break;
+    }
+
+    if (const auto* global_var = tint::As<ast::Variable>(global_decl)) {
+      const auto* sem_node = program.Sem().Get(global_var);
+      if (pred(sem_node)) {
+        result.push_back(sem_node);
+      }
+    }
+  }
+
+  return result;
+}
+
+}  // namespace util
+}  // namespace ast_fuzzer
+}  // namespace fuzzers
+}  // namespace tint
+
+#endif  // FUZZERS_TINT_AST_FUZZER_UTIL_H_
diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt
index 230d66e..fcf025d 100644
--- a/third_party/CMakeLists.txt
+++ b/third_party/CMakeLists.txt
@@ -17,8 +17,11 @@
   add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/googletest EXCLUDE_FROM_ALL)
 endif()
 
-if (${TINT_BUILD_SPIRV_TOOLS_FUZZER} AND (NOT TARGET protobuf::libprotobuf OR NOT TARGET protobuf::protoc))
-  set(SPIRV_BUILD_FUZZER ON CACHE BOOL "Build spirv-fuzz")
+if ((${TINT_BUILD_SPIRV_TOOLS_FUZZER} OR ${TINT_BUILD_AST_FUZZER}) AND
+    (NOT TARGET protobuf::libprotobuf OR NOT TARGET protobuf::protoc))
+  if (${TINT_BUILD_SPIRV_TOOLS_FUZZER})
+    set(SPIRV_BUILD_FUZZER ON CACHE BOOL "Build spirv-fuzz")
+  endif()
   set(protobuf_BUILD_TESTS OFF CACHE BOOL "Disable protobuf tests")
   set(protobuf_MSVC_STATIC_RUNTIME OFF CACHE BOOL "Do not build protobuf static runtime")
   add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/protobuf/cmake)
