diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..e4f8e93
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,6 @@
+[submodule ".module/edk2"]
+	path = .module/edk2
+	url = git://github.com/tianocore/edk2
+[submodule "FatPkg"]
+	path = FatPkg
+	url = git://github.com/tianocore/edk2-FatPkg
diff --git a/.module/edk2 b/.module/edk2
new file mode 160000
index 0000000..366845a
--- /dev/null
+++ b/.module/edk2
@@ -0,0 +1 @@
+Subproject commit 366845ab2a7a9d70dcfb251d6935dfa8442943e4
diff --git a/BaseTools b/BaseTools
new file mode 120000
index 0000000..7c8795c
--- /dev/null
+++ b/BaseTools
@@ -0,0 +1 @@
+.module/edk2/BaseTools
\ No newline at end of file
diff --git a/CryptoPkg b/CryptoPkg
new file mode 120000
index 0000000..1119819
--- /dev/null
+++ b/CryptoPkg
@@ -0,0 +1 @@
+.module/edk2/CryptoPkg
\ No newline at end of file
diff --git a/EdkShellBinPkg b/EdkShellBinPkg
new file mode 120000
index 0000000..05ae006
--- /dev/null
+++ b/EdkShellBinPkg
@@ -0,0 +1 @@
+.module/edk2/EdkShellBinPkg
\ No newline at end of file
diff --git a/FatPkg b/FatPkg
new file mode 160000
index 0000000..aac0302
--- /dev/null
+++ b/FatPkg
@@ -0,0 +1 @@
+Subproject commit aac0302cad3a31e33e1febd57a6d50a7744e7d30
diff --git a/IntelFrameworkModulePkg b/IntelFrameworkModulePkg
new file mode 120000
index 0000000..742339b
--- /dev/null
+++ b/IntelFrameworkModulePkg
@@ -0,0 +1 @@
+.module/edk2/IntelFrameworkModulePkg
\ No newline at end of file
diff --git a/IntelFrameworkPkg b/IntelFrameworkPkg
new file mode 120000
index 0000000..1d357bd
--- /dev/null
+++ b/IntelFrameworkPkg
@@ -0,0 +1 @@
+.module/edk2/IntelFrameworkPkg
\ No newline at end of file
diff --git a/MdeModulePkg b/MdeModulePkg
new file mode 120000
index 0000000..cacf150
--- /dev/null
+++ b/MdeModulePkg
@@ -0,0 +1 @@
+.module/edk2/MdeModulePkg
\ No newline at end of file
diff --git a/MdePkg b/MdePkg
new file mode 120000
index 0000000..9326ffd
--- /dev/null
+++ b/MdePkg
@@ -0,0 +1 @@
+.module/edk2/MdePkg
\ No newline at end of file
diff --git a/PcAtChipsetPkg b/PcAtChipsetPkg
new file mode 120000
index 0000000..61fe94a
--- /dev/null
+++ b/PcAtChipsetPkg
@@ -0,0 +1 @@
+.module/edk2/PcAtChipsetPkg
\ No newline at end of file
diff --git a/SecurityPkg b/SecurityPkg
new file mode 120000
index 0000000..82bc654
--- /dev/null
+++ b/SecurityPkg
@@ -0,0 +1 @@
+.module/edk2/SecurityPkg
\ No newline at end of file
diff --git a/ShellPkg b/ShellPkg
new file mode 120000
index 0000000..bd623b5
--- /dev/null
+++ b/ShellPkg
@@ -0,0 +1 @@
+.module/edk2/ShellPkg
\ No newline at end of file
diff --git a/SourceLevelDebugPkg b/SourceLevelDebugPkg
new file mode 120000
index 0000000..c1867d0
--- /dev/null
+++ b/SourceLevelDebugPkg
@@ -0,0 +1 @@
+.module/edk2/SourceLevelDebugPkg
\ No newline at end of file
diff --git a/UefiCpuPkg b/UefiCpuPkg
new file mode 120000
index 0000000..8b6e747
--- /dev/null
+++ b/UefiCpuPkg
@@ -0,0 +1 @@
+.module/edk2/UefiCpuPkg
\ No newline at end of file
diff --git a/svn_externals.txt b/svn_externals.txt
deleted file mode 100755
index 613f4d0..0000000
--- a/svn_externals.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-BaseTools               -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/BaseTools
-MdePkg                  -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/MdePkg
-MdeModulePkg            -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/MdeModulePkg
-IntelFrameworkPkg       -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/IntelFrameworkPkg
-IntelFrameworkModulePkg -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/IntelFrameworkModulePkg
-EdkShellBinPkg          -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/EdkShellBinPkg
-PcAtChipsetPkg          -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/PcAtChipsetPkg
-UefiCpuPkg              -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/UefiCpuPkg
-ShellPkg                -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/ShellPkg
-SourceLevelDebugPkg     -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/SourceLevelDebugPkg
-CryptoPkg               -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/CryptoPkg
-SecurityPkg             -r13937 http://svn.code.sf.net/p/edk2/code/branches/UDK2010.SR1/SecurityPkg
-FatPkg                  -r67    http://svn.code.sf.net/p/edk2-fatdriver2/code/trunk/FatPkg
diff --git a/svn_setup.py b/svn_setup.py
deleted file mode 100755
index 85cc63d..0000000
--- a/svn_setup.py
+++ /dev/null
@@ -1,232 +0,0 @@
-#!/usr/bin/env python
-
-# Copyright (c) 2013 Intel Corporation.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in
-# the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Intel Corporation nor the names of its
-# contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# Marc Herbert
-
-from __future__ import print_function
-
-import os
-import shutil
-import stat
-import sys
-import subprocess
-import time
-import tempfile
-
-DEBUG=False
-SVN_EXTERNALS_FILE = "svn_externals.txt"
-
-
-def isWindows():
-    return os.name == 'nt'
-
-def info(*objs):
-    print("INFO: ",    *objs, end='\n', file=sys.stdout)
-    sys.stdout.flush()
-def warning(*objs):
-    print("WARNING: ", *objs, end='\n', file=sys.stdout)
-    sys.stdout.flush()
-def error(*objs):
-    print("ERROR: ",   *objs, end='\n', file=sys.stderr)
-    sys.stderr.flush()
-
-def die(*objs):
-    error(*objs)
-    if isWindows():
-        subprocess.call("cmd /c PAUSE")
-    sys.exit(1)
-
-#import inspect
-#info("Running ", os.path.abspath(inspect.getsourcefile(mainf)))    
-
-DOTDOT = os.path.dirname(os.getcwd())
-CLONE_BASENAME = os.path.basename(os.getcwd())
-ADHOC  = CLONE_BASENAME + "-svn_externals.repo"
-# '@' is a special character for subversion (peg revisions)
-ADHOC = ADHOC.replace('@', '_at_')
-ADHOC_PATH = os.path.join(DOTDOT, ADHOC)
-
-# info("Parent directory:", DOTDOT)
-info("Ad-hoc SVN repo:", ADHOC_PATH)
-
-
-def my_system(args):
-
-    if DEBUG:
-        info("About to run:", args)
-        time.sleep(2)
-    else:
-        info("Running:", ' '.join(args))
-
-    # - stdout: Python has no portable, non-blocking read operation on
-    # pipes so we cannot capture long, progress information on the
-    # fly. So we just let stdout be inherited.
-    # http://www.python.org/dev/peps/pep-3145/
-        
-    # -stderr: On the other hand we assume stderr will be small and
-    # final and want to know if there is any error message all, so we
-    # block-read on it.  As a bonus feature this gets rid of the extra
-    # command window on Windows.
-    child = subprocess.Popen(args, stderr=subprocess.PIPE)
-    err = child.stderr.read()
-    child.wait()
-
-    if err:
-        die("stderr output of: ", args, "\n", err)
-
-    if child.returncode:
-        die(args, "returned: ", child.returncode)
-
-    if DEBUG:
-        info("Done running:", args)
-        time.sleep(2)
-
-
-def setup_externals():
-    
-    # Try something harmless first to make sure the command line is
-    # installed and in the PATH
-    try:
-        info("SVN version:")
-        subprocess.check_call(["svn", "--version", "--quiet"])
-    except BaseException as e:
-        print (type(e).__name__ + ":", e)
-        die("Failed to run Subversion command line, please make sure it is installed and in the PATH")
-
-    # Make room
-    for old_dir in [ '.svn', ADHOC_PATH ]:
-        if os.path.exists(old_dir):
-            warning("Removing older", old_dir)
-            for p, dirs, files in os.walk(old_dir):
-                for f in files:
-                    # print (os.path.join(p,f))
-                    os.chmod(os.path.join(p,f), stat.S_IWRITE)
-
-            shutil.rmtree(old_dir)
-
-
-    my_system([ "svnadmin", "create", ADHOC_PATH ])
-
-    my_system([ "svn", "checkout", "file:///" + ADHOC_PATH, os.path.join(os.getcwd(), ADHOC) ])
-
-    # Don't do this at home
-    shutil.move(os.path.join(ADHOC, '.svn'), '.')
-    os.rmdir(ADHOC)
-
-    # Note: if you want ever want to do this from TortoiseSVN graphical
-    # interface go to the "New->Advanced->Load" menu item in the
-    # Properties dialog box
-    my_system([ "svn", "propset", "svn:externals", "-F", SVN_EXTERNALS_FILE, "." ])
-    my_system([ "svn", "commit", "--depth", "empty", "--message", "Add svn:externals", "." ])
-
-
-def get_external_dirs():
-    "Parses the SVN_EXTERNALS_FILE and returns the list of directories from it"
-
-    def get_dir(external):
-        location = external.split()[-1]
-        return os.path.split(location)[-1]
-
-    with open(SVN_EXTERNALS_FILE) as f:
-        return [ get_dir(lin) for lin in f ]
-
-
-def parse_arguments():
-    from optparse import OptionParser
-    parser = OptionParser(usage="usage: %prog [options]")
-    parser.add_option("--gitignore", action="store_true", dest="gitignore",
-                  help="Appends SVN objects to .gitignore (does not commit)")
-    parser.add_option("--download", action="store_true", dest="download",
-                  help="Runs svn update to download externals once setup is complete (takes time)")
-    parser.add_option("--delete",  action="store_true", dest="wipeout",
-                  help="Deletes everything that is or would be in the way of --download. \
-This is a destructive way to help --download succeed. \
-Does NOT imply --download: both can be used independently")
-
-    (options, args) = parser.parse_args()
-
-    # Gather parsed command line and defaults and define the parameters 
-    global svn_update, wipeout, gitignore
-    svn_update, wipeout, gitignore = options.download, options.wipeout, options.gitignore
-
-
-def mainf(*m_args):
-    # Overrides sys.argv when testing (interactive or in main below)
-    if m_args:
-        info("testing with args:", m_args)
-        sys.argv = ["testing main"] + list(m_args)
-
-    parse_arguments()
-
-    setup_externals()
-
-    # svn:ignore the stuff tracked by git
-    # TODO: could this somehow work on Windows with Git Extensions?
-    if os.path.exists(".git") and not isWindows():
-        with tempfile.NamedTemporaryFile(prefix="setupSVNext_") as tempf:
-            subprocess.check_call(["git", "ls-tree", "HEAD", "--name-only"], stdout=tempf)
-            tempf.write(b'.git')
-            my_system([ "svn", "propset", "svn:ignore", "-F", tempf.name, "." ])
-
-    # .gitignore the stuff tracked by svn
-    if gitignore:
-        info("Updating .gitignore")
-        with open (".gitignore", 'a') as gi:
-            ignored = get_external_dirs() + [ '.svn' ]
-            for dir in ignored:
-                print('/' + dir, file=gi )
-
-    if wipeout:
-        ext_directories = get_external_dirs()
-        for e in ext_directories:
-            if os.path.exists(e):
-                warning("Now removing previous ", e, "/")
-                shutil.rmtree(e)
-
-    if svn_update:
-        my_system([ "svn", "update" ])
-
-
-if __name__ == "__main__":
-    if True: # make it False to run test code below
-        ret = mainf()
-    else:
-        # Test/sample invocations (can test multiple in one run)
-        # mainf("--help")
-        ret = mainf(--gitignore)
-        # ret = mainf("--wipeout", "--download")
-        # mainf("--download")
-
-    if isWindows():
-        # We assume the user double-clicked on the script and we give a chance to see what happened
-        # Before the window goes away
-        subprocess.call("cmd /c PAUSE")
-
-    sys.exit(ret)
