diff --git a/.circleci/config.yml b/.circleci/config.yml
index 5ede2699b2d5..c924de1ef6c7 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -243,6 +243,7 @@ step-persist-data-for-tests: &step-persist-data-for-tests
 
       # Build artifacts
       - src/out/Default/dist.zip
+      - src/out/Default/mksnapshot.zip
       - src/out/Default/gen/node_headers
 
 step-electron-dist-unzip: &step-electron-dist-unzip
@@ -254,6 +255,13 @@ step-electron-dist-unzip: &step-electron-dist-unzip
       # TODO(alexeykuzmin): Remove '-o' when it's no longer needed.
       unzip -o dist.zip
 
+step-mksnapshot-unzip: &step-mksnapshot-unzip
+  run:
+    name: Unzip mksnapshot.zip
+    command: |
+      cd src/out/Default
+      unzip -o mksnapshot.zip
+
 step-ffmpeg-gn-gen: &step-ffmpeg-gn-gen
   run:
     name: ffmpeg GN gen
@@ -282,6 +290,13 @@ step-ffmpeg-store: &step-ffmpeg-store
     path: src/out/ffmpeg/ffmpeg.zip
     destination: ffmpeg.zip
 
+step-verify-mksnapshot: &step-verify-mksnapshot
+  run:
+    name: Verify mksnapshot
+    command: |
+      cd src
+      python electron/script/verify-mksnapshot.py --source-root "$PWD" --build-dir out/Default
+
 step-setup-linux-for-headless-testing: &step-setup-linux-for-headless-testing
   run:
     name: Setup for headless testing
@@ -473,6 +488,10 @@ steps-electron-build-for-tests: &steps-electron-build-for-tests
 
     - *step-show-sccache-stats
 
+    # mksnapshot
+    - *step-mksnapshot-build
+    - *step-mksnapshot-store
+
     # Save all data needed for a further tests run.
     - *step-persist-data-for-tests
 
@@ -619,12 +638,25 @@ steps-verify-ffmpeg: &steps-verify-ffmpeg
     - *step-verify-ffmpeg
     - *step-maybe-notify-slack-failure
 
+steps-verify-mksnapshot: &steps-verify-mksnapshot
+  steps:
+    - attach_workspace:
+        at: .
+    - *step-depot-tools-add-to-path
+    - *step-electron-dist-unzip
+    - *step-mksnapshot-unzip
+    - *step-setup-linux-for-headless-testing
+
+    - *step-verify-mksnapshot
+    - *step-maybe-notify-slack-failure
+
 steps-tests: &steps-tests
   steps:
     - attach_workspace:
         at: .
     - *step-depot-tools-add-to-path
     - *step-electron-dist-unzip
+    - *step-mksnapshot-unzip
     - *step-setup-linux-for-headless-testing
     - *step-install-nodejs-on-mac
 
@@ -650,6 +682,8 @@ steps-tests: &steps-tests
     - store_test_results:
         path: src/junit
 
+    - *step-verify-mksnapshot
+
     - *step-maybe-notify-slack-failure
 
 # Mac build are different in a few ways:
@@ -690,6 +724,8 @@ steps-build-mac: &steps-build-mac
     # to store all gn's dependencies and configs.
     - *step-verify-ffmpeg
 
+    - *step-verify-mksnapshot
+
     # Node.js headers for tests
     - *step-nodejs-headers-build
 
@@ -1018,6 +1054,13 @@ jobs:
       <<: *env-send-slack-notifications
     <<: *steps-verify-ffmpeg
 
+  linux-x64-verify-mksnapshot:
+    <<: *machine-linux-medium
+    environment:
+      <<: *env-headless-testing
+      <<: *env-send-slack-notifications
+    <<: *steps-verify-mksnapshot
+
   linux-ia32-testing-tests:
     <<: *machine-linux-medium
     environment:
@@ -1042,6 +1085,14 @@ jobs:
       <<: *env-send-slack-notifications
     <<: *steps-verify-ffmpeg
 
+  linux-ia32-verify-mksnapshot:
+    <<: *machine-linux-medium
+    environment:
+      <<: *env-ia32
+      <<: *env-headless-testing
+      <<: *env-send-slack-notifications
+    <<: *steps-verify-mksnapshot
+
   osx-testing-tests:
     <<: *machine-mac
     environment:
@@ -1164,6 +1215,9 @@ workflows:
           requires:
             - linux-x64-release
             - linux-x64-ffmpeg
+      - linux-x64-verify-mksnapshot:
+          requires:
+            - linux-x64-release
       - linux-x64-chromedriver:
           requires:
             - linux-checkout
@@ -1188,6 +1242,9 @@ workflows:
           requires:
             - linux-ia32-release
             - linux-ia32-ffmpeg
+      - linux-ia32-verify-mksnapshot:
+          requires:
+            - linux-ia32-release
       - linux-ia32-chromedriver:
           requires:
             - linux-checkout
diff --git a/appveyor.yml b/appveyor.yml
index cad691dff4c0..647e38ee9488 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -82,6 +82,7 @@ test_script:
         $env:RUN_TESTS="true"
       }
   - if "%RUN_TESTS%"=="true" ( echo Verifying non proprietary ffmpeg & python electron\script\verify-ffmpeg.py --build-dir out\Default --source-root %cd% --ffmpeg-path out\ffmpeg )
+  - if "%RUN_TESTS%"=="true" ( echo Verifying mksnapshot & python electron\script\verify-mksnapshot.py --build-dir out\Default --source-root %cd% )
   - ps: >-
       if ($env:RUN_TESTS -eq 'true') {
         New-Item .\out\Default\gen\node_headers\Release -Type directory
diff --git a/script/verify-mksnapshot.py b/script/verify-mksnapshot.py
new file mode 100755
index 000000000000..66f8f68c97d5
--- /dev/null
+++ b/script/verify-mksnapshot.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python
+import argparse
+import glob
+import os
+import shutil
+import subprocess
+import sys
+
+from lib.util import get_electron_branding, rm_rf, scoped_cwd
+
+PROJECT_NAME = get_electron_branding()['project_name']
+PRODUCT_NAME = get_electron_branding()['product_name']
+SOURCE_ROOT = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
+SNAPSHOT_SOURCE = os.path.join(SOURCE_ROOT, 'spec', 'fixtures', 'testsnap.js')
+
+def main():
+  args = parse_args()
+
+  source_root = os.path.abspath(args.source_root)
+  initial_app_path = os.path.join(source_root, args.build_dir)
+  app_path = create_app_copy(initial_app_path)
+
+  returncode = 0
+  try:
+    with scoped_cwd(app_path):
+      mkargs = [ get_binary_path('mksnapshot', app_path), \
+                   SNAPSHOT_SOURCE, '--startup_blob', 'snapshot_blob.bin', \
+                   '--turbo_instruction_scheduling' ]
+      subprocess.check_call(mkargs)
+      print 'ok mksnapshot successfully created snapshot_blob.bin.'
+      context_snapshot = 'v8_context_snapshot.bin'
+      context_snapshot_path = os.path.join(app_path, context_snapshot)
+      gen_binary = get_binary_path('v8_context_snapshot_generator', \
+                                   app_path)
+      genargs = [ gen_binary, \
+                 '--output_file={0}'.format(context_snapshot_path) ]
+      subprocess.check_call(genargs)
+      print 'ok v8_context_snapshot_generator successfully created ' \
+            + context_snapshot
+
+      test_path = os.path.join(SOURCE_ROOT, 'spec', 'fixtures', \
+                               'snapshot-items-available.js')
+
+      if sys.platform == 'darwin':
+        bin_files = glob.glob(os.path.join(app_path, '*.bin'))
+        app_dir = os.path.join(app_path, '{0}.app'.format(PRODUCT_NAME))
+        electron = os.path.join(app_dir, 'Contents', 'MacOS', PRODUCT_NAME)
+        bin_out_path = os.path.join(app_dir, 'Contents', 'Frameworks',
+                  '{0} Framework.framework'.format(PROJECT_NAME),
+                  'Resources')
+        for bin_file in bin_files:
+          shutil.copy2(bin_file, bin_out_path)
+      elif sys.platform == 'win32':
+        electron = os.path.join(app_path, '{0}.exe'.format(PROJECT_NAME))
+      else:
+        electron = os.path.join(app_path, PROJECT_NAME)
+
+      subprocess.check_call([electron, test_path])
+      print 'ok successfully used custom snapshot.'
+  except subprocess.CalledProcessError as e:
+    print 'not ok an error was encountered while testing mksnapshot.'
+    print e
+    returncode = e.returncode
+  except KeyboardInterrupt:
+    print 'Other error'
+    returncode = 0
+
+  return returncode
+
+
+# Create copy of app to install custom snapshot
+def create_app_copy(initial_app_path):
+  print 'Creating copy of app for testing'
+  app_path = os.path.join(os.path.dirname(initial_app_path),
+                          os.path.basename(initial_app_path)
+                          + '-mksnapshot-test')
+
+  rm_rf(app_path)
+  shutil.copytree(initial_app_path, app_path, symlinks=True)
+  return app_path
+
+def get_binary_path(binary_name, root_path):
+  if sys.platform == 'win32':
+    binary_path = os.path.join(root_path, '{0}.exe'.format(binary_name))
+  else:
+    binary_path = os.path.join(root_path, binary_name)
+  return binary_path
+
+def parse_args():
+  parser = argparse.ArgumentParser(description='Test mksnapshot')
+  parser.add_argument('-b', '--build-dir',
+                      help='Path to an Electron build folder. \
+                          Relative to the --source-root.',
+                      default=None,
+                      required=True)
+  parser.add_argument('--source-root',
+                      default=SOURCE_ROOT,
+                      required=False)
+  return parser.parse_args()
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/spec/fixtures/snapshot-items-available.js b/spec/fixtures/snapshot-items-available.js
new file mode 100644
index 000000000000..03675fa6680f
--- /dev/null
+++ b/spec/fixtures/snapshot-items-available.js
@@ -0,0 +1,20 @@
+// Verifies that objects contained in custom snapshot are accessible in Electron.
+
+const { app } = require('electron')
+
+app.once('ready', () => {
+  try {
+    const testValue = f() // eslint-disable-line no-undef
+    if (testValue === 86) {
+      console.log('ok test snapshot successfully loaded.')
+      app.exit(0)
+    } else {
+      console.log('not ok test snapshot could not be successfully loaded.')
+      app.exit(1)
+    }
+    return
+  } catch (ex) {
+    console.log('Error running custom snapshot', ex)
+    app.exit(1)
+  }
+})
diff --git a/spec/fixtures/testsnap.js b/spec/fixtures/testsnap.js
new file mode 100644
index 000000000000..394aa9f4d802
--- /dev/null
+++ b/spec/fixtures/testsnap.js
@@ -0,0 +1,3 @@
+// taken from https://chromium.googlesource.com/v8/v8.git/+/HEAD/test/cctest/test-serialize.cc#1127
+function f () { return g() * 2 } // eslint-disable-line no-unused-vars
+function g () { return 43 }
diff --git a/vsts.yml b/vsts.yml
index e01f069a8036..4fddc0920f05 100644
--- a/vsts.yml
+++ b/vsts.yml
@@ -129,6 +129,13 @@ jobs:
     condition: and(succeeded(), eq(variables['RUN_TESTS'], '1'))
     timeoutInMinutes: 5
 
+  - bash: |
+      cd src
+      python electron/script/verify-mksnapshot.py --source-root "$PWD" --build-dir out/Default
+    displayName: Verify non proprietary ffmpeg
+    condition: and(succeeded(), eq(variables['RUN_TESTS'], '1'))
+    timeoutInMinutes: 5
+
   - bash: |
       cd src
       ninja -C out/Default electron:electron_dist_zip
@@ -195,6 +202,13 @@ jobs:
       ArtifactName: Default
     timeoutInMinutes: 1
 
+  - task: PublishBuildArtifacts@1
+    displayName: Publish Build Artifacts (mksnapshot.zip)
+    inputs:
+      PathtoPublish: '$(System.DefaultWorkingDirectory)/src/out/Default/mksnapshot.zip'
+      ArtifactName: Default
+    timeoutInMinutes: 1
+
   - bash: |
       echo $BUILD_SOURCEVERSION > revision
     displayName: Save exact revision