diff --git a/.gitignore b/.gitignore
index 2b3dd86ebb98c0ff8c00a39a417f774c1b804c2b..752dc96100cc4bea6910047ae07a32e831d240e9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,5 @@ build/
 root/
 sources/
 .orchestra/
+__pycache__/
+*.py[cod]
diff --git a/config/components/llvm_documentation.lib.yml b/config/components/llvm_documentation.lib.yml
index d79171451af3c1551edc63d45d64a47e0912408d..aeb1aa67e8b1e0f5280bd08ac944b49d5e523107 100644
--- a/config/components/llvm_documentation.lib.yml
+++ b/config/components/llvm_documentation.lib.yml
@@ -3,16 +3,18 @@
 #@yaml/text-templated-strings
 ---
 #@ def _llvm_documentation_component():
+repository: llvm-project
 builds:
   default:
     depencencies:
       - llvm
     configure: |
       rm -rf "$BUILD_DIR"
-      mkdir -p "$BUILD_DIR"
-      clone llvm-project "$BUILD_DIR"
+      cp -r "$SOURCE_DIR" "$BUILD_DIR"
+      # mkdir -p "$BUILD_DIR"
+      # clone llvm-project "$BUILD_DIR"
 
-      sed 's|FILE_PATTERNS|#FILE_PATTERNS|' -i "$BUILD_DIR/*/docs/doxygen.cfg.in"
+      sed 's|FILE_PATTERNS|#FILE_PATTERNS|' -i "$BUILD_DIR"/*/docs/doxygen.cfg.in
 
       mkdir -p "$BUILD_DIR/build"
 
@@ -32,28 +34,34 @@ builds:
       fi
 
       cd $BUILD_DIR/build/docs/doxygen/html
-      sed -i 's|$$$$(XCODE_INSTALL)/usr/bin/docsetutil|'$(PWD)'/support/docsetutil|' Makefile
-      sed -i 's|XCODE_INSTALL="$$$$(shell xcode-select -print-path)"||' Makefile
+      sed -i 's|$(XCODE_INSTALL)/usr/bin/docsetutil|'$ORCHESTRA'/helpers/docsetutil|' Makefile
+      sed -i 's|XCODE_INSTALL="$(shell xcode-select -print-path)"||' Makefile
       sed -i 's|<string>doxygen</string>|<string>llvm</string>|' Info.plist
       (@= make @)
       sed -i -s 's/ inherit / /' llvm.docset/Contents/Resources/Documents/*.html
 
-      $(call download-file,$(1)/build/docs/doxygen/html/llvm.docset/Contents/Resources/Documents,https://opensource.apple.com/source/lldb/lldb-310.2.36/www/cpp_reference/html,dynsections.js)
 
-      cd $(1)/build/tools/clang/docs/doxygen/html
-      sed -i 's|$$$$(XCODE_INSTALL)/usr/bin/docsetutil|'$(PWD)'/support/docsetutil|' Makefile
-      sed -i 's|XCODE_INSTALL="$$$$(shell xcode-select -print-path)"||' Makefile
+      download_file.sh "$BUILD_DIR/build/docs/doxygen/html/llvm.docset/Contents/Resources/Documents" \
+                        "https://opensource.apple.com/source/lldb/lldb-310.2.36/www/cpp_reference/html" \
+                        "dynsections.js"
+
+
+      cd $BUILD_DIR/build/tools/clang/docs/doxygen/html
+      sed -i 's|$(XCODE_INSTALL)/usr/bin/docsetutil|'$ORCHESTRA'/helpers/docsetutil|' Makefile
+      sed -i 's|XCODE_INSTALL="$(shell xcode-select -print-path)"||' Makefile
       sed -i 's|<string>doxygen</string>|<string>clang</string>|' Info.plist
       (@= make @)
       sed -i -s 's/ inherit / /' clang.docset/Contents/Resources/Documents/*.html
 
-      $(call download-file,$(1)/build/tools/clang/docs/doxygen/html/clang.docset/Contents/Resources/Documents,https://opensource.apple.com/source/lldb/lldb-310.2.36/www/cpp_reference/html,dynsections.js)
+      download_file.sh "$BUILD_DIR/build/tools/clang/docs/doxygen/html/clang.docset/Contents/Resources/Documents" \
+                        "https://opensource.apple.com/source/lldb/lldb-310.2.36/www/cpp_reference/html" \
+                        "dynsections.js"
 
-      mkdir -p $$$$DESTDIR$(INSTALL_PATH)/share/doc/llvm
-      cp -ar $(1)/build/docs/doxygen/html/llvm.docset $$$$DESTDIR$(INSTALL_PATH)/share/doc/llvm
+      mkdir -p "${DESTDIR}${ORCHESTRA_ROOT}/share/doc/llvm"
+      cp -ar "$BUILD_DIR/build/docs/doxygen/html/llvm.docset" "${DESTDIR}${ORCHESTRA_ROOT}/share/doc/llvm"
 
-      mkdir -p $$$$DESTDIR$(INSTALL_PATH)/share/doc/clang
-      cp -ar $(1)/build/tools/clang/docs/doxygen/html/clang.docset $$$$DESTDIR$(INSTALL_PATH)/share/doc/clang
+      mkdir -p "${DESTDIR}${ORCHESTRA_ROOT}/share/doc/clang"
+      cp -ar "$BUILD_DIR/build/tools/clang/docs/doxygen/html/clang.docset" "${DESTDIR}${ORCHESTRA_ROOT}/share/doc/clang"
 #@ end
 
 ---
diff --git a/helpers/docsetutil b/helpers/docsetutil
new file mode 100755
index 0000000000000000000000000000000000000000..6ce0ad4ac849efaa9fc2cc34660b8c41ace82316
--- /dev/null
+++ b/helpers/docsetutil
@@ -0,0 +1,65 @@
+#!/usr/bin/env python3
+
+import sys
+import os
+import subprocess
+from xml.dom.minidom import parse, Element
+import sqlite3
+
+def main():
+    assert len(sys.argv) == 3
+    assert sys.argv[1] == "index"
+    base_path = sys.argv[2]
+    resources_path = os.path.join(base_path, "Contents", "Resources")
+    print("Loading Tokens.xml")
+    xml_root = parse(os.path.join(resources_path, "Tokens.xml"))
+
+    print("Extracting data")
+    data = set()
+    index = -1
+    for token in filter(lambda x: type(x) is Element,
+                        xml_root.childNodes[0].childNodes):
+        name = token.getElementsByTagName("Name")[0].childNodes[0].nodeValue
+        item_type = ""
+        element_type = token.getElementsByTagName("Type")
+        if element_type:
+            item_type = element_type[0].childNodes[0].nodeValue
+        path = token.getElementsByTagName("Path")[0].childNodes[0].nodeValue
+        anchor = token.getElementsByTagName("Anchor")
+        if len(anchor) != 0:
+            anchor = anchor[0].childNodes[0].nodeValue
+            path += "#" + anchor
+
+        index += 1
+        data.add((index, name, item_type, path))
+
+        if name.startswith("llvm::"):
+            index += 1
+            data.add((index, name.replace("llvm::", ""), item_type, path))
+
+    print("Creating docSet.dsidx")
+    index_path = os.path.join(resources_path, "docSet.dsidx")
+    if os.path.exists(index_path):
+        os.remove(index_path)
+    connection = sqlite3.connect(index_path)
+    c = connection.cursor()
+    c.execute("""CREATE TABLE searchIndex(id INTEGER PRIMARY KEY,
+                                          name TEXT,
+                                          type TEXT,
+                                          path TEXT)""")
+
+    print("Inserting {} elements".format(len(data)))
+    c.executemany("""INSERT INTO searchIndex(id, name, type, path)
+                     VALUES(?, ?, ?, ?)""", data);
+
+    print("Checking we inserted everything")
+    c.execute("SELECT COUNT(*) FROM searchIndex")
+    assert c.fetchall()[0][0] == len(data)
+
+    print("Committing and closing database")
+    connection.commit()
+    c.close()
+    print("All done")
+
+if __name__ == "__main__":
+    main()
diff --git a/helpers/download_file.sh b/helpers/download_file.sh
new file mode 100755
index 0000000000000000000000000000000000000000..c98d79d358c3cb30e0500e49695d986433a8f916
--- /dev/null
+++ b/helpers/download_file.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+# $(1): destination
+# $(2): path
+# $(3): file name
+
+echo "Downloading $3 from $2"
+mkdir -p "$SOURCE_ARCHIVES"
+trap "rm -f -- '$SOURCE_ARCHIVES/$3'" EXIT
+
+if [ -e "$SOURCE_ARCHIVES/$3" ]; then
+  echo "$3 already cached"
+else
+  curl -L "$2/$3" > "$SOURCE_ARCHIVES/$3"
+fi
+
+trap - EXIT;
+
+echo "Copying $3 into $1"
+cp "$SOURCE_ARCHIVES/$3" "$1/$3"