diff --git a/doc/reference.rst b/doc/reference.rst
index a35cf510ef147090d68dd78a8ea103726da630f1..81d1acd14271906cc3272071cf18b73f8042dc8c 100644
--- a/doc/reference.rst
+++ b/doc/reference.rst
@@ -298,6 +298,17 @@ Manipulating Instructions
 
 .. autofunction:: add_dependency
 
+Library interface
+^^^^^^^^^^^^^^^^^
+
+.. autofunction:: register_reduction_parser
+
+.. autofunction:: register_preamble_generators
+
+.. autofunction:: register_symbol_manglers
+
+.. autofunction:: register_function_manglers
+
 Argument types
 ^^^^^^^^^^^^^^
 
diff --git a/loopy/__init__.py b/loopy/__init__.py
index 989d1a40645b336954ffaa6f13418e4f5d1b5c7e..c2289f478c2d2fdc3de0270019d579a264b544ef 100644
--- a/loopy/__init__.py
+++ b/loopy/__init__.py
@@ -90,6 +90,10 @@ __all__ = [
         "make_kernel",
         "register_reduction_parser",
 
+        "extract_subst", "expand_subst",
+        "precompute",
+        "split_arg_axis", "find_padding_multiple", "add_padding"
+
         "get_dot_dependency_graph", "add_argument_dtypes",
         "infer_argument_dtypes", "add_and_infer_argument_dtypes",
 
@@ -104,11 +108,22 @@ __all__ = [
         "LoopyFlags",
 
         "make_kernel",
+
+        # {{{ from this file
+
         "split_iname", "join_inames", "tag_inames", "duplicate_inames",
-        "split_dimension", "join_dimensions", "tag_dimensions",
-        "extract_subst", "expand_subst",
-        "precompute", "add_prefetch",
-        "split_arg_axis", "find_padding_multiple", "add_padding"
+        "rename_iname", "link_inames", "remove_unused_inames",
+        "set_loop_priority", "add_prefetch"
+        "find_instructions", "map_instructions",
+        "set_instruction_priority", "add_dependency",
+        "change_arg_to_image", "tag_data_axes",
+        "split_reduction_inward", "split_reduction_outward",
+        "fix_parameters",
+        "register_preamble_generators",
+        "register_symbol_manglers",
+        "register_function_manglers",
+
+        # }}}
         ]
 
 
@@ -1219,4 +1234,36 @@ def fix_parameter(kernel, name, value):
 
 # }}}
 
+
+# {{{ library registration
+
+def register_preamble_generators(kernel, preamble_generators):
+    new_pgens = kernel.preamble_generators[:]
+    for pgen in preamble_generators:
+        if pgen not in new_pgens:
+            new_pgens.append(pgen)
+
+    return kernel.copy(preamble_generators=new_pgens)
+
+
+def register_symbol_manglers(kernel, manglers):
+    new_manglers = kernel.symbol_manglers[:]
+    for m in manglers:
+        if m not in manglers:
+            new_manglers.append(m)
+
+    return kernel.copy(symbol_manglers=new_manglers)
+
+
+def register_function_manglers(kernel, manglers):
+    new_manglers = kernel.function_manglers[:]
+    for m in manglers:
+        if m not in manglers:
+            new_manglers.append(m)
+
+    return kernel.copy(function_manglers=new_manglers)
+
+# }}}
+
+
 # vim: foldmethod=marker
diff --git a/loopy/kernel/__init__.py b/loopy/kernel/__init__.py
index 04ec457570394a1e6ab67945ff9910620e92abd8..efc606c24f291acfe24789f098dc1293b37b8801 100644
--- a/loopy/kernel/__init__.py
+++ b/loopy/kernel/__init__.py
@@ -275,10 +275,6 @@ class LoopKernel(Record):
 
     # {{{ function mangling
 
-    def register_function_mangler(self, mangler):
-        return self.copy(
-                function_manglers=[mangler]+self.function_manglers)
-
     def mangle_function(self, identifier, arg_dtypes):
         for mangler in self.function_manglers:
             mangle_result = mangler(identifier, arg_dtypes)