diff --git a/Code/Mantid/Build/CMake/MantidUtils.cmake b/Code/Mantid/Build/CMake/MantidUtils.cmake
index 666b5ba2ad517b462434fafe0af545a53eeee57b..16bb99ff8c9d6cc5b163da6ed19d8c066b4c32a9 100644
--- a/Code/Mantid/Build/CMake/MantidUtils.cmake
+++ b/Code/Mantid/Build/CMake/MantidUtils.cmake
@@ -72,6 +72,7 @@ endfunction( ADD_COMPILE_PY_TARGET )
 #   - INSTALLED_FILES :: An output variable containing the list of copied
 #                        files including their full paths
 function( COPY_PYTHON_FILES_TO_DIR PY_FILES SRC_DIR DEST_DIR INSTALLED_FILES )
+    set ( COPIED_FILES ${${INSTALLED_FILES}} )
     foreach ( PYFILE ${PY_FILES} )
         get_filename_component( _basefilename ${PYFILE} NAME_WE )
         set( _py_src ${SRC_DIR}/${PYFILE} )
diff --git a/Code/Mantid/Framework/PythonInterface/mantid/kernel/CMakeLists.txt b/Code/Mantid/Framework/PythonInterface/mantid/kernel/CMakeLists.txt
index 445d99575a9d551b1ebfaf414b1a866354564c64..58cce7ae488f7bb674569b860dc6664676b717df 100644
--- a/Code/Mantid/Framework/PythonInterface/mantid/kernel/CMakeLists.txt
+++ b/Code/Mantid/Framework/PythonInterface/mantid/kernel/CMakeLists.txt
@@ -94,6 +94,7 @@ set ( PY_FILES
   __init__.py
   _aliases.py
   dlopen.py
+  environment.py
   funcreturns.py
   plugins.py
 )
@@ -105,11 +106,9 @@ create_module ( ${MODULE_TEMPLATE} ${CMAKE_CURRENT_BINARY_DIR}/kernel.cpp EXPORT
                 SRC_FILES )
 
 #############################################################################################
-# Copy over the pure Python files for the module
+# Add rule to copy over the pure Python files for the module
 #############################################################################################
-# Set the destination directory
 set ( OUTPUT_DIR ${PYTHON_PKG_ROOT}/kernel )
-
 copy_python_files_to_dir ( "${PY_FILES}" ${CMAKE_CURRENT_SOURCE_DIR} ${OUTPUT_DIR} 
                            PYTHON_INSTALL_FILES )
 
@@ -137,12 +136,44 @@ endif()
   add_dependencies( PythonKernelModule _dlopen )
 endif()
 
+#############################################################################################
+# Generate the nexuslib module for the build
+#############################################################################################
+set ( NEXUSLIB_PY nexuslib )
+set ( NEXUSLIB ${NEXUS_C_LIBRARIES} )
+if ( WIN32 ) #.lib -> .dll
+  string ( REPLACE ".lib" ".dll" NEXUSLIB ${NEXUSLIB} )
+endif()
+
+# Build version
+configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/${NEXUSLIB_PY}.py.in ${CMAKE_CURRENT_BINARY_DIR}/${NEXUSLIB_PY}.py )
+if ( WIN32 OR APPLE )
+  # NeXus library is in the same place relative to the Python library
+  get_filename_component ( NEXUSLIB_FILE ${NEXUSLIB} NAME )
+  set ( NEXUSLIB ../../${NEXUSLIB_FILE} )
+endif()
+# Install version
+configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/${NEXUSLIB_PY}.py.in ${CMAKE_CURRENT_BINARY_DIR}/${NEXUSLIB_PY}.install.py )
+
+# Copy over in post-build so that it is not automatically included for installation. We need
+# to use a different file for install, which is handled below
+add_custom_command ( TARGET PythonKernelModule POST_BUILD
+                     COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different
+                     ${CMAKE_CURRENT_BINARY_DIR}/${NEXUSLIB_PY}.py ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${CMAKE_CFG_INTDIR}/mantid/kernel 
+                     COMMAND ${PYTHON_EXECUTABLE} ARGS -m compileall ${CMAKE_CURRENT_BINARY_DIR}/${NEXUSLIB_PY}.install.py )
 
 ###########################################################################
 # Installation settings
 ###########################################################################
-install ( TARGETS PythonKernelModule ${SYSTEM_PACKAGE_TARGET} DESTINATION ${BIN_DIR}/mantid/kernel )
+install ( TARGETS PythonKernelModule ${SYSTEM_PACKAGE_TARGET} DESTINATION 
+          ${BIN_DIR}/mantid/kernel )
 if ( UNIX )
-install ( TARGETS _dlopen DESTINATION ${BIN_DIR}/mantid/kernel )
+  install ( TARGETS _dlopen DESTINATION ${BIN_DIR}/mantid/kernel )
 endif()
 
+# nexuslib.py & nexuslib.pyc
+install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/${NEXUSLIB_PY}.install.py DESTINATION
+          ${BIN_DIR}/mantid/kernel RENAME ${NEXUSLIB_PY}.py )
+# .pyc file
+install ( FILES ${CMAKE_CURRENT_BINARY_DIR}/${NEXUSLIB_PY}.install.pyc DESTINATION
+          ${BIN_DIR}/mantid/kernel RENAME ${NEXUSLIB_PY}.pyc )
\ No newline at end of file
diff --git a/Code/Mantid/Framework/PythonInterface/mantid/kernel/__init__.py b/Code/Mantid/Framework/PythonInterface/mantid/kernel/__init__.py
index 023e9d4a7b73afc10e37f33b5733e8d1199cd55d..c2e9724e4f1a1f037ab746034e4c4b26951bd9a8 100644
--- a/Code/Mantid/Framework/PythonInterface/mantid/kernel/__init__.py
+++ b/Code/Mantid/Framework/PythonInterface/mantid/kernel/__init__.py
@@ -14,10 +14,19 @@ import os as _os
 clib = _os.path.join(_os.path.dirname(__file__), '_kernel.so')
 flags = _dlopen.setup_dlopen(clib, ['libMantidKernel']) 
 from _kernel import *
-dlopen.restore_flags(flags)
+_dlopen.restore_flags(flags)
 ###############################################################################
 
+###############################################################################
+# Set the path to the NeXus C library. It is required by the nxs package so
+# make it a little bit easier for our users
+###############################################################################
+import nexuslib as _nexuslib
+_nexuslib.set_NEXUSLIB_var()
+
 ###############################################################################
 # Make modules available in this namespace
 ###############################################################################
+import environment
+import funcreturns
 from _aliases import *
diff --git a/Code/Mantid/Framework/PythonInterface/mantid/kernel/dlopen.py b/Code/Mantid/Framework/PythonInterface/mantid/kernel/dlopen.py
index 0a238526e454b9d06e1d9a6200271a5a2464d4c2..56ade6d59a2a5f45a885f00a409776245c3b68fb 100644
--- a/Code/Mantid/Framework/PythonInterface/mantid/kernel/dlopen.py
+++ b/Code/Mantid/Framework/PythonInterface/mantid/kernel/dlopen.py
@@ -7,20 +7,20 @@ For Mantid this ensures the singleton symbols are wired up correctly
 """
 import sys
 import os
-import platform
+import environment
 
 #######################################################################
 # Ensure the correct Mantid shared libaries are found when loading the
 # python shared libraries
 #######################################################################
-if sys.platform.startswith('win32'):
+if environment.is_windows():
     _var = 'PATH'
     _sep = ';'
 else:
     _sep = ':'
-    if sys.platform.startswith('linux'):
+    if environment.is_linux():
         _var = 'LD_LIBRARY_PATH'
-    elif sys.platform.startswith('darwin'):
+    elif environment.is_mac():
         _var = 'DYLD_LIBRARY_PATH'
     else: # Give it a go how it is
         _var = ''
@@ -54,7 +54,8 @@ def setup_dlopen(library, depends=[]):
     
     Returns the original flags
     """
-    if os.name == 'nt': return None
+    if environment.is_windows():
+      return None
     old_flags = sys.getdlopenflags()
 
     import _dlopen
@@ -64,7 +65,7 @@ def setup_dlopen(library, depends=[]):
     _bin = os.path.join(os.path.abspath(os.path.dirname(__file__)), '../../')
     
     def get_libpath(mainlib, dependency):
-        if platform.system() == 'Linux':
+        if environment.is_linux():
             cmd = 'ldd %s | grep %s' % (mainlib, dependency)
             subp = subprocess.Popen(cmd,stdout=subprocess.PIPE,
                                     stderr=subprocess.STDOUT,shell=True)
@@ -77,14 +78,14 @@ def setup_dlopen(library, depends=[]):
         return libpath
 
     library_var = "LD_LIBRARY_PATH"
-    if platform.system() == 'Darwin':
+    if environment.is_mac():
         library_var = 'DY' + library_var
     ldpath = os.environ.get(library_var, "")
     ldpath += ":" + _bin
     os.environ[library_var] = ldpath
 
     pythonlib = library
-    if platform.system() == "Linux":
+    if environment.is_linux():
         # stdc++ has to be loaded first or exceptions don't get translated 
         # properly across bounadries
         # NeXus has to be loaded as well as there seems to be an issue with
@@ -97,7 +98,7 @@ def setup_dlopen(library, depends=[]):
         dlloader(get_libpath(pythonlib, dep))
 
     oldflags = sys.getdlopenflags()
-    if platform.system() == "Darwin":
+    if environment.is_mac():
         try:
             import dl
             RTLD_LOCAL = dl.RTLD_LOCAL
@@ -113,5 +114,6 @@ def restore_flags(flags):
     """Restores the dlopen flags to those provided,
     usually with the results from a call to setup_dlopen
     """
-    if flags is None: return
+    if flags is None:
+        return
     sys.setdlopenflags(flags)
diff --git a/Code/Mantid/Framework/PythonInterface/mantid/kernel/nexuslib.py.in b/Code/Mantid/Framework/PythonInterface/mantid/kernel/nexuslib.py.in
new file mode 100644
index 0000000000000000000000000000000000000000..98499f3b195139c3e0f068b2626b471dcd3943f4
--- /dev/null
+++ b/Code/Mantid/Framework/PythonInterface/mantid/kernel/nexuslib.py.in
@@ -0,0 +1,23 @@
+"""
+    ===== AUTO-GENERATED MODULE ====
+
+    Defines a function that sets the NEXUSLIB environment variable required 
+    by the nxs package. The variable  value is set by CMake
+"""
+
+def set_NEXUSLIB_var():
+    """
+        Sets the NEXUSLIB environment variable to point to the NeXus shared library
+    """
+    import os as _os
+    _nexuslib = r"@NEXUSLIB@"
+    if _nexuslib == "": 
+        return
+
+    if not _os.path.isabs(_nexuslib):
+        # Assume relative to this file
+        thisdir = _os.path.dirname(__file__)
+        _nexuslib = _os.path.normpath(_os.path.join(thisdir, _nexuslib))
+
+    # Add to current environment
+    _os.environ['NEXUSLIB'] = _nexuslib