diff --git a/src/DOMAPI/HTMLCollectionOf.js b/src/MutationObserverAPI.js
similarity index 100%
rename from src/DOMAPI/HTMLCollectionOf.js
rename to src/MutationObserverAPI.js
diff --git a/src/MutationObserverAPI.res b/src/MutationObserverAPI.res
new file mode 100644
index 0000000..b581c8d
--- /dev/null
+++ b/src/MutationObserverAPI.res
@@ -0,0 +1,19 @@
+open DOMAPI
+
+/**
+[See MutationObserver on MDN](https://developer.mozilla.org/docs/Web/API/MutationObserver)
+*/
+@editor.completeFrom(MutationObserver)
+type mutationObserver
+
+type mutationObserverInit = {
+ mutable childList?: bool,
+ mutable attributes?: bool,
+ mutable characterData?: bool,
+ mutable subtree?: bool,
+ mutable attributeOldValue?: bool,
+ mutable characterDataOldValue?: bool,
+ mutable attributeFilter?: array,
+}
+
+type mutationObserverCallback = (array, mutationObserver) => unit
diff --git a/src/MutationObserverAPI/MutationObserver.js b/src/MutationObserverAPI/MutationObserver.js
new file mode 100644
index 0000000..d856702
--- /dev/null
+++ b/src/MutationObserverAPI/MutationObserver.js
@@ -0,0 +1,2 @@
+// Generated by ReScript, PLEASE EDIT WITH CARE
+/* This output is empty. Its source's type definitions, externals and/or unused code got optimized away. */
diff --git a/src/MutationObserverAPI/MutationObserver.res b/src/MutationObserverAPI/MutationObserver.res
new file mode 100644
index 0000000..057bd0a
--- /dev/null
+++ b/src/MutationObserverAPI/MutationObserver.res
@@ -0,0 +1,27 @@
+open DOMAPI
+open MutationObserverAPI
+
+/**
+[Read more on MDN](https://developer.mozilla.org/docs/Web/API/MutationObserver)
+*/
+@new
+external make: mutationObserverCallback => mutationObserver = "MutationObserver"
+
+/**
+[Read more on MDN](https://developer.mozilla.org/docs/Web/API/MutationObserver/observe)
+*/
+@send
+external observe: (mutationObserver, ~target: node, ~options: mutationObserverInit=?) => unit =
+ "observe"
+
+/**
+[Read more on MDN](https://developer.mozilla.org/docs/Web/API/MutationObserver/disconnect)
+*/
+@send
+external disconnect: mutationObserver => unit = "disconnect"
+
+/**
+[Read more on MDN](https://developer.mozilla.org/docs/Web/API/MutationObserver/takeRecords)
+*/
+@send
+external takeRecords: mutationObserver => array = "takeRecords"
diff --git a/tests/MutationObserverAPI/MutationObserver__test.js b/tests/MutationObserverAPI/MutationObserver__test.js
new file mode 100644
index 0000000..80212a5
--- /dev/null
+++ b/tests/MutationObserverAPI/MutationObserver__test.js
@@ -0,0 +1,28 @@
+// Generated by ReScript, PLEASE EDIT WITH CARE
+
+
+let observer = new MutationObserver((mutations, obs) => {
+ let button = document.querySelector("button");
+ if (button !== null) {
+ console.log(button);
+ obs.disconnect();
+ }
+ console.log(mutations);
+});
+
+observer.observe(document, {
+ childList: true,
+ subtree: true
+});
+
+let records = observer.takeRecords();
+
+console.log(records.length);
+
+observer.disconnect();
+
+export {
+ observer,
+ records,
+}
+/* observer Not a pure module */
diff --git a/tests/MutationObserverAPI/MutationObserver__test.res b/tests/MutationObserverAPI/MutationObserver__test.res
new file mode 100644
index 0000000..7ae0662
--- /dev/null
+++ b/tests/MutationObserverAPI/MutationObserver__test.res
@@ -0,0 +1,21 @@
+let observer = MutationObserver.make((mutations, obs) => {
+ let button = Global.document->Document.querySelector("button")
+ switch button->Null.toOption {
+ | Some(button) => {
+ Console.log(button)
+ obs->MutationObserver.disconnect
+ }
+ | None => ()
+ }
+ Console.log(mutations)
+})
+
+observer->MutationObserver.observe(
+ ~target=Global.document->Document.asNode,
+ ~options={childList: true, subtree: true},
+)
+
+let records = observer->MutationObserver.takeRecords
+Console.log(records->Array.length)
+
+observer->MutationObserver.disconnect