diff --git a/common/create_project.py b/common/create_project.py
new file mode 100755
index 0000000..3c4cb4a
--- /dev/null
+++ b/common/create_project.py
@@ -0,0 +1,161 @@
+#!/usr/bin/env python3
+#-----------------------------------------------------------------------
+# create_project.py
+#-----------------------------------------------------------------------
+#
+# Create a project in the form preferred by open_pdks.
+#
+#---------------------------------------------------------------------
+# Written by Tim Edwards
+# March 15, 2021
+# Version 1.0
+#---------------------------------------------------------------------
+
+import os
+import re
+import sys
+import json
+
+def usage():
+    print('Usage:')
+    print('	create_project.py <project_name> [<pdk_name>] [-options]')
+    print('')
+    print('Arguments:')
+    print('	<project_name> is the name of the project and the top-level directory')
+    print('	<pdk_name> is the name of the PDK')
+    print('')
+    print('     <pdk_name> can be a full path to the PDK')
+    print('     <project_name> can be a full path to the project, otherwise use cwd.')
+    print('')
+    print('Options:')
+    print('	-help	Print this help text.')
+
+# Main procedure
+
+if __name__ == '__main__':
+
+    # Parse command line for options and arguments
+    optionlist = []
+    arguments = []
+    for item in sys.argv[1:]:
+        if item.find('-', 0) == 0:
+            optionlist.append(item)
+        else:
+            arguments.append(item)
+
+    if len(arguments) > 0:
+        projectname = arguments[0]
+        if len(arguments) > 1:
+            pdkname = arguments[1]
+        else:
+            pdkname = None
+    else:
+        usage()
+        sys.exit(0)
+
+    if pdkname:
+        if pdkname.startswith('/'):
+            pdkpath = pdkname
+        else:
+            pdkpath = os.path.join('PREFIX', 'pdk', pdkname)
+    else:
+        try:
+            pdkpath = os.getenv()['PDK_PATH']
+        except:
+            try:
+                pdkpath = os.getenv()['PDKPATH']
+            except:
+                print('If PDK name is not specified, then PDKPATH must be set.')
+                sys.exit(1)
+
+    if not os.path.isdir(pdkpath):
+        print('Path to PDK ' + pdkpath + ' does not exist or is not readable.')
+        sys.exit(1)
+
+    for item in optionlist:
+        result = item.split('=')
+        if result[0] == '-help':
+            usage()
+            sys.exit(0)
+        else:
+            usage()
+            sys.exit(1)
+
+    if projectname.startswith('/'):
+        projectpair = os.path.split(projectname)
+        projectparent = projectpair[0]
+        projectname = projectpair[1]
+    else:
+        projectparent = os.getcwd()
+
+    if not os.path.isdir(projectparent):
+        print('Path to project ' + projectpath + ' does not exist or is not readable.')
+        sys.exit(1)
+
+    projectpath = os.path.join(projectparent, projectname)
+
+    # Check that files to be linked to exist in the PDK
+    if not os.path.isfile(pdkpath + '/libs.tech/magic/' + pdkname + '.magicrc'):
+        print(pdkname + '.magicrc not found;  not installing.')
+        domagic = False
+    else:
+        domagic = True
+
+    if not os.path.isfile(pdkpath + '/libs.tech/netgen/' + pdkname + '_setup.tcl'):
+        print(pdkname + '_setup.tcl for netgen not found;  not installing.')
+        donetgen = False
+    else:
+        donetgen = True
+
+    if not os.path.isfile(pdkpath + '/libs.tech/xschem/xschemrc'):
+        print('xschemrc for xschem not found;  not installing.')
+        doxschem = False
+    else:
+        doxschem = True
+
+    if not os.path.isfile(pdkpath + '/libs.tech/ngspice/spinit'):
+        print('spinit for ngspice not found;  not installing.')
+        dongspice = False
+    else:
+        dongspice = True
+
+    if domagic or donetgen or doxschem or dongspice:
+        print('Creating project ' + projectname)
+        os.makedirs(projectpath)
+    else:
+        print('No setup files were found . . .  bailing.')
+        sys.exit(1)
+
+    if domagic:
+        magpath = os.path.join(projectpath, 'mag')
+        os.makedirs(magpath)
+        os.symlink(pdkpath + '/libs.tech/magic/' + pdkname + '.magicrc',
+		magpath + '/.magicrc')
+
+    if doxschem:
+        xschempath = os.path.join(projectpath, 'xschem')
+        os.makedirs(xschempath)
+        os.symlink(pdkpath + '/libs.tech/xschem/xschemrc',
+		xschempath + '/xschemrc')
+
+    if donetgen:
+        netgenpath = os.path.join(projectpath, 'netgen')
+        os.makedirs(netgenpath)
+        os.symlink(pdkpath + '/libs.tech/netgen/' + pdkname + '_setup.tcl',
+		netgenpath + '/setup.tcl')
+
+    if dongspice:
+        ngspicepath = os.path.join(projectpath, 'ngspice')
+        os.makedirs(ngspicepath)
+        os.symlink(pdkpath + '/libs.tech/ngspice/spinit',
+		ngspicepath + '/.spiceinit')
+
+    with open(projectpath + '/info.yaml', 'w') as ofile:
+        print('---', file=ofile)
+        print('project:', file=ofile)
+        print('   description: "(Add project description here)"', file=ofile)
+        print('   process: "' + pdkname + '"', file=ofile)
+        print('   project_name: "' + projectname + '"', file=ofile)
+        
+    print('Done!')
+    sys.exit(0)
