diff --git a/hydra-rdf.cabal b/hydra-rdf.cabal
--- a/hydra-rdf.cabal
+++ b/hydra-rdf.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           hydra-rdf
-version:        0.17.2
+version:        0.17.3
 synopsis:       Hydra's RDF/SHACL/OWL model and coder support
 description:    Hydra is an implementation of the LambdaGraph data model, which takes advantage of an isomorphism between labeled hypergraphs and typed lambda calculus: in Hydra, "graphs are programs, and programs are graphs". RDF support for Hydra
 category:       Data
@@ -45,6 +45,6 @@
   build-depends:
       base >=4.19.0 && <4.22
     , containers >=0.6.7 && <0.8
-    , hydra-kernel ==0.17.2
+    , hydra-kernel ==0.17.3
     , scientific >=0.3.7 && <0.4
   default-language: Haskell2010
diff --git a/src/main/haskell/Hydra/Rdf/Serde.hs b/src/main/haskell/Hydra/Rdf/Serde.hs
--- a/src/main/haskell/Hydra/Rdf/Serde.hs
+++ b/src/main/haskell/Hydra/Rdf/Serde.hs
@@ -22,6 +22,7 @@
 import qualified Hydra.Overlay.Haskell.Lib.Logic as Logic
 import qualified Hydra.Overlay.Haskell.Lib.Math as Math
 import qualified Hydra.Overlay.Haskell.Lib.Optionals as Optionals
+import qualified Hydra.Overlay.Haskell.Lib.Ordering as Ordering
 import qualified Hydra.Overlay.Haskell.Lib.Sets as Sets
 import qualified Hydra.Overlay.Haskell.Lib.Strings as Strings
 import qualified Hydra.Packaging as Packaging
@@ -55,12 +56,12 @@
 -- | Escape a single IRI character code to a string
 escapeIriChar :: Int -> String
 escapeIriChar c =
-    Logic.ifElse (Logic.or (Equality.lte c 32) (Logic.or (Equality.equal c 60) (Logic.or (Equality.equal c 62) (Logic.or (Equality.equal c 34) (Logic.or (Equality.equal c 123) (Logic.or (Equality.equal c 125) (Logic.or (Equality.equal c 124) (Logic.or (Equality.equal c 94) (Logic.or (Equality.equal c 96) (Equality.equal c 92)))))))))) (uchar4 c) (Strings.fromList [
+    Logic.ifElse (Logic.or (Ordering.lte c 32) (Logic.or (Equality.equal c 60) (Logic.or (Equality.equal c 62) (Logic.or (Equality.equal c 34) (Logic.or (Equality.equal c 123) (Logic.or (Equality.equal c 125) (Logic.or (Equality.equal c 124) (Logic.or (Equality.equal c 94) (Logic.or (Equality.equal c 96) (Equality.equal c 92)))))))))) (uchar4 c) (Strings.fromList [
       c])
 
 -- | Escape a string for use in an N-Triples IRI. Disallowed characters are emitted as 4-digit UCHAR escapes.
 escapeIriStr :: String -> String
-escapeIriStr s = Strings.cat (Lists.map escapeIriChar (Strings.toList s))
+escapeIriStr s = Strings.concat (Lists.map escapeIriChar (Strings.toList s))
 
 -- | Escape a single literal character code to a string
 escapeLiteralChar :: Int -> String
@@ -70,7 +71,7 @@
 
 -- | Escape a string for use in an N-Triples literal
 escapeLiteralString :: String -> String
-escapeLiteralString s = Strings.cat (Lists.map escapeLiteralChar (Strings.toList s))
+escapeLiteralString s = Strings.concat (Lists.map escapeLiteralChar (Strings.toList s))
 
 -- | Convert an RDF graph to an expression
 graphToExpr :: Syntax.Graph -> Ast.Expr
@@ -78,7 +79,7 @@
 
 -- | Convert a value 0-15 to an uppercase hex digit code point
 hexDigit :: Int -> Int
-hexDigit n = Logic.ifElse (Equality.lt n 10) (Math.add n 48) (Math.add (Math.sub n 10) 65)
+hexDigit n = Logic.ifElse (Ordering.lt n 10) (Math.add n 48) (Math.add (Math.sub n 10) 65)
 
 -- | Convert an IRI to an expression
 iriToExpr :: Syntax.Iri -> Ast.Expr
@@ -103,7 +104,7 @@
           dt = Syntax.literalDatatypeIri lit
           lang = Syntax.literalLanguageTag lit
           lexExpr =
-                  Serialization.cst (Strings.cat [
+                  Serialization.cst (Strings.concat [
                     "\"",
                     (escapeLiteralString lex),
                     "\""])
@@ -151,13 +152,13 @@
 uchar4 :: Int -> String
 uchar4 c =
 
-      let d3 = Optionals.fromOptional 0 (Math.maybeDiv c 4096)
-          r3 = Optionals.fromOptional 0 (Math.maybeMod c 4096)
-          d2 = Optionals.fromOptional 0 (Math.maybeDiv r3 256)
-          r2 = Optionals.fromOptional 0 (Math.maybeMod r3 256)
-          d1 = Optionals.fromOptional 0 (Math.maybeDiv r2 16)
-          d0 = Optionals.fromOptional 0 (Math.maybeMod r2 16)
-      in (Strings.cat2 "\\u" (Strings.fromList [
+      let d3 = Optionals.withDefault 0 (Math.div c 4096)
+          r3 = Optionals.withDefault 0 (Math.mod c 4096)
+          d2 = Optionals.withDefault 0 (Math.div r3 256)
+          r2 = Optionals.withDefault 0 (Math.mod r3 256)
+          d1 = Optionals.withDefault 0 (Math.div r2 16)
+          d0 = Optionals.withDefault 0 (Math.mod r2 16)
+      in (Strings.concat2 "\\u" (Strings.fromList [
         hexDigit d3,
         (hexDigit d2),
         (hexDigit d1),
diff --git a/src/main/haskell/Hydra/Rdf/Utils.hs b/src/main/haskell/Hydra/Rdf/Utils.hs
--- a/src/main/haskell/Hydra/Rdf/Utils.hs
+++ b/src/main/haskell/Hydra/Rdf/Utils.hs
@@ -71,7 +71,7 @@
 encodeLiteral lit =
     case lit of
       Core.LiteralBinary v0 -> Syntax.Literal {
-        Syntax.literalLexicalForm = (Literals.binaryToString v0),
+        Syntax.literalLexicalForm = (Literals.binaryToBase64 v0),
         Syntax.literalDatatypeIri = (xmlSchemaDatatypeIri "base64Binary"),
         Syntax.literalLanguageTag = Nothing}
       Core.LiteralBoolean v0 -> Syntax.Literal {
@@ -139,7 +139,7 @@
 
 -- | Construct an IRI from a namespace and local name
 iri :: String -> String -> Syntax.Iri
-iri ns local = Syntax.Iri (Strings.cat2 ns local)
+iri ns local = Syntax.Iri (Strings.concat2 ns local)
 
 -- | Construct a key IRI from a local name
 keyIri :: String -> Syntax.Iri
@@ -151,12 +151,12 @@
 
 -- | Convert a Hydra name to an RDF IRI
 nameToIri :: Core.Name -> Syntax.Iri
-nameToIri name = Syntax.Iri (Strings.cat2 "urn:" (Core.unName name))
+nameToIri name = Syntax.Iri (Strings.concat2 "urn:" (Core.unName name))
 
 -- | Generate the next blank node and an incremented counter
 nextBlankNode :: Int -> (Syntax.Resource, Int)
 nextBlankNode counter =
-    (Syntax.ResourceBnode (Syntax.BlankNode (Strings.cat2 "b" (Literals.showInt32 counter))), (Math.add counter 1))
+    (Syntax.ResourceBnode (Syntax.BlankNode (Strings.concat2 "b" (Literals.showInt32 counter))), (Math.add counter 1))
 
 -- | Construct a property IRI from a record name and field name
 propertyIri :: Core.Name -> Core.Name -> Syntax.Iri
@@ -165,7 +165,7 @@
       let qualName = Names.qualifyName rname
           gname = Util.qualifiedNameModuleName qualName
           local_ = Util.qualifiedNameLocal qualName
-      in (Syntax.Iri (Strings.cat [
+      in (Syntax.Iri (Strings.concat [
         "urn:",
         (Optionals.cases gname "" Packaging.unModuleName),
         "#",
diff --git a/src/main/haskell/Hydra/Shacl/Coder.hs b/src/main/haskell/Hydra/Shacl/Coder.hs
--- a/src/main/haskell/Hydra/Shacl/Coder.hs
+++ b/src/main/haskell/Hydra/Shacl/Coder.hs
@@ -114,7 +114,7 @@
                       ShaclModel.definitionIri = iri,
                       ShaclModel.definitionTarget = ShaclModel.PropertyShape {
                         ShaclModel.propertyShapeCommon = _cp,
-                        ShaclModel.propertyShapeConstraints = (Sets.fromList (Optionals.cat [
+                        ShaclModel.propertyShapeConstraints = (Sets.fromList (Optionals.givens [
                           minC,
                           maxC])),
                         ShaclModel.propertyShapeDefaultValue = Nothing,
@@ -206,7 +206,7 @@
         let descs = Pairs.first _dr
             cx1 = Pairs.second _dr
         in (
-          Optionals.fromOptional descs (Optionals.map (\p -> Lists.cons (withType (Core.wrappedTermTypeName v0) (Pairs.first p)) (Pairs.second p)) (Lists.uncons descs)),
+          Optionals.withDefault descs (Optionals.map (\p -> Lists.cons (withType (Core.wrappedTermTypeName v0) (Pairs.first p)) (Pairs.second p)) (Lists.uncons descs)),
           cx1)) (encodeTerm subject (Core.wrappedTermBody v0) cx g)
       Core.TermOptional v0 -> Optionals.cases v0 (Right ([], cx)) (\_inner -> encodeTerm subject _inner cx g)
       Core.TermRecord v0 ->
@@ -290,7 +290,7 @@
 shaclCoder mod cx g =
 
       let typeEls =
-              Optionals.cat (Lists.map (\d -> case d of
+              Optionals.givens (Lists.map (\d -> case d of
                 Packaging.DefinitionType v0 -> Just ((\name -> \typ ->
                   let schemaTerm = Core.TermVariable (Core.Name "hydra.core.Type")
                       dataTerm =
@@ -316,7 +316,7 @@
 -- | Construct an error for unexpected input, given expected and found descriptions
 unexpectedE :: String -> String -> Either Errors.Error t0
 unexpectedE expected found =
-    err (Strings.cat [
+    err (Strings.concat [
       "Expected ",
       expected,
       ", found: ",
