Repository: kroxylicious/kroxylicious
Pull request #194 (2023-03-14 01:45:29)

Update pom's to meet the requirements for uploading to maven central
### Type of change

- Enhancement / new feature

### Description

To be able to release the public API through maven central the POM's are must pass central validation.

### Additional Context

To reduce the [lottery factor](https://blog.devgenius.io/building-a-good-lottery-factor-bf67f7de04d8) for the project I've also included some documentation on how to actually publish the release.



Patch:
diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index fe0e5d50..00000000
--- a/.editorconfig
+++ /dev/null
@@ -1,1373 +0,0 @@
-#
-#Copyright Kroxylicious Authors.
-#
-#Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
-[*]
-charset = utf-8
-end_of_line = lf
-indent_size = 4
-indent_style = space
-insert_final_newline = false
-max_line_length = 120
-tab_width = 4
-ij_continuation_indent_size = 8
-ij_formatter_off_tag = @formatter:off
-ij_formatter_on_tag = @formatter:on
-ij_formatter_tags_enabled = true
-ij_smart_tabs = false
-ij_visual_guides = none
-ij_wrap_on_typing = false
-
-[*.css]
-ij_css_align_closing_brace_with_properties = false
-ij_css_blank_lines_around_nested_selector = 1
-ij_css_blank_lines_between_blocks = 1
-ij_css_block_comment_add_space = false
-ij_css_brace_placement = end_of_line
-ij_css_enforce_quotes_on_format = false
-ij_css_hex_color_long_format = false
-ij_css_hex_color_lower_case = false
-ij_css_hex_color_short_format = false
-ij_css_hex_color_upper_case = false
-ij_css_keep_blank_lines_in_code = 2
-ij_css_keep_indents_on_empty_lines = false
-ij_css_keep_single_line_blocks = false
-ij_css_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
-ij_css_space_after_colon = true
-ij_css_space_before_opening_brace = true
-ij_css_use_double_quotes = true
-ij_css_value_alignment = do_not_align
-
-[*.feature]
-indent_size = 2
-ij_gherkin_keep_indents_on_empty_lines = false
-
-[*.java]
-max_line_length = 170
-ij_java_align_consecutive_assignments = false
-ij_java_align_consecutive_variable_declarations = false
-ij_java_align_group_field_declarations = false
-ij_java_align_multiline_annotation_parameters = false
-ij_java_align_multiline_array_initializer_expression = false
-ij_java_align_multiline_assignment = false
-ij_java_align_multiline_binary_operation = false
-ij_java_align_multiline_chained_methods = false
-ij_java_align_multiline_deconstruction_list_components = true
-ij_java_align_multiline_extends_list = false
-ij_java_align_multiline_for = true
-ij_java_align_multiline_method_parentheses = false
-ij_java_align_multiline_parameters = true
-ij_java_align_multiline_parameters_in_calls = false
-ij_java_align_multiline_parenthesized_expression = false
-ij_java_align_multiline_records = true
-ij_java_align_multiline_resources = false
-ij_java_align_multiline_ternary_operation = false
-ij_java_align_multiline_text_blocks = false
-ij_java_align_multiline_throws_list = false
-ij_java_align_subsequent_simple_methods = false
-ij_java_align_throws_keyword = false
-ij_java_align_types_in_multi_catch = false
-ij_java_annotation_parameter_wrap = off
-ij_java_array_initializer_new_line_after_left_brace = false
-ij_java_array_initializer_right_brace_on_new_line = false
-ij_java_array_initializer_wrap = normal
-ij_java_assert_statement_colon_on_next_line = false
-ij_java_assert_statement_wrap = off
-ij_java_assignment_wrap = off
-ij_java_binary_operation_sign_on_next_line = false
-ij_java_binary_operation_wrap = off
-ij_java_blank_lines_after_anonymous_class_header = 0
-ij_java_blank_lines_after_class_header = 0
-ij_java_blank_lines_after_imports = 1
-ij_java_blank_lines_after_package = 1
-ij_java_blank_lines_around_class = 1
-ij_java_blank_lines_around_field = 0
-ij_java_blank_lines_around_field_in_interface = 0
-ij_java_blank_lines_around_initializer = 1
-ij_java_blank_lines_around_method = 1
-ij_java_blank_lines_around_method_in_interface = 1
-ij_java_blank_lines_before_class_end = 0
-ij_java_blank_lines_before_imports = 1
-ij_java_blank_lines_before_method_body = 0
-ij_java_blank_lines_before_package = 0
-ij_java_block_brace_style = end_of_line
-ij_java_block_comment_add_space = false
-ij_java_block_comment_at_first_column = true
-ij_java_builder_methods = none
-ij_java_call_parameters_new_line_after_left_paren = false
-ij_java_call_parameters_right_paren_on_new_line = false
-ij_java_call_parameters_wrap = normal
-ij_java_case_statement_on_separate_line = true
-ij_java_catch_on_new_line = true
-ij_java_class_annotation_wrap = split_into_lines
-ij_java_class_brace_style = end_of_line
-ij_java_class_count_to_use_import_on_demand = 99
-ij_java_class_names_in_javadoc = 1
-ij_java_deconstruction_list_wrap = normal
-ij_java_do_not_indent_top_level_class_members = false
-ij_java_do_not_wrap_after_single_annotation = false
-ij_java_do_not_wrap_after_single_annotation_in_parameter = false
-ij_java_do_while_brace_force = never
-ij_java_doc_add_blank_line_after_description = true
-ij_java_doc_add_blank_line_after_param_comments = false
-ij_java_doc_add_blank_line_after_return = false
-ij_java_doc_add_p_tag_on_empty_lines = false
-ij_java_doc_align_exception_comments = true
-ij_java_doc_align_param_comments = true
-ij_java_doc_do_not_wrap_if_one_line = true
-ij_java_doc_enable_formatting = false
-ij_java_doc_enable_leading_asterisks = true
-ij_java_doc_indent_on_continuation = true
-ij_java_doc_keep_empty_lines = true
-ij_java_doc_keep_empty_parameter_tag = true
-ij_java_doc_keep_empty_return_tag = true
-ij_java_doc_keep_empty_throws_tag = true
-ij_java_doc_keep_invalid_tags = true
-ij_java_doc_param_description_on_new_line = false
-ij_java_doc_preserve_line_breaks = false
-ij_java_doc_use_throws_not_exception_tag = true
-ij_java_else_on_new_line = true
-ij_java_entity_dd_suffix = EJB
-ij_java_entity_eb_suffix = Bean
-ij_java_entity_hi_suffix = Home
-ij_java_entity_lhi_prefix = Local
-ij_java_entity_lhi_suffix = Home
-ij_java_entity_li_prefix = Local
-ij_java_entity_pk_class = java.lang.String
-ij_java_entity_vo_suffix = VO
-ij_java_enum_constants_wrap = split_into_lines
-ij_java_extends_keyword_wrap = normal
-ij_java_extends_list_wrap = normal
-ij_java_field_annotation_wrap = split_into_lines
-ij_java_finally_on_new_line = true
-ij_java_for_brace_force = never
-ij_java_for_statement_new_line_after_left_paren = false
-ij_java_for_statement_right_paren_on_new_line = false
-ij_java_for_statement_wrap = off
-ij_java_generate_final_locals = false
-ij_java_generate_final_parameters = false
-ij_java_if_brace_force = never
-ij_java_imports_layout = java.**,javax.**,|,org.**,|,com.**,|,io.**,|,*,|,io.kroxylicious.**,|,$*
-ij_java_indent_case_from_switch = true
-ij_java_insert_inner_class_imports = false
-ij_java_insert_override_annotation = true
-ij_java_keep_blank_lines_before_right_brace = 1
-ij_java_keep_blank_lines_between_package_declaration_and_header = 1
-ij_java_keep_blank_lines_in_code = 1
-ij_java_keep_blank_lines_in_declarations = 1
-ij_java_keep_builder_methods_indents = false
-ij_java_keep_control_statement_in_one_line = false
-ij_java_keep_first_column_comment = false
-ij_java_keep_indents_on_empty_lines = false
-ij_java_keep_line_breaks = true
-ij_java_keep_multiple_expressions_in_one_line = false
-ij_java_keep_simple_blocks_in_one_line = false
-ij_java_keep_simple_classes_in_one_line = false
-ij_java_keep_simple_lambdas_in_one_line = false
-ij_java_keep_simple_methods_in_one_line = false
-ij_java_label_indent_absolute = false
-ij_java_label_indent_size = 0
-ij_java_lambda_brace_style = end_of_line
-ij_java_layout_static_imports_separately = true
-ij_java_line_comment_add_space = false
-ij_java_line_comment_add_space_on_reformat = false
-ij_java_line_comment_at_first_column = true
-ij_java_message_dd_suffix = EJB
-ij_java_message_eb_suffix = Bean
-ij_java_method_annotation_wrap = split_into_lines
-ij_java_method_brace_style = end_of_line
-ij_java_method_call_chain_wrap = normal
-ij_java_method_parameters_new_line_after_left_paren = false
-ij_java_method_parameters_right_paren_on_new_line = false
-ij_java_method_parameters_wrap = normal
-ij_java_modifier_list_wrap = false
-ij_java_multi_catch_types_wrap = normal
-ij_java_names_count_to_use_import_on_demand = 3
-ij_java_new_line_after_lparen_in_annotation = false
-ij_java_new_line_after_lparen_in_deconstruction_pattern = true
-ij_java_new_line_after_lparen_in_record_header = false
-ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.*
-ij_java_parameter_annotation_wrap = off
-ij_java_parentheses_expression_new_line_after_left_paren = false
-ij_java_parentheses_expression_right_paren_on_new_line = false
-ij_java_place_assignment_sign_on_next_line = false
-ij_java_prefer_longer_names = true
-ij_java_prefer_parameters_wrap = false
-ij_java_record_components_wrap = normal
-ij_java_repeat_synchronized = true
-ij_java_replace_instanceof_and_cast = false
-ij_java_replace_null_check = true
-ij_java_replace_sum_lambda_with_method_ref = true
-ij_java_resource_list_new_line_after_left_paren = false
-ij_java_resource_list_right_paren_on_new_line = false
-ij_java_resource_list_wrap = on_every_item
-ij_java_rparen_on_new_line_in_annotation = false
-ij_java_rparen_on_new_line_in_deconstruction_pattern = true
-ij_java_rparen_on_new_line_in_record_header = false
-ij_java_session_dd_suffix = EJB
-ij_java_session_eb_suffix = Bean
-ij_java_session_hi_suffix = Home
-ij_java_session_lhi_prefix = Local
-ij_java_session_lhi_suffix = Home
-ij_java_session_li_prefix = Local
-ij_java_session_si_suffix = Service
-ij_java_space_after_closing_angle_bracket_in_type_argument = true
-ij_java_space_after_colon = true
-ij_java_space_after_comma = true
-ij_java_space_after_comma_in_type_arguments = true
-ij_java_space_after_for_semicolon = true
-ij_java_space_after_quest = true
-ij_java_space_after_type_cast = true
-ij_java_space_before_annotation_array_initializer_left_brace = false
-ij_java_space_before_annotation_parameter_list = false
-ij_java_space_before_array_initializer_left_brace = false
-ij_java_space_before_catch_keyword = true
-ij_java_space_before_catch_left_brace = true
-ij_java_space_before_catch_parentheses = true
-ij_java_space_before_class_left_brace = true
-ij_java_space_before_colon = true
-ij_java_space_before_colon_in_foreach = true
-ij_java_space_before_comma = false
-ij_java_space_before_deconstruction_list = false
-ij_java_space_before_do_left_brace = true
-ij_java_space_before_else_keyword = true
-ij_java_space_before_else_left_brace = true
-ij_java_space_before_finally_keyword = true
-ij_java_space_before_finally_left_brace = true
-ij_java_space_before_for_left_brace = true
-ij_java_space_before_for_parentheses = true
-ij_java_space_before_for_semicolon = false
-ij_java_space_before_if_left_brace = true
-ij_java_space_before_if_parentheses = true
-ij_java_space_before_method_call_parentheses = false
-ij_java_space_before_method_left_brace = true
-ij_java_space_before_method_parentheses = false
-ij_java_space_before_opening_angle_bracket_in_type_parameter = false
-ij_java_space_before_quest = true
-ij_java_space_before_switch_left_brace = true
-ij_java_space_before_switch_parentheses = true
-ij_java_space_before_synchronized_left_brace = true
-ij_java_space_before_synchronized_parentheses = true
-ij_java_space_before_try_left_brace = true
-ij_java_space_before_try_parentheses = true
-ij_java_space_before_type_parameter_list = false
-ij_java_space_before_while_keyword = true
-ij_java_space_before_while_left_brace = true
-ij_java_space_before_while_parentheses = true
-ij_java_space_inside_one_line_enum_braces = false
-ij_java_space_within_empty_array_initializer_braces = false
-ij_java_space_within_empty_method_call_parentheses = false
-ij_java_space_within_empty_method_parentheses = false
-ij_java_spaces_around_additive_operators = true
-ij_java_spaces_around_annotation_eq = true
-ij_java_spaces_around_assignment_operators = true
-ij_java_spaces_around_bitwise_operators = true
-ij_java_spaces_around_equality_operators = true
-ij_java_spaces_around_lambda_arrow = true
-ij_java_spaces_around_logical_operators = true
-ij_java_spaces_around_method_ref_dbl_colon = false
-ij_java_spaces_around_multiplicative_operators = true
-ij_java_spaces_around_relational_operators = true
-ij_java_spaces_around_shift_operators = true
-ij_java_spaces_around_type_bounds_in_type_parameters = true
-ij_java_spaces_around_unary_operator = false
-ij_java_spaces_within_angle_brackets = false
-ij_java_spaces_within_annotation_parentheses = false
-ij_java_spaces_within_array_initializer_braces = true
-ij_java_spaces_within_braces = false
-ij_java_spaces_within_brackets = false
-ij_java_spaces_within_cast_parentheses = false
-ij_java_spaces_within_catch_parentheses = false
-ij_java_spaces_within_deconstruction_list = false
-ij_java_spaces_within_for_parentheses = false
-ij_java_spaces_within_if_parentheses = false
-ij_java_spaces_within_method_call_parentheses = false
-ij_java_spaces_within_method_parentheses = false
-ij_java_spaces_within_parentheses = false
-ij_java_spaces_within_record_header = false
-ij_java_spaces_within_switch_parentheses = false
-ij_java_spaces_within_synchronized_parentheses = false
-ij_java_spaces_within_try_parentheses = false
-ij_java_spaces_within_while_parentheses = false
-ij_java_special_else_if_treatment = true
-ij_java_subclass_name_suffix = Impl
-ij_java_ternary_operation_signs_on_next_line = false
-ij_java_ternary_operation_wrap = on_every_item
-ij_java_test_name_suffix = Test
-ij_java_throws_keyword_wrap = normal
-ij_java_throws_list_wrap = normal
-ij_java_use_external_annotations = false
-ij_java_use_fq_class_names = false
-ij_java_use_relative_indents = false
-ij_java_use_single_class_imports = true
-ij_java_variable_annotation_wrap = off
-ij_java_visibility = public
-ij_java_while_brace_force = never
-ij_java_while_on_new_line = false
-ij_java_wrap_comments = false
-ij_java_wrap_first_method_in_call_chain = false
-ij_java_wrap_long_lines = false
-
-[*.less]
-indent_size = 2
-ij_less_align_closing_brace_with_properties = false
-ij_less_blank_lines_around_nested_selector = 1
-ij_less_blank_lines_between_blocks = 1
-ij_less_block_comment_add_space = false
-ij_less_brace_placement = 0
-ij_less_enforce_quotes_on_format = false
-ij_less_hex_color_long_format = false
-ij_less_hex_color_lower_case = false
-ij_less_hex_color_short_format = false
-ij_less_hex_color_upper_case = false
-ij_less_keep_blank_lines_in_code = 2
-ij_less_keep_indents_on_empty_lines = false
-ij_less_keep_single_line_blocks = false
-ij_less_line_comment_add_space = false
-ij_less_line_comment_at_first_column = false
-ij_less_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
-ij_less_space_after_colon = true
-ij_less_space_before_opening_brace = true
-ij_less_use_double_quotes = true
-ij_less_value_alignment = 0
-
-[*.proto]
-indent_size = 2
-tab_width = 2
-ij_continuation_indent_size = 4
-ij_protobuf_keep_blank_lines_in_code = 2
-ij_protobuf_keep_indents_on_empty_lines = false
-ij_protobuf_keep_line_breaks = true
-ij_protobuf_space_after_comma = true
-ij_protobuf_space_before_comma = false
-ij_protobuf_spaces_around_assignment_operators = true
-ij_protobuf_spaces_within_braces = false
-ij_protobuf_spaces_within_brackets = false
-
-[*.sass]
-indent_size = 2
-ij_sass_align_closing_brace_with_properties = false
-ij_sass_blank_lines_around_nested_selector = 1
-ij_sass_blank_lines_between_blocks = 1
-ij_sass_brace_placement = 0
-ij_sass_enforce_quotes_on_format = false
-ij_sass_hex_color_long_format = false
-ij_sass_hex_color_lower_case = false
-ij_sass_hex_color_short_format = false
-ij_sass_hex_color_upper_case = false
-ij_sass_keep_blank_lines_in_code = 2
-ij_sass_keep_indents_on_empty_lines = false
-ij_sass_keep_single_line_blocks = false
-ij_sass_line_comment_add_space = false
-ij_sass_line_comment_at_first_column = false
-ij_sass_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
-ij_sass_space_after_colon = true
-ij_sass_space_before_opening_brace = true
-ij_sass_use_double_quotes = true
-ij_sass_value_alignment = 0
-
-[*.scala]
-indent_size = 2
-tab_width = 2
-ij_continuation_indent_size = 2
-ij_scala_align_composite_pattern = true
-ij_scala_align_extends_with = 0
-ij_scala_align_group_field_declarations = false
-ij_scala_align_if_else = false
-ij_scala_align_in_columns_case_branch = false
-ij_scala_align_multiline_binary_operation = false
-ij_scala_align_multiline_chained_methods = false
-ij_scala_align_multiline_for = true
-ij_scala_align_multiline_parameters = true
-ij_scala_align_multiline_parameters_in_calls = false
-ij_scala_align_multiline_parenthesized_expression = false
-ij_scala_align_parameter_types_in_multiline_declarations = 0
-ij_scala_align_tuple_elements = false
-ij_scala_alternate_continuation_indent_for_params = 4
-ij_scala_binary_operation_wrap = off
-ij_scala_blank_lines_after_anonymous_class_header = 0
-ij_scala_blank_lines_after_class_header = 0
-ij_scala_blank_lines_after_imports = 1
-ij_scala_blank_lines_after_package = 1
-ij_scala_blank_lines_around_class = 1
-ij_scala_blank_lines_around_class_in_inner_scopes = 0
-ij_scala_blank_lines_around_field = 0
-ij_scala_blank_lines_around_field_in_inner_scopes = 0
-ij_scala_blank_lines_around_field_in_interface = 0
-ij_scala_blank_lines_around_method = 1
-ij_scala_blank_lines_around_method_in_inner_scopes = 1
-ij_scala_blank_lines_around_method_in_interface = 1
-ij_scala_blank_lines_before_class_end = 0
-ij_scala_blank_lines_before_imports = 1
-ij_scala_blank_lines_before_method_body = 0
-ij_scala_blank_lines_before_package = 0
-ij_scala_block_brace_style = end_of_line
-ij_scala_block_comment_add_space = false
-ij_scala_block_comment_at_first_column = true
-ij_scala_call_parameters_new_line_after_lparen = 0
-ij_scala_call_parameters_right_paren_on_new_line = false
-ij_scala_call_parameters_wrap = off
-ij_scala_case_clause_brace_force = never
-ij_scala_catch_on_new_line = false
-ij_scala_class_annotation_wrap = split_into_lines
-ij_scala_class_brace_style = end_of_line
-ij_scala_closure_brace_force = never
-ij_scala_do_not_align_block_expr_params = true
-ij_scala_do_not_indent_case_clause_body = false
-ij_scala_do_not_indent_tuples_close_brace = true
-ij_scala_do_while_brace_force = never
-ij_scala_else_on_new_line = false
-ij_scala_enable_scaladoc_formatting = true
-ij_scala_enforce_functional_syntax_for_unit = true
-ij_scala_extends_keyword_wrap = off
-ij_scala_extends_list_wrap = off
-ij_scala_field_annotation_wrap = split_into_lines
-ij_scala_finally_brace_force = never
-ij_scala_finally_on_new_line = false
-ij_scala_for_brace_force = never
-ij_scala_for_statement_wrap = off
-ij_scala_formatter = 0
-ij_scala_if_brace_force = never
-ij_scala_implicit_value_class_suffix = Ops
-ij_scala_indent_braced_function_args = true
-ij_scala_indent_case_from_switch = true
-ij_scala_indent_first_parameter = true
-ij_scala_indent_first_parameter_clause = false
-ij_scala_indent_type_arguments = true
-ij_scala_indent_type_parameters = true
-ij_scala_indent_yield_after_one_line_enumerators = true
-ij_scala_keep_blank_lines_before_right_brace = 2
-ij_scala_keep_blank_lines_in_code = 2
-ij_scala_keep_blank_lines_in_declarations = 2
-ij_scala_keep_comments_on_same_line = true
-ij_scala_keep_first_column_comment = false
-ij_scala_keep_indents_on_empty_lines = false
-ij_scala_keep_line_breaks = true
-ij_scala_keep_one_line_lambdas_in_arg_list = false
-ij_scala_keep_simple_blocks_in_one_line = false
-ij_scala_keep_simple_methods_in_one_line = false
-ij_scala_keep_xml_formatting = false
-ij_scala_line_comment_add_space = false
-ij_scala_line_comment_at_first_column = true
-ij_scala_method_annotation_wrap = split_into_lines
-ij_scala_method_brace_force = never
-ij_scala_method_brace_style = end_of_line
-ij_scala_method_call_chain_wrap = off
-ij_scala_method_parameters_new_line_after_left_paren = false
-ij_scala_method_parameters_right_paren_on_new_line = false
-ij_scala_method_parameters_wrap = off
-ij_scala_modifier_list_wrap = false
-ij_scala_multiline_string_align_dangling_closing_quotes = false
-ij_scala_multiline_string_closing_quotes_on_new_line = true
-ij_scala_multiline_string_insert_margin_on_enter = true
-ij_scala_multiline_string_margin_char = |
-ij_scala_multiline_string_margin_indent = 2
-ij_scala_multiline_string_opening_quotes_on_new_line = true
-ij_scala_multiline_string_process_margin_on_copy_paste = true
-ij_scala_new_line_after_case_clause_arrow_when_multiline_body = false
-ij_scala_newline_after_annotations = false
-ij_scala_not_continuation_indent_for_params = false
-ij_scala_parameter_annotation_wrap = off
-ij_scala_parentheses_expression_new_line_after_left_paren = false
-ij_scala_parentheses_expression_right_paren_on_new_line = false
-ij_scala_place_closure_parameters_on_new_line = false
-ij_scala_place_self_type_on_new_line = true
-ij_scala_prefer_parameters_wrap = false
-ij_scala_preserve_space_after_method_declaration_name = false
-ij_scala_reformat_on_compile = false
-ij_scala_replace_case_arrow_with_unicode_char = false
-ij_scala_replace_for_generator_arrow_with_unicode_char = false
-ij_scala_replace_lambda_with_greek_letter = false
-ij_scala_replace_map_arrow_with_unicode_char = false
-ij_scala_scalafmt_fallback_to_default_settings = false
-ij_scala_scalafmt_reformat_on_files_save = false
-ij_scala_scalafmt_show_invalid_code_warnings = true
-ij_scala_scalafmt_use_intellij_formatter_for_range_format = true
-ij_scala_sd_align_exception_comments = true
-ij_scala_sd_align_list_item_content = true
-ij_scala_sd_align_other_tags_comments = true
-ij_scala_sd_align_parameters_comments = true
-ij_scala_sd_align_return_comments = true
-ij_scala_sd_blank_line_after_parameters_comments = false
-ij_scala_sd_blank_line_after_return_comments = false
-ij_scala_sd_blank_line_before_parameters = false
-ij_scala_sd_blank_line_before_tags = true
-ij_scala_sd_blank_line_between_parameters = false
-ij_scala_sd_keep_blank_lines_between_tags = false
-ij_scala_sd_preserve_spaces_in_tags = false
-ij_scala_space_after_comma = true
-ij_scala_space_after_for_semicolon = true
-ij_scala_space_after_modifiers_constructor = false
-ij_scala_space_after_type_colon = true
-ij_scala_space_before_brace_method_call = true
-ij_scala_space_before_class_left_brace = true
-ij_scala_space_before_for_parentheses = true
-ij_scala_space_before_if_parentheses = true
-ij_scala_space_before_infix_like_method_parentheses = false
-ij_scala_space_before_infix_method_call_parentheses = false
-ij_scala_space_before_infix_operator_like_method_call_parentheses = true
-ij_scala_space_before_method_call_parentheses = false
-ij_scala_space_before_method_left_brace = true
-ij_scala_space_before_method_parentheses = false
-ij_scala_space_before_type_colon = false
-ij_scala_space_before_type_parameter_in_def_list = false
-ij_scala_space_before_type_parameter_leading_context_bound_colon = false
-ij_scala_space_before_type_parameter_leading_context_bound_colon_hk = true
-ij_scala_space_before_type_parameter_list = false
-ij_scala_space_before_type_parameter_rest_context_bound_colons = true
-ij_scala_space_before_while_parentheses = true
-ij_scala_space_inside_closure_braces = true
-ij_scala_space_inside_self_type_braces = true
-ij_scala_space_within_empty_method_call_parentheses = false
-ij_scala_spaces_around_at_in_patterns = false
-ij_scala_spaces_in_imports = false
-ij_scala_spaces_in_one_line_blocks = false
-ij_scala_spaces_within_brackets = false
-ij_scala_spaces_within_for_parentheses = false
-ij_scala_spaces_within_if_parentheses = false
-ij_scala_spaces_within_method_call_parentheses = false
-ij_scala_spaces_within_method_parentheses = false
-ij_scala_spaces_within_parentheses = false
-ij_scala_spaces_within_while_parentheses = false
-ij_scala_special_else_if_treatment = true
-ij_scala_trailing_comma_arg_list_enabled = true
-ij_scala_trailing_comma_import_selector_enabled = false
-ij_scala_trailing_comma_mode = trailing_comma_keep
-ij_scala_trailing_comma_params_enabled = true
-ij_scala_trailing_comma_pattern_arg_list_enabled = false
-ij_scala_trailing_comma_tuple_enabled = false
-ij_scala_trailing_comma_tuple_type_enabled = false
-ij_scala_trailing_comma_type_params_enabled = false
-ij_scala_try_brace_force = never
-ij_scala_type_annotation_exclude_constant = true
-ij_scala_type_annotation_exclude_in_dialect_sources = true
-ij_scala_type_annotation_exclude_in_test_sources = false
-ij_scala_type_annotation_exclude_member_of_anonymous_class = false
-ij_scala_type_annotation_exclude_member_of_private_class = false
-ij_scala_type_annotation_exclude_when_type_is_stable = true
-ij_scala_type_annotation_function_parameter = false
-ij_scala_type_annotation_implicit_modifier = true
-ij_scala_type_annotation_local_definition = false
-ij_scala_type_annotation_private_member = false
-ij_scala_type_annotation_protected_member = true
-ij_scala_type_annotation_public_member = true
-ij_scala_type_annotation_structural_type = true
-ij_scala_type_annotation_underscore_parameter = false
-ij_scala_type_annotation_unit_type = true
-ij_scala_use_alternate_continuation_indent_for_params = false
-ij_scala_use_scala3_indentation_based_syntax = true
-ij_scala_use_scaladoc2_formatting = false
-ij_scala_variable_annotation_wrap = off
-ij_scala_while_brace_force = never
-ij_scala_while_on_new_line = false
-ij_scala_wrap_before_with_keyword = false
-ij_scala_wrap_first_method_in_call_chain = false
-ij_scala_wrap_long_lines = false
-
-[*.scss]
-indent_size = 2
-ij_scss_align_closing_brace_with_properties = false
-ij_scss_blank_lines_around_nested_selector = 1
-ij_scss_blank_lines_between_blocks = 1
-ij_scss_block_comment_add_space = false
-ij_scss_brace_placement = 0
-ij_scss_enforce_quotes_on_format = false
-ij_scss_hex_color_long_format = false
-ij_scss_hex_color_lower_case = false
-ij_scss_hex_color_short_format = false
-ij_scss_hex_color_upper_case = false
-ij_scss_keep_blank_lines_in_code = 2
-ij_scss_keep_indents_on_empty_lines = false
-ij_scss_keep_single_line_blocks = false
-ij_scss_line_comment_add_space = false
-ij_scss_line_comment_at_first_column = false
-ij_scss_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
-ij_scss_space_after_colon = true
-ij_scss_space_before_opening_brace = true
-ij_scss_use_double_quotes = true
-ij_scss_value_alignment = 0
-
-[*.vue]
-indent_size = 2
-tab_width = 2
-ij_continuation_indent_size = 4
-ij_vue_indent_children_of_top_level = template
-ij_vue_interpolation_new_line_after_start_delimiter = true
-ij_vue_interpolation_new_line_before_end_delimiter = true
-ij_vue_interpolation_wrap = off
-ij_vue_keep_indents_on_empty_lines = false
-ij_vue_spaces_within_interpolation_expressions = true
-
-[.editorconfig]
-ij_editorconfig_align_group_field_declarations = false
-ij_editorconfig_space_after_colon = false
-ij_editorconfig_space_after_comma = true
-ij_editorconfig_space_before_colon = false
-ij_editorconfig_space_before_comma = false
-ij_editorconfig_spaces_around_assignment_operators = true
-
-[{*.ad,*.adoc,*.asciidoc,.asciidoctorconfig}]
-ij_asciidoc_blank_lines_after_header = 1
-ij_asciidoc_blank_lines_keep_after_header = 1
-ij_asciidoc_formatting_enabled = true
-ij_asciidoc_one_sentence_per_line = true
-
-[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.pom,*.rng,*.tld,*.wadl,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}]
-ij_xml_align_attributes = true
-ij_xml_align_text = false
-ij_xml_attribute_wrap = normal
-ij_xml_block_comment_add_space = false
-ij_xml_block_comment_at_first_column = true
-ij_xml_keep_blank_lines = 2
-ij_xml_keep_indents_on_empty_lines = false
-ij_xml_keep_line_breaks = true
-ij_xml_keep_line_breaks_in_text = true
-ij_xml_keep_whitespaces = false
-ij_xml_keep_whitespaces_around_cdata = preserve
-ij_xml_keep_whitespaces_inside_cdata = false
-ij_xml_line_comment_at_first_column = true
-ij_xml_space_after_tag_name = false
-ij_xml_space_around_equals_in_attribute = false
-ij_xml_space_inside_empty_tag = false
-ij_xml_text_wrap = normal
-ij_xml_use_custom_settings = false
-
-[{*.ats,*.cts,*.mts,*.ts}]
-ij_continuation_indent_size = 4
-ij_typescript_align_imports = false
-ij_typescript_align_multiline_array_initializer_expression = false
-ij_typescript_align_multiline_binary_operation = false
-ij_typescript_align_multiline_chained_methods = false
-ij_typescript_align_multiline_extends_list = false
-ij_typescript_align_multiline_for = true
-ij_typescript_align_multiline_parameters = true
-ij_typescript_align_multiline_parameters_in_calls = false
-ij_typescript_align_multiline_ternary_operation = false
-ij_typescript_align_object_properties = 0
-ij_typescript_align_union_types = false
-ij_typescript_align_var_statements = 0
-ij_typescript_array_initializer_new_line_after_left_brace = false
-ij_typescript_array_initializer_right_brace_on_new_line = false
-ij_typescript_array_initializer_wrap = off
-ij_typescript_assignment_wrap = off
-ij_typescript_binary_operation_sign_on_next_line = false
-ij_typescript_binary_operation_wrap = off
-ij_typescript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/**
-ij_typescript_blank_lines_after_imports = 1
-ij_typescript_blank_lines_around_class = 1
-ij_typescript_blank_lines_around_field = 0
-ij_typescript_blank_lines_around_field_in_interface = 0
-ij_typescript_blank_lines_around_function = 1
-ij_typescript_blank_lines_around_method = 1
-ij_typescript_blank_lines_around_method_in_interface = 1
-ij_typescript_block_brace_style = end_of_line
-ij_typescript_block_comment_add_space = false
-ij_typescript_block_comment_at_first_column = true
-ij_typescript_call_parameters_new_line_after_left_paren = false
-ij_typescript_call_parameters_right_paren_on_new_line = false
-ij_typescript_call_parameters_wrap = off
-ij_typescript_catch_on_new_line = false
-ij_typescript_chained_call_dot_on_new_line = true
-ij_typescript_class_brace_style = end_of_line
-ij_typescript_comma_on_new_line = false
-ij_typescript_do_while_brace_force = never
-ij_typescript_else_on_new_line = false
-ij_typescript_enforce_trailing_comma = keep
-ij_typescript_enum_constants_wrap = on_every_item
-ij_typescript_extends_keyword_wrap = off
-ij_typescript_extends_list_wrap = off
-ij_typescript_field_prefix = _
-ij_typescript_file_name_style = relaxed
-ij_typescript_finally_on_new_line = false
-ij_typescript_for_brace_force = never
-ij_typescript_for_statement_new_line_after_left_paren = false
-ij_typescript_for_statement_right_paren_on_new_line = false
-ij_typescript_for_statement_wrap = off
-ij_typescript_force_quote_style = false
-ij_typescript_force_semicolon_style = false
-ij_typescript_function_expression_brace_style = end_of_line
-ij_typescript_if_brace_force = never
-ij_typescript_import_merge_members = global
-ij_typescript_import_prefer_absolute_path = global
-ij_typescript_import_sort_members = true
-ij_typescript_import_sort_module_name = false
-ij_typescript_import_use_node_resolution = true
-ij_typescript_imports_wrap = on_every_item
-ij_typescript_indent_case_from_switch = true
-ij_typescript_indent_chained_calls = true
-ij_typescript_indent_package_children = 0
-ij_typescript_jsdoc_include_types = false
-ij_typescript_jsx_attribute_value = braces
-ij_typescript_keep_blank_lines_in_code = 2
-ij_typescript_keep_first_column_comment = true
-ij_typescript_keep_indents_on_empty_lines = false
-ij_typescript_keep_line_breaks = true
-ij_typescript_keep_simple_blocks_in_one_line = false
-ij_typescript_keep_simple_methods_in_one_line = false
-ij_typescript_line_comment_add_space = true
-ij_typescript_line_comment_at_first_column = false
-ij_typescript_method_brace_style = end_of_line
-ij_typescript_method_call_chain_wrap = off
-ij_typescript_method_parameters_new_line_after_left_paren = false
-ij_typescript_method_parameters_right_paren_on_new_line = false
-ij_typescript_method_parameters_wrap = off
-ij_typescript_object_literal_wrap = on_every_item
-ij_typescript_parentheses_expression_new_line_after_left_paren = false
-ij_typescript_parentheses_expression_right_paren_on_new_line = false
-ij_typescript_place_assignment_sign_on_next_line = false
-ij_typescript_prefer_as_type_cast = false
-ij_typescript_prefer_explicit_types_function_expression_returns = false
-ij_typescript_prefer_explicit_types_function_returns = false
-ij_typescript_prefer_explicit_types_vars_fields = false
-ij_typescript_prefer_parameters_wrap = false
-ij_typescript_reformat_c_style_comments = false
-ij_typescript_space_after_colon = true
-ij_typescript_space_after_comma = true
-ij_typescript_space_after_dots_in_rest_parameter = false
-ij_typescript_space_after_generator_mult = true
-ij_typescript_space_after_property_colon = true
-ij_typescript_space_after_quest = true
-ij_typescript_space_after_type_colon = true
-ij_typescript_space_after_unary_not = false
-ij_typescript_space_before_async_arrow_lparen = true
-ij_typescript_space_before_catch_keyword = true
-ij_typescript_space_before_catch_left_brace = true
-ij_typescript_space_before_catch_parentheses = true
-ij_typescript_space_before_class_lbrace = true
-ij_typescript_space_before_class_left_brace = true
-ij_typescript_space_before_colon = true
-ij_typescript_space_before_comma = false
-ij_typescript_space_before_do_left_brace = true
-ij_typescript_space_before_else_keyword = true
-ij_typescript_space_before_else_left_brace = true
-ij_typescript_space_before_finally_keyword = true
-ij_typescript_space_before_finally_left_brace = true
-ij_typescript_space_before_for_left_brace = true
-ij_typescript_space_before_for_parentheses = true
-ij_typescript_space_before_for_semicolon = false
-ij_typescript_space_before_function_left_parenth = true
-ij_typescript_space_before_generator_mult = false
-ij_typescript_space_before_if_left_brace = true
-ij_typescript_space_before_if_parentheses = true
-ij_typescript_space_before_method_call_parentheses = false
-ij_typescript_space_before_method_left_brace = true
-ij_typescript_space_before_method_parentheses = false
-ij_typescript_space_before_property_colon = false
-ij_typescript_space_before_quest = true
-ij_typescript_space_before_switch_left_brace = true
-ij_typescript_space_before_switch_parentheses = true
-ij_typescript_space_before_try_left_brace = true
-ij_typescript_space_before_type_colon = false
-ij_typescript_space_before_unary_not = false
-ij_typescript_space_before_while_keyword = true
-ij_typescript_space_before_while_left_brace = true
-ij_typescript_space_before_while_parentheses = true
-ij_typescript_spaces_around_additive_operators = true
-ij_typescript_spaces_around_arrow_function_operator = true
-ij_typescript_spaces_around_assignment_operators = true
-ij_typescript_spaces_around_bitwise_operators = true
-ij_typescript_spaces_around_equality_operators = true
-ij_typescript_spaces_around_logical_operators = true
-ij_typescript_spaces_around_multiplicative_operators = true
-ij_typescript_spaces_around_relational_operators = true
-ij_typescript_spaces_around_shift_operators = true
-ij_typescript_spaces_around_unary_operator = false
-ij_typescript_spaces_within_array_initializer_brackets = false
-ij_typescript_spaces_within_brackets = false
-ij_typescript_spaces_within_catch_parentheses = false
-ij_typescript_spaces_within_for_parentheses = false
-ij_typescript_spaces_within_if_parentheses = false
-ij_typescript_spaces_within_imports = false
-ij_typescript_spaces_within_interpolation_expressions = false
-ij_typescript_spaces_within_method_call_parentheses = false
-ij_typescript_spaces_within_method_parentheses = false
-ij_typescript_spaces_within_object_literal_braces = false
-ij_typescript_spaces_within_object_type_braces = true
-ij_typescript_spaces_within_parentheses = false
-ij_typescript_spaces_within_switch_parentheses = false
-ij_typescript_spaces_within_type_assertion = false
-ij_typescript_spaces_within_union_types = true
-ij_typescript_spaces_within_while_parentheses = false
-ij_typescript_special_else_if_treatment = true
-ij_typescript_ternary_operation_signs_on_next_line = false
-ij_typescript_ternary_operation_wrap = off
-ij_typescript_union_types_wrap = on_every_item
-ij_typescript_use_chained_calls_group_indents = false
-ij_typescript_use_double_quotes = true
-ij_typescript_use_explicit_js_extension = auto
-ij_typescript_use_path_mapping = always
-ij_typescript_use_public_modifier = false
-ij_typescript_use_semicolon_after_statement = true
-ij_typescript_var_declaration_wrap = normal
-ij_typescript_while_brace_force = never
-ij_typescript_while_on_new_line = false
-ij_typescript_wrap_comments = false
-
-[{*.bash,*.sh,*.zsh}]
-indent_size = 2
-tab_width = 2
-ij_shell_binary_ops_start_line = false
-ij_shell_keep_column_alignment_padding = false
-ij_shell_minify_program = false
-ij_shell_redirect_followed_by_space = false
-ij_shell_switch_cases_indented = false
-ij_shell_use_unix_line_separator = true
-
-[{*.cjs,*.js}]
-ij_continuation_indent_size = 4
-ij_javascript_align_imports = false
-ij_javascript_align_multiline_array_initializer_expression = false
-ij_javascript_align_multiline_binary_operation = false
-ij_javascript_align_multiline_chained_methods = false
-ij_javascript_align_multiline_extends_list = false
-ij_javascript_align_multiline_for = true
-ij_javascript_align_multiline_parameters = true
-ij_javascript_align_multiline_parameters_in_calls = false
-ij_javascript_align_multiline_ternary_operation = false
-ij_javascript_align_object_properties = 0
-ij_javascript_align_union_types = false
-ij_javascript_align_var_statements = 0
-ij_javascript_array_initializer_new_line_after_left_brace = false
-ij_javascript_array_initializer_right_brace_on_new_line = false
-ij_javascript_array_initializer_wrap = off
-ij_javascript_assignment_wrap = off
-ij_javascript_binary_operation_sign_on_next_line = false
-ij_javascript_binary_operation_wrap = off
-ij_javascript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/**
-ij_javascript_blank_lines_after_imports = 1
-ij_javascript_blank_lines_around_class = 1
-ij_javascript_blank_lines_around_field = 0
-ij_javascript_blank_lines_around_function = 1
-ij_javascript_blank_lines_around_method = 1
-ij_javascript_block_brace_style = end_of_line
-ij_javascript_block_comment_add_space = false
-ij_javascript_block_comment_at_first_column = true
-ij_javascript_call_parameters_new_line_after_left_paren = false
-ij_javascript_call_parameters_right_paren_on_new_line = false
-ij_javascript_call_parameters_wrap = off
-ij_javascript_catch_on_new_line = false
-ij_javascript_chained_call_dot_on_new_line = true
-ij_javascript_class_brace_style = end_of_line
-ij_javascript_comma_on_new_line = false
-ij_javascript_do_while_brace_force = never
-ij_javascript_else_on_new_line = false
-ij_javascript_enforce_trailing_comma = keep
-ij_javascript_extends_keyword_wrap = off
-ij_javascript_extends_list_wrap = off
-ij_javascript_field_prefix = _
-ij_javascript_file_name_style = relaxed
-ij_javascript_finally_on_new_line = false
-ij_javascript_for_brace_force = never
-ij_javascript_for_statement_new_line_after_left_paren = false
-ij_javascript_for_statement_right_paren_on_new_line = false
-ij_javascript_for_statement_wrap = off
-ij_javascript_force_quote_style = false
-ij_javascript_force_semicolon_style = false
-ij_javascript_function_expression_brace_style = end_of_line
-ij_javascript_if_brace_force = never
-ij_javascript_import_merge_members = global
-ij_javascript_import_prefer_absolute_path = global
-ij_javascript_import_sort_members = true
-ij_javascript_import_sort_module_name = false
-ij_javascript_import_use_node_resolution = true
-ij_javascript_imports_wrap = on_every_item
-ij_javascript_indent_case_from_switch = true
-ij_javascript_indent_chained_calls = true
-ij_javascript_indent_package_children = 0
-ij_javascript_jsx_attribute_value = braces
-ij_javascript_keep_blank_lines_in_code = 2
-ij_javascript_keep_first_column_comment = true
-ij_javascript_keep_indents_on_empty_lines = false
-ij_javascript_keep_line_breaks = true
-ij_javascript_keep_simple_blocks_in_one_line = false
-ij_javascript_keep_simple_methods_in_one_line = false
-ij_javascript_line_comment_add_space = true
-ij_javascript_line_comment_at_first_column = false
-ij_javascript_method_brace_style = end_of_line
-ij_javascript_method_call_chain_wrap = off
-ij_javascript_method_parameters_new_line_after_left_paren = false
-ij_javascript_method_parameters_right_paren_on_new_line = false
-ij_javascript_method_parameters_wrap = off
-ij_javascript_object_literal_wrap = on_every_item
-ij_javascript_parentheses_expression_new_line_after_left_paren = false
-ij_javascript_parentheses_expression_right_paren_on_new_line = false
-ij_javascript_place_assignment_sign_on_next_line = false
-ij_javascript_prefer_as_type_cast = false
-ij_javascript_prefer_explicit_types_function_expression_returns = false
-ij_javascript_prefer_explicit_types_function_returns = false
-ij_javascript_prefer_explicit_types_vars_fields = false
-ij_javascript_prefer_parameters_wrap = false
-ij_javascript_reformat_c_style_comments = false
-ij_javascript_space_after_colon = true
-ij_javascript_space_after_comma = true
-ij_javascript_space_after_dots_in_rest_parameter = false
-ij_javascript_space_after_generator_mult = true
-ij_javascript_space_after_property_colon = true
-ij_javascript_space_after_quest = true
-ij_javascript_space_after_type_colon = true
-ij_javascript_space_after_unary_not = false
-ij_javascript_space_before_async_arrow_lparen = true
-ij_javascript_space_before_catch_keyword = true
-ij_javascript_space_before_catch_left_brace = true
-ij_javascript_space_before_catch_parentheses = true
-ij_javascript_space_before_class_lbrace = true
-ij_javascript_space_before_class_left_brace = true
-ij_javascript_space_before_colon = true
-ij_javascript_space_before_comma = false
-ij_javascript_space_before_do_left_brace = true
-ij_javascript_space_before_else_keyword = true
-ij_javascript_space_before_else_left_brace = true
-ij_javascript_space_before_finally_keyword = true
-ij_javascript_space_before_finally_left_brace = true
-ij_javascript_space_before_for_left_brace = true
-ij_javascript_space_before_for_parentheses = true
-ij_javascript_space_before_for_semicolon = false
-ij_javascript_space_before_function_left_parenth = true
-ij_javascript_space_before_generator_mult = false
-ij_javascript_space_before_if_left_brace = true
-ij_javascript_space_before_if_parentheses = true
-ij_javascript_space_before_method_call_parentheses = false
-ij_javascript_space_before_method_left_brace = true
-ij_javascript_space_before_method_parentheses = false
-ij_javascript_space_before_property_colon = false
-ij_javascript_space_before_quest = true
-ij_javascript_space_before_switch_left_brace = true
-ij_javascript_space_before_switch_parentheses = true
-ij_javascript_space_before_try_left_brace = true
-ij_javascript_space_before_type_colon = false
-ij_javascript_space_before_unary_not = false
-ij_javascript_space_before_while_keyword = true
-ij_javascript_space_before_while_left_brace = true
-ij_javascript_space_before_while_parentheses = true
-ij_javascript_spaces_around_additive_operators = true
-ij_javascript_spaces_around_arrow_function_operator = true
-ij_javascript_spaces_around_assignment_operators = true
-ij_javascript_spaces_around_bitwise_operators = true
-ij_javascript_spaces_around_equality_operators = true
-ij_javascript_spaces_around_logical_operators = true
-ij_javascript_spaces_around_multiplicative_operators = true
-ij_javascript_spaces_around_relational_operators = true
-ij_javascript_spaces_around_shift_operators = true
-ij_javascript_spaces_around_unary_operator = false
-ij_javascript_spaces_within_array_initializer_brackets = false
-ij_javascript_spaces_within_brackets = false
-ij_javascript_spaces_within_catch_parentheses = false
-ij_javascript_spaces_within_for_parentheses = false
-ij_javascript_spaces_within_if_parentheses = false
-ij_javascript_spaces_within_imports = false
-ij_javascript_spaces_within_interpolation_expressions = false
-ij_javascript_spaces_within_method_call_parentheses = false
-ij_javascript_spaces_within_method_parentheses = false
-ij_javascript_spaces_within_object_literal_braces = false
-ij_javascript_spaces_within_object_type_braces = true
-ij_javascript_spaces_within_parentheses = false
-ij_javascript_spaces_within_switch_parentheses = false
-ij_javascript_spaces_within_type_assertion = false
-ij_javascript_spaces_within_union_types = true
-ij_javascript_spaces_within_while_parentheses = false
-ij_javascript_special_else_if_treatment = true
-ij_javascript_ternary_operation_signs_on_next_line = false
-ij_javascript_ternary_operation_wrap = off
-ij_javascript_union_types_wrap = on_every_item
-ij_javascript_use_chained_calls_group_indents = false
-ij_javascript_use_double_quotes = true
-ij_javascript_use_explicit_js_extension = auto
-ij_javascript_use_path_mapping = always
-ij_javascript_use_public_modifier = false
-ij_javascript_use_semicolon_after_statement = true
-ij_javascript_var_declaration_wrap = normal
-ij_javascript_while_brace_force = never
-ij_javascript_while_on_new_line = false
-ij_javascript_wrap_comments = false
-
-[{*.ft,*.vm,*.vsl}]
-ij_vtl_keep_indents_on_empty_lines = false
-
-[{*.gant,*.groovy,*.gy}]
-ij_groovy_align_group_field_declarations = false
-ij_groovy_align_multiline_array_initializer_expression = false
-ij_groovy_align_multiline_assignment = false
-ij_groovy_align_multiline_binary_operation = false
-ij_groovy_align_multiline_chained_methods = false
-ij_groovy_align_multiline_extends_list = false
-ij_groovy_align_multiline_for = true
-ij_groovy_align_multiline_list_or_map = true
-ij_groovy_align_multiline_method_parentheses = false
-ij_groovy_align_multiline_parameters = true
-ij_groovy_align_multiline_parameters_in_calls = false
-ij_groovy_align_multiline_resources = true
-ij_groovy_align_multiline_ternary_operation = false
-ij_groovy_align_multiline_throws_list = false
-ij_groovy_align_named_args_in_map = true
-ij_groovy_align_throws_keyword = false
-ij_groovy_array_initializer_new_line_after_left_brace = false
-ij_groovy_array_initializer_right_brace_on_new_line = false
-ij_groovy_array_initializer_wrap = off
-ij_groovy_assert_statement_wrap = off
-ij_groovy_assignment_wrap = off
-ij_groovy_binary_operation_wrap = off
-ij_groovy_blank_lines_after_class_header = 0
-ij_groovy_blank_lines_after_imports = 1
-ij_groovy_blank_lines_after_package = 1
-ij_groovy_blank_lines_around_class = 1
-ij_groovy_blank_lines_around_field = 0
-ij_groovy_blank_lines_around_field_in_interface = 0
-ij_groovy_blank_lines_around_method = 1
-ij_groovy_blank_lines_around_method_in_interface = 1
-ij_groovy_blank_lines_before_imports = 1
-ij_groovy_blank_lines_before_method_body = 0
-ij_groovy_blank_lines_before_package = 0
-ij_groovy_block_brace_style = end_of_line
-ij_groovy_block_comment_add_space = false
-ij_groovy_block_comment_at_first_column = true
-ij_groovy_call_parameters_new_line_after_left_paren = false
-ij_groovy_call_parameters_right_paren_on_new_line = false
-ij_groovy_call_parameters_wrap = off
-ij_groovy_catch_on_new_line = false
-ij_groovy_class_annotation_wrap = split_into_lines
-ij_groovy_class_brace_style = end_of_line
-ij_groovy_class_count_to_use_import_on_demand = 5
-ij_groovy_do_while_brace_force = never
-ij_groovy_else_on_new_line = false
-ij_groovy_enable_groovydoc_formatting = true
-ij_groovy_enum_constants_wrap = off
-ij_groovy_extends_keyword_wrap = off
-ij_groovy_extends_list_wrap = off
-ij_groovy_field_annotation_wrap = split_into_lines
-ij_groovy_finally_on_new_line = false
-ij_groovy_for_brace_force = never
-ij_groovy_for_statement_new_line_after_left_paren = false
-ij_groovy_for_statement_right_paren_on_new_line = false
-ij_groovy_for_statement_wrap = off
-ij_groovy_ginq_general_clause_wrap_policy = 2
-ij_groovy_ginq_having_wrap_policy = 1
-ij_groovy_ginq_indent_having_clause = true
-ij_groovy_ginq_indent_on_clause = true
-ij_groovy_ginq_on_wrap_policy = 1
-ij_groovy_ginq_space_after_keyword = true
-ij_groovy_if_brace_force = never
-ij_groovy_import_annotation_wrap = 2
-ij_groovy_imports_layout = *,|,javax.**,java.**,|,$*
-ij_groovy_indent_case_from_switch = true
-ij_groovy_indent_label_blocks = true
-ij_groovy_insert_inner_class_imports = false
-ij_groovy_keep_blank_lines_before_right_brace = 2
-ij_groovy_keep_blank_lines_in_code = 2
-ij_groovy_keep_blank_lines_in_declarations = 2
-ij_groovy_keep_control_statement_in_one_line = true
-ij_groovy_keep_first_column_comment = true
-ij_groovy_keep_indents_on_empty_lines = false
-ij_groovy_keep_line_breaks = true
-ij_groovy_keep_multiple_expressions_in_one_line = false
-ij_groovy_keep_simple_blocks_in_one_line = false
-ij_groovy_keep_simple_classes_in_one_line = true
-ij_groovy_keep_simple_lambdas_in_one_line = true
-ij_groovy_keep_simple_methods_in_one_line = true
-ij_groovy_label_indent_absolute = false
-ij_groovy_label_indent_size = 0
-ij_groovy_lambda_brace_style = end_of_line
-ij_groovy_layout_static_imports_separately = true
-ij_groovy_line_comment_add_space = false
-ij_groovy_line_comment_add_space_on_reformat = false
-ij_groovy_line_comment_at_first_column = true
-ij_groovy_method_annotation_wrap = split_into_lines
-ij_groovy_method_brace_style = end_of_line
-ij_groovy_method_call_chain_wrap = off
-ij_groovy_method_parameters_new_line_after_left_paren = false
-ij_groovy_method_parameters_right_paren_on_new_line = false
-ij_groovy_method_parameters_wrap = off
-ij_groovy_modifier_list_wrap = false
-ij_groovy_names_count_to_use_import_on_demand = 3
-ij_groovy_packages_to_use_import_on_demand = java.awt.*,javax.swing.*
-ij_groovy_parameter_annotation_wrap = off
-ij_groovy_parentheses_expression_new_line_after_left_paren = false
-ij_groovy_parentheses_expression_right_paren_on_new_line = false
-ij_groovy_prefer_parameters_wrap = false
-ij_groovy_resource_list_new_line_after_left_paren = false
-ij_groovy_resource_list_right_paren_on_new_line = false
-ij_groovy_resource_list_wrap = off
-ij_groovy_space_after_assert_separator = true
-ij_groovy_space_after_colon = true
-ij_groovy_space_after_comma = true
-ij_groovy_space_after_comma_in_type_arguments = true
-ij_groovy_space_after_for_semicolon = true
-ij_groovy_space_after_quest = true
-ij_groovy_space_after_type_cast = true
-ij_groovy_space_before_annotation_parameter_list = false
-ij_groovy_space_before_array_initializer_left_brace = false
-ij_groovy_space_before_assert_separator = false
-ij_groovy_space_before_catch_keyword = true
-ij_groovy_space_before_catch_left_brace = true
-ij_groovy_space_before_catch_parentheses = true
-ij_groovy_space_before_class_left_brace = true
-ij_groovy_space_before_closure_left_brace = true
-ij_groovy_space_before_colon = true
-ij_groovy_space_before_comma = false
-ij_groovy_space_before_do_left_brace = true
-ij_groovy_space_before_else_keyword = true
-ij_groovy_space_before_else_left_brace = true
-ij_groovy_space_before_finally_keyword = true
-ij_groovy_space_before_finally_left_brace = true
-ij_groovy_space_before_for_left_brace = true
-ij_groovy_space_before_for_parentheses = true
-ij_groovy_space_before_for_semicolon = false
-ij_groovy_space_before_if_left_brace = true
-ij_groovy_space_before_if_parentheses = true
-ij_groovy_space_before_method_call_parentheses = false
-ij_groovy_space_before_method_left_brace = true
-ij_groovy_space_before_method_parentheses = false
-ij_groovy_space_before_quest = true
-ij_groovy_space_before_record_parentheses = false
-ij_groovy_space_before_switch_left_brace = true
-ij_groovy_space_before_switch_parentheses = true
-ij_groovy_space_before_synchronized_left_brace = true
-ij_groovy_space_before_synchronized_parentheses = true
-ij_groovy_space_before_try_left_brace = true
-ij_groovy_space_before_try_parentheses = true
-ij_groovy_space_before_while_keyword = true
-ij_groovy_space_before_while_left_brace = true
-ij_groovy_space_before_while_parentheses = true
-ij_groovy_space_in_named_argument = true
-ij_groovy_space_in_named_argument_before_colon = false
-ij_groovy_space_within_empty_array_initializer_braces = false
-ij_groovy_space_within_empty_method_call_parentheses = false
-ij_groovy_spaces_around_additive_operators = true
-ij_groovy_spaces_around_assignment_operators = true
-ij_groovy_spaces_around_bitwise_operators = true
-ij_groovy_spaces_around_equality_operators = true
-ij_groovy_spaces_around_lambda_arrow = true
-ij_groovy_spaces_around_logical_operators = true
-ij_groovy_spaces_around_multiplicative_operators = true
-ij_groovy_spaces_around_regex_operators = true
-ij_groovy_spaces_around_relational_operators = true
-ij_groovy_spaces_around_shift_operators = true
-ij_groovy_spaces_within_annotation_parentheses = false
-ij_groovy_spaces_within_array_initializer_braces = false
-ij_groovy_spaces_within_braces = true
-ij_groovy_spaces_within_brackets = false
-ij_groovy_spaces_within_cast_parentheses = false
-ij_groovy_spaces_within_catch_parentheses = false
-ij_groovy_spaces_within_for_parentheses = false
-ij_groovy_spaces_within_gstring_injection_braces = false
-ij_groovy_spaces_within_if_parentheses = false
-ij_groovy_spaces_within_list_or_map = false
-ij_groovy_spaces_within_method_call_parentheses = false
-ij_groovy_spaces_within_method_parentheses = false
-ij_groovy_spaces_within_parentheses = false
-ij_groovy_spaces_within_switch_parentheses = false
-ij_groovy_spaces_within_synchronized_parentheses = false
-ij_groovy_spaces_within_try_parentheses = false
-ij_groovy_spaces_within_tuple_expression = false
-ij_groovy_spaces_within_while_parentheses = false
-ij_groovy_special_else_if_treatment = true
-ij_groovy_ternary_operation_wrap = off
-ij_groovy_throws_keyword_wrap = off
-ij_groovy_throws_list_wrap = off
-ij_groovy_use_flying_geese_braces = false
-ij_groovy_use_fq_class_names = false
-ij_groovy_use_fq_class_names_in_javadoc = true
-ij_groovy_use_relative_indents = false
-ij_groovy_use_single_class_imports = true
-ij_groovy_variable_annotation_wrap = off
-ij_groovy_while_brace_force = never
-ij_groovy_while_on_new_line = false
-ij_groovy_wrap_chain_calls_after_dot = false
-ij_groovy_wrap_long_lines = false
-
-[{*.gradle.kts,*.kt,*.kts,*.main.kts,*.space.kts}]
-ij_kotlin_align_in_columns_case_branch = false
-ij_kotlin_align_multiline_binary_operation = false
-ij_kotlin_align_multiline_extends_list = false
-ij_kotlin_align_multiline_method_parentheses = false
-ij_kotlin_align_multiline_parameters = true
-ij_kotlin_align_multiline_parameters_in_calls = false
-ij_kotlin_allow_trailing_comma = false
-ij_kotlin_allow_trailing_comma_on_call_site = false
-ij_kotlin_assignment_wrap = off
-ij_kotlin_blank_lines_after_class_header = 0
-ij_kotlin_blank_lines_around_block_when_branches = 0
-ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1
-ij_kotlin_block_comment_add_space = false
-ij_kotlin_block_comment_at_first_column = true
-ij_kotlin_call_parameters_new_line_after_left_paren = false
-ij_kotlin_call_parameters_right_paren_on_new_line = false
-ij_kotlin_call_parameters_wrap = off
-ij_kotlin_catch_on_new_line = false
-ij_kotlin_class_annotation_wrap = split_into_lines
-ij_kotlin_continuation_indent_for_chained_calls = true
-ij_kotlin_continuation_indent_for_expression_bodies = true
-ij_kotlin_continuation_indent_in_argument_lists = true
-ij_kotlin_continuation_indent_in_elvis = true
-ij_kotlin_continuation_indent_in_if_conditions = true
-ij_kotlin_continuation_indent_in_parameter_lists = true
-ij_kotlin_continuation_indent_in_supertype_lists = true
-ij_kotlin_else_on_new_line = false
-ij_kotlin_enum_constants_wrap = off
-ij_kotlin_extends_list_wrap = off
-ij_kotlin_field_annotation_wrap = split_into_lines
-ij_kotlin_finally_on_new_line = false
-ij_kotlin_if_rparen_on_new_line = false
-ij_kotlin_import_nested_classes = false
-ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^
-ij_kotlin_insert_whitespaces_in_simple_one_line_method = true
-ij_kotlin_keep_blank_lines_before_right_brace = 2
-ij_kotlin_keep_blank_lines_in_code = 2
-ij_kotlin_keep_blank_lines_in_declarations = 2
-ij_kotlin_keep_first_column_comment = true
-ij_kotlin_keep_indents_on_empty_lines = false
-ij_kotlin_keep_line_breaks = true
-ij_kotlin_lbrace_on_next_line = false
-ij_kotlin_line_break_after_multiline_when_entry = true
-ij_kotlin_line_comment_add_space = false
-ij_kotlin_line_comment_add_space_on_reformat = false
-ij_kotlin_line_comment_at_first_column = true
-ij_kotlin_method_annotation_wrap = split_into_lines
-ij_kotlin_method_call_chain_wrap = off
-ij_kotlin_method_parameters_new_line_after_left_paren = false
-ij_kotlin_method_parameters_right_paren_on_new_line = false
-ij_kotlin_method_parameters_wrap = off
-ij_kotlin_name_count_to_use_star_import = 5
-ij_kotlin_name_count_to_use_star_import_for_members = 3
-ij_kotlin_packages_to_use_import_on_demand = java.util.*,kotlinx.android.synthetic.**,io.ktor.**
-ij_kotlin_parameter_annotation_wrap = off
-ij_kotlin_space_after_comma = true
-ij_kotlin_space_after_extend_colon = true
-ij_kotlin_space_after_type_colon = true
-ij_kotlin_space_before_catch_parentheses = true
-ij_kotlin_space_before_comma = false
-ij_kotlin_space_before_extend_colon = true
-ij_kotlin_space_before_for_parentheses = true
-ij_kotlin_space_before_if_parentheses = true
-ij_kotlin_space_before_lambda_arrow = true
-ij_kotlin_space_before_type_colon = false
-ij_kotlin_space_before_when_parentheses = true
-ij_kotlin_space_before_while_parentheses = true
-ij_kotlin_spaces_around_additive_operators = true
-ij_kotlin_spaces_around_assignment_operators = true
-ij_kotlin_spaces_around_equality_operators = true
-ij_kotlin_spaces_around_function_type_arrow = true
-ij_kotlin_spaces_around_logical_operators = true
-ij_kotlin_spaces_around_multiplicative_operators = true
-ij_kotlin_spaces_around_range = false
-ij_kotlin_spaces_around_relational_operators = true
-ij_kotlin_spaces_around_unary_operator = false
-ij_kotlin_spaces_around_when_arrow = true
-ij_kotlin_variable_annotation_wrap = off
-ij_kotlin_while_on_new_line = false
-ij_kotlin_wrap_elvis_expressions = 1
-ij_kotlin_wrap_expression_body_functions = 0
-ij_kotlin_wrap_first_method_in_call_chain = false
-
-[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.prettierrc,.stylelintrc,bowerrc,jest.config}]
-indent_size = 2
-ij_json_array_wrapping = split_into_lines
-ij_json_keep_blank_lines_in_code = 0
-ij_json_keep_indents_on_empty_lines = false
-ij_json_keep_line_breaks = true
-ij_json_keep_trailing_comma = false
-ij_json_object_wrapping = split_into_lines
-ij_json_property_alignment = do_not_align
-ij_json_space_after_colon = true
-ij_json_space_after_comma = true
-ij_json_space_before_colon = false
-ij_json_space_before_comma = false
-ij_json_spaces_within_braces = false
-ij_json_spaces_within_brackets = false
-ij_json_wrap_long_lines = false
-
-[{*.htm,*.html,*.ng,*.sht,*.shtm,*.shtml}]
-ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3
-ij_html_align_attributes = true
-ij_html_align_text = false
-ij_html_attribute_wrap = normal
-ij_html_block_comment_add_space = false
-ij_html_block_comment_at_first_column = true
-ij_html_do_not_align_children_of_min_lines = 0
-ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p
-ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot
-ij_html_enforce_quotes = false
-ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var
-ij_html_keep_blank_lines = 2
-ij_html_keep_indents_on_empty_lines = false
-ij_html_keep_line_breaks = true
-ij_html_keep_line_breaks_in_text = true
-ij_html_keep_whitespaces = false
-ij_html_keep_whitespaces_inside = span,pre,textarea
-ij_html_line_comment_at_first_column = true
-ij_html_new_line_after_last_attribute = never
-ij_html_new_line_before_first_attribute = never
-ij_html_quote_style = double
-ij_html_remove_new_line_before_tags = br
-ij_html_space_after_tag_name = false
-ij_html_space_around_equality_in_attribute = false
-ij_html_space_inside_empty_tag = false
-ij_html_text_wrap = normal
-
-[{*.http,*.rest}]
-indent_size = 0
-ij_continuation_indent_size = 4
-ij_http request_call_parameters_wrap = normal
-
-[{*.jsf,*.jsp,*.jspf,*.tag,*.tagf,*.xjsp}]
-ij_jsp_jsp_prefer_comma_separated_import_list = false
-ij_jsp_keep_indents_on_empty_lines = false
-
-[{*.jspx,*.tagx}]
-ij_jspx_keep_indents_on_empty_lines = false
-
-[{*.markdown,*.md}]
-ij_markdown_force_one_space_after_blockquote_symbol = true
-ij_markdown_force_one_space_after_header_symbol = true
-ij_markdown_force_one_space_after_list_bullet = true
-ij_markdown_force_one_space_between_words = true
-ij_markdown_format_tables = true
-ij_markdown_insert_quote_arrows_on_wrap = true
-ij_markdown_keep_indents_on_empty_lines = false
-ij_markdown_keep_line_breaks_inside_text_blocks = true
-ij_markdown_max_lines_around_block_elements = 1
-ij_markdown_max_lines_around_header = 1
-ij_markdown_max_lines_between_paragraphs = 1
-ij_markdown_min_lines_around_block_elements = 1
-ij_markdown_min_lines_around_header = 1
-ij_markdown_min_lines_between_paragraphs = 1
-ij_markdown_wrap_text_if_long = true
-ij_markdown_wrap_text_inside_blockquotes = true
-
-[{*.pb,*.textproto}]
-indent_size = 2
-tab_width = 2
-ij_continuation_indent_size = 4
-ij_prototext_keep_blank_lines_in_code = 2
-ij_prototext_keep_indents_on_empty_lines = false
-ij_prototext_keep_line_breaks = true
-ij_prototext_space_after_colon = true
-ij_prototext_space_after_comma = true
-ij_prototext_space_before_colon = false
-ij_prototext_space_before_comma = false
-ij_prototext_spaces_within_braces = true
-ij_prototext_spaces_within_brackets = false
-
-[{*.properties,spring.handlers,spring.schemas}]
-ij_properties_align_group_field_declarations = false
-ij_properties_keep_blank_lines = false
-ij_properties_key_value_delimiter = equals
-ij_properties_spaces_around_key_value_delimiter = false
-
-[{*.qute.htm,*.qute.html,*.qute.json,*.qute.txt,*.qute.yaml,*.qute.yml}]
-ij_qute_keep_indents_on_empty_lines = false
-
-[{*.toml,Cargo.lock,Cargo.toml.orig,Gopkg.lock,Pipfile,poetry.lock}]
-ij_toml_keep_indents_on_empty_lines = false
-
-[{*.yaml,*.yml}]
-indent_size = 2
-ij_yaml_align_values_properties = do_not_align
-ij_yaml_autoinsert_sequence_marker = true
-ij_yaml_block_mapping_on_new_line = false
-ij_yaml_indent_sequence_value = true
-ij_yaml_keep_indents_on_empty_lines = false
-ij_yaml_keep_line_breaks = true
-ij_yaml_sequence_on_new_line = false
-ij_yaml_space_before_colon = false
-ij_yaml_spaces_within_braces = true
-ij_yaml_spaces_within_brackets = true
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index c7c0b79e..c6d6f50c 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -1,8 +1,6 @@
 <component name="ProjectCodeStyleConfiguration">
   <code_scheme name="Project" version="173">
-    <option name="FORMATTER_TAGS_ENABLED" value="true" />
     <JavaCodeStyleSettings>
-      <option name="SPACE_AFTER_CLOSING_ANGLE_BRACKET_IN_TYPE_ARGUMENT" value="true" />
       <option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="99" />
       <option name="IMPORT_LAYOUT_TABLE">
         <value>
@@ -22,39 +20,9 @@
           <package name="" withSubpackages="true" static="true" />
         </value>
       </option>
-      <option name="ALIGN_TYPES_IN_MULTI_CATCH" value="false" />
-      <option name="ENABLE_JAVADOC_FORMATTING" value="false" />
-      <option name="JD_P_AT_EMPTY_LINES" value="false" />
-      <option name="JD_DO_NOT_WRAP_ONE_LINE_COMMENTS" value="true" />
-      <option name="JD_INDENT_ON_CONTINUATION" value="true" />
     </JavaCodeStyleSettings>
     <ScalaCodeStyleSettings>
       <option name="MULTILINE_STRING_CLOSING_QUOTES_ON_NEW_LINE" value="true" />
     </ScalaCodeStyleSettings>
-    <codeStyleSettings language="JAVA">
-      <option name="RIGHT_MARGIN" value="170" />
-      <option name="KEEP_FIRST_COLUMN_COMMENT" value="false" />
-      <option name="KEEP_CONTROL_STATEMENT_IN_ONE_LINE" value="false" />
-      <option name="KEEP_BLANK_LINES_IN_DECLARATIONS" value="1" />
-      <option name="KEEP_BLANK_LINES_IN_CODE" value="1" />
-      <option name="KEEP_BLANK_LINES_BETWEEN_PACKAGE_DECLARATION_AND_HEADER" value="1" />
-      <option name="KEEP_BLANK_LINES_BEFORE_RBRACE" value="1" />
-      <option name="ELSE_ON_NEW_LINE" value="true" />
-      <option name="CATCH_ON_NEW_LINE" value="true" />
-      <option name="FINALLY_ON_NEW_LINE" value="true" />
-      <option name="ALIGN_MULTILINE_RESOURCES" value="false" />
-      <option name="SPACE_WITHIN_ARRAY_INITIALIZER_BRACES" value="true" />
-      <option name="CALL_PARAMETERS_WRAP" value="1" />
-      <option name="METHOD_PARAMETERS_WRAP" value="1" />
-      <option name="RESOURCE_LIST_WRAP" value="5" />
-      <option name="EXTENDS_LIST_WRAP" value="1" />
-      <option name="THROWS_LIST_WRAP" value="1" />
-      <option name="EXTENDS_KEYWORD_WRAP" value="1" />
-      <option name="THROWS_KEYWORD_WRAP" value="1" />
-      <option name="METHOD_CALL_CHAIN_WRAP" value="1" />
-      <option name="TERNARY_OPERATION_WRAP" value="5" />
-      <option name="ARRAY_INITIALIZER_WRAP" value="1" />
-      <option name="ENUM_CONSTANTS_WRAP" value="2" />
-    </codeStyleSettings>
   </code_scheme>
 </component>
\ No newline at end of file
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index f7ebeba6..889d842e 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -6,19 +6,12 @@
       <profile name="Maven default annotation processors profile" enabled="true">
         <sourceOutputDir name="target/generated-sources/annotations" />
         <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
-        <outputRelativeToContentRoot value="true" />
-        <module name="kroxylicious-multitenant" />
         <module name="kroxylicious.main" />
         <module name="integrationtests.main" />
-        <module name="kroxylicious-api" />
-        <module name="kroxylicious-krpc-plugin.main" />
-        <module name="kroxylicious.test" />
-        <module name="kroxylicious" />
-        <module name="kroxylicious-filter-api" />
-        <module name="kroxylicious-krpc-plugin" />
-        <module name="integrationtests" />
         <module name="kroxylicious-krpc-plugin.test" />
+        <module name="kroxylicious-krpc-plugin.main" />
         <module name="integrationtests.test" />
+        <module name="kroxylicious.test" />
       </profile>
     </annotationProcessing>
   </component>
@@ -28,12 +21,9 @@
       <module name="integrationtests.main" options="-parameters" />
       <module name="integrationtests.test" options="-parameters" />
       <module name="kroxylicious" options="-parameters" />
-      <module name="kroxylicious-api" options="-parameters" />
-      <module name="kroxylicious-filter-api" options="-parameters" />
       <module name="kroxylicious-krpc-plugin" options="-parameters" />
       <module name="kroxylicious-krpc-plugin.main" options="-parameters" />
       <module name="kroxylicious-krpc-plugin.test" options="-parameters" />
-      <module name="kroxylicious-multitenant" options="-parameters" />
       <module name="kroxylicious-parent" options="-parameters" />
       <module name="kroxylicious.main" options="-parameters" />
       <module name="kroxylicious.test" options="-parameters" />
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index b514ccd7..b14428d4 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -1,14 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
   <component name="Encoding">
-    <file url="file://$PROJECT_DIR$/api/kroxylicious-api/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/api/kroxylicious-api/src/main/resources" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/api/kroxylicious-filter-api/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/api/kroxylicious-filter-api/src/main/resources" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/integrationtests/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/integrationtests/src/main/resources" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/kroxylicious-multitenant/src/main/java" charset="UTF-8" />
-    <file url="file://$PROJECT_DIR$/kroxylicious-multitenant/src/main/resources" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/kroxylicious/src/main/java" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/kroxylicious/src/main/resources" charset="UTF-8" />
     <file url="file://$PROJECT_DIR$/kroxylicious/target/generated-sources/krpc" charset="UTF-8" />
diff --git a/README.md b/README.md
index 44237b16..fc7595e6 100644
--- a/README.md
+++ b/README.md
@@ -5,9 +5,7 @@ addressing use cases such as multi-tenancy, schema validation, or encryption.
 
 ## Build
 
-Java, version 19 or newer, and Apache Maven are required for building this project.
-Technically we currently only require Java 11+ for `src/main` but Java 19+ is used for `src/test`. This will probably change when we move to Netty 5.
-
+Java, version 11 or newer, and Apache Maven are required for building this project.
 Build the project like this:
 
 ```
@@ -56,14 +54,6 @@ Run the following to add missing license headers e.g. when adding new source fil
 $ mvn org.commonjava.maven.plugins:directory-maven-plugin:highest-basedir@resolve-rootdir license:format
 ```
 
-### Formatting
-No one likes to argue about code formatting in pull requests, as project we take the stance that if we can't automate the formatting we are not going to argue about it either. Having said that we don't want a mishmash of conflicting styles! So we attack this from multiple angles.
-
-1. Shared Code formatter settings. Included in the repo are code formatter settings for `Eclipse`, `InjtellJ` and `.editorconfig`.
-2. We auto-format code as part of the maven build process (note this is driven from the Eclipse formatting config)
-3. The Continuous Integration (CI) job building Pull Requests will fail if there is formatting which doesn't pass our agreed conventions
-4. We apply [Checkstyle](https://checkstyle.org/) validation to the project as well. You can find our [agreed ruleset](etc/checkstyle-custom_checks.xml) in the `etc` folder. We bind checkstyle to the `verify` phase of the build so `mvn clean verify` will 
-
 ## Run
 
 Build with the `dist` profile as shown above, then execute this:
@@ -194,4 +184,7 @@ While Kroxylicious is a java application we've had reports of issues running the
       Expect a version string similar to `git version 2.37.1 (Apple Git-137.1)`
    2. Follow the [WSL-git tutorial](https://learn.microsoft.com/en-us/windows/wsl/tutorials/wsl-git) if needed.
 5. Checkout Kroxylicious to `${kroxylicious-checkout}`
-6. Build & develop following the [standard build](#Build) instructions
\ No newline at end of file
+6. Build & develop following the [standard build](#Build) instructions
+
+## Releasing the project
+See [The release guide](docs/Releasing.adoc)
\ No newline at end of file
diff --git a/api/kroxylicious-api/pom.xml b/api/kroxylicious-api/pom.xml
index 41324858..e4fa4612 100644
--- a/api/kroxylicious-api/pom.xml
+++ b/api/kroxylicious-api/pom.xml
@@ -14,12 +14,12 @@
     <parent>
         <groupId>io.kroxylicious</groupId>
         <artifactId>kroxylicious-parent</artifactId>
-        <version>1.0-SNAPSHOT</version>
+        <version>0.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
 
     <artifactId>kroxylicious-api</artifactId>
-    <version>0.0.0-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <name>Kroxylicious API</name>
diff --git a/api/kroxylicious-api/src/main/java/io/kroxylicious/proxy/service/BaseContributor.java b/api/kroxylicious-api/src/main/java/io/kroxylicious/proxy/service/BaseContributor.java
index 643a545c..abec4773 100644
--- a/api/kroxylicious-api/src/main/java/io/kroxylicious/proxy/service/BaseContributor.java
+++ b/api/kroxylicious-api/src/main/java/io/kroxylicious/proxy/service/BaseContributor.java
@@ -42,7 +42,7 @@ public abstract class BaseContributor<L> implements Contributor<L> {
         private final Class<T> configClass;
         private final BiFunction<ProxyConfig, T, L> instanceFunction;
 
-        InstanceBuilder(Class<T> configClass, BiFunction<ProxyConfig, T, L> instanceFunction) {
+        public InstanceBuilder(Class<T> configClass, BiFunction<ProxyConfig, T, L> instanceFunction) {
             this.configClass = configClass;
             this.instanceFunction = instanceFunction;
         }
diff --git a/api/kroxylicious-filter-api/pom.xml b/api/kroxylicious-filter-api/pom.xml
index 3863adc4..8636f8dc 100644
--- a/api/kroxylicious-filter-api/pom.xml
+++ b/api/kroxylicious-filter-api/pom.xml
@@ -14,12 +14,12 @@
     <parent>
         <groupId>io.kroxylicious</groupId>
         <artifactId>kroxylicious-parent</artifactId>
-        <version>1.0-SNAPSHOT</version>
+        <version>0.1.0-SNAPSHOT</version>
         <relativePath>../../pom.xml</relativePath>
     </parent>
-    
+
     <artifactId>kroxylicious-filter-api</artifactId>
-    <version>0.0.0-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <properties>
@@ -33,7 +33,7 @@
         <dependency>
             <groupId>io.kroxylicious</groupId>
             <artifactId>kroxylicious-api</artifactId>
-            <version>0.0.0-SNAPSHOT</version>
+            <version>${kroxyliciousApi.version}</version>
         </dependency>
         <dependency>
             <groupId>io.micrometer</groupId>
@@ -108,6 +108,7 @@
                             <messageSpecFilter>*{Request,Response}.json</messageSpecFilter>
                             <templateDirectory>${project.basedir}/src/main/templates</templateDirectory>
                             <templateNames>Kproxy/Filter.ftl</templateNames>
+                            <!--suppress UnresolvedMavenProperty -->
                             <outputFilePattern>${messageSpecName}Filter.java</outputFilePattern>
                             <outputPackage>io.kroxylicious.proxy.filter</outputPackage>
                             <outputDirectory>${project.build.directory}/generated-sources/krpc</outputDirectory>
@@ -124,6 +125,7 @@
                             <messageSpecFilter>*{Request,Response}.json</messageSpecFilter>
                             <templateDirectory>${project.basedir}/src/main/templates</templateDirectory>
                             <templateNames>Kproxy/KrpcFilter.ftl</templateNames>
+                            <!--suppress UnresolvedMavenProperty -->
                             <outputFilePattern>${templateName}.java</outputFilePattern>
                             <outputPackage>io.kroxylicious.proxy.filter</outputPackage>
                             <outputDirectory>${project.build.directory}/generated-sources/krpc</outputDirectory>
diff --git a/api/kroxylicious-filter-api/src/main/templates/Kproxy/Filter.ftl b/api/kroxylicious-filter-api/src/main/templates/Kproxy/Filter.ftl
index 0f70032d..e21bda1b 100644
--- a/api/kroxylicious-filter-api/src/main/templates/Kproxy/Filter.ftl
+++ b/api/kroxylicious-filter-api/src/main/templates/Kproxy/Filter.ftl
@@ -50,6 +50,6 @@ public interface ${filterClass} extends KrpcFilter {
      * @param ${msgType} The KRPC message to handle.
      * @param context The context.
      */
-    void on${messageSpec.name}(<#if messageSpec.type?lower_case == 'response'>ResponseHeaderData<#else>RequestHeaderData</#if> header, ${dataClass} ${msgType}, KrpcFilterContext context);
+    public void on${messageSpec.name}(<#if messageSpec.type?lower_case == 'response'>ResponseHeaderData<#else>RequestHeaderData</#if> header, ${dataClass} ${msgType}, KrpcFilterContext context);
 
 }
\ No newline at end of file
diff --git a/api/kroxylicious-filter-api/src/main/templates/Kproxy/KrpcFilter.ftl b/api/kroxylicious-filter-api/src/main/templates/Kproxy/KrpcFilter.ftl
index 1b16d81a..f3b33994 100644
--- a/api/kroxylicious-filter-api/src/main/templates/Kproxy/KrpcFilter.ftl
+++ b/api/kroxylicious-filter-api/src/main/templates/Kproxy/KrpcFilter.ftl
@@ -68,7 +68,7 @@ public /* sealed */ interface KrpcFilter /* TODO permits ... */ {
      * @param body The request body.
      * @param filterContext The filter context.
      */
-    default void onRequest(ApiKeys apiKey,
+    public default void onRequest(ApiKeys apiKey,
                                   RequestHeaderData header,
                                   ApiMessage body,
                                   KrpcFilterContext filterContext) {
@@ -92,7 +92,7 @@ public /* sealed */ interface KrpcFilter /* TODO permits ... */ {
      * @param body The request body.
      * @param filterContext The filter context.
      */
-    default void onResponse(ApiKeys apiKey,
+    public default void onResponse(ApiKeys apiKey,
                                    ResponseHeaderData header,
                                    ApiMessage body,
                                    KrpcFilterContext filterContext) {
diff --git a/docs/Releasing.adoc b/docs/Releasing.adoc
new file mode 100644
index 00000000..59c851d2
--- /dev/null
+++ b/docs/Releasing.adoc
@@ -0,0 +1,64 @@
+= Releasing Kroxylicious
+3.0, July 29, 2022: AsciiDoc article template
+:toc:
+:icons: font
+:url-quickref: https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference/
+
+A quick and dirty guide to actually releasing builds for consumption via maven central.
+
+== Requirements
+.Maven Central
+* A Maven Central/Sonatype account. Accounts are created via their https://issues.sonatype.org/secure/Signup!default.jspa[JIRA signup]
+* Your Sonatype account needs to be granted publication permissions for the Kroxylicous project.
+** One of the existing team members with publishing rights needs to raise a https://issues.sonatype.org/secure/CreateIssue.jspa?pid=10134&issuetype=11003[JIRA ticket] to request the new account is added (or removed...). The requirements for the ticket are listed in the https://central.sonatype.org/publish/manage-permissions/[Central Docs]
+
+Signing the builds with a GPG key is a requirement for publishing to Maven Central.
+
+.PGP
+* Ensure your PGP key is published to a public key server (for example keys.openpgp.org)
+* Get your PGP key signed by the Kroxylicious project key. Rather than share a single key between project members (which has issues with revocation and re-issuing) we sign the releases individually using a key signed by the project key as a mark of trust.
+* A copy of your keys short ID.
+
+TIP: To get the short ID for your key `gpg2 --show-keys --keyid-format short $\{YOUR_KEY_LONG_ID}`
+
+== Running a release
+
+.Releasing Locally
+. `mvn clean install`
+.. We are looking for a clean and green build.
+.. If it's not, shout scream and swear.
+.. Think *very very* carefully if its worth proceeding. Releases are forever!
+. Switch to the release version number.
+.. `export RELEASE_VERSION=0.1.0`
+.. `export RELEASE_API_VERSION=0.1.0`
+.. `mvn versions:set -DnewVersion=$\{RELEASE_VERSION} -pl '!:kroxylicious-api,!:kroxylicious-filter-api'`
+.. `mvn versions:set -DnewVersion=$\{RELEASE_API_VERSION} -pl ':kroxylicious-api,:kroxylicious-filter-api'`
+.. `mvn versions:set-property -Dproperty=kroxyliciousApi.version -DnewVersion=$\{RELEASE_API_VERSION}`
+.. `mvn clean install -Pquick`
+// .. *TODO*: Should we use the https://maven.apache.org/maven-release/maven-release-plugin[release plug-in] instead? .
+.. `git add **/pom.xml`
+.. `git commit -m "Release version v$\{RELEASE_VERSION}`
+.. `git tag v$\{RELEASE_VERSION}`
+.. `git push upstream --tags`
+. `mvn deploy -Prelease -DskipTests=true -DreleaseSigningKey=<YOUR_KEY_SHORT_ID>`
+.. The `release` profile enables GPG signing
+.. The release profile will not run without specifying the `releaseSigningKey` property.
+. Validate the release in the central Nexus instance.
+.. Locate the https://central.sonatype.org/publish/release/#locate-and-examine-your-staging-repository[Staging repository]
+.. Check that the right tree of artefacts are there, ensure there are source & docs jars.
+// .. *TODO*: Using the staging repository to validate the release.
+. `Close` the staging repository in the central Nexus instance, see the https://central.sonatype.org/publish/release/#close-and-drop-or-release-your-staging-repository[Central release docs]. This triggers the promotion from staging to being publicly available on central.
+. Switch to the next version number for development.
+.. `export DEV_VERSION=0.1.0-SNAPSHOT`
+.. `export DEV_API_VERSION=0.1.0-SNAPSHOT`
+.. `mvn versions:set -DnewVersion=$\{DEV_VERSION} -pl '!:kroxylicious-api,!:kroxylicious-filter-api'`
+.. `mvn versions:set -DnewVersion=$\{DEV_API_VERSION} -pl ':kroxylicious-api,:kroxylicious-filter-api'`
+.. `mvn versions:set-property -Dproperty=kroxyliciousApi.version -DnewVersion=$\{DEV_API_VERSIION}`
+.. `git add **/pom.xml`
+.. `git commit -m "Next development version v$\{DEV_VERSION}`
+.. `git push`
+
+.Releasing via the build server
+**TBD**
+
+Specifically we need to work out the commit rights and key signing for the build server.
\ No newline at end of file
diff --git a/etc/checkstyle-custom_checks.xml b/etc/checkstyle-custom_checks.xml
deleted file mode 100644
index 1037f1f6..00000000
--- a/etc/checkstyle-custom_checks.xml
+++ /dev/null
@@ -1,164 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
-    Copyright Kroxylicious Authors.
-
-    Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
-
--->
-<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
-        "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
-
-<module name="Checker">
-
-    <!-- Source code is not formatted using tabs -->
-    <module name="FileTabCharacter" />
-
-    <module name="TreeWalker">
-        <!-- Checks for imports -->
-        <module name="AvoidStarImport" />
-        <module name="RedundantImport" />
-        <module name="UnusedImports">
-            <property name="processJavadoc" value="true"/>
-        </module>
-
-        <!-- Modifiers -->
-        <module name="RedundantModifier"/>
-
-        <!-- Checks for common coding problems -->
-        <module name="EqualsHashCode" />
-        <module name="IllegalInstantiation" />
-
-        <!-- Checks that ModeShape would really like to use but this requires cleaning up more code -->
-        <!--
-        <module name="ModifierOrder" />
-        <module name="HideUtilityClassConstructor" />
-        <module name="EqualsAvoidNull" />
-        <module name="MissingDeprecated" />
-        <module name="MutableException" />
-        <module name="GenericWhitespace" />
-        -->
-
-        <!-- Miscellaneous other checks. -->
-        <module name="PackageAnnotation" />
-        <module name="CovariantEquals" />
-        <module name="OneStatementPerLine" />
-        <module name="EmptyStatement" />
-        <module name="DefaultComesLast" />
-        <module name="TypecastParenPad" />
-        <module name="CovariantEquals" />
-
-        <module name="MissingOverride"/>
-
-        <module name="NeedBraces"/>
-
-        <!-- Checks for whitespace after tokens -->
-        <module name="WhitespaceAfter"/>
-
-        <module name="WhitespaceAround">
-            <property name="tokens" value="LCURLY,QUESTION,COLON,SLIST" />
-            <property name="allowEmptyLambdas" value="true" />
-        </module>
-
-        <!-- Checks for blocks. You know, those {}'s -->
-        <module name="LeftCurly">
-            <property name="option" value="eol" />
-        </module>
-
-        <module name="RightCurly">
-            <property name="option" value="alone"/>
-        </module>
-
-        <module name="ParenPad">
-            <property name="tokens" value="CTOR_CALL, SUPER_CTOR_CALL" />
-            <property name="option" value="nospace" />
-        </module>
-
-        <module name="RegexpSinglelineJava">
-            <property name="format" value="System\.(out)|(err)\.print(ln)?\(" />
-            <!-- The last sentence of the message is a keyword to trigger exclusion: see ExcludeTestPackages -->
-            <property name="message" value="Not allowed to print to System.out: if you're damn sure you want it, disable Checkstyle on this line. [not required for tests]" />
-            <property name="ignoreComments" value="true" />
-        </module>
-
-        <!-- Nobody should be using StringBuffer anymore -->
-        <module name="RegexpSinglelineJava">
-            <property name="format" value=" StringBuffer" />
-            <!-- The last sentence of the message is a keyword to trigger exclusion: see ExcludeTestPackages -->
-            <property name="message" value="Nobody should be using StringBuffer anymore" />
-        </module>
-        <module name="IllegalInstantiation">
-            <property name="classes" value="java.lang.Boolean"/>
-        </module>
-
-        <!-- not currently used by Kroxylicious but probably should do so -->
-        <!-- i.e. ban netty imports in the API package, maybe there is a better tool than checkstlye for that -->
-<!--        &lt;!&ndash;  Avoid importing some packages &ndash;&gt;-->
-<!--        <module name="IllegalImport">-->
-<!--            &lt;!&ndash; Should use TestNG &ndash;&gt;-->
-<!--            <property name="illegalPkgs" value="org.testng"/>-->
-<!--        </module>-->
-<!--        <module name="IllegalImport">-->
-<!--            &lt;!&ndash; Should use ModeShape-specific annotations &ndash;&gt;-->
-<!--            <property name="illegalPkgs" value="net.jcip.annotations, org.apache.http.annotation"/>-->
-<!--        </module>-->
-
-        <!--
-        Allow for suppressing sections of code using a starting and ending comment:
-        // CHECKSTYLE\:OFF
-        // CHECKSTYLE\:ON
-        -->
-        <module name="SuppressionCommentFilter" />
-
-        <!-- Allow for suppressing sections of code using just a leading comment:
-        // CHECKSTYLE IGNORE check FOR NEXT 2 LINES
-        -->
-        <module name="SuppressWithNearbyCommentFilter">
-            <property name="commentFormat" value="CHECKSTYLE IGNORE (\w+) FOR NEXT (\d+) LINES"/>
-            <property name="checkFormat" value="$1"/>
-            <property name="influenceFormat" value="$2"/>
-        </module>
-
-        <!-- Checks that Debezium is expressly NOT using -->
-        <!--module name="ModifiedControlVariable" /-->
-        <!--module name="DeclarationOrder" /-->
-        <!--module name="InnerTypeLast" /-->
-        <!--module name="IllegalThrows"/-->
-        <!--module name="IllegalCatch">
-            <property name="illegalClassNames" value="java.lang.Throwable, java.lang.RuntimeException" />
-        </module-->
-        <!--module name="MethodParamPad">
-            <property name="option" value="nospace" />
-            <property name="allowLineBreaks" value="false" />
-        </module-->
-
-    </module>
-
-    <!--
-    BEGIN: ModeShape doesn't current require these, though it would be nice to do so
-    -->
-
-    <!--module name="RegexpMultiline">
-        <property name="format" value="\S\s\s\z" />
-        <property name="message" value="Only one new line is allowed at the end of a file" />
-    </module-->
-    <!-- We are not using NewLineAtEndOfFile because the new line chars change
-        on different operating systems and that rule allows only one type. This rule
-        is not actually checking for new lines, but it will work if we check that
-        there are not white spaces at the end of a line with another rule. -->
-    <!--module name="RegexpMultiline">
-        <property name="format" value="\S\z" />
-        <property name="message" value="Missing new line at the end of file" />
-    </module-->
-
-    <!--
-    END: ModeShape doesn't current require these, though it would be nice to do so
-    -->
-
-    <!-- Allow custom files set supression -->
-    <module name="SuppressionFilter">
-        <!--The system property is set via Maven-->
-        <property name="file" value="${checkstyle.suppressions.file}"/>
-    </module>
-
-</module>
diff --git a/etc/checkstyle-suppressions.xml b/etc/checkstyle-suppressions.xml
deleted file mode 100644
index b02f04de..00000000
--- a/etc/checkstyle-suppressions.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
-    Copyright Kroxylicious Authors.
-
-    Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
-
--->
-<!DOCTYPE suppressions PUBLIC
-        "-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN"
-        "https://checkstyle.org/dtds/suppressions_1_2.dtd">
-
-<suppressions>
-</suppressions>
diff --git a/kroxylicious-multitenant/pom.xml b/kroxylicious-multitenant/pom.xml
index 6af745eb..837a08da 100644
--- a/kroxylicious-multitenant/pom.xml
+++ b/kroxylicious-multitenant/pom.xml
@@ -14,7 +14,7 @@
     <parent>
         <groupId>io.kroxylicious</groupId>
         <artifactId>kroxylicious-parent</artifactId>
-        <version>1.0-SNAPSHOT</version>
+        <version>0.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -28,12 +28,12 @@
         <dependency>
             <groupId>io.kroxylicious</groupId>
             <artifactId>kroxylicious-api</artifactId>
-            <version>0.0.0-SNAPSHOT</version>
+            <version>${kroxyliciousApi.version}</version>
         </dependency>
         <dependency>
             <groupId>io.kroxylicious</groupId>
             <artifactId>kroxylicious-filter-api</artifactId>
-            <version>0.0.0-SNAPSHOT</version>
+            <version>${kroxyliciousApi.version}</version>
         </dependency>
     </dependencies>
 </project>
diff --git a/kroxylicious/pom.xml b/kroxylicious/pom.xml
index c6097c36..e9d0d9d1 100644
--- a/kroxylicious/pom.xml
+++ b/kroxylicious/pom.xml
@@ -14,7 +14,7 @@
     <parent>
         <groupId>io.kroxylicious</groupId>
         <artifactId>kroxylicious-parent</artifactId>
-        <version>1.0-SNAPSHOT</version>
+        <version>0.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -31,12 +31,12 @@
         <dependency>
             <groupId>io.kroxylicious</groupId>
             <artifactId>kroxylicious-api</artifactId>
-            <version>0.0.0-SNAPSHOT</version>
+            <version>${kroxyliciousApi.version}</version>
         </dependency>
         <dependency>
             <groupId>io.kroxylicious</groupId>
             <artifactId>kroxylicious-filter-api</artifactId>
-            <version>0.0.0-SNAPSHOT</version>
+            <version>${kroxyliciousApi.version}</version>
         </dependency>
         <!-- We depend on the specific Netty dependencies not netty-all to reduce the size of fatjars -->
         <dependency>
@@ -205,22 +205,6 @@
                     </execution>
                 </executions>
             </plugin>
-            <plugin>
-                <groupId>net.revelc.code.formatter</groupId>
-                <artifactId>formatter-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>format-generated</id>
-                        <goals>
-                            <goal>format</goal>
-                        </goals>
-                        <phase>process-sources</phase>
-                        <configuration combine.children="override">
-                            <sourceDirectory>${project.build.directory}/generated-sources/krpc</sourceDirectory>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
         </plugins>
     </build>
 
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/KafkaProxy.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/KafkaProxy.java
index 1ea3cbfd..599f2eeb 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/KafkaProxy.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/KafkaProxy.java
@@ -13,7 +13,6 @@ import java.security.KeyStoreException;
 import java.security.NoSuchAlgorithmException;
 import java.security.UnrecoverableKeyException;
 import java.security.cert.CertificateException;
-import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
@@ -44,9 +43,8 @@ import io.netty.incubator.channel.uring.IOUringServerSocketChannel;
 
 import io.kroxylicious.proxy.bootstrap.FilterChainFactory;
 import io.kroxylicious.proxy.config.Configuration;
-import io.kroxylicious.proxy.config.MicrometerDefinition;
-import io.kroxylicious.proxy.config.ProxyConfig;
 import io.kroxylicious.proxy.config.admin.AdminHttpConfiguration;
+import io.kroxylicious.proxy.config.micrometer.MicrometerConfiguration;
 import io.kroxylicious.proxy.internal.KafkaProxyInitializer;
 import io.kroxylicious.proxy.internal.MeterRegistries;
 import io.kroxylicious.proxy.internal.admin.AdminHttpInitializer;
@@ -65,8 +63,7 @@ public final class KafkaProxy implements AutoCloseable {
     private final boolean useIoUring;
     private final FilterChainFactory filterChainFactory;
     private final AdminHttpConfiguration adminHttpConfig;
-    private final List<MicrometerDefinition> micrometerConfig;
-    private final ProxyConfig proxyConfig;
+    private final MicrometerConfiguration micrometerConfig;
     private EventLoopGroup bossGroup;
     private EventLoopGroup workerGroup;
     private Channel acceptorChannel;
@@ -90,8 +87,7 @@ public final class KafkaProxy implements AutoCloseable {
         this.logFrames = config.proxy().logFrames();
         this.useIoUring = config.proxy().useIoUring();
         this.adminHttpConfig = config.adminHttpConfig();
-        this.micrometerConfig = config.getMicrometer();
-        this.proxyConfig = config.proxy();
+        this.micrometerConfig = config.micrometerConfig();
         this.filterChainFactory = new FilterChainFactory(config);
 
         this.keyStoreFile = config.proxy().keyStoreFile().map(File::new);
@@ -189,7 +185,7 @@ public final class KafkaProxy implements AutoCloseable {
             channelClass = NioServerSocketChannel.class;
         }
 
-        MeterRegistries meterRegistries = new MeterRegistries(micrometerConfig, proxyConfig);
+        MeterRegistries meterRegistries = new MeterRegistries(micrometerConfig);
         maybeStartMetricsListener(bossGroup, workerGroup, channelClass, meterRegistries);
 
         ServerBootstrap serverBootstrap = new ServerBootstrap().group(bossGroup, workerGroup)
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/classloader/ClassloaderUtils.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/classloader/ClassloaderUtils.java
new file mode 100644
index 00000000..32639665
--- /dev/null
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/classloader/ClassloaderUtils.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright Kroxylicious Authors.
+ *
+ * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package io.kroxylicious.proxy.classloader;
+
+import java.util.Optional;
+
+public class ClassloaderUtils {
+    public static <T> Optional<Class<? extends T>> loadClassIfPresent(Class<T> superClass, String targetClassName) {
+        try {
+            Class<?> targetClass = ClassloaderUtils.class.getClassLoader().loadClass(targetClassName);
+            if (superClass.isAssignableFrom(targetClass)) {
+                return Optional.of(targetClass.asSubclass(superClass));
+            }
+            else {
+                throw new RuntimeException("class " + targetClass.getSimpleName() + " is not assignable to " + superClass);
+            }
+        }
+        catch (ClassNotFoundException e) {
+            return Optional.empty();
+        }
+    }
+
+}
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/config/Configuration.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/config/Configuration.java
index b4a31338..1d75984e 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/config/Configuration.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/config/Configuration.java
@@ -9,26 +9,27 @@ import java.util.List;
 import java.util.Map;
 
 import io.kroxylicious.proxy.config.admin.AdminHttpConfiguration;
+import io.kroxylicious.proxy.config.micrometer.MicrometerConfiguration;
 
 public class Configuration {
 
     private final DefaultProxyConfig proxy;
 
     private final AdminHttpConfiguration adminHttp;
+    private final MicrometerConfiguration micrometer;
     private final Map<String, Cluster> clusters;
     private final List<FilterDefinition> filters;
-    private final List<MicrometerDefinition> micrometer;
 
     public Configuration(DefaultProxyConfig proxy,
                          AdminHttpConfiguration adminHttp,
+                         MicrometerConfiguration micrometer,
                          Map<String, Cluster> clusters,
-                         List<FilterDefinition> filters,
-                         List<MicrometerDefinition> micrometer) {
+                         List<FilterDefinition> filters) {
         this.proxy = proxy;
         this.adminHttp = adminHttp;
+        this.micrometer = micrometer;
         this.clusters = clusters;
         this.filters = filters;
-        this.micrometer = micrometer;
     }
 
     public DefaultProxyConfig proxy() {
@@ -47,7 +48,7 @@ public class Configuration {
         return filters;
     }
 
-    public List<MicrometerDefinition> getMicrometer() {
-        return micrometer == null ? List.of() : micrometer;
+    public MicrometerConfiguration micrometerConfig() {
+        return micrometer == null ? MicrometerConfiguration.empty() : micrometer;
     }
 }
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/config/MicrometerDefinition.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/config/MicrometerDefinition.java
deleted file mode 100644
index 30985bba..00000000
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/config/MicrometerDefinition.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright Kroxylicious Authors.
- *
- * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
- */
-package io.kroxylicious.proxy.config;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver;
-
-public class MicrometerDefinition {
-
-    private final String type;
-    private final BaseConfig config;
-
-    @JsonCreator
-    public MicrometerDefinition(String type,
-                                @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXTERNAL_PROPERTY, property = "type") @JsonTypeIdResolver(MicrometerHookConfigTypeIdResolver.class) BaseConfig config) {
-        this.type = type;
-        this.config = config;
-    }
-
-    public String type() {
-        return type;
-    }
-
-    public BaseConfig config() {
-        return config;
-    }
-}
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/config/MicrometerHookConfigTypeIdResolver.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/config/MicrometerHookConfigTypeIdResolver.java
deleted file mode 100644
index c57fd7b9..00000000
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/config/MicrometerHookConfigTypeIdResolver.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright Kroxylicious Authors.
- *
- * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
- */
-package io.kroxylicious.proxy.config;
-
-import java.io.IOException;
-
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.fasterxml.jackson.databind.DatabindContext;
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.jsontype.impl.TypeIdResolverBase;
-
-import io.kroxylicious.proxy.micrometer.MicrometerConfigurationHookContributorManager;
-
-public class MicrometerHookConfigTypeIdResolver extends TypeIdResolverBase {
-    private JavaType superType;
-
-    @Override
-    public void init(JavaType baseType) {
-        superType = baseType;
-    }
-
-    @Override
-    public String idFromValue(Object value) {
-        throw new UnsupportedOperationException("Not implemented");
-    }
-
-    @Override
-    public String idFromValueAndType(Object value, Class<?> suggestedType) {
-        throw new UnsupportedOperationException("Not implemented");
-    }
-
-    @Override
-    public JsonTypeInfo.Id getMechanism() {
-        throw new UnsupportedOperationException("Not implemented");
-    }
-
-    @Override
-    public JavaType typeFromId(DatabindContext context, String id) throws IOException {
-        Class<?> subType = MicrometerConfigurationHookContributorManager.getInstance().getConfigType(id);
-        return context.constructSpecializedType(superType, subType);
-    }
-}
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/config/micrometer/MicrometerConfiguration.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/config/micrometer/MicrometerConfiguration.java
new file mode 100644
index 00000000..be87b321
--- /dev/null
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/config/micrometer/MicrometerConfiguration.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright Kroxylicious Authors.
+ *
+ * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package io.kroxylicious.proxy.config.micrometer;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.binder.MeterBinder;
+
+import io.kroxylicious.proxy.classloader.ClassloaderUtils;
+
+public class MicrometerConfiguration {
+
+    private static final MicrometerConfiguration EMPTY = new MicrometerConfiguration(null, null, null);
+    private static final List<String> BINDER_PACKAGES = getBinderPackages();
+
+    private final List<Class<? extends MeterBinder>> binders;
+    private final Optional<Class<? extends MicrometerConfigurationHook>> configurationHook;
+    private final List<Tag> commonTags;
+
+    private static List<String> getBinderPackages() {
+        String binderPackage = "io.micrometer.core.instrument.binder";
+        return List.of(binderPackage + ".jvm", binderPackage + ".system");
+    }
+
+    public MicrometerConfiguration(List<String> binders, String configurationHookClass, Map<String, String> commonTags) {
+        this.binders = configureBinders(binders);
+        this.configurationHook = loadConfigurationHookClass(configurationHookClass);
+        this.commonTags = toTags(commonTags);
+    }
+
+    public static MicrometerConfiguration empty() {
+        return EMPTY;
+    }
+
+    private List<Tag> toTags(Map<String, String> commonTags) {
+        if (commonTags == null) {
+            return List.of();
+        }
+        return commonTags.entrySet().stream().map(entry -> Tag.of(entry.getKey(), entry.getValue())).collect(Collectors.toList());
+    }
+
+    private Optional<Class<? extends MicrometerConfigurationHook>> loadConfigurationHookClass(String configurationHookClass) {
+        if (configurationHookClass == null) {
+            return Optional.empty();
+        }
+        Class<? extends MicrometerConfigurationHook> clazz = ClassloaderUtils.loadClassIfPresent(MicrometerConfigurationHook.class, configurationHookClass)
+                .orElseThrow(() -> new IllegalArgumentException("could not load micrometer configuration hook: " + configurationHookClass));
+        return Optional.ofNullable(clazz);
+    }
+
+    private List<Class<? extends MeterBinder>> configureBinders(List<String> binders) {
+        if (binders == null) {
+            return List.of();
+        }
+        return binders.stream().map(this::toBinderClass).collect(Collectors.toList());
+    }
+
+    private Class<? extends MeterBinder> toBinderClass(String binder) {
+        Stream<String> literalCandidate = Stream.of(binder);
+        Stream<String> packageClassCandidates = BINDER_PACKAGES.stream().map(binderPackage -> binderPackage + "." + binder);
+        return Stream.concat(literalCandidate, packageClassCandidates)
+                .map(candidateClassName -> ClassloaderUtils.loadClassIfPresent(MeterBinder.class, candidateClassName))
+                .filter(Optional::isPresent)
+                .map(Optional::get)
+                .findFirst().orElseThrow(() -> new IllegalArgumentException("could not locate binder class for " + binder));
+    }
+
+    public List<Class<? extends MeterBinder>> getBinders() {
+        return binders;
+    }
+
+    public Optional<Class<? extends MicrometerConfigurationHook>> loadConfigurationHookClass() {
+        return configurationHook;
+    }
+
+    public List<Tag> getCommonTags() {
+        return commonTags;
+    }
+}
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/MicrometerConfigurationHook.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/config/micrometer/MicrometerConfigurationHook.java
similarity index 86%
rename from kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/MicrometerConfigurationHook.java
rename to kroxylicious/src/main/java/io/kroxylicious/proxy/config/micrometer/MicrometerConfigurationHook.java
index 5c74f386..689538fd 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/MicrometerConfigurationHook.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/config/micrometer/MicrometerConfigurationHook.java
@@ -3,7 +3,7 @@
  *
  * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
  */
-package io.kroxylicious.proxy.micrometer;
+package io.kroxylicious.proxy.config.micrometer;
 
 import io.micrometer.core.instrument.MeterRegistry;
 
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/filter/NetFilter.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/filter/NetFilter.java
index 749aa1b6..a93fffb7 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/filter/NetFilter.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/filter/NetFilter.java
@@ -28,42 +28,42 @@ public interface NetFilter {
          * You can think of this as being like HTTP's {@code X-Forwarded-For} header.
          * @see #srcAddress()
          */
-        String clientHost();
+        public String clientHost();
 
         /**
          * @return The source port of the client, taking into account source host information
          * propagated by intermediate proxies.
          */
-        int clientPort();
+        public int clientPort();
 
         /**
          * @return The address of the remote TCP peer, which may the ultimate client,
          * but could be an intermediate proxy.
          * @see #clientHost()
          */
-        SocketAddress srcAddress();
+        public SocketAddress srcAddress();
 
         /**
          * The authorized id, or null if there is no authentication configured for this listener.
          * @return
          */
-        String authorizedId();
+        public String authorizedId();
 
         /**
          * @return The name of the client software, if known via ApiVersions request. Otherwise null.
          */
-        String clientSoftwareName();
+        public String clientSoftwareName();
 
         /**
          * @return The version of the client software, if known via ApiVersions request. Otherwise null.
          */
-        String clientSoftwareVersion();
+        public String clientSoftwareVersion();
 
         /**
          * @return The <a href="https://en.wikipedia.org/wiki/Server_Name_Indication">SNI</a>
          * hostname which the client used during TLS handshake.
          */
-        String sniHostname();
+        public String sniHostname();
 
         /**
          * Connect to the Kafka server at the given {@code host} and {@code port},
@@ -72,7 +72,7 @@ public interface NetFilter {
          * @param port The port
          * @param filters The filters
          */
-        void initiateConnect(String host, int port, KrpcFilter[] filters);
+        public void initiateConnect(String host, int port, KrpcFilter[] filters);
 
         // TODO add API for delayed responses
     }
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/AuthenticationEvent.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/AuthenticationEvent.java
index df159004..e6cf976e 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/AuthenticationEvent.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/AuthenticationEvent.java
@@ -38,12 +38,10 @@ public class AuthenticationEvent {
 
     @Override
     public boolean equals(Object o) {
-        if (this == o) {
+        if (this == o)
             return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
+        if (o == null || getClass() != o.getClass())
             return false;
-        }
         AuthenticationEvent that = (AuthenticationEvent) o;
         return Objects.equals(authorizationId(), that.authorizationId()) && Objects.equals(negotiatedProperties(), that.negotiatedProperties());
     }
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/KafkaAuthnHandler.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/KafkaAuthnHandler.java
index 8164eb0d..b1b10f55 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/KafkaAuthnHandler.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/KafkaAuthnHandler.java
@@ -282,7 +282,7 @@ public class KafkaAuthnHandler extends ChannelInboundHandlerAdapter {
         private final String name;
         private final ScramMechanism scramMechanism;
 
-        SaslMechanism(String saslName, ScramMechanism scramMechanism) {
+        private SaslMechanism(String saslName, ScramMechanism scramMechanism) {
             this.name = saslName;
             this.scramMechanism = scramMechanism;
         }
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/MeterRegistries.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/MeterRegistries.java
index 6bf32c16..29730ed8 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/MeterRegistries.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/MeterRegistries.java
@@ -5,34 +5,67 @@
  */
 package io.kroxylicious.proxy.internal;
 
-import java.util.List;
+import java.lang.reflect.Constructor;
 import java.util.Optional;
 
 import io.micrometer.core.instrument.Metrics;
+import io.micrometer.core.instrument.binder.MeterBinder;
 import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
 import io.micrometer.prometheus.PrometheusConfig;
 import io.micrometer.prometheus.PrometheusMeterRegistry;
 
-import io.kroxylicious.proxy.config.MicrometerDefinition;
-import io.kroxylicious.proxy.config.ProxyConfig;
-import io.kroxylicious.proxy.micrometer.MicrometerConfigurationHookContributorManager;
+import io.kroxylicious.proxy.config.micrometer.MicrometerConfiguration;
+import io.kroxylicious.proxy.config.micrometer.MicrometerConfigurationHook;
 
 public class MeterRegistries {
     private final PrometheusMeterRegistry prometheusMeterRegistry;
 
-    public MeterRegistries(List<MicrometerDefinition> micrometerConfig, ProxyConfig proxyConfig) {
-        configureMicrometer(micrometerConfig, proxyConfig);
+    public MeterRegistries(MicrometerConfiguration micrometerConfig) {
+        configureMicrometer(micrometerConfig);
         this.prometheusMeterRegistry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
         Metrics.addRegistry(prometheusMeterRegistry);
     }
 
-    private void configureMicrometer(List<MicrometerDefinition> micrometerConfig, ProxyConfig proxyConfig) {
+    private void configureMicrometer(MicrometerConfiguration micrometerConfig) {
         CompositeMeterRegistry globalRegistry = Metrics.globalRegistry;
-        MicrometerConfigurationHookContributorManager manager = MicrometerConfigurationHookContributorManager.getInstance();
-        micrometerConfig
-                .stream()
-                .map(f -> manager.getHook(f.type(), proxyConfig, f.config()))
-                .forEach(micrometerConfigurationHook -> micrometerConfigurationHook.configure(globalRegistry));
+        configureCommonTags(micrometerConfig, globalRegistry);
+        configureBinders(micrometerConfig, globalRegistry);
+        callConfigurationHook(micrometerConfig, globalRegistry);
+    }
+
+    private void configureCommonTags(MicrometerConfiguration micrometerConfig, CompositeMeterRegistry targetRegistry) {
+        targetRegistry.config().commonTags(micrometerConfig.getCommonTags());
+    }
+
+    private static void callConfigurationHook(MicrometerConfiguration micrometerConfig, CompositeMeterRegistry targetRegistry) {
+        Optional<Class<? extends MicrometerConfigurationHook>> configurationHookClass = micrometerConfig.loadConfigurationHookClass();
+        if (configurationHookClass.isPresent()) {
+            Class<? extends MicrometerConfigurationHook> clazz = configurationHookClass.get();
+            MicrometerConfigurationHook micrometerConfigurationHook = instantiateWithNoArgs(clazz);
+            micrometerConfigurationHook.configure(targetRegistry);
+        }
+    }
+
+    private static void configureBinders(MicrometerConfiguration micrometerConfig, CompositeMeterRegistry targetRegistry) {
+        for (Class<? extends MeterBinder> binder : micrometerConfig.getBinders()) {
+            MeterBinder meterBinder = instantiateWithNoArgs(binder);
+            try {
+                meterBinder.bindTo(targetRegistry);
+            }
+            catch (Exception e) {
+                throw new RuntimeException("failed to bind metrics with " + binder.getSimpleName(), e);
+            }
+        }
+    }
+
+    private static <T> T instantiateWithNoArgs(Class<? extends T> binder) {
+        try {
+            Constructor<? extends T> declaredConstructor = binder.getDeclaredConstructor();
+            return declaredConstructor.newInstance();
+        }
+        catch (Exception e) {
+            throw new IllegalArgumentException("failed to instantiate " + binder.getSimpleName(), e);
+        }
     }
 
     /**
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/SaslDecodePredicate.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/SaslDecodePredicate.java
index 88a753de..fdd1c459 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/SaslDecodePredicate.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/SaslDecodePredicate.java
@@ -18,7 +18,7 @@ class SaslDecodePredicate implements DecodePredicate {
     private final boolean handleSasl;
     private DecodePredicate delegate = null;
 
-    SaslDecodePredicate(boolean handleSasl) {
+    public SaslDecodePredicate(boolean handleSasl) {
         this.handleSasl = handleSasl;
     }
 
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/ByteBufAccessorImpl.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/ByteBufAccessorImpl.java
index f5265e6e..1b6ef2ca 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/ByteBufAccessorImpl.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/ByteBufAccessorImpl.java
@@ -62,9 +62,8 @@ public class ByteBufAccessorImpl implements ByteBufAccessor, Readable {
         while (((b = buffer.readByte()) & 0x80) != 0) {
             value |= (b & 0x7f) << i;
             i += 7;
-            if (i > 63) {
+            if (i > 63)
                 throw illegalVarlongException(value);
-            }
         }
         value |= b << i;
         return (value >>> 1) ^ -(value & 1);
@@ -77,9 +76,8 @@ public class ByteBufAccessorImpl implements ByteBufAccessor, Readable {
         while (((b = buffer.readByte()) & 0x80) != 0) {
             value |= (b & 0x7f) << i;
             i += 7;
-            if (i > 28) {
+            if (i > 28)
                 throw illegalVarintException(value);
-            }
         }
         value |= b << i;
         return value;
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/CorrelationManager.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/CorrelationManager.java
index 23720857..c3e57308 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/CorrelationManager.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/CorrelationManager.java
@@ -123,12 +123,10 @@ public class CorrelationManager {
 
         @Override
         public boolean equals(Object o) {
-            if (this == o) {
+            if (this == o)
                 return true;
-            }
-            if (o == null || getClass() != o.getClass()) {
+            if (o == null || getClass() != o.getClass())
                 return false;
-            }
             Correlation that = (Correlation) o;
             return apiKey == that.apiKey && apiVersion == that.apiVersion && downstreamCorrelationId == that.downstreamCorrelationId
                     && decodeResponse == that.decodeResponse;
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/DecodePredicate.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/DecodePredicate.java
index a8c4bdc6..91ae2ca7 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/DecodePredicate.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/codec/DecodePredicate.java
@@ -20,7 +20,7 @@ import io.kroxylicious.proxy.filter.KrpcFilter;
  * who the authorized user or, or which back-end cluster they're connected to.
  */
 public interface DecodePredicate {
-    static DecodePredicate forFilters(KrpcFilter... filters) {
+    public static DecodePredicate forFilters(KrpcFilter... filters) {
         return new DecodePredicate() {
             @Override
             public boolean shouldDecodeResponse(ApiKeys apiKey, short apiVersion) {
@@ -49,8 +49,8 @@ public interface DecodePredicate {
         };
     }
 
-    boolean shouldDecodeRequest(ApiKeys apiKey, short apiVersion);
+    public boolean shouldDecodeRequest(ApiKeys apiKey, short apiVersion);
 
-    boolean shouldDecodeResponse(ApiKeys apiKey, short apiVersion);
+    public boolean shouldDecodeResponse(ApiKeys apiKey, short apiVersion);
 
 }
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/BrokerAddressFilter.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/BrokerAddressFilter.java
index 432510c5..b2544130 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/BrokerAddressFilter.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/BrokerAddressFilter.java
@@ -42,6 +42,7 @@ public class BrokerAddressFilter implements MetadataResponseFilter, FindCoordina
         public BrokerAddressConfig(String addressMapper) {
             try {
                 this.addressMapperClazz = addressMapper == null ? null : (Class<? extends AddressMapping>) Class.forName(addressMapper);
+                ;
             }
             catch (ClassNotFoundException e) {
                 throw new RuntimeException(e);
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/FixedAddressMapping.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/FixedAddressMapping.java
index ad5c77b6..87857b0e 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/FixedAddressMapping.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/FixedAddressMapping.java
@@ -14,7 +14,7 @@ class FixedAddressMapping implements AddressMapping {
     private final String targetHost;
     private final int targetPort;
 
-    FixedAddressMapping(ProxyConfig config) {
+    public FixedAddressMapping(ProxyConfig config) {
         String proxyAddress = config.address();
         String[] proxyAddressParts = proxyAddress.split(":");
 
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/SniAddressMapping.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/SniAddressMapping.java
index 4d29dbf0..fd0a39a9 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/SniAddressMapping.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/filter/SniAddressMapping.java
@@ -14,7 +14,7 @@ class SniAddressMapping implements AddressMapping {
     private final String targetHost;
     private final int targetPort;
 
-    SniAddressMapping(ProxyConfig config) {
+    public SniAddressMapping(ProxyConfig config) {
         String proxyAddress = config.address();
         String[] proxyAddressParts = proxyAddress.split(":");
 
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/util/ByteBufOutputStream.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/util/ByteBufOutputStream.java
index ba5efbbc..953472ae 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/util/ByteBufOutputStream.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/util/ByteBufOutputStream.java
@@ -97,9 +97,8 @@ public class ByteBufOutputStream extends ByteBufferOutputStream {
 
     @Override
     public void ensureRemaining(int remainingBytesRequired) {
-        if (remainingBytesRequired > byteBuf.writableBytes()) {
+        if (remainingBytesRequired > byteBuf.writableBytes())
             expandBuffer(remainingBytesRequired);
-        }
     }
 
     private void expandBuffer(int remainingRequired) {
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/util/MemoryRecordsHelper.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/util/MemoryRecordsHelper.java
index dc7775e5..95c3ee0c 100644
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/util/MemoryRecordsHelper.java
+++ b/kroxylicious/src/main/java/io/kroxylicious/proxy/internal/util/MemoryRecordsHelper.java
@@ -31,9 +31,8 @@ public class MemoryRecordsHelper {
                                                 TimestampType timestampType,
                                                 long baseOffset) {
         long logAppendTime = RecordBatch.NO_TIMESTAMP;
-        if (timestampType == TimestampType.LOG_APPEND_TIME) {
+        if (timestampType == TimestampType.LOG_APPEND_TIME)
             logAppendTime = System.currentTimeMillis();
-        }
         return builder(stream, magic, compressionType, timestampType, baseOffset, logAppendTime,
                 RecordBatch.NO_PRODUCER_ID, RecordBatch.NO_PRODUCER_EPOCH, RecordBatch.NO_SEQUENCE, false,
                 RecordBatch.NO_PARTITION_LEADER_EPOCH);
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/CommonTagsHook.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/CommonTagsHook.java
deleted file mode 100644
index df2cb87c..00000000
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/CommonTagsHook.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright Kroxylicious Authors.
- *
- * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
- */
-package io.kroxylicious.proxy.micrometer;
-
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-
-import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.Tag;
-
-import io.kroxylicious.proxy.config.BaseConfig;
-
-public class CommonTagsHook implements MicrometerConfigurationHook {
-
-    private static final Logger log = LoggerFactory.getLogger(CommonTagsHook.class);
-
-    public static class CommonTagsHookConfig extends BaseConfig {
-        private final Map<String, String> commonTags;
-
-        @JsonCreator
-        public CommonTagsHookConfig(Map<String, String> commonTags) {
-            this.commonTags = commonTags == null ? Map.of() : commonTags;
-        }
-    }
-
-    private final CommonTagsHookConfig config;
-
-    public CommonTagsHook(CommonTagsHookConfig config) {
-        if (config == null) {
-            throw new IllegalArgumentException("config must be non null");
-        }
-        this.config = config;
-    }
-
-    @Override
-    public void configure(MeterRegistry targetRegistry) {
-        List<Tag> tags = config.commonTags.entrySet().stream().map(entry -> Tag.of(entry.getKey(), entry.getValue())).collect(Collectors.toList());
-        targetRegistry.config().commonTags(tags);
-        log.info("configured micrometer registry with tags: {}", tags);
-    }
-
-}
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/DefaultMicrometerConfigurationHookContributor.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/DefaultMicrometerConfigurationHookContributor.java
deleted file mode 100644
index f2c22da2..00000000
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/DefaultMicrometerConfigurationHookContributor.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright Kroxylicious Authors.
- *
- * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
- */
-package io.kroxylicious.proxy.micrometer;
-
-import io.kroxylicious.proxy.service.BaseContributor;
-
-public class DefaultMicrometerConfigurationHookContributor extends BaseContributor<MicrometerConfigurationHook> implements MicrometerConfigurationHookContributor {
-
-    public static final BaseContributorBuilder<MicrometerConfigurationHook> BUILDER = BaseContributor.<MicrometerConfigurationHook> builder()
-            .add("CommonTags", CommonTagsHook.CommonTagsHookConfig.class, CommonTagsHook::new)
-            .add("StandardBinders", StandardBindersHook.StandardBindersHookConfig.class, StandardBindersHook::new);
-
-    public DefaultMicrometerConfigurationHookContributor() {
-        super(BUILDER);
-    }
-}
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/MicrometerConfigurationHookContributor.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/MicrometerConfigurationHookContributor.java
deleted file mode 100644
index 16556a63..00000000
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/MicrometerConfigurationHookContributor.java
+++ /dev/null
@@ -1,11 +0,0 @@
-/*
- * Copyright Kroxylicious Authors.
- *
- * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
- */
-package io.kroxylicious.proxy.micrometer;
-
-import io.kroxylicious.proxy.service.Contributor;
-
-public interface MicrometerConfigurationHookContributor extends Contributor<MicrometerConfigurationHook> {
-}
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/MicrometerConfigurationHookContributorManager.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/MicrometerConfigurationHookContributorManager.java
deleted file mode 100644
index aed1f458..00000000
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/MicrometerConfigurationHookContributorManager.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright Kroxylicious Authors.
- *
- * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
- */
-package io.kroxylicious.proxy.micrometer;
-
-import java.util.ServiceLoader;
-
-import io.kroxylicious.proxy.config.BaseConfig;
-import io.kroxylicious.proxy.config.ProxyConfig;
-
-public class MicrometerConfigurationHookContributorManager {
-
-    private static final MicrometerConfigurationHookContributorManager INSTANCE = new MicrometerConfigurationHookContributorManager();
-
-    private final ServiceLoader<MicrometerConfigurationHookContributor> contributors;
-
-    public static MicrometerConfigurationHookContributorManager getInstance() {
-        return INSTANCE;
-    }
-
-    private MicrometerConfigurationHookContributorManager() {
-        this.contributors = ServiceLoader.load(MicrometerConfigurationHookContributor.class);
-    }
-
-    public Class<? extends BaseConfig> getConfigType(String shortName) {
-        for (MicrometerConfigurationHookContributor contributor : contributors) {
-            Class<? extends BaseConfig> configType = contributor.getConfigType(shortName);
-            if (configType != null) {
-                return configType;
-            }
-        }
-
-        throw new IllegalArgumentException("No micrometer configuration hook found for name '" + shortName + "'");
-    }
-
-    public MicrometerConfigurationHook getHook(String shortName, ProxyConfig proxyConfig, BaseConfig filterConfig) {
-        for (MicrometerConfigurationHookContributor contributor : contributors) {
-            MicrometerConfigurationHook hook = contributor.getInstance(shortName, proxyConfig, filterConfig);
-            if (hook != null) {
-                return hook;
-            }
-        }
-
-        throw new IllegalArgumentException("No micrometer configuration hook found for name '" + shortName + "'");
-    }
-
-}
diff --git a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/StandardBindersHook.java b/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/StandardBindersHook.java
deleted file mode 100644
index 9ebe7eb3..00000000
--- a/kroxylicious/src/main/java/io/kroxylicious/proxy/micrometer/StandardBindersHook.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright Kroxylicious Authors.
- *
- * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
- */
-package io.kroxylicious.proxy.micrometer;
-
-import java.util.List;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.annotation.JsonCreator;
-
-import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.binder.MeterBinder;
-import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics;
-import io.micrometer.core.instrument.binder.jvm.JvmCompilationMetrics;
-import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics;
-import io.micrometer.core.instrument.binder.jvm.JvmHeapPressureMetrics;
-import io.micrometer.core.instrument.binder.jvm.JvmInfoMetrics;
-import io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics;
-import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
-import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics;
-import io.micrometer.core.instrument.binder.system.ProcessorMetrics;
-import io.micrometer.core.instrument.binder.system.UptimeMetrics;
-
-import io.kroxylicious.proxy.config.BaseConfig;
-
-public class StandardBindersHook implements MicrometerConfigurationHook {
-    private static final Logger log = LoggerFactory.getLogger(StandardBindersHook.class);
-    private final StandardBindersHookConfig config;
-
-    public static class StandardBindersHookConfig extends BaseConfig {
-        private final List<String> binderNames;
-
-        @JsonCreator
-        public StandardBindersHookConfig(List<String> binderNames) {
-            this.binderNames = binderNames == null ? List.of() : binderNames;
-        }
-    }
-
-    public StandardBindersHook(StandardBindersHookConfig config) {
-        if (config == null) {
-            throw new IllegalArgumentException("config should be non-null");
-        }
-        this.config = config;
-    }
-
-    @Override
-    public void configure(MeterRegistry targetRegistry) {
-        for (String binderName : this.config.binderNames) {
-            MeterBinder binder = getBinder(binderName);
-            binder.bindTo(targetRegistry);
-            log.info("bound " + binderName + " to micrometer registry");
-        }
-
-    }
-
-    private MeterBinder getBinder(String binderName) {
-        switch (binderName) {
-            case "UptimeMetrics":
-                return new UptimeMetrics();
-            case "ProcessorMetrics":
-                return new ProcessorMetrics();
-            case "FileDescriptorMetrics":
-                return new FileDescriptorMetrics();
-            case "ClassLoaderMetrics":
-                return new ClassLoaderMetrics();
-            case "JvmCompilationMetrics":
-                return new JvmCompilationMetrics();
-            case "JvmGcMetrics":
-                return new JvmGcMetrics();
-            case "JvmHeapPressureMetrics":
-                return new JvmHeapPressureMetrics();
-            case "JvmInfoMetrics":
-                return new JvmInfoMetrics();
-            case "JvmMemoryMetrics":
-                return new JvmMemoryMetrics();
-            case "JvmThreadMetrics":
-                return new JvmThreadMetrics();
-            default:
-                throw new IllegalArgumentException("no binder available for " + binderName);
-        }
-    }
-}
diff --git a/kroxylicious/src/main/resources/META-INF/services/io.kroxylicious.proxy.micrometer.MicrometerConfigurationHookContributor b/kroxylicious/src/main/resources/META-INF/services/io.kroxylicious.proxy.micrometer.MicrometerConfigurationHookContributor
deleted file mode 100644
index 001c2933..00000000
--- a/kroxylicious/src/main/resources/META-INF/services/io.kroxylicious.proxy.micrometer.MicrometerConfigurationHookContributor
+++ /dev/null
@@ -1,1 +0,0 @@
-io.kroxylicious.proxy.micrometer.DefaultMicrometerConfigurationHookContributor
\ No newline at end of file
diff --git a/krpc-code-gen/pom.xml b/krpc-code-gen/pom.xml
index 67e2a729..74d03d32 100644
--- a/krpc-code-gen/pom.xml
+++ b/krpc-code-gen/pom.xml
@@ -14,7 +14,7 @@
     <parent>
         <groupId>io.kroxylicious</groupId>
         <artifactId>kroxylicious-parent</artifactId>
-        <version>1.0-SNAPSHOT</version>
+        <version>0.1.0-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
@@ -55,7 +55,7 @@
         <dependency>
             <groupId>org.apache.maven.plugin-tools</groupId>
             <artifactId>maven-plugin-annotations</artifactId>
-            <version>3.8.1</version>
+            <version>3.6.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/pom.xml b/pom.xml
index 93e92cd8..755b3634 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,10 +13,11 @@
 
     <groupId>io.kroxylicious</groupId>
     <artifactId>kroxylicious-parent</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>0.1.0-SNAPSHOT</version>
     <packaging>pom</packaging>
 
     <properties>
+        <kroxyliciousApi.version>0.1.0-SNAPSHOT</kroxyliciousApi.version>
         <java.version>11</java.version>
         <java.test.version>19</java.test.version>
         <maven.compiler.parameters>true</maven.compiler.parameters>
@@ -33,7 +34,7 @@
         <freemarker.version>2.3.32</freemarker.version>
         <jackson.version>2.14.2</jackson.version>
         <jackson-databind.version>2.14.2</jackson-databind.version>
-        <junit.version>5.9.2</junit.version>
+        <junit.version>5.8.2</junit.version>
         <kafka.version>3.4.0</kafka.version>
         <log4j.version>2.17.2</log4j.version>
         <netty.version>4.1.89.Final</netty.version>
@@ -42,17 +43,17 @@
         <netty.io_uring.classifier>linux-x86_64</netty.io_uring.classifier>
         <netty.kqueue.classifier>osx-x86_64</netty.kqueue.classifier>
         <lombok.version>1.18.26</lombok.version>
-        <assertj-core.version>3.24.2</assertj-core.version>
+        <assertj-core.version>3.22.0</assertj-core.version>
         <mockito-core.version>4.6.1</mockito-core.version>
         <slf4j-api.version>1.7.36</slf4j-api.version>
-        <micrometer.version>1.10.4</micrometer.version>
+        <micrometer.version>1.10.2</micrometer.version>
         <kroxy.extension.version>0.1</kroxy.extension.version>
     </properties>
 
     <name>Kroxylicious Parent</name>
     <description>A proof-of-concept for a Kafka wire protocol proxy</description>
     <inceptionYear>2021</inceptionYear>
-    <url>https://github.com/kroxylicious</url>
+    <url>https://kroxylicious.io/kroxylicious/</url>
 
     <licenses>
         <license>
@@ -62,6 +63,46 @@
         </license>
     </licenses>
 
+    <developers>
+        <developer>
+            <name>Tom Bentley</name>
+            <email>tbentley@redhat.com</email>
+            <organization>Red Hat</organization>
+            <organizationUrl>https://www.redhat.com</organizationUrl>
+        </developer>
+        <developer>
+            <name>Keith Wall</name>
+            <email>kwall@redhat.com</email>
+            <organization>Red Hat</organization>
+            <organizationUrl>https://www.redhat.com</organizationUrl>
+        </developer>
+        <developer>
+            <name>Sam Barker</name>
+            <email>sbarker@redhat.com</email>
+            <organization>Red Hat</organization>
+            <organizationUrl>https://www.redhat.com</organizationUrl>
+            <timezone>Pacific/Auckland</timezone>
+        </developer>
+        <developer>
+            <name>Robert Young</name>
+            <email>robeyoun@redhat.com</email>
+            <organization>Red Hat</organization>
+            <organizationUrl>https://www.redhat.com</organizationUrl>
+            <timezone>Pacific/Auckland</timezone>
+        </developer>
+        <developer>
+            <name>Francisco Vila</name>
+            <email>fvila@redhat.com</email>
+            <organization>Red Hat</organization>
+            <organizationUrl>https://www.redhat.com</organizationUrl>
+        </developer>
+    </developers>
+
+    <scm>
+        <connection>scm:git:git@github.com:kroxylicious/kroxylicious.git</connection>
+        <developerConnection>scm:git:git@github.com:kroxylicious/kroxylicious.git</developerConnection>
+        <url>https://github.com/kroxylicious/kroxylicious</url>
+    </scm>
 
     <dependencyManagement>
         <dependencies>
@@ -185,25 +226,44 @@
         <!-- Keep alphabetic order -->
         <pluginManagement>
             <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-javadoc-plugin</artifactId>
+                    <version>3.5.0</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-source-plugin</artifactId>
+                    <version>3.2.1</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-gpg-plugin</artifactId>
+                    <version>3.0.1</version>
+                </plugin>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-deploy-plugin</artifactId>
+                    <version>3.1.0</version>
+                </plugin>
                 <plugin>
                     <groupId>com.mycila</groupId>
                     <artifactId>license-maven-plugin</artifactId>
                     <version>4.1</version>
                     <configuration>
-                        <!--suppress MavenModelInspection -->
                         <strictCheck>true</strictCheck>
                         <licenseSets>
                             <licenseSet>
+                                <!--suppress MavenModelInspection -->
                                 <header>${rootdir}/etc/license.txt</header>
                                 <excludes>
                                     <exclude>LICENSE.txt</exclude>
                                     <exclude>**/.dontdelete</exclude>
-                                    <!-- .editorconfig should have a header but even when its included correctly the check fails. -->
-                                    <exclude>.editorconfig</exclude>
                                     <exclude>docs/**</exclude>
                                     <!-- Need to keep original copyright for Vert.x classes -->
                                     <exclude>src/main/java/io/kroxylicious/proxy/future/**</exclude>
                                     <exclude>src/main/java/io/kroxylicious/proxy/internal/future/**</exclude>
+                                    <exclude>**/.dontdelete</exclude>
                                 </excludes>
                             </licenseSet>
                         </licenseSets>
@@ -212,7 +272,7 @@
                 <plugin>
                     <groupId>io.kroxylicious</groupId>
                     <artifactId>kroxylicious-krpc-plugin</artifactId>
-                    <version>1.0-SNAPSHOT</version>
+                    <version>0.1.0-SNAPSHOT</version>
                 </plugin>
                 <plugin>
                     <groupId>net.revelc.code.formatter</groupId>
@@ -248,21 +308,11 @@
                     <artifactId>maven-clean-plugin</artifactId>
                     <version>3.2.0</version>
                 </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-checkstyle-plugin</artifactId>
-                    <version>3.2.1</version>
-                </plugin>
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-dependency-plugin</artifactId>
                     <version>3.5.0</version>
                 </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-deploy-plugin</artifactId>
-                    <version>3.1.0</version>
-                </plugin>
                 <plugin>
                     <groupId>org.apache.maven.plugins</groupId>
                     <artifactId>maven-enforcer-plugin</artifactId>
@@ -313,7 +363,7 @@
                 <plugin>
                     <groupId>org.commonjava.maven.plugins</groupId>
                     <artifactId>directory-maven-plugin</artifactId>
-                    <version>1.0</version>
+                    <version>0.3.1</version>
                 </plugin>
                 <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
                 <plugin>
@@ -364,7 +414,6 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-javadoc-plugin</artifactId>
-                <version>3.5.0</version>
                 <executions>
                     <execution>
                         <id>attach-javadocs</id>
@@ -374,6 +423,18 @@
                     </execution>
                 </executions>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-source-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>attach-sources</id>
+                        <goals>
+                            <goal>jar-no-fork</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
             <plugin>
                 <groupId>org.asciidoctor</groupId>
                 <artifactId>asciidoctor-maven-plugin</artifactId>
@@ -398,25 +459,20 @@
                     </execution>
                 </executions>
             </plugin>
-            <plugin>
-                <groupId>org.commonjava.maven.plugins</groupId>
-                <artifactId>directory-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>resolve-rootdir</id>
-                        <goals>
-                            <goal>highest-basedir</goal>
-                        </goals>
-                        <phase>initialize</phase>
-                        <configuration>
-                            <property>rootdir</property>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
         </plugins>
     </build>
 
+    <distributionManagement>
+        <snapshotRepository>
+            <id>ossrh</id>
+            <url>https://s01.oss.sonatype.org/content/repositories/snapshots</url>
+        </snapshotRepository>
+        <repository>
+            <id>ossrh</id>
+            <url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
+        </repository>
+    </distributionManagement>
+
     <profiles>
         <profile>
             <id>qa</id>
@@ -448,11 +504,6 @@
                                     <goal>format</goal>
                                 </goals>
                                 <phase>process-sources</phase>
-                                <configuration>
-                                    <directories>
-                                        <directory>${project.build.sourceDirectory}</directory>
-                                    </directories>
-                                </configuration>
                             </execution>
                         </executions>
                     </plugin>
@@ -469,34 +520,6 @@
                             </execution>
                         </executions>
                     </plugin>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-checkstyle-plugin</artifactId>
-                        <configuration>
-                            <violationSeverity>warning</violationSeverity>
-                            <failOnViolation>true</failOnViolation>
-                            <failsOnError>true</failsOnError>
-                            <logViolationCountToConsole>true</logViolationCountToConsole>
-                            <logViolationsToConsole>true</logViolationsToConsole>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <id>run-project-checks</id>
-                                <phase>verify</phase>
-                                <goals>
-                                    <goal>check</goal>
-                                </goals>
-                                <configuration>
-                                    <consoleOutput>true</consoleOutput>
-                                    <failOnViolation>true</failOnViolation>
-                                    <!--suppress MavenModelInspection -->
-                                    <configLocation>${rootdir}/etc/checkstyle-custom_checks.xml</configLocation>
-                                    <!--suppress MavenModelInspection -->
-                                    <suppressionsLocation>${rootdir}/etc/checkstyle-suppressions.xml</suppressionsLocation>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
                     <plugin>
                         <groupId>org.apache.maven.plugins</groupId>
                         <artifactId>maven-enforcer-plugin</artifactId>
@@ -522,6 +545,22 @@
                             </execution>
                         </executions>
                     </plugin>
+                    <plugin>
+                        <groupId>org.commonjava.maven.plugins</groupId>
+                        <artifactId>directory-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>resolve-rootdir</id>
+                                <goals>
+                                    <goal>highest-basedir</goal>
+                                </goals>
+                                <phase>initialize</phase>
+                                <configuration>
+                                    <property>rootdir</property>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
                 </plugins>
             </build>
         </profile>
@@ -565,5 +604,55 @@
                 <skipTests>true</skipTests>
             </properties>
         </profile>
+        <profile>
+            <id>release</id>
+            <build>
+                <plugins>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-gpg-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>sign-artifacts</id>
+                                <phase>verify</phase>
+                                <goals>
+                                    <goal>sign</goal>
+                                </goals>
+                                <configuration>
+                                    <!--suppress UnresolvedMavenProperty -->
+                                    <keyname>${releaseSigningKey}</keyname>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                    <plugin>
+                        <groupId>org.apache.maven.plugins</groupId>
+                        <artifactId>maven-enforcer-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <id>enforce-property</id>
+                                <goals>
+                                    <goal>enforce</goal>
+                                </goals>
+                                <configuration>
+                                    <rules>
+                                        <requireProperty>
+                                            <property>releaseSigningKey</property>
+                                            <message>You must specify your GPG key when running a release</message>
+                                        </requireProperty>
+                                        <requireReleaseDeps>
+                                            <message>No Snapshots Allowed!</message>
+                                        </requireReleaseDeps>
+                                        <requireReleaseVersion>
+                                            <message>Ensure all modules have a release version</message>
+                                        </requireReleaseVersion>
+                                    </rules>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
     </profiles>
 </project>


Test patch:
diff --git a/integrationtests/pom.xml b/integrationtests/pom.xml
index 0b660351..1bc6169b 100644
--- a/integrationtests/pom.xml
+++ b/integrationtests/pom.xml
@@ -12,7 +12,7 @@
     <parent>
         <artifactId>kroxylicious-parent</artifactId>
         <groupId>io.kroxylicious</groupId>
-        <version>1.0-SNAPSHOT</version>
+        <version>0.1.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -27,13 +27,13 @@
         <dependency>
             <groupId>io.kroxylicious</groupId>
             <artifactId>kroxylicious</artifactId>
-            <version>1.0-SNAPSHOT</version>
+            <version>0.1.0-SNAPSHOT</version>
             <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>io.kroxylicious</groupId>
             <artifactId>kroxylicious-multitenant</artifactId>
-            <version>1.0-SNAPSHOT</version>
+            <version>0.1.0-SNAPSHOT</version>
             <scope>test</scope>
         </dependency>
         <dependency>
diff --git a/integrationtests/src/test/java/io/kroxylicious/proxy/KroxyConfigBuilder.java b/integrationtests/src/test/java/io/kroxylicious/proxy/KroxyConfigBuilder.java
index 8d35a52d..6b7c64b5 100644
--- a/integrationtests/src/test/java/io/kroxylicious/proxy/KroxyConfigBuilder.java
+++ b/integrationtests/src/test/java/io/kroxylicious/proxy/KroxyConfigBuilder.java
@@ -10,7 +10,6 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 
 import com.fasterxml.jackson.annotation.JsonGetter;
 import com.fasterxml.jackson.annotation.JsonInclude;
@@ -19,8 +18,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
 import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
 
-import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY;
-import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL;
+import static com.fasterxml.jackson.annotation.JsonInclude.Include.*;
 
 public class KroxyConfigBuilder {
 
@@ -37,10 +35,27 @@ public class KroxyConfigBuilder {
     public record Filter(String type, @JsonInclude(NON_EMPTY) Map<String, Object> config) {
     }
 
-    public record MicrometerConfig(String type, @JsonInclude(NON_EMPTY) Map<String, Object> config) {
+    public record AdminHttp(Endpoints endpoints) {
     }
 
-    public record AdminHttp(Endpoints endpoints) {
+    public record MicrometerConfig(@JsonInclude(NON_EMPTY) List<String> binders,
+                                   @JsonInclude(NON_NULL) String configurationHookClass,
+                                   @JsonInclude(NON_EMPTY) Map<String, String> commonTags) {
+        public MicrometerConfig withTag(String key, String value) {
+            Map<String, String> tags = commonTags != null ? new HashMap<>(commonTags) : new HashMap<>();
+            tags.put(key, value);
+            return new MicrometerConfig(this.binders, this.configurationHookClass, tags);
+        }
+
+        public MicrometerConfig withConfigHook(String className) {
+            return new MicrometerConfig(this.binders, className, this.commonTags);
+        }
+
+        public MicrometerConfig withBinder(String binder) {
+            List<String> binders = this.binders != null ? new ArrayList<>(this.binders) : new ArrayList<>();
+            binders.add(binder);
+            return new MicrometerConfig(binders, this.configurationHookClass, this.commonTags);
+        }
     }
 
     public record Endpoints(@JsonGetter("prometheus") @JsonInclude(NON_NULL) Map<String, String> prometheusEndpointConfig) {
@@ -54,7 +69,7 @@ public class KroxyConfigBuilder {
     private AdminHttp adminHttp = null;
 
     @JsonInclude(NON_NULL)
-    private List<MicrometerConfig> micrometer = null;
+    private MicrometerConfig micrometer = null;
 
     public KroxyConfigBuilder(String proxyAddress) {
         proxy = new Proxy(proxyAddress, null, null);
@@ -65,39 +80,25 @@ public class KroxyConfigBuilder {
     }
 
     public KroxyConfigBuilder withMicrometerBinder(String binder) {
-        MicrometerConfig config = getMicrometerConfigForType("StandardBinders");
-        @SuppressWarnings("unchecked")
-        List<String> binderNames = (List<String>) config.config.computeIfAbsent("binderNames", s -> new ArrayList<String>());
-        binderNames.add(binder);
+        MicrometerConfig original = currentOrNewMicrometerConfig();
+        micrometer = original.withBinder(binder);
         return this;
     }
 
-    public KroxyConfigBuilder withMicrometerCommonTag(String key, String value) {
-        MicrometerConfig config = getMicrometerConfigForType("CommonTags");
-        @SuppressWarnings("unchecked")
-        Map<String, String> commonTags = (Map<String, String>) config.config.computeIfAbsent("commonTags", s -> new HashMap<String, String>());
-        commonTags.put(key, value);
+    public KroxyConfigBuilder withMicrometerConfigHook(String className) {
+        MicrometerConfig original = currentOrNewMicrometerConfig();
+        micrometer = original.withConfigHook(className);
         return this;
     }
 
-    private MicrometerConfig getMicrometerConfigForType(String type) {
-        Optional<MicrometerConfig> standardBinders = getOrCreateMicrometer().stream().filter(micrometerConfig -> micrometerConfig.type.equals(type)).findFirst();
-        MicrometerConfig config;
-        if (standardBinders.isPresent()) {
-            config = standardBinders.get();
-        }
-        else {
-            config = new MicrometerConfig(type, new HashMap<>());
-            micrometer.add(config);
-        }
-        return config;
+    public KroxyConfigBuilder withMicrometerCommonTag(String key, String value) {
+        MicrometerConfig original = currentOrNewMicrometerConfig();
+        micrometer = original.withTag(key, value);
+        return this;
     }
 
-    private List<MicrometerConfig> getOrCreateMicrometer() {
-        if (micrometer == null) {
-            micrometer = new ArrayList<>();
-        }
-        return micrometer;
+    private MicrometerConfig currentOrNewMicrometerConfig() {
+        return micrometer != null ? micrometer : new MicrometerConfig(null, null, null);
     }
 
     public KroxyConfigBuilder withCluster(String clusterName, String bootstrapServers) {
@@ -151,7 +152,7 @@ public class KroxyConfigBuilder {
         return filters;
     }
 
-    public List<MicrometerConfig> getMicrometer() {
+    public MicrometerConfig getMicrometer() {
         return micrometer;
     }
 }
diff --git a/integrationtests/src/test/java/io/kroxylicious/proxy/MetricsIT.java b/integrationtests/src/test/java/io/kroxylicious/proxy/MetricsIT.java
index a3cc0f93..49477a83 100644
--- a/integrationtests/src/test/java/io/kroxylicious/proxy/MetricsIT.java
+++ b/integrationtests/src/test/java/io/kroxylicious/proxy/MetricsIT.java
@@ -17,9 +17,12 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
+import io.micrometer.core.instrument.MeterRegistry;
 import io.micrometer.core.instrument.Metrics;
+import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics;
 import io.netty.handler.codec.http.HttpResponseStatus;
 
+import io.kroxylicious.proxy.config.micrometer.MicrometerConfigurationHook;
 import io.kroxylicious.testing.kafka.api.KafkaCluster;
 import io.kroxylicious.testing.kafka.junit5ext.KafkaClusterExtension;
 
@@ -38,6 +41,14 @@ public class MetricsIT {
         Metrics.globalRegistry.clear();
     }
 
+    public static class ConfigHook implements MicrometerConfigurationHook {
+
+        @Override
+        public void configure(MeterRegistry targetRegistry) {
+            new JvmThreadMetrics().bindTo(targetRegistry);
+        }
+    }
+
     @Test
     public void shouldOfferPrometheusMetricsScrapeEndpoint(KafkaCluster cluster) throws Exception {
         String config = baseConfigBuilder(PROXY_ADDRESS, cluster.getBootstrapServers())
@@ -83,6 +94,32 @@ public class MetricsIT {
         }
     }
 
+    @Test
+    public void shouldOfferPrometheusMetricsWithConfigHook(KafkaCluster cluster) throws Exception {
+        String config = baseConfigBuilder(PROXY_ADDRESS, cluster.getBootstrapServers())
+                .withMicrometerConfigHook(ConfigHook.class.getTypeName())
+                .withPrometheusEndpoint().build();
+
+        try (var proxy = startProxy(config)) {
+            HttpRequest request = HttpRequest.newBuilder(URI.create("http://localhost:9193/metrics")).GET().build();
+            HttpResponse<String> response = HttpClient.newHttpClient().send(request, ofString());
+            assertResponseBodyContainsMeter(response, "jvm_threads_live_threads");
+        }
+    }
+
+    @Test
+    public void shouldOfferPrometheusMetricsWithFullyQualifiedBinder(KafkaCluster cluster) throws Exception {
+        String config = baseConfigBuilder(PROXY_ADDRESS, cluster.getBootstrapServers())
+                .withMicrometerBinder("io.micrometer.core.instrument.binder.system.UptimeMetrics")
+                .withPrometheusEndpoint().build();
+
+        try (var proxy = startProxy(config)) {
+            HttpRequest request = HttpRequest.newBuilder(URI.create("http://localhost:9193/metrics")).GET().build();
+            HttpResponse<String> response = HttpClient.newHttpClient().send(request, ofString());
+            assertResponseBodyContainsMeter(response, "process_uptime_seconds");
+        }
+    }
+
     private static void assertResponseBodyContainsMeter(HttpResponse<String> response, String meterName, String meterValue) {
         assertResponseBodyContainsMeter(response, meterName, "\\{*.*\\}*", Pattern.quote(meterValue));
     }
diff --git a/kroxylicious/src/test/java/io/kroxylicious/proxy/config/micrometer/MicrometerConfigurationTest.java b/kroxylicious/src/test/java/io/kroxylicious/proxy/config/micrometer/MicrometerConfigurationTest.java
new file mode 100644
index 00000000..a07ded4a
--- /dev/null
+++ b/kroxylicious/src/test/java/io/kroxylicious/proxy/config/micrometer/MicrometerConfigurationTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright Kroxylicious Authors.
+ *
+ * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
+ */
+package io.kroxylicious.proxy.config.micrometer;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+import org.junit.jupiter.api.Test;
+
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.Tag;
+import io.micrometer.core.instrument.binder.MeterBinder;
+import io.micrometer.core.instrument.binder.jvm.JvmGcMetrics;
+import io.micrometer.core.instrument.binder.system.UptimeMetrics;
+
+import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
+import static org.junit.jupiter.api.Assertions.*;
+
+class MicrometerConfigurationTest {
+
+    public static class TestHook implements MicrometerConfigurationHook {
+        @Override
+        public void configure(MeterRegistry targetRegistry) {
+
+        }
+    }
+
+    @Test
+    public void testLocatesJvmBinder() {
+        MicrometerConfiguration config = new MicrometerConfiguration(List.of("JvmGcMetrics"), null, null);
+        List<Class<? extends MeterBinder>> binders = config.getBinders();
+        assertThat(binders).contains(JvmGcMetrics.class);
+    }
+
+    @Test
+    public void testNullBinderList() {
+        MicrometerConfiguration config = new MicrometerConfiguration(null, null, null);
+        List<Class<? extends MeterBinder>> binders = config.getBinders();
+        assertThat(binders).isEmpty();
+    }
+
+    @Test
+    public void testNonExistentBinder() {
+        assertThrows(IllegalArgumentException.class, () -> {
+            new MicrometerConfiguration(List.of("non.existent.Binder"), null, null);
+        });
+    }
+
+    @Test
+    public void testEmptyBinderList() {
+        MicrometerConfiguration config = new MicrometerConfiguration(List.of(), null, null);
+        List<Class<? extends MeterBinder>> binders = config.getBinders();
+        assertThat(binders).isEmpty();
+    }
+
+    @Test
+    public void testLocatesMicrometerHook() {
+        MicrometerConfiguration config = new MicrometerConfiguration(null, TestHook.class.getTypeName(), null);
+        Optional<Class<? extends MicrometerConfigurationHook>> hookClass = config.loadConfigurationHookClass();
+        assertTrue(hookClass.isPresent(), "configuration hook class optional should be present");
+        assertEquals(TestHook.class, hookClass.get());
+    }
+
+    @Test
+    public void testNonExistentMicrometerHook() {
+        assertThrows(RuntimeException.class, () -> {
+            new MicrometerConfiguration(null, "bad.class.DoesntExist", null);
+        });
+    }
+
+    @Test
+    public void testConfigHookEmptyIfNoClassnameProvided() {
+        MicrometerConfiguration config = new MicrometerConfiguration(null, null, null);
+        Optional<Class<? extends MicrometerConfigurationHook>> hookClass = config.loadConfigurationHookClass();
+        assertThat(hookClass).describedAs("configuration hook class optional").isEmpty();
+    }
+
+    @Test
+    public void testLocatesSystemBinder() {
+        MicrometerConfiguration config = new MicrometerConfiguration(List.of("JvmGcMetrics"), null, null);
+        List<Class<? extends MeterBinder>> binders = config.getBinders();
+        assertThat(binders).contains(JvmGcMetrics.class);
+    }
+
+    @Test
+    public void testLocatesBinderUsingFullPackage() {
+        MicrometerConfiguration config = new MicrometerConfiguration(List.of("io.micrometer.core.instrument.binder.system.UptimeMetrics"), null, null);
+        List<Class<? extends MeterBinder>> binders = config.getBinders();
+        assertThat(binders).contains(UptimeMetrics.class);
+    }
+
+    @Test
+    public void testNullCommonTags() {
+        MicrometerConfiguration config = new MicrometerConfiguration(null, null, null);
+        assertThat(config.getCommonTags()).isEmpty();
+    }
+
+    @Test
+    public void testEmptyCommonTags() {
+        MicrometerConfiguration config = new MicrometerConfiguration(null, null, Map.of());
+        assertThat(config.getCommonTags()).isEmpty();
+    }
+
+    @Test
+    public void testNonEmptyCommonTags() {
+        MicrometerConfiguration config = new MicrometerConfiguration(null, null, Map.of("a", "b"));
+        assertThat(config.getCommonTags()).contains(Tag.of("a", "b"));
+    }
+
+}
diff --git a/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/RequestDecoderTest.java b/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/RequestDecoderTest.java
index 0cdc4cd1..718d87f5 100644
--- a/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/RequestDecoderTest.java
+++ b/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/RequestDecoderTest.java
@@ -28,7 +28,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 public class RequestDecoderTest extends AbstractCodecTest {
 
     @ParameterizedTest
-    @MethodSource("requestApiVersions()")
+    @MethodSource("requestApiVersions")
     public void testApiVersionsExactlyOneFrame_decoded(short apiVersion) throws Exception {
         assertEquals(12,
                 exactlyOneFrame_decoded(apiVersion,
@@ -45,7 +45,7 @@ public class RequestDecoderTest extends AbstractCodecTest {
     }
 
     @ParameterizedTest
-    @MethodSource("requestApiVersions()")
+    @MethodSource("requestApiVersions")
     public void testApiVersionsExactlyOneFrame_opaque(short apiVersion) throws Exception {
         assertEquals(12,
                 exactlyOneFrame_encoded(apiVersion,
@@ -70,7 +70,7 @@ public class RequestDecoderTest extends AbstractCodecTest {
     }
 
     @ParameterizedTest
-    @MethodSource("requestApiVersions()")
+    @MethodSource("requestApiVersions")
     public void testApiVersionsFrameLessOneByte(short apiVersion) throws Exception {
         RequestHeaderData encodedHeader = exampleRequestHeader(apiVersion);
         ApiVersionsRequestData encodedBody = exampleApiVersionsRequest();
@@ -108,19 +108,19 @@ public class RequestDecoderTest extends AbstractCodecTest {
     }
 
     @ParameterizedTest
-    @MethodSource("requestApiVersions()")
+    @MethodSource("requestApiVersions")
     public void testApiVersionsFrameFirst3Bytes(short apiVersion) throws Exception {
         doTestApiVersionsFrameFirstNBytes(apiVersion, 3, 0);
     }
 
     @ParameterizedTest
-    @MethodSource("requestApiVersions()")
+    @MethodSource("requestApiVersions")
     public void testApiVersionsFrameFirst5Bytes(short apiVersion) throws Exception {
         doTestApiVersionsFrameFirstNBytes(apiVersion, 5, 0);
     }
 
     @ParameterizedTest
-    @MethodSource("requestApiVersions()")
+    @MethodSource("requestApiVersions")
     public void testApiVersionsExactlyTwoFrames(short apiVersion) throws Exception {
         RequestHeaderData encodedHeader = exampleRequestHeader(apiVersion);
 
diff --git a/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/RequestEncoderTest.java b/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/RequestEncoderTest.java
index f77187dc..bdc6233a 100644
--- a/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/RequestEncoderTest.java
+++ b/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/RequestEncoderTest.java
@@ -32,7 +32,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 public class RequestEncoderTest extends AbstractCodecTest {
 
     @ParameterizedTest
-    @MethodSource("requestApiVersions()")
+    @MethodSource("requestApiVersions")
     public void testApiVersions(short apiVersion) throws Exception {
         RequestHeaderData exampleHeader = exampleRequestHeader(apiVersion);
         ApiVersionsRequestData exampleBody = exampleApiVersionsRequest();
diff --git a/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/ResponseDecoderTest.java b/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/ResponseDecoderTest.java
index 251381c0..a523deb5 100644
--- a/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/ResponseDecoderTest.java
+++ b/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/ResponseDecoderTest.java
@@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 public class ResponseDecoderTest extends AbstractCodecTest {
 
     @ParameterizedTest
-    @MethodSource("requestApiVersions()")
+    @MethodSource("requestApiVersions")
     public void testApiVersionsExactlyOneFrame_decoded(short apiVersion) throws Exception {
         var mgr = new CorrelationManager(12);
         mgr.putBrokerRequest(ApiKeys.API_VERSIONS.id, apiVersion, 52, true, null, null, true);
@@ -34,7 +34,7 @@ public class ResponseDecoderTest extends AbstractCodecTest {
     }
 
     @ParameterizedTest
-    @MethodSource("requestApiVersions()")
+    @MethodSource("requestApiVersions")
     public void testApiVersionsExactlyOneFrame_opaque(short apiVersion) throws Exception {
         var mgr = new CorrelationManager(12);
         mgr.putBrokerRequest(ApiKeys.API_VERSIONS.id, apiVersion, 52, true, null, null, false);
diff --git a/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/ResponseEncoderTest.java b/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/ResponseEncoderTest.java
index 9ca6d8c0..509fea03 100644
--- a/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/ResponseEncoderTest.java
+++ b/kroxylicious/src/test/java/io/kroxylicious/proxy/internal/codec/ResponseEncoderTest.java
@@ -17,7 +17,7 @@ import io.kroxylicious.proxy.frame.DecodedResponseFrame;
 
 public class ResponseEncoderTest extends AbstractCodecTest {
     @ParameterizedTest
-    @MethodSource("requestApiVersions()")
+    @MethodSource("requestApiVersions")
     public void testApiVersions(short apiVersion) throws Exception {
         ResponseHeaderData exampleHeader = exampleResponseHeader();
         ApiVersionsResponseData exampleBody = exampleApiVersionsResponse();
diff --git a/kroxylicious/src/test/java/io/kroxylicious/proxy/micrometer/CommonTagsHookTest.java b/kroxylicious/src/test/java/io/kroxylicious/proxy/micrometer/CommonTagsHookTest.java
deleted file mode 100644
index 87d60e33..00000000
--- a/kroxylicious/src/test/java/io/kroxylicious/proxy/micrometer/CommonTagsHookTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright Kroxylicious Authors.
- *
- * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
- */
-package io.kroxylicious.proxy.micrometer;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-
-import org.junit.jupiter.api.Test;
-
-import io.micrometer.core.instrument.Meter;
-import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-
-class CommonTagsHookTest {
-
-    @Test
-    public void testNullConfig() {
-        assertThatThrownBy(() -> {
-            new CommonTagsHook(null);
-        }).isInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    public void testCommonTags() {
-        CommonTagsHook commonTagsHook = new CommonTagsHook(new CommonTagsHook.CommonTagsHookConfig(Map.of("a", "b")));
-        MeterRegistry registry = givenRegistryConfiguredWith(commonTagsHook);
-        Meter meter = whenCreateArbitraryMeter(registry);
-        thenTagEquals(meter, "a", "b");
-    }
-
-    @Test
-    public void testNullCommonTagsMap() {
-        CommonTagsHook commonTagsHook = new CommonTagsHook(new CommonTagsHook.CommonTagsHookConfig(null));
-        MeterRegistry registry = givenRegistryConfiguredWith(commonTagsHook);
-        Meter meter = whenCreateArbitraryMeter(registry);
-        thenTagsEmpty(meter);
-    }
-
-    @Test
-    public void testEmptyCommonTagsMap() {
-        CommonTagsHook commonTagsHook = new CommonTagsHook(new CommonTagsHook.CommonTagsHookConfig(new HashMap<>()));
-        MeterRegistry registry = givenRegistryConfiguredWith(commonTagsHook);
-        Meter meter = whenCreateArbitraryMeter(registry);
-        thenTagsEmpty(meter);
-    }
-
-    private static void thenTagsEmpty(Meter counter) {
-        Meter.Id id = counter.getId();
-        assertThat(id.getTags()).isEmpty();
-    }
-
-    private static void thenTagEquals(Meter counter, String key, String value) {
-        Meter.Id id = counter.getId();
-        String tag = id.getTag(key);
-        assertThat(tag).isNotNull().isEqualTo(value);
-    }
-
-    private static Meter whenCreateArbitraryMeter(MeterRegistry registry) {
-        return registry.counter(UUID.randomUUID().toString());
-    }
-
-    private static MeterRegistry givenRegistryConfiguredWith(MicrometerConfigurationHook hook) {
-        MeterRegistry registry = new CompositeMeterRegistry();
-        hook.configure(registry);
-        return registry;
-    }
-
-}
\ No newline at end of file
diff --git a/kroxylicious/src/test/java/io/kroxylicious/proxy/micrometer/StandardBindersHookTest.java b/kroxylicious/src/test/java/io/kroxylicious/proxy/micrometer/StandardBindersHookTest.java
deleted file mode 100644
index 0927a5ae..00000000
--- a/kroxylicious/src/test/java/io/kroxylicious/proxy/micrometer/StandardBindersHookTest.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright Kroxylicious Authors.
- *
- * Licensed under the Apache Software License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
- */
-package io.kroxylicious.proxy.micrometer;
-
-import java.util.List;
-
-import org.junit.jupiter.api.Test;
-
-import io.micrometer.core.instrument.Meter;
-import io.micrometer.core.instrument.MeterRegistry;
-import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatThrownBy;
-
-class StandardBindersHookTest {
-
-    @Test
-    public void testNullHookConfigThrows() {
-        assertThatThrownBy(() -> new StandardBindersHook(null)).isInstanceOf(IllegalArgumentException.class);
-    }
-
-    @Test
-    public void testNullBinderNames() {
-        StandardBindersHook hook = new StandardBindersHook(new StandardBindersHook.StandardBindersHookConfig(null));
-        MeterRegistry registry = whenRegistryConfiguredWith(hook);
-        thenNoMetersRegistered(registry);
-    }
-
-    @Test
-    public void testEmptyBinderNames() {
-        StandardBindersHook hook = new StandardBindersHook(new StandardBindersHook.StandardBindersHookConfig(List.of()));
-        MeterRegistry registry = whenRegistryConfiguredWith(hook);
-        thenNoMetersRegistered(registry);
-    }
-
-    @Test
-    public void testKnownBinder() {
-        StandardBindersHook hook = new StandardBindersHook(new StandardBindersHook.StandardBindersHookConfig(List.of("UptimeMetrics")));
-        MeterRegistry registry = whenRegistryConfiguredWith(hook);
-        thenUptimeMeterRegistered(registry);
-    }
-
-    @Test
-    public void testUnknownBinder() {
-        StandardBindersHook hook = new StandardBindersHook(new StandardBindersHook.StandardBindersHookConfig(List.of("SadClown")));
-        assertThatThrownBy(() -> whenRegistryConfiguredWith(hook)).isInstanceOf(IllegalArgumentException.class);
-    }
-
-    private static void thenUptimeMeterRegistered(MeterRegistry registry) {
-        Meter meter = registry.get("process.uptime").meter();
-        assertThat(meter).describedAs("uptime gauge").isNotNull();
-    }
-
-    private static void thenNoMetersRegistered(MeterRegistry registry) {
-        assertThat(registry.getMeters()).isEmpty();
-    }
-
-    private static MeterRegistry whenRegistryConfiguredWith(MicrometerConfigurationHook hook) {
-        MeterRegistry registry = new CompositeMeterRegistry();
-        hook.configure(registry);
-        return registry;
-    }
-
-}
\ No newline at end of file