diff --git a/runtests/runtests.iml b/runtests/runtests.iml
new file mode 100644
index 00000000000..49c63a49c3d
--- /dev/null
+++ b/runtests/runtests.iml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/runtests/test/stdlib/testall/DomTestAllTest.java b/runtests/test/stdlib/testall/DomTestAllTest.java
new file mode 100644
index 00000000000..67eb5826707
--- /dev/null
+++ b/runtests/test/stdlib/testall/DomTestAllTest.java
@@ -0,0 +1,12 @@
+package stdlib.testall;
+
+import junit.framework.TestSuite;
+import test.dom.*;
+
+/**
+ */
+public class DomTestAllTest {
+ public static TestSuite suite() {
+ return new TestSuite(DomTest.class);
+ }
+}
diff --git a/runtests/test/stdlib/testall/TestAll.java b/runtests/test/stdlib/testall/TestAll.java
new file mode 100644
index 00000000000..cd41ee03d07
--- /dev/null
+++ b/runtests/test/stdlib/testall/TestAll.java
@@ -0,0 +1,15 @@
+package stdlib.testall;
+
+import junit.framework.TestSuite;
+import test.collections.*;
+import test.standard.*;
+
+/**
+ */
+public class TestAll {
+ public static TestSuite suite() {
+ TestSuite suite = new TestSuite(GetOrElseTest.class, test.stdlib.issues.StdLibIssuesTest.class, StandardCollectionTest.class, CollectionTest.class, IoTest.class, ListTest.class, MapTest.class, SetTest.class, OldStdlibTest.class);
+ suite.addTest(testDslExample.namespace.getSuite());
+ return suite;
+ }
+}
diff --git a/stdlib.ipr b/stdlib.ipr
index 693c766ab77..227263bf56c 100644
--- a/stdlib.ipr
+++ b/stdlib.ipr
@@ -68,6 +68,7 @@
+
diff --git a/stdlib/ktSrc/dom/Dom.kt b/stdlib/ktSrc/dom/Dom.kt
new file mode 100644
index 00000000000..9087c182234
--- /dev/null
+++ b/stdlib/ktSrc/dom/Dom.kt
@@ -0,0 +1,35 @@
+package std.dom
+
+import org.w3c.dom.*
+import javax.xml.parsers.DocumentBuilder
+import javax.xml.parsers.DocumentBuilderFactory
+import std.getOrElse
+
+// Properties
+
+var Element.id : String
+get() = this.getAttribute("id").getOrElse("")
+set(value) {
+ this.setAttribute("id", value)
+}
+
+var Element.style : String
+get() = this.getAttribute("style").getOrElse("")
+set(value) {
+ this.setAttribute("style", value)
+}
+
+var Element.cssClass : String
+get() = this.getAttribute("class").getOrElse("")
+set(value) {
+ this.setAttribute("class", value)
+}
+
+// Syntax sugar
+
+inline fun Node.plus(child: Node?): Node {
+ if (child != null) {
+ this.appendChild(child)
+ }
+ return this
+}
\ No newline at end of file
diff --git a/stdlib/ktSrc/dom/DomJVM.kt b/stdlib/ktSrc/dom/DomJVM.kt
new file mode 100644
index 00000000000..f281b56f358
--- /dev/null
+++ b/stdlib/ktSrc/dom/DomJVM.kt
@@ -0,0 +1,53 @@
+/**
+ * JVM specific API implementations using JAXB and so forth which would not be used when compiling to JS
+ */
+package std.dom
+
+import org.w3c.dom.*
+import javax.xml.parsers.DocumentBuilder
+import javax.xml.parsers.DocumentBuilderFactory
+import javax.xml.transform.Transformer
+import javax.xml.transform.TransformerFactory
+import javax.xml.transform.Source
+import javax.xml.transform.dom.DOMSource
+import javax.xml.transform.stream.StreamResult
+
+import java.io.StringWriter
+import javax.xml.transform.OutputKeys
+
+fun createDocument(builder: DocumentBuilder): Document {
+ return builder.newDocument().sure()
+}
+
+fun createDocument(builderFactory: DocumentBuilderFactory = DocumentBuilderFactory.newInstance().sure()): Document {
+ return createDocument(builderFactory.newDocumentBuilder().sure())
+}
+
+fun createTransformer(source: Source? = null, factory: TransformerFactory = TransformerFactory.newInstance().sure()): Transformer {
+ val transformer = if (source != null) {
+ factory.newTransformer(source)
+ } else {
+ factory.newTransformer()
+ }
+ return transformer.sure()
+}
+
+fun Node.toXmlString(xmlDeclaration: Boolean = this is Document): String {
+ return nodeToXmlString(this, xmlDeclaration)
+}
+
+/*
+fun Document.toXmlString(xmlDeclaration: Boolean = true): String {
+ return nodeToXmlString(this, xmlDeclaration)
+}
+*/
+
+fun nodeToXmlString(node: Node, xmlDeclaration: Boolean): String {
+ val transformer = createTransformer()
+ transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, if (xmlDeclaration) "no" else "yes")
+ val buffer = StringWriter()
+ transformer.transform(DOMSource(node), StreamResult(buffer))
+ return buffer.toString().sure()
+
+}
+
diff --git a/testlib/test/dom/DomTest.kt b/testlib/test/dom/DomTest.kt
new file mode 100644
index 00000000000..41b4ea179da
--- /dev/null
+++ b/testlib/test/dom/DomTest.kt
@@ -0,0 +1,42 @@
+package test.dom
+
+import std.*
+import std.dom.*
+import stdhack.test.TestSupport
+import stdhack.test.*
+import stdhack.test.assertNull
+import org.w3c.dom.*
+import stdhack.test.assertEquals
+import std.dom.toXmlString
+
+class DomTest() : TestSupport() {
+
+ fun testCreateDocument() {
+ var doc = createDocument()
+ assertNotNull(doc, "Should have created a document")
+
+ val e = doc.createElement("foo").sure()
+ assertCssClass(e, "")
+
+ // now lets update the cssClass property
+ e.cssClass = "foo"
+ assertCssClass(e, "foo")
+
+ // now using the attribute directly
+ e.setAttribute("class", "bar")
+ assertCssClass(e, "bar")
+
+ doc += e
+ println("document ${doc.toXmlString()}")
+ }
+
+
+ fun assertCssClass(e: Element, value: String?): Unit {
+ val cl = e.cssClass
+ val cl2 = e.getAttribute("class")
+ println("element ${e.toXmlString()} has cssClass `${cl}` class attr `${cl2}`")
+
+ assertEquals(value, cl, "value of element.cssClass")
+ assertEquals(value, cl2, "value of element.getAttribute(\"class\")")
+ }
+}