diff --git a/scripts/updateVcpkgPackage.py b/scripts/updateVcpkgPackage.py
new file mode 100644
index 0000000..299e9f3
--- /dev/null
+++ b/scripts/updateVcpkgPackage.py
@@ -0,0 +1,114 @@
+#!/usr/bin/env python
+
+import io, os, re, sys, subprocess
+import hashlib
+
+from scriptCommon import catchPath
+from releaseCommon import Version
+
+print(catchPath)
+
+default_path = '../vcpkg/ports/catch/'
+
+def adjusted_path(path):
+    return os.path.join(catchPath, path)
+
+def get_hash(path):
+    BUFF_SIZE = 65536
+    sha512 = hashlib.sha512()
+    # The newlines should be normalized into \n, which is what we want
+    # If reused use 'rb' with a file written with io.open(newline='\n')
+    with open(path, 'r') as f:
+        while True:
+            data = f.read(BUFF_SIZE)
+            if not data:
+                break
+            if sys.version_info[0] < 3:
+                sha512.update(data)
+            else:
+                sha512.update(data.encode('utf-8'))
+    return sha512.hexdigest()
+
+def update_control(path):
+    v = Version()
+    ver_string = v.getVersionString()
+
+    # Update control
+    lines = []
+    control_path = os.path.join(path, 'CONTROL')
+    with open(control_path, 'r') as f:
+        for line in f:
+            lines.append(line)
+    with open(control_path, 'w') as f:
+        for line in lines:
+            if 'Version: ' in line:
+                line = 'Version: {}\n'.format(v.getVersionString())
+            f.write(line)
+
+def update_portfile(path, header_hash, licence_hash):
+    print('Updating portfile')
+    v = Version()
+    ver_string = v.getVersionString()
+
+    # Update portfile
+    lines = []
+    portfile_path = os.path.join(path, 'portfile.cmake')
+    with open(portfile_path, 'r') as f:
+        for line in f:
+            lines.append(line)
+    with open(portfile_path, 'w') as f:
+        # Two things we need to change/update
+        # 1) Link and hash of releaseCommon
+        # 2) Link and hash of licence
+        # We could assume licence never changes, but where is the fun in that?
+        first_hash = True
+        for line in lines:
+            # Check what we are updating
+            if 'vcpkg_download_distfile' in line:
+                kind = line.split('(')[-1].strip()
+                print(kind)
+
+            # Deal with URLS
+            if 'URLS' in line and kind == 'HEADER':
+                line = '    URLS "https://github.com/philsquared/Catch/releases/download/v{}/catch.hpp"\n'.format(v.getVersionString())
+            if 'URLS' in line and kind == 'LICENSE':
+                line = '    URLS "https://raw.githubusercontent.com/philsquared/Catch/v{}/LICENSE.txt"\n'.format(v.getVersionString())
+
+            # Deal with hashes
+            if 'SHA512' in line and kind == 'HEADER':
+                line = '    SHA512 {}\n'.format(header_hash)
+            if 'SHA512' in line and kind == 'LICENSE':
+                line = '    SHA512 {}\n'.format(licence_hash)
+            f.write(line)
+
+
+def git_push(path_to_repo):
+    v = Version()
+    ver_string = v.getVersionString()
+
+    # Move to the repo dir
+    old_path = os.getcwd()
+    os.chdir(path_to_repo)
+
+    # Work with git
+    # Make sure we branch off master
+    subprocess.call('git checkout master', shell=True)
+    
+    # Update repo to current master, so we don't work off old version of the portsfile 
+    subprocess.call('git pull Microsoft master', shell=True)
+
+    # Create a new branch for the update
+    subprocess.call('git checkout -b catch-{}'.format(ver_string), shell=True)
+    # Add changed files (should be only our files)
+    subprocess.call('git add -u .', shell=True)
+    # Create a commit with these changes
+    subprocess.call('git commit -m "Update Catch to {}"'.format(ver_string), shell=True)
+    # Don't push, so author can review
+    print('Changes were commited to the vcpkg fork. Please check, push and open PR.')
+
+header_hash = get_hash(adjusted_path('single_include/catch.hpp'))
+licence_hash = get_hash(adjusted_path('LICENSE.txt'))
+update_control(adjusted_path(default_path))
+update_portfile(adjusted_path(default_path), header_hash, licence_hash)
+
+git_push(adjusted_path('../vcpkg'))
