diff --git a/.clang-format b/.clang-format
index d43e884..28e3328 100644
--- a/.clang-format
+++ b/.clang-format
@@ -87,7 +87,7 @@
 IndentWrappedFunctionNames: true
 InsertNewlineAtEOF: true
 KeepEmptyLinesAtTheStartOfBlocks: false
-LambdaBodyIndentation: OuterScope
+LambdaBodyIndentation: Signature
 LineEnding: LF
 MacroBlockBegin: ''
 MacroBlockEnd:   ''
@@ -98,13 +98,14 @@
 ObjCSpaceBeforeProtocolList: true
 PackConstructorInitializers: BinPack
 PenaltyBreakAssignment: 25
-PenaltyBreakBeforeFirstCallParameter: 19
+PenaltyBreakBeforeFirstCallParameter: 50
 PenaltyBreakComment: 300
 PenaltyBreakFirstLessLess: 120
 PenaltyBreakString: 1000
+PenaltyBreakTemplateDeclaration: 10
 PenaltyExcessCharacter: 1000000
 PenaltyReturnTypeOnItsOwnLine: 60
-PenaltyIndentedWhitespace: 0
+PenaltyIndentedWhitespace: 1
 PointerAlignment: Left
 QualifierAlignment: Left
 ReferenceAlignment: Left
diff --git a/include/libbej/bej_dictionary.h b/include/libbej/bej_dictionary.h
index b22404d..81d77dc 100644
--- a/include/libbej/bej_dictionary.h
+++ b/include/libbej/bej_dictionary.h
@@ -109,11 +109,10 @@
  * pointer if this is not needed.
  * @return 0 if successful.
  */
-int bejDictGetPropertyByName(const uint8_t* dictionary,
-                             uint16_t startingPropertyOffset,
-                             const char* propertyName,
-                             const struct BejDictionaryProperty** property,
-                             uint16_t* propertyOffset);
+int bejDictGetPropertyByName(
+    const uint8_t* dictionary, uint16_t startingPropertyOffset,
+    const char* propertyName, const struct BejDictionaryProperty** property,
+    uint16_t* propertyOffset);
 
 #ifdef __cplusplus
 }
diff --git a/src/bej_decoder_core.c b/src/bej_decoder_core.c
index fe6dad6..09a9430 100644
--- a/src/bej_decoder_core.c
+++ b/src/bej_decoder_core.c
@@ -75,8 +75,8 @@
     // Number of bytes need to represent the value length.
     const uint8_t valueLengthSize = *(enSegment + valueLenNnintOffset);
     // Start of the Value.
-    const uint32_t valueOffset = valueLenNnintOffset + sizeof(uint8_t) +
-                                 valueLengthSize;
+    const uint32_t valueOffset =
+        valueLenNnintOffset + sizeof(uint8_t) + valueLengthSize;
 
     offsets->formatOffset = formatOffset;
     offsets->valueLenNnintOffset = valueLenNnintOffset;
@@ -150,11 +150,10 @@
  * property in a dictionary.
  * @return 0 if successful.
  */
-static int
-    bejGetDictionaryAndProperty(const struct BejHandleTypeFuncParam* params,
-                                uint8_t schemaType, uint32_t sequenceNumber,
-                                const uint8_t** dictionary,
-                                const struct BejDictionaryProperty** prop)
+static int bejGetDictionaryAndProperty(
+    const struct BejHandleTypeFuncParam* params, uint8_t schemaType,
+    uint32_t sequenceNumber, const uint8_t** dictionary,
+    const struct BejDictionaryProperty** prop)
 {
     uint16_t dictPropOffset;
     // We need to pick the correct dictionary.
@@ -175,8 +174,8 @@
         return bejErrorInvalidSchemaType;
     }
 
-    int ret = bejDictGetProperty(*dictionary, dictPropOffset, sequenceNumber,
-                                 prop);
+    int ret =
+        bejDictGetProperty(*dictionary, dictPropOffset, sequenceNumber, prop);
     if (ret != 0)
     {
         fprintf(stderr, "Failed to get dictionary property for offset: %u\n",
@@ -580,11 +579,11 @@
         // nnint      - Length of exp
         // bejInteger - exp (includes sign for the exponent)
         uint8_t wholeByteLen = (uint8_t)bejGetNnint(params->sflv.value);
-        const uint8_t* wholeBejInt = params->sflv.value +
-                                     bejGetNnintSize(params->sflv.value);
+        const uint8_t* wholeBejInt =
+            params->sflv.value + bejGetNnintSize(params->sflv.value);
         const uint8_t* fractZeroCountNnint = wholeBejInt + wholeByteLen;
-        const uint8_t* fractNnint = fractZeroCountNnint +
-                                    bejGetNnintSize(fractZeroCountNnint);
+        const uint8_t* fractNnint =
+            fractZeroCountNnint + bejGetNnintSize(fractZeroCountNnint);
         const uint8_t* lenExpNnint = fractNnint + bejGetNnintSize(fractNnint);
         const uint8_t* expBejInt = lenExpNnint + bejGetNnintSize(lenExpNnint);
 
@@ -669,8 +668,8 @@
     // We might have to change this for nested annotations.
     params->state.mainDictPropOffset = outerProp->childPointerOffset;
     // Point to the start of the value for next decoding.
-    params->state.encodedStreamOffset = params->sflv.valueEndOffset -
-                                        params->sflv.valueLength;
+    params->state.encodedStreamOffset =
+        params->sflv.valueEndOffset - params->sflv.valueLength;
     return 0;
 }
 
@@ -723,8 +722,8 @@
     while (params.state.encodedStreamOffset < streamLen)
     {
         // Go to the next encoded segment in the encoded stream.
-        params.state.encodedSubStream = enStream +
-                                        params.state.encodedStreamOffset;
+        params.state.encodedSubStream =
+            enStream + params.state.encodedStreamOffset;
         bejInitSFLVStruct(&params);
 
         if (params.sflv.format.readOnlyProperty)
diff --git a/src/bej_decoder_json.cpp b/src/bej_decoder_json.cpp
index f6624c7..5f8ddac 100644
--- a/src/bej_decoder_json.cpp
+++ b/src/bej_decoder_json.cpp
@@ -367,10 +367,10 @@
         .output = &output,
     };
 
-    return bejDecodePldmBlock(&dictionaries, encodedPldmBlock.data(),
-                              encodedPldmBlock.size_bytes(), &stackCallback,
-                              &decodedCallback, (void*)(&callbackData),
-                              (void*)(&stack));
+    return bejDecodePldmBlock(
+        &dictionaries, encodedPldmBlock.data(), encodedPldmBlock.size_bytes(),
+        &stackCallback, &decodedCallback, (void*)(&callbackData),
+        (void*)(&stack));
 }
 
 std::string BejDecoderJson::getOutput()
diff --git a/src/bej_dictionary.c b/src/bej_dictionary.c
index b4d99ae..c0481b3 100644
--- a/src/bej_dictionary.c
+++ b/src/bej_dictionary.c
@@ -114,11 +114,10 @@
     return (const char*)(dictionary + nameOffset);
 }
 
-int bejDictGetPropertyByName(const uint8_t* dictionary,
-                             uint16_t startingPropertyOffset,
-                             const char* propertyName,
-                             const struct BejDictionaryProperty** property,
-                             uint16_t* propertyOffset)
+int bejDictGetPropertyByName(
+    const uint8_t* dictionary, uint16_t startingPropertyOffset,
+    const char* propertyName, const struct BejDictionaryProperty** property,
+    uint16_t* propertyOffset)
 {
     NULL_CHECK(property, "property in bejDictGetPropertyByName");
 
diff --git a/src/bej_encoder_metadata.c b/src/bej_encoder_metadata.c
index 5e5ce23..76f78c3 100644
--- a/src/bej_encoder_metadata.c
+++ b/src/bej_encoder_metadata.c
@@ -58,10 +58,9 @@
  * doesn't have a name.
  * @return a pointer to the dictionary to be used.
  */
-static const uint8_t*
-    bejGetRelatedDictionary(const struct BejDictionaries* dictionaries,
-                            const uint8_t* parentDictionary,
-                            const char* nodeName)
+static const uint8_t* bejGetRelatedDictionary(
+    const struct BejDictionaries* dictionaries, const uint8_t* parentDictionary,
+    const char* nodeName)
 {
     // If the node name is NULL, we have to use parent dictionary.
     if (nodeName == NULL)
@@ -206,11 +205,10 @@
     return 0;
 }
 
-static int bejUpdateStringMetaData(const struct BejDictionaries* dictionaries,
-                                   const uint8_t* parentDictionary,
-                                   struct RedfishPropertyLeafString* node,
-                                   uint16_t nodeIndex,
-                                   uint16_t dictStartingOffset)
+static int bejUpdateStringMetaData(
+    const struct BejDictionaries* dictionaries, const uint8_t* parentDictionary,
+    struct RedfishPropertyLeafString* node, uint16_t nodeIndex,
+    uint16_t dictStartingOffset)
 {
     uint32_t sequenceNumber;
     RETURN_IF_IERROR(bejFindSeqNumAndChildDictOffset(
@@ -232,11 +230,10 @@
     return 0;
 }
 
-static int bejUpdateRealMetaData(const struct BejDictionaries* dictionaries,
-                                 const uint8_t* parentDictionary,
-                                 struct RedfishPropertyLeafReal* node,
-                                 uint16_t nodeIndex,
-                                 uint16_t dictStartingOffset)
+static int bejUpdateRealMetaData(
+    const struct BejDictionaries* dictionaries, const uint8_t* parentDictionary,
+    struct RedfishPropertyLeafReal* node, uint16_t nodeIndex,
+    uint16_t dictStartingOffset)
 {
     uint32_t sequenceNumber;
     RETURN_IF_IERROR(bejFindSeqNumAndChildDictOffset(
@@ -313,11 +310,10 @@
     return 0;
 }
 
-static int bejUpdateEnumMetaData(const struct BejDictionaries* dictionaries,
-                                 const uint8_t* parentDictionary,
-                                 struct RedfishPropertyLeafEnum* node,
-                                 uint16_t nodeIndex,
-                                 uint16_t dictStartingOffset)
+static int bejUpdateEnumMetaData(
+    const struct BejDictionaries* dictionaries, const uint8_t* parentDictionary,
+    struct RedfishPropertyLeafEnum* node, uint16_t nodeIndex,
+    uint16_t dictStartingOffset)
 {
     const uint8_t* nodeDictionary;
     uint16_t childEntryOffset;
@@ -366,11 +362,10 @@
     return 0;
 }
 
-static int bejUpdateBoolMetaData(const struct BejDictionaries* dictionaries,
-                                 const uint8_t* parentDictionary,
-                                 struct RedfishPropertyLeafBool* node,
-                                 uint16_t nodeIndex,
-                                 uint16_t dictStartingOffset)
+static int bejUpdateBoolMetaData(
+    const struct BejDictionaries* dictionaries, const uint8_t* parentDictionary,
+    struct RedfishPropertyLeafBool* node, uint16_t nodeIndex,
+    uint16_t dictStartingOffset)
 {
     uint32_t sequenceNumber;
     RETURN_IF_IERROR(bejFindSeqNumAndChildDictOffset(
@@ -390,11 +385,10 @@
     return 0;
 }
 
-static int bejUpdateNullMetaData(const struct BejDictionaries* dictionaries,
-                                 const uint8_t* parentDictionary,
-                                 struct RedfishPropertyLeafNull* node,
-                                 uint16_t nodeIndex,
-                                 uint16_t dictStartingOffset)
+static int bejUpdateNullMetaData(
+    const struct BejDictionaries* dictionaries, const uint8_t* parentDictionary,
+    struct RedfishPropertyLeafNull* node, uint16_t nodeIndex,
+    uint16_t dictStartingOffset)
 {
     uint32_t sequenceNumber;
     RETURN_IF_IERROR(bejFindSeqNumAndChildDictOffset(
@@ -426,10 +420,9 @@
  * node's parent.
  * @return 0 if successful.
  */
-static int bejUpdateLeafNodeMetaData(const struct BejDictionaries* dictionaries,
-                                     const uint8_t* parentDictionary,
-                                     void* childPtr, uint16_t childIndex,
-                                     uint16_t dictStartingOffset)
+static int bejUpdateLeafNodeMetaData(
+    const struct BejDictionaries* dictionaries, const uint8_t* parentDictionary,
+    void* childPtr, uint16_t childIndex, uint16_t dictStartingOffset)
 {
     struct RedfishPropertyLeaf* chNode = childPtr;
 
@@ -484,11 +477,10 @@
  * @param nodeIndex - If this node is an array element, this is the array index.
  * @return 0 if successful.
  */
-static int bejUpdateParentMetaData(const struct BejDictionaries* dictionaries,
-                                   const uint8_t* parentDictionary,
-                                   uint16_t dictStartingOffset,
-                                   struct RedfishPropertyParent* node,
-                                   uint16_t nodeIndex)
+static int bejUpdateParentMetaData(
+    const struct BejDictionaries* dictionaries, const uint8_t* parentDictionary,
+    uint16_t dictStartingOffset, struct RedfishPropertyParent* node,
+    uint16_t nodeIndex)
 {
     const uint8_t* nodeDictionary;
     uint16_t childEntryOffset;
@@ -557,10 +549,10 @@
             return 0;
         }
 
-        RETURN_IF_IERROR(
-            bejUpdateLeafNodeMetaData(dictionaries, parent->metaData.dictionary,
-                                      childPtr, parent->metaData.nextChildIndex,
-                                      parent->metaData.childrenDictPropOffset));
+        RETURN_IF_IERROR(bejUpdateLeafNodeMetaData(
+            dictionaries, parent->metaData.dictionary, childPtr,
+            parent->metaData.nextChildIndex,
+            parent->metaData.childrenDictPropOffset));
         // Use the child value size to update the parent value size.
         struct RedfishPropertyLeaf* leafChild = childPtr;
         // V: Include the child size in parent's value size.
diff --git a/test/bej_decoder_test.cpp b/test/bej_decoder_test.cpp
index 16cd19a..2aa9f0e 100644
--- a/test/bej_decoder_test.cpp
+++ b/test/bej_decoder_test.cpp
@@ -91,7 +91,7 @@
         {"DummySimple", dummySimpleTestFiles},
     }),
     [](const testing::TestParamInfo<BejDecoderTest::ParamType>& info) {
-    return info.param.testName;
-});
+        return info.param.testName;
+    });
 
 } // namespace libbej
diff --git a/test/bej_dictionary_test.cpp b/test/bej_dictionary_test.cpp
index 0591f7d..60b2d03 100644
--- a/test/bej_dictionary_test.cpp
+++ b/test/bej_dictionary_test.cpp
@@ -85,10 +85,10 @@
                                        std::get<1>(propertyNameSeq[index]),
                                        &property),
                     0);
-        EXPECT_THAT(bejDictGetPropertyName(dummySimpleDict.data(),
-                                           property->nameOffset,
-                                           property->nameLength),
-                    std::get<0>(propertyNameSeq[index]));
+        EXPECT_THAT(
+            bejDictGetPropertyName(dummySimpleDict.data(), property->nameOffset,
+                                   property->nameLength),
+            std::get<0>(propertyNameSeq[index]));
     }
 }
 
diff --git a/test/bej_encoder_test.cpp b/test/bej_encoder_test.cpp
index d258b4b..c1d6de6 100644
--- a/test/bej_encoder_test.cpp
+++ b/test/bej_encoder_test.cpp
@@ -261,11 +261,10 @@
     bejTreeLinkChildToParent(parent, linkSet);
 }
 
-void redfishCreateArrayOfLinksJson(struct RedfishPropertyParent* parent,
-                                   const char* arrayName, int linkCount,
-                                   const char* const links[],
-                                   struct RedfishArrayOfLinksJson* linksInfo,
-                                   struct RedfishLinkJson* linkJsonArray)
+void redfishCreateArrayOfLinksJson(
+    struct RedfishPropertyParent* parent, const char* arrayName, int linkCount,
+    const char* const links[], struct RedfishArrayOfLinksJson* linksInfo,
+    struct RedfishLinkJson* linkJsonArray)
 {
     bejTreeInitArray(&linksInfo->array, arrayName);
     bejTreeLinkChildToParent(parent, &linksInfo->array);
@@ -436,7 +435,7 @@
         {"Chassis", chassisTestFiles, "", &createChassisResource},
     }),
     [](const testing::TestParamInfo<BejEncoderTest::ParamType>& info) {
-    return info.param.testName;
-});
+        return info.param.testName;
+    });
 
 } // namespace libbej
