diff --git a/Testing/SystemTests/tests/analysis/ValidateFacilitiesFile.py b/Testing/SystemTests/tests/analysis/ValidateFacilitiesFile.py
deleted file mode 100644
index df511c193dada8a86ecc32843cacf87d58de6778..0000000000000000000000000000000000000000
--- a/Testing/SystemTests/tests/analysis/ValidateFacilitiesFile.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Mantid Repository : https://github.com/mantidproject/mantid
-#
-# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
-#     NScD Oak Ridge National Laboratory, European Spallation Source
-#     & Institut Laue - Langevin
-# SPDX - License - Identifier: GPL - 3.0 +
-#pylint: disable=no-init,invalid-name
-from __future__ import (absolute_import, division, print_function)
-from mantid import config
-import os
-import systemtesting
-
-
-EXPECTED_EXT = '.expected'
-
-
-class ValidateFacilitiesFile(systemtesting.MantidSystemTest):
-
-    def skipTests(self):
-        try:
-            import minixsv # noqa
-        except ImportError:
-            return True
-        return False
-
-    def runTest(self):
-        """Main entry point for the test suite"""
-        from minixsv import pyxsval
-        direc = config['instrumentDefinition.directory']
-        filename = os.path.join(direc,'Facilities.xml')
-        xsdFile =  os.path.join(direc,'Schema/Facilities/1.0/','FacilitiesSchema.xsd')
-
-        # run the tests
-        failed = []
-        try:
-            print("----------------------------------------")
-            print("Validating Facilities.xml")
-            pyxsval.parseAndValidateXmlInput(filename, xsdFile=xsdFile, validateSchema=0)
-        except Exception as e:
-            print("VALIDATION OF Facilities.xml FAILED WITH ERROR:")
-            print(e)
-            failed.append(filename)
-
-        # final say on whether or not it 'worked'
-        print("----------------------------------------")
-        if len(failed) != 0:
-            print("SUMMARY OF FAILED FILES")
-            raise RuntimeError("Failed Validation of Facilities.xml")
-        else:
-            print("Successfully Validated Facilities.xml")
diff --git a/Testing/SystemTests/tests/analysis/ValidateGroupingFiles.py b/Testing/SystemTests/tests/analysis/ValidateGroupingFiles.py
deleted file mode 100644
index c1e72fc4e27c3891c04fc6d52f3182ad51e889f8..0000000000000000000000000000000000000000
--- a/Testing/SystemTests/tests/analysis/ValidateGroupingFiles.py
+++ /dev/null
@@ -1,70 +0,0 @@
-# Mantid Repository : https://github.com/mantidproject/mantid
-#
-# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
-#     NScD Oak Ridge National Laboratory, European Spallation Source
-#     & Institut Laue - Langevin
-# SPDX - License - Identifier: GPL - 3.0 +
-#pylint: disable=no-init
-from __future__ import (absolute_import, division, print_function)
-from mantid import config
-import os
-import systemtesting
-import glob
-
-EXPECTED_EXT = '.expected'
-
-
-class ValidateGroupingFiles(systemtesting.MantidSystemTest):
-
-    xsdFile =''
-
-    def skipTests(self):
-        try:
-            import minixsv # noqa
-        except ImportError:
-            return True
-        return False
-
-    def __getDataFileList__(self):
-        # get a list of directories to look in
-        direc = config['instrumentDefinition.directory']
-        direc =  os.path.join(direc,'Grouping')
-        print("Looking for Grouping files in: %s" % direc)
-        cwd = os.getcwd()
-        os.chdir(direc)
-        myFiles = glob.glob("*Grouping*.xml")
-        os.chdir(cwd)
-        files = []
-        for filename in myFiles:
-            files.append(os.path.join(direc, filename))
-        return files
-
-    def runTest(self):
-        """Main entry point for the test suite"""
-        from minixsv import pyxsval
-        direc = config['instrumentDefinition.directory']
-        self.xsdFile =  os.path.join(direc,'Schema/Grouping/1.0/','GroupingSchema.xsd')
-        files = self.__getDataFileList__()
-
-        # run the tests
-        failed = []
-        for filename in files:
-            try:
-                print("----------------------------------------")
-                print("Validating '%s'" % filename)
-                pyxsval.parseAndValidateXmlInput(filename, xsdFile=self.xsdFile, validateSchema=0)
-            except Exception as err:
-                print("VALIDATION OF '%s' FAILED WITH ERROR:" % filename)
-                print(err)
-                failed.append(filename)
-
-        # final say on whether or not it 'worked'
-        print("----------------------------------------")
-        if len(failed) != 0:
-            print("SUMMARY OF FAILED FILES")
-            for filename in failed:
-                print(filename)
-            raise RuntimeError("Failed Validation for %d of %d files"
-                               % (len(failed), len(files)))
-        else:
-            print("Successfully Validated %d files" % len(files))
diff --git a/Testing/SystemTests/tests/analysis/ValidateInstrumentDefinitionFiles.py b/Testing/SystemTests/tests/analysis/ValidateInstrumentDefinitionFiles.py
deleted file mode 100644
index 0f68e5f18086381b618323d457327c6a7b911992..0000000000000000000000000000000000000000
--- a/Testing/SystemTests/tests/analysis/ValidateInstrumentDefinitionFiles.py
+++ /dev/null
@@ -1,113 +0,0 @@
-# Mantid Repository : https://github.com/mantidproject/mantid
-#
-# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
-#     NScD Oak Ridge National Laboratory, European Spallation Source
-#     & Institut Laue - Langevin
-# SPDX - License - Identifier: GPL - 3.0 +
-#pylint: disable=invalid-name
-#pylint: disable=no-init
-from __future__ import (absolute_import, division, print_function)
-from mantid import config
-import os
-import systemtesting
-import glob
-
-
-EXPECTED_EXT = '.expected'
-
-
-class ValidateInstrumentDefinitionFiles(systemtesting.MantidSystemTest):
-
-    xsdFile=''
-    # Explicitly specify single file to test. If None, test all.
-    theFileToTest=None #"MARI_Definition.xml"
-
-    def skipTests(self):
-        try:
-            from genxmlif import GenXmlIfError # noqa
-            from minixsv import pyxsval # noqa
-        except ImportError:
-            return True
-        return False
-
-    def __getDataFileList__(self):
-        # get a list of directories to look in
-        direc = config['instrumentDefinition.directory']
-        print("Looking for instrument definition files in: %s" % direc)
-        cwd = os.getcwd()
-        os.chdir(direc)
-        myFiles = glob.glob("*Definition*.xml")
-        os.chdir(cwd)
-        files = []
-        for filename in myFiles:
-            files.append(os.path.join(direc, filename))
-        return files
-
-    def runTest(self):
-        """Main entry point for the test suite"""
-        from minixsv import pyxsval
-        # need to extend minixsv library to add method for that forces it to
-        # validate against local schema when the xml file itself has
-        # reference to schema online. The preference is to systemtest against
-        # a local schema file to avoid this systemtest failing is
-        # external url temporariliy not available. Secondary it also avoid
-        # having to worry about proxies.
-
-        #pylint: disable=too-few-public-methods
-        class MyXsValidator(pyxsval.XsValidator):
-            ########################################
-            # force validation of XML input against local file
-            #
-            def validateXmlInputForceReadFile (self, xmlInputFile, inputTreeWrapper, xsdFile):
-                xsdTreeWrapper = self.parse (xsdFile)
-                xsdTreeWrapperList = []
-                xsdTreeWrapperList.append(xsdTreeWrapper)
-                self._validateXmlInput (xmlInputFile, inputTreeWrapper, xsdTreeWrapperList)
-                for xsdTreeWrapper in xsdTreeWrapperList:
-                    xsdTreeWrapper.unlink()
-                return inputTreeWrapper
-
-        def parseAndValidateXmlInputForceReadFile(inputFile, xsdFile=None, **kw):
-            myXsValidator = MyXsValidator(**kw)
-            # parse XML input file
-            inputTreeWrapper = myXsValidator.parse (inputFile)
-            # validate XML input file
-            return myXsValidator.validateXmlInputForceReadFile (inputFile, inputTreeWrapper, xsdFile)
-
-        direc = config['instrumentDefinition.directory']
-        self.xsdFile =  os.path.join(direc,'Schema/IDF/1.0/','IDFSchema.xsd')
-        if self.theFileToTest is None:
-            files = self.__getDataFileList__()
-        else:
-            files = [os.path.join(direc,self.theFileToTest)]
-
-        # run the tests
-        failed = []
-        for filename in files:
-            try:
-                print("----------------------------------------")
-                print("Validating '%s'" % filename)
-                parseAndValidateXmlInputForceReadFile(filename, xsdFile=self.xsdFile)
-            except Exception as e:
-                print("VALIDATION OF '%s' FAILED WITH ERROR:" % filename)
-                print(e)
-                failed.append(filename)
-
-        # final say on whether or not it 'worked'
-        print("----------------------------------------")
-        if len(failed) != 0:
-            print("SUMMARY OF FAILED FILES")
-            for filename in failed:
-                print(filename)
-            raise RuntimeError("Failed Validation for %d of %d files"
-                               % (len(failed), len(files)))
-        else:
-            print("Successfully Validated %d files" % len(files))
-
-
-if __name__ == '__main__':
-
-    valid = ValidateInstrumentDefinitionFiles()
-    # validate specific file
-    #valid.theFileToTest = "MARI_Definition.xml"
-    valid.runTest()
diff --git a/Testing/SystemTests/tests/analysis/ValidateInstrumentDir.py b/Testing/SystemTests/tests/analysis/ValidateInstrumentDir.py
new file mode 100644
index 0000000000000000000000000000000000000000..de86b57a08d5649d5b3fee3d0134587bae298235
--- /dev/null
+++ b/Testing/SystemTests/tests/analysis/ValidateInstrumentDir.py
@@ -0,0 +1,122 @@
+# Mantid Repository : https://github.com/mantidproject/mantid
+#
+# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
+#     NScD Oak Ridge National Laboratory, European Spallation Source
+#     & Institut Laue - Langevin
+# SPDX - License - Identifier: GPL - 3.0 +
+#pylint: disable=invalid-name
+#pylint: disable=no-init
+from __future__ import (absolute_import, division, print_function)
+
+import glob
+import os
+
+from mantid import config
+import six
+import systemtesting
+
+if six.PY2:
+    from io import open  # noqa
+
+# Constants
+FILE_TO_TEST = None  # "MARI_Definition.xml"
+INSTRUMENT_DIR = config['instrumentDefinition.directory']
+
+
+class ValidateXML(object):
+
+    def skipTests(self):
+        try:
+            import lxml  # noqa
+        except ImportError:
+            return True
+
+        return False
+
+    def runTest(self):
+        """Main entry point for the test suite"""
+        from lxml import etree
+
+        # read local schema
+        xsd_file = open(self.xsdpath(), "r", encoding="utf-8")
+        xsd_doc = etree.parse(xsd_file)
+
+        def validate_definition(filepath):
+            schema = etree.XMLSchema(xsd_doc)
+            with open(filepath, "r", encoding="utf-8") as xml_file:
+                is_valid = schema.validate(etree.XML(xml_file.read().encode("utf-8")))
+            if is_valid:
+                return is_valid, None
+            else:
+                return is_valid, schema.error_log.filter_from_errors()[0]
+
+        if FILE_TO_TEST is None:
+            files = self.filelist()
+        else:
+            files = [os.path.join(INSTRUMENT_DIR, FILE_TO_TEST)]
+
+        # run the tests
+        failed = []
+        for filename in files:
+            print("----------------------------------------")
+            print("Validating '%s'" % filename)
+            valid, errors = validate_definition(filename)
+            if not valid:
+                print("VALIDATION OF '%s' FAILED WITH ERROR:" % filename)
+                print(errors)
+                failed.append(filename)
+
+        # final say on whether or not it 'worked'
+        print("----------------------------------------")
+        if len(failed) != 0:
+            print("SUMMARY OF FAILED FILES")
+            for filename in failed:
+                print(filename)
+            raise RuntimeError("Failed Validation for %d of %d files"
+                               % (len(failed), len(files)))
+        else:
+            print("Successfully Validated %d files" % len(files))
+
+
+class ValidateInstrumentDefinitionFiles(ValidateXML, systemtesting.MantidSystemTest):
+
+    def xsdpath(self):
+        return os.path.join(INSTRUMENT_DIR, "Schema", "IDF", "1.0",
+                            "IDFSchema.xsd")
+
+    def filelist(self):
+        print("Looking for instrument definition files in: %s" % INSTRUMENT_DIR)
+        return glob.glob("{}/*Definition*.xml".format(INSTRUMENT_DIR))
+
+
+class ValidateParameterFiles(ValidateXML, systemtesting.MantidSystemTest):
+
+    def xsdpath(self):
+        return os.path.join(INSTRUMENT_DIR, "Schema", "ParameterFile", "1.0",
+                            "ParameterFileSchema.xsd")
+
+    def filelist(self):
+        print("Looking for instrument definition files in: %s" % INSTRUMENT_DIR)
+        return glob.glob("{}/*Parameters*.xml".format(INSTRUMENT_DIR))
+
+
+class ValidateFacilitiesFile(ValidateXML, systemtesting.MantidSystemTest):
+
+    def xsdpath(self):
+        return os.path.join(INSTRUMENT_DIR, "Schema", "Facilities", "1.0",
+                            "FacilitiesSchema.xsd")
+
+    def filelist(self):
+        return [os.path.join(INSTRUMENT_DIR, 'Facilities.xml')]
+
+
+class ValidateGroupingFiles(ValidateXML, systemtesting.MantidSystemTest):
+
+    def xsdpath(self):
+        return os.path.join(INSTRUMENT_DIR, "Schema", "Grouping", "1.0",
+                            "GroupingSchema.xsd")
+
+    def filelist(self):
+        grouping_dir = os.path.join(INSTRUMENT_DIR, "Grouping")
+        print("Looking for grouping files in: %s" % grouping_dir)
+        return glob.glob("{}/*Grouping*.xml".format(grouping_dir))
diff --git a/Testing/SystemTests/tests/analysis/ValidateParameterFiles.py b/Testing/SystemTests/tests/analysis/ValidateParameterFiles.py
deleted file mode 100644
index 016fb9400aad6fe04f402ace52bf34195c2482a2..0000000000000000000000000000000000000000
--- a/Testing/SystemTests/tests/analysis/ValidateParameterFiles.py
+++ /dev/null
@@ -1,76 +0,0 @@
-# Mantid Repository : https://github.com/mantidproject/mantid
-#
-# Copyright © 2018 ISIS Rutherford Appleton Laboratory UKRI,
-#     NScD Oak Ridge National Laboratory, European Spallation Source
-#     & Institut Laue - Langevin
-# SPDX - License - Identifier: GPL - 3.0 +
-#pylint: disable=no-init,invalid-name
-from __future__ import (absolute_import, division, print_function)
-from mantid import config
-import os
-import systemtesting
-import glob
-
-EXPECTED_EXT = '.expected'
-
-
-class ValidateParameterFiles(systemtesting.MantidSystemTest):
-
-    xsdFile=''
-
-    def skipTests(self):
-        try:
-            from genxmlif import GenXmlIfError # noqa
-            from minixsv import pyxsval # noqa
-        except ImportError:
-            return True
-        return False
-
-    def __getDataFileList__(self):
-        # get a list of directories to look in
-        direc = config['instrumentDefinition.directory']
-        print("Looking for instrument definition files in: %s" % direc)
-        cwd = os.getcwd()
-        os.chdir(direc)
-        myFiles = glob.glob("*Parameters*.xml")
-        os.chdir(cwd)
-        files = []
-        for filename in myFiles:
-            files.append(os.path.join(direc, filename))
-        return files
-
-    def runTest(self):
-        """Main entry point for the test suite"""
-        from minixsv import pyxsval # noqa
-        direc = config['instrumentDefinition.directory']
-        print(direc)
-        self.xsdFile =  os.path.join(direc,'Schema/ParameterFile/1.0/','ParameterFileSchema.xsd')
-        files = self.__getDataFileList__()
-
-        # run the tests
-        failed = []
-        for filename in files:
-            try:
-                print("----------------------------------------")
-                print("Validating '%s'" % filename)
-                pyxsval.parseAndValidateXmlInput(filename, xsdFile=self.xsdFile, validateSchema=0)
-            except Exception as e:
-                print("VALIDATION OF '%s' FAILED WITH ERROR:" % filename)
-                print(e)
-                failed.append(filename)
-
-        # final say on whether or not it 'worked'
-        print("----------------------------------------")
-        if len(failed) != 0:
-            print("SUMMARY OF FAILED FILES")
-            for filename in failed:
-                print(filename)
-            raise RuntimeError("Failed Validation for %d of %d files"
-                               % (len(failed), len(files)))
-        else:
-            print("Successfully Validated %d files" % len(files))
-
-
-if __name__ == '__main__':
-    valid = ValidateParameterFiles()
-    valid.runTest()
diff --git a/buildconfig/CMake/Bootstrap.cmake b/buildconfig/CMake/Bootstrap.cmake
index 7040f71e3fbd9b60eac71053416e067796149808..d6787dabec28cd6be97f477d678649c7f47d2f4b 100644
--- a/buildconfig/CMake/Bootstrap.cmake
+++ b/buildconfig/CMake/Bootstrap.cmake
@@ -10,7 +10,7 @@ if( MSVC )
   include ( ExternalProject )
   set( EXTERNAL_ROOT ${PROJECT_SOURCE_DIR}/external CACHE PATH "Location to clone third party dependencies to" )
   set( THIRD_PARTY_GIT_URL "https://github.com/mantidproject/thirdparty-msvc2015.git" )
-  set ( THIRD_PARTY_GIT_SHA1 aa4f7615564fb9c73dbfce40d24330a955ffcfd4 )
+  set ( THIRD_PARTY_GIT_SHA1 a7bd18f35c8d67e68c3a965a07057efa266fc7d7 )
   set ( THIRD_PARTY_DIR ${EXTERNAL_ROOT}/src/ThirdParty )
   # Generates a script to do the clone/update in tmp
   set ( _project_name ThirdParty )
diff --git a/instrument/Schema/IDF/1.0/IDFSchema.xsd b/instrument/Schema/IDF/1.0/IDFSchema.xsd
index c4925ed070949d4fcf04c9ac557660c3b84105ba..4764bda76f826fd2ee68eac4498a97e785b87e0b 100644
--- a/instrument/Schema/IDF/1.0/IDFSchema.xsd
+++ b/instrument/Schema/IDF/1.0/IDFSchema.xsd
@@ -194,7 +194,9 @@
         </xs:complexType>
       </xs:element>
       <xs:element name="description">      
-        <xs:attribute name="is"/>
+        <xs:complexType>
+          <xs:attribute name="is"/>
+        </xs:complexType>
       </xs:element>
       <xs:element name="fixed"/>
       <xs:element name="formula">