diff --git a/profiles/base10/modules/registers.xql b/profiles/base10/modules/registers.xql
index faa023f9..a14b8a5b 100644
--- a/profiles/base10/modules/registers.xql
+++ b/profiles/base10/modules/registers.xql
@@ -82,7 +82,10 @@ declare function rapi:save($request as map(*)) {
     let $body := $request?body/*[1]
 
     let $type := local-name($body)
-    let $type := if ($type = 'org') then "organization" else $type
+    let $type := switch($type) 
+                    case "org" return "organization" 
+                    case "bibl" return "work" 
+                    default return $type
     let $id := ($body/@xml:id, $request?parameters?id)[1]
 
     let $data := rapi:prepare-record($body, $user, $type)
@@ -123,6 +126,8 @@ declare function rapi:insert-point($type as xs:string) {
             collection($config:register-root)/id($root)//tei:listOrg
         case "term" return
             collection($config:register-root)/id($root)//tei:taxonomy
+        case "work" return
+            collection($config:register-root)/id($root)//tei:listBibl
         default return
             collection($config:register-root)/id($root)//tei:listPerson
 };
@@ -193,15 +198,22 @@ declare function rapi:next($type) {
     switch ($type)
         case 'place'
             return collection($config:register-root)/id($config?id)//tei:place[starts-with(@xml:id, $config?prefix)]/substring-after(@xml:id, $config?prefix)
+        case 'organization'
+            return collection($config:register-root)/id($config?id)//tei:org[starts-with(@xml:id, $config?prefix)]/substring-after(@xml:id, $config?prefix)
+        case 'term'
+            return collection($config:register-root)/id($config?id)//tei:category[starts-with(@xml:id, $config?prefix)]/substring-after(@xml:id, $config?prefix)
+        case 'work'
+            return collection($config:register-root)/id($config?id)//(tei:bibl|tei:biblStruct)[starts-with(@xml:id, $config?prefix)]/substring-after(@xml:id, $config?prefix)
         default 
             return collection($config:register-root)/id($config?id)//tei:person[starts-with(@xml:id, $config?prefix)]/substring-after(@xml:id, $config?prefix)
     
-    let $last := if (count($all-ids)) then sort($all-ids)[last()] else 1
+    let $numeric-ids := for $id in $all-ids return if ($id castable as xs:integer) then $id else ()
+    let $last := if (count($all-ids)) then sort($numeric-ids)[last()] else 1
     let $next :=
             try {
                 xs:integer($last) + 1
             } catch * {
-                '_error'
+                1
             }
     
     return $config?prefix || rapi:pad($next, 6)
@@ -272,6 +284,15 @@ declare function rapi:query($type as xs:string, $query as xs:string?) {
                         "id": $term/@xml:id/string(),
                         "label": $term/tei:catDesc/string()
                     }
+            case "work" return
+                for $bibl in collection($config:register-root)//tei:bibl[ft:query(tei:title, $query)]
+                return
+                    map {
+                        "id": $bibl/@xml:id/string(),
+                        "label": $bibl/tei:title[@type="main"]/string(),
+                        "details": ``[`{$bibl/tei:author}`; `{$bibl/tei:note/string()}`]``,
+                        "link": $bibl/tei:ptr/@target/string()
+                    }
             default return
                 ()
     } catch * {
@@ -359,6 +380,16 @@ declare function rapi:create-record($type as xs:string, $id as xs:string, $data
             
                 {$data?name}
             
+        case "work" return
+            
+                {$data?name}
+                {
+                    rapi:process-array($data?firstAuthor, function($item) {
+                        {$item?label}
+                    })
+                }
+                {$data?note}
+            
         default return
             ()
 };
@@ -401,6 +432,7 @@ declare function rapi:local-search-strings($type as xs:string, $entry as element
         case "place" return $entry/tei:placeName/string()
         case "organization" return $entry/tei:orgName/string()
         case "term" return $entry/tei:catDesc/string()
+        case "work" return $entry/tei:title/string()
         default return $entry/tei:persName/string()
 };