diff --git a/scripts/xunit/xunit.py b/scripts/xunit/xunit.py
new file mode 100644
index 0000000..c636136
--- /dev/null
+++ b/scripts/xunit/xunit.py
@@ -0,0 +1,91 @@
+
+
+# Copyright (c) 2020, ARM Limited.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+
+from __future__ import print_function
+import xml.etree.ElementTree as ET
+
+class xunit_results():
+    def __init__(self, name='Testsuites'):
+        self.name = name
+        self.suites = []
+    def create_suite(self, name):
+        s = xunit_suite(name)
+        self.suites.append(s)
+        return s
+    def write_results(self, filename):
+        suites = ET.Element(self.name)
+        tree = ET.ElementTree(suites)
+        for s in self.suites:
+            testsuite = ET.SubElement(suites, 'testsuite', {'name' : s.name, 'errors' : '0'})
+            tests = 0
+            failures = 0
+            skip = 0
+            for t in s.tests:
+                test = ET.SubElement(testsuite, 'testcase', {'name' : t.name, 'classname' : t.classname, 'time' : t.time})
+                tests += 1
+                if t.skip:
+                    skip += 1
+                    ET.SubElement(test, 'skipped', {'type' : 'Skipped test'})
+                if t.fail:
+                    failures += 1
+                    fail = ET.SubElement(test, 'failure', {'type' : 'Test failed'})
+                    fail.text = t.fail
+                if t.sysout:
+                    sysout = ET.SubElement(test, 'system-out')
+                    sysout.text = t.sysout
+                if t.syserr:
+                    syserr = ET.SubElement(test, 'system-err')
+                    syserr.text = t.syserr
+            testsuite.attrib['tests'] = str(tests)
+            testsuite.attrib['failures'] = str(failures)
+            testsuite.attrib['skip'] = str(skip)
+        tree.write(filename, 'UTF-8', True)
+
+
+class xunit_suite():
+    def __init__(self, name):
+        self.name = name
+        self.tests = []
+
+class xunit_test():
+    def __init__(self, name, classname=None):
+        self.name = name
+        if classname:
+            self.classname = classname
+        else:
+            self.classname = name
+        self.time = '0.000'
+        self.fail = None
+        self.skip = False
+        self.sysout = None
+        self.syserr = None
+    def failed(self, text):
+        self.fail = text
+    def skipped(self):
+        self.skip = True
+
+
+if __name__ == '__main__':
+    r = xunit_results()
+    s = r.create_suite('selftest')
+    for i in range(0,10):
+        t = xunit_test('atest' + str(i))
+        if i == 3:
+            t.failed('Unknown failure foo')
+        if i == 7:
+            t.skipped()
+        s.tests.append(t)
+    r.write_results('foo.xml')
