diff --git a/src/ifcopenshell-python/ifcopenshell/__init__.py b/src/ifcopenshell-python/ifcopenshell/__init__.py
index a16a20e100..6543a7e5d1 100644
--- a/src/ifcopenshell-python/ifcopenshell/__init__.py
+++ b/src/ifcopenshell-python/ifcopenshell/__init__.py
@@ -66,8 +66,4 @@ def create_entity(type,*args,**kwargs):
for idx, arg in attrs: e[idx] = arg
return e
-
-version = ifcopenshell_wrapper.version()
-schema_identifier = ifcopenshell_wrapper.schema_identifier()
-get_supertype = ifcopenshell_wrapper.get_supertype
-get_log = ifcopenshell_wrapper.get_log
+from .main import *
diff --git a/src/ifcopenshell-python/ifcopenshell/main.py b/src/ifcopenshell-python/ifcopenshell/main.py
new file mode 100644
index 0000000000..197c5bf95e
--- /dev/null
+++ b/src/ifcopenshell-python/ifcopenshell/main.py
@@ -0,0 +1,25 @@
+###############################################################################
+# #
+# This file is part of IfcOpenShell. #
+# #
+# IfcOpenShell is free software: you can redistribute it and/or modify #
+# it under the terms of the Lesser GNU General Public License as published by #
+# the Free Software Foundation, either version 3.0 of the License, or #
+# (at your option) any later version. #
+# #
+# IfcOpenShell is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# Lesser GNU General Public License for more details. #
+# #
+# You should have received a copy of the Lesser GNU General Public License #
+# along with this program. If not, see . #
+# #
+###############################################################################
+
+from . import ifcopenshell_wrapper
+
+version = ifcopenshell_wrapper.version()
+schema_identifier = ifcopenshell_wrapper.schema_identifier()
+get_supertype = ifcopenshell_wrapper.get_supertype
+get_log = ifcopenshell_wrapper.get_log
diff --git a/src/ifcopenshell-python/ifcopenshell/template.py b/src/ifcopenshell-python/ifcopenshell/template.py
new file mode 100644
index 0000000000..a4f08c9cdd
--- /dev/null
+++ b/src/ifcopenshell-python/ifcopenshell/template.py
@@ -0,0 +1,80 @@
+###############################################################################
+# #
+# This file is part of IfcOpenShell. #
+# #
+# IfcOpenShell is free software: you can redistribute it and/or modify #
+# it under the terms of the Lesser GNU General Public License as published by #
+# the Free Software Foundation, either version 3.0 of the License, or #
+# (at your option) any later version. #
+# #
+# IfcOpenShell is distributed in the hope that it will be useful, #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
+# Lesser GNU General Public License for more details. #
+# #
+# You should have received a copy of the Lesser GNU General Public License #
+# along with this program. If not, see . #
+# #
+###############################################################################
+
+import time
+import uuid
+
+from .file import file
+from .guid import compress
+from . import main
+
+# A quick way to setup an 'empty' IFC file, taken from:
+# http://academy.ifcopenshell.org/creating-a-simple-wall-with-property-set-and-quantity-information/
+TEMPLATE = """ISO-10303-21;
+HEADER;
+FILE_DESCRIPTION(('ViewDefinition [CoordinationView]'),'2;1');
+FILE_NAME('%(filename)s','%(timestring)s',('%(creator)s'),('%(organization)s'),'%(application)s','%(application)s','');
+FILE_SCHEMA(('%(schema_identifier)s'));
+ENDSEC;
+DATA;
+#1=IFCPERSON($,$,'%(creator)s',$,$,$,$,$);
+#2=IFCORGANIZATION($,'%(organization)s',$,$,$);
+#3=IFCPERSONANDORGANIZATION(#1,#2,$);
+#4=IFCAPPLICATION(#2,'%(application_version)s','%(application)s','');
+#5=IFCOWNERHISTORY(#3,#4,$,.ADDED.,$,#3,#4,%(timestamp)s);
+#6=IFCDIRECTION((1.,0.,0.));
+#7=IFCDIRECTION((0.,0.,1.));
+#8=IFCCARTESIANPOINT((0.,0.,0.));
+#9=IFCAXIS2PLACEMENT3D(#8,#7,#6);
+#10=IFCDIRECTION((0.,1.,0.));
+#11=IFCGEOMETRICREPRESENTATIONCONTEXT($,'Model',3,1.E-05,#9,#10);
+#12=IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
+#13=IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
+#14=IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
+#15=IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
+#16=IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
+#17=IFCMEASUREWITHUNIT(IFCPLANEANGLEMEASURE(0.017453292519943295),#16);
+#18=IFCCONVERSIONBASEDUNIT(#12,.PLANEANGLEUNIT.,'DEGREE',#17);
+#19=IFCUNITASSIGNMENT((#13,#14,#15,#18));
+#20=IFCPROJECT('%(project_globalid)s',#5,'%(project_name)s',$,$,$,$,(#11),#19);
+ENDSEC;
+END-ISO-10303-21;
+"""
+
+DEFAULTS = {
+ "application": lambda d: 'IfcOpenShell-%s' % main.version,
+ "application_version": lambda d: main.version,
+ "project_globalid": lambda d: compress(uuid.uuid4().hex),
+ "schema_identifier": lambda d: main.schema_identifier,
+ "timestamp": lambda d: time.time(),
+ "timestring": lambda d: time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime(d.get('timestamp') or time.time()))
+}
+
+def create(filename=None, timestring=None, organization=None, creator=None,\
+ schema_identifier=None, application_version=None, timestamp=None,\
+ application=None, project_globalid=None, project_name=None):
+
+ d = dict(locals())
+ def _():
+ for var, value in d.items():
+ if value is None:
+ yield var, DEFAULTS.get(var, lambda *args: '')(d)
+ d.update(dict(_()))
+
+ return file.from_string(TEMPLATE % d)